diff -Nru a/CREDITS b/CREDITS --- a/CREDITS Wed Oct 8 12:24:57 2003 +++ b/CREDITS Wed Oct 8 12:24:57 2003 @@ -1459,6 +1459,13 @@ S: Roscommon S: Ireland +N: Michael Hunold +E: michael@mihu.de +W: http://www.mihu.de/linux/ +D: Generic saa7146 video4linux-2 driver core, +D: Driver for the "Multimedia eXtension Board", "dpc7146", +D: "Hexium Orion", "Hexium Gemini" + N: Miguel de Icaza Amozurrutia E: miguel@nuclecu.unam.mx D: Linux/SPARC team, Midnight Commander maintainer @@ -1862,9 +1869,9 @@ S: Germany N: Achim Leubner -E: achim.leubner@intel.com +E: achim_leubner@adaptec.com D: GDT Disk Array Controller/Storage RAID controller driver -S: ICP vortex GmbH, an Intel company +S: ICP vortex GmbH S: Neckarsulm S: Germany diff -Nru a/Documentation/Changes b/Documentation/Changes --- a/Documentation/Changes Wed Oct 8 12:24:57 2003 +++ b/Documentation/Changes Wed Oct 8 12:24:57 2003 @@ -2,7 +2,7 @@ ===== This document is designed to provide a list of the minimum levels of -software necessary to run the 2.5 kernels, as well as provide brief +software necessary to run the 2.6 kernels, as well as provide brief instructions regarding any other "Gotchas" users may encounter when trying life on the Bleeding Edge. If upgrading from a pre-2.4.x kernel, please consult the Changes file included with 2.4.x kernels for @@ -142,7 +142,7 @@ root of the Linux source for more information. Module-Init-Tools --------- +----------------- A new module loader is now in the kernel that requires module-init-tools to use. It is backward compatible with the 2.4.x series kernels. @@ -337,8 +337,8 @@ -------- o -Modutils --------- +Module-Init-Tools +----------------- o Mkinitrd diff -Nru a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl --- a/Documentation/DocBook/kernel-api.tmpl Wed Oct 8 12:24:55 2003 +++ b/Documentation/DocBook/kernel-api.tmpl Wed Oct 8 12:24:55 2003 @@ -315,9 +315,4 @@ --> - diff -Nru a/Documentation/binfmt_misc.txt b/Documentation/binfmt_misc.txt --- a/Documentation/binfmt_misc.txt Wed Oct 8 12:24:56 2003 +++ b/Documentation/binfmt_misc.txt Wed Oct 8 12:24:56 2003 @@ -41,6 +41,11 @@ offset+size(magic) has to be less than 128 - the interpreter string may not exceed 127 characters +To use binfmt_misc you have to mount it first. You can mount it with +"mount -t binfmt_misc none /proc/sys/fs/binfmt_misc" command, or you can add +a line "none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0" to your +/etc/fstab so it auto mounts on boot. + You may want to add the binary formats in one of your /etc/rc scripts during boot-up. Read the manual of your init program to figure out how to do this right. diff -Nru a/Documentation/cachetlb.txt b/Documentation/cachetlb.txt --- a/Documentation/cachetlb.txt Wed Oct 8 12:24:56 2003 +++ b/Documentation/cachetlb.txt Wed Oct 8 12:24:56 2003 @@ -59,9 +59,9 @@ address translations from the TLB. After running, this interface must make sure that any previous page table modifications for the address space 'vma->vm_mm' in the range - 'start' to 'end' will be visible to the cpu. That is, after + 'start' to 'end-1' will be visible to the cpu. That is, after running, here will be no entries in the TLB for 'mm' for - virtual addresses in the range 'start' to 'end'. + virtual addresses in the range 'start' to 'end-1'. The "vma" is the backing store being used for the region. Primarily, this is used for munmap() type operations. @@ -100,7 +100,7 @@ unsigned long start, unsigned long end) The software page tables for address space 'mm' for virtual - addresses in the range 'start' to 'end' are being torn down. + addresses in the range 'start' to 'end-1' are being torn down. Some platforms cache the lowest level of the software page tables in a linear virtually mapped array, to make TLB miss processing @@ -165,15 +165,7 @@ Here are the routines, one by one: -1) void flush_cache_all(void) - - The most severe flush of all. After this interface runs, - the entire cpu cache is flushed. - - This is usually invoked when the kernel page tables are - changed, since such translations are "global" in nature. - -2) void flush_cache_mm(struct mm_struct *mm) +1) void flush_cache_mm(struct mm_struct *mm) This interface flushes an entire user address space from the caches. That is, after running, there will be no cache @@ -183,13 +175,13 @@ page table operations such as what happens during fork, exit, and exec. -3) void flush_cache_range(struct vm_area_struct *vma, +2) void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) Here we are flushing a specific range of (user) virtual addresses from the cache. After running, there will be no entries in the cache for 'vma->vm_mm' for virtual addresses in - the range 'start' to 'end'. + the range 'start' to 'end-1'. The "vma" is the backing store being used for the region. Primarily, this is used for munmap() type operations. @@ -200,7 +192,7 @@ call flush_cache_page (see below) for each entry which may be modified. -4) void flush_cache_page(struct vm_area_struct *vma, unsigned long addr) +3) void flush_cache_page(struct vm_area_struct *vma, unsigned long addr) This time we need to remove a PAGE_SIZE sized range from the cache. The 'vma' is the backing structure used by @@ -215,6 +207,30 @@ This is used primarily during fault processing. +4) void flush_cache_kmaps(void) + + This routine need only be implemented if the platform utilizes + highmem. It will be called right before all of the kmaps + are invalidated. + + After running, there will be no entries in the cache for + the kernel virtual address range PKMAP_ADDR(0) to + PKMAP_ADDR(LAST_PKMAP). + + This routing should be implemented in asm/highmem.h + +5) void flush_cache_vmap(unsigned long start, unsigned long end) + void flush_cache_vunmap(unsigned long start, unsigned long end) + + Here in these two interfaces we are flushing a specific range + of (kernel) virtual addresses from the cache. After running, + there will be no entries in the cache for the kernel address + space for virtual addresses in the range 'start' to 'end-1'. + + The first of these two routines is invoked after map_vm_area() + has installed the page table entries. The second is invoked + before unmap_vm_area() deletes the page table entries. + There exists another whole class of cpu cache issues which currently require a whole different set of interfaces to handle properly. The biggest problem is that of virtual aliasing in the data cache @@ -317,23 +333,32 @@ dirty. Again, see sparc64 for examples of how to deal with this. + void copy_to_user_page(struct vm_area_struct *vma, struct page *page, + unsigned long user_vaddr, + void *dst, void *src, int len) + void copy_from_user_page(struct vm_area_struct *vma, struct page *page, + unsigned long user_vaddr, + void *dst, void *src, int len) + When the kernel needs to copy arbitrary data in and out + of arbitrary user pages (f.e. for ptrace()) it will use + these two routines. + + The page has been kmap()'d, and flush_cache_page() has + just been called for the user mapping of this page (if + necessary). + + Any necessary cache flushing or other coherency operations + that need to occur should happen here. If the processor's + instruction cache does not snoop cpu stores, it is very + likely that you will need to flush the instruction cache + for copy_to_user_page(). + void flush_icache_range(unsigned long start, unsigned long end) When the kernel stores into addresses that it will execute out of (eg when loading modules), this function is called. If the icache does not snoop stores then this routine will need to flush it. - - void flush_icache_user_range(struct vm_area_struct *vma, - struct page *page, unsigned long addr, int len) - This is called when the kernel stores into addresses that are - part of the address space of a user process (which may be some - other process than the current process). The addr argument - gives the virtual address in that process's address space, - page is the page which is being modified, and len indicates - how many bytes have been modified. The modified region must - not cross a page boundary. Currently this is only called from - kernel/ptrace.c. void flush_icache_page(struct vm_area_struct *vma, struct page *page) All the functionality of flush_icache_page can be implemented in diff -Nru a/Documentation/cdrom/aztcd b/Documentation/cdrom/aztcd --- a/Documentation/cdrom/aztcd Wed Oct 8 12:24:56 2003 +++ b/Documentation/cdrom/aztcd Wed Oct 8 12:24:56 2003 @@ -178,8 +178,7 @@ to load it before you can mount the CDROM: insmod /lib/modules/X.X.X/fs/isofs.o The mount procedure works as described in 4. above. -(In all commands 'X.X.X' is the current linux kernel version number. For details -see file modules.txt in /usr/src/linux/Documentation) +(In all commands 'X.X.X' is the current linux kernel version number) 4.2 CDROM CONNECTED TO A SOUNDCARD Most soundcards do have a bus interface to the CDROM-drive. In many cases diff -Nru a/Documentation/cdrom/sbpcd b/Documentation/cdrom/sbpcd --- a/Documentation/cdrom/sbpcd Wed Oct 8 12:24:57 2003 +++ b/Documentation/cdrom/sbpcd Wed Oct 8 12:24:57 2003 @@ -272,7 +272,6 @@ If you do NOT select "Matsushita/Panasonic CDROM driver support" during the "make config" of your kernel, you can build the "loadable module" sbpcd.o. -Read /usr/src/linux/Documentation/modules.txt on this. If sbpcd gets used as a module, the support of more than one interface card (i.e. drives 4...15) is disabled. diff -Nru a/Documentation/cpu-freq/user-guide.txt b/Documentation/cpu-freq/user-guide.txt --- a/Documentation/cpu-freq/user-guide.txt Wed Oct 8 12:24:55 2003 +++ b/Documentation/cpu-freq/user-guide.txt Wed Oct 8 12:24:55 2003 @@ -57,6 +57,8 @@ AMD mobile K6-3+ AMD mobile Duron AMD mobile Athlon +AMD Opteron +AMD Athlon 64 Cyrix Media GXm Intel mobile PIII and Intel mobile PIII-M on certain chipsets Intel Pentium 4, Intel Xeon diff -Nru a/Documentation/crypto/api-intro.txt b/Documentation/crypto/api-intro.txt --- a/Documentation/crypto/api-intro.txt Wed Oct 8 12:24:57 2003 +++ b/Documentation/crypto/api-intro.txt Wed Oct 8 12:24:57 2003 @@ -126,7 +126,7 @@ BUGS Send bug reports to: -James Morris +James Morris Cc: David S. Miller @@ -220,5 +220,5 @@ Generic scatterwalk code by Adam J. Richter Please send any credits updates or corrections to: -James Morris +James Morris diff -Nru a/Documentation/ftape.txt b/Documentation/ftape.txt --- a/Documentation/ftape.txt Wed Oct 8 12:24:55 2003 +++ b/Documentation/ftape.txt Wed Oct 8 12:24:55 2003 @@ -246,8 +246,7 @@ or by editing the file `/etc/modules.conf' in which case they take effect each time when the module is loaded with `modprobe' (please - refer to the modules documentation, i.e. `modules.txt' and the - respective manual pages). Thus, you should add a line + refer to the respective manual pages). Thus, you should add a line options ftape ft_tracing=4 diff -Nru a/Documentation/ioctl-number.txt b/Documentation/ioctl-number.txt --- a/Documentation/ioctl-number.txt Wed Oct 8 12:24:57 2003 +++ b/Documentation/ioctl-number.txt Wed Oct 8 12:24:57 2003 @@ -175,10 +175,6 @@ 0xA0 all linux/sdp/sdp.h Industrial Device Project -0xA2 00-0F DVD decoder driver in development: - -0xA3 00-1F Philips SAA7146 dirver in development: - 0xA3 80-8F Port ACL in development: 0xA3 90-9F linux/dtlk.h diff -Nru a/Documentation/iostats.txt b/Documentation/iostats.txt --- a/Documentation/iostats.txt Wed Oct 8 12:24:56 2003 +++ b/Documentation/iostats.txt Wed Oct 8 12:24:56 2003 @@ -1,22 +1,22 @@ I/O statistics fields --------------- -Last modified 5/15/03 +Last modified Sep 30, 2003 -In 2.4.20 (and some versions before, with patches), and 2.5.45, -more extensive disk statistics were introduced to help measure disk +Since 2.4.20 (and some versions before, with patches), and 2.5.45, +more extensive disk statistics have been introduced to help measure disk activity. Tools such as sar and iostat typically interpret these and do the work for you, but in case you are interested in creating your own tools, the fields are explained here. -In most versions of the 2.4 patch, the information is found as additional -fields in /proc/partitions. In 2.5, the same information is found in -two places: one is in the file /proc/diskstats (appears in 2.5.69 and -beyond), and the other is within the sysfs file system, which must be -mounted in order to obtain the information. Throughout this document -we'll assume that sysfs is mounted on /sys, although of course it may -be mounted anywhere. In 2.5, both /proc/diskstats and sysfs use the -same source for the information and so should not differ. +In 2.4 now, the information is found as additional fields in +/proc/partitions. In 2.6, the same information is found in two +places: one is in the file /proc/diskstats, and the other is within +the sysfs file system, which must be mounted in order to obtain +the information. Throughout this document we'll assume that sysfs +is mounted on /sys, although of course it may be mounted anywhere. +Both /proc/diskstats and sysfs use the same source for the information +and so should not differ. Here are examples of these different formats: @@ -25,15 +25,15 @@ 3 1 9221278 hda1 35486 0 35496 38030 0 0 0 0 0 38030 38030 -2.5 sysfs: +2.6 sysfs: 446216 784926 9550688 4382310 424847 312726 5922052 19310380 0 3376340 23705160 35486 38030 38030 38030 -2.5 diskstats: +2.6 diskstats: 3 0 hda 446216 784926 9550688 4382310 424847 312726 5922052 19310380 0 3376340 23705160 3 1 hda1 35486 38030 38030 38030 -On 2.4 you might execute "grep 'hda ' /proc/partitions". On 2.5, you have +On 2.4 you might execute "grep 'hda ' /proc/partitions". On 2.6, you have a choice of "cat /sys/block/hda/stat" or "grep 'hda ' /proc/diskstats". The advantage of one over the other is that the sysfs choice works well if you are watching a known, small set of disks. /proc/diskstats may @@ -43,7 +43,7 @@ In 2.4, the statistics fields are those after the device name. In the above example, the first field of statistics would be 446216. -By contrast, in 2.5 if you look at /sys/block/hda/stat, you'll +By contrast, in 2.6 if you look at /sys/block/hda/stat, you'll find just the eleven fields, beginning with 446216. If you look at /proc/diskstats, the eleven fields will be preceded by the major and minor device numbers, and device name. Each of these formats provide @@ -93,35 +93,35 @@ To avoid introducing performance bottlenecks, no locks are held while modifying these counters. This implies that minor inaccuracies may be introduced when changes collide, so (for instance) adding up all the -read I/Os issued per partition should equal those made to the disks -... but due to the lack of locking it may only be very close. +read I/Os issued per partition should equal those made to the disks ... +but due to the lack of locking it may only be very close. -In release 2.5.65 the 2.5 counters were made per-cpu, which made the lack -of locking almost a non-issue. When the statistics are read, the per-cpu -counters are summed (possibly overflowing the unsigned 32-bit variable -they are summed to) and the result given to the user. There is no -convenient user interface for accessing the per-cpu counters themselves. +In 2.6, there are counters for each cpu, which made the lack of locking +almost a non-issue. When the statistics are read, the per-cpu counters +are summed (possibly overflowing the unsigned 32-bit variable they are +summed to) and the result given to the user. There is no convenient +user interface for accessing the per-cpu counters themselves. Disks vs Partitions ------------------- -There were significant changes between 2.4 and 2.5 in the I/O subsystem. +There were significant changes between 2.4 and 2.6 in the I/O subsystem. As a result, some statistic information disappeared. The translation from a disk address relative to a partition to the disk address relative to the host disk happens much earlier. All merges and timings now happen at the disk level rather than at both the disk and partition level as -in 2.4. Consequently, you'll see a different statistics output on 2.5 for +in 2.4. Consequently, you'll see a different statistics output on 2.6 for partitions from that for disks. There are only *four* fields available -for partitions on 2.5 machines. This is reflected in the examples above. +for partitions on 2.6 machines. This is reflected in the examples above. Field 1 -- # of reads issued This is the total number of reads issued to this partition. Field 2 -- # of sectors read This is the total number of sectors requested to be read from this partition. -Field 3 -- # of reads issued +Field 3 -- # of writes issued This is the total number of writes issued to this partition. -Field 4 -- # of sectors read +Field 4 -- # of sectors written This is the total number of sectors requested to be written to this partition. @@ -135,14 +135,16 @@ Additional notes ---------------- -In 2.5, sysfs is not mounted by default. Here's the line you'll want -to add to your /etc/fstab: +In 2.6, sysfs is not mounted by default. If your distribution of +Linux hasn't added it already, here's the line you'll want to add to +your /etc/fstab: none /sys sysfs defaults 0 0 -In 2.5, at the same time that disk statistics appeared in sysfs, they were -removed from /proc/stat. In 2.4, they appear in both /proc/partitions -and /proc/stat. +In 2.6, all disk statistics were removed from /proc/stat. In 2.4, they +appear in both /proc/partitions and /proc/stat, although the ones in +/proc/stat take a very different format from those in /proc/partitions +(see proc(5), if your system has it.) -- ricklind@us.ibm.com diff -Nru a/Documentation/kbuild/kconfig-language.txt b/Documentation/kbuild/kconfig-language.txt --- a/Documentation/kbuild/kconfig-language.txt Wed Oct 8 12:24:56 2003 +++ b/Documentation/kbuild/kconfig-language.txt Wed Oct 8 12:24:56 2003 @@ -105,10 +105,13 @@ or equal to the first symbol and smaller than or equal to the second symbol. -- help text: "help" +- help text: "help" or "---help---" This defines a help text. The end of the help text is determined by the indentation level, this means it ends at the first line which has a smaller indentation than the first line of the help text. + "---help---" and "help" do not differ in behaviour, "---help---" is + used to help visually seperate configuration logic from help within + the file as an aid to developers. Menu dependencies diff -Nru a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt --- a/Documentation/kbuild/makefiles.txt Wed Oct 8 12:24:57 2003 +++ b/Documentation/kbuild/makefiles.txt Wed Oct 8 12:24:57 2003 @@ -212,7 +212,6 @@ No special notation is required in the makefiles for modules exporting symbols. - See also Documentation/modules.txt. --- 3.5 Library file goals - lib-y diff -Nru a/Documentation/kernel-doc-nano-HOWTO.txt b/Documentation/kernel-doc-nano-HOWTO.txt --- a/Documentation/kernel-doc-nano-HOWTO.txt Wed Oct 8 12:24:56 2003 +++ b/Documentation/kernel-doc-nano-HOWTO.txt Wed Oct 8 12:24:56 2003 @@ -139,8 +139,7 @@ _not_ exported using EXPORT_SYMBOL. !D is used to name additional files to search for functions -exported using EXPORT_SYMBOL. For example many symbols are only exported -in kernel/ksyms.c, therefore kernel-api.sgml include this file with !D. +exported using EXPORT_SYMBOL. !F is replaced by the documentation, in , for the functions listed. diff -Nru a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt --- a/Documentation/kernel-parameters.txt Wed Oct 8 12:24:57 2003 +++ b/Documentation/kernel-parameters.txt Wed Oct 8 12:24:57 2003 @@ -460,6 +460,10 @@ logibm_irq= [HW,MOUSE] Logitech Bus Mouse Driver Format: + log_buf_len=n Sets the size of the printk ring buffer, in bytes. + Format is n, nk, nM. n must be a power of two. The + default is set in kernel config. + lp=0 [LP] Specify parallel ports to use, e.g, lp=port[,port...] lp=none,parport0 (lp0 not configured, lp1 uses lp=reset first parallel port). 'lp=0' disables the diff -Nru a/Documentation/sched-coding.txt b/Documentation/sched-coding.txt --- a/Documentation/sched-coding.txt Wed Oct 8 12:24:55 2003 +++ b/Documentation/sched-coding.txt Wed Oct 8 12:24:55 2003 @@ -47,7 +47,7 @@ and - double_rq_unlock(runqueue_t *rq1, runqueue_t rq2) + double_rq_unlock(runqueue_t *rq1, runqueue_t *rq2) safely lock and unlock, respectively, the two specified runqueues. They do not, however, disable and restore interrupts. Users are required to do so diff -Nru a/Documentation/scsi/ncr53c8xx.txt b/Documentation/scsi/ncr53c8xx.txt --- a/Documentation/scsi/ncr53c8xx.txt Wed Oct 8 12:24:55 2003 +++ b/Documentation/scsi/ncr53c8xx.txt Wed Oct 8 12:24:55 2003 @@ -1025,7 +1025,7 @@ then it will for sure win the next SCSI BUS arbitration. Since, there is no way to know what devices are trying to arbitrate for the -BUS, using this feature can be extremally unfair. So, you are not advised +BUS, using this feature can be extremely unfair. So, you are not advised to enable it, or at most enable this feature for the case the chip lost the previous arbitration (boot option 'iarb:1'). diff -Nru a/Documentation/sound/oss/Introduction b/Documentation/sound/oss/Introduction --- a/Documentation/sound/oss/Introduction Wed Oct 8 12:24:57 2003 +++ b/Documentation/sound/oss/Introduction Wed Oct 8 12:24:57 2003 @@ -431,8 +431,7 @@ For More Information (RTFM): ============================ -1) Information on kernel modules: linux/Documentation/modules.txt - and manual pages for insmod and modprobe. +1) Information on kernel modules: manual pages for insmod and modprobe. 2) Information on PnP, RTFM manual pages for isapnp. diff -Nru a/Documentation/sysrq.txt b/Documentation/sysrq.txt --- a/Documentation/sysrq.txt Wed Oct 8 12:24:56 2003 +++ b/Documentation/sysrq.txt Wed Oct 8 12:24:56 2003 @@ -22,7 +22,10 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On x86 - You press the key combo 'ALT-SysRq-'. Note - Some keyboards may not have a key labeled 'SysRq'. The 'SysRq' key is - also known as the 'Print Screen' key. + also known as the 'Print Screen' key. Also some keyboards cannot + handle so many keys being pressed at the same time, so you might + have better luck with "press Alt", "press SysRq", "release Alt", + "press ", release everything. On SPARC - You press 'ALT-STOP-', I believe. diff -Nru a/Documentation/video4linux/CQcam.txt b/Documentation/video4linux/CQcam.txt --- a/Documentation/video4linux/CQcam.txt Wed Oct 8 12:24:57 2003 +++ b/Documentation/video4linux/CQcam.txt Wed Oct 8 12:24:57 2003 @@ -71,8 +71,7 @@ 2.1 Module Configuration Using modules requires a bit of work to install and pass the -parameters. Do read ../modules.txt, and understand that entries -in /etc/modules.conf of: +parameters. Understand that entries in /etc/modules.conf of: alias parport_lowlevel parport_pc options parport_pc io=0x378 irq=none diff -Nru a/Documentation/vm/hugetlbpage.txt b/Documentation/vm/hugetlbpage.txt --- a/Documentation/vm/hugetlbpage.txt Wed Oct 8 12:24:55 2003 +++ b/Documentation/vm/hugetlbpage.txt Wed Oct 8 12:24:55 2003 @@ -107,6 +107,7 @@ #include #include #include +#include extern int errno; #define SHM_HUGETLB 04000 @@ -167,6 +168,7 @@ #include #include #include +#include #define FILE_NAME "/mnt/hugepagefile" #define LENGTH (256*1024*1024) diff -Nru a/Documentation/vm/locking b/Documentation/vm/locking --- a/Documentation/vm/locking Wed Oct 8 12:24:56 2003 +++ b/Documentation/vm/locking Wed Oct 8 12:24:56 2003 @@ -1,4 +1,4 @@ -Started Oct 1999 by Kanoj Sarcar +Started Oct 1999 by Kanoj Sarcar The intent of this file is to have an uptodate, running commentary from different people about how locking and synchronization is done diff -Nru a/Documentation/zorro.txt b/Documentation/zorro.txt --- a/Documentation/zorro.txt Wed Oct 8 12:24:57 2003 +++ b/Documentation/zorro.txt Wed Oct 8 12:24:57 2003 @@ -2,7 +2,7 @@ ---------------------------------------- Written by Geert Uytterhoeven -Last revised: February 27, 2000 +Last revised: September 5, 2003 1. Introduction @@ -75,7 +75,7 @@ The treatment of these regions depends on the type of Zorro space: - Zorro II address space is always mapped and does not have to be mapped - explicitly using ioremap(). + explicitly using z_ioremap(). Conversion from bus/physical Zorro II addresses to kernel virtual addresses and vice versa is done using: @@ -83,22 +83,20 @@ virt_addr = ZTWO_VADDR(bus_addr); bus_addr = ZTWO_PADDR(virt_addr); - - Zorro III address space must be mapped explicitly using ioremap() first + - Zorro III address space must be mapped explicitly using z_ioremap() first before it can be accessed: - virt_addr = ioremap(bus_addr, size); + virt_addr = z_ioremap(bus_addr, size); ... - iounmap(virt_addr); + z_iounmap(virt_addr); 5. References ------------- linux/include/linux/zorro.h -linux/include/linux/ioport.h -linux/include/asm-m68k/io.h -linux/include/asm-m68k/amigahw.h -linux/include/asm-ppc/io.h +linux/include/asm-{m68k,ppc}/zorro.h +linux/include/linux/zorro_ids.h linux/drivers/zorro /proc/bus/zorro diff -Nru a/MAINTAINERS b/MAINTAINERS --- a/MAINTAINERS Wed Oct 8 12:24:57 2003 +++ b/MAINTAINERS Wed Oct 8 12:24:57 2003 @@ -114,8 +114,8 @@ S: Maintained 8250/16?50 (AND CLONE UARTS) SERIAL DRIVER -P: Theodore Ts'o -M: tytso@mit.edu +P: Russell King +M: rmk+serial@arm.linux.org.uk L: linux-serial@vger.kernel.org W: http://serial.sourceforge.net S: Maintained @@ -284,6 +284,16 @@ L: linux-net@vger.kernel.org S: Maintained +ASUS ACPI EXTRAS DRIVER +P: Karol Kozimor +M: sziwan@users.sourceforge.net +P: Julien Lerouge +M: julien.lerouge@free.fr +L: acpi4asus-user@lists.sourceforge.net +W: http://sourceforge.net/projects/acpi4asus +W: http://julien.lerouge.free.fr +S: Maintained + ATM P: Chas Williams M: chas@cmf.nrl.navy.mil @@ -509,7 +519,7 @@ CRYPTO API P: James Morris -M: jmorris@intercode.com.au +M: jmorris@redhat.com P: David S. Miller M: davem@redhat.com W http://samba.org/~jamesm/crypto/ @@ -624,7 +634,7 @@ P: Christoph Lameter M: christoph@lameter.com W: http://www.digi.com -L: digilnux@dgii.com +L: digilnux@digi.com S: Orphaned DIRECTORY NOTIFICATION @@ -669,6 +679,12 @@ M: romieu@ensta.fr S: Maintained +DVB SUBSYSTEM AND DRIVERS +P: LinuxTV.org Project +L: linux-dvb@linuxtv.org +W: http://linuxtv.org/developer/dvb.xml +S: Supported + EATA-DMA SCSI DRIVER P: Michael Neuffer L: linux-eata@i-connect.net, linux-scsi@vger.kernel.org @@ -798,7 +814,7 @@ GDT SCSI DISK ARRAY CONTROLLER DRIVER P: Achim Leubner -M: achim.leubner@intel.com +M: achim_leubner@adaptec.com L: linux-scsi@vger.kernel.org W: http://www.icp-vortex.com/ S: Supported @@ -1386,7 +1402,7 @@ P: Pekka Savola (ipv6) M: pekkas@netcore.fi P: James Morris -M: jmorris@intercode.com.au +M: jmorris@redhat.com P: Hideaki YOSHIFUJI M: yoshfuji@linux-ipv6.org L: netdev@oss.sgi.com @@ -1657,6 +1673,12 @@ L: linux-390@vm.marist.edu W: http://oss.software.ibm.com/developerworks/opensource/linux390 S: Supported + +SAA7146 VIDEO4LINUX-2 DRIVER +P: Michael Hunold +M: michael@mihu.de +W: http://www.mihu.de/linux/saa7146 +S: Maintained SA1100 SUPPORT P: Nicolas Pitre diff -Nru a/Makefile b/Makefile --- a/Makefile Wed Oct 8 12:24:57 2003 +++ b/Makefile Wed Oct 8 12:24:57 2003 @@ -1,7 +1,7 @@ VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 0 -EXTRAVERSION = -test6 +EXTRAVERSION = -test7 # *DOCUMENTATION* # To see a list of typical targets execute "make help" @@ -37,7 +37,7 @@ endif endif ifndef KBUILD_VERBOSE - KBUILD_VERBOSE = 0 + KBUILD_VERBOSE = 0 endif # Call sparse as part of compilation of C files @@ -79,16 +79,24 @@ endif endif +# That's our default target when none is given on the command line +.PHONY: all +all: + ifneq ($(KBUILD_OUTPUT),) # Invoke a second make in the output directory, passing relevant variables - KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT); /bin/pwd) +# check that the output directory actually exists +saved-output := $(KBUILD_OUTPUT) +KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd) +$(if $(wildcard $(KBUILD_OUTPUT)),, \ + $(error output directory "$(saved-output)" does not exist)) -.PHONY: $(MAKECMDGOALS) all +.PHONY: $(MAKECMDGOALS) -$(MAKECMDGOALS) all: +$(filter-out all,$(MAKECMDGOALS)) all: $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \ KBUILD_SRC=$(CURDIR) KBUILD_VERBOSE=$(KBUILD_VERBOSE) \ - KBUILD_CHECK=$(KBUILD_CHECK) -f $(CURDIR)/Makefile $(MAKECMDGOALS) + KBUILD_CHECK=$(KBUILD_CHECK) -f $(CURDIR)/Makefile $@ # Leave processing to above invocation of make skip-makefile := 1 @@ -156,13 +164,6 @@ HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer HOSTCXXFLAGS = -O2 - -# That's our default target when none is given on the command line -# Note that 'modules' will be added as a prerequisite as well, -# in the CONFIG_MODULES part below - -all: vmlinux - # Decide whether to build built-in, modular, or both. # Normally, just do built-in. @@ -366,6 +367,12 @@ # Build targets only - this includes vmlinux, arch specific targets, clean # targets and others. In general all targets except *config targets. +# That's our default target when none is given on the command line +# Note that 'modules' will be added as a prerequisite as well, +# in the CONFIG_MODULES part below + +all: vmlinux + # Objects we will link into vmlinux / subdirs we need to visit init-y := init/ drivers-y := drivers/ sound/ @@ -753,7 +760,7 @@ .menuconfig.log \ include/asm \ .hdepend include/linux/modversions.h \ - tags TAGS cscope.out kernel.spec \ + tags TAGS cscope* kernel.spec \ .tmp* # Directories removed with 'make mrproper' @@ -877,7 +884,7 @@ @echo ' mrproper - remove all generated files + config + various backup files' @echo '' @echo 'Configuration targets:' - @$(MAKE) -f scripts/kconfig/Makefile help + @$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help @echo '' @echo 'Other generic targets:' @echo ' all - Build all targets marked with [*]' @@ -890,7 +897,7 @@ @echo ' tags/TAGS - Generate tags file for editors' @echo '' @echo 'Documentation targets:' - @$(MAKE) -f Documentation/DocBook/Makefile dochelp + @$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp @echo '' @echo 'Architecture specific targets ($(ARCH)):' @$(if $(archhelp),$(archhelp),\ diff -Nru a/README b/README --- a/README Wed Oct 8 12:24:57 2003 +++ b/README Wed Oct 8 12:24:57 2003 @@ -1,12 +1,9 @@ - Linux kernel release 2.5.xx + Linux kernel release 2.6.xx -These are the release notes for Linux version 2.5. Read them carefully, +These are the release notes for Linux version 2.6. Read them carefully, as they tell you what this is all about, explain how to install the kernel, and what to do if something goes wrong. -NOTE! As with all odd-numbered releases, 2.5.x is a development kernel. -For stable kernels, see the 2.4.x maintained by Marcelo Tosatti. - WHAT IS LINUX? Linux is a Unix clone written from scratch by Linus Torvalds with @@ -55,7 +52,7 @@ directory where you have permissions (eg. your home directory) and unpack it: - gzip -cd linux-2.5.XX.tar.gz | tar xvf - + gzip -cd linux-2.6.XX.tar.gz | tar xvf - Replace "XX" with the version number of the latest kernel. @@ -64,15 +61,15 @@ files. They should match the library, and not get messed up by whatever the kernel-du-jour happens to be. - - You can also upgrade between 2.5.xx releases by patching. Patches are + - You can also upgrade between 2.6.xx releases by patching. Patches are distributed in the traditional gzip and the new bzip2 format. To install by patching, get all the newer patch files, enter the - top level directory of the kernel source (linux-2.5.xx) and execute: + top level directory of the kernel source (linux-2.6.xx) and execute: - gzip -cd ../patch-2.5.xx.gz | patch -p1 + gzip -cd ../patch-2.6.xx.gz | patch -p1 or - bzip2 -dc ../patch-2.5.xx.bz2 | patch -p1 + bzip2 -dc ../patch-2.6.xx.bz2 | patch -p1 (repeat xx for all versions bigger than the version of your current source tree, _in_order_) and you should be ok. You may want to remove @@ -99,7 +96,7 @@ SOFTWARE REQUIREMENTS - Compiling and running the 2.5.xx kernels requires up-to-date + Compiling and running the 2.6.xx kernels requires up-to-date versions of various software packages. Consult ./Documentation/Changes for the minimum version numbers required and how to get updates for these packages. Beware that using @@ -193,8 +190,6 @@ - If you configured any of the parts of the kernel as `modules', you will have to do "make modules" followed by "make modules_install". - Read Documentation/modules.txt for more information. For example, - an explanation of how to use the modules is included there. - Keep a backup kernel handy in case something goes wrong. This is especially true for the development releases, since each new release diff -Nru a/arch/alpha/Kconfig b/arch/alpha/Kconfig --- a/arch/alpha/Kconfig Wed Oct 8 12:24:57 2003 +++ b/arch/alpha/Kconfig Wed Oct 8 12:24:57 2003 @@ -471,21 +471,6 @@ bool depends on ALPHA_GENERIC || ALPHA_JENSEN || ALPHA_ALCOR || ALPHA_MIKASA || ALPHA_SABLE || ALPHA_LYNX || ALPHA_NORITAKE || ALPHA_RAWHIDE default y - ---help--- - The Extended Industry Standard Architecture (EISA) bus was - developed as an open alternative to the IBM MicroChannel bus. - - The EISA bus provided some of the features of the IBM MicroChannel - bus while maintaining backward compatibility with cards made for - the older ISA bus. The EISA bus saw limited use between 1988 and - 1995 when it was made obsolete by the PCI bus. - - Say Y here if you are building a kernel for an EISA-based machine. - - Otherwise, say N. - -config EISA_ALWAYS - def_bool EISA config SMP bool "Symmetric multi-processing support" diff -Nru a/arch/alpha/kernel/core_irongate.c b/arch/alpha/kernel/core_irongate.c --- a/arch/alpha/kernel/core_irongate.c Wed Oct 8 12:24:57 2003 +++ b/arch/alpha/kernel/core_irongate.c Wed Oct 8 12:24:57 2003 @@ -391,7 +391,7 @@ cur_gatt = phys_to_virt(GET_GATT(baddr) & ~1); pte = cur_gatt[GET_GATT_OFF(baddr)] & ~1; - if (__alpha_remap_area_pages(VMALLOC_VMADDR(vaddr), + if (__alpha_remap_area_pages(vaddr, pte, PAGE_SIZE, 0)) { printk("AGP ioremap: FAILED to map...\n"); vfree(area->addr); diff -Nru a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c --- a/arch/alpha/kernel/core_marvel.c Wed Oct 8 12:24:55 2003 +++ b/arch/alpha/kernel/core_marvel.c Wed Oct 8 12:24:55 2003 @@ -696,7 +696,7 @@ } pfn >>= 1; /* make it a true pfn */ - if (__alpha_remap_area_pages(VMALLOC_VMADDR(vaddr), + if (__alpha_remap_area_pages(vaddr, pfn << PAGE_SHIFT, PAGE_SIZE, 0)) { printk("FAILED to map...\n"); diff -Nru a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c --- a/arch/alpha/kernel/core_titan.c Wed Oct 8 12:24:56 2003 +++ b/arch/alpha/kernel/core_titan.c Wed Oct 8 12:24:56 2003 @@ -534,7 +534,7 @@ } pfn >>= 1; /* make it a true pfn */ - if (__alpha_remap_area_pages(VMALLOC_VMADDR(vaddr), + if (__alpha_remap_area_pages(vaddr, pfn << PAGE_SHIFT, PAGE_SIZE, 0)) { printk("FAILED to map...\n"); diff -Nru a/arch/alpha/kernel/init_task.c b/arch/alpha/kernel/init_task.c --- a/arch/alpha/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/alpha/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -12,6 +13,9 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_mm); +EXPORT_SYMBOL(init_task); union thread_union init_thread_union __attribute__((section(".data.init_thread"))) diff -Nru a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c --- a/arch/alpha/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/alpha/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -472,6 +473,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { @@ -518,6 +521,8 @@ } } +EXPORT_SYMBOL(free_irq); + int show_interrupts(struct seq_file *p, void *v) { @@ -752,6 +757,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + /* * Return a mask of triggered interrupts (this * can handle only legacy ISA interrupts). @@ -822,6 +829,8 @@ irq_found = -irq_found; return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); #ifdef CONFIG_SMP void synchronize_irq(unsigned int irq) diff -Nru a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c --- a/arch/alpha/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/alpha/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -164,17 +165,23 @@ common_shutdown(LINUX_REBOOT_CMD_RESTART, restart_cmd); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { common_shutdown(LINUX_REBOOT_CMD_HALT, NULL); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { common_shutdown(LINUX_REBOOT_CMD_POWER_OFF, NULL); } + +EXPORT_SYMBOL(machine_power_off); /* Used by sysrq-p, among others. I don't believe r9-r15 are ever saved in the context it's used. */ diff -Nru a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c --- a/arch/alpha/kernel/setup.c Wed Oct 8 12:24:56 2003 +++ b/arch/alpha/kernel/setup.c Wed Oct 8 12:24:56 2003 @@ -33,6 +33,7 @@ #include #include #include +#include #ifdef CONFIG_MAGIC_SYSRQ #include #include @@ -680,6 +681,11 @@ /* Default root filesystem to sda2. */ ROOT_DEV = Root_SDA2; +#ifdef CONFIG_EISA + /* FIXME: only set this when we actually have EISA in this box? */ + EISA_bus = 1; +#endif + /* * Check ASN in HWRPB for validity, report if bad. * FIXME: how was this failing? Should we trust it instead, @@ -1203,7 +1209,7 @@ platform_string(), nr_processors); #ifdef CONFIG_SMP - seq_printf(f, "cpus active\t\t: %d\n" + seq_printf(f, "cpus active\t\t: %ld\n" "cpu active mask\t\t: %016lx\n", num_online_cpus(), cpu_present_mask); #endif diff -Nru a/arch/alpha/kernel/smp.c b/arch/alpha/kernel/smp.c --- a/arch/alpha/kernel/smp.c Wed Oct 8 12:24:56 2003 +++ b/arch/alpha/kernel/smp.c Wed Oct 8 12:24:56 2003 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,8 @@ unsigned long cpu_present_mask; cpumask_t cpu_online_map; +EXPORT_SYMBOL(cpu_online_map); + /* cpus reported in the hwrpb */ static unsigned long hwrpb_cpu_present_mask __initdata = 0; @@ -597,7 +600,7 @@ if (cpu_online(cpu)) bogosum += cpu_data[cpu].loops_per_jiffy; - printk(KERN_INFO "SMP: Total of %d processors activated " + printk(KERN_INFO "SMP: Total of %ld processors activated " "(%lu.%02lu BogoMIPS).\n", num_online_cpus(), (bogosum + 2500) / (500000/HZ), diff -Nru a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c --- a/arch/alpha/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/alpha/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -27,6 +27,7 @@ */ #include #include +#include #include #include #include @@ -52,6 +53,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + extern unsigned long wall_jiffies; /* kernel/timer.c */ static int set_rtc_mmss(unsigned long); @@ -89,6 +92,16 @@ return result; } +/* + * Scheduler clock - returns current time in nanosec units. + * + * Copied from ARM code for expediency... ;-} + */ +unsigned long long sched_clock(void) +{ + return (unsigned long long)jiffies * (1000000000 / HZ); +} + /* * timer_interrupt() needs to keep up the real-time clock, @@ -239,8 +252,9 @@ * arch/i386/time.c. */ -#define CALIBRATE_LATCH (52 * LATCH) -#define CALIBRATE_TIME (52 * 1000020 / HZ) +#define PIC_TICK_RATE 1193180UL +#define CALIBRATE_LATCH 0xffff +#define TIMEOUT_COUNT 0x100000 static unsigned long __init calibrate_cc_with_pic(void) @@ -263,19 +277,15 @@ cc = rpcc(); do { - count+=100; /* by 1 takes too long to timeout from 0 */ - } while ((inb(0x61) & 0x20) == 0 && count > 0); + count++; + } while ((inb(0x61) & 0x20) == 0 && count < TIMEOUT_COUNT); cc = rpcc() - cc; /* Error: ECTCNEVERSET or ECPUTOOFAST. */ - if (count <= 100) - return 0; - - /* Error: ECPUTOOSLOW. */ - if (cc <= CALIBRATE_TIME) + if (count <= 1 || count == TIMEOUT_COUNT) return 0; - return (cc * 1000000UL) / CALIBRATE_TIME; + return ((long)cc * PIC_TICK_RATE) / (CALIBRATE_LATCH + 1); } /* The Linux interpretation of the CMOS clock register contents: @@ -450,6 +460,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { @@ -493,6 +505,8 @@ write_sequnlock_irq(&xtime_lock); return 0; } + +EXPORT_SYMBOL(do_settimeofday); /* diff -Nru a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c --- a/arch/alpha/kernel/traps.c Wed Oct 8 12:24:57 2003 +++ b/arch/alpha/kernel/traps.c Wed Oct 8 12:24:57 2003 @@ -177,6 +177,8 @@ show_stack(NULL, NULL); } +EXPORT_SYMBOL(dump_stack); + void die_if_kernel(char * str, struct pt_regs *regs, long err, unsigned long *r9_15) { diff -Nru a/arch/alpha/lib/checksum.c b/arch/alpha/lib/checksum.c --- a/arch/alpha/lib/checksum.c Wed Oct 8 12:24:56 2003 +++ b/arch/alpha/lib/checksum.c Wed Oct 8 12:24:56 2003 @@ -9,6 +9,7 @@ * Rick Gorton */ +#include #include #include @@ -172,6 +173,8 @@ result = (result & 0xffffffff) + (result >> 32); return result; } + +EXPORT_SYMBOL(csum_partial); /* * this routine is used for miscellaneous IP-like checksums, mainly diff -Nru a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c --- a/arch/alpha/mm/init.c Wed Oct 8 12:24:57 2003 +++ b/arch/alpha/mm/init.c Wed Oct 8 12:24:57 2003 @@ -210,7 +210,8 @@ /* Allocate one PGD and one PMD. In the case of SRM, we'll need these to actually remap the console. There is an assumption here that only one of each is needed, and this allows for 8MB. - Currently (late 1999), big consoles are still under 4MB. + On systems with larger consoles, additional pages will be + allocated as needed during the mapping process. In the case of not SRM, but not CONFIG_ALPHA_LARGE_VMALLOC, we need to allocate the PGD we use for vmalloc before we start @@ -237,6 +238,15 @@ unsigned long pfn = crb->map[i].pa >> PAGE_SHIFT; crb->map[i].va = vaddr; for (j = 0; j < crb->map[i].count; ++j) { + /* Newer console's (especially on larger + systems) may require more pages of + PTEs. Grab additional pages as needed. */ + if (pmd != pmd_offset(pgd, vaddr)) { + memset(kernel_end, 0, PAGE_SIZE); + pmd = pmd_offset(pgd, vaddr); + pmd_set(pmd, (pte_t *)kernel_end); + kernel_end += PAGE_SIZE; + } set_pte(pte_offset_kernel(pmd, vaddr), pfn_pte(pfn, PAGE_KERNEL)); pfn++; diff -Nru a/arch/arm/Kconfig b/arch/arm/Kconfig --- a/arch/arm/Kconfig Wed Oct 8 12:24:56 2003 +++ b/arch/arm/Kconfig Wed Oct 8 12:24:56 2003 @@ -239,7 +239,7 @@ # Now handle the bus types config PCI - bool "PCI support" if ARCH_INTEGRATOR + bool "PCI support" if ARCH_INTEGRATOR_AP default y if ARCH_FTVPCI || ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP3XX help Find out whether you have a PCI motherboard. PCI is the name of a @@ -644,8 +644,6 @@ source "drivers/misc/Kconfig" source "drivers/usb/Kconfig" - -source "net/bluetooth/Kconfig" menu "Kernel hacking" diff -Nru a/arch/arm/Makefile b/arch/arm/Makefile --- a/arch/arm/Makefile Wed Oct 8 12:24:56 2003 +++ b/arch/arm/Makefile Wed Oct 8 12:24:56 2003 @@ -182,7 +182,6 @@ echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)' echo ' Image - Uncompressed kernel image (arch/$(ARCH)/boot/Image)' echo ' bootpImage - Combined zImage and initial RAM disk' - echo ' initrd - Create an initial image' echo ' install - Install uncompressed kernel' echo ' zinstall - Install compressed kernel' echo ' Install using (your) ~/bin/installkernel or' diff -Nru a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S --- a/arch/arm/boot/compressed/head.S Wed Oct 8 12:24:57 2003 +++ b/arch/arm/boot/compressed/head.S Wed Oct 8 12:24:57 2003 @@ -477,6 +477,12 @@ @ b __arm6_cache_off @ b __armv3_cache_flush + .word 0x00000000 @ old ARM ID + .word 0x0000f000 + mov pc, lr + mov pc, lr + mov pc, lr + .word 0x41007000 @ ARM7/710 .word 0xfff8fe00 b __arm7_cache_off @@ -489,6 +495,14 @@ b __armv4_cache_off mov pc, lr + .word 0x00007000 @ ARM7 IDs + .word 0x0000f000 + mov pc, lr + mov pc, lr + mov pc, lr + + @ Everything from here on will be the new ID system. + .word 0x41129200 @ ARM920T .word 0xff00fff0 b __armv4_cache_on @@ -507,8 +521,16 @@ b __armv4_cache_off b __armv4_cache_flush - .word 0x69050000 @ xscale - .word 0xffff0000 + @ These match on the architecture ID + + .word 0x00050000 @ ARMv5TE + .word 0x000f0000 + b __armv4_cache_on + b __armv4_cache_off + b __armv4_cache_flush + + .word 0x00060000 @ ARMv5TEJ + .word 0x000f0000 b __armv4_cache_on b __armv4_cache_off b __armv4_cache_flush diff -Nru a/arch/arm/common/sa1111-pcipool.c b/arch/arm/common/sa1111-pcipool.c --- a/arch/arm/common/sa1111-pcipool.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/common/sa1111-pcipool.c Wed Oct 8 12:24:57 2003 @@ -274,7 +274,6 @@ schedule_timeout (POOL_TIMEOUT_JIFFIES); - current->state = TASK_RUNNING; remove_wait_queue (&pool->waitq, &wait); goto restart; } diff -Nru a/arch/arm/kernel/apm.c b/arch/arm/kernel/apm.c --- a/arch/arm/kernel/apm.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/kernel/apm.c Wed Oct 8 12:24:57 2003 @@ -179,13 +179,10 @@ wake_up_interruptible(&apm_waitqueue); } -/* defined in pm.c */ -extern int suspend(void); - static int apm_suspend(void) { struct list_head *l; - int err = suspend(); + int err = pm_suspend(PM_SUSPEND_MEM); /* * Anyone on the APM queues will think we're still suspended. diff -Nru a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S --- a/arch/arm/kernel/entry-armv.S Wed Oct 8 12:24:56 2003 +++ b/arch/arm/kernel/entry-armv.S Wed Oct 8 12:24:56 2003 @@ -439,20 +439,25 @@ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp /* FIXME: should not be using soo many LDRs here */ - ldr \irqnr, =IO_ADDRESS(INTEGRATOR_IC_BASE) - ldr \irqstat, [\irqnr, #IRQ_STATUS] @ get masked status - ldr \irqnr, =IO_ADDRESS(INTEGRATOR_HDR_BASE) - ldr \irqnr, [\irqnr, #(INTEGRATOR_HDR_IC_OFFSET+IRQ_STATUS)] - orr \irqstat, \irqstat, \irqnr, lsl #INTEGRATOR_CM_INT0 + ldr \base, =IO_ADDRESS(INTEGRATOR_IC_BASE) + mov \irqnr, #IRQ_PIC_START + ldr \irqstat, [\base, #IRQ_STATUS] @ get masked status + ldr \base, =IO_ADDRESS(INTEGRATOR_HDR_BASE) + teq \irqstat, #0 + ldreq \irqstat, [\base, #(INTEGRATOR_HDR_IC_OFFSET+IRQ_STATUS)] + moveq \irqnr, #IRQ_CIC_START - mov \irqnr, #0 -1001: tst \irqstat, #1 +1001: tst \irqstat, #15 bne 1002f + add \irqnr, \irqnr, #4 + movs \irqstat, \irqstat, lsr #4 + bne 1001b +1002: tst \irqstat, #1 + bne 1003f add \irqnr, \irqnr, #1 - mov \irqstat, \irqstat, lsr #1 - cmp \irqnr, #22 - bcc 1001b -1002: /* EQ will be set if we reach 22 */ + movs \irqstat, \irqstat, lsr #1 + bne 1002b +1003: /* EQ will be set if no irqs pending */ .endm .macro irq_prio_table diff -Nru a/arch/arm/kernel/init_task.c b/arch/arm/kernel/init_task.c --- a/arch/arm/kernel/init_task.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/kernel/init_task.c Wed Oct 8 12:24:57 2003 @@ -2,6 +2,7 @@ * linux/arch/arm/kernel/init_task.c */ #include +#include #include #include #include @@ -16,6 +17,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -36,3 +39,5 @@ * All other task structs will be allocated on slabs in fork.c */ struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_task); diff -Nru a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c --- a/arch/arm/kernel/irq.c Wed Oct 8 12:24:55 2003 +++ b/arch/arm/kernel/irq.c Wed Oct 8 12:24:55 2003 @@ -19,6 +19,7 @@ */ #include #include +#include #include #include #include @@ -653,6 +654,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + /** * free_irq - free an interrupt * @irq: Interrupt line to free @@ -696,6 +699,8 @@ } } +EXPORT_SYMBOL(free_irq); + static DECLARE_MUTEX(probe_sem); /* Start the interrupt probing. Unlike other architectures, @@ -750,6 +755,8 @@ return irqs; } +EXPORT_SYMBOL(probe_irq_on); + unsigned int probe_irq_mask(unsigned long irqs) { unsigned int mask = 0, i; @@ -800,6 +807,8 @@ return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); void __init init_irq_proc(void) { diff -Nru a/arch/arm/kernel/pm.c b/arch/arm/kernel/pm.c --- a/arch/arm/kernel/pm.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/kernel/pm.c Wed Oct 8 12:24:57 2003 @@ -9,68 +9,18 @@ * sleep. */ #include +#include +#include #include -#include -#include #include #include -#include -#include - -/* - * Tell the linker that pm_do_suspend may not be present. - */ -extern int pm_do_suspend(void) __attribute__((weak)); - -int suspend(void) -{ - int ret; - - if (!pm_do_suspend) - return -ENOSYS; - - /* - * Suspend "legacy" devices. - */ - ret = pm_send_all(PM_SUSPEND, (void *)3); - if (ret != 0) - goto out; - - ret = device_suspend(3); - if (ret) - goto resume_legacy; - - local_irq_disable(); - leds_event(led_stop); - - sysdev_suspend(3); - - ret = pm_do_suspend(); - - sysdev_resume(); - - leds_event(led_start); - local_irq_enable(); - - device_resume(); - - resume_legacy: - pm_send_all(PM_RESUME, (void *)0); - - out: - return ret; -} - #ifdef CONFIG_SYSCTL /* * We really want this to die. It's a disgusting hack using unallocated * sysctl numbers. We should be using a real interface. */ -#include -#include - static int pm_sysctl_proc_handler(ctl_table *ctl, int write, struct file *filp, void *buffer, size_t *lenp) @@ -79,7 +29,7 @@ printk("PM: task %s (pid %d) uses deprecated sysctl PM interface\n", current->comm, current->pid); if (write) - ret = suspend(); + ret = pm_suspend(PM_SUSPEND_MEM); return ret; } diff -Nru a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c --- a/arch/arm/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -45,11 +45,15 @@ hlt_counter++; } +EXPORT_SYMBOL(disable_hlt); + void enable_hlt(void) { hlt_counter--; } +EXPORT_SYMBOL(enable_hlt); + static int __init nohlt_setup(char *__unused) { hlt_counter = 1; @@ -117,16 +121,18 @@ void machine_halt(void) { - leds_event(led_halted); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { - leds_event(led_halted); if (pm_power_off) pm_power_off(); } +EXPORT_SYMBOL(machine_power_off); + void machine_restart(char * __unused) { /* @@ -154,6 +160,8 @@ printk("Reboot failed -- System halted\n"); while (1); } + +EXPORT_SYMBOL(machine_restart); void show_regs(struct pt_regs * regs) { diff -Nru a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c --- a/arch/arm/kernel/setup.c Wed Oct 8 12:24:56 2003 +++ b/arch/arm/kernel/setup.c Wed Oct 8 12:24:56 2003 @@ -182,7 +182,7 @@ "5", "5T", "5TE", - "?(8)", + "5TEJ", "?(9)", "?(10)", "?(11)", diff -Nru a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c --- a/arch/arm/kernel/signal.c Wed Oct 8 12:24:55 2003 +++ b/arch/arm/kernel/signal.c Wed Oct 8 12:24:55 2003 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -539,6 +540,11 @@ if (!user_mode(regs)) return 0; + if (current->flags & PF_FREEZE) { + refrigerator(0); + goto no_signal; + } + if (current->ptrace & PT_SINGLESTEP) ptrace_cancel_bpt(current); @@ -550,6 +556,7 @@ return 1; } + no_signal: /* * No signal to deliver to the process - restart the syscall. */ diff -Nru a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c --- a/arch/arm/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -34,6 +35,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + extern unsigned long wall_jiffies; /* this needs a better home */ @@ -72,8 +75,6 @@ */ unsigned long long sched_clock(void) { - unsigned long long this_offset; - return (unsigned long long)jiffies * (1000000000 / HZ); } @@ -137,6 +138,47 @@ void (*leds_event)(led_event_t) = dummy_leds_event; +static int leds_suspend(struct sys_device *dev, u32 state) +{ + leds_event(led_stop); + return 0; +} + +static int leds_resume(struct sys_device *dev) +{ + leds_event(led_start); + return 0; +} + +static int leds_shutdown(struct sys_device *dev) +{ + leds_event(led_halted); + return 0; +} + +static struct sysdev_class leds_sysclass = { + set_kset_name("leds"), + .shutdown = leds_shutdown, + .suspend = leds_suspend, + .resume = leds_resume, +}; + +static struct sys_device leds_device = { + .id = 0, + .cls = &leds_sysclass, +}; + +static int __init leds_init(void) +{ + int ret; + ret = sysdev_class_register(&leds_sysclass); + if (ret == 0) + ret = sys_device_register(&leds_device); + return ret; +} + +device_initcall(leds_init); + EXPORT_SYMBOL(leds_event); #endif @@ -182,6 +224,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, sec = tv->tv_sec; @@ -214,6 +258,8 @@ clock_was_set(); return 0; } + +EXPORT_SYMBOL(do_settimeofday); static struct irqaction timer_irq = { .name = "timer", diff -Nru a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c --- a/arch/arm/kernel/traps.c Wed Oct 8 12:24:56 2003 +++ b/arch/arm/kernel/traps.c Wed Oct 8 12:24:56 2003 @@ -178,6 +178,8 @@ #endif } +EXPORT_SYMBOL(dump_stack); + void show_stack(struct task_struct *tsk, unsigned long *sp) { unsigned long fp; @@ -212,10 +214,10 @@ printk("CPU: %d\n", smp_processor_id()); show_regs(regs); printk("Process %s (pid: %d, stack limit = 0x%p)\n", - current->comm, current->pid, tsk->thread_info + 1); + tsk->comm, tsk->pid, tsk->thread_info + 1); if (!user_mode(regs) || in_interrupt()) { - dump_mem("Stack: ", (unsigned long)(regs + 1), 8192+(unsigned long)tsk->thread_info); + dump_mem("Stack: ", regs->ARM_sp, 8192+(unsigned long)tsk->thread_info); dump_backtrace(regs, tsk); dump_instr(regs); } diff -Nru a/arch/arm/lib/io-readsl-armv4.S b/arch/arm/lib/io-readsl-armv4.S --- a/arch/arm/lib/io-readsl-armv4.S Wed Oct 8 12:24:57 2003 +++ b/arch/arm/lib/io-readsl-armv4.S Wed Oct 8 12:24:57 2003 @@ -9,7 +9,6 @@ */ #include #include -#include /* * Note that some reads can be aligned on half-word boundaries. @@ -31,6 +30,10 @@ blt 4f bgt 6f +#ifndef __ARMEB__ + + /* little endian code */ + strh ip, [r1], #2 mov ip, ip, lsr #16 3: subs r2, r2, #1 @@ -67,4 +70,49 @@ mov ip, ip, lsr #16 strb ip, [r1] mov pc, lr + +#else + + /* big endian code */ + + + mov r3, ip, lsr #16 + strh r3, [r1], #2 +3: mov r3, ip, lsl #16 + subs r2, r2, #1 + ldrne ip, [r0] + orrne r3, r3, ip, lsr #16 + strne r3, [r1], #4 + bne 3b + strh ip, [r1], #2 + mov pc, lr + +4: mov r3, ip, lsr #24 + strb r3, [r1], #1 + mov r3, ip, lsr #8 + strh r3, [r1], #2 +5: mov r3, ip, lsl #24 + subs r2, r2, #1 + ldrne ip, [r0] + orrne r3, r3, ip, lsr #8 + strne r3, [r1], #4 + bne 5b + strb ip, [r1], #1 + mov pc, lr + +6: mov r3, ip, lsr #24 + strb r3, [r1], #1 +7: mov r3, ip, lsl #8 + subs r2, r2, #1 + ldrne ip, [r0] + orrne r3, r3, ip, lsr #24 + strne r3, [r1], #4 + bne 7b + mov r3, ip, lsr #8 + strh r3, [r1], #2 + strb ip, [r1], #1 + mov pc, lr + +#endif + diff -Nru a/arch/arm/lib/io-readsw-armv4.S b/arch/arm/lib/io-readsw-armv4.S --- a/arch/arm/lib/io-readsw-armv4.S Wed Oct 8 12:24:57 2003 +++ b/arch/arm/lib/io-readsw-armv4.S Wed Oct 8 12:24:57 2003 @@ -9,7 +9,14 @@ */ #include #include -#include + + .macro pack, rd, hw1, hw2 +#ifndef __ARMEB__ + orr \rd, \hw1, \hw2, lsl #16 +#else + orr \rd, \hw2, \hw1, lsl #16 +#endif + .endm .insw_bad_alignment: adr r0, .insw_bad_align_msg @@ -41,19 +48,19 @@ .insw_8_lp: ldrh r3, [r0] ldrh r4, [r0] - orr r3, r3, r4, lsl #16 + pack r3, r3, r4 ldrh r4, [r0] ldrh r5, [r0] - orr r4, r4, r5, lsl #16 + pack r4, r4, r5 ldrh r5, [r0] ldrh ip, [r0] - orr r5, r5, ip, lsl #16 + pack r5, r5, ip ldrh ip, [r0] ldrh lr, [r0] - orr ip, ip, lr, lsl #16 + pack ip, ip, lr stmia r1!, {r3 - r5, ip} @@ -68,11 +75,11 @@ ldrh r3, [r0] ldrh r4, [r0] - orr r3, r3, r4, lsl #16 + pack r3, r3, r4 ldrh r4, [r0] ldrh ip, [r0] - orr r4, r4, ip, lsl #16 + pack r4, r4, ip stmia r1!, {r3, r4} @@ -81,7 +88,7 @@ ldrh r3, [r0] ldrh ip, [r0] - orr r3, r3, ip, lsl #16 + pack r3, r3, ip str r3, [r1], #4 diff -Nru a/arch/arm/lib/io-writesw-armv4.S b/arch/arm/lib/io-writesw-armv4.S --- a/arch/arm/lib/io-writesw-armv4.S Wed Oct 8 12:24:57 2003 +++ b/arch/arm/lib/io-writesw-armv4.S Wed Oct 8 12:24:57 2003 @@ -9,7 +9,18 @@ */ #include #include -#include + + .macro outword, rd +#ifndef __ARMEB__ + strh \rd, [r0] + mov \rd, \rd, lsr #16 + strh \rd, [r0] +#else + mov lr, \rd, lsr #16 + strh lr, [r0] + strh \rd, [r0] +#endif + .endm .outsw_bad_alignment: adr r0, .outsw_bad_align_msg @@ -40,20 +51,10 @@ bmi .no_outsw_8 .outsw_8_lp: ldmia r1!, {r3, r4, r5, ip} - - strh r3, [r0] - mov r3, r3, lsr #16 - strh r3, [r0] - strh r4, [r0] - mov r4, r4, lsr #16 - strh r4, [r0] - strh r5, [r0] - mov r5, r5, lsr #16 - strh r5, [r0] - strh ip, [r0] - mov ip, ip, lsr #16 - strh ip, [r0] - + outword r3 + outword r4 + outword r5 + outword ip subs r2, r2, #8 bpl .outsw_8_lp @@ -64,20 +65,14 @@ beq .no_outsw_4 ldmia r1!, {r3, ip} - strh r3, [r0] - mov r3, r3, lsr #16 - strh r3, [r0] - strh ip, [r0] - mov ip, ip, lsr #16 - strh ip, [r0] + outword r3 + outword ip .no_outsw_4: tst r2, #2 beq .no_outsw_2 ldr r3, [r1], #4 - strh r3, [r0] - mov r3, r3, lsr #16 - strh r3, [r0] + outword r3 .no_outsw_2: tst r2, #1 ldrneh r3, [r1] diff -Nru a/arch/arm/lib/lib1funcs.S b/arch/arm/lib/lib1funcs.S --- a/arch/arm/lib/lib1funcs.S Wed Oct 8 12:24:55 2003 +++ b/arch/arm/lib/lib1funcs.S Wed Oct 8 12:24:55 2003 @@ -1,7 +1,12 @@ -@ libgcc1 routines for ARM cpu. -@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk) +/* + * linux/arch/arm/lib/lib1funcs.S: Optimized ARM division routines + * + * Author: Nicolas Pitre + * - contributed to gcc-3.4 on Sep 30, 2003 + * - adapted for the Linux kernel on Oct 2, 2003 + */ -/* Copyright (C) 1995, 1996, 1998 Free Software Foundation, Inc. +/* Copyright 1995, 1996, 1998, 1999, 2000, 2003 Free Software Foundation, Inc. This file is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -10,11 +15,12 @@ In addition to the permissions in the GNU General Public License, the Free Software Foundation gives you unlimited permission to link the -compiled version of this file with other programs, and to distribute -those programs without any restriction coming from the use of this -file. (The General Public License restrictions do apply in other -respects; for example, they cover modification of the file, and -distribution when not linked into another program.) +compiled version of this file into combinations with other programs, +and to distribute those combinations without any restriction coming +from the use of this file. (The General Public License restrictions +do apply in other respects; for example, they cover modification of +the file, and distribution when not linked into a combine +executable.) This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,286 +32,283 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* As a special exception, if you link this library with other files, - some of which are compiled with GCC, to produce an executable, - this library does not by itself cause the resulting executable - to be covered by the GNU General Public License. - This exception does not however invalidate any other reasons why - the executable file might be covered by the GNU General Public License. - */ -/* This code is derived from gcc 2.95.3 - * 29/07/01 Adapted for linux - * 27/03/03 Ian Molton Clean up CONFIG_CPU - */ #include #include -#include -#define RET mov -#define RETc(x) mov##x -#define RETCOND - -dividend .req r0 -divisor .req r1 -result .req r2 -overdone .req r2 -curbit .req r3 + +.macro ARM_DIV_BODY dividend, divisor, result, curbit + +#if __LINUX_ARM_ARCH__ >= 5 + + clz \curbit, \divisor + clz \result, \dividend + sub \result, \curbit, \result + mov \curbit, #1 + mov \divisor, \divisor, lsl \result + mov \curbit, \curbit, lsl \result + mov \result, #0 -ENTRY(__udivsi3) - cmp divisor, #0 - beq Ldiv0 - mov curbit, #1 - mov result, #0 - cmp dividend, divisor - bcc Lgot_result_udivsi3 -1: +#else + + @ Initially shift the divisor left 3 bits if possible, + @ set curbit accordingly. This allows for curbit to be located + @ at the left end of each 4 bit nibbles in the division loop + @ to save one loop in most cases. + tst \divisor, #0xe0000000 + moveq \divisor, \divisor, lsl #3 + moveq \curbit, #8 + movne \curbit, #1 + @ Unless the divisor is very big, shift it up in multiples of @ four bits, since this is the amount of unwinding in the main @ division loop. Continue shifting until the divisor is @ larger than the dividend. - cmp divisor, #0x10000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #4 - movcc curbit, curbit, lsl #4 - bcc 1b +1: cmp \divisor, #0x10000000 + cmplo \divisor, \dividend + movlo \divisor, \divisor, lsl #4 + movlo \curbit, \curbit, lsl #4 + blo 1b -2: @ For very big divisors, we must shift it a bit at a time, or @ we will be in danger of overflowing. - cmp divisor, #0x80000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #1 - movcc curbit, curbit, lsl #1 - bcc 2b - -3: - @ Test for possible subtractions, and note which bits - @ are done in the result. On the final pass, this may subtract - @ too much from the dividend, but the result will be ok, since the - @ "bit" will have been shifted out at the bottom. - cmp dividend, divisor - subcs dividend, dividend, divisor - orrcs result, result, curbit - cmp dividend, divisor, lsr #1 - subcs dividend, dividend, divisor, lsr #1 - orrcs result, result, curbit, lsr #1 - cmp dividend, divisor, lsr #2 - subcs dividend, dividend, divisor, lsr #2 - orrcs result, result, curbit, lsr #2 - cmp dividend, divisor, lsr #3 - subcs dividend, dividend, divisor, lsr #3 - orrcs result, result, curbit, lsr #3 - cmp dividend, #0 @ Early termination? - movnes curbit, curbit, lsr #4 @ No, any more bits to do? - movne divisor, divisor, lsr #4 - bne 3b -Lgot_result_udivsi3: - mov r0, result - RET pc, lr +1: cmp \divisor, #0x80000000 + cmplo \divisor, \dividend + movlo \divisor, \divisor, lsl #1 + movlo \curbit, \curbit, lsl #1 + blo 1b -Ldiv0: - str lr, [sp, #-4]! - bl __div0 - mov r0, #0 @ about as wrong as it could be - ldmia sp!, {pc}RETCOND + mov \result, #0 -/* __umodsi3 ----------------------- */ +#endif + + @ Division loop +1: cmp \dividend, \divisor + subhs \dividend, \dividend, \divisor + orrhs \result, \result, \curbit + cmp \dividend, \divisor, lsr #1 + subhs \dividend, \dividend, \divisor, lsr #1 + orrhs \result, \result, \curbit, lsr #1 + cmp \dividend, \divisor, lsr #2 + subhs \dividend, \dividend, \divisor, lsr #2 + orrhs \result, \result, \curbit, lsr #2 + cmp \dividend, \divisor, lsr #3 + subhs \dividend, \dividend, \divisor, lsr #3 + orrhs \result, \result, \curbit, lsr #3 + cmp \dividend, #0 @ Early termination? + movnes \curbit, \curbit, lsr #4 @ No, any more bits to do? + movne \divisor, \divisor, lsr #4 + bne 1b + +.endm + + +.macro ARM_DIV2_ORDER divisor, order + +#if __LINUX_ARM_ARCH__ >= 5 + + clz \order, \divisor + rsb \order, \order, #31 + +#else + + cmp \divisor, #(1 << 16) + movhs \divisor, \divisor, lsr #16 + movhs \order, #16 + movlo \order, #0 + + cmp \divisor, #(1 << 8) + movhs \divisor, \divisor, lsr #8 + addhs \order, \order, #8 + + cmp \divisor, #(1 << 4) + movhs \divisor, \divisor, lsr #4 + addhs \order, \order, #4 + + cmp \divisor, #(1 << 2) + addhi \order, \order, #3 + addls \order, \order, \divisor, lsr #1 + +#endif + +.endm + + +.macro ARM_MOD_BODY dividend, divisor, order, spare + +#if __LINUX_ARM_ARCH__ >= 5 + + clz \order, \divisor + clz \spare, \dividend + sub \order, \order, \spare + mov \divisor, \divisor, lsl \order + +#else + + mov \order, #0 -ENTRY(__umodsi3) - cmp divisor, #0 - beq Ldiv0 - mov curbit, #1 - cmp dividend, divisor - RETc(cc) pc, lr -1: @ Unless the divisor is very big, shift it up in multiples of @ four bits, since this is the amount of unwinding in the main @ division loop. Continue shifting until the divisor is @ larger than the dividend. - cmp divisor, #0x10000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #4 - movcc curbit, curbit, lsl #4 - bcc 1b +1: cmp \divisor, #0x10000000 + cmplo \divisor, \dividend + movlo \divisor, \divisor, lsl #4 + addlo \order, \order, #4 + blo 1b -2: @ For very big divisors, we must shift it a bit at a time, or @ we will be in danger of overflowing. - cmp divisor, #0x80000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #1 - movcc curbit, curbit, lsl #1 - bcc 2b - -3: - @ Test for possible subtractions. On the final pass, this may - @ subtract too much from the dividend, so keep track of which - @ subtractions are done, we can fix them up afterwards... - mov overdone, #0 - cmp dividend, divisor - subcs dividend, dividend, divisor - cmp dividend, divisor, lsr #1 - subcs dividend, dividend, divisor, lsr #1 - orrcs overdone, overdone, curbit, ror #1 - cmp dividend, divisor, lsr #2 - subcs dividend, dividend, divisor, lsr #2 - orrcs overdone, overdone, curbit, ror #2 - cmp dividend, divisor, lsr #3 - subcs dividend, dividend, divisor, lsr #3 - orrcs overdone, overdone, curbit, ror #3 - mov ip, curbit - cmp dividend, #0 @ Early termination? - movnes curbit, curbit, lsr #4 @ No, any more bits to do? - movne divisor, divisor, lsr #4 - bne 3b - - @ Any subtractions that we should not have done will be recorded in - @ the top three bits of "overdone". Exactly which were not needed - @ are governed by the position of the bit, stored in ip. - @ If we terminated early, because dividend became zero, - @ then none of the below will match, since the bit in ip will not be - @ in the bottom nibble. - ands overdone, overdone, #0xe0000000 - RETc(eq) pc, lr @ No fixups needed - tst overdone, ip, ror #3 - addne dividend, dividend, divisor, lsr #3 - tst overdone, ip, ror #2 - addne dividend, dividend, divisor, lsr #2 - tst overdone, ip, ror #1 - addne dividend, dividend, divisor, lsr #1 - RET pc, lr +1: cmp \divisor, #0x80000000 + cmplo \divisor, \dividend + movlo \divisor, \divisor, lsl #1 + addlo \order, \order, #1 + blo 1b + +#endif + + @ Perform all needed substractions to keep only the reminder. + @ Do comparisons in batch of 4 first. + subs \order, \order, #3 @ yes, 3 is intended here + blt 2f + +1: cmp \dividend, \divisor + subhs \dividend, \dividend, \divisor + cmp \dividend, \divisor, lsr #1 + subhs \dividend, \dividend, \divisor, lsr #1 + cmp \dividend, \divisor, lsr #2 + subhs \dividend, \dividend, \divisor, lsr #2 + cmp \dividend, \divisor, lsr #3 + subhs \dividend, \dividend, \divisor, lsr #3 + cmp \dividend, #1 + mov \divisor, \divisor, lsr #4 + subges \order, \order, #4 + bge 1b + + tst \order, #3 + teqne \dividend, #0 + beq 5f + + @ Either 1, 2 or 3 comparison/substractions are left. +2: cmn \order, #2 + blt 4f + beq 3f + cmp \dividend, \divisor + subhs \dividend, \dividend, \divisor + mov \divisor, \divisor, lsr #1 +3: cmp \dividend, \divisor + subhs \dividend, \dividend, \divisor + mov \divisor, \divisor, lsr #1 +4: cmp \dividend, \divisor + subhs \dividend, \dividend, \divisor +5: +.endm + + +ENTRY(__udivsi3) + + subs r2, r1, #1 + moveq pc, lr + bcc Ldiv0 + cmp r0, r1 + bls 11f + tst r1, r2 + beq 12f + + ARM_DIV_BODY r0, r1, r2, r3 + + mov r0, r2 + mov pc, lr + +11: moveq r0, #1 + movne r0, #0 + mov pc, lr + +12: ARM_DIV2_ORDER r1, r2 + + mov r0, r0, lsr r2 + mov pc, lr + + +ENTRY(__umodsi3) + + subs r2, r1, #1 @ compare divisor with 1 + bcc Ldiv0 + cmpne r0, r1 @ compare dividend with divisor + moveq r0, #0 + tsthi r1, r2 @ see if divisor is power of 2 + andeq r0, r0, r2 + movls pc, lr + + ARM_MOD_BODY r0, r1, r2, r3 + + mov pc, lr + ENTRY(__divsi3) - eor ip, dividend, divisor @ Save the sign of the result. - mov curbit, #1 - mov result, #0 - cmp divisor, #0 - rsbmi divisor, divisor, #0 @ Loops below use unsigned. + + cmp r1, #0 + eor ip, r0, r1 @ save the sign of the result. beq Ldiv0 - cmp dividend, #0 - rsbmi dividend, dividend, #0 - cmp dividend, divisor - bcc Lgot_result_divsi3 + rsbmi r1, r1, #0 @ loops below use unsigned. + subs r2, r1, #1 @ division by 1 or -1 ? + beq 10f + movs r3, r0 + rsbmi r3, r0, #0 @ positive dividend value + cmp r3, r1 + bls 11f + tst r1, r2 @ divisor is power of 2 ? + beq 12f -1: - @ Unless the divisor is very big, shift it up in multiples of - @ four bits, since this is the amount of unwinding in the main - @ division loop. Continue shifting until the divisor is - @ larger than the dividend. - cmp divisor, #0x10000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #4 - movcc curbit, curbit, lsl #4 - bcc 1b + ARM_DIV_BODY r3, r1, r0, r2 -2: - @ For very big divisors, we must shift it a bit at a time, or - @ we will be in danger of overflowing. - cmp divisor, #0x80000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #1 - movcc curbit, curbit, lsl #1 - bcc 2b - -3: - @ Test for possible subtractions, and note which bits - @ are done in the result. On the final pass, this may subtract - @ too much from the dividend, but the result will be ok, since the - @ "bit" will have been shifted out at the bottom. - cmp dividend, divisor - subcs dividend, dividend, divisor - orrcs result, result, curbit - cmp dividend, divisor, lsr #1 - subcs dividend, dividend, divisor, lsr #1 - orrcs result, result, curbit, lsr #1 - cmp dividend, divisor, lsr #2 - subcs dividend, dividend, divisor, lsr #2 - orrcs result, result, curbit, lsr #2 - cmp dividend, divisor, lsr #3 - subcs dividend, dividend, divisor, lsr #3 - orrcs result, result, curbit, lsr #3 - cmp dividend, #0 @ Early termination? - movnes curbit, curbit, lsr #4 @ No, any more bits to do? - movne divisor, divisor, lsr #4 - bne 3b -Lgot_result_divsi3: - mov r0, result cmp ip, #0 rsbmi r0, r0, #0 - RET pc, lr + mov pc, lr + +10: teq ip, r0 @ same sign ? + rsbmi r0, r0, #0 + mov pc, lr + +11: movlo r0, #0 + moveq r0, ip, asr #31 + orreq r0, r0, #1 + mov pc, lr + +12: ARM_DIV2_ORDER r1, r2 + + cmp ip, #0 + mov r0, r3, lsr r2 + rsbmi r0, r0, #0 + mov pc, lr + ENTRY(__modsi3) - mov curbit, #1 - cmp divisor, #0 - rsbmi divisor, divisor, #0 @ Loops below use unsigned. + + cmp r1, #0 beq Ldiv0 - @ Need to save the sign of the dividend, unfortunately, we need - @ ip later on; this is faster than pushing lr and using that. - str dividend, [sp, #-4]! - cmp dividend, #0 - rsbmi dividend, dividend, #0 - cmp dividend, divisor - bcc Lgot_result_modsi3 + rsbmi r1, r1, #0 @ loops below use unsigned. + movs ip, r0 @ preserve sign of dividend + rsbmi r0, r0, #0 @ if negative make positive + subs r2, r1, #1 @ compare divisor with 1 + cmpne r0, r1 @ compare dividend with divisor + moveq r0, #0 + tsthi r1, r2 @ see if divisor is power of 2 + andeq r0, r0, r2 + bls 10f + + ARM_MOD_BODY r0, r1, r2, r3 + +10: cmp ip, #0 + rsbmi r0, r0, #0 + mov pc, lr + + +Ldiv0: + + str lr, [sp, #-4]! + bl __div0 + mov r0, #0 @ About as wrong as it could be. + ldr pc, [sp], #4 -1: - @ Unless the divisor is very big, shift it up in multiples of - @ four bits, since this is the amount of unwinding in the main - @ division loop. Continue shifting until the divisor is - @ larger than the dividend. - cmp divisor, #0x10000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #4 - movcc curbit, curbit, lsl #4 - bcc 1b -2: - @ For very big divisors, we must shift it a bit at a time, or - @ we will be in danger of overflowing. - cmp divisor, #0x80000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #1 - movcc curbit, curbit, lsl #1 - bcc 2b - -3: - @ Test for possible subtractions. On the final pass, this may - @ subtract too much from the dividend, so keep track of which - @ subtractions are done, we can fix them up afterwards... - mov overdone, #0 - cmp dividend, divisor - subcs dividend, dividend, divisor - cmp dividend, divisor, lsr #1 - subcs dividend, dividend, divisor, lsr #1 - orrcs overdone, overdone, curbit, ror #1 - cmp dividend, divisor, lsr #2 - subcs dividend, dividend, divisor, lsr #2 - orrcs overdone, overdone, curbit, ror #2 - cmp dividend, divisor, lsr #3 - subcs dividend, dividend, divisor, lsr #3 - orrcs overdone, overdone, curbit, ror #3 - mov ip, curbit - cmp dividend, #0 @ Early termination? - movnes curbit, curbit, lsr #4 @ No, any more bits to do? - movne divisor, divisor, lsr #4 - bne 3b - - @ Any subtractions that we should not have done will be recorded in - @ the top three bits of "overdone". Exactly which were not needed - @ are governed by the position of the bit, stored in ip. - @ If we terminated early, because dividend became zero, - @ then none of the below will match, since the bit in ip will not be - @ in the bottom nibble. - ands overdone, overdone, #0xe0000000 - beq Lgot_result_modsi3 - tst overdone, ip, ror #3 - addne dividend, dividend, divisor, lsr #3 - tst overdone, ip, ror #2 - addne dividend, dividend, divisor, lsr #2 - tst overdone, ip, ror #1 - addne dividend, dividend, divisor, lsr #1 -Lgot_result_modsi3: - ldr ip, [sp], #4 - cmp ip, #0 - rsbmi dividend, dividend, #0 - RET pc, lr diff -Nru a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig --- a/arch/arm/mach-integrator/Kconfig Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-integrator/Kconfig Wed Oct 8 12:24:57 2003 @@ -1,8 +1,15 @@ menu "Integrator Options" depends on ARCH_INTEGRATOR +config ARCH_INTEGRATOR_AP + bool "Support Integrator/AP and Integrator/PP2 platforms" + help + Include support for the ARM(R) Integrator/AP and + Integrator/PP2 platforms. + config INTEGRATOR_IMPD1 tristate "Include support for Integrator/IM-PD1" + depends on ARCH_INTEGRATOR_AP help The IM-PD1 is an add-on logic module for the Integrator which allows ARM(R) Ltd PrimeCells to be developed and evaluated. diff -Nru a/arch/arm/mach-integrator/Makefile b/arch/arm/mach-integrator/Makefile --- a/arch/arm/mach-integrator/Makefile Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-integrator/Makefile Wed Oct 8 12:24:57 2003 @@ -4,9 +4,10 @@ # Object file lists. -obj-y := core.o lm.o time.o +obj-y := core.o lm.o time.o +obj-$(CONFIG_ARCH_INTEGRATOR_AP) += integrator_ap.o -obj-$(CONFIG_LEDS) += leds.o -obj-$(CONFIG_PCI) += pci_v3.o pci.o +obj-$(CONFIG_LEDS) += leds.o +obj-$(CONFIG_PCI) += pci_v3.o pci.o obj-$(CONFIG_CPU_FREQ_INTEGRATOR) += cpu.o obj-$(CONFIG_INTEGRATOR_IMPD1) += impd1.o diff -Nru a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c --- a/arch/arm/mach-integrator/core.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-integrator/core.c Wed Oct 8 12:24:57 2003 @@ -1,134 +1,59 @@ /* - * linux/arch/arm/mach-integrator/arch.c + * linux/arch/arm/mach-integrator/core.c * - * Copyright (C) 2000 Deep Blue Solutions Ltd + * Copyright (C) 2000-2003 Deep Blue Solutions Ltd * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. */ #include #include #include -#include #include -#include -#include #include -#include #include -#include -#include #include -#include - -#include -#include -#include -#include - -/* - * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx - * is the (PA >> 12). - * - * Setup a VA for the Integrator interrupt controller (for header #0, - * just for now). - */ -#define VA_IC_BASE IO_ADDRESS(INTEGRATOR_IC_BASE) -#define VA_SC_BASE IO_ADDRESS(INTEGRATOR_SC_BASE) -#define VA_CMIC_BASE IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_IC_OFFSET - -/* - * Logical Physical - * e8000000 40000000 PCI memory PHYS_PCI_MEM_BASE (max 512M) - * ec000000 61000000 PCI config space PHYS_PCI_CONFIG_BASE (max 16M) - * ed000000 62000000 PCI V3 regs PHYS_PCI_V3_BASE (max 64k) - * ee000000 60000000 PCI IO PHYS_PCI_IO_BASE (max 16M) - * ef000000 Cache flush - * f1000000 10000000 Core module registers - * f1100000 11000000 System controller registers - * f1200000 12000000 EBI registers - * f1300000 13000000 Counter/Timer - * f1400000 14000000 Interrupt controller - * f1500000 15000000 RTC - * f1600000 16000000 UART 0 - * f1700000 17000000 UART 1 - * f1a00000 1a000000 Debug LEDs - * f1b00000 1b000000 GPIO - */ - -static struct map_desc integrator_io_desc[] __initdata = { - { IO_ADDRESS(INTEGRATOR_HDR_BASE), INTEGRATOR_HDR_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_SC_BASE), INTEGRATOR_SC_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_EBI_BASE), INTEGRATOR_EBI_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_CT_BASE), INTEGRATOR_CT_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_IC_BASE), INTEGRATOR_IC_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_RTC_BASE), INTEGRATOR_RTC_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_UART0_BASE), INTEGRATOR_UART0_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_UART1_BASE), INTEGRATOR_UART1_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_DBG_BASE), INTEGRATOR_DBG_BASE, SZ_4K, MT_DEVICE }, - { IO_ADDRESS(INTEGRATOR_GPIO_BASE), INTEGRATOR_GPIO_BASE, SZ_4K, MT_DEVICE }, - { PCI_MEMORY_VADDR, PHYS_PCI_MEM_BASE, SZ_16M, MT_DEVICE }, - { PCI_CONFIG_VADDR, PHYS_PCI_CONFIG_BASE, SZ_16M, MT_DEVICE }, - { PCI_V3_VADDR, PHYS_PCI_V3_BASE, SZ_64K, MT_DEVICE }, - { PCI_IO_VADDR, PHYS_PCI_IO_BASE, SZ_64K, MT_DEVICE } +static struct amba_device rtc_device = { + .dev = { + .bus_id = "mb:15", + }, + .res = { + .start = INTEGRATOR_RTC_BASE, + .end = INTEGRATOR_RTC_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, + .irq = IRQ_RTCINT, + .periphid = 0x00041030, }; -static void __init integrator_map_io(void) -{ - iotable_init(integrator_io_desc, ARRAY_SIZE(integrator_io_desc)); -} - -#define ALLPCI ( (1 << IRQ_PCIINT0) | (1 << IRQ_PCIINT1) | (1 << IRQ_PCIINT2) | (1 << IRQ_PCIINT3) ) - -static void sc_mask_irq(unsigned int irq) -{ - writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_CLEAR); -} - -static void sc_unmask_irq(unsigned int irq) -{ - writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET); -} - -static struct irqchip sc_chip = { - .ack = sc_mask_irq, - .mask = sc_mask_irq, - .unmask = sc_unmask_irq, +static struct amba_device uart0_device = { + .dev = { + .bus_id = "mb:16", + }, + .res = { + .start = INTEGRATOR_UART0_BASE, + .end = INTEGRATOR_UART0_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, + .irq = IRQ_UARTINT0, + .periphid = 0x0041010, }; -static void __init integrator_init_irq(void) -{ - unsigned int i; - - /* Disable all interrupts initially. */ - /* Do the core module ones */ - writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR); - - /* do the header card stuff next */ - writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR); - writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR); - - for (i = 0; i < NR_IRQS; i++) { - if (((1 << i) && INTEGRATOR_SC_VALID_INT) != 0) { - set_irq_chip(i, &sc_chip); - set_irq_handler(i, do_level_IRQ); - set_irq_flags(i, IRQF_VALID | IRQF_PROBE); - } - } -} +static struct amba_device uart1_device = { + .dev = { + .bus_id = "mb:17", + }, + .res = { + .start = INTEGRATOR_UART1_BASE, + .end = INTEGRATOR_UART1_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, + .irq = IRQ_UARTINT1, + .periphid = 0x0041010, +}; static struct amba_device kmi0_device = { .dev = { @@ -136,7 +61,7 @@ }, .res = { .start = KMI0_BASE, - .end = KMI0_BASE + KMI_SIZE - 1, + .end = KMI0_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = IRQ_KMIINT0, @@ -149,7 +74,7 @@ }, .res = { .start = KMI1_BASE, - .end = KMI1_BASE + KMI_SIZE - 1, + .end = KMI1_BASE + SZ_4K - 1, .flags = IORESOURCE_MEM, }, .irq = IRQ_KMIINT1, @@ -157,52 +82,23 @@ }; static struct amba_device *amba_devs[] __initdata = { + &rtc_device, + &uart0_device, + &uart1_device, &kmi0_device, &kmi1_device, }; -static int __init register_devices(void) +static int __init integrator_init(void) { - unsigned long sc_dec; int i; for (i = 0; i < ARRAY_SIZE(amba_devs); i++) { struct amba_device *d = amba_devs[i]; - amba_device_register(d, &iomem_resource); } - sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET); - for (i = 0; i < 4; i++) { - struct lm_device *lmdev; - - if ((sc_dec & (16 << i)) == 0) - continue; - - lmdev = kmalloc(sizeof(struct lm_device), GFP_KERNEL); - if (!lmdev) - continue; - - memset(lmdev, 0, sizeof(struct lm_device)); - - lmdev->resource.start = 0xc0000000 + 0x10000000 * i; - lmdev->resource.end = lmdev->resource.start + 0x0fffffff; - lmdev->resource.flags = IORESOURCE_MEM; - lmdev->irq = IRQ_EXPINT0 + i; - lmdev->id = i; - - lm_device_register(lmdev); - } - return 0; } -arch_initcall(register_devices); - -MACHINE_START(INTEGRATOR, "ARM-Integrator") - MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd") - BOOT_MEM(0x00000000, 0x16000000, 0xf1600000) - BOOT_PARAMS(0x00000100) - MAPIO(integrator_map_io) - INITIRQ(integrator_init_irq) -MACHINE_END +arch_initcall(integrator_init); diff -Nru a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/arm/mach-integrator/integrator_ap.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,294 @@ +/* + * linux/arch/arm/mach-integrator/integrator_ap.c + * + * Copyright (C) 2000-2003 Deep Blue Solutions Ltd + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + + +/* + * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx + * is the (PA >> 12). + * + * Setup a VA for the Integrator interrupt controller (for header #0, + * just for now). + */ +#define VA_IC_BASE IO_ADDRESS(INTEGRATOR_IC_BASE) +#define VA_SC_BASE IO_ADDRESS(INTEGRATOR_SC_BASE) +#define VA_EBI_BASE IO_ADDRESS(INTEGRATOR_EBI_BASE) +#define VA_CMIC_BASE IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_IC_OFFSET + +/* + * Logical Physical + * e8000000 40000000 PCI memory PHYS_PCI_MEM_BASE (max 512M) + * ec000000 61000000 PCI config space PHYS_PCI_CONFIG_BASE (max 16M) + * ed000000 62000000 PCI V3 regs PHYS_PCI_V3_BASE (max 64k) + * ee000000 60000000 PCI IO PHYS_PCI_IO_BASE (max 16M) + * ef000000 Cache flush + * f1000000 10000000 Core module registers + * f1100000 11000000 System controller registers + * f1200000 12000000 EBI registers + * f1300000 13000000 Counter/Timer + * f1400000 14000000 Interrupt controller + * f1500000 15000000 RTC + * f1600000 16000000 UART 0 + * f1700000 17000000 UART 1 + * f1a00000 1a000000 Debug LEDs + * f1b00000 1b000000 GPIO + */ + +static struct map_desc ap_io_desc[] __initdata = { + { IO_ADDRESS(INTEGRATOR_HDR_BASE), INTEGRATOR_HDR_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_SC_BASE), INTEGRATOR_SC_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_EBI_BASE), INTEGRATOR_EBI_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_CT_BASE), INTEGRATOR_CT_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_IC_BASE), INTEGRATOR_IC_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_RTC_BASE), INTEGRATOR_RTC_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_UART0_BASE), INTEGRATOR_UART0_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_UART1_BASE), INTEGRATOR_UART1_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_DBG_BASE), INTEGRATOR_DBG_BASE, SZ_4K, MT_DEVICE }, + { IO_ADDRESS(INTEGRATOR_GPIO_BASE), INTEGRATOR_GPIO_BASE, SZ_4K, MT_DEVICE }, + { PCI_MEMORY_VADDR, PHYS_PCI_MEM_BASE, SZ_16M, MT_DEVICE }, + { PCI_CONFIG_VADDR, PHYS_PCI_CONFIG_BASE, SZ_16M, MT_DEVICE }, + { PCI_V3_VADDR, PHYS_PCI_V3_BASE, SZ_64K, MT_DEVICE }, + { PCI_IO_VADDR, PHYS_PCI_IO_BASE, SZ_64K, MT_DEVICE } +}; + +static void __init ap_map_io(void) +{ + iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc)); +} + +#define INTEGRATOR_SC_VALID_INT 0x003fffff + +static void sc_mask_irq(unsigned int irq) +{ + writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_CLEAR); +} + +static void sc_unmask_irq(unsigned int irq) +{ + writel(1 << irq, VA_IC_BASE + IRQ_ENABLE_SET); +} + +static struct irqchip sc_chip = { + .ack = sc_mask_irq, + .mask = sc_mask_irq, + .unmask = sc_unmask_irq, +}; + +static void __init ap_init_irq(void) +{ + unsigned int i; + + /* Disable all interrupts initially. */ + /* Do the core module ones */ + writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR); + + /* do the header card stuff next */ + writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR); + writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR); + + for (i = 0; i < NR_IRQS; i++) { + if (((1 << i) && INTEGRATOR_SC_VALID_INT) != 0) { + set_irq_chip(i, &sc_chip); + set_irq_handler(i, do_level_IRQ); + set_irq_flags(i, IRQF_VALID | IRQF_PROBE); + } + } +} + +#ifdef CONFIG_PM +static unsigned long ic_irq_enable; + +static int irq_suspend(struct sys_device *dev, u32 state) +{ + ic_irq_enable = readl(VA_IC_BASE + IRQ_ENABLE); + return 0; +} + +static int irq_resume(struct sys_device *dev) +{ + /* disable all irq sources */ + writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR); + writel(-1, VA_IC_BASE + IRQ_ENABLE_CLEAR); + writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR); + + writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET); + return 0; +} +#else +#define irq_suspend NULL +#define irq_resume NULL +#endif + +static struct sysdev_class irq_class = { + set_kset_name("irq"), + .suspend = irq_suspend, + .resume = irq_resume, +}; + +static struct sys_device irq_device = { + .id = 0, + .cls = &irq_class, +}; + +static int __init irq_init_sysfs(void) +{ + int ret = sysdev_class_register(&irq_class); + if (ret == 0) + ret = sys_device_register(&irq_device); + return ret; +} + +device_initcall(irq_init_sysfs); + +/* + * Flash handling. + */ +#define SC_CTRLC (VA_SC_BASE + INTEGRATOR_SC_CTRLC_OFFSET) +#define SC_CTRLS (VA_SC_BASE + INTEGRATOR_SC_CTRLS_OFFSET) +#define EBI_CSR1 (VA_EBI_BASE + INTEGRATOR_EBI_CSR1_OFFSET) +#define EBI_LOCK (VA_EBI_BASE + INTEGRATOR_EBI_LOCK_OFFSET) + +static int ap_flash_init(void) +{ + u32 tmp; + + writel(INTEGRATOR_SC_CTRL_nFLVPPEN | INTEGRATOR_SC_CTRL_nFLWP, SC_CTRLC); + + tmp = readl(EBI_CSR1) | INTEGRATOR_EBI_WRITE_ENABLE; + writel(tmp, EBI_CSR1); + + if (!(readl(EBI_CSR1) & INTEGRATOR_EBI_WRITE_ENABLE)) { + writel(0xa05f, EBI_LOCK); + writel(tmp, EBI_CSR1); + writel(0, EBI_LOCK); + } + return 0; +} + +static void ap_flash_exit(void) +{ + u32 tmp; + + writel(INTEGRATOR_SC_CTRL_nFLVPPEN | INTEGRATOR_SC_CTRL_nFLWP, SC_CTRLC); + + tmp = readl(EBI_CSR1) & ~INTEGRATOR_EBI_WRITE_ENABLE; + writel(tmp, EBI_CSR1); + + if (readl(EBI_CSR1) & INTEGRATOR_EBI_WRITE_ENABLE) { + writel(0xa05f, EBI_LOCK); + writel(tmp, EBI_CSR1); + writel(0, EBI_LOCK); + } +} + +static void ap_flash_set_vpp(int on) +{ + unsigned long reg = on ? SC_CTRLS : SC_CTRLC; + + writel(INTEGRATOR_SC_CTRL_nFLVPPEN, reg); +} + +static struct flash_platform_data ap_flash_data = { + .map_name = "cfi_probe", + .width = 4, + .init = ap_flash_init, + .exit = ap_flash_exit, + .set_vpp = ap_flash_set_vpp, +}; + +static struct resource cfi_flash_resource = { + .start = INTEGRATOR_FLASH_BASE, + .end = INTEGRATOR_FLASH_BASE + INTEGRATOR_FLASH_SIZE - 1, + .flags = IORESOURCE_MEM, +}; + +static struct platform_device cfi_flash_device = { + .name = "armflash", + .id = 0, + .dev = { + .platform_data = &ap_flash_data, + }, + .num_resources = 1, + .resource = &cfi_flash_resource, +}; + +static int __init ap_init(void) +{ + unsigned long sc_dec; + int i; + + platform_add_device(&cfi_flash_device); + + sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET); + for (i = 0; i < 4; i++) { + struct lm_device *lmdev; + + if ((sc_dec & (16 << i)) == 0) + continue; + + lmdev = kmalloc(sizeof(struct lm_device), GFP_KERNEL); + if (!lmdev) + continue; + + memset(lmdev, 0, sizeof(struct lm_device)); + + lmdev->resource.start = 0xc0000000 + 0x10000000 * i; + lmdev->resource.end = lmdev->resource.start + 0x0fffffff; + lmdev->resource.flags = IORESOURCE_MEM; + lmdev->irq = IRQ_AP_EXPINT0 + i; + lmdev->id = i; + + lm_device_register(lmdev); + } + + return 0; +} + +arch_initcall(ap_init); + +MACHINE_START(INTEGRATOR, "ARM-Integrator") + MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd") + BOOT_MEM(0x00000000, 0x16000000, 0xf1600000) + BOOT_PARAMS(0x00000100) + MAPIO(ap_map_io) + INITIRQ(ap_init_irq) +MACHINE_END diff -Nru a/arch/arm/mach-integrator/pci.c b/arch/arm/mach-integrator/pci.c --- a/arch/arm/mach-integrator/pci.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-integrator/pci.c Wed Oct 8 12:24:57 2003 @@ -96,7 +96,7 @@ } static int irq_tab[4] __initdata = { - IRQ_PCIINT0, IRQ_PCIINT1, IRQ_PCIINT2, IRQ_PCIINT3 + IRQ_AP_PCIINT0, IRQ_AP_PCIINT1, IRQ_AP_PCIINT2, IRQ_AP_PCIINT3 }; /* diff -Nru a/arch/arm/mach-integrator/pci_v3.c b/arch/arm/mach-integrator/pci_v3.c --- a/arch/arm/mach-integrator/pci_v3.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-integrator/pci_v3.c Wed Oct 8 12:24:57 2003 @@ -575,7 +575,7 @@ /* * Grab the PCI error interrupt. */ - ret = request_irq(IRQ_V3INT, v3_irq, 0, "V3", NULL); + ret = request_irq(IRQ_AP_V3INT, v3_irq, 0, "V3", NULL); if (ret) printk(KERN_ERR "PCI: unable to grab PCI error " "interrupt: %d\n", ret); @@ -596,7 +596,7 @@ v3_writeb(V3_LB_IMASK, 0x68); #if 0 - ret = request_irq(IRQ_LBUSTIMEOUT, lb_timeout, 0, "bus timeout", NULL); + ret = request_irq(IRQ_AP_LBUSTIMEOUT, lb_timeout, 0, "bus timeout", NULL); if (ret) printk(KERN_ERR "PCI: unable to grab local bus timeout " "interrupt: %d\n", ret); diff -Nru a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c --- a/arch/arm/mach-pxa/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-pxa/irq.c Wed Oct 8 12:24:57 2003 @@ -58,7 +58,19 @@ { int gpio, idx; - gpio = irq - ((irq >= IRQ_GPIO(2)) ? IRQ_GPIO(2) + 2 : IRQ_GPIO(0)); + gpio = IRQ_TO_GPIO(irq); + idx = gpio >> 5; + + if (type == IRQT_PROBE) { + /* Don't mess with enabled GPIOs using preconfigured edges or + GPIOs set to alternate function during probe */ + if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx]) & + GPIO_bit(gpio)) + return 0; + if (GAFR(gpio) & (0x3 << (((gpio) & 0xf)*2))) + return 0; + type = __IRQT_RISEDGE | __IRQT_FALEDGE; + } printk(KERN_DEBUG "IRQ%d (GPIO%d): ", irq, gpio); @@ -78,10 +90,8 @@ printk("edges\n"); - idx = gpio >> 5; GRER(gpio) = GPIO_IRQ_rising_edge[idx] & GPIO_IRQ_mask[idx]; GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx]; - return 0; } diff -Nru a/arch/arm/mach-pxa/leds.c b/arch/arm/mach-pxa/leds.c --- a/arch/arm/mach-pxa/leds.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-pxa/leds.c Wed Oct 8 12:24:57 2003 @@ -7,6 +7,7 @@ * * Copyright (c) 2001 Jeff Sutherland, Accelent Systems Inc. */ +#include #include #include diff -Nru a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c --- a/arch/arm/mach-pxa/lubbock.c Wed Oct 8 12:24:56 2003 +++ b/arch/arm/mach-pxa/lubbock.c Wed Oct 8 12:24:56 2003 @@ -78,7 +78,7 @@ pxa_init_irq(); /* setup extra lubbock irqs */ - for (irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_IRQ(5); irq++) { + for (irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_LAST_IRQ; irq++) { set_irq_chip(irq, &lubbock_irq_chip); set_irq_handler(irq, do_level_IRQ); set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); @@ -124,6 +124,7 @@ { 0xf0000000, 0x08000000, 0x00100000, MT_DEVICE }, /* CPLD */ { 0xf1000000, 0x0c000000, 0x00100000, MT_DEVICE }, /* LAN91C96 IO */ { 0xf1100000, 0x0e000000, 0x00100000, MT_DEVICE }, /* LAN91C96 Attr */ + { 0xf4000000, 0x10000000, 0x00800000, MT_DEVICE }, /* SA1111 */ }; static void __init lubbock_map_io(void) diff -Nru a/arch/arm/mach-pxa/pm.c b/arch/arm/mach-pxa/pm.c --- a/arch/arm/mach-pxa/pm.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mach-pxa/pm.c Wed Oct 8 12:24:57 2003 @@ -11,13 +11,14 @@ * modify it under the terms of the GNU General Public License. */ #include +#include +#include #include #include #include #include #include -#include /* @@ -60,13 +61,16 @@ }; -int pm_do_suspend(void) +static int pxa_pm_enter(u32 state) { unsigned long sleep_save[SLEEP_SAVE_SIZE]; unsigned long checksum = 0; unsigned long delta; int i; + if (state != PM_SUSPEND_MEM) + return -EINVAL; + /* preserve current time */ delta = xtime.tv_sec - RCNR; @@ -194,3 +198,37 @@ { return virt_to_phys(sp); } + +/* + * Called after processes are frozen, but before we shut down devices. + */ +static int pxa_pm_prepare(u32 state) +{ + return 0; +} + +/* + * Called after devices are re-setup, but before processes are thawed. + */ +static int pxa_pm_finish(u32 state) +{ + return 0; +} + +/* + * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk. + */ +static struct pm_ops pxa_pm_ops = { + .pm_disk_mode = PM_DISK_FIRMWARE, + .prepare = pxa_pm_prepare, + .enter = pxa_pm_enter, + .finish = pxa_pm_finish, +}; + +static int __init pxa_pm_init(void) +{ + pm_set_ops(&pxa_pm_ops); + return 0; +} + +late_initcall(pxa_pm_init); diff -Nru a/arch/arm/mach-sa1100/leds.c b/arch/arm/mach-sa1100/leds.c --- a/arch/arm/mach-sa1100/leds.c Wed Oct 8 12:24:56 2003 +++ b/arch/arm/mach-sa1100/leds.c Wed Oct 8 12:24:56 2003 @@ -5,6 +5,7 @@ * * Copyright (C) 2001 Nicolas Pitre */ +#include #include #include diff -Nru a/arch/arm/mach-sa1100/pm.c b/arch/arm/mach-sa1100/pm.c --- a/arch/arm/mach-sa1100/pm.c Wed Oct 8 12:24:56 2003 +++ b/arch/arm/mach-sa1100/pm.c Wed Oct 8 12:24:56 2003 @@ -22,6 +22,8 @@ * 2002-05-27: Nicolas Pitre Killed sleep.h and the kmalloced save array. * Storage is local on the stack now. */ +#include +#include #include #include @@ -54,11 +56,14 @@ }; -int pm_do_suspend(void) +static int sa11x0_pm_enter(u32 state) { unsigned long sleep_save[SLEEP_SAVE_SIZE]; unsigned long delta, gpio; + if (state != PM_SUSPEND_MEM) + return -EINVAL; + /* preserve current time */ delta = xtime.tv_sec - RCNR; gpio = GPLR; @@ -139,3 +144,37 @@ { return virt_to_phys(sp); } + +/* + * Called after processes are frozen, but before we shut down devices. + */ +static int sa11x0_pm_prepare(u32 state) +{ + return 0; +} + +/* + * Called after devices are re-setup, but before processes are thawed. + */ +static int sa11x0_pm_finish(u32 state) +{ + return 0; +} + +/* + * Set to PM_DISK_FIRMWARE so we can quickly veto suspend-to-disk. + */ +static struct pm_ops sa11x0_pm_ops = { + .pm_disk_mode = PM_DISK_FIRMWARE, + .prepare = sa11x0_pm_prepare, + .enter = sa11x0_pm_enter, + .finish = sa11x0_pm_finish, +}; + +static int __init sa11x0_pm_init(void) +{ + pm_set_ops(&sa11x0_pm_ops); + return 0; +} + +late_initcall(sa11x0_pm_init); diff -Nru a/arch/arm/mm/discontig.c b/arch/arm/mm/discontig.c --- a/arch/arm/mm/discontig.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mm/discontig.c Wed Oct 8 12:24:57 2003 @@ -15,7 +15,7 @@ #include #include -#if NR_NODES != 4 +#if MAX_NUMNODES != 4 #error Fix Me Please #endif @@ -23,9 +23,9 @@ * Our node_data structure for discontiguous memory. */ -static bootmem_data_t node_bootmem_data[NR_NODES]; +static bootmem_data_t node_bootmem_data[MAX_NUMNODES]; -pg_data_t discontig_node_data[NR_NODES] = { +pg_data_t discontig_node_data[MAX_NUMNODES] = { { .bdata = &node_bootmem_data[0] }, { .bdata = &node_bootmem_data[1] }, { .bdata = &node_bootmem_data[2] }, diff -Nru a/arch/arm/mm/init.c b/arch/arm/mm/init.c --- a/arch/arm/mm/init.c Wed Oct 8 12:24:55 2003 +++ b/arch/arm/mm/init.c Wed Oct 8 12:24:55 2003 @@ -33,12 +33,6 @@ #include #include -#ifndef CONFIG_DISCONTIGMEM -#define NR_NODES 1 -#else -#define NR_NODES 4 -#endif - #ifdef CONFIG_CPU_32 #define TABLE_OFFSET (PTRS_PER_PTE) #else @@ -178,7 +172,7 @@ { unsigned int i, bootmem_pages = 0, memend_pfn = 0; - for (i = 0; i < NR_NODES; i++) { + for (i = 0; i < MAX_NUMNODES; i++) { np[i].start = -1U; np[i].end = 0; np[i].bootmap_pages = 0; @@ -207,7 +201,7 @@ * we have, we're in trouble. (maybe we ought to * limit, instead of bugging?) */ - if (numnodes > NR_NODES) + if (numnodes > MAX_NUMNODES) BUG(); } @@ -365,7 +359,7 @@ */ void __init bootmem_init(struct meminfo *mi) { - struct node_info node_info[NR_NODES], *np = node_info; + struct node_info node_info[MAX_NUMNODES], *np = node_info; unsigned int bootmap_pages, bootmap_pfn, map_pg; int node, initrd_node; diff -Nru a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c --- a/arch/arm/mm/ioremap.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm/mm/ioremap.c Wed Oct 8 12:24:57 2003 @@ -150,7 +150,7 @@ if (!area) return NULL; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vfree(addr); return NULL; } diff -Nru a/arch/arm26/kernel/init_task.c b/arch/arm26/kernel/init_task.c --- a/arch/arm26/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/arm26/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -5,6 +5,7 @@ * */ #include +#include #include #include #include @@ -19,6 +20,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -39,3 +42,5 @@ * All other task structs will be allocated on slabs in fork.c */ struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_task); diff -Nru a/arch/arm26/kernel/irq.c b/arch/arm26/kernel/irq.c --- a/arch/arm26/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm26/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -19,6 +19,7 @@ * Naturally it's not a 1:1 relation, but there are similarities. */ #include +#include #include #include #include @@ -560,6 +561,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + /** * free_irq - free an interrupt * @irq: Interrupt line to free @@ -603,6 +606,8 @@ spin_unlock_irqrestore(&irq_controller_lock, flags); } +EXPORT_SYMBOL(free_irq); + /* Start the interrupt probing. Unlike other architectures, * we don't return a mask of interrupts from probe_irq_on, * but return the number of interrupts enabled for the probe. @@ -653,6 +658,8 @@ return irqs; } +EXPORT_SYMBOL(probe_irq_on); + /* * Possible return values: * >= 0 - interrupt number @@ -686,6 +693,8 @@ return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); void __init init_irq_proc(void) { diff -Nru a/arch/arm26/kernel/process.c b/arch/arm26/kernel/process.c --- a/arch/arm26/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm26/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -42,11 +43,15 @@ hlt_counter++; } +EXPORT_SYMBOL(disable_hlt); + void enable_hlt(void) { hlt_counter--; } +EXPORT_SYMBOL(enable_hlt); + static int __init nohlt_setup(char *__unused) { hlt_counter = 1; @@ -115,6 +120,8 @@ leds_event(led_halted); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { leds_event(led_halted); @@ -122,6 +129,8 @@ pm_power_off(); } +EXPORT_SYMBOL(machine_power_off); + void machine_restart(char * __unused) { /* @@ -151,6 +160,8 @@ printk("Reboot failed -- System halted\n"); while (1); } + +EXPORT_SYMBOL(machine_restart); void show_regs(struct pt_regs * regs) { diff -Nru a/arch/arm26/kernel/time.c b/arch/arm26/kernel/time.c --- a/arch/arm26/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm26/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -36,6 +36,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + extern unsigned long wall_jiffies; /* this needs a better home */ @@ -148,6 +150,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) @@ -177,6 +181,8 @@ write_sequnlock_irq(&xtime_lock); return 0; } + +EXPORT_SYMBOL(do_settimeofday); static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) { diff -Nru a/arch/arm26/kernel/traps.c b/arch/arm26/kernel/traps.c --- a/arch/arm26/kernel/traps.c Wed Oct 8 12:24:57 2003 +++ b/arch/arm26/kernel/traps.c Wed Oct 8 12:24:57 2003 @@ -134,6 +134,8 @@ dump_mem("Stack: ", sp, 8192+(unsigned long)tsk->thread_info); } +EXPORT_SYMBOL(dump_stack); + void dump_stack(void) { #ifdef CONFIG_DEBUG_ERRORS diff -Nru a/arch/cris/arch-v10/lib/old_checksum.c b/arch/cris/arch-v10/lib/old_checksum.c --- a/arch/cris/arch-v10/lib/old_checksum.c Wed Oct 8 12:24:57 2003 +++ b/arch/cris/arch-v10/lib/old_checksum.c Wed Oct 8 12:24:57 2003 @@ -19,6 +19,7 @@ */ #include +#include #undef PROFILE_CHECKSUM @@ -80,3 +81,5 @@ BITOFF; return(sum); } + +EXPORT_SYMBOL(csum_partial); diff -Nru a/arch/cris/kernel/irq.c b/arch/cris/kernel/irq.c --- a/arch/cris/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/cris/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -22,6 +22,7 @@ */ #include +#include #include #include @@ -70,12 +71,16 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off(unsigned long x) { return 0; } +EXPORT_SYMBOL(probe_irq_off); + /* * Initial irq handlers. */ @@ -253,6 +258,8 @@ kfree(action); return retval; } + +EXPORT_SYMBOL(request_irq); void free_irq(unsigned int irq, void *dev_id) { @@ -281,6 +288,8 @@ } printk("Trying to free free IRQ%d\n",irq); } + +EXPORT_SYMBOL(free_irq); void weird_irq(void) { diff -Nru a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c --- a/arch/cris/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/cris/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -96,6 +96,7 @@ #include #include #include +#include #include #include #include @@ -119,6 +120,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -137,7 +140,7 @@ */ struct task_struct init_task = INIT_TASK(init_task); - +EXPORT_SYMBOL(init_task); /* * The hlt_counter, disable_hlt and enable_hlt is just here as a hook if @@ -155,10 +158,14 @@ hlt_counter++; } +EXPORT_SYMBOL(disable_hlt); + void enable_hlt(void) { hlt_counter--; } + +EXPORT_SYMBOL(enable_hlt); /* * The following aren't currently used. @@ -193,6 +200,8 @@ hard_reset_now(); } +EXPORT_SYMBOL(machine_restart); + /* * Similar to machine_power_off, but don't shut off power. Add code * here to freeze the system for e.g. post-mortem debug purpose when @@ -203,11 +212,15 @@ { } +EXPORT_SYMBOL(machine_halt); + /* If or when software power-off is implemented, add code here. */ void machine_power_off(void) { } + +EXPORT_SYMBOL(machine_power_off); /* * When a process does an "exec", machine state like FPU and debug diff -Nru a/arch/cris/kernel/time.c b/arch/cris/kernel/time.c --- a/arch/cris/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/cris/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -31,6 +32,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + int have_rtc; /* used to remember if we have an RTC or not */; #define TICK_SIZE tick @@ -72,6 +75,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { unsigned long flags; @@ -105,6 +110,8 @@ local_irq_restore(flags); return 0; } + +EXPORT_SYMBOL(do_settimeofday); /* diff -Nru a/arch/cris/kernel/traps.c b/arch/cris/kernel/traps.c --- a/arch/cris/kernel/traps.c Wed Oct 8 12:24:57 2003 +++ b/arch/cris/kernel/traps.c Wed Oct 8 12:24:57 2003 @@ -142,6 +142,8 @@ show_stack(NULL, NULL); } +EXPORT_SYMBOL(dump_stack); + void __init trap_init(void) { diff -Nru a/arch/cris/mm/ioremap.c b/arch/cris/mm/ioremap.c --- a/arch/cris/mm/ioremap.c Wed Oct 8 12:24:55 2003 +++ b/arch/cris/mm/ioremap.c Wed Oct 8 12:24:55 2003 @@ -157,7 +157,7 @@ if (!area) return NULL; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vfree(addr); return NULL; } diff -Nru a/arch/h8300/README b/arch/h8300/README --- a/arch/h8300/README Wed Oct 8 12:24:57 2003 +++ b/arch/h8300/README Wed Oct 8 12:24:57 2003 @@ -16,7 +16,7 @@ 3.H8MAX Under development - see http://www.strawbelly-linux.com (Japanese Only) + see http://www.strawberry-linux.com (Japanese Only) * Toolchain Version gcc-3.1 or higher and patch diff -Nru a/arch/h8300/kernel/init_task.c b/arch/h8300/kernel/init_task.c --- a/arch/h8300/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/h8300/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -2,6 +2,7 @@ * linux/arch/h8300/kernel/init_task.c */ #include +#include #include #include #include @@ -16,6 +17,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial task structure. * @@ -24,6 +27,7 @@ __asm__(".align 4"); struct task_struct init_task = INIT_TASK(init_task); +EXPORT_SYMBOL(init_task); /* * Initial thread structure. diff -Nru a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c --- a/arch/h8300/kernel/process.c Wed Oct 8 12:24:55 2003 +++ b/arch/h8300/kernel/process.c Wed Oct 8 12:24:55 2003 @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -89,6 +90,8 @@ __asm__("jmp @@0"); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { local_irq_disable(); @@ -96,12 +99,16 @@ for (;;); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { local_irq_disable(); __asm__("sleep"); for (;;); } + +EXPORT_SYMBOL(machine_power_off); void show_regs(struct pt_regs * regs) { diff -Nru a/arch/h8300/kernel/time.c b/arch/h8300/kernel/time.c --- a/arch/h8300/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/h8300/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -18,6 +18,7 @@ #include /* CONFIG_HEARTBEAT */ #include +#include #include #include #include @@ -33,6 +34,8 @@ u64 jiffies_64; +EXPORT_SYMBOL(jiffies_64); + static inline void do_profile (unsigned long pc) { if (prof_buffer && current->pid) { @@ -110,6 +113,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) @@ -136,3 +141,5 @@ write_sequnlock_irq(&xtime_lock); return 0; } + +EXPORT_SYMBOL(do_settimeofday); diff -Nru a/arch/h8300/lib/checksum.c b/arch/h8300/lib/checksum.c --- a/arch/h8300/lib/checksum.c Wed Oct 8 12:24:55 2003 +++ b/arch/h8300/lib/checksum.c Wed Oct 8 12:24:55 2003 @@ -32,6 +32,7 @@ of the assembly has to go. */ #include +#include static inline unsigned short from32to16(unsigned long x) { @@ -122,6 +123,8 @@ result = (result & 0xffff) + (result >> 16); return result; } + +EXPORT_SYMBOL(csum_partial); /* * this routine is used for miscellaneous IP-like checksums, mainly diff -Nru a/arch/h8300/platform/h8300h/ints.c b/arch/h8300/platform/h8300h/ints.c --- a/arch/h8300/platform/h8300h/ints.c Wed Oct 8 12:24:56 2003 +++ b/arch/h8300/platform/h8300h/ints.c Wed Oct 8 12:24:56 2003 @@ -13,6 +13,7 @@ * Copyright 1999 D. Jeff Dionne */ +#include #include #include #include @@ -155,6 +156,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { if (irq >= NR_IRQS) { @@ -171,6 +174,8 @@ } } +EXPORT_SYMBOL(free_irq); + /* * Do we need these probe functions on the m68k? */ @@ -179,10 +184,14 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off (unsigned long irqs) { return 0; } + +EXPORT_SYMBOL(probe_irq_off); void enable_irq(unsigned int irq) { diff -Nru a/arch/h8300/platform/h8s/ints.c b/arch/h8300/platform/h8s/ints.c --- a/arch/h8300/platform/h8s/ints.c Wed Oct 8 12:24:56 2003 +++ b/arch/h8300/platform/h8s/ints.c Wed Oct 8 12:24:56 2003 @@ -13,6 +13,7 @@ * Copyright 1999 D. Jeff Dionne */ +#include #include #include #include @@ -201,6 +202,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { if (irq >= NR_IRQS) @@ -228,15 +231,21 @@ } } +EXPORT_SYMBOL(free_irq); + unsigned long probe_irq_on (void) { return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off (unsigned long irqs) { return 0; } + +EXPORT_SYMBOL(probe_irq_off); void enable_irq(unsigned int irq) { diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig --- a/arch/i386/Kconfig Wed Oct 8 12:24:55 2003 +++ b/arch/i386/Kconfig Wed Oct 8 12:24:55 2003 @@ -447,7 +447,7 @@ default "8" help This allows you to specify the maximum number of CPUs which this - kernel will support. The maximum supported value is 32 and the + kernel will support. The maximum supported value is 255 and the minimum value which makes sense is 2. This is purely to save memory - each supported CPU adds @@ -1118,54 +1118,10 @@ endmenu -source "drivers/base/Kconfig" - -source "drivers/mtd/Kconfig" - -source "drivers/parport/Kconfig" - -source "drivers/pnp/Kconfig" - -source "drivers/block/Kconfig" - -source "drivers/ide/Kconfig" - -source "drivers/scsi/Kconfig" - -source "drivers/cdrom/Kconfig" - -source "drivers/md/Kconfig" - -source "drivers/message/fusion/Kconfig" - -source "drivers/ieee1394/Kconfig" - -source "drivers/message/i2o/Kconfig" - -source "net/Kconfig" - -source "drivers/isdn/Kconfig" - -source "drivers/telephony/Kconfig" - -# -# input before char - char/joystick depends on it. As does USB. -# -source "drivers/input/Kconfig" - -source "drivers/char/Kconfig" - -#source drivers/misc/Config.in -source "drivers/media/Kconfig" +source "drivers/Kconfig" source "fs/Kconfig" -source "drivers/video/Kconfig" - -source "sound/Kconfig" - -source "drivers/usb/Kconfig" - source "arch/i386/oprofile/Kconfig" @@ -1302,4 +1258,9 @@ config X86_TRAMPOLINE bool depends on SMP || X86_VISWS + default y + +config PC + bool + depends on X86 && !EMBEDDED default y diff -Nru a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c --- a/arch/i386/kernel/acpi/boot.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/acpi/boot.c Wed Oct 8 12:24:57 2003 @@ -183,8 +183,7 @@ #endif /*CONFIG_X86_LOCAL_APIC*/ -#ifdef CONFIG_X86_IO_APIC - +#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER) static int __init acpi_parse_ioapic ( @@ -368,7 +367,6 @@ result = acpi_table_parse(ACPI_APIC, acpi_parse_madt); if (!result) { - printk(KERN_WARNING PREFIX "MADT not present\n"); return 0; } else if (result < 0) { @@ -416,7 +414,7 @@ #endif /*CONFIG_X86_LOCAL_APIC*/ -#ifdef CONFIG_X86_IO_APIC +#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER) /* * I/O APIC @@ -472,7 +470,8 @@ acpi_irq_model = ACPI_IRQ_MODEL_IOAPIC; acpi_ioapic = 1; -#endif /*CONFIG_X86_IO_APIC*/ + +#endif /* CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER */ #ifdef CONFIG_X86_LOCAL_APIC if (acpi_lapic && acpi_ioapic) { @@ -480,6 +479,7 @@ clustered_apic_check(); } #endif + #ifdef CONFIG_HPET_TIMER acpi_table_parse(ACPI_HPET, acpi_parse_hpet); #endif diff -Nru a/arch/i386/kernel/cpu/cpufreq/Kconfig b/arch/i386/kernel/cpu/cpufreq/Kconfig --- a/arch/i386/kernel/cpu/cpufreq/Kconfig Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/cpu/cpufreq/Kconfig Wed Oct 8 12:24:56 2003 @@ -12,7 +12,7 @@ because the lower the clock speed, the less power the CPU consumes. For more information, take a look at linux/Documentation/cpu-freq or - at + at If in doubt, say N. @@ -83,6 +83,16 @@ depends on CPU_FREQ_TABLE help This adds the CPUFreq driver for mobile AMD K7 mobile processors. + + For details, take a look at linux/Documentation/cpu-freq. + + If in doubt, say N. + +config X86_POWERNOW_K8 + tristate "AMD Opteron/Athlon64 PowerNow!" + depends on CPU_FREQ && EXPERIMENTAL + help + This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors. For details, take a look at linux/Documentation/cpu-freq. diff -Nru a/arch/i386/kernel/cpu/cpufreq/Makefile b/arch/i386/kernel/cpu/cpufreq/Makefile --- a/arch/i386/kernel/cpu/cpufreq/Makefile Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/cpu/cpufreq/Makefile Wed Oct 8 12:24:56 2003 @@ -1,5 +1,6 @@ obj-$(CONFIG_X86_POWERNOW_K6) += powernow-k6.o obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o +obj-$(CONFIG_X86_POWERNOW_K8) += powernow-k8.o obj-$(CONFIG_X86_LONGHAUL) += longhaul.o obj-$(CONFIG_X86_P4_CLOCKMOD) += p4-clockmod.o obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o diff -Nru a/arch/i386/kernel/cpu/cpufreq/acpi.c b/arch/i386/kernel/cpu/cpufreq/acpi.c --- a/arch/i386/kernel/cpu/cpufreq/acpi.c Wed Oct 8 12:24:55 2003 +++ b/arch/i386/kernel/cpu/cpufreq/acpi.c Wed Oct 8 12:24:55 2003 @@ -231,7 +231,7 @@ int state) { u16 port = 0; - u8 value = 0; + u16 value = 0; int i = 0; struct cpufreq_freqs cpufreq_freqs; @@ -282,9 +282,9 @@ value = (u16) perf->states[state].control; ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Writing 0x%02x to port 0x%04x\n", value, port)); + "Writing 0x%04x to port 0x%04x\n", value, port)); - outb(value, port); + outw(value, port); /* * Then we read the 'status_register' and compare the value with the @@ -296,12 +296,12 @@ port = perf->status_register; ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Looking for 0x%02x from port 0x%04x\n", - (u8) perf->states[state].status, port)); + "Looking for 0x%04x from port 0x%04x\n", + (u16) perf->states[state].status, port)); for (i=0; i<100; i++) { - value = inb(port); - if (value == (u8) perf->states[state].status) + value = inw(port); + if (value == (u16) perf->states[state].status) break; udelay(10); } @@ -309,7 +309,7 @@ /* notify cpufreq */ cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); - if (value != perf->states[state].status) { + if (value != (u16) perf->states[state].status) { unsigned int tmp = cpufreq_freqs.new; cpufreq_freqs.new = cpufreq_freqs.old; cpufreq_freqs.old = tmp; diff -Nru a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c Wed Oct 8 12:24:55 2003 +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c Wed Oct 8 12:24:55 2003 @@ -70,21 +70,6 @@ } -static unsigned int longhaul_get_cpu_fsb (void) -{ - unsigned long lo, hi; - unsigned int eblcr_fsb_table[] = { 66, 133, 100, -1 }; - unsigned int invalue=0; - - if (fsb == 0) { - rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi); - invalue = (lo & (1<<18|1<<19)) >>18; - fsb = eblcr_fsb_table[invalue]; - } - return fsb; -} - - static int longhaul_get_cpu_mult (void) { unsigned long invalue=0,lo, hi; @@ -168,7 +153,7 @@ break; /* - * Longhaul v3. (Ezra-T [C5M], Nehemiag [C5N]) + * Longhaul v3. (Ezra-T [C5M], Nehemiah [C5N]) * This can also do voltage scaling, but see above. * Ezra-T was alleged to do FSB scaling too, but it never worked in practice. */ @@ -193,6 +178,39 @@ cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); } +/* + * Centaur decided to make life a little more tricky. + * Only longhaul v1 is allowed to read EBLCR BSEL[0:1]. + * Samuel2 and above have to try and guess what the FSB is. + * We do this by assuming we booted at maximum multiplier, and interpolate + * between that value multiplied by possible FSBs and cpu_mhz which + * was calculated at boot time. Really ugly, but no other way to do this. + */ +static int _guess (int guess, int maxmult) +{ + int target; + + target = ((maxmult/10)*guess); + if (maxmult%10 != 0) + target += (guess/2); + target &= ~0xf; + return target; +} + +static int guess_fsb(int maxmult) +{ + int speed = (cpu_khz/1000) & ~0xf; + int i; + int speeds[3] = { 66, 100, 133 }; + + for (i=0; i<3; i++) { + if (_guess(speeds[i],maxmult) == speed) + return speeds[i]; + } + return 0; +} + + static int __init longhaul_get_ranges (void) { @@ -203,8 +221,8 @@ -1,110,120,-1,135,115,125,105,130,150,160,140,-1,155,-1,145 }; unsigned int j, k = 0; union msr_longhaul longhaul; - - fsb = longhaul_get_cpu_fsb(); + unsigned long lo, hi; + unsigned int eblcr_fsb_table[] = { 66, 133, 100, -1 }; switch (longhaul_version) { case 1: @@ -212,6 +230,9 @@ Assume min=3.0x & max = whatever we booted at. */ minmult = 30; maxmult = longhaul_get_cpu_mult(); + rdmsr (MSR_IA32_EBL_CR_POWERON, lo, hi); + invalue = (lo & (1<<18|1<<19)) >>18; + fsb = eblcr_fsb_table[invalue]; break; case 2 ... 3: @@ -222,14 +243,13 @@ invalue += 16; maxmult=multipliers[invalue]; -#if 0 invalue = longhaul.bits.MinMHzBR; - if (longhaul.bits.MinMHzBR4); - invalue += 16; - minmult = multipliers[invalue]; -#else - minmult = 30; /* as per spec */ -#endif + if (longhaul.bits.MinMHzBR4 == 1) + minmult = 30; + else + minmult = multipliers[invalue]; + + fsb = guess_fsb(maxmult); break; } @@ -353,7 +373,7 @@ case 6: cpuname = "C3 'Samuel' [C5A]"; longhaul_version=1; - memcpy (clock_ratio, longhaul1_clock_ratio, sizeof(longhaul1_clock_ratio)); + memcpy (clock_ratio, samuel1_clock_ratio, sizeof(samuel1_clock_ratio)); memcpy (eblcr_table, samuel1_eblcr, sizeof(samuel1_eblcr)); break; @@ -362,13 +382,17 @@ case 0: cpuname = "C3 'Samuel 2' [C5B]"; longhaul_version=1; - memcpy (clock_ratio, longhaul1_clock_ratio, sizeof(longhaul1_clock_ratio)); + /* Note, this is not a typo, early Samuel2's had Samuel1 ratios. */ + memcpy (clock_ratio, samuel1_clock_ratio, sizeof(samuel1_clock_ratio)); memcpy (eblcr_table, samuel2_eblcr, sizeof(samuel2_eblcr)); break; case 1 ... 15: - cpuname = "C3 'Ezra' [C5C]"; + if (c->x86_mask < 8) + cpuname = "C3 'Samuel 2' [C5B]"; + else + cpuname = "C3 'Ezra' [C5C]"; longhaul_version=2; - memcpy (clock_ratio, longhaul2_clock_ratio, sizeof(longhaul2_clock_ratio)); + memcpy (clock_ratio, ezra_clock_ratio, sizeof(ezra_clock_ratio)); memcpy (eblcr_table, ezra_eblcr, sizeof(ezra_eblcr)); break; } @@ -378,14 +402,16 @@ cpuname = "C3 'Ezra-T [C5M]"; longhaul_version=3; numscales=32; - memcpy (clock_ratio, longhaul3_clock_ratio, sizeof(longhaul3_clock_ratio)); - memcpy (eblcr_table, c5m_eblcr, sizeof(c5m_eblcr)); + memcpy (clock_ratio, ezrat_clock_ratio, sizeof(ezrat_clock_ratio)); + memcpy (eblcr_table, ezrat_eblcr, sizeof(ezrat_eblcr)); break; /* case 9: cpuname = "C3 'Nehemiah' [C5N]"; longhaul_version=3; numscales=32; + memcpy (clock_ratio, nehemiah_clock_ratio, sizeof(nehemiah_clock_ratio)); + memcpy (eblcr_table, nehemiah_eblcr, sizeof(nehemiah_eblcr)); */ default: cpuname = "Unknown"; @@ -425,12 +451,8 @@ return -ENODEV; switch (c->x86_model) { - case 6 ... 7: + case 6 ... 8: return cpufreq_register_driver(&longhaul_driver); - case 8: - printk (KERN_INFO PFX "Ezra-T unsupported: Waiting on updated docs " - "from VIA before this is usable.\n"); - break; case 9: printk (KERN_INFO PFX "Nehemiah unsupported: Waiting on working silicon " "from VIA before this is usable.\n"); diff -Nru a/arch/i386/kernel/cpu/cpufreq/longhaul.h b/arch/i386/kernel/cpu/cpufreq/longhaul.h --- a/arch/i386/kernel/cpu/cpufreq/longhaul.h Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.h Wed Oct 8 12:24:56 2003 @@ -56,7 +56,7 @@ /* * VIA C3 Samuel 1 & Samuel 2 (stepping 0) */ -static int __initdata longhaul1_clock_ratio[16] = { +static int __initdata samuel1_clock_ratio[16] = { -1, /* 0000 -> RESERVED */ 30, /* 0001 -> 3.0x */ 40, /* 0010 -> 4.0x */ @@ -95,27 +95,8 @@ }; /* - * VIA C3 Samuel2 Stepping 1->15 & VIA C3 Ezra + * VIA C3 Samuel2 Stepping 1->15 */ -static int __initdata longhaul2_clock_ratio[16] = { - 100, /* 0000 -> 10.0x */ - 30, /* 0001 -> 3.0x */ - 40, /* 0010 -> 4.0x */ - 90, /* 0011 -> 9.0x */ - 95, /* 0100 -> 9.5x */ - 35, /* 0101 -> 3.5x */ - 45, /* 0110 -> 4.5x */ - 55, /* 0111 -> 5.5x */ - 60, /* 1000 -> 6.0x */ - 70, /* 1001 -> 7.0x */ - 80, /* 1010 -> 8.0x */ - 50, /* 1011 -> 5.0x */ - 65, /* 1100 -> 6.5x */ - 75, /* 1101 -> 7.5x */ - 85, /* 1110 -> 8.5x */ - 120, /* 1111 -> 12.0x */ -}; - static int __initdata samuel2_eblcr[16] = { 50, /* 0000 -> 5.0x */ 30, /* 0001 -> 3.0x */ @@ -135,6 +116,28 @@ 65, /* 1111 -> 6.5x */ }; +/* + * VIA C3 Ezra + */ +static int __initdata ezra_clock_ratio[16] = { + 100, /* 0000 -> 10.0x */ + 30, /* 0001 -> 3.0x */ + 40, /* 0010 -> 4.0x */ + 90, /* 0011 -> 9.0x */ + 95, /* 0100 -> 9.5x */ + 35, /* 0101 -> 3.5x */ + 45, /* 0110 -> 4.5x */ + 55, /* 0111 -> 5.5x */ + 60, /* 1000 -> 6.0x */ + 70, /* 1001 -> 7.0x */ + 80, /* 1010 -> 8.0x */ + 50, /* 1011 -> 5.0x */ + 65, /* 1100 -> 6.5x */ + 75, /* 1101 -> 7.5x */ + 85, /* 1110 -> 8.5x */ + 120, /* 1111 -> 12.0x */ +}; + static int __initdata ezra_eblcr[16] = { 50, /* 0000 -> 5.0x */ 30, /* 0001 -> 3.0x */ @@ -157,7 +160,7 @@ /* * VIA C3 (Ezra-T) [C5M]. */ -static int __initdata longhaul3_clock_ratio[32] = { +static int __initdata ezrat_clock_ratio[32] = { 100, /* 0000 -> 10.0x */ 30, /* 0001 -> 3.0x */ 40, /* 0010 -> 4.0x */ @@ -193,7 +196,7 @@ -1, /* 1111 -> RESERVED (12.0x) */ }; -static int __initdata c5m_eblcr[32] = { +static int __initdata ezrat_eblcr[32] = { 50, /* 0000 -> 5.0x */ 30, /* 0001 -> 3.0x */ 40, /* 0010 -> 4.0x */ @@ -229,7 +232,79 @@ 145, /* 1111 -> 14.5x */ }; +/* + * VIA C3 Nehemiah */ +static int __initdata nehemiah_clock_ratio[32] = { + 100, /* 0000 -> 10.0x */ + 160, /* 0001 -> 16.0x */ + -1, /* 0010 -> RESERVED */ + 90, /* 0011 -> 9.0x */ + 95, /* 0100 -> 9.5x */ + -1, /* 0101 -> RESERVED */ + -1, /* 0110 -> RESERVED */ + 55, /* 0111 -> 5.5x */ + 60, /* 1000 -> 6.0x */ + 70, /* 1001 -> 7.0x */ + 80, /* 1010 -> 8.0x */ + 50, /* 1011 -> 5.0x */ + 65, /* 1100 -> 6.5x */ + 75, /* 1101 -> 7.5x */ + 85, /* 1110 -> 8.5x */ + 120, /* 1111 -> 12.0x */ + + 100, /* 0000 -> 10.0x */ + 110, /* 0001 -> 11.0x */ + 120, /* 0010 -> 12.0x */ + 90, /* 0011 -> 9.0x */ + 105, /* 0100 -> 10.5x */ + 115, /* 0101 -> 11.5x */ + 125, /* 0110 -> 12.5x */ + 135, /* 0111 -> 13.5x */ + 140, /* 1000 -> 14.0x */ + 150, /* 1001 -> 15.0x */ + 160, /* 1010 -> 16.0x */ + 130, /* 1011 -> 13.0x */ + 145, /* 1100 -> 14.5x */ + 155, /* 1101 -> 15.5x */ + -1, /* 1110 -> RESERVED */ + 120, /* 1111 -> 12.0x */ +}; +static int __initdata nehemiah_eblcr[32] = { + 50, /* 0000 -> 5.0x */ + 160, /* 0001 -> 16.0x */ + -1, /* 0010 -> RESERVED */ + 100, /* 0011 -> 10.0x */ + 55, /* 0100 -> 5.5x */ + -1, /* 0101 -> RESERVED */ + -1, /* 0110 -> RESERVED */ + 95, /* 0111 -> 9.5x */ + 90, /* 1000 -> 9.0x */ + 70, /* 1001 -> 7.0x */ + 80, /* 1010 -> 8.0x */ + 60, /* 1011 -> 6.0x */ + 120, /* 1100 -> 12.0x */ + 75, /* 1101 -> 7.5x */ + 85, /* 1110 -> 8.5x */ + 65, /* 1111 -> 6.5x */ + + 90, /* 0000 -> 9.0x */ + 110, /* 0001 -> 11.0x */ + 120, /* 0010 -> 12.0x */ + 100, /* 0011 -> 10.0x */ + 135, /* 0100 -> 13.5x */ + 115, /* 0101 -> 11.5x */ + 125, /* 0110 -> 12.5x */ + 105, /* 0111 -> 10.5x */ + 130, /* 1000 -> 13.0x */ + 150, /* 1001 -> 15.0x */ + 160, /* 1010 -> 16.0x */ + 140, /* 1011 -> 14.0x */ + 120, /* 1100 -> 12.0x */ + 155, /* 1101 -> 15.5x */ + -1, /* 1110 -> RESERVED */ + -1, /* 1111 -> RESERVED */ +}; /* * Voltage scales. Div/Mod by 1000 to get actual voltage. * Which scale to use depends on the VRM type in use. diff -Nru a/arch/i386/kernel/cpu/cpufreq/powernow-k8.c b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,1021 @@ +/* + * (c) 2003 Advanced Micro Devices, Inc. + * Your use of this code is subject to the terms and conditions of the + * GNU general public license version 2. See "../../../COPYING" or + * http://www.gnu.org/licenses/gpl.html + * + * Support : paul.devriendt@amd.com + * + * Based on the powernow-k7.c module written by Dave Jones. + * (C) 2003 Dave Jones on behalf of SuSE Labs + * Licensed under the terms of the GNU GPL License version 2. + * Based upon datasheets & sample CPUs kindly provided by AMD. + * + * Processor information obtained from Chapter 9 (Power and Thermal Management) + * of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD + * Opteron Processors", revision 3.03, available for download from www.amd.com + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define PFX "powernow-k8: " +#define BFX PFX "BIOS error: " +#define VERSION "version 1.00.08 - September 26, 2003" +#include "powernow-k8.h" + +#ifdef CONFIG_PREEMPT +#warning this driver has not been tested on a preempt system +#endif + +static u32 vstable; /* voltage stabalization time, from PSB, units 20 us */ +static u32 plllock; /* pll lock time, from PSB, units 1 us */ +static u32 numps; /* number of p-states, from PSB */ +static u32 rvo; /* ramp voltage offset, from PSB */ +static u32 irt; /* isochronous relief time, from PSB */ +static u32 vidmvs; /* usable value calculated from mvs, from PSB */ +struct pst_s *ppst; /* array of p states, valid for this part */ +static u32 currvid; /* keep track of the current fid / vid */ +static u32 currfid; + +/* +The PSB table supplied by BIOS allows for the definition of the number of +p-states that can be used when running on a/c, and the number of p-states +that can be used when running on battery. This allows laptop manufacturers +to force the system to save power when running from battery. The relationship +is : + 1 <= number_of_battery_p_states <= maximum_number_of_p_states + +This driver does NOT have the support in it to detect transitions from +a/c power to battery power, and thus trigger the transition to a lower +p-state if required. This is because I need ACPI and the 2.6 kernel to do +this, and this is a 2.4 kernel driver. Check back for a new improved driver +for the 2.6 kernel soon. + +This code therefore assumes it is on battery at all times, and thus +restricts performance to number_of_battery_p_states. For desktops, + number_of_battery_p_states == maximum_number_of_pstates, +so this is not actually a restriction. +*/ + +static u32 batps; /* limit on the number of p states when on battery */ + /* - set by BIOS in the PSB/PST */ + +static struct cpufreq_driver cpufreq_amd64_driver = { + .verify = powernowk8_verify, + .target = powernowk8_target, + .init = powernowk8_cpu_init, + .name = "cpufreq-amd64", + .owner = THIS_MODULE, +}; + +#define SEARCH_UP 1 +#define SEARCH_DOWN 0 + +/* Return a frequency in MHz, given an input fid */ +u32 +find_freq_from_fid(u32 fid) +{ + return 800 + (fid * 100); +} + +/* Return a fid matching an input frequency in MHz */ +static u32 +find_fid_from_freq(u32 freq) +{ + return (freq - 800) / 100; +} + +/* Return the vco fid for an input fid */ +static u32 +convert_fid_to_vco_fid(u32 fid) +{ + if (fid < HI_FID_TABLE_BOTTOM) { + return 8 + (2 * fid); + } else { + return fid; + } +} + +/* Sort the fid/vid frequency table into ascending order by fid. The spec */ +/* implies that it will be sorted by BIOS, but, it only implies it, and I */ +/* prefer not to trust when I can check. */ +/* Yes, it is a simple bubble sort, but the PST is really small, so the */ +/* choice of algorithm is pretty irrelevant. */ +static inline void +sort_pst(struct pst_s *ppst, u32 numpstates) +{ + u32 i; + u8 tempfid; + u8 tempvid; + int swaps = 1; + + while (swaps) { + swaps = 0; + for (i = 0; i < (numpstates - 1); i++) { + if (ppst[i].fid > ppst[i + 1].fid) { + swaps = 1; + tempfid = ppst[i].fid; + tempvid = ppst[i].vid; + ppst[i].fid = ppst[i + 1].fid; + ppst[i].vid = ppst[i + 1].vid; + ppst[i + 1].fid = tempfid; + ppst[i + 1].vid = tempvid; + } + } + } + + return; +} + +/* Return 1 if the pending bit is set. Unless we are actually just told the */ +/* processor to transition a state, seeing this bit set is really bad news. */ +static inline int +pending_bit_stuck(void) +{ + u32 lo; + u32 hi; + + rdmsr(MSR_FIDVID_STATUS, lo, hi); + return lo & MSR_S_LO_CHANGE_PENDING ? 1 : 0; +} + +/* Update the global current fid / vid values from the status msr. Returns 1 */ +/* on error. */ +static int +query_current_values_with_pending_wait(void) +{ + u32 lo; + u32 hi; + u32 i = 0; + + lo = MSR_S_LO_CHANGE_PENDING; + while (lo & MSR_S_LO_CHANGE_PENDING) { + if (i++ > 0x1000000) { + printk(KERN_ERR PFX "detected change pending stuck\n"); + return 1; + } + rdmsr(MSR_FIDVID_STATUS, lo, hi); + } + + currvid = hi & MSR_S_HI_CURRENT_VID; + currfid = lo & MSR_S_LO_CURRENT_FID; + + return 0; +} + +/* the isochronous relief time */ +static inline void +count_off_irt(void) +{ + udelay((1 << irt) * 10); + return; +} + +/* the voltage stabalization time */ +static inline void +count_off_vst(void) +{ + udelay(vstable * VST_UNITS_20US); + return; +} + +/* write the new fid value along with the other control fields to the msr */ +static int +write_new_fid(u32 fid) +{ + u32 lo; + u32 savevid = currvid; + + if ((fid & INVALID_FID_MASK) || (currvid & INVALID_VID_MASK)) { + printk(KERN_ERR PFX "internal error - overflow on fid write\n"); + return 1; + } + + lo = fid | (currvid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID; + + dprintk(KERN_DEBUG PFX "writing fid %x, lo %x, hi %x\n", + fid, lo, plllock * PLL_LOCK_CONVERSION); + + wrmsr(MSR_FIDVID_CTL, lo, plllock * PLL_LOCK_CONVERSION); + + if (query_current_values_with_pending_wait()) + return 1; + + count_off_irt(); + + if (savevid != currvid) { + printk(KERN_ERR PFX + "vid changed on fid transition, save %x, currvid %x\n", + savevid, currvid); + return 1; + } + + if (fid != currfid) { + printk(KERN_ERR PFX + "fid transition failed, fid %x, currfid %x\n", + fid, currfid); + return 1; + } + + return 0; +} + +/* Write a new vid to the hardware */ +static int +write_new_vid(u32 vid) +{ + u32 lo; + u32 savefid = currfid; + + if ((currfid & INVALID_FID_MASK) || (vid & INVALID_VID_MASK)) { + printk(KERN_ERR PFX "internal error - overflow on vid write\n"); + return 1; + } + + lo = currfid | (vid << MSR_C_LO_VID_SHIFT) | MSR_C_LO_INIT_FID_VID; + + dprintk(KERN_DEBUG PFX "writing vid %x, lo %x, hi %x\n", + vid, lo, STOP_GRANT_5NS); + + wrmsr(MSR_FIDVID_CTL, lo, STOP_GRANT_5NS); + + if (query_current_values_with_pending_wait()) { + return 1; + } + + if (savefid != currfid) { + printk(KERN_ERR PFX + "fid changed on vid transition, save %x currfid %x\n", + savefid, currfid); + return 1; + } + + if (vid != currvid) { + printk(KERN_ERR PFX + "vid transition failed, vid %x, currvid %x\n", + vid, currvid); + return 1; + } + + return 0; +} + +/* Reduce the vid by the max of step or reqvid. */ +/* Decreasing vid codes represent increasing voltages : */ +/* vid of 0 is 1.550V, vid of 0x1e is 0.800V, vid of 0x1f is off. */ +static int +decrease_vid_code_by_step(u32 reqvid, u32 step) +{ + if ((currvid - reqvid) > step) + reqvid = currvid - step; + + if (write_new_vid(reqvid)) + return 1; + + count_off_vst(); + + return 0; +} + +/* Change the fid and vid, by the 3 phases. */ +static inline int +transition_fid_vid(u32 reqfid, u32 reqvid) +{ + if (core_voltage_pre_transition(reqvid)) + return 1; + + if (core_frequency_transition(reqfid)) + return 1; + + if (core_voltage_post_transition(reqvid)) + return 1; + + if (query_current_values_with_pending_wait()) + return 1; + + if ((reqfid != currfid) || (reqvid != currvid)) { + printk(KERN_ERR PFX "failed: req 0x%x 0x%x, curr 0x%x 0x%x\n", + reqfid, reqvid, currfid, currvid); + return 1; + } + + dprintk(KERN_INFO PFX + "transitioned: new fid 0x%x, vid 0x%x\n", currfid, currvid); + + return 0; +} + +/* Phase 1 - core voltage transition ... setup appropriate voltage for the */ +/* fid transition. */ +static inline int +core_voltage_pre_transition(u32 reqvid) +{ + u32 rvosteps = rvo; + u32 savefid = currfid; + + dprintk(KERN_DEBUG PFX + "ph1: start, currfid 0x%x, currvid 0x%x, reqvid 0x%x, rvo %x\n", + currfid, currvid, reqvid, rvo); + + while (currvid > reqvid) { + dprintk(KERN_DEBUG PFX "ph1: curr 0x%x, requesting vid 0x%x\n", + currvid, reqvid); + if (decrease_vid_code_by_step(reqvid, vidmvs)) + return 1; + } + + while (rvosteps > 0) { + if (currvid == 0) { + rvosteps = 0; + } else { + dprintk(KERN_DEBUG PFX + "ph1: changing vid for rvo, requesting 0x%x\n", + currvid - 1); + if (decrease_vid_code_by_step(currvid - 1, 1)) + return 1; + rvosteps--; + } + } + + if (query_current_values_with_pending_wait()) + return 1; + + if (savefid != currfid) { + printk(KERN_ERR PFX "ph1 err, currfid changed 0x%x\n", currfid); + return 1; + } + + dprintk(KERN_DEBUG PFX "ph1 complete, currfid 0x%x, currvid 0x%x\n", + currfid, currvid); + + return 0; +} + +/* Phase 2 - core frequency transition */ +static inline int +core_frequency_transition(u32 reqfid) +{ + u32 vcoreqfid; + u32 vcocurrfid; + u32 vcofiddiff; + u32 savevid = currvid; + + if ((reqfid < HI_FID_TABLE_BOTTOM) && (currfid < HI_FID_TABLE_BOTTOM)) { + printk(KERN_ERR PFX "ph2 illegal lo-lo transition 0x%x 0x%x\n", + reqfid, currfid); + return 1; + } + + if (currfid == reqfid) { + printk(KERN_ERR PFX "ph2 null fid transition 0x%x\n", currfid); + return 0; + } + + dprintk(KERN_DEBUG PFX + "ph2 starting, currfid 0x%x, currvid 0x%x, reqfid 0x%x\n", + currfid, currvid, reqfid); + + vcoreqfid = convert_fid_to_vco_fid(reqfid); + vcocurrfid = convert_fid_to_vco_fid(currfid); + vcofiddiff = vcocurrfid > vcoreqfid ? vcocurrfid - vcoreqfid + : vcoreqfid - vcocurrfid; + + while (vcofiddiff > 2) { + if (reqfid > currfid) { + if (currfid > LO_FID_TABLE_TOP) { + if (write_new_fid(currfid + 2)) { + return 1; + } + } else { + if (write_new_fid + (2 + convert_fid_to_vco_fid(currfid))) { + return 1; + } + } + } else { + if (write_new_fid(currfid - 2)) + return 1; + } + + vcocurrfid = convert_fid_to_vco_fid(currfid); + vcofiddiff = vcocurrfid > vcoreqfid ? vcocurrfid - vcoreqfid + : vcoreqfid - vcocurrfid; + } + + if (write_new_fid(reqfid)) + return 1; + + if (query_current_values_with_pending_wait()) + return 1; + + if (currfid != reqfid) { + printk(KERN_ERR PFX + "ph2 mismatch, failed fid transition, curr %x, req %x\n", + currfid, reqfid); + return 1; + } + + if (savevid != currvid) { + printk(KERN_ERR PFX + "ph2 vid changed, save %x, curr %x\n", savevid, + currvid); + return 1; + } + + dprintk(KERN_DEBUG PFX "ph2 complete, currfid 0x%x, currvid 0x%x\n", + currfid, currvid); + + return 0; +} + +/* Phase 3 - core voltage transition flow ... jump to the final vid. */ +static inline int +core_voltage_post_transition(u32 reqvid) +{ + u32 savefid = currfid; + u32 savereqvid = reqvid; + + dprintk(KERN_DEBUG PFX "ph3 starting, currfid 0x%x, currvid 0x%x\n", + currfid, currvid); + + if (reqvid != currvid) { + if (write_new_vid(reqvid)) + return 1; + + if (savefid != currfid) { + printk(KERN_ERR PFX + "ph3: bad fid change, save %x, curr %x\n", + savefid, currfid); + return 1; + } + + if (currvid != reqvid) { + printk(KERN_ERR PFX + "ph3: failed vid transition\n, req %x, curr %x", + reqvid, currvid); + return 1; + } + } + + if (query_current_values_with_pending_wait()) + return 1; + + if (savereqvid != currvid) { + dprintk(KERN_ERR PFX "ph3 failed, currvid 0x%x\n", currvid); + return 1; + } + + if (savefid != currfid) { + dprintk(KERN_ERR PFX "ph3 failed, currfid changed 0x%x\n", + currfid); + return 1; + } + + dprintk(KERN_DEBUG PFX "ph3 complete, currfid 0x%x, currvid 0x%x\n", + currfid, currvid); + + return 0; +} + +static inline int +check_supported_cpu(void) +{ + struct cpuinfo_x86 *c = cpu_data; + u32 eax, ebx, ecx, edx; + + if (num_online_cpus() != 1) { + printk(KERN_INFO PFX "multiprocessor systems not supported\n"); + return 0; + } + + if (c->x86_vendor != X86_VENDOR_AMD) { + printk(KERN_INFO PFX "Not an AMD processor\n"); + return 0; + } + + eax = cpuid_eax(CPUID_PROCESSOR_SIGNATURE); + if ((eax & CPUID_XFAM_MOD) == ATHLON64_XFAM_MOD) { + dprintk(KERN_DEBUG PFX "AMD Althon 64 Processor found\n"); + if ((eax & CPUID_F1_STEP) < ATHLON64_REV_C0) { + printk(KERN_INFO PFX "Revision C0 or better " + "AMD Athlon 64 processor required\n"); + return 0; + } + } else if ((eax & CPUID_XFAM_MOD) == OPTERON_XFAM_MOD) { + dprintk(KERN_DEBUG PFX "AMD Opteron Processor found\n"); + } else { + printk(KERN_INFO PFX + "AMD Athlon 64 or AMD Opteron processor required\n"); + return 0; + } + + eax = cpuid_eax(CPUID_GET_MAX_CAPABILITIES); + if (eax < CPUID_FREQ_VOLT_CAPABILITIES) { + printk(KERN_INFO PFX + "No frequency change capabilities detected\n"); + return 0; + } + + cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx); + if ((edx & P_STATE_TRANSITION_CAPABLE) != P_STATE_TRANSITION_CAPABLE) { + printk(KERN_INFO PFX "Power state transitions not supported\n"); + return 0; + } + + printk(KERN_INFO PFX "Found AMD Athlon 64 / Opteron processor " + "supporting p-state transitions\n"); + + return 1; +} + +/* Find and validate the PSB/PST table in BIOS. */ +static inline int +find_psb_table(void) +{ + struct psb_s *psb; + struct pst_s *pst; + unsigned i, j; + u32 lastfid; + u32 mvs; + u8 maxvid; + + for (i = 0xc0000; i < 0xffff0; i += 0x10) { + /* Scan BIOS looking for the signature. */ + /* It can not be at ffff0 - it is too big. */ + + psb = phys_to_virt(i); + if (memcmp(psb, PSB_ID_STRING, PSB_ID_STRING_LEN) != 0) + continue; + + dprintk(KERN_DEBUG PFX "found PSB header at 0x%p\n", psb); + + dprintk(KERN_DEBUG PFX "table vers: 0x%x\n", psb->tableversion); + if (psb->tableversion != PSB_VERSION_1_4) { + printk(KERN_INFO BFX "PSB table is not v1.4\n"); + return -ENODEV; + } + + dprintk(KERN_DEBUG PFX "flags: 0x%x\n", psb->flags1); + if (psb->flags1) { + printk(KERN_ERR BFX "unknown flags\n"); + return -ENODEV; + } + + vstable = psb->voltagestabilizationtime; + printk(KERN_INFO PFX "voltage stable time: %d (units 20us)\n", + vstable); + + dprintk(KERN_DEBUG PFX "flags2: 0x%x\n", psb->flags2); + rvo = psb->flags2 & 3; + irt = ((psb->flags2) >> 2) & 3; + mvs = ((psb->flags2) >> 4) & 3; + vidmvs = 1 << mvs; + batps = ((psb->flags2) >> 6) & 3; + printk(KERN_INFO PFX "p states on battery: %d ", batps); + switch (batps) { + case 0: + printk("- all available\n"); + break; + case 1: + printk("- only the minimum\n"); + break; + case 2: + printk("- only the 2 lowest\n"); + break; + case 3: + printk("- only the 3 lowest\n"); + break; + } + printk(KERN_INFO PFX "ramp voltage offset: %d\n", rvo); + printk(KERN_INFO PFX "isochronous relief time: %d\n", irt); + printk(KERN_INFO PFX "maximum voltage step: %d\n", mvs); + + dprintk(KERN_DEBUG PFX "numpst: 0x%x\n", psb->numpst); + if (psb->numpst != 1) { + printk(KERN_ERR BFX "numpst must be 1\n"); + return -ENODEV; + } + + dprintk(KERN_DEBUG PFX "cpuid: 0x%x\n", psb->cpuid); + + plllock = psb->plllocktime; + printk(KERN_INFO PFX "pll lock time: 0x%x\n", plllock); + + maxvid = psb->maxvid; + printk(KERN_INFO PFX "maxfid: 0x%x\n", psb->maxfid); + printk(KERN_INFO PFX "maxvid: 0x%x\n", maxvid); + + numps = psb->numpstates; + printk(KERN_INFO PFX "numpstates: 0x%x\n", numps); + if (numps < 2) { + printk(KERN_ERR BFX "no p states to transition\n"); + return -ENODEV; + } + + if (batps == 0) { + batps = numps; + } else if (batps > numps) { + printk(KERN_ERR BFX "batterypstates > numpstates\n"); + batps = numps; + } else { + printk(KERN_ERR PFX + "Restricting operation to %d p-states\n", batps); + printk(KERN_ERR PFX + "Check for an updated driver to access all " + "%d p-states\n", numps); + } + + if ((numps <= 1) || (batps <= 1)) { + printk(KERN_ERR PFX "only 1 p-state to transition\n"); + return -ENODEV; + } + + ppst = kmalloc(sizeof (struct pst_s) * numps, GFP_KERNEL); + if (!ppst) { + printk(KERN_ERR PFX "ppst memory alloc failure\n"); + return -ENOMEM; + } + + pst = (struct pst_s *) (psb + 1); + for (j = 0; j < numps; j++) { + ppst[j].fid = pst[j].fid; + ppst[j].vid = pst[j].vid; + printk(KERN_INFO PFX + " %d : fid 0x%x, vid 0x%x\n", j, + ppst[j].fid, ppst[j].vid); + } + sort_pst(ppst, numps); + + lastfid = ppst[0].fid; + if (lastfid > LO_FID_TABLE_TOP) + printk(KERN_INFO BFX "first fid not in lo freq tbl\n"); + + if ((lastfid > MAX_FID) || (lastfid & 1) || (ppst[0].vid > LEAST_VID)) { + printk(KERN_ERR BFX "first fid/vid bad (0x%x - 0x%x)\n", + lastfid, ppst[0].vid); + kfree(ppst); + return -ENODEV; + } + + for (j = 1; j < numps; j++) { + if ((lastfid >= ppst[j].fid) + || (ppst[j].fid & 1) + || (ppst[j].fid < HI_FID_TABLE_BOTTOM) + || (ppst[j].fid > MAX_FID) + || (ppst[j].vid > LEAST_VID)) { + printk(KERN_ERR BFX + "invalid fid/vid in pst(%x %x)\n", + ppst[j].fid, ppst[j].vid); + kfree(ppst); + return -ENODEV; + } + lastfid = ppst[j].fid; + } + + for (j = 0; j < numps; j++) { + if (ppst[j].vid < rvo) { /* vid+rvo >= 0 */ + printk(KERN_ERR BFX + "0 vid exceeded with pstate %d\n", j); + return -ENODEV; + } + if (ppst[j].vid < maxvid+rvo) { /* vid+rvo >= maxvid */ + printk(KERN_ERR BFX + "maxvid exceeded with pstate %d\n", j); + return -ENODEV; + } + } + + if (query_current_values_with_pending_wait()) { + kfree(ppst); + return -EIO; + } + + printk(KERN_INFO PFX "currfid 0x%x, currvid 0x%x\n", + currfid, currvid); + + for (j = 0; j < numps; j++) + if ((ppst[j].fid==currfid) && (ppst[j].vid==currvid)) + return (0); + + printk(KERN_ERR BFX "currfid/vid do not match PST, ignoring\n"); + return 0; + } + + printk(KERN_ERR BFX "no PSB\n"); + return -ENODEV; +} + +/* Converts a frequency (that might not necessarily be a multiple of 200) */ +/* to a fid. */ +static u32 +find_closest_fid(u32 freq, int searchup) +{ + if (searchup == SEARCH_UP) + freq += MIN_FREQ_RESOLUTION - 1; + + freq = (freq / MIN_FREQ_RESOLUTION) * MIN_FREQ_RESOLUTION; + + if (freq < MIN_FREQ) + freq = MIN_FREQ; + else if (freq > MAX_FREQ) + freq = MAX_FREQ; + + return find_fid_from_freq(freq); +} + +static int +find_match(u32 * ptargfreq, u32 * pmin, u32 * pmax, int searchup, u32 * pfid, + u32 * pvid) +{ + u32 availpstates = batps; + u32 targfid = find_closest_fid(*ptargfreq, searchup); + u32 minfid = find_closest_fid(*pmin, SEARCH_DOWN); + u32 maxfid = find_closest_fid(*pmax, SEARCH_UP); + u32 minidx = 0; + u32 maxidx = availpstates - 1; + u32 targidx = 0xffffffff; + int i; + + dprintk(KERN_DEBUG PFX "find match: freq %d MHz, min %d, max %d\n", + *ptargfreq, *pmin, *pmax); + + /* Restrict values to the frequency choices in the PST */ + if (minfid < ppst[0].fid) + minfid = ppst[0].fid; + if (maxfid > ppst[maxidx].fid) + maxfid = ppst[maxidx].fid; + + /* Find appropriate PST index for the minimim fid */ + for (i = 0; i < (int) availpstates; i++) { + if (minfid >= ppst[i].fid) + minidx = i; + } + + /* Find appropriate PST index for the maximum fid */ + for (i = availpstates - 1; i >= 0; i--) { + if (maxfid <= ppst[i].fid) + maxidx = i; + } + + if (minidx > maxidx) + maxidx = minidx; + + /* Frequency ids are now constrained by limits matching PST entries */ + minfid = ppst[minidx].fid; + maxfid = ppst[maxidx].fid; + + /* Limit the target frequency to these limits */ + if (targfid < minfid) + targfid = minfid; + else if (targfid > maxfid) + targfid = maxfid; + + /* Find the best target index into the PST, contrained by the range */ + if (searchup == SEARCH_UP) { + for (i = maxidx; i >= (int) minidx; i--) { + if (targfid <= ppst[i].fid) + targidx = i; + } + } else { + for (i = minidx; i <= (int) maxidx; i++) { + if (targfid >= ppst[i].fid) + targidx = i; + } + } + + if (targidx == 0xffffffff) { + printk(KERN_ERR PFX "could not find target\n"); + return 1; + } + + *pmin = find_freq_from_fid(minfid); + *pmax = find_freq_from_fid(maxfid); + *ptargfreq = find_freq_from_fid(ppst[targidx].fid); + + if (pfid) + *pfid = ppst[targidx].fid; + if (pvid) + *pvid = ppst[targidx].vid; + + return 0; +} + +/* Take a frequency, and issue the fid/vid transition command */ +static inline int +transition_frequency(u32 * preq, u32 * pmin, u32 * pmax, u32 searchup) +{ + u32 fid; + u32 vid; + int res; + struct cpufreq_freqs freqs; + + if (find_match(preq, pmin, pmax, searchup, &fid, &vid)) + return 1; + + dprintk(KERN_DEBUG PFX "table matched fid 0x%x, giving vid 0x%x\n", + fid, vid); + + if (query_current_values_with_pending_wait()) + return 1; + + if ((currvid == vid) && (currfid == fid)) { + dprintk(KERN_DEBUG PFX + "target matches current values (fid 0x%x, vid 0x%x)\n", + fid, vid); + return 0; + } + + if ((fid < HI_FID_TABLE_BOTTOM) && (currfid < HI_FID_TABLE_BOTTOM)) { + printk(KERN_ERR PFX + "ignoring illegal change in lo freq table-%x to %x\n", + currfid, fid); + return 1; + } + + dprintk(KERN_DEBUG PFX "changing to fid 0x%x, vid 0x%x\n", fid, vid); + + freqs.cpu = 0; /* only true because SMP not supported */ + + freqs.old = find_freq_from_fid(currfid); + freqs.new = find_freq_from_fid(fid); + cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE); + + res = transition_fid_vid(fid, vid); + + freqs.new = find_freq_from_fid(currfid); + cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); + + return res; +} + +/* Driver entry point to switch to the target frequency */ +static int +powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsigned relation) +{ + u32 checkfid = currfid; + u32 checkvid = currvid; + u32 reqfreq = targfreq / 1000; + u32 minfreq = pol->min / 1000; + u32 maxfreq = pol->max / 1000; + + if (ppst == 0) { + printk(KERN_ERR PFX "targ: ppst 0\n"); + return -ENODEV; + } + + if (pending_bit_stuck()) { + printk(KERN_ERR PFX "drv targ fail: change pending bit set\n"); + return -EIO; + } + + dprintk(KERN_DEBUG PFX "targ: %d kHz, min %d, max %d, relation %d\n", + targfreq, pol->min, pol->max, relation); + + if (query_current_values_with_pending_wait()) + return -EIO; + + dprintk(KERN_DEBUG PFX "targ: curr fid 0x%x, vid 0x%x\n", + currfid, currvid); + + if ((checkvid != currvid) || (checkfid != currfid)) { + printk(KERN_ERR PFX + "error - out of sync, fid 0x%x 0x%x, vid 0x%x 0x%x\n", + checkfid, currfid, checkvid, currvid); + } + + if (transition_frequency(&reqfreq, &minfreq, &maxfreq, + relation == + CPUFREQ_RELATION_H ? SEARCH_UP : SEARCH_DOWN)) + { + printk(KERN_ERR PFX "transition frequency failed\n"); + return 1; + } + + pol->cur = 1000 * find_freq_from_fid(currfid); + + return 0; +} + +/* Driver entry point to verify the policy and range of frequencies */ +static int +powernowk8_verify(struct cpufreq_policy *pol) +{ + u32 min = pol->min / 1000; + u32 max = pol->max / 1000; + u32 targ = min; + int res; + + if (ppst == 0) { + printk(KERN_ERR PFX "verify - ppst 0\n"); + return -ENODEV; + } + + if (pending_bit_stuck()) { + printk(KERN_ERR PFX "failing verify, change pending bit set\n"); + return -EIO; + } + + dprintk(KERN_DEBUG PFX + "ver: cpu%d, min %d, max %d, cur %d, pol %d\n", pol->cpu, + pol->min, pol->max, pol->cur, pol->policy); + + if (pol->cpu != 0) { + printk(KERN_ERR PFX "verify - cpu not 0\n"); + return -ENODEV; + } + +#warning pol->policy is in undefined state here + res = find_match(&targ, &min, &max, + pol->policy == CPUFREQ_POLICY_POWERSAVE ? + SEARCH_DOWN : SEARCH_UP, 0, 0); + if (!res) { + pol->min = min * 1000; + pol->max = max * 1000; + } + return res; +} + +/* per CPU init entry point to the driver */ +static int __init +powernowk8_cpu_init(struct cpufreq_policy *pol) +{ + if (pol->cpu != 0) { + printk(KERN_ERR PFX "init not cpu 0\n"); + return -ENODEV; + } + + pol->governor = CPUFREQ_DEFAULT_GOVERNOR; + + /* Take a crude guess here. */ + pol->cpuinfo.transition_latency = ((rvo + 8) * vstable * VST_UNITS_20US) + + (3 * (1 << irt) * 10); + + if (query_current_values_with_pending_wait()) + return -EIO; + + pol->cur = 1000 * find_freq_from_fid(currfid); + dprintk(KERN_DEBUG PFX "policy current frequency %d kHz\n", pol->cur); + + /* min/max the cpu is capable of */ + pol->cpuinfo.min_freq = 1000 * find_freq_from_fid(ppst[0].fid); + pol->cpuinfo.max_freq = 1000 * find_freq_from_fid(ppst[numps-1].fid); + pol->min = 1000 * find_freq_from_fid(ppst[0].fid); + pol->max = 1000 * find_freq_from_fid(ppst[batps - 1].fid); + + printk(KERN_INFO PFX "cpu_init done, current fid 0x%x, vid 0x%x\n", + currfid, currvid); + + return 0; +} + +/* driver entry point for init */ +static int __init +powernowk8_init(void) +{ + int rc; + + printk(KERN_INFO PFX VERSION "\n"); + + if (check_supported_cpu() == 0) + return -ENODEV; + + rc = find_psb_table(); + if (rc) + return rc; + + if (pending_bit_stuck()) { + printk(KERN_ERR PFX "powernowk8_init fail, change pending bit set\n"); + kfree(ppst); + return -EIO; + } + + return cpufreq_register_driver(&cpufreq_amd64_driver); +} + +/* driver entry point for term */ +static void __exit +powernowk8_exit(void) +{ + dprintk(KERN_INFO PFX "powernowk8_exit\n"); + + cpufreq_unregister_driver(&cpufreq_amd64_driver); + kfree(ppst); +} + +MODULE_AUTHOR("Paul Devriendt "); +MODULE_DESCRIPTION("AMD Athlon 64 and Opteron processor frequency driver."); +MODULE_LICENSE("GPL"); + +module_init(powernowk8_init); +module_exit(powernowk8_exit); diff -Nru a/arch/i386/kernel/cpu/cpufreq/powernow-k8.h b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/i386/kernel/cpu/cpufreq/powernow-k8.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,126 @@ +/* + * (c) 2003 Advanced Micro Devices, Inc. + * Your use of this code is subject to the terms and conditions of the + * GNU general public license version 2. See "../../../COPYING" or + * http://www.gnu.org/licenses/gpl.html + */ + +/* processor's cpuid instruction support */ +#define CPUID_PROCESSOR_SIGNATURE 1 /* function 1 */ +#define CPUID_F1_FAM 0x00000f00 /* family mask */ +#define CPUID_F1_XFAM 0x0ff00000 /* extended family mask */ +#define CPUID_F1_MOD 0x000000f0 /* model mask */ +#define CPUID_F1_STEP 0x0000000f /* stepping level mask */ +#define CPUID_XFAM_MOD 0x0ff00ff0 /* xtended fam, fam + model */ +#define ATHLON64_XFAM_MOD 0x00000f40 /* xtended fam, fam + model */ +#define OPTERON_XFAM_MOD 0x00000f50 /* xtended fam, fam + model */ +#define ATHLON64_REV_C0 8 +#define CPUID_GET_MAX_CAPABILITIES 0x80000000 +#define CPUID_FREQ_VOLT_CAPABILITIES 0x80000007 +#define P_STATE_TRANSITION_CAPABLE 6 + +/* Model Specific Registers for p-state transitions. MSRs are 64-bit. For */ +/* writes (wrmsr - opcode 0f 30), the register number is placed in ecx, and */ +/* the value to write is placed in edx:eax. For reads (rdmsr - opcode 0f 32), */ +/* the register number is placed in ecx, and the data is returned in edx:eax. */ + +#define MSR_FIDVID_CTL 0xc0010041 +#define MSR_FIDVID_STATUS 0xc0010042 + +/* Field definitions within the FID VID Low Control MSR : */ +#define MSR_C_LO_INIT_FID_VID 0x00010000 +#define MSR_C_LO_NEW_VID 0x00001f00 +#define MSR_C_LO_NEW_FID 0x0000002f +#define MSR_C_LO_VID_SHIFT 8 + +/* Field definitions within the FID VID High Control MSR : */ +#define MSR_C_HI_STP_GNT_TO 0x000fffff + +/* Field definitions within the FID VID Low Status MSR : */ +#define MSR_S_LO_CHANGE_PENDING 0x80000000 /* cleared when completed */ +#define MSR_S_LO_MAX_RAMP_VID 0x1f000000 +#define MSR_S_LO_MAX_FID 0x003f0000 +#define MSR_S_LO_START_FID 0x00003f00 +#define MSR_S_LO_CURRENT_FID 0x0000003f + +/* Field definitions within the FID VID High Status MSR : */ +#define MSR_S_HI_MAX_WORKING_VID 0x001f0000 +#define MSR_S_HI_START_VID 0x00001f00 +#define MSR_S_HI_CURRENT_VID 0x0000001f + +/* fids (frequency identifiers) are arranged in 2 tables - lo and hi */ +#define LO_FID_TABLE_TOP 6 +#define HI_FID_TABLE_BOTTOM 8 + +#define LO_VCOFREQ_TABLE_TOP 1400 /* corresponding vco frequency values */ +#define HI_VCOFREQ_TABLE_BOTTOM 1600 + +#define MIN_FREQ_RESOLUTION 200 /* fids jump by 2 matching freq jumps by 200 */ + +#define MAX_FID 0x2a /* Spec only gives FID values as far as 5 GHz */ + +#define LEAST_VID 0x1e /* Lowest (numerically highest) useful vid value */ + +#define MIN_FREQ 800 /* Min and max freqs, per spec */ +#define MAX_FREQ 5000 + +#define INVALID_FID_MASK 0xffffffc1 /* not a valid fid if these bits are set */ + +#define INVALID_VID_MASK 0xffffffe0 /* not a valid vid if these bits are set */ + +#define STOP_GRANT_5NS 1 /* min poss memory access latency for voltage change */ + +#define PLL_LOCK_CONVERSION (1000/5) /* ms to ns, then divide by clock period */ + +#define MAXIMUM_VID_STEPS 1 /* Current cpus only allow a single step of 25mV */ + +#define VST_UNITS_20US 20 /* Voltage Stabalization Time is in units of 20us */ + +/* +Version 1.4 of the PSB table. This table is constructed by BIOS and is +to tell the OS's power management driver which VIDs and FIDs are +supported by this particular processor. This information is obtained from +the data sheets for each processor model by the system vendor and +incorporated into the BIOS. +If the data in the PSB / PST is wrong, then this driver will program the +wrong values into hardware, which is very likely to lead to a crash. +*/ + +#define PSB_ID_STRING "AMDK7PNOW!" +#define PSB_ID_STRING_LEN 10 + +#define PSB_VERSION_1_4 0x14 + +struct psb_s { + u8 signature[10]; + u8 tableversion; + u8 flags1; + u16 voltagestabilizationtime; + u8 flags2; + u8 numpst; + u32 cpuid; + u8 plllocktime; + u8 maxfid; + u8 maxvid; + u8 numpstates; +}; + +/* Pairs of fid/vid values are appended to the version 1.4 PSB table. */ +struct pst_s { + u8 fid; + u8 vid; +}; + +#ifdef DEBUG +#define dprintk(msg...) printk(msg) +#else +#define dprintk(msg...) do { } while(0) +#endif + +static inline int core_voltage_pre_transition(u32 reqvid); +static inline int core_voltage_post_transition(u32 reqvid); +static inline int core_frequency_transition(u32 reqfid); +static int powernowk8_verify(struct cpufreq_policy *pol); +static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, + unsigned relation); +static int __init powernowk8_cpu_init(struct cpufreq_policy *pol); diff -Nru a/arch/i386/kernel/cpu/intel.c b/arch/i386/kernel/cpu/intel.c --- a/arch/i386/kernel/cpu/intel.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/cpu/intel.c Wed Oct 8 12:24:56 2003 @@ -238,12 +238,9 @@ } /* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until model 3 mask 3 */ - if ( c->x86 == 6) { - unsigned model_mask = (c->x86_model << 8) + c->x86_mask; - if (model_mask < 0x0303) - clear_bit(X86_FEATURE_SEP, c->x86_capability); - } - + if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633) + clear_bit(X86_FEATURE_SEP, c->x86_capability); + /* Names for the Pentium II/Celeron processors detectable only by also checking the cache size. Dixon is NOT a Celeron. */ diff -Nru a/arch/i386/kernel/cpu/mcheck/k7.c b/arch/i386/kernel/cpu/mcheck/k7.c --- a/arch/i386/kernel/cpu/mcheck/k7.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/cpu/mcheck/k7.c Wed Oct 8 12:24:57 2003 @@ -17,7 +17,7 @@ #include "mce.h" /* Machine Check Handler For AMD Athlon/Duron */ -static void k7_machine_check(struct pt_regs * regs, long error_code) +static asmlinkage void k7_machine_check(struct pt_regs * regs, long error_code) { int recover=1; u32 alow, ahigh, high, low; @@ -31,7 +31,7 @@ printk (KERN_EMERG "CPU %d: Machine Check Exception: %08x%08x\n", smp_processor_id(), mcgsth, mcgstl); - for (i=0; i"), - MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1011"), NO_MATCH }}, - { force_acpi_ht, "ABIT i440BX-W83977", { MATCH(DMI_BOARD_VENDOR, "ABIT "), MATCH(DMI_BOARD_NAME, "i440BX-W83977 (BP6)"), @@ -978,7 +973,10 @@ { disable_acpi_pci, "ASUS A7V", { MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC"), MATCH(DMI_BOARD_NAME, ""), - MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), NO_MATCH }}, + /* newer BIOS, Revision 1011, does work */ + MATCH(DMI_BIOS_VERSION, "ASUS A7V ACPI BIOS Revision 1007"), + NO_MATCH }}, + #endif { NULL, } diff -Nru a/arch/i386/kernel/entry.S b/arch/i386/kernel/entry.S --- a/arch/i386/kernel/entry.S Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/entry.S Wed Oct 8 12:24:56 2003 @@ -595,7 +595,7 @@ #ifdef CONFIG_X86_MCE ENTRY(machine_check) pushl $0 - pushl $do_machine_check + pushl machine_check_vector jmp error_code #endif @@ -879,5 +879,6 @@ .long sys_tgkill /* 270 */ .long sys_utimes .long sys_fadvise64_64 + .long sys_ni_syscall /* sys_vserver */ nr_syscalls=(.-sys_call_table)/4 diff -Nru a/arch/i386/kernel/i386_ksyms.c b/arch/i386/kernel/i386_ksyms.c --- a/arch/i386/kernel/i386_ksyms.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/i386_ksyms.c Wed Oct 8 12:24:57 2003 @@ -211,3 +211,5 @@ #if defined(CONFIG_X86_SPEEDSTEP_SMI) || defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE) EXPORT_SYMBOL(ist_info); #endif + +EXPORT_SYMBOL(csum_partial); diff -Nru a/arch/i386/kernel/i387.c b/arch/i386/kernel/i387.c --- a/arch/i386/kernel/i387.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/i387.c Wed Oct 8 12:24:57 2003 @@ -10,7 +10,6 @@ #include #include -#include #include #include #include @@ -549,13 +548,3 @@ } return fpvalid; } - - -#ifdef CONFIG_SMP -void dump_smp_unlazy_fpu(void) -{ - unlazy_fpu(current); - return; -} -#endif - diff -Nru a/arch/i386/kernel/init_task.c b/arch/i386/kernel/init_task.c --- a/arch/i386/kernel/init_task.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/init_task.c Wed Oct 8 12:24:57 2003 @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -14,6 +15,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -31,6 +34,8 @@ * All other task structs will be allocated on slabs in fork.c */ struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_task); /* * per-CPU TSS segments. Threads are completely 'soft' on Linux, diff -Nru a/arch/i386/kernel/irq.c b/arch/i386/kernel/irq.c --- a/arch/i386/kernel/irq.c Wed Oct 8 12:24:55 2003 +++ b/arch/i386/kernel/irq.c Wed Oct 8 12:24:55 2003 @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -579,6 +580,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + /** * free_irq - free an interrupt * @irq: Interrupt line to free @@ -633,6 +636,8 @@ } } +EXPORT_SYMBOL(free_irq); + /* * IRQ autodetection code.. * @@ -726,6 +731,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + /* * Return a mask of triggered interrupts (this * can handle only legacy ISA interrupts). @@ -824,6 +831,8 @@ return irq_found; } +EXPORT_SYMBOL(probe_irq_off); + /* this was setup_x86_irq but it seems pretty generic */ int setup_irq(unsigned int irq, struct irqaction * new) { @@ -904,7 +913,7 @@ return -EFAULT; /* - * Parse the first 8 characters as a hex string, any non-hex char + * Parse the first HEX_DIGITS characters as a hex string, any non-hex char * is end-of-string. '00e1', 'e1', '00E1', 'E1' are all the same. */ @@ -965,6 +974,8 @@ return -EIO; err = parse_hex_value(buffer, count, &new_value); + if (err) + return err; /* * Do not allow disabling IRQs completely - it's a too easy diff -Nru a/arch/i386/kernel/mca.c b/arch/i386/kernel/mca.c --- a/arch/i386/kernel/mca.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/mca.c Wed Oct 8 12:24:57 2003 @@ -132,7 +132,9 @@ #define MCA_STANDARD_RESOURCES (sizeof(mca_standard_resources)/sizeof(struct resource)) /** - * mca_read_pos - read the POS registers into a memory buffer + * mca_read_and_store_pos - read the POS registers into a memory buffer + * @pos: a char pointer to 8 bytes, contains the POS register value on + * successful return * * Returns 1 if a card actually exists (i.e. the pos isn't * all 0xff) or 0 otherwise diff -Nru a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c --- a/arch/i386/kernel/mpparse.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/mpparse.c Wed Oct 8 12:24:56 2003 @@ -169,7 +169,7 @@ if (num_processors >= NR_CPUS) { printk(KERN_WARNING "NR_CPUS limit of %i reached. Cannot " - "boot CPU(apicid 0x%d).\n", NR_CPUS, m->mpc_apicid); + "boot CPU(apicid 0x%x).\n", NR_CPUS, m->mpc_apicid); return; } num_processors++; @@ -830,7 +830,7 @@ MP_processor_info(&processor); } -#ifdef CONFIG_X86_IO_APIC +#if defined(CONFIG_X86_IO_APIC) && defined(CONFIG_ACPI_INTERPRETER) #define MP_ISA_BUS 0 #define MP_MAX_IOAPIC_PIN 127 @@ -1019,10 +1019,6 @@ } } -#ifdef CONFIG_ACPI - -/* Ensure the ACPI SCI interrupt level is active low, edge-triggered */ - extern FADT_DESCRIPTOR acpi_fadt; void __init mp_config_ioapic_for_sci(int irq) @@ -1031,6 +1027,7 @@ int ioapic_pin; struct acpi_table_madt *madt; struct acpi_table_int_src_ovr *entry = NULL; + acpi_interrupt_flags flags; void *madt_end; acpi_status status; @@ -1049,32 +1046,37 @@ while ((void *) entry < madt_end) { if (entry->header.type == ACPI_MADT_INT_SRC_OVR && - acpi_fadt.sci_int == entry->bus_irq) { - /* - * See the note at the end of ACPI 2.0b section - * 5.2.10.8 for what this is about. - */ - if (entry->bus_irq != entry->global_irq) { - acpi_fadt.sci_int = entry->global_irq; - irq = entry->global_irq; - break; - } - else - return; - } - + acpi_fadt.sci_int == entry->bus_irq) + goto found; + entry = (struct acpi_table_int_src_ovr *) ((unsigned long) entry + entry->header.length); } } + /* + * Although the ACPI spec says that the SCI should be level/low + * don't reprogram it unless there is an explicit MADT OVR entry + * instructing us to do so -- otherwise we break Tyan boards which + * have the SCI wired edge/high but no MADT OVR. + */ + return; + +found: + /* + * See the note at the end of ACPI 2.0b section + * 5.2.10.8 for what this is about. + */ + flags = entry->flags; + acpi_fadt.sci_int = entry->global_irq; + irq = entry->global_irq; ioapic = mp_find_ioapic(irq); ioapic_pin = irq - mp_ioapic_routing[ioapic].irq_start; - io_apic_set_pci_routing(ioapic, ioapic_pin, irq, 1, 1); // Active low, level triggered + io_apic_set_pci_routing(ioapic, ioapic_pin, irq, + (flags.trigger >> 1) , (flags.polarity >> 1)); } -#endif /* CONFIG_ACPI */ #ifdef CONFIG_ACPI_PCI @@ -1110,8 +1112,10 @@ } /* Don't set up the ACPI SCI because it's already set up */ - if (acpi_fadt.sci_int == irq) + if (acpi_fadt.sci_int == irq) { + entry->irq = irq; /*we still need to set entry's irq*/ continue; + } ioapic = mp_find_ioapic(irq); if (ioapic < 0) @@ -1154,5 +1158,5 @@ } #endif /*CONFIG_ACPI_PCI*/ -#endif /* CONFIG_X86_IO_APIC */ +#endif /*CONFIG_X86_IO_APIC && CONFIG_ACPI_INTERPRETER*/ #endif /*CONFIG_ACPI_BOOT*/ diff -Nru a/arch/i386/kernel/process.c b/arch/i386/kernel/process.c --- a/arch/i386/kernel/process.c Wed Oct 8 12:24:55 2003 +++ b/arch/i386/kernel/process.c Wed Oct 8 12:24:55 2003 @@ -76,10 +76,14 @@ hlt_counter++; } +EXPORT_SYMBOL(disable_hlt); + void enable_hlt(void) { hlt_counter--; } + +EXPORT_SYMBOL(enable_hlt); /* * We use this if we don't have any better diff -Nru a/arch/i386/kernel/reboot.c b/arch/i386/kernel/reboot.c --- a/arch/i386/kernel/reboot.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/reboot.c Wed Oct 8 12:24:56 2003 @@ -3,6 +3,7 @@ */ #include +#include #include #include #include @@ -276,13 +277,19 @@ machine_real_restart(jump_to_bios, sizeof(jump_to_bios)); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { if (pm_power_off) pm_power_off(); } + +EXPORT_SYMBOL(machine_power_off); diff -Nru a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c --- a/arch/i386/kernel/setup.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/setup.c Wed Oct 8 12:24:56 2003 @@ -64,10 +64,10 @@ unsigned long mmu_cr4_features; EXPORT_SYMBOL_GPL(mmu_cr4_features); -#ifdef CONFIG_ACPI - int acpi_disabled __initdata = 0; +#ifdef CONFIG_ACPI_INTERPRETER + int acpi_disabled = 0; #else - int acpi_disabled __initdata = 1; + int acpi_disabled = 1; #endif EXPORT_SYMBOL(acpi_disabled); diff -Nru a/arch/i386/kernel/smpboot.c b/arch/i386/kernel/smpboot.c --- a/arch/i386/kernel/smpboot.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/smpboot.c Wed Oct 8 12:24:56 2003 @@ -499,8 +499,8 @@ #ifdef CONFIG_NUMA /* which logical CPUs are on which nodes */ -cpumask_t node_2_cpu_mask[MAX_NR_NODES] = - { [0 ... MAX_NR_NODES-1] = CPU_MASK_NONE }; +cpumask_t node_2_cpu_mask[MAX_NUMNODES] = + { [0 ... MAX_NUMNODES-1] = CPU_MASK_NONE }; /* which node each logical CPU is on */ int cpu_2_node[NR_CPUS] = { [0 ... NR_CPUS-1] = 0 }; @@ -518,7 +518,7 @@ int node; printk("Unmapping cpu %d from all nodes\n", cpu); - for (node = 0; node < MAX_NR_NODES; node ++) + for (node = 0; node < MAX_NUMNODES; node ++) cpu_clear(cpu, node_2_cpu_mask[node]); cpu_2_node[cpu] = -1; } @@ -937,6 +937,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus) { int apicid, cpu, bit, kicked; + unsigned long bogosum = 0; /* * Setup boot CPU information @@ -1048,26 +1049,25 @@ /* * Allow the user to impress friends. */ - Dprintk("Before bogomips.\n"); - if (!cpucount) { - printk(KERN_ERR "Error: only one processor found.\n"); - } else { - unsigned long bogosum = 0; - for (cpu = 0; cpu < NR_CPUS; cpu++) - if (cpu_isset(cpu, cpu_callout_map)) - bogosum += cpu_data[cpu].loops_per_jiffy; - printk(KERN_INFO "Total of %d processors activated (%lu.%02lu BogoMIPS).\n", - cpucount+1, - bogosum/(500000/HZ), - (bogosum/(5000/HZ))%100); - Dprintk("Before bogocount - setting activated=1.\n"); - } + for (cpu = 0; cpu < NR_CPUS; cpu++) + if (cpu_isset(cpu, cpu_callout_map)) + bogosum += cpu_data[cpu].loops_per_jiffy; + printk(KERN_INFO + "Total of %d processors activated (%lu.%02lu BogoMIPS).\n", + cpucount+1, + bogosum/(500000/HZ), + (bogosum/(5000/HZ))%100); + + Dprintk("Before bogocount - setting activated=1.\n"); if (smp_b_stepping) printk(KERN_WARNING "WARNING: SMP operation may be unreliable with B stepping processors.\n"); - /* Don't taint if we are running SMP kernel on a single non-MP approved Athlon */ + /* + * Don't taint if we are running SMP kernel on a single non-MP + * approved Athlon + */ if (tainted & TAINT_UNSAFE_SMP) { if (cpucount) printk (KERN_INFO "WARNING: This combination of AMD processors is not suitable for SMP.\n"); diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c --- a/arch/i386/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -73,6 +73,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + unsigned long cpu_khz; /* Detected as we calibrate the TSC */ extern unsigned long wall_jiffies; @@ -115,6 +117,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, sec = tv->tv_sec; @@ -147,6 +151,8 @@ clock_was_set(); return 0; } + +EXPORT_SYMBOL(do_settimeofday); static int set_rtc_mmss(unsigned long nowtime) { diff -Nru a/arch/i386/kernel/timers/timer_cyclone.c b/arch/i386/kernel/timers/timer_cyclone.c --- a/arch/i386/kernel/timers/timer_cyclone.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/timers/timer_cyclone.c Wed Oct 8 12:24:57 2003 @@ -35,7 +35,7 @@ static u32 last_cyclone_low; static u32 last_cyclone_high; static unsigned long long monotonic_base; -static rwlock_t monotonic_lock = RW_LOCK_UNLOCKED; +static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED; /* helper macro to atomically read both cyclone counter registers */ #define read_cyclone_counter(low,high) \ @@ -51,7 +51,7 @@ int count; unsigned long long this_offset, last_offset; - write_lock(&monotonic_lock); + write_seqlock(&monotonic_lock); last_offset = ((unsigned long long)last_cyclone_high<<32)|last_cyclone_low; spin_lock(&i8253_lock); @@ -76,7 +76,7 @@ /* update the monotonic base value */ this_offset = ((unsigned long long)last_cyclone_high<<32)|last_cyclone_low; monotonic_base += (this_offset - last_offset) & CYCLONE_TIMER_MASK; - write_unlock(&monotonic_lock); + write_sequnlock(&monotonic_lock); /* calculate delay_at_last_interrupt */ count = ((LATCH-1) - count) * TICK_SIZE; @@ -117,12 +117,15 @@ u32 now_low, now_high; unsigned long long last_offset, this_offset, base; unsigned long long ret; + unsigned seq; /* atomically read monotonic base & last_offset */ - read_lock_irq(&monotonic_lock); - last_offset = ((unsigned long long)last_cyclone_high<<32)|last_cyclone_low; - base = monotonic_base; - read_unlock_irq(&monotonic_lock); + do { + seq = read_seqbegin(&monotonic_lock); + last_offset = ((unsigned long long)last_cyclone_high<<32)|last_cyclone_low; + base = monotonic_base; + } while (read_seqretry(&monotonic_lock, seq)); + /* Read the cyclone counter */ read_cyclone_counter(now_low,now_high); diff -Nru a/arch/i386/kernel/timers/timer_hpet.c b/arch/i386/kernel/timers/timer_hpet.c --- a/arch/i386/kernel/timers/timer_hpet.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/kernel/timers/timer_hpet.c Wed Oct 8 12:24:57 2003 @@ -24,7 +24,7 @@ static unsigned long last_tsc_low; /* lsb 32 bits of Time Stamp Counter */ static unsigned long last_tsc_high; /* msb 32 bits of Time Stamp Counter */ static unsigned long long monotonic_base; -static rwlock_t monotonic_lock = RW_LOCK_UNLOCKED; +static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED; /* convert from cycles(64bits) => nanoseconds (64bits) * basic equation: @@ -57,12 +57,14 @@ static unsigned long long monotonic_clock_hpet(void) { unsigned long long last_offset, this_offset, base; + unsigned seq; /* atomically read monotonic base & last_offset */ - read_lock_irq(&monotonic_lock); - last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low; - base = monotonic_base; - read_unlock_irq(&monotonic_lock); + do { + seq = read_seqbegin(&monotonic_lock); + last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low; + base = monotonic_base; + } while (read_seqretry(&monotonic_lock, seq)); /* Read the Time Stamp Counter */ rdtscll(this_offset); @@ -99,7 +101,7 @@ unsigned long long this_offset, last_offset; unsigned long offset; - write_lock(&monotonic_lock); + write_seqlock(&monotonic_lock); last_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low; rdtsc(last_tsc_low, last_tsc_high); @@ -113,7 +115,7 @@ /* update the monotonic base value */ this_offset = ((unsigned long long)last_tsc_high<<32)|last_tsc_low; monotonic_base += cycles_2_ns(this_offset - last_offset); - write_unlock(&monotonic_lock); + write_sequnlock(&monotonic_lock); } void delay_hpet(unsigned long loops) diff -Nru a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c --- a/arch/i386/kernel/traps.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/kernel/traps.c Wed Oct 8 12:24:56 2003 @@ -158,6 +158,8 @@ show_trace(current, &stack); } +EXPORT_SYMBOL(dump_stack); + void show_registers(struct pt_regs *regs) { int i; diff -Nru a/arch/i386/mach-visws/reboot.c b/arch/i386/mach-visws/reboot.c --- a/arch/i386/mach-visws/reboot.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/mach-visws/reboot.c Wed Oct 8 12:24:57 2003 @@ -1,4 +1,4 @@ - +#include #include #include #include @@ -24,6 +24,8 @@ outb(PIIX4_RESET_VAL, PIIX4_RESET_PORT); } +EXPORT_SYMBOL(machine_restart); + void machine_power_off(void) { unsigned short pm_status; @@ -43,6 +45,10 @@ outl(PIIX_SPECIAL_STOP, 0xCFC); } +EXPORT_SYMBOL(machine_power_off); + void machine_halt(void) { } + +EXPORT_SYMBOL(machine_halt); diff -Nru a/arch/i386/mach-voyager/voyager_basic.c b/arch/i386/mach-voyager/voyager_basic.c --- a/arch/i386/mach-voyager/voyager_basic.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/mach-voyager/voyager_basic.c Wed Oct 8 12:24:56 2003 @@ -13,6 +13,7 @@ */ #include +#include #include #include #include @@ -279,6 +280,8 @@ } } +EXPORT_SYMBOL(machine_restart); + void mca_nmi_hook(void) { @@ -314,8 +317,12 @@ machine_power_off(); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { if (pm_power_off) pm_power_off(); } + +EXPORT_SYMBOL(machine_power_off); diff -Nru a/arch/i386/mm/init.c b/arch/i386/mm/init.c --- a/arch/i386/mm/init.c Wed Oct 8 12:24:57 2003 +++ b/arch/i386/mm/init.c Wed Oct 8 12:24:57 2003 @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -189,6 +190,9 @@ #ifdef CONFIG_HIGHMEM pte_t *kmap_pte; pgprot_t kmap_prot; + +EXPORT_SYMBOL(kmap_prot); +EXPORT_SYMBOL(kmap_pte); #define kmap_get_fixmap_pte(vaddr) \ pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) diff -Nru a/arch/i386/mm/ioremap.c b/arch/i386/mm/ioremap.c --- a/arch/i386/mm/ioremap.c Wed Oct 8 12:24:56 2003 +++ b/arch/i386/mm/ioremap.c Wed Oct 8 12:24:56 2003 @@ -158,7 +158,7 @@ return NULL; area->phys_addr = phys_addr; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vunmap(addr); return NULL; } diff -Nru a/arch/ia64/ia32/ia32_ioctl.c b/arch/ia64/ia32/ia32_ioctl.c --- a/arch/ia64/ia32/ia32_ioctl.c Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/ia32/ia32_ioctl.c Wed Oct 8 12:24:57 2003 @@ -26,43 +26,11 @@ _ret; \ }) -#define P(i) ((void *)(unsigned long)(i)) - asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg); #define CODE #include "compat_ioctl.c" -#define VFAT_IOCTL_READDIR_BOTH32 _IOR('r', 1, struct linux32_dirent[2]) -#define VFAT_IOCTL_READDIR_SHORT32 _IOR('r', 2, struct linux32_dirent[2]) - -static long -put_dirent32 (struct dirent *d, struct linux32_dirent *d32) -{ - size_t namelen = strlen(d->d_name); - - return (put_user(d->d_ino, &d32->d_ino) - || put_user(d->d_off, &d32->d_off) - || put_user(d->d_reclen, &d32->d_reclen) - || copy_to_user(d32->d_name, d->d_name, namelen + 1)); -} - -static int vfat_ioctl32(unsigned fd, unsigned cmd, void *ptr) -{ - int ret; - mm_segment_t oldfs = get_fs(); - struct dirent d[2]; - - set_fs(KERNEL_DS); - ret = sys_ioctl(fd,cmd,(unsigned long)&d); - set_fs(oldfs); - if (!ret) { - ret |= put_dirent32(&d[0], (struct linux32_dirent *)ptr); - ret |= put_dirent32(&d[1], ((struct linux32_dirent *)ptr) + 1); - } - return ret; -} - typedef int (* ioctl32_handler_t)(unsigned int, unsigned int, unsigned long, struct file *); #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL((cmd),sys_ioctl) @@ -73,8 +41,6 @@ }; IOCTL_TABLE_START -HANDLE_IOCTL(VFAT_IOCTL_READDIR_BOTH32, vfat_ioctl32) -HANDLE_IOCTL(VFAT_IOCTL_READDIR_SHORT32, vfat_ioctl32) #define DECLARES #include "compat_ioctl.c" #include diff -Nru a/arch/ia64/ia32/ia32priv.h b/arch/ia64/ia32/ia32priv.h --- a/arch/ia64/ia32/ia32priv.h Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/ia32/ia32priv.h Wed Oct 8 12:24:57 2003 @@ -249,13 +249,6 @@ } _sifields; } siginfo_t32; -struct linux32_dirent { - u32 d_ino; - u32 d_off; - u16 d_reclen; - char d_name[256]; -}; - struct old_linux32_dirent { u32 d_ino; u32 d_offset; diff -Nru a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c --- a/arch/ia64/ia32/sys_ia32.c Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/ia32/sys_ia32.c Wed Oct 8 12:24:57 2003 @@ -707,8 +707,8 @@ } struct getdents32_callback { - struct linux32_dirent * current_dir; - struct linux32_dirent * previous; + struct compat_dirent * current_dir; + struct compat_dirent * previous; int count; int error; }; @@ -722,7 +722,7 @@ filldir32 (void *__buf, const char *name, int namlen, loff_t offset, ino_t ino, unsigned int d_type) { - struct linux32_dirent * dirent; + struct compat_dirent * dirent; struct getdents32_callback * buf = (struct getdents32_callback *) __buf; int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1, 4); @@ -748,10 +748,10 @@ } asmlinkage long -sys32_getdents (unsigned int fd, struct linux32_dirent *dirent, unsigned int count) +sys32_getdents (unsigned int fd, struct compat_dirent *dirent, unsigned int count) { struct file * file; - struct linux32_dirent * lastdirent; + struct compat_dirent * lastdirent; struct getdents32_callback buf; int error; diff -Nru a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c --- a/arch/ia64/kernel/acpi.c Wed Oct 8 12:24:56 2003 +++ b/arch/ia64/kernel/acpi.c Wed Oct 8 12:24:56 2003 @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -56,7 +57,7 @@ unsigned char acpi_kbd_controller_present = 1; -int acpi_disabled __initdata; /* XXX this shouldn't be needed---we can't boot without ACPI! */ +int acpi_disabled; /* XXX this shouldn't be needed---we can't boot without ACPI! */ const char * acpi_get_sysname (void) @@ -341,7 +342,7 @@ #define pxm_bit_test(bit) (test_bit(bit,(void *)pxm_flag)) /* maps to convert between proximity domain and logical node ID */ int __initdata pxm_to_nid_map[MAX_PXM_DOMAINS]; -int __initdata nid_to_pxm_map[NR_NODES]; +int __initdata nid_to_pxm_map[MAX_NUMNODES]; static struct acpi_table_slit __initdata *slit_table; /* diff -Nru a/arch/ia64/kernel/init_task.c b/arch/ia64/kernel/init_task.c --- a/arch/ia64/kernel/init_task.c Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/kernel/init_task.c Wed Oct 8 12:24:57 2003 @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -20,6 +21,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial task structure. * @@ -38,3 +41,5 @@ .task = INIT_TASK(init_task_mem.s.task), .thread_info = INIT_THREAD_INFO(init_task_mem.s.task) }}; + +EXPORT_SYMBOL(init_task); diff -Nru a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c --- a/arch/ia64/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -596,6 +597,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + /** * free_irq - free an interrupt * @irq: Interrupt line to free @@ -650,6 +653,8 @@ } } +EXPORT_SYMBOL(free_irq); + /* * IRQ autodetection code.. * @@ -743,6 +748,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + /** * probe_irq_mask - scan a bitmap of interrupt lines * @val: mask of interrupts to consider @@ -830,6 +837,8 @@ irq_found = -irq_found; return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); int setup_irq(unsigned int irq, struct irqaction * new) { diff -Nru a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c --- a/arch/ia64/kernel/process.c Wed Oct 8 12:24:56 2003 +++ b/arch/ia64/kernel/process.c Wed Oct 8 12:24:56 2003 @@ -82,6 +82,8 @@ show_stack(NULL, NULL); } +EXPORT_SYMBOL(dump_stack); + void show_regs (struct pt_regs *regs) { diff -Nru a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c --- a/arch/ia64/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/ia64/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -31,6 +32,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + #define TIME_KEEPER_ID 0 /* smp_processor_id() of time-keeper */ #ifdef CONFIG_IA64_DEBUG_IRQ @@ -125,6 +128,8 @@ return 0; } +EXPORT_SYMBOL(do_settimeofday); + void do_gettimeofday (struct timeval *tv) { @@ -184,6 +189,8 @@ tv->tv_sec = sec; tv->tv_usec = usec; } + +EXPORT_SYMBOL(do_gettimeofday); /* * The profiling function is SMP safe. (nothing can mess diff -Nru a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c --- a/arch/ia64/kernel/unaligned.c Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/kernel/unaligned.c Wed Oct 8 12:24:57 2003 @@ -1347,7 +1347,7 @@ * be holding locks... */ if (user_mode(regs)) - tty_write_message(current->tty, buf); + tty_write_message(process_tty(current), buf); buf[len-1] = '\0'; /* drop '\r' */ printk(KERN_WARNING "%s", buf); /* watch for command names containing %s */ } diff -Nru a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c --- a/arch/ia64/mm/discontig.c Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/mm/discontig.c Wed Oct 8 12:24:57 2003 @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -26,10 +25,10 @@ */ #define GRANULEROUNDUP(n) (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1)) -static struct ia64_node_data *node_data[NR_NODES]; -static long boot_pg_data[8*NR_NODES+sizeof(pg_data_t)] __initdata; -static pg_data_t *pg_data_ptr[NR_NODES] __initdata; -static bootmem_data_t bdata[NR_NODES][NR_BANKS_PER_NODE+1] __initdata; +static struct ia64_node_data *node_data[MAX_NUMNODES]; +static long boot_pg_data[8*MAX_NUMNODES+sizeof(pg_data_t)] __initdata; +static pg_data_t *pg_data_ptr[MAX_NUMNODES] __initdata; +static bootmem_data_t bdata[MAX_NUMNODES][NR_BANKS_PER_NODE+1] __initdata; /* * Return the compact node number of this cpu. Used prior to * setting up the cpu_data area. diff -Nru a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c --- a/arch/ia64/mm/numa.c Wed Oct 8 12:24:56 2003 +++ b/arch/ia64/mm/numa.c Wed Oct 8 12:24:56 2003 @@ -15,7 +15,6 @@ #include #include #include -#include #include /* @@ -29,7 +28,7 @@ * This is a matrix with "distances" between nodes, they should be * proportional to the memory access latency ratios. */ -u8 numa_slit[NR_NODES * NR_NODES]; +u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES]; /* Identify which cnode a physical address resides on */ int diff -Nru a/arch/ia64/sn/io/sn2/module.c b/arch/ia64/sn/io/sn2/module.c --- a/arch/ia64/sn/io/sn2/module.c Wed Oct 8 12:24:55 2003 +++ b/arch/ia64/sn/io/sn2/module.c Wed Oct 8 12:24:55 2003 @@ -166,7 +166,6 @@ { lboard_t *board; klmod_serial_num_t *comp; - char * bcopy(const char * src, char * dest, int count); char serial_number[16]; /* @@ -215,9 +214,9 @@ #endif if (comp->snum.snum_str[0] != '\0') { - bcopy(comp->snum.snum_str, - m->sys_snum, - MAX_SERIAL_NUM_SIZE); + memcpy(m->sys_snum, + comp->snum.snum_str, + MAX_SERIAL_NUM_SIZE); m->sys_snum_valid = 1; } } diff -Nru a/arch/ia64/sn/io/sn2/pic.c b/arch/ia64/sn/io/sn2/pic.c --- a/arch/ia64/sn/io/sn2/pic.c Wed Oct 8 12:24:57 2003 +++ b/arch/ia64/sn/io/sn2/pic.c Wed Oct 8 12:24:57 2003 @@ -29,8 +29,6 @@ #include #include -extern char *bcopy(const char * src, char * dest, int count); - #define PCI_BUS_NO_1 1 @@ -51,7 +49,7 @@ (arbitrary_info_t *)&pinv) == GRAPH_SUCCESS) { NEW(peer_pinv); - bcopy((const char *)pinv, (char *)peer_pinv, sizeof(inventory_t)); + memcpy(peer_pinv, pinv, sizeof(inventory_t)); if (hwgraph_info_add_LBL(peer_conn_v, INFO_LBL_INVENT, (arbitrary_info_t)peer_pinv) != GRAPH_SUCCESS) { DEL(peer_pinv); diff -Nru a/arch/m68k/Kconfig b/arch/m68k/Kconfig --- a/arch/m68k/Kconfig Wed Oct 8 12:24:57 2003 +++ b/arch/m68k/Kconfig Wed Oct 8 12:24:57 2003 @@ -87,7 +87,7 @@ config HADES bool "Hades support" - depends on ATARI + depends on ATARI && BROKEN help This option enables support for the Hades Atari clone. If you plan to use this kernel on a Hades, say Y here; otherwise say N. @@ -361,7 +361,7 @@ config STRAM_SWAP bool "Support for ST-RAM as swap space" - depends on ATARI + depends on ATARI && BROKEN ---help--- Some Atari 68k macines (including the 520STF and 1020STE) divide their addressible memory into ST and TT sections. The TT section @@ -961,7 +961,7 @@ config SERIAL167 bool "CD2401 support for MVME166/7 serial ports" - depends on MVME16x + depends on MVME16x && BROKEN help This is the driver for the serial ports on the Motorola MVME166, 167, and 172 boards. Everyone using one of these boards should say diff -Nru a/arch/m68k/Makefile b/arch/m68k/Makefile --- a/arch/m68k/Makefile Wed Oct 8 12:24:57 2003 +++ b/arch/m68k/Makefile Wed Oct 8 12:24:57 2003 @@ -76,6 +76,8 @@ core-$(CONFIG_M68060) += arch/m68k/ifpsp060/ core-$(CONFIG_M68KFPU_EMU) += arch/m68k/math-emu/ +all: zImage + lilo: vmlinux if [ -f $(INSTALL_PATH)/vmlinux ]; then mv -f $(INSTALL_PATH)/vmlinux $(INSTALL_PATH)/vmlinux.old; fi if [ -f $(INSTALL_PATH)/System.map ]; then mv -f $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi diff -Nru a/arch/m68k/atari/stram.c b/arch/m68k/atari/stram.c --- a/arch/m68k/atari/stram.c Wed Oct 8 12:24:57 2003 +++ b/arch/m68k/atari/stram.c Wed Oct 8 12:24:57 2003 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include diff -Nru a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c --- a/arch/m68k/kernel/ints.c Wed Oct 8 12:24:56 2003 +++ b/arch/m68k/kernel/ints.c Wed Oct 8 12:24:56 2003 @@ -26,6 +26,7 @@ */ #include +#include #include #include #include @@ -127,11 +128,15 @@ return mach_request_irq(irq, handler, flags, devname, dev_id); } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { mach_free_irq(irq, dev_id); } +EXPORT_SYMBOL(free_irq); + int sys_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) @@ -195,6 +200,8 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off (unsigned long irqs) { #ifdef CONFIG_Q40 @@ -203,6 +210,8 @@ #endif return 0; } + +EXPORT_SYMBOL(probe_irq_off); static void dummy_enable_irq(unsigned int irq) { diff -Nru a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c --- a/arch/m68k/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/m68k/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -45,6 +46,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + union thread_union init_thread_union __attribute__((section(".data.init_task"), aligned(THREAD_SIZE))) = { INIT_THREAD_INFO(init_task) }; @@ -52,6 +55,7 @@ /* initial task structure */ struct task_struct init_task = INIT_TASK(init_task); +EXPORT_SYMBOL(init_task); asmlinkage void ret_from_fork(void); @@ -111,6 +115,8 @@ for (;;); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { if (mach_halt) @@ -118,12 +124,16 @@ for (;;); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { if (mach_power_off) mach_power_off(); for (;;); } + +EXPORT_SYMBOL(machine_power_off); void show_regs(struct pt_regs * regs) { diff -Nru a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c --- a/arch/m68k/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/m68k/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -12,6 +12,7 @@ #include /* CONFIG_HEARTBEAT */ #include +#include #include #include #include @@ -28,6 +29,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + static inline int set_rtc_mmss(unsigned long nowtime) { if (mach_set_clock_mmss) @@ -139,6 +142,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, sec = tv->tv_sec; @@ -171,3 +176,14 @@ write_sequnlock_irq(&xtime_lock); return 0; } + +EXPORT_SYMBOL(do_settimeofday); + +/* + * Scheduler clock - returns current time in ns units. + */ +unsigned long long sched_clock(void) +{ + return (unsigned long long)jiffies*(1000000000/HZ); +} + diff -Nru a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c --- a/arch/m68k/kernel/traps.c Wed Oct 8 12:24:57 2003 +++ b/arch/m68k/kernel/traps.c Wed Oct 8 12:24:57 2003 @@ -953,6 +953,8 @@ show_trace(&stack); } +EXPORT_SYMBOL(dump_stack); + void bad_super_trap (struct frame *fp) { console_verbose(); diff -Nru a/arch/m68k/q40/q40ints.c b/arch/m68k/q40/q40ints.c --- a/arch/m68k/q40/q40ints.c Wed Oct 8 12:24:57 2003 +++ b/arch/m68k/q40/q40ints.c Wed Oct 8 12:24:57 2003 @@ -200,7 +200,9 @@ irqreturn_t q40_process_int (int level, struct pt_regs *fp) { - printk("unexpected interrupt %x\n",level); + printk("unexpected interrupt vec=%x, pc=%lx, d0=%lx, d0_orig=%lx, d1=%lx, d2=%lx\n", + level, fp->pc, fp->d0, fp->orig_d0, fp->d1, fp->d2); + printk("\tIIRQ_REG = %x, EIRQ_REG = %x\n",master_inb(IIRQ_REG),master_inb(EIRQ_REG)); return IRQ_HANDLED; } @@ -378,7 +380,7 @@ /*printk("reenabling irq %d\n",irq); */ #endif } -// used to do 'goto repeat;' her, this delayed bh processing too long +// used to do 'goto repeat;' here, this delayed bh processing too long return IRQ_HANDLED; } } @@ -387,6 +389,7 @@ } iirq: mir=master_inb(IIRQ_REG); + /* should test whether keyboard irq is really enabled, doing it in defhand */ if (mir&Q40_IRQ_KEYB_MASK) { irq_tab[Q40_IRQ_KEYBOARD].count++; irq_tab[Q40_IRQ_KEYBOARD].handler(Q40_IRQ_KEYBOARD,irq_tab[Q40_IRQ_KEYBOARD].dev_id,fp); @@ -413,7 +416,9 @@ static irqreturn_t q40_defhand (int irq, void *dev_id, struct pt_regs *fp) { - printk ("Unknown q40 interrupt 0x%02x\n", irq); + if (irq!=Q40_IRQ_KEYBOARD) + printk ("Unknown q40 interrupt %d\n", irq); + else master_outb(-1,KEYBOARD_UNLOCK_REG); return IRQ_NONE; } static irqreturn_t sys_default_handler(int lev, void *dev_id, struct pt_regs *regs) diff -Nru a/arch/m68k/sun3/config.c b/arch/m68k/sun3/config.c --- a/arch/m68k/sun3/config.c Wed Oct 8 12:24:57 2003 +++ b/arch/m68k/sun3/config.c Wed Oct 8 12:24:57 2003 @@ -129,7 +129,7 @@ high_memory = (void *)memory_end; availmem = memory_start; - availmem += init_bootmem(start_page, num_pages); + availmem += init_bootmem_node(NODE_DATA(0), start_page, 0, num_pages); availmem = (availmem + (PAGE_SIZE-1)) & PAGE_MASK; free_bootmem(__pa(availmem), memory_end - (availmem)); diff -Nru a/arch/m68knommu/kernel/init_task.c b/arch/m68knommu/kernel/init_task.c --- a/arch/m68knommu/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/m68knommu/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -2,6 +2,7 @@ * linux/arch/m68knommu/kernel/init_task.c */ #include +#include #include #include #include @@ -16,6 +17,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial task structure. * @@ -24,6 +27,7 @@ __asm__(".align 4"); struct task_struct init_task = INIT_TASK(init_task); +EXPORT_SYMBOL(init_task); /* * Initial thread structure. diff -Nru a/arch/m68knommu/kernel/process.c b/arch/m68knommu/kernel/process.c --- a/arch/m68knommu/kernel/process.c Wed Oct 8 12:24:56 2003 +++ b/arch/m68knommu/kernel/process.c Wed Oct 8 12:24:56 2003 @@ -14,6 +14,7 @@ */ #include +#include #include #include #include @@ -72,6 +73,8 @@ for (;;); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { if (mach_halt) @@ -79,12 +82,16 @@ for (;;); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { if (mach_power_off) mach_power_off(); for (;;); } + +EXPORT_SYMBOL(machine_power_off); void show_regs(struct pt_regs * regs) { diff -Nru a/arch/m68knommu/kernel/time.c b/arch/m68knommu/kernel/time.c --- a/arch/m68knommu/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/m68knommu/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -28,6 +29,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + extern unsigned long wall_jiffies; @@ -164,6 +167,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, sec = tv->tv_sec; @@ -196,3 +201,5 @@ write_sequnlock_irq(&xtime_lock); return 0; } + +EXPORT_SYMBOL(do_settimeofday); diff -Nru a/arch/m68knommu/lib/checksum.c b/arch/m68knommu/lib/checksum.c --- a/arch/m68knommu/lib/checksum.c Wed Oct 8 12:24:57 2003 +++ b/arch/m68knommu/lib/checksum.c Wed Oct 8 12:24:57 2003 @@ -32,6 +32,7 @@ of the assembly has to go. */ #include +#include static inline unsigned short from32to16(unsigned long x) { @@ -122,6 +123,8 @@ result += 1; return result; } + +EXPORT_SYMBOL(csum_partial); /* * this routine is used for miscellaneous IP-like checksums, mainly diff -Nru a/arch/m68knommu/platform/5307/ints.c b/arch/m68knommu/platform/5307/ints.c --- a/arch/m68knommu/platform/5307/ints.c Wed Oct 8 12:24:56 2003 +++ b/arch/m68knommu/platform/5307/ints.c Wed Oct 8 12:24:56 2003 @@ -15,6 +15,7 @@ * for more details. */ +#include #include #include #include @@ -136,6 +137,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { if (irq >= NR_IRQS) { @@ -162,6 +165,8 @@ irq_list[irq].devname = NULL; } +EXPORT_SYMBOL(free_irq); + int sys_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), @@ -222,10 +227,14 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off (unsigned long irqs) { return 0; } + +EXPORT_SYMBOL(probe_irq_off); asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) { diff -Nru a/arch/m68knommu/platform/68328/ints.c b/arch/m68knommu/platform/68328/ints.c --- a/arch/m68knommu/platform/68328/ints.c Wed Oct 8 12:24:56 2003 +++ b/arch/m68knommu/platform/68328/ints.c Wed Oct 8 12:24:56 2003 @@ -9,6 +9,7 @@ * Copyright 1999 D. Jeff Dionne */ +#include #include #include #include @@ -172,6 +173,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { if (irq >= NR_IRQS) { @@ -190,6 +193,8 @@ IMR |= 1< +#include #include #include #include @@ -216,6 +217,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { if (irq >= INTERNAL_IRQS) { @@ -233,6 +236,8 @@ *(volatile unsigned long *)0xfffff304 |= 1< #include #include +#include #include #include #include @@ -337,6 +338,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { struct irqaction * action, **p; @@ -361,17 +364,23 @@ printk("Trying to free free IRQ%d\n",irq); } +EXPORT_SYMBOL(free_irq); + unsigned long probe_irq_on (void) { /* TODO */ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off (unsigned long irqs) { /* TODO */ return 0; } + +EXPORT_SYMBOL(probe_irq_off); static void write_err_interrupt(int irq, void *dev_id, struct pt_regs * regs) diff -Nru a/arch/mips/baget/time.c b/arch/mips/baget/time.c --- a/arch/mips/baget/time.c Wed Oct 8 12:24:55 2003 +++ b/arch/mips/baget/time.c Wed Oct 8 12:24:55 2003 @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -87,6 +88,8 @@ } while (read_seqretry(&xtime_lock, seq)); } +EXPORT_SYMBOL(do_gettimeofday); + void do_settimeofday(struct timeval *tv) { write_seqlock_irq(&xtime_lock); @@ -98,3 +101,5 @@ time_esterror = NTP_PHASE_LIMIT; write_sequnlock_irq(&xtime_lock); } + +EXPORT_SYMBOL(do_settimeofday); diff -Nru a/arch/mips/dec/time.c b/arch/mips/dec/time.c --- a/arch/mips/dec/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/mips/dec/time.c Wed Oct 8 12:24:57 2003 @@ -9,6 +9,7 @@ * */ #include +#include #include #include #include @@ -238,6 +239,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + void do_settimeofday(struct timeval *tv) { write_seqlock_irq(&xtime_lock); @@ -263,6 +266,8 @@ time_esterror = NTP_PHASE_LIMIT; write_sequnlock_irq(&xtime_lock); } + +EXPORT_SYMBOL(do_settimeofday); /* * In order to set the CMOS clock precisely, set_rtc_mmss has to be diff -Nru a/arch/mips/galileo-boards/ev96100/time.c b/arch/mips/galileo-boards/ev96100/time.c --- a/arch/mips/galileo-boards/ev96100/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/mips/galileo-boards/ev96100/time.c Wed Oct 8 12:24:56 2003 @@ -34,6 +34,7 @@ */ #include #include +#include #include #include @@ -222,6 +223,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + void do_settimeofday(struct timeval *tv) { write_seqlock_irq(&xtime_lock); @@ -247,6 +250,8 @@ time_esterror = NTP_PHASE_LIMIT; write_sequnlock_irq(&xtime_lock); } + +EXPORT_SYMBOL(do_settimeofday); /* * There are a lot of conceptually broken versions of the MIPS timer interrupt diff -Nru a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c --- a/arch/mips/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/mips/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -12,6 +13,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -32,3 +35,5 @@ * All other task structs will be allocated on slabs in fork.c */ struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_task); diff -Nru a/arch/mips/kernel/irq.c b/arch/mips/kernel/irq.c --- a/arch/mips/kernel/irq.c Wed Oct 8 12:24:55 2003 +++ b/arch/mips/kernel/irq.c Wed Oct 8 12:24:55 2003 @@ -494,6 +494,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + /** * free_irq - free an interrupt * @irq: Interrupt line to free @@ -548,6 +550,8 @@ } } +EXPORT_SYMBOL(free_irq); + /* * IRQ autodetection code.. * @@ -641,6 +645,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + /* * Return a mask of triggered interrupts (this * can handle only legacy ISA interrupts). @@ -738,6 +744,8 @@ irq_found = -irq_found; return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); /* this was setup_x86_irq but it seems pretty generic */ int setup_irq(unsigned int irq, struct irqaction * new) diff -Nru a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c --- a/arch/mips/kernel/linux32.c Wed Oct 8 12:24:57 2003 +++ b/arch/mips/kernel/linux32.c Wed Oct 8 12:24:57 2003 @@ -79,8 +79,8 @@ tmp.st_ino = stat->ino; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; - SET_STAT_UID(tmp, stat->uid); - SET_STAT_GID(tmp, stat->gid); + SET_UID(tmp.st_uid, stat->uid); + SET_GID(tmp.st_gid, stat->gid); tmp.st_rdev = new_encode_dev(stat->rdev); tmp.st_size = stat->size; tmp.st_atime = stat->atime.tv_sec; diff -Nru a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c --- a/arch/mips/kernel/reset.c Wed Oct 8 12:24:57 2003 +++ b/arch/mips/kernel/reset.c Wed Oct 8 12:24:57 2003 @@ -7,6 +7,7 @@ * Copyright (C) 2001 MIPS Technologies, Inc. */ #include +#include #include #include #include @@ -25,12 +26,18 @@ _machine_restart(command); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { _machine_halt(); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { _machine_power_off(); } + +EXPORT_SYMBOL(machine_power_off); diff -Nru a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c --- a/arch/mips/kernel/smp.c Wed Oct 8 12:24:56 2003 +++ b/arch/mips/kernel/smp.c Wed Oct 8 12:24:56 2003 @@ -48,6 +48,8 @@ int __cpu_number_map[NR_CPUS]; int __cpu_logical_map[NR_CPUS]; +EXPORT_SYMBOL(cpu_online_map); + /* These are defined by the board-specific code. */ /* diff -Nru a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c --- a/arch/mips/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/mips/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -39,6 +39,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + /* * forward reference */ @@ -99,6 +101,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, sec = tv->tv_sec; @@ -132,6 +136,7 @@ return 0; } +EXPORT_SYMBOL(do_settimeofday); /* * Gettimeoffset routines. These routines returns the time duration diff -Nru a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c --- a/arch/mips/kernel/traps.c Wed Oct 8 12:24:56 2003 +++ b/arch/mips/kernel/traps.c Wed Oct 8 12:24:56 2003 @@ -141,6 +141,8 @@ show_trace(current, &stack); } +EXPORT_SYMBOL(dump_stack); + void show_code(unsigned int *pc) { long i; diff -Nru a/arch/mips/mm/ioremap.c b/arch/mips/mm/ioremap.c --- a/arch/mips/mm/ioremap.c Wed Oct 8 12:24:56 2003 +++ b/arch/mips/mm/ioremap.c Wed Oct 8 12:24:56 2003 @@ -162,7 +162,7 @@ if (!area) return NULL; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vunmap(addr); return NULL; } diff -Nru a/arch/mips/mm-32/init.c b/arch/mips/mm-32/init.c --- a/arch/mips/mm-32/init.c Wed Oct 8 12:24:57 2003 +++ b/arch/mips/mm-32/init.c Wed Oct 8 12:24:57 2003 @@ -10,6 +10,7 @@ */ #include #include +#include #include #include #include @@ -80,6 +81,9 @@ #ifdef CONFIG_HIGHMEM pte_t *kmap_pte; pgprot_t kmap_prot; + +EXPORT_SYMBOL(kmap_prot); +EXPORT_SYMBOL(kmap_pte); #define kmap_get_fixmap_pte(vaddr) \ pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) diff -Nru a/arch/mips/mm-64/init.c b/arch/mips/mm-64/init.c --- a/arch/mips/mm-64/init.c Wed Oct 8 12:24:55 2003 +++ b/arch/mips/mm-64/init.c Wed Oct 8 12:24:55 2003 @@ -10,6 +10,7 @@ */ #include #include +#include #include #include #include @@ -80,6 +81,9 @@ #ifdef CONFIG_HIGHMEM pte_t *kmap_pte; pgprot_t kmap_prot; + +EXPORT_SYMBOL(kmap_prot); +EXPORT_SYMBOL(kmap_pte); #define kmap_get_fixmap_pte(vaddr) \ pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) diff -Nru a/arch/parisc/Kconfig b/arch/parisc/Kconfig --- a/arch/parisc/Kconfig Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/Kconfig Wed Oct 8 12:24:57 2003 @@ -150,6 +150,7 @@ config HPUX bool "Support for HP-UX binaries" + depends on !PARISC64 config NR_CPUS int "Maximum number of CPUs (2-32)" @@ -189,6 +190,8 @@ #source drivers/ieee1394/Kconfig #source drivers/message/i2o/Kconfig + +source "net/Kconfig" #source "drivers/isdn/Kconfig" diff -Nru a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c --- a/arch/parisc/kernel/asm-offsets.c Wed Oct 8 12:24:55 2003 +++ b/arch/parisc/kernel/asm-offsets.c Wed Oct 8 12:24:55 2003 @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -248,6 +249,9 @@ DEFINE(DTLB_OFF_STRIDE, offsetof(struct pdc_cache_info, dt_off_stride)); DEFINE(DTLB_OFF_COUNT, offsetof(struct pdc_cache_info, dt_off_count)); DEFINE(DTLB_LOOP, offsetof(struct pdc_cache_info, dt_loop)); + BLANK(); + DEFINE(PA_BLOCKSTEP_BIT, 31-PT_BLOCKSTEP_BIT); + DEFINE(PA_SINGLESTEP_BIT, 31-PT_SINGLESTEP_BIT); BLANK(); return 0; } diff -Nru a/arch/parisc/kernel/binfmt_elf32.c b/arch/parisc/kernel/binfmt_elf32.c --- a/arch/parisc/kernel/binfmt_elf32.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/kernel/binfmt_elf32.c Wed Oct 8 12:24:56 2003 @@ -88,7 +88,9 @@ */ #define SET_PERSONALITY(ex, ibcs2) \ - current->personality = PER_LINUX_32BIT + current->personality = PER_LINUX32; \ + current->thread.map_base = DEFAULT_MAP_BASE32; \ + current->thread.task_size = DEFAULT_TASK_SIZE32 \ #define jiffies_to_timeval jiffies_to_compat_timeval static __inline__ void @@ -99,3 +101,25 @@ } #include "../../../fs/binfmt_elf.c" + +/* Set up a separate execution domain for ELF32 binaries running + * on an ELF64 kernel */ + +static struct exec_domain parisc32_exec_domain = { + .name = "Linux/ELF32", + .pers_low = PER_LINUX32, + .pers_high = PER_LINUX32, +}; + +static int __init parisc32_exec_init(void) +{ + /* steal the identity signal mappings from the default domain */ + parisc32_exec_domain.signal_map = default_exec_domain.signal_map; + parisc32_exec_domain.signal_invmap = default_exec_domain.signal_invmap; + + register_exec_domain(&parisc32_exec_domain); + + return 0; +} + +__initcall(parisc32_exec_init); diff -Nru a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c --- a/arch/parisc/kernel/cache.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/kernel/cache.c Wed Oct 8 12:24:56 2003 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ int split_tlb; int dcache_stride; int icache_stride; +EXPORT_SYMBOL(dcache_stride); struct pdc_cache_info cache_info; #ifndef CONFIG_PA20 @@ -49,6 +51,7 @@ flush_instruction_cache_local(); flush_data_cache_local(); } +EXPORT_SYMBOL(flush_cache_all_local); /* flushes EVERYTHING (tlb & cache) */ @@ -58,6 +61,7 @@ flush_cache_all(); flush_tlb_all(); } +EXPORT_SYMBOL(flush_all_caches); void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) @@ -289,3 +293,4 @@ } } +EXPORT_SYMBOL(__flush_dcache_page); diff -Nru a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c --- a/arch/parisc/kernel/drivers.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/drivers.c Wed Oct 8 12:24:57 2003 @@ -28,6 +28,7 @@ /* See comments in include/asm-parisc/pci.h */ struct hppa_dma_ops *hppa_dma_ops; +EXPORT_SYMBOL(hppa_dma_ops); static struct parisc_device root; @@ -155,6 +156,7 @@ return driver_register(&driver->drv); } +EXPORT_SYMBOL(register_parisc_driver); /** * count_parisc_driver - count # of devices this driver would match @@ -187,6 +189,7 @@ driver_unregister(&driver->drv); return 0; } +EXPORT_SYMBOL(unregister_parisc_driver); static struct parisc_device *find_device_by_addr(unsigned long hpa) { @@ -257,7 +260,7 @@ path.mod = dev->hw_path; return print_hwpath(&path, output); } - +EXPORT_SYMBOL(print_pa_hwpath); #if defined(CONFIG_PCI) || defined(CONFIG_ISA) /** @@ -289,6 +292,7 @@ padev = padev->parent; } } +EXPORT_SYMBOL(get_pci_node_path); /** * print_pci_hwpath - Returns hardware path for PCI devices @@ -306,6 +310,8 @@ get_pci_node_path(dev, &path); return print_hwpath(&path, output); } +EXPORT_SYMBOL(print_pci_hwpath); + #endif /* defined(CONFIG_PCI) || defined(CONFIG_ISA) */ diff -Nru a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S --- a/arch/parisc/kernel/entry.S Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/kernel/entry.S Wed Oct 8 12:24:56 2003 @@ -2225,18 +2225,23 @@ LDREG TI_TASK(%r1),%r1 STREG %r28,TASK_PT_GR28(%r1) - /* Save other hpux returns if personality is PER_HPUX */ +#ifdef CONFIG_HPUX /* cannot be easily included */ #define PER_HPUX 0x10 LDREG TASK_PERSONALITY(%r1),%r19 -#warning the ldo+CMPIB could probably be done better but 0x10 i soutside of range of CMPIB + + /* We can't use "CMPIB<> PER_HPUX" since "im5" field is sign extended */ ldo -PER_HPUX(%r19), %r19 CMPIB<>,n 0,%r19,1f + + /* Save other hpux returns if personality is PER_HPUX */ STREG %r22,TASK_PT_GR22(%r1) STREG %r29,TASK_PT_GR29(%r1) 1: +#endif /* CONFIG_HPUX */ + /* Seems to me that dp could be wrong here, if the syscall involved * calling a module, and nothing got round to restoring dp on return. */ @@ -2315,18 +2320,16 @@ depi 3,31,2,%r31 /* ensure return to user mode. */ #ifdef __LP64__ - /* Since we are returning to a 32 bit user process, we always - * clear the W bit. This means that the be (and mtsp) gets - * executed in narrow mode, but that is OK, since we are - * returning to a 32 bit process. When we support 64 bit processes - * we won't clear the W bit, so the be will run in wide mode. - */ - - be 0(%sr3,%r31) /* return to user space */ + /* decide whether to reset the wide mode bit + * + * For a syscall, the W bit is stored in the lowest bit + * of sp. Extract it and reset W if it is zero */ + extrd,u,*<> %r30,63,1,%r1 rsm PSW_SM_W, %r0 -#else - be,n 0(%sr3,%r31) /* return to user space */ + /* now reset the lowest bit of sp if it was set */ + xor %r30,%r1,%r30 #endif + be,n 0(%sr3,%r31) /* return to user space */ /* We have to return via an RFI, so that PSW T and R bits can be set * appropriately. @@ -2340,12 +2343,19 @@ LDREG TASK_PT_PSW(%r1),%r2 /* Get old PSW */ ldi 0x0b,%r20 /* Create new PSW */ depi -1,13,1,%r20 /* C, Q, D, and I bits */ - bb,>=,n %r19,15,try_tbit /* PT_SINGLESTEP */ + + /* The values of PA_SINGLESTEP_BIT and PA_BLOCKSTEP_BIT are + * set in include/linux/ptrace.h and converted to PA bitmap + * numbers in asm-offsets.c */ + + /* if ((%r19.PA_SINGLESTEP_BIT)) { %r20.27=1} */ + extru,= %r19,PA_SINGLESTEP_BIT,1,%r0 depi -1,27,1,%r20 /* R bit */ -try_tbit: - bb,>=,n %r19,14,psw_setup /* PT_BLOCKSTEP, see ptrace.c */ + + /* if ((%r19.PA_BLOCKSTEP_BIT)) { %r20.7=1} */ + extru,= %r19,PA_BLOCKSTEP_BIT,1,%r0 depi -1,7,1,%r20 /* T bit */ -psw_setup: + STREG %r20,TASK_PT_PSW(%r1) /* Always store space registers, since sr3 can be changed (e.g. fork) */ diff -Nru a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c --- a/arch/parisc/kernel/firmware.c Wed Oct 8 12:24:55 2003 +++ b/arch/parisc/kernel/firmware.c Wed Oct 8 12:24:55 2003 @@ -41,19 +41,20 @@ * prumpf 991016 */ +#include + +#include +#include #include +#include #include #include -#include -#include #include #include #include #include /* for boot_cpu_data */ -#include - static spinlock_t pdc_lock = SPIN_LOCK_UNLOCKED; static unsigned long pdc_result[32] __attribute__ ((aligned (8))); static unsigned long pdc_result2[32] __attribute__ ((aligned (8))); @@ -151,6 +152,7 @@ return retval; } +EXPORT_SYMBOL(pdc_add_valid); /** * pdc_chassis_info - Return chassis information. @@ -264,6 +266,7 @@ return retval; } +EXPORT_SYMBOL(pdc_iodc_read); /** * pdc_system_map_find_mods - Locate unarchitected modules. @@ -518,6 +521,7 @@ return retval; } +EXPORT_SYMBOL(pdc_lan_station_id); /** @@ -594,6 +598,7 @@ spin_unlock_irq(&pdc_lock); return retval >= PDC_OK; } +EXPORT_SYMBOL(pdc_get_initiator); /** @@ -660,6 +665,7 @@ return retval; } +EXPORT_SYMBOL(pdc_tod_read); /** * pdc_tod_set - Set the Time-Of-Day clock. @@ -678,6 +684,7 @@ return retval; } +EXPORT_SYMBOL(pdc_tod_set); #ifdef __LP64__ int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr, @@ -772,20 +779,34 @@ } /* - * pdc_suspend_usb - Stop USB controller + * pdc_io_reset - Hack to avoid overlapping range registers of Bridges devices. + * Primarily a problem on T600 (which parisc-linux doesn't support) but + * who knows what other platform firmware might do with this OS "hook". + */ +void pdc_io_reset(void) +{ + spin_lock_irq(&pdc_lock); + mem_pdc_call(PDC_IO, PDC_IO_RESET, 0); + spin_unlock_irq(&pdc_lock); +} + +/* + * pdc_io_reset_devices - Hack to Stop USB controller * * If PDC used the usb controller, the usb controller * is still running and will crash the machines during iommu * setup, because of still running DMA. This PDC call - * stops the USB controller + * stops the USB controller. + * Normally called after calling pdc_io_reset(). */ -void pdc_suspend_usb(void) +void pdc_io_reset_devices(void) { spin_lock_irq(&pdc_lock); - mem_pdc_call(PDC_IO, PDC_IO_SUSPEND_USB, 0); + mem_pdc_call(PDC_IO, PDC_IO_RESET_DEVICES, 0); spin_unlock_irq(&pdc_lock); } + /** * pdc_iodc_putc - Console character print using IODC. * @c: the character to output. @@ -905,6 +926,7 @@ return retval; } +EXPORT_SYMBOL(pdc_sti_call); #ifdef __LP64__ /** diff -Nru a/arch/parisc/kernel/init_task.c b/arch/parisc/kernel/init_task.c --- a/arch/parisc/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -13,6 +14,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial task structure. * @@ -36,5 +39,7 @@ * * All other task structs will be allocated on slabs in fork.c */ +EXPORT_SYMBOL(init_task); + __asm__(".data"); struct task_struct init_task = INIT_TASK(init_task); diff -Nru a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c --- a/arch/parisc/kernel/inventory.c Wed Oct 8 12:24:55 2003 +++ b/arch/parisc/kernel/inventory.c Wed Oct 8 12:24:55 2003 @@ -526,12 +526,14 @@ int i; long status = PDC_OK; +#if defined(CONFIG_IOMMU_SBA) && defined(CONFIG_SUPERIO) /* - * first stop the usb controller, otherwise the machine - * might crash during iommu setup + * Stop the suckyio usb controller on Astro based systems. + * Otherwise the machine might crash during iommu setup. */ -#warning We still probably need to worry about USB here, but how? - /* pdc_suspend_usb(); */ + pdc_io_reset(); + pdc_io_reset_devices(); +#endif for (i = 0; status != PDC_BAD_PROC && status != PDC_NE_MOD; i++) { struct parisc_device *dev; diff -Nru a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c --- a/arch/parisc/kernel/irq.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/kernel/irq.c Wed Oct 8 12:24:56 2003 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -193,6 +194,7 @@ else BUG(); } +EXPORT_SYMBOL(disable_irq); void enable_irq(int irq) { @@ -208,6 +210,7 @@ else BUG(); } +EXPORT_SYMBOL(enable_irq); int show_interrupts(struct seq_file *p, void *v) { @@ -650,6 +653,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { struct irqaction *action, **p; @@ -692,12 +697,15 @@ printk(KERN_ERR "Trying to free free IRQ%d\n",irq); } +EXPORT_SYMBOL(free_irq); + #ifdef CONFIG_SMP void synchronize_irq(unsigned int irqnum) { while (in_irq()) ; } +EXPORT_SYMBOL(synchronize_irq); #endif @@ -784,6 +792,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + /* * Return the one interrupt that triggered (this can * handle any interrupt source). @@ -843,10 +853,13 @@ return irq_found; } +EXPORT_SYMBOL(probe_irq_off); + unsigned int probe_irq_mask(unsigned long irqs) { return 0; } +EXPORT_SYMBOL(probe_irq_mask); void __init init_IRQ(void) { diff -Nru a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c --- a/arch/parisc/kernel/module.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/module.c Wed Oct 8 12:24:57 2003 @@ -73,10 +73,7 @@ Elf32_Addr addr; }; -struct fdesc_entry { - Elf32_Addr addr; - Elf32_Addr gp; -}; +#define Elf_Fdesc Elf32_Fdesc struct stub_entry { Elf32_Word insns[2]; /* each stub entry has two insns */ @@ -86,11 +83,7 @@ Elf64_Addr addr; }; -struct fdesc_entry { - Elf64_Addr dummy[2]; - Elf64_Addr addr; - Elf64_Addr gp; -}; +#define Elf_Fdesc Elf64_Fdesc struct stub_entry { Elf64_Word insns[4]; /* each stub entry has four insns */ @@ -276,7 +269,7 @@ me->core_size = ALIGN(me->core_size, 16); me->arch.fdesc_offset = me->core_size; - me->core_size += fdescs * sizeof(struct fdesc_entry); + me->core_size += fdescs * sizeof(Elf_Fdesc); me->core_size = ALIGN(me->core_size, 16); me->arch.stub_offset = me->core_size; @@ -322,7 +315,7 @@ #ifdef __LP64__ static Elf_Addr get_fdesc(struct module *me, unsigned long value) { - struct fdesc_entry *fdesc = me->module_core + me->arch.fdesc_offset; + Elf_Fdesc *fdesc = me->module_core + me->arch.fdesc_offset; if (!value) { printk(KERN_ERR "%s: zero OPD requested!\n", me->name); @@ -664,7 +657,7 @@ *loc64 = get_fdesc(me, val+addend); DEBUGP("FDESC for %s at %p points to %lx\n", strtab + sym->st_name, *loc64, - ((struct fdesc_entry *)*loc64)->addr); + ((Elf_Fdesc *)*loc64)->addr); } else { /* if the symbol is not local to this * module then val+addend is a pointer @@ -696,10 +689,10 @@ Elf_Sym *newptr, *oldptr; Elf_Shdr *symhdr = NULL; #ifdef DEBUG - struct fdesc_entry *entry; + Elf_Fdesc *entry; u32 *addr; - entry = (struct fdesc_entry *)me->init; + entry = (Elf_Fdesc *)me->init; printk("FINALIZE, ->init FPTR is %p, GP %lx ADDR %lx\n", entry, entry->gp, entry->addr); addr = (u32 *)entry->addr; diff -Nru a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c --- a/arch/parisc/kernel/parisc_ksyms.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/parisc_ksyms.c Wed Oct 8 12:24:57 2003 @@ -26,19 +26,6 @@ EXPORT_SYMBOL(strstr); EXPORT_SYMBOL(strpbrk); -#include /* struct parisc_device for asm/pci.h */ -#include -EXPORT_SYMBOL(hppa_dma_ops); -#if defined(CONFIG_PCI) || defined(CONFIG_ISA) -EXPORT_SYMBOL(get_pci_node_path); -#endif - -#include -#include -EXPORT_SYMBOL(enable_irq); -EXPORT_SYMBOL(disable_irq); -EXPORT_SYMBOL(probe_irq_mask); - #include EXPORT_SYMBOL(kernel_thread); EXPORT_SYMBOL(boot_cpu_data); @@ -46,10 +33,6 @@ #include EXPORT_SYMBOL(pm_power_off); -#ifdef CONFIG_SMP -EXPORT_SYMBOL(synchronize_irq); -#endif /* CONFIG_SMP */ - #include EXPORT_SYMBOL(__xchg8); EXPORT_SYMBOL(__xchg32); @@ -74,14 +57,6 @@ EXPORT_SYMBOL($global$); #endif -EXPORT_SYMBOL(register_parisc_driver); -EXPORT_SYMBOL(unregister_parisc_driver); -EXPORT_SYMBOL(print_pci_hwpath); -EXPORT_SYMBOL(print_pa_hwpath); -EXPORT_SYMBOL(pdc_iodc_read); -EXPORT_SYMBOL(pdc_tod_read); -EXPORT_SYMBOL(pdc_tod_set); - #include EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(iounmap); @@ -89,28 +64,11 @@ EXPORT_SYMBOL(__memcpy_fromio); EXPORT_SYMBOL(__memset_io); -#if defined(CONFIG_PCI) || defined(CONFIG_ISA) -EXPORT_SYMBOL(inb); -EXPORT_SYMBOL(inw); -EXPORT_SYMBOL(inl); -EXPORT_SYMBOL(outb); -EXPORT_SYMBOL(outw); -EXPORT_SYMBOL(outl); - -EXPORT_SYMBOL(insb); -EXPORT_SYMBOL(insw); -EXPORT_SYMBOL(insl); -EXPORT_SYMBOL(outsb); -EXPORT_SYMBOL(outsw); -EXPORT_SYMBOL(outsl); -#endif - #include EXPORT_SYMBOL(flush_kernel_dcache_range_asm); EXPORT_SYMBOL(flush_kernel_dcache_page); EXPORT_SYMBOL(flush_data_cache_local); EXPORT_SYMBOL(flush_kernel_icache_range_asm); -EXPORT_SYMBOL(__flush_dcache_page); EXPORT_SYMBOL(flush_all_caches); EXPORT_SYMBOL(dcache_stride); EXPORT_SYMBOL(flush_cache_all_local); @@ -130,17 +88,6 @@ EXPORT_SYMBOL(__down_interruptible); EXPORT_SYMBOL(__down); -#include -#include -EXPORT_SYMBOL(csum_partial_copy_nocheck); -EXPORT_SYMBOL(csum_partial_copy_from_user); - -#include -EXPORT_SYMBOL(pdc_add_valid); -EXPORT_SYMBOL(pdc_lan_station_id); -EXPORT_SYMBOL(pdc_get_initiator); -EXPORT_SYMBOL(pdc_sti_call); - extern void $$divI(void); extern void $$divU(void); extern void $$remI(void); @@ -218,6 +165,3 @@ extern void $$dyncall(void); EXPORT_SYMBOL($$dyncall); #endif - -#include -EXPORT_SYMBOL(vmalloc_start); diff -Nru a/arch/parisc/kernel/pci.c b/arch/parisc/kernel/pci.c --- a/arch/parisc/kernel/pci.c Wed Oct 8 12:24:55 2003 +++ b/arch/parisc/kernel/pci.c Wed Oct 8 12:24:55 2003 @@ -88,7 +88,8 @@ EISA_IN(size); \ if (!parisc_pci_hba[b]) return (u##size) -1; \ return pci_port->in##type(parisc_pci_hba[b], PCI_PORT_ADDR(addr)); \ -} +} \ +EXPORT_SYMBOL(in##type); PCI_PORT_IN(b, 8) PCI_PORT_IN(w, 16) @@ -102,7 +103,8 @@ EISA_OUT(size); \ if (!parisc_pci_hba[b]) return; \ pci_port->out##type(parisc_pci_hba[b], PCI_PORT_ADDR(addr), d); \ -} +} \ +EXPORT_SYMBOL(out##type); PCI_PORT_OUT(b, 8) PCI_PORT_OUT(w, 16) diff -Nru a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c --- a/arch/parisc/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -39,11 +40,15 @@ hlt_counter++; } +EXPORT_SYMBOL(disable_hlt); + void enable_hlt(void) { hlt_counter--; } +EXPORT_SYMBOL(enable_hlt); + void default_idle(void) { barrier(); @@ -119,6 +124,8 @@ } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { /* @@ -127,6 +134,8 @@ */ } +EXPORT_SYMBOL(machine_halt); + /* * This routine is called from sys_reboot to actually turn off the @@ -151,6 +160,8 @@ printk(KERN_EMERG "System shut down completed.\n" KERN_EMERG "Please power this system off now."); } + +EXPORT_SYMBOL(machine_power_off); /* diff -Nru a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c --- a/arch/parisc/kernel/ptrace.c Wed Oct 8 12:24:55 2003 +++ b/arch/parisc/kernel/ptrace.c Wed Oct 8 12:24:55 2003 @@ -23,16 +23,6 @@ #include #include -/* These are used in entry.S, syscall_restore_rfi. We need to record the - * current stepping mode somewhere other than in PSW, because there is no - * concept of saving and restoring the users PSW over a syscall. We choose - * to use these two bits in task->ptrace. These bits must not clash with - * any PT_* defined in include/linux/sched.h, and must match with the bit - * tests in entry.S - */ -#define PT_SINGLESTEP 0x10000 -#define PT_BLOCKSTEP 0x20000 - /* PSW bits we allow the debugger to modify */ #define USER_PSW_BITS (PSW_N | PSW_V | PSW_CB) diff -Nru a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c --- a/arch/parisc/kernel/setup.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/setup.c Wed Oct 8 12:24:57 2003 @@ -43,6 +43,7 @@ #include #include /* for pa7300lc_init() proto */ #include +#include #define COMMAND_LINE_SIZE 1024 char saved_command_line[COMMAND_LINE_SIZE]; @@ -208,27 +209,32 @@ proc_runway_root = proc_mkdir("bus/runway", 0); } break; + default: + /* FIXME: this was added to prevent the compiler + * complaining about missing pcx, pcxs and pcxt + * I'm assuming they have neither gsc nor runway */ + break; } } static struct resource central_bus = { .name = "Central Bus", - .start = (unsigned long)0xfffffffffff80000, - .end = (unsigned long)0xfffffffffffaffff, + .start = F_EXTEND(0xfff80000), + .end = F_EXTEND(0xfffaffff), .flags = IORESOURCE_MEM, }; static struct resource local_broadcast = { .name = "Local Broadcast", - .start = (unsigned long)0xfffffffffffb0000, - .end = (unsigned long)0xfffffffffffdffff, + .start = F_EXTEND(0xfffb0000), + .end = F_EXTEND(0xfffdffff), .flags = IORESOURCE_MEM, }; static struct resource global_broadcast = { .name = "Global Broadcast", - .start = (unsigned long)0xfffffffffffe0000, - .end = (unsigned long)0xffffffffffffffff, + .start = F_EXTEND(0xfffe0000), + .end = F_EXTEND(0xffffffff), .flags = IORESOURCE_MEM, }; diff -Nru a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c --- a/arch/parisc/kernel/signal.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/signal.c Wed Oct 8 12:24:57 2003 @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include #include @@ -41,8 +43,11 @@ #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) -/* Use this to get at 32-bit user passed pointers. - * See sys_sparc32.c for description about these. */ +/* gcc will complain if a pointer is cast to an integer of different + * size. If you really need to do this (and we do for an ELF32 user + * application in an ELF64 kernel) then you have to do a cast to an + * integer of the same size first. The A() macro accomplishes + * this. */ #define A(__x) ((unsigned long)(__x)) int do_signal(sigset_t *oldset, struct pt_regs *regs, int in_syscall); @@ -166,11 +171,17 @@ struct rt_sigframe *frame; struct siginfo si; sigset_t set; - unsigned long usp = regs->gr[30]; + unsigned long usp = (regs->gr[30] & ~(0x01UL)); + unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE; +#ifdef __LP64__ + if(personality(current->personality) == PER_LINUX32) + sigframe_size = PARISC_RT_SIGFRAME_SIZE32; +#endif + /* Unwind the user stack to get the rt_sigframe structure. */ frame = (struct rt_sigframe *) - (usp - PARISC_RT_SIGFRAME_SIZE); + (usp - sigframe_size); DBG(("in sys_rt_sigreturn, frame is %p\n", frame)); if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set))) @@ -271,11 +282,12 @@ sigset_t *set, struct pt_regs *regs, int in_syscall) { struct rt_sigframe *frame; - unsigned long rp, usp, haddr; + unsigned long rp, usp; + unsigned long haddr, sigframe_size; struct siginfo si; int err = 0; - usp = regs->gr[30]; + usp = (regs->gr[30] & ~(0x01UL)); frame = get_sigframe(ka, usp, sizeof(*frame)); DBG(("setup_rt_frame 1: frame %p info %p\n", frame, info)); @@ -308,64 +320,86 @@ } #endif -#undef CACHE_FLUSHING_IS_NOT_BROKEN -#ifdef CACHE_FLUSHING_IS_NOT_BROKEN + flush_user_dcache_range((unsigned long) &frame->tramp[0], + (unsigned long) &frame->tramp[4]); flush_user_icache_range((unsigned long) &frame->tramp[0], (unsigned long) &frame->tramp[4]); -#else - /* It should *always* be cache line-aligned, but the compiler - sometimes screws up. */ - asm volatile("fdc 0(%%sr3,%0)\n\t" - "fdc %1(%%sr3,%0)\n\t" - "sync\n\t" - "fic 0(%%sr3,%0)\n\t" - "fic %1(%%sr3,%0)\n\t" - "sync\n\t" - : : "r" (frame->tramp), "r" (L1_CACHE_BYTES)); -#endif rp = (unsigned long) frame->tramp; if (err) goto give_sigsegv; -/* Much more has to happen with signals than this -- but it'll at least */ -/* provide a pointer to some places which definitely need a look. */ -#define HACK u32 - - haddr = (HACK)A(ka->sa.sa_handler); - /* ARGH! Fucking brain damage. You don't want to know. */ - if (haddr & 2) { - HACK *plabel; - HACK ltp; - - plabel = (HACK *) (haddr & ~3); - err |= __get_user(haddr, plabel); - err |= __get_user(ltp, plabel + 1); + haddr = A(ka->sa.sa_handler); + /* The sa_handler may be a pointer to a function descriptor */ +#ifdef __LP64__ + if(personality(current->personality) == PER_LINUX32) { +#endif + if (haddr & PA_PLABEL_FDESC) { + Elf32_Fdesc fdesc; + Elf32_Fdesc *ufdesc = (Elf32_Fdesc *)A(haddr & ~3); + + err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc)); + + if (err) + goto give_sigsegv; + + haddr = fdesc.addr; + regs->gr[19] = fdesc.gp; + } +#ifdef __LP64__ + } else { + Elf64_Fdesc fdesc; + Elf64_Fdesc *ufdesc = (Elf64_Fdesc *)A(haddr & ~3); + + err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc)); + if (err) goto give_sigsegv; - regs->gr[19] = ltp; + + haddr = fdesc.addr; + regs->gr[19] = fdesc.gp; + DBG(("64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n", + haddr, regs->gr[19], in_syscall)); } +#endif /* The syscall return path will create IAOQ values from r31. */ - if (in_syscall) - regs->gr[31] = (HACK) haddr; - else { - regs->gr[0] = USER_PSW; - regs->iaoq[0] = (HACK) haddr | 3; + sigframe_size = PARISC_RT_SIGFRAME_SIZE; +#ifdef __LP64__ + if(personality(current->personality) == PER_LINUX32) + sigframe_size = PARISC_RT_SIGFRAME_SIZE32; +#endif + if (in_syscall) { + regs->gr[31] = haddr; +#ifdef __LP64__ + if(personality(current->personality) == PER_LINUX) + sigframe_size |= 1; +#endif + } else { + unsigned long psw = USER_PSW; +#ifdef __LP64__ + if(personality(current->personality) == PER_LINUX) + psw |= PSW_W; +#endif + + regs->gr[0] = psw; + regs->iaoq[0] = haddr | 3; regs->iaoq[1] = regs->iaoq[0] + 4; } regs->gr[2] = rp; /* userland return pointer */ regs->gr[26] = sig; /* signal number */ - regs->gr[25] = (HACK)A(&frame->info); /* siginfo pointer */ - regs->gr[24] = (HACK)A(&frame->uc); /* ucontext pointer */ + regs->gr[25] = A(&frame->info); /* siginfo pointer */ + regs->gr[24] = A(&frame->uc); /* ucontext pointer */ + DBG(("making sigreturn frame: %#lx + %#x = %#lx\n", - regs->gr[30], PARISC_RT_SIGFRAME_SIZE, - regs->gr[30] + PARISC_RT_SIGFRAME_SIZE)); + regs->gr[30], sigframe_size, + regs->gr[30] + sigframe_size)); /* Raise the user stack pointer to make a proper call frame. */ - regs->gr[30] = ((HACK)A(frame) + PARISC_RT_SIGFRAME_SIZE); + regs->gr[30] = (A(frame) + sigframe_size); + DBG(("SIG deliver (%s:%d): frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n", current->comm, current->pid, frame, regs->gr[30], diff -Nru a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c --- a/arch/parisc/kernel/smp.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/smp.c Wed Oct 8 12:24:57 2003 @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -65,11 +66,15 @@ cpumask_t cpu_online_map = CPU_MASK_NONE; /* Bitmap of online CPUs */ #define IS_LOGGED_IN(cpunum) (cpu_isset(cpunum, cpu_online_map)) +EXPORT_SYMBOL(cpu_online_map); + int smp_num_cpus = 1; int smp_threads_ready = 0; unsigned long cache_decay_ticks; static int max_cpus = -1; /* Command line */ cpumask_t cpu_present_mask; + +EXPORT_SYMBOL(cpu_present_mask); struct smp_call_struct { void (*func) (void *info); diff -Nru a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c --- a/arch/parisc/kernel/sys_parisc.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/sys_parisc.c Wed Oct 8 12:24:57 2003 @@ -65,7 +65,7 @@ */ static int get_offset(struct address_space *mapping) { - int offset = (int) mapping << (PAGE_SHIFT - 8); + int offset = (unsigned long) mapping << (PAGE_SHIFT - 8); return offset & 0x3FF000; } #endif @@ -165,12 +165,13 @@ return raddr; } - /* Fucking broken ABI */ #ifdef CONFIG_PARISC64 extern asmlinkage long sys_truncate(const char *, unsigned long); extern asmlinkage long sys_ftruncate(unsigned int, unsigned long); +extern asmlinkage long sys_fcntl(unsigned int, unsigned int, unsigned long); + asmlinkage long parisc_truncate64(const char * path, unsigned int high, unsigned int low) { @@ -181,6 +182,21 @@ unsigned int high, unsigned int low) { return sys_ftruncate(fd, (long)high << 32 | low); +} + +/* stubs for the benefit of the syscall_table since truncate64 and truncate + * are identical on LP64 */ +asmlinkage long sys_truncate64(const char * path, unsigned long length) +{ + return sys_truncate(path, length); +} +asmlinkage long sys_ftruncate64(unsigned int fd, unsigned long length) +{ + return sys_ftruncate(fd, length); +} +asmlinkage long sys_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + return sys_fcntl(fd, cmd, arg); } #else diff -Nru a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S --- a/arch/parisc/kernel/syscall.S Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/syscall.S Wed Oct 8 12:24:57 2003 @@ -69,9 +69,14 @@ * exit from the syscall, and also use that value to know * whether to do narrow or wide syscalls. -PB */ - ssm PSW_SM_W, %r0 + ssm PSW_SM_W, %r1 + extrd,u %r1,PSW_W_BIT,1,%r1 + /* sp must be aligned on 4, so deposit the W bit setting into + * the bottom of sp temporarily */ + or,ev %r1,%r30,%r30 + b,n 1f /* The top halves of argument registers must be cleared on syscall - * entry. + * entry from narrow executable. */ depdi 0, 31, 32, %r26 depdi 0, 31, 32, %r25 @@ -79,11 +84,13 @@ depdi 0, 31, 32, %r23 depdi 0, 31, 32, %r22 depdi 0, 31, 32, %r21 +1: #endif mfctl %cr30,%r1 xor %r1,%r30,%r30 /* ye olde xor trick */ xor %r1,%r30,%r1 xor %r1,%r30,%r30 + ldo THREAD_SZ_ALGN+FRAME_SIZE(%r30),%r30 /* set up kernel stack */ /* N.B.: It is critical that we don't set sr7 to 0 until r30 @@ -104,9 +111,19 @@ PSW value is stored. This is needed for gdb and sys_ptrace. */ STREG %r0, TASK_PT_PSW(%r1) STREG %r2, TASK_PT_GR2(%r1) /* preserve rp */ + STREG %r19, TASK_PT_GR19(%r1) + LDREGM -FRAME_SIZE(%r30), %r2 /* get users sp back */ +#ifdef __LP64__ + extrd,u %r2,63,1,%r19 /* W hidden in bottom bit */ +#if 0 + xor %r19,%r2,%r2 /* clear bottom bit */ + depd,z %r19,1,1,%r19 + std %r19,TASK_PT_PSW(%r1) +#endif +#endif STREG %r2, TASK_PT_GR30(%r1) /* ... and save it */ - STREG %r19, TASK_PT_GR19(%r1) + STREG %r20, TASK_PT_GR20(%r1) STREG %r21, TASK_PT_GR21(%r1) STREG %r22, TASK_PT_GR22(%r1) @@ -130,6 +147,7 @@ #ifdef __LP64__ ldo -16(%r30),%r29 /* Reference param save area */ + copy %r19,%r2 /* W bit back to r2 */ #else /* no need to save these on stack in wide mode because the first 8 * args are passed in registers */ @@ -144,9 +162,17 @@ /* Note! We cannot use the syscall table that is mapped nearby since the gateway page is mapped execute-only. */ +#ifdef __LP64__ + ldil L%sys_call_table, %r1 + or,= %r2,%r2,%r2 + addil L%(sys_call_table64-sys_call_table), %r1 + ldo R%sys_call_table(%r1), %r19 + or,= %r2,%r2,%r2 + ldo R%sys_call_table64(%r1), %r19 +#else ldil L%sys_call_table, %r1 ldo R%sys_call_table(%r1), %r19 - +#endif comiclr,>>= __NR_Linux_syscalls, %r20, %r0 b,n .Lsyscall_nosys @@ -317,304 +343,21 @@ ldil L%syscall_exit_rfi,%r1 be,n R%syscall_exit_rfi(%sr7,%r1) -#ifdef __LP64__ -/* Use ENTRY_SAME for 32-bit syscalls which are the same on wide and - * narrow palinux. Use ENTRY_DIFF for those where a 32-bit specific - * implementation is required on wide palinux. Use ENTRY_COMP where - * the compatability layer has a useful 32-bit implementation. - */ -#define ENTRY_SAME(_name_) .dword sys_##_name_ -#define ENTRY_DIFF(_name_) .dword sys32_##_name_ -#define ENTRY_UHOH(_name_) .dword sys32_##unimplemented -#define ENTRY_OURS(_name_) .dword parisc_##_name_ -#define ENTRY_COMP(_name_) .dword compat_sys_##_name_ -#else -#define ENTRY_SAME(_name_) .word sys_##_name_ -#define ENTRY_DIFF(_name_) .word sys_##_name_ -#define ENTRY_UHOH(_name_) .word sys_##_name_ -#define ENTRY_OURS(_name_) .word parisc_##_name_ -#define ENTRY_COMP(_name_) .word sys_##_name_ -#endif - - .align 8 + .align 4096 .export sys_call_table .Lsys_call_table: sys_call_table: - ENTRY_SAME(ni_syscall) /* 0 - old "setup()" system call*/ - ENTRY_SAME(exit) - ENTRY_SAME(fork_wrapper) - ENTRY_SAME(read) - ENTRY_SAME(write) - ENTRY_SAME(open) /* 5 */ - ENTRY_SAME(close) - ENTRY_SAME(waitpid) - ENTRY_SAME(creat) - ENTRY_SAME(link) - ENTRY_SAME(unlink) /* 10 */ - ENTRY_DIFF(execve_wrapper) - ENTRY_SAME(chdir) - /* See comments in kernel/time.c!!! Maybe we don't need this? */ - ENTRY_DIFF(time) - ENTRY_SAME(mknod) - ENTRY_SAME(chmod) /* 15 */ - ENTRY_SAME(lchown) - ENTRY_SAME(socket) - /* struct stat is MAYBE identical wide and narrow ?? */ - ENTRY_COMP(newstat) - ENTRY_DIFF(lseek) - ENTRY_SAME(getpid) /* 20 */ - /* the 'void * data' parameter may need re-packing in wide */ - ENTRY_DIFF(mount) - /* concerned about struct sockaddr in wide/narrow */ - /* ---> I think sockaddr is OK unless the compiler packs the struct */ - /* differently to align the char array */ - ENTRY_SAME(bind) - ENTRY_SAME(setuid) - ENTRY_SAME(getuid) - ENTRY_SAME(stime) /* 25 */ - ENTRY_SAME(ptrace) - ENTRY_SAME(alarm) - /* see stat comment */ - ENTRY_COMP(newfstat) - ENTRY_SAME(pause) - /* struct utimbuf uses time_t which might vary */ - ENTRY_COMP(utime) /* 30 */ - /* struct sockaddr... */ - ENTRY_SAME(connect) - ENTRY_SAME(listen) - ENTRY_SAME(access) - ENTRY_SAME(nice) - /* struct sockaddr... */ - ENTRY_SAME(accept) /* 35 */ - ENTRY_SAME(sync) - ENTRY_SAME(kill) - ENTRY_SAME(rename) - ENTRY_SAME(mkdir) - ENTRY_SAME(rmdir) /* 40 */ - ENTRY_SAME(dup) - ENTRY_SAME(pipe) - ENTRY_COMP(times) - /* struct sockaddr... */ - ENTRY_SAME(getsockname) - /* it seems possible brk() could return a >4G pointer... */ - ENTRY_SAME(brk) /* 45 */ - ENTRY_SAME(setgid) - ENTRY_SAME(getgid) - ENTRY_SAME(signal) - ENTRY_SAME(geteuid) - ENTRY_SAME(getegid) /* 50 */ - ENTRY_SAME(acct) - ENTRY_SAME(umount) - /* struct sockaddr... */ - ENTRY_SAME(getpeername) - ENTRY_COMP(ioctl) - ENTRY_COMP(fcntl) /* 55 */ - ENTRY_SAME(socketpair) - ENTRY_SAME(setpgid) - ENTRY_SAME(send) - ENTRY_SAME(newuname) - ENTRY_SAME(umask) /* 60 */ - ENTRY_SAME(chroot) - ENTRY_SAME(ustat) - ENTRY_SAME(dup2) - ENTRY_SAME(getppid) - ENTRY_SAME(getpgrp) /* 65 */ - ENTRY_SAME(setsid) - ENTRY_SAME(pivot_root) - /* I don't like this */ - ENTRY_UHOH(sgetmask) - ENTRY_UHOH(ssetmask) - ENTRY_SAME(setreuid) /* 70 */ - ENTRY_SAME(setregid) - ENTRY_SAME(mincore) - ENTRY_COMP(sigpending) - ENTRY_SAME(sethostname) - /* Following 3 have linux-common-code structs containing longs -( */ - ENTRY_COMP(setrlimit) /* 75 */ - ENTRY_COMP(getrlimit) - ENTRY_COMP(getrusage) - /* struct timeval and timezone are maybe?? consistent wide and narrow */ - ENTRY_DIFF(gettimeofday) - ENTRY_DIFF(settimeofday) - ENTRY_SAME(getgroups) /* 80 */ - ENTRY_SAME(setgroups) - /* struct socketaddr... */ - ENTRY_SAME(sendto) - ENTRY_SAME(symlink) - /* see stat comment */ - ENTRY_COMP(newlstat) - ENTRY_SAME(readlink) /* 85 */ - ENTRY_SAME(ni_syscall) /* was uselib */ - ENTRY_SAME(swapon) - ENTRY_SAME(reboot) - ENTRY_SAME(mmap2) - ENTRY_SAME(mmap) /* 90 */ - ENTRY_SAME(munmap) - ENTRY_SAME(truncate) - ENTRY_SAME(ftruncate) - ENTRY_SAME(fchmod) - ENTRY_SAME(fchown) /* 95 */ - ENTRY_SAME(getpriority) - ENTRY_SAME(setpriority) - ENTRY_SAME(recv) - ENTRY_COMP(statfs) - ENTRY_COMP(fstatfs) /* 100 */ - ENTRY_SAME(stat64) - ENTRY_SAME(ni_syscall) /* was socketcall */ - ENTRY_SAME(syslog) - /* even though manpage says struct timeval contains longs, ours has - * time_t and suseconds_t -- both of which are safe wide/narrow */ - ENTRY_COMP(setitimer) - ENTRY_COMP(getitimer) /* 105 */ - ENTRY_SAME(capget) - ENTRY_SAME(capset) - ENTRY_OURS(pread64) - ENTRY_OURS(pwrite64) - ENTRY_SAME(getcwd) /* 110 */ - ENTRY_SAME(vhangup) - ENTRY_SAME(fstat64) - ENTRY_SAME(vfork_wrapper) - /* struct rusage contains longs... */ - ENTRY_COMP(wait4) - ENTRY_SAME(swapoff) /* 115 */ - ENTRY_DIFF(sysinfo) - ENTRY_SAME(shutdown) - ENTRY_SAME(fsync) - ENTRY_SAME(madvise) - ENTRY_SAME(clone_wrapper) /* 120 */ - ENTRY_SAME(setdomainname) - ENTRY_DIFF(sendfile) - /* struct sockaddr... */ - ENTRY_SAME(recvfrom) - /* struct timex contains longs */ - ENTRY_DIFF(adjtimex) - ENTRY_SAME(mprotect) /* 125 */ - /* old_sigset_t forced to 32 bits. Beware glibc sigset_t */ - ENTRY_COMP(sigprocmask) - ENTRY_SAME(ni_syscall) /* create_module */ - ENTRY_SAME(init_module) - ENTRY_SAME(delete_module) - ENTRY_SAME(ni_syscall) /* 130: get_kernel_syms */ - /* time_t inside struct dqblk */ - ENTRY_SAME(quotactl) - ENTRY_SAME(getpgid) - ENTRY_SAME(fchdir) - ENTRY_SAME(bdflush) - ENTRY_SAME(sysfs) /* 135 */ - ENTRY_SAME(personality) - ENTRY_SAME(ni_syscall) /* for afs_syscall */ - ENTRY_SAME(setfsuid) - ENTRY_SAME(setfsgid) - /* I think this might work */ - ENTRY_SAME(llseek) /* 140 */ - /* struct linux_dirent has longs, like 'unsigned long d_ino' which - * almost definitely should be 'ino_t d_ino' but it's too late now */ - ENTRY_DIFF(getdents) - /* it is POSSIBLE that select will be OK because even though fd_set - * contains longs, the macros and sizes are clever. */ - ENTRY_DIFF(select) - ENTRY_SAME(flock) - ENTRY_SAME(msync) - /* struct iovec contains pointers */ - ENTRY_DIFF(readv) /* 145 */ - ENTRY_DIFF(writev) - ENTRY_SAME(getsid) - ENTRY_SAME(fdatasync) - /* struct __sysctl_args is a mess */ - ENTRY_DIFF(sysctl) - ENTRY_SAME(mlock) /* 150 */ - ENTRY_SAME(munlock) - ENTRY_SAME(mlockall) - ENTRY_SAME(munlockall) - /* struct sched_param is ok for now */ - ENTRY_SAME(sched_setparam) - ENTRY_SAME(sched_getparam) /* 155 */ - ENTRY_SAME(sched_setscheduler) - ENTRY_SAME(sched_getscheduler) - ENTRY_SAME(sched_yield) - ENTRY_SAME(sched_get_priority_max) - ENTRY_SAME(sched_get_priority_min) /* 160 */ - /* These 2 would've worked if someone had defined struct timespec - * carefully, like timeval for example (which is about the same). - * Unfortunately it contains a long :-( */ - ENTRY_DIFF(sched_rr_get_interval) - ENTRY_COMP(nanosleep) - ENTRY_SAME(mremap) - ENTRY_SAME(setresuid) - ENTRY_SAME(getresuid) /* 165 */ - ENTRY_DIFF(sigaltstack_wrapper) - ENTRY_SAME(ni_syscall) /* query_module */ - ENTRY_SAME(poll) - /* structs contain pointers and an in_addr... */ - ENTRY_DIFF(nfsservctl) - ENTRY_SAME(setresgid) /* 170 */ - ENTRY_SAME(getresgid) - ENTRY_SAME(prctl) - /* signals need a careful review */ - ENTRY_SAME(rt_sigreturn_wrapper) - ENTRY_DIFF(rt_sigaction) - ENTRY_DIFF(rt_sigprocmask) /* 175 */ - ENTRY_DIFF(rt_sigpending) - ENTRY_UHOH(rt_sigtimedwait) - /* even though the struct siginfo_t is different, it appears like - * all the paths use values which should be same wide and narrow. - * Also the struct is padded to 128 bytes which means we don't have - * to worry about faulting trying to copy in a larger 64-bit - * struct from a 32-bit user-space app. - */ - ENTRY_SAME(rt_sigqueueinfo) - ENTRY_SAME(rt_sigsuspend_wrapper) /* not really SAME -- see the code */ - ENTRY_SAME(chown) /* 180 */ - /* setsockopt() used by iptables: SO_SET_REPLACE/SO_SET_ADD_COUNTERS */ - ENTRY_COMP(setsockopt) - ENTRY_SAME(getsockopt) - ENTRY_COMP(sendmsg) - ENTRY_COMP(recvmsg) - ENTRY_SAME(semop) /* 185 */ - ENTRY_SAME(semget) - ENTRY_DIFF(semctl_broken) - ENTRY_DIFF(msgsnd) - ENTRY_DIFF(msgrcv) - ENTRY_SAME(msgget) /* 190 */ - ENTRY_SAME(msgctl_broken) - ENTRY_SAME(shmat_wrapper) - ENTRY_SAME(shmdt) - ENTRY_SAME(shmget) - ENTRY_SAME(shmctl_broken) /* 195 */ - ENTRY_SAME(ni_syscall) /* streams1 */ - ENTRY_SAME(ni_syscall) /* streams2 */ - ENTRY_SAME(lstat64) - ENTRY_OURS(truncate64) - ENTRY_OURS(ftruncate64) /* 200 */ - ENTRY_SAME(getdents64) - ENTRY_COMP(fcntl64) - ENTRY_SAME(ni_syscall) - ENTRY_SAME(ni_syscall) - ENTRY_SAME(ni_syscall) /* 205 */ - ENTRY_SAME(gettid) - ENTRY_OURS(readahead) - ENTRY_SAME(ni_syscall) /* tkill */ - - ENTRY_SAME(sendfile64) - ENTRY_COMP(futex) /* 210 */ - ENTRY_COMP(sched_setaffinity) - ENTRY_COMP(sched_getaffinity) - ENTRY_SAME(ni_syscall) - ENTRY_SAME(ni_syscall) - ENTRY_SAME(io_setup) /* 215 */ - ENTRY_SAME(io_destroy) - ENTRY_SAME(io_getevents) - ENTRY_SAME(io_submit) - ENTRY_SAME(io_cancel) - ENTRY_SAME(alloc_hugepages) /* 220 */ - ENTRY_SAME(free_hugepages) - ENTRY_SAME(exit_group) - ENTRY_DIFF(lookup_dcookie) - ENTRY_SAME(epoll_create) - ENTRY_SAME(epoll_ctl) /* 225 */ - ENTRY_SAME(epoll_wait) - ENTRY_SAME(remap_file_pages) +#include "syscall_table.S" .end +#ifdef __LP64__ + .align 4096 + .export sys_call_table64 +.Lsys_call_table64: +sys_call_table64: +#define SYSCALL_TABLE_64BIT +#include "syscall_table.S" +#endif + /* Make sure nothing else is placed on this page */ diff -Nru a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/parisc/kernel/syscall_table.S Wed Oct 8 12:24:57 2003 @@ -0,0 +1,304 @@ +#undef ENTRY_SAME +#undef ENTRY_DIFF +#undef ENTRY_UHOH +#undef ENTRY_COMP +#undef ENTRY_OURS +#if defined(__LP64__) && !defined(SYSCALL_TABLE_64BIT) +/* Use ENTRY_SAME for 32-bit syscalls which are the same on wide and + * narrow palinux. Use ENTRY_DIFF for those where a 32-bit specific + * implementation is required on wide palinux. Use ENTRY_COMP where + * the compatability layer has a useful 32-bit implementation. + */ +#define ENTRY_SAME(_name_) .dword sys_##_name_ +#define ENTRY_DIFF(_name_) .dword sys32_##_name_ +#define ENTRY_UHOH(_name_) .dword sys32_##unimplemented +#define ENTRY_OURS(_name_) .dword parisc_##_name_ +#define ENTRY_COMP(_name_) .dword compat_sys_##_name_ +#elif defined(__LP64__) && defined(SYSCALL_TABLE_64BIT) +#define ENTRY_SAME(_name_) .dword sys_##_name_ +#define ENTRY_DIFF(_name_) .dword sys_##_name_ +#define ENTRY_UHOH(_name_) .dword sys_##_name_ +#define ENTRY_OURS(_name_) .dword sys_##_name_ +#define ENTRY_COMP(_name_) .dword sys_##_name_ +#else +#define ENTRY_SAME(_name_) .word sys_##_name_ +#define ENTRY_DIFF(_name_) .word sys_##_name_ +#define ENTRY_UHOH(_name_) .word sys_##_name_ +#define ENTRY_OURS(_name_) .word parisc_##_name_ +#define ENTRY_COMP(_name_) .word sys_##_name_ +#endif + + ENTRY_SAME(ni_syscall) /* 0 - old "setup()" system call*/ + ENTRY_SAME(exit) + ENTRY_SAME(fork_wrapper) + ENTRY_SAME(read) + ENTRY_SAME(write) + ENTRY_SAME(open) /* 5 */ + ENTRY_SAME(close) + ENTRY_SAME(waitpid) + ENTRY_SAME(creat) + ENTRY_SAME(link) + ENTRY_SAME(unlink) /* 10 */ + ENTRY_DIFF(execve_wrapper) + ENTRY_SAME(chdir) + /* See comments in kernel/time.c!!! Maybe we don't need this? */ + ENTRY_DIFF(time) + ENTRY_SAME(mknod) + ENTRY_SAME(chmod) /* 15 */ + ENTRY_SAME(lchown) + ENTRY_SAME(socket) + /* struct stat is MAYBE identical wide and narrow ?? */ + ENTRY_COMP(newstat) + ENTRY_DIFF(lseek) + ENTRY_SAME(getpid) /* 20 */ + /* the 'void * data' parameter may need re-packing in wide */ + ENTRY_DIFF(mount) + /* concerned about struct sockaddr in wide/narrow */ + /* ---> I think sockaddr is OK unless the compiler packs the struct */ + /* differently to align the char array */ + ENTRY_SAME(bind) + ENTRY_SAME(setuid) + ENTRY_SAME(getuid) + ENTRY_SAME(stime) /* 25 */ + ENTRY_SAME(ptrace) + ENTRY_SAME(alarm) + /* see stat comment */ + ENTRY_COMP(newfstat) + ENTRY_SAME(pause) + /* struct utimbuf uses time_t which might vary */ + ENTRY_COMP(utime) /* 30 */ + /* struct sockaddr... */ + ENTRY_SAME(connect) + ENTRY_SAME(listen) + ENTRY_SAME(access) + ENTRY_SAME(nice) + /* struct sockaddr... */ + ENTRY_SAME(accept) /* 35 */ + ENTRY_SAME(sync) + ENTRY_SAME(kill) + ENTRY_SAME(rename) + ENTRY_SAME(mkdir) + ENTRY_SAME(rmdir) /* 40 */ + ENTRY_SAME(dup) + ENTRY_SAME(pipe) + ENTRY_COMP(times) + /* struct sockaddr... */ + ENTRY_SAME(getsockname) + /* it seems possible brk() could return a >4G pointer... */ + ENTRY_SAME(brk) /* 45 */ + ENTRY_SAME(setgid) + ENTRY_SAME(getgid) + ENTRY_SAME(signal) + ENTRY_SAME(geteuid) + ENTRY_SAME(getegid) /* 50 */ + ENTRY_SAME(acct) + ENTRY_SAME(umount) + /* struct sockaddr... */ + ENTRY_SAME(getpeername) + ENTRY_COMP(ioctl) + ENTRY_COMP(fcntl) /* 55 */ + ENTRY_SAME(socketpair) + ENTRY_SAME(setpgid) + ENTRY_SAME(send) + ENTRY_SAME(newuname) + ENTRY_SAME(umask) /* 60 */ + ENTRY_SAME(chroot) + ENTRY_SAME(ustat) + ENTRY_SAME(dup2) + ENTRY_SAME(getppid) + ENTRY_SAME(getpgrp) /* 65 */ + ENTRY_SAME(setsid) + ENTRY_SAME(pivot_root) + /* I don't like this */ + ENTRY_UHOH(sgetmask) + ENTRY_UHOH(ssetmask) + ENTRY_SAME(setreuid) /* 70 */ + ENTRY_SAME(setregid) + ENTRY_SAME(mincore) + ENTRY_COMP(sigpending) + ENTRY_SAME(sethostname) + /* Following 3 have linux-common-code structs containing longs -( */ + ENTRY_COMP(setrlimit) /* 75 */ + ENTRY_COMP(getrlimit) + ENTRY_COMP(getrusage) + /* struct timeval and timezone are maybe?? consistent wide and narrow */ + ENTRY_DIFF(gettimeofday) + ENTRY_DIFF(settimeofday) + ENTRY_SAME(getgroups) /* 80 */ + ENTRY_SAME(setgroups) + /* struct socketaddr... */ + ENTRY_SAME(sendto) + ENTRY_SAME(symlink) + /* see stat comment */ + ENTRY_COMP(newlstat) + ENTRY_SAME(readlink) /* 85 */ + ENTRY_SAME(ni_syscall) /* was uselib */ + ENTRY_SAME(swapon) + ENTRY_SAME(reboot) + ENTRY_SAME(mmap2) + ENTRY_SAME(mmap) /* 90 */ + ENTRY_SAME(munmap) + ENTRY_SAME(truncate) + ENTRY_SAME(ftruncate) + ENTRY_SAME(fchmod) + ENTRY_SAME(fchown) /* 95 */ + ENTRY_SAME(getpriority) + ENTRY_SAME(setpriority) + ENTRY_SAME(recv) + ENTRY_COMP(statfs) + ENTRY_COMP(fstatfs) /* 100 */ + ENTRY_SAME(stat64) + ENTRY_SAME(ni_syscall) /* was socketcall */ + ENTRY_SAME(syslog) + /* even though manpage says struct timeval contains longs, ours has + * time_t and suseconds_t -- both of which are safe wide/narrow */ + ENTRY_COMP(setitimer) + ENTRY_COMP(getitimer) /* 105 */ + ENTRY_SAME(capget) + ENTRY_SAME(capset) + ENTRY_OURS(pread64) + ENTRY_OURS(pwrite64) + ENTRY_SAME(getcwd) /* 110 */ + ENTRY_SAME(vhangup) + ENTRY_SAME(fstat64) + ENTRY_SAME(vfork_wrapper) + /* struct rusage contains longs... */ + ENTRY_COMP(wait4) + ENTRY_SAME(swapoff) /* 115 */ + ENTRY_DIFF(sysinfo) + ENTRY_SAME(shutdown) + ENTRY_SAME(fsync) + ENTRY_SAME(madvise) + ENTRY_SAME(clone_wrapper) /* 120 */ + ENTRY_SAME(setdomainname) + ENTRY_DIFF(sendfile) + /* struct sockaddr... */ + ENTRY_SAME(recvfrom) + /* struct timex contains longs */ + ENTRY_DIFF(adjtimex) + ENTRY_SAME(mprotect) /* 125 */ + /* old_sigset_t forced to 32 bits. Beware glibc sigset_t */ + ENTRY_COMP(sigprocmask) + ENTRY_SAME(ni_syscall) /* create_module */ + ENTRY_SAME(init_module) + ENTRY_SAME(delete_module) + ENTRY_SAME(ni_syscall) /* 130: get_kernel_syms */ + /* time_t inside struct dqblk */ + ENTRY_SAME(quotactl) + ENTRY_SAME(getpgid) + ENTRY_SAME(fchdir) + ENTRY_SAME(bdflush) + ENTRY_SAME(sysfs) /* 135 */ + ENTRY_SAME(personality) + ENTRY_SAME(ni_syscall) /* for afs_syscall */ + ENTRY_SAME(setfsuid) + ENTRY_SAME(setfsgid) + /* I think this might work */ + ENTRY_SAME(llseek) /* 140 */ + /* struct linux_dirent has longs, like 'unsigned long d_ino' which + * almost definitely should be 'ino_t d_ino' but it's too late now */ + ENTRY_DIFF(getdents) + /* it is POSSIBLE that select will be OK because even though fd_set + * contains longs, the macros and sizes are clever. */ + ENTRY_DIFF(select) + ENTRY_SAME(flock) + ENTRY_SAME(msync) + /* struct iovec contains pointers */ + ENTRY_DIFF(readv) /* 145 */ + ENTRY_DIFF(writev) + ENTRY_SAME(getsid) + ENTRY_SAME(fdatasync) + /* struct __sysctl_args is a mess */ + ENTRY_DIFF(sysctl) + ENTRY_SAME(mlock) /* 150 */ + ENTRY_SAME(munlock) + ENTRY_SAME(mlockall) + ENTRY_SAME(munlockall) + /* struct sched_param is ok for now */ + ENTRY_SAME(sched_setparam) + ENTRY_SAME(sched_getparam) /* 155 */ + ENTRY_SAME(sched_setscheduler) + ENTRY_SAME(sched_getscheduler) + ENTRY_SAME(sched_yield) + ENTRY_SAME(sched_get_priority_max) + ENTRY_SAME(sched_get_priority_min) /* 160 */ + /* These 2 would've worked if someone had defined struct timespec + * carefully, like timeval for example (which is about the same). + * Unfortunately it contains a long :-( */ + ENTRY_DIFF(sched_rr_get_interval) + ENTRY_COMP(nanosleep) + ENTRY_SAME(mremap) + ENTRY_SAME(setresuid) + ENTRY_SAME(getresuid) /* 165 */ + ENTRY_DIFF(sigaltstack_wrapper) + ENTRY_SAME(ni_syscall) /* query_module */ + ENTRY_SAME(poll) + /* structs contain pointers and an in_addr... */ + ENTRY_DIFF(nfsservctl) + ENTRY_SAME(setresgid) /* 170 */ + ENTRY_SAME(getresgid) + ENTRY_SAME(prctl) + /* signals need a careful review */ + ENTRY_SAME(rt_sigreturn_wrapper) + ENTRY_DIFF(rt_sigaction) + ENTRY_DIFF(rt_sigprocmask) /* 175 */ + ENTRY_DIFF(rt_sigpending) + ENTRY_UHOH(rt_sigtimedwait) + /* even though the struct siginfo_t is different, it appears like + * all the paths use values which should be same wide and narrow. + * Also the struct is padded to 128 bytes which means we don't have + * to worry about faulting trying to copy in a larger 64-bit + * struct from a 32-bit user-space app. + */ + ENTRY_SAME(rt_sigqueueinfo) + ENTRY_SAME(rt_sigsuspend_wrapper) /* not really SAME -- see the code */ + ENTRY_SAME(chown) /* 180 */ + /* setsockopt() used by iptables: SO_SET_REPLACE/SO_SET_ADD_COUNTERS */ + ENTRY_COMP(setsockopt) + ENTRY_SAME(getsockopt) + ENTRY_COMP(sendmsg) + ENTRY_COMP(recvmsg) + ENTRY_SAME(semop) /* 185 */ + ENTRY_SAME(semget) + ENTRY_DIFF(semctl_broken) + ENTRY_DIFF(msgsnd) + ENTRY_DIFF(msgrcv) + ENTRY_SAME(msgget) /* 190 */ + ENTRY_SAME(msgctl_broken) + ENTRY_SAME(shmat_wrapper) + ENTRY_SAME(shmdt) + ENTRY_SAME(shmget) + ENTRY_SAME(shmctl_broken) /* 195 */ + ENTRY_SAME(ni_syscall) /* streams1 */ + ENTRY_SAME(ni_syscall) /* streams2 */ + ENTRY_SAME(lstat64) + ENTRY_OURS(truncate64) + ENTRY_OURS(ftruncate64) /* 200 */ + ENTRY_SAME(getdents64) + ENTRY_COMP(fcntl64) + ENTRY_SAME(ni_syscall) + ENTRY_SAME(ni_syscall) + ENTRY_SAME(ni_syscall) /* 205 */ + ENTRY_SAME(gettid) + ENTRY_OURS(readahead) + ENTRY_SAME(ni_syscall) /* tkill */ + + ENTRY_SAME(sendfile64) + ENTRY_COMP(futex) /* 210 */ + ENTRY_COMP(sched_setaffinity) + ENTRY_COMP(sched_getaffinity) + ENTRY_SAME(ni_syscall) + ENTRY_SAME(ni_syscall) + ENTRY_SAME(io_setup) /* 215 */ + ENTRY_SAME(io_destroy) + ENTRY_SAME(io_getevents) + ENTRY_SAME(io_submit) + ENTRY_SAME(io_cancel) + ENTRY_SAME(alloc_hugepages) /* 220 */ + ENTRY_SAME(free_hugepages) + ENTRY_SAME(exit_group) + ENTRY_DIFF(lookup_dcookie) + ENTRY_SAME(epoll_create) + ENTRY_SAME(epoll_ctl) /* 225 */ + ENTRY_SAME(epoll_wait) + ENTRY_SAME(remap_file_pages) diff -Nru a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c --- a/arch/parisc/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -12,6 +12,7 @@ */ #include #include +#include #include #include #include @@ -34,6 +35,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + /* xtime and wall_jiffies keep wall-clock time */ extern unsigned long wall_jiffies; @@ -48,7 +51,9 @@ parisc_do_profile(struct pt_regs *regs) { unsigned long pc = regs->iaoq[0]; +#if 0 extern unsigned long prof_cpu_mask; +#endif extern char _stext; profile_hook(regs); @@ -60,6 +65,10 @@ return; #if 0 + /* FIXME: when we have irq affinity to cpu, we need to + * only look at the cpus specified in this mask + */ + if (!((1 << smp_processor_id()) & prof_cpu_mask)) return; #endif @@ -187,6 +196,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday (struct timespec *tv) { @@ -206,7 +217,6 @@ * done, and then undo it! */ nsec -= gettimeoffset() * 1000; - nsec -= (jiffies - wall_jiffies) * (NSEC_PER_SEC / HZ); wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec); @@ -221,6 +231,18 @@ } write_sequnlock_irq(&xtime_lock); return 0; +} + +EXPORT_SYMBOL(do_settimeofday); + +/* + * XXX: We can do better than this. + * Returns nanoseconds + */ + +unsigned long long sched_clock(void) +{ + return (unsigned long long)jiffies * (1000000000 / HZ); } diff -Nru a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c --- a/arch/parisc/kernel/traps.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/kernel/traps.c Wed Oct 8 12:24:57 2003 @@ -129,6 +129,7 @@ show_trace(current, &stack); } +EXPORT_SYMBOL(dump_stack); #ifndef __LP64__ static int kstack_depth_to_print = 64 * 4; @@ -678,12 +679,13 @@ } if (user_mode(regs)) { - if (fault_space != regs->sr[7]) { + if ((fault_space>>SPACEID_SHIFT) != (regs->sr[7] >> SPACEID_SHIFT)) { #ifdef PRINT_USER_FAULTS if (fault_space == 0) printk(KERN_DEBUG "User Fault on Kernel Space "); else - printk(KERN_DEBUG "User Fault (long pointer) "); + printk(KERN_DEBUG "User Fault (long pointer) (fault %d) ", + code); printk("pid=%d command='%s'\n", current->pid, current->comm); show_regs(regs); #endif diff -Nru a/arch/parisc/kernel/unaligned.c b/arch/parisc/kernel/unaligned.c --- a/arch/parisc/kernel/unaligned.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/kernel/unaligned.c Wed Oct 8 12:24:56 2003 @@ -369,8 +369,8 @@ void handle_unaligned(struct pt_regs *regs) { - unsigned long unaligned_count = 0; - unsigned long last_time = 0; + static unsigned long unaligned_count = 0; + static unsigned long last_time = 0; unsigned long newbase = R1(regs->iir)?regs->gr[R1(regs->iir)]:0; int modify = 0; int ret = -1; @@ -380,7 +380,6 @@ /* if the unaligned access is inside the kernel: * if the access is caused by a syscall, then we fault the calling * user process - * otherwise we halt the kernel */ if (!user_mode(regs)) { @@ -427,10 +426,10 @@ show_regs(regs); #endif } - } - if (!unaligned_enabled) - goto force_sigbus; + if (!unaligned_enabled) + goto force_sigbus; + } /* handle modification - OK, it's ugly, see the instruction manual */ switch (MAJOR_OP(regs->iir)) diff -Nru a/arch/parisc/lib/checksum.c b/arch/parisc/lib/checksum.c --- a/arch/parisc/lib/checksum.c Wed Oct 8 12:24:57 2003 +++ b/arch/parisc/lib/checksum.c Wed Oct 8 12:24:57 2003 @@ -16,8 +16,10 @@ * * $Id: checksum.c,v 1.3 1997/12/01 17:57:34 ralf Exp $ */ -#include +#include #include + +#include #include #include #include @@ -94,6 +96,8 @@ return result; } +EXPORT_SYMBOL(csum_partial); + /* * copy while checksumming, otherwise like csum_partial */ @@ -109,6 +113,7 @@ return sum; } +EXPORT_SYMBOL(csum_partial_copy_nocheck); /* * Copy from userspace and compute checksum. If we catch an exception @@ -128,3 +133,4 @@ return csum_partial(dst, len, sum); } +EXPORT_SYMBOL(csum_partial_copy_from_user); diff -Nru a/arch/parisc/lib/io.c b/arch/parisc/lib/io.c --- a/arch/parisc/lib/io.c Wed Oct 8 12:24:55 2003 +++ b/arch/parisc/lib/io.c Wed Oct 8 12:24:55 2003 @@ -8,6 +8,7 @@ */ #include +#include #include /* Copies a block of memory to a device in an efficient manner. @@ -457,3 +458,10 @@ break; } } + +EXPORT_SYMBOL(insb); +EXPORT_SYMBOL(insw); +EXPORT_SYMBOL(insl); +EXPORT_SYMBOL(outsb); +EXPORT_SYMBOL(outsw); +EXPORT_SYMBOL(outsl); diff -Nru a/arch/parisc/math-emu/Makefile b/arch/parisc/math-emu/Makefile --- a/arch/parisc/math-emu/Makefile Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/math-emu/Makefile Wed Oct 8 12:24:56 2003 @@ -2,6 +2,11 @@ # Makefile for the linux/parisc floating point code # +# See arch/parisc/math-emu/README +CFLAGS += -Wno-parentheses -Wno-implicit-function-declaration \ + -Wno-uninitialized -Wno-strict-prototypes -Wno-return-type \ + -Wno-implicit-int + obj-y := frnd.o driver.o decode_exc.o fpudispatch.o denormal.o \ dfmpy.o sfmpy.o sfsqrt.o dfsqrt.o dfadd.o fmpyfadd.o \ sfadd.o dfsub.o sfsub.o fcnvfxt.o fcnvff.o fcnvxf.o \ diff -Nru a/arch/parisc/math-emu/denormal.c b/arch/parisc/math-emu/denormal.c --- a/arch/parisc/math-emu/denormal.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/math-emu/denormal.c Wed Oct 8 12:24:56 2003 @@ -47,7 +47,7 @@ #include "sgl_float.h" #include "dbl_float.h" #include "hppa.h" -#include "types.h" +#include /* #include */ #undef Fpustatus_register diff -Nru a/arch/parisc/math-emu/fpudispatch.c b/arch/parisc/math-emu/fpudispatch.c --- a/arch/parisc/math-emu/fpudispatch.c Wed Oct 8 12:24:55 2003 +++ b/arch/parisc/math-emu/fpudispatch.c Wed Oct 8 12:24:55 2003 @@ -50,7 +50,7 @@ #define FPUDEBUG 0 #include "float.h" -#include "types.h" +#include #include /* #include */ /* #include */ diff -Nru a/arch/parisc/math-emu/types.h b/arch/parisc/math-emu/types.h --- a/arch/parisc/math-emu/types.h Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,25 +0,0 @@ -/* - * Linux/PA-RISC Project (http://www.parisc-linux.org/) - * - * Floating-point emulation code - * Copyright (C) 2001 Hewlett-Packard (Paul Bame) - * - * 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, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include -#define BUG() do { \ - printk(KERN_ERR "floating-pt emulation BUG at %s:%d!\n", __FILE__, __LINE__); \ -} while (0) diff -Nru a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c --- a/arch/parisc/mm/init.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/mm/init.c Wed Oct 8 12:24:56 2003 @@ -430,6 +430,8 @@ & ~(VM_MAP_OFFSET-1))) void *vmalloc_start; +EXPORT_SYMBOL(vmalloc_start); + #ifdef CONFIG_PA11 unsigned long pcxl_dma_start; #endif @@ -617,8 +619,6 @@ static void __init pagetable_init(void) { int range; - - printk("pagetable_init\n"); /* Map each physical memory range to its kernel vaddr */ diff -Nru a/arch/parisc/mm/ioremap.c b/arch/parisc/mm/ioremap.c --- a/arch/parisc/mm/ioremap.c Wed Oct 8 12:24:56 2003 +++ b/arch/parisc/mm/ioremap.c Wed Oct 8 12:24:56 2003 @@ -159,7 +159,7 @@ if (!area) return NULL; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vfree(addr); return NULL; } diff -Nru a/arch/ppc/Kconfig b/arch/ppc/Kconfig --- a/arch/ppc/Kconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/Kconfig Wed Oct 8 12:24:57 2003 @@ -682,7 +682,7 @@ config NR_CPUS int "Maximum number of CPUs (2-32)" depends on SMP - default "32" + default "4" config PREEMPT bool "Preemptible Kernel" diff -Nru a/arch/ppc/configs/beech_defconfig b/arch/ppc/configs/beech_defconfig --- a/arch/ppc/configs/beech_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/beech_defconfig Wed Oct 8 12:24:57 2003 @@ -4,11 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +23,14 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set CONFIG_EMBEDDED=y +# CONFIG_KALLSYMS is not set CONFIG_FUTEX=y # CONFIG_EPOLL is not set +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y # # Loadable module support @@ -33,14 +43,16 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set CONFIG_40x=y +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -67,29 +79,30 @@ CONFIG_UART0_TTYS0=y # CONFIG_UART0_TTYS1 is not set CONFIG_NOT_COHERENT_CACHE=y + +# +# Platform options +# +# CONFIG_PC_KEYBOARD is not set # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set # CONFIG_PCI is not set # CONFIG_PCI_DOMAINS is not set -# CONFIG_PC_KEYBOARD is not set -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set # CONFIG_HOTPLUG is not set # # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -106,6 +119,10 @@ CONFIG_BOOT_LOAD=0x00400000 # +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # CONFIG_MTD=y @@ -145,7 +162,6 @@ # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_PHYSMAP is not set CONFIG_MTD_BEECH=y -# CONFIG_MTD_UCLINUX is not set # # Self-contained MTD device drivers @@ -174,12 +190,13 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # # Multi-device support (RAID and LVM) @@ -187,12 +204,12 @@ # CONFIG_MD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # # CONFIG_IDE is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set @@ -214,7 +231,6 @@ # # CONFIG_PACKET is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -234,7 +250,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -243,9 +261,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -268,7 +286,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -293,7 +310,7 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # # CONFIG_SHAPER is not set @@ -313,6 +330,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -332,29 +354,37 @@ # CONFIG_LOGO is not set # -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# # Input device support # -# CONFIG_INPUT is not set +CONFIG_INPUT=y # # Userland interfaces # +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set # # Input Device Drivers # +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set # # Macintosh device drivers @@ -363,6 +393,7 @@ # # Character devices # +# CONFIG_VT is not set # CONFIG_SERIAL_NONSTANDARD is not set # @@ -370,6 +401,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -384,27 +416,33 @@ # I2C support # CONFIG_I2C=y +# CONFIG_I2C_CHARDEV is not set + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_IBM_OCP_ALGO is not set -# CONFIG_I2C_CHARDEV is not set # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_IBM_IIC=y # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -435,7 +473,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -479,12 +516,14 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y CONFIG_DEVFS_FS=y # CONFIG_DEVFS_MOUNT is not set # CONFIG_DEVFS_DEBUG is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -555,11 +594,6 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # # CONFIG_CRC32 is not set @@ -568,7 +602,6 @@ # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set # CONFIG_SERIAL_TEXT_DEBUG is not set CONFIG_OCP=y diff -Nru a/arch/ppc/configs/common_defconfig b/arch/ppc/configs/common_defconfig --- a/arch/ppc/configs/common_defconfig Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/configs/common_defconfig Wed Oct 8 12:24:56 2003 @@ -4,12 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y -# CONFIG_BROKEN is not set +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -40,25 +44,29 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y CONFIG_6xx=y # CONFIG_40x is not set +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +CONFIG_ALTIVEC=y +CONFIG_TAU=y +# CONFIG_TAU_INT is not set +# CONFIG_TAU_AVERAGE is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PPC601_SYNC_FIX=y +CONFIG_PM=y +CONFIG_PPC_STD_MMU=y # -# IBM 4xx options +# Platform options # -CONFIG_PM=y -# CONFIG_8260 is not set -CONFIG_GENERIC_ISA_DMA=y -CONFIG_PPC_STD_MMU=y CONFIG_PPC_MULTIPLATFORM=y # CONFIG_APUS is not set -# CONFIG_WILLOW_2 is not set +# CONFIG_WILLOW is not set # CONFIG_PCORE is not set # CONFIG_POWERPMC250 is not set # CONFIG_EV64260 is not set @@ -74,28 +82,35 @@ # CONFIG_K2 is not set # CONFIG_PAL4 is not set # CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX6 is not set +# CONFIG_TQM8260 is not set CONFIG_PPC_CHRP=y CONFIG_PPC_PMAC=y CONFIG_PPC_PREP=y CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -CONFIG_ALTIVEC=y -CONFIG_TAU=y -# CONFIG_TAU_INT is not set -# CONFIG_TAU_AVERAGE is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PPC_RTAS=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set +CONFIG_ISA=y +CONFIG_GENERIC_ISA_DMA=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -CONFIG_KCORE_ELF=y -CONFIG_KERNEL_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=m CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y CONFIG_HOTPLUG=y @@ -104,19 +119,12 @@ # PCMCIA/CardBus support # # CONFIG_PCMCIA is not set +CONFIG_PCMCIA_PROBE=y # # Parallel port support # # CONFIG_PARPORT is not set -CONFIG_PPC601_SYNC_FIX=y -CONFIG_PROC_DEVICETREE=y -CONFIG_PPC_RTAS=y -CONFIG_PREP_RESIDUAL=y -CONFIG_PROC_PREPRESIDUAL=y -CONFIG_PPCBUG_NVRAM=y -CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" # # Advanced setup @@ -151,6 +159,7 @@ # Block devices # CONFIG_BLK_DEV_FD=m +# CONFIG_BLK_DEV_XD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -225,8 +234,11 @@ # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y CONFIG_BLK_DEV_IDEDMA_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_BLINK=y CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_CHIPSETS is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y @@ -237,6 +249,7 @@ # SCSI device support # CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) @@ -260,7 +273,10 @@ # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_7000FASST is not set # CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set # CONFIG_SCSI_AACRAID is not set CONFIG_SCSI_AIC7XXX=m CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 @@ -272,30 +288,37 @@ CONFIG_AIC7XXX_REG_PRETTY_PRINT=y CONFIG_SCSI_AIC7XXX_OLD=m # CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_DPT_I2O is not set CONFIG_SCSI_ADVANSYS=m +# CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_NCR53C406A is not set CONFIG_SCSI_SYM53C8XX_2=y CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -# CONFIG_SCSI_PCI2000 is not set -# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set CONFIG_SCSI_MESH=y @@ -366,6 +389,7 @@ # CONFIG_IP_NF_QUEUE is not set CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m @@ -381,15 +405,15 @@ CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_UNCLEAN=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_MIRROR=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m # CONFIG_IP_NF_NAT_LOCAL is not set CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m @@ -411,7 +435,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -439,7 +465,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -453,6 +478,9 @@ # CONFIG_HAPPYMEAL is not set CONFIG_SUNGEM=y # CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set # # Tulip family network device support @@ -465,12 +493,18 @@ CONFIG_DE4X5=m # CONFIG_WINBOND_840 is not set # CONFIG_DM9102 is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set # CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set CONFIG_NET_PCI=y CONFIG_PCNET32=y # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set # CONFIG_B44 is not set +# CONFIG_CS89x0 is not set # CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set # CONFIG_E100 is not set @@ -484,6 +518,7 @@ # CONFIG_SUNDANCE is not set # CONFIG_TLAN is not set # CONFIG_VIA_RHINE is not set +# CONFIG_NET_POCKET is not set # # Ethernet (1000 Mbit) @@ -524,6 +559,8 @@ # Obsolete Wireless cards support (pre-802.11) # # CONFIG_STRIP is not set +# CONFIG_ARLAN is not set +# CONFIG_WAVELAN is not set # # Wireless 802.11b ISA/PCI cards support @@ -537,8 +574,9 @@ CONFIG_NET_WIRELESS=y # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_NET_FC is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -559,6 +597,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -567,8 +610,6 @@ # Graphics support # CONFIG_FB=y -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_OF=y CONFIG_FB_CONTROL=y @@ -596,7 +637,6 @@ CONFIG_FB_3DFX=y # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set -# CONFIG_FB_PM3 is not set # CONFIG_FB_VIRTUAL is not set # @@ -620,6 +660,11 @@ CONFIG_LOGO_LINUX_CLUT224=y # +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# # Input device support # CONFIG_INPUT=y @@ -657,7 +702,11 @@ # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_PS2_SYNAPTICS is not set # CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y @@ -692,12 +741,15 @@ # Serial drivers # CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # # Non-8250 serial port support # -CONFIG_SERIAL_CORE=m +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_PMACZILOG=y +# CONFIG_SERIAL_PMACZILOG_CONSOLE is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 @@ -705,35 +757,43 @@ # I2C support # CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -CONFIG_I2C_KEYWEST=m -CONFIG_I2C_CHARDEV=m # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set +# CONFIG_I2C_ISA is not set +CONFIG_I2C_KEYWEST=m # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIAPRO is not set # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -764,7 +824,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -812,12 +871,14 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y CONFIG_DEVFS_FS=y # CONFIG_DEVFS_MOUNT is not set # CONFIG_DEVFS_DEBUG is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -926,7 +987,8 @@ # Sound # CONFIG_SOUND=m -# CONFIG_DMASOUND_AWACS is not set +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m # # Advanced Linux Sound Architecture @@ -951,6 +1013,32 @@ # CONFIG_SND_MPU401 is not set # +# ISA devices +# +# CONFIG_SND_AD1848 is not set +# CONFIG_SND_CS4231 is not set +CONFIG_SND_CS4232=m +# CONFIG_SND_CS4236 is not set +# CONFIG_SND_ES1688 is not set +# CONFIG_SND_ES18XX is not set +# CONFIG_SND_GUSCLASSIC is not set +# CONFIG_SND_GUSEXTREME is not set +# CONFIG_SND_GUSMAX is not set +# CONFIG_SND_INTERWAVE is not set +# CONFIG_SND_INTERWAVE_STB is not set +# CONFIG_SND_OPTI92X_AD1848 is not set +# CONFIG_SND_OPTI92X_CS4231 is not set +# CONFIG_SND_OPTI93X is not set +# CONFIG_SND_SB8 is not set +# CONFIG_SND_SB16 is not set +# CONFIG_SND_SBAWE is not set +# CONFIG_SND_WAVEFRONT is not set +# CONFIG_SND_CMI8330 is not set +# CONFIG_SND_OPL3SA2 is not set +# CONFIG_SND_SGALAXY is not set +# CONFIG_SND_SSCAPE is not set + +# # PCI devices # # CONFIG_SND_ALI5451 is not set @@ -1068,7 +1156,6 @@ # # USB Network adaptors # -# CONFIG_USB_AX8817X is not set # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set @@ -1130,14 +1217,9 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # -# CONFIG_CRC32 is not set +CONFIG_CRC32=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y diff -Nru a/arch/ppc/configs/cpci405_defconfig b/arch/ppc/configs/cpci405_defconfig --- a/arch/ppc/configs/cpci405_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/cpci405_defconfig Wed Oct 8 12:24:57 2003 @@ -4,11 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +23,14 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set CONFIG_EMBEDDED=y +# CONFIG_KALLSYMS is not set CONFIG_FUTEX=y # CONFIG_EPOLL is not set +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y # # Loadable module support @@ -33,14 +43,16 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set CONFIG_40x=y +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -67,22 +79,24 @@ CONFIG_UART0_TTYS0=y # CONFIG_UART0_TTYS1 is not set CONFIG_NOT_COHERENT_CACHE=y + +# +# Platform options +# +# CONFIG_PC_KEYBOARD is not set # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -# CONFIG_PC_KEYBOARD is not set -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set CONFIG_PCI_LEGACY_PROC=y # CONFIG_PCI_NAMES is not set # CONFIG_HOTPLUG is not set @@ -91,7 +105,6 @@ # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -108,6 +121,10 @@ CONFIG_BOOT_LOAD=0x00400000 # +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set @@ -120,7 +137,6 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -130,6 +146,7 @@ CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # # Multi-device support (RAID and LVM) @@ -137,33 +154,34 @@ # CONFIG_MD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y - -# -# IDE, ATA and ATAPI Block devices -# CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # -# CONFIG_BLK_DEV_HD is not set CONFIG_BLK_DEV_IDEDISK=y # CONFIG_IDEDISK_MULTI_MODE is not set # CONFIG_IDEDISK_STROKE is not set # CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set # # IDE chipset support/bugfixes # # CONFIG_BLK_DEV_IDEPCI is not set +# CONFIG_BLK_DEV_IDEDMA is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_HD is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set @@ -191,7 +209,6 @@ # # CONFIG_PACKET is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -211,7 +228,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -220,9 +239,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -250,7 +269,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -267,6 +285,7 @@ # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set # CONFIG_SK98LIN is not set # CONFIG_TIGON3 is not set @@ -285,8 +304,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -306,6 +326,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -316,29 +341,38 @@ # CONFIG_FB is not set # -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# # Input device support # -# CONFIG_INPUT is not set +CONFIG_INPUT=y # # Userland interfaces # +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set # # Input Device Drivers # +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set # # Macintosh device drivers @@ -347,6 +381,7 @@ # # Character devices # +# CONFIG_VT is not set # CONFIG_SERIAL_NONSTANDARD is not set # @@ -354,6 +389,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -367,33 +403,42 @@ # I2C support # CONFIG_I2C=y +CONFIG_I2C_CHARDEV=y + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -CONFIG_I2C_IBM_OCP_ALGO=y -CONFIG_I2C_IBM_OCP_ADAP=y -CONFIG_I2C_CHARDEV=y # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # +# CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set +CONFIG_I2C_IBM_IIC=y +# CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIAPRO is not set # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -424,7 +469,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -470,8 +514,10 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -575,11 +621,6 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # CONFIG_CRC32=y @@ -588,7 +629,6 @@ # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set # CONFIG_SERIAL_TEXT_DEBUG is not set CONFIG_OCP=y diff -Nru a/arch/ppc/configs/ebony_defconfig b/arch/ppc/configs/ebony_defconfig --- a/arch/ppc/configs/ebony_defconfig Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/configs/ebony_defconfig Wed Oct 8 12:24:56 2003 @@ -4,12 +4,15 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set CONFIG_BROKEN_ON_SMP=y # @@ -39,16 +42,17 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set # CONFIG_40x is not set CONFIG_44x=y # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set CONFIG_PTE_64BIT=y +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -63,21 +67,25 @@ CONFIG_IBM_OCP=y # CONFIG_PM is not set CONFIG_NOT_COHERENT_CACHE=y -# CONFIG_SMP is not set -# CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set # -# General setup +# Platform options # -# CONFIG_HIGHMEM is not set -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y # CONFIG_PC_KEYBOARD is not set +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +# CONFIG_HIGHMEM is not set CONFIG_KERNEL_ELF=y CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="ip=on" + +# +# Bus options +# +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y # CONFIG_PCI_LEGACY_PROC is not set # CONFIG_PCI_NAMES is not set # CONFIG_HOTPLUG is not set @@ -86,8 +94,6 @@ # Parallel port support # # CONFIG_PARPORT is not set -CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="ip=on" # # Advanced setup @@ -120,7 +126,6 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -216,7 +221,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -279,8 +286,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -300,6 +308,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -338,7 +351,11 @@ # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set # # Input Device Drivers @@ -366,6 +383,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y @@ -387,7 +405,11 @@ # CONFIG_I2C is not set # -# I2C Hardware Sensors Mainboard support +# I2C Algorithms +# + +# +# I2C Hardware Bus support # # @@ -423,7 +445,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -466,10 +487,12 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_TMPFS is not set +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -523,11 +546,6 @@ # # CONFIG_USB is not set # CONFIG_USB_GADGET is not set - -# -# Bluetooth support -# -# CONFIG_BT is not set # # Library routines diff -Nru a/arch/ppc/configs/ep405_defconfig b/arch/ppc/configs/ep405_defconfig --- a/arch/ppc/configs/ep405_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/ep405_defconfig Wed Oct 8 12:24:57 2003 @@ -4,11 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +23,14 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set # CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y CONFIG_FUTEX=y CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y # # Loadable module support @@ -33,14 +43,16 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set CONFIG_40x=y +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -70,22 +82,24 @@ CONFIG_UART0_TTYS0=y # CONFIG_UART0_TTYS1 is not set CONFIG_NOT_COHERENT_CACHE=y + +# +# Platform options +# +# CONFIG_PC_KEYBOARD is not set # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -# CONFIG_PC_KEYBOARD is not set -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set # CONFIG_PCI_LEGACY_PROC is not set # CONFIG_PCI_NAMES is not set # CONFIG_HOTPLUG is not set @@ -94,7 +108,6 @@ # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -111,6 +124,10 @@ CONFIG_BOOT_LOAD=0x00400000 # +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set @@ -123,16 +140,17 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # # Multi-device support (RAID and LVM) @@ -140,12 +158,12 @@ # CONFIG_MD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # # CONFIG_IDE is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set @@ -173,7 +191,6 @@ # # CONFIG_PACKET is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -193,7 +210,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -202,9 +221,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -232,7 +251,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -261,6 +279,7 @@ # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set # CONFIG_SK98LIN is not set # CONFIG_TIGON3 is not set @@ -279,8 +298,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -300,6 +320,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -310,18 +335,28 @@ # CONFIG_FB is not set # -# Old CD-ROM drivers (not SCSI, not IDE) +# Console display driver support # -# CONFIG_CD_NO_IDESCSI is not set +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y # # Input device support # -# CONFIG_INPUT is not set +CONFIG_INPUT=y # # Userland interfaces # +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set # # Input I/O drivers @@ -332,10 +367,16 @@ # CONFIG_SERIO_I8042 is not set CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set # # Input Device Drivers # +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set # # Macintosh device drivers @@ -344,6 +385,9 @@ # # Character devices # +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y # CONFIG_SERIAL_NONSTANDARD is not set # @@ -351,6 +395,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -364,32 +409,42 @@ # I2C support # CONFIG_I2C=y +# CONFIG_I2C_CHARDEV is not set + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_IBM_OCP_ALGO is not set -# CONFIG_I2C_CHARDEV is not set # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # +# CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set +CONFIG_I2C_IBM_IIC=y +# CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIAPRO is not set # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -420,7 +475,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -464,8 +518,10 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -525,11 +581,6 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # CONFIG_CRC32=y @@ -538,7 +589,6 @@ # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set # CONFIG_SERIAL_TEXT_DEBUG is not set CONFIG_OCP=y diff -Nru a/arch/ppc/configs/ibmchrp_defconfig b/arch/ppc/configs/ibmchrp_defconfig --- a/arch/ppc/configs/ibmchrp_defconfig Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/configs/ibmchrp_defconfig Wed Oct 8 12:24:56 2003 @@ -4,12 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y -# CONFIG_BROKEN is not set +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -40,24 +44,26 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y CONFIG_6xx=y # CONFIG_40x is not set +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_ALTIVEC is not set +# CONFIG_TAU is not set +# CONFIG_CPU_FREQ is not set +# CONFIG_PPC601_SYNC_FIX is not set +CONFIG_PPC_STD_MMU=y # -# IBM 4xx options +# Platform options # -# CONFIG_8260 is not set -CONFIG_GENERIC_ISA_DMA=y -CONFIG_PPC_STD_MMU=y CONFIG_PPC_MULTIPLATFORM=y # CONFIG_APUS is not set -# CONFIG_WILLOW_2 is not set +# CONFIG_WILLOW is not set # CONFIG_PCORE is not set # CONFIG_POWERPMC250 is not set # CONFIG_EV64260 is not set @@ -73,26 +79,33 @@ # CONFIG_K2 is not set # CONFIG_PAL4 is not set # CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX6 is not set +# CONFIG_TQM8260 is not set CONFIG_PPC_CHRP=y CONFIG_PPC_PMAC=y CONFIG_PPC_PREP=y CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_ALTIVEC is not set -# CONFIG_TAU is not set -# CONFIG_CPU_FREQ is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=y +CONFIG_PROC_DEVICETREE=y +CONFIG_PPC_RTAS=y +# CONFIG_PREP_RESIDUAL is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -CONFIG_HIGHMEM=y +CONFIG_ISA=y +CONFIG_GENERIC_ISA_DMA=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -CONFIG_KCORE_ELF=y -CONFIG_KERNEL_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=y CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y # CONFIG_HOTPLUG is not set @@ -101,12 +114,6 @@ # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_PPC601_SYNC_FIX is not set -CONFIG_PROC_DEVICETREE=y -CONFIG_PPC_RTAS=y -# CONFIG_PREP_RESIDUAL is not set -CONFIG_PPCBUG_NVRAM=y -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -140,6 +147,7 @@ # Block devices # CONFIG_BLK_DEV_FD=y +# CONFIG_BLK_DEV_XD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -166,6 +174,7 @@ # SCSI device support # CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) @@ -189,35 +198,45 @@ # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_7000FASST is not set # CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_NCR53C406A is not set CONFIG_SCSI_SYM53C8XX_2=y CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -# CONFIG_SCSI_PCI2000 is not set -# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_MESH is not set @@ -286,6 +305,7 @@ # CONFIG_IP_NF_QUEUE is not set CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m # CONFIG_IP_NF_MATCH_PKTTYPE is not set CONFIG_IP_NF_MATCH_MARK=m @@ -301,15 +321,15 @@ CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_UNCLEAN=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_MIRROR=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m # CONFIG_IP_NF_NAT_LOCAL is not set CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m @@ -333,7 +353,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -361,7 +383,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -374,17 +395,26 @@ # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set # # Tulip family network device support # # CONFIG_NET_TULIP is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set # CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set CONFIG_NET_PCI=y CONFIG_PCNET32=y # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set # CONFIG_B44 is not set +# CONFIG_CS89x0 is not set # CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set # CONFIG_E100 is not set @@ -398,6 +428,7 @@ # CONFIG_SUNDANCE is not set # CONFIG_TLAN is not set # CONFIG_VIA_RHINE is not set +# CONFIG_NET_POCKET is not set # # Ethernet (1000 Mbit) @@ -428,8 +459,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_NET_FC is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -450,6 +482,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -458,8 +495,6 @@ # Graphics support # CONFIG_FB=y -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_OF=y # CONFIG_FB_CONTROL is not set @@ -485,7 +520,6 @@ CONFIG_FB_3DFX=y # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set -# CONFIG_FB_PM3 is not set # CONFIG_FB_VIRTUAL is not set # @@ -509,6 +543,11 @@ CONFIG_LOGO_LINUX_CLUT224=y # +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# # Input device support # CONFIG_INPUT=y @@ -546,7 +585,11 @@ # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_PS2_SYNAPTICS is not set # CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y @@ -575,12 +618,14 @@ # CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_CONSOLE is not set +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # # Non-8250 serial port support # CONFIG_SERIAL_CORE=y +# CONFIG_SERIAL_PMACZILOG is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 @@ -590,7 +635,11 @@ # CONFIG_I2C is not set # -# I2C Hardware Sensors Mainboard support +# I2C Algorithms +# + +# +# I2C Hardware Bus support # # @@ -627,7 +676,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -675,12 +723,14 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y CONFIG_DEVFS_FS=y # CONFIG_DEVFS_MOUNT is not set # CONFIG_DEVFS_DEBUG is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -788,14 +838,9 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # -# CONFIG_CRC32 is not set +CONFIG_CRC32=y # # Kernel hacking diff -Nru a/arch/ppc/configs/ocotea_defconfig b/arch/ppc/configs/ocotea_defconfig --- a/arch/ppc/configs/ocotea_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/ocotea_defconfig Wed Oct 8 12:24:57 2003 @@ -4,12 +4,15 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set CONFIG_BROKEN_ON_SMP=y # @@ -40,16 +43,17 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set # CONFIG_40x is not set CONFIG_44x=y # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set CONFIG_PTE_64BIT=y +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -65,21 +69,25 @@ CONFIG_IBM_EMAC4=y # CONFIG_PM is not set CONFIG_NOT_COHERENT_CACHE=y -# CONFIG_SMP is not set -# CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set # -# General setup +# Platform options # -# CONFIG_HIGHMEM is not set -CONFIG_PCI=y -CONFIG_PCI_DOMAINS=y # CONFIG_PC_KEYBOARD is not set +# CONFIG_SMP is not set +# CONFIG_PREEMPT is not set +# CONFIG_HIGHMEM is not set CONFIG_KERNEL_ELF=y CONFIG_BINFMT_ELF=y # CONFIG_BINFMT_MISC is not set +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="ip=on console=ttyS0,115200" + +# +# Bus options +# +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y # CONFIG_PCI_LEGACY_PROC is not set # CONFIG_PCI_NAMES is not set # CONFIG_HOTPLUG is not set @@ -88,8 +96,6 @@ # Parallel port support # # CONFIG_PARPORT is not set -CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="ip=on console=ttyS0,115200" # # Advanced setup @@ -122,7 +128,6 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -218,7 +223,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -293,8 +300,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -314,6 +322,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -352,7 +365,11 @@ # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set # # Input Device Drivers @@ -380,6 +397,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y @@ -401,7 +419,11 @@ # CONFIG_I2C is not set # -# I2C Hardware Sensors Mainboard support +# I2C Algorithms +# + +# +# I2C Hardware Bus support # # @@ -437,7 +459,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -480,10 +501,12 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_TMPFS is not set +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -537,11 +560,6 @@ # # CONFIG_USB is not set # CONFIG_USB_GADGET is not set - -# -# Bluetooth support -# -# CONFIG_BT is not set # # Library routines diff -Nru a/arch/ppc/configs/pmac_defconfig b/arch/ppc/configs/pmac_defconfig --- a/arch/ppc/configs/pmac_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/pmac_defconfig Wed Oct 8 12:24:57 2003 @@ -4,12 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y -# CONFIG_BROKEN is not set +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -40,26 +44,37 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y CONFIG_6xx=y # CONFIG_40x is not set +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +CONFIG_ALTIVEC=y +CONFIG_TAU=y +# CONFIG_TAU_INT is not set +# CONFIG_TAU_AVERAGE is not set +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=y +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_PMAC=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_PPC601_SYNC_FIX=y +CONFIG_PM=y +CONFIG_PPC_STD_MMU=y # -# IBM 4xx options +# Platform options # -CONFIG_PM=y -# CONFIG_8260 is not set -CONFIG_GENERIC_ISA_DMA=y -CONFIG_PPC_STD_MMU=y -# CONFIG_SERIAL_CONSOLE is not set CONFIG_PPC_MULTIPLATFORM=y # CONFIG_APUS is not set -# CONFIG_WILLOW_2 is not set +# CONFIG_WILLOW is not set # CONFIG_PCORE is not set # CONFIG_POWERPMC250 is not set # CONFIG_EV64260 is not set @@ -75,32 +90,33 @@ # CONFIG_K2 is not set # CONFIG_PAL4 is not set # CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX6 is not set +# CONFIG_TQM8260 is not set CONFIG_PPC_CHRP=y CONFIG_PPC_PMAC=y CONFIG_PPC_PREP=y CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -CONFIG_ALTIVEC=y -CONFIG_TAU=y -# CONFIG_TAU_INT is not set -# CONFIG_TAU_AVERAGE is not set -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_TABLE=y -CONFIG_CPU_FREQ_PROC_INTF=y -CONFIG_CPU_FREQ_24_API=y -CONFIG_CPU_FREQ_PMAC=y +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PPC_RTAS=y +# CONFIG_PREP_RESIDUAL is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set +# CONFIG_ISA is not set +CONFIG_GENERIC_ISA_DMA=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -CONFIG_KCORE_ELF=y -CONFIG_KERNEL_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=m CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y CONFIG_HOTPLUG=y @@ -118,12 +134,6 @@ # Parallel port support # # CONFIG_PARPORT is not set -CONFIG_PPC601_SYNC_FIX=y -CONFIG_PROC_DEVICETREE=y -CONFIG_PPC_RTAS=y -# CONFIG_PREP_RESIDUAL is not set -CONFIG_PPCBUG_NVRAM=y -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -156,7 +166,6 @@ # # Block devices # -CONFIG_BLK_DEV_FD=m # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -232,7 +241,9 @@ # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y CONFIG_BLK_DEV_IDEDMA_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_BLINK=y CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set @@ -244,6 +255,7 @@ # SCSI device support # CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) @@ -279,7 +291,6 @@ CONFIG_AIC7XXX_REG_PRETTY_PRINT=y CONFIG_SCSI_AIC7XXX_OLD=m # CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_DPT_I2O is not set CONFIG_SCSI_ADVANSYS=m # CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_BUSLOGIC is not set @@ -289,20 +300,17 @@ # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INIA100 is not set CONFIG_SCSI_SYM53C8XX_2=y CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -# CONFIG_SCSI_PCI2000 is not set -# CONFIG_SCSI_PCI2220I is not set # 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_NSP32 is not set # CONFIG_SCSI_DEBUG is not set CONFIG_SCSI_MESH=y @@ -407,6 +415,7 @@ # CONFIG_IP_NF_QUEUE is not set CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m @@ -422,15 +431,15 @@ CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_UNCLEAN=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_MIRROR=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m # CONFIG_IP_NF_NAT_LOCAL is not set CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m @@ -454,7 +463,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -482,7 +493,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -588,8 +598,9 @@ CONFIG_NET_WIRELESS=y # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_NET_FC is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -664,11 +675,15 @@ # FIR device drivers # # CONFIG_USB_IRDA is not set -# CONFIG_TOSHIBA_OLD is not set # CONFIG_TOSHIBA_FIR is not set # CONFIG_VLSI_FIR is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -677,8 +692,6 @@ # Graphics support # CONFIG_FB=y -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_OF=y CONFIG_FB_CONTROL=y @@ -707,7 +720,6 @@ CONFIG_FB_3DFX=y # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set -# CONFIG_FB_PM3 is not set # CONFIG_FB_VIRTUAL is not set # @@ -752,13 +764,23 @@ # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_MISC is not set @@ -792,12 +814,15 @@ # CONFIG_SERIAL_8250=m CONFIG_SERIAL_8250_CS=m +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # # Non-8250 serial port support # -CONFIG_SERIAL_CORE=m +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_PMACZILOG=y +# CONFIG_SERIAL_PMACZILOG_CONSOLE is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 @@ -805,35 +830,42 @@ # I2C support # CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -CONFIG_I2C_KEYWEST=m -CONFIG_I2C_CHARDEV=m # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set +CONFIG_I2C_KEYWEST=m # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIAPRO is not set # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -869,7 +901,6 @@ # # CONFIG_SYNCLINK_CS is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -922,12 +953,14 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y CONFIG_DEVFS_FS=y # CONFIG_DEVFS_MOUNT is not set # CONFIG_DEVFS_DEBUG is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -1036,7 +1069,8 @@ # Sound # CONFIG_SOUND=m -# CONFIG_DMASOUND_AWACS is not set +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m # # Advanced Linux Sound Architecture @@ -1175,7 +1209,6 @@ # # USB Network adaptors # -# CONFIG_USB_AX8817X is not set # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set @@ -1224,14 +1257,9 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # -# CONFIG_CRC32 is not set +CONFIG_CRC32=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y diff -Nru a/arch/ppc/configs/power3_defconfig b/arch/ppc/configs/power3_defconfig --- a/arch/ppc/configs/power3_defconfig Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/configs/power3_defconfig Wed Oct 8 12:24:56 2003 @@ -4,12 +4,15 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y -# CONFIG_BROKEN is not set +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set # # General setup @@ -40,24 +43,24 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set # CONFIG_40x is not set +# CONFIG_44x is not set CONFIG_POWER3=y +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_CPU_FREQ is not set +CONFIG_PPC64BRIDGE=y +CONFIG_PPC_STD_MMU=y # -# IBM 4xx options +# Platform options # -CONFIG_GENERIC_ISA_DMA=y -CONFIG_PPC64BRIDGE=y -CONFIG_PPC_STD_MMU=y CONFIG_PPC_MULTIPLATFORM=y # CONFIG_APUS is not set -# CONFIG_WILLOW_2 is not set +# CONFIG_WILLOW is not set # CONFIG_PCORE is not set # CONFIG_POWERPMC250 is not set # CONFIG_EV64260 is not set @@ -73,25 +76,34 @@ # CONFIG_K2 is not set # CONFIG_PAL4 is not set # CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX6 is not set +# CONFIG_TQM8260 is not set CONFIG_PPC_CHRP=y CONFIG_PPC_PMAC=y CONFIG_PPC_PREP=y CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y CONFIG_SMP=y # CONFIG_IRQ_ALL_CPUS is not set CONFIG_NR_CPUS=32 -# CONFIG_CPU_FREQ is not set +CONFIG_HIGHMEM=y +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=y +CONFIG_PROC_DEVICETREE=y +CONFIG_PPC_RTAS=y +# CONFIG_PREP_RESIDUAL is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -CONFIG_HIGHMEM=y +CONFIG_ISA=y +CONFIG_GENERIC_ISA_DMA=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -CONFIG_KCORE_ELF=y -CONFIG_KERNEL_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=y CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y # CONFIG_HOTPLUG is not set @@ -107,11 +119,6 @@ # CONFIG_PARPORT_PC_SUPERIO is not set # CONFIG_PARPORT_OTHER is not set # CONFIG_PARPORT_1284 is not set -CONFIG_PROC_DEVICETREE=y -CONFIG_PPC_RTAS=y -# CONFIG_PREP_RESIDUAL is not set -CONFIG_PPCBUG_NVRAM=y -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -145,6 +152,7 @@ # Block devices # CONFIG_BLK_DEV_FD=y +# CONFIG_BLK_DEV_XD is not set # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set @@ -180,6 +188,7 @@ # SCSI device support # CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) @@ -203,37 +212,47 @@ # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_7000FASST is not set # CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_PPA is not set # CONFIG_SCSI_IMM is not set +# CONFIG_SCSI_NCR53C406A is not set CONFIG_SCSI_SYM53C8XX_2=y CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -# CONFIG_SCSI_PCI2000 is not set -# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_MESH is not set @@ -292,7 +311,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -320,7 +341,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -333,17 +353,26 @@ # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set # # Tulip family network device support # # CONFIG_NET_TULIP is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set # CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set CONFIG_NET_PCI=y CONFIG_PCNET32=y # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set # CONFIG_B44 is not set +# CONFIG_CS89x0 is not set # CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set CONFIG_E100=y @@ -357,6 +386,7 @@ # CONFIG_SUNDANCE is not set # CONFIG_TLAN is not set # CONFIG_VIA_RHINE is not set +# CONFIG_NET_POCKET is not set # # Ethernet (1000 Mbit) @@ -389,8 +419,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_NET_FC is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -411,6 +442,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -419,8 +455,6 @@ # Graphics support # CONFIG_FB=y -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_OF=y # CONFIG_FB_CONTROL is not set @@ -448,7 +482,6 @@ # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set -# CONFIG_FB_PM3 is not set # CONFIG_FB_VIRTUAL is not set # @@ -472,6 +505,11 @@ CONFIG_LOGO_LINUX_CLUT224=y # +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# # Input device support # CONFIG_INPUT=y @@ -491,8 +529,14 @@ # # Input I/O drivers # -# CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +# CONFIG_GAMEPORT_NS558 is not set +# CONFIG_GAMEPORT_L4 is not set +# CONFIG_GAMEPORT_EMU10K1 is not set +# CONFIG_GAMEPORT_VORTEX is not set +# CONFIG_GAMEPORT_FM801 is not set +# CONFIG_GAMEPORT_CS461x is not set CONFIG_SERIO=y CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y @@ -510,7 +554,11 @@ # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_PS2_SYNAPTICS is not set # CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y @@ -539,6 +587,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -546,6 +595,7 @@ # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_PMACZILOG is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=2048 CONFIG_PRINTER=m @@ -557,39 +607,52 @@ # I2C support # CONFIG_I2C=y +CONFIG_I2C_CHARDEV=y + +# +# I2C Algorithms +# CONFIG_I2C_ALGOBIT=y -# CONFIG_I2C_PROSAVAGE is not set -# CONFIG_I2C_PHILIPSPAR is not set -# CONFIG_SCx200_ACB is not set CONFIG_I2C_ALGOPCF=y -# CONFIG_I2C_ELEKTOR is not set -# CONFIG_I2C_KEYWEST is not set -CONFIG_I2C_CHARDEV=y # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_ELV is not set # CONFIG_I2C_I801 is not set +# CONFIG_I2C_I810 is not set +# CONFIG_I2C_ISA is not set +# CONFIG_I2C_KEYWEST is not set # CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_PHILIPSPAR is not set # CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_PROSAVAGE is not set +# CONFIG_I2C_SAVAGE4 is not set +# CONFIG_SCx200_ACB is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VELLEMAN is not set +# CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set +# CONFIG_I2C_VOODOO3 is not set # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -616,11 +679,9 @@ # # Ftape, the floppy tape device driver # -# CONFIG_FTAPE is not set # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -668,10 +729,12 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -763,7 +826,7 @@ # Sound # CONFIG_SOUND=y -# CONFIG_DMASOUND_AWACS is not set +# CONFIG_DMASOUND_PMAC is not set # # Advanced Linux Sound Architecture @@ -788,6 +851,32 @@ # CONFIG_SND_MPU401 is not set # +# ISA devices +# +# CONFIG_SND_AD1848 is not set +# CONFIG_SND_CS4231 is not set +CONFIG_SND_CS4232=m +# CONFIG_SND_CS4236 is not set +# CONFIG_SND_ES1688 is not set +# CONFIG_SND_ES18XX is not set +# CONFIG_SND_GUSCLASSIC is not set +# CONFIG_SND_GUSEXTREME is not set +# CONFIG_SND_GUSMAX is not set +# CONFIG_SND_INTERWAVE is not set +# CONFIG_SND_INTERWAVE_STB is not set +# CONFIG_SND_OPTI92X_AD1848 is not set +# CONFIG_SND_OPTI92X_CS4231 is not set +# CONFIG_SND_OPTI93X is not set +# CONFIG_SND_SB8 is not set +# CONFIG_SND_SB16 is not set +# CONFIG_SND_SBAWE is not set +# CONFIG_SND_WAVEFRONT is not set +# CONFIG_SND_CMI8330 is not set +# CONFIG_SND_OPL3SA2 is not set +# CONFIG_SND_SGALAXY is not set +# CONFIG_SND_SSCAPE is not set + +# # PCI devices # # CONFIG_SND_ALI5451 is not set @@ -836,14 +925,9 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # -# CONFIG_CRC32 is not set +CONFIG_CRC32=y # # Kernel hacking diff -Nru a/arch/ppc/configs/redwood5_defconfig b/arch/ppc/configs/redwood5_defconfig --- a/arch/ppc/configs/redwood5_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/redwood5_defconfig Wed Oct 8 12:24:57 2003 @@ -4,11 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +23,14 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set CONFIG_EMBEDDED=y +# CONFIG_KALLSYMS is not set CONFIG_FUTEX=y # CONFIG_EPOLL is not set +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y # # Loadable module support @@ -33,14 +43,16 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set CONFIG_40x=y +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -69,29 +81,30 @@ # CONFIG_UART0_TTYS1 is not set # CONFIG_SERIAL_SICC is not set CONFIG_NOT_COHERENT_CACHE=y + +# +# Platform options +# +# CONFIG_PC_KEYBOARD is not set # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set # CONFIG_PCI is not set # CONFIG_PCI_DOMAINS is not set -# CONFIG_PC_KEYBOARD is not set -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set # CONFIG_HOTPLUG is not set # # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -108,6 +121,10 @@ CONFIG_BOOT_LOAD=0x00400000 # +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set @@ -120,12 +137,13 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # # Multi-device support (RAID and LVM) @@ -133,32 +151,33 @@ # CONFIG_MD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y - -# -# IDE, ATA and ATAPI Block devices -# CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # -# CONFIG_BLK_DEV_HD is not set CONFIG_BLK_DEV_IDEDISK=y # CONFIG_IDEDISK_MULTI_MODE is not set # CONFIG_IDEDISK_STROKE is not set # CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_IDE_TASK_IOCTL is not set +# CONFIG_IDE_TASKFILE_IO is not set # # IDE chipset support/bugfixes # +# CONFIG_BLK_DEV_IDEDMA is not set +# CONFIG_IDEDMA_AUTO is not set +# CONFIG_DMA_NONPCI is not set +# CONFIG_BLK_DEV_HD is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set @@ -180,7 +199,6 @@ # # CONFIG_PACKET is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -200,7 +218,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -209,9 +229,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -234,7 +254,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -259,7 +278,7 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # # CONFIG_SHAPER is not set @@ -279,6 +298,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -289,29 +313,37 @@ # CONFIG_FB is not set # -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# # Input device support # -# CONFIG_INPUT is not set +CONFIG_INPUT=y # # Userland interfaces # +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set # # Input Device Drivers # +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set # # Macintosh device drivers @@ -320,6 +352,7 @@ # # Character devices # +# CONFIG_VT is not set # CONFIG_SERIAL_NONSTANDARD is not set # @@ -327,6 +360,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -340,28 +374,33 @@ # I2C support # CONFIG_I2C=y +# CONFIG_I2C_CHARDEV is not set + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -CONFIG_I2C_IBM_OCP_ALGO=y -CONFIG_I2C_IBM_OCP_ADAP=y -# CONFIG_I2C_CHARDEV is not set # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_IBM_IIC=y # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -392,7 +431,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -436,8 +474,10 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -496,11 +536,6 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # # CONFIG_CRC32 is not set @@ -509,7 +544,6 @@ # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set # CONFIG_SERIAL_TEXT_DEBUG is not set CONFIG_OCP=y diff -Nru a/arch/ppc/configs/redwood6_defconfig b/arch/ppc/configs/redwood6_defconfig --- a/arch/ppc/configs/redwood6_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/redwood6_defconfig Wed Oct 8 12:24:57 2003 @@ -4,11 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +23,14 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set CONFIG_EMBEDDED=y +# CONFIG_KALLSYMS is not set CONFIG_FUTEX=y # CONFIG_EPOLL is not set +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y # # Loadable module support @@ -32,14 +42,16 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set CONFIG_40x=y +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -68,29 +80,30 @@ # CONFIG_UART0_TTYS1 is not set # CONFIG_SERIAL_SICC is not set CONFIG_NOT_COHERENT_CACHE=y + +# +# Platform options +# +# CONFIG_PC_KEYBOARD is not set # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set # CONFIG_PCI is not set # CONFIG_PCI_DOMAINS is not set -# CONFIG_PC_KEYBOARD is not set -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set # CONFIG_HOTPLUG is not set # # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -107,6 +120,10 @@ CONFIG_BOOT_LOAD=0x00400000 # +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set @@ -119,12 +136,13 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # # Multi-device support (RAID and LVM) @@ -132,12 +150,12 @@ # CONFIG_MD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # # CONFIG_IDE is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set @@ -159,7 +177,6 @@ # # CONFIG_PACKET is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -179,7 +196,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -188,9 +207,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -213,7 +232,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -238,7 +256,7 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # # CONFIG_SHAPER is not set @@ -258,6 +276,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -268,29 +291,37 @@ # CONFIG_FB is not set # -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# # Input device support # -# CONFIG_INPUT is not set +CONFIG_INPUT=y # # Userland interfaces # +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set # # Input Device Drivers # +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set # # Macintosh device drivers @@ -299,6 +330,7 @@ # # Character devices # +# CONFIG_VT is not set # CONFIG_SERIAL_NONSTANDARD is not set # @@ -306,6 +338,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -322,7 +355,11 @@ # CONFIG_I2C is not set # -# I2C Hardware Sensors Mainboard support +# I2C Algorithms +# + +# +# I2C Hardware Bus support # # @@ -358,7 +395,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -402,10 +438,12 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -464,11 +502,6 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # # CONFIG_CRC32 is not set @@ -477,7 +510,6 @@ # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set # CONFIG_SERIAL_TEXT_DEBUG is not set CONFIG_OCP=y diff -Nru a/arch/ppc/configs/redwood_defconfig b/arch/ppc/configs/redwood_defconfig --- a/arch/ppc/configs/redwood_defconfig Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/configs/redwood_defconfig Wed Oct 8 12:24:56 2003 @@ -4,11 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +23,14 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set CONFIG_EMBEDDED=y +# CONFIG_KALLSYMS is not set CONFIG_FUTEX=y # CONFIG_EPOLL is not set +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y # # Loadable module support @@ -32,14 +42,16 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set CONFIG_40x=y +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -68,29 +80,30 @@ # CONFIG_UART0_TTYS1 is not set # CONFIG_SERIAL_SICC is not set CONFIG_NOT_COHERENT_CACHE=y + +# +# Platform options +# +# CONFIG_PC_KEYBOARD is not set # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set # CONFIG_PCI is not set # CONFIG_PCI_DOMAINS is not set -# CONFIG_PC_KEYBOARD is not set -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set # CONFIG_HOTPLUG is not set # # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -107,6 +120,10 @@ CONFIG_BOOT_LOAD=0x00400000 # +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set @@ -119,12 +136,13 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # # Multi-device support (RAID and LVM) @@ -132,12 +150,12 @@ # CONFIG_MD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # # CONFIG_IDE is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set @@ -159,7 +177,6 @@ # # CONFIG_PACKET is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -179,7 +196,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -188,9 +207,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -213,7 +232,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -238,7 +256,7 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # # CONFIG_SHAPER is not set @@ -258,6 +276,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -268,29 +291,37 @@ # CONFIG_FB is not set # -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# # Input device support # -# CONFIG_INPUT is not set +CONFIG_INPUT=y # # Userland interfaces # +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_TSDEV is not set +# CONFIG_INPUT_EVDEV is not set +# CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set # # Input Device Drivers # +# CONFIG_INPUT_KEYBOARD is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TOUCHSCREEN is not set +# CONFIG_INPUT_MISC is not set # # Macintosh device drivers @@ -299,6 +330,7 @@ # # Character devices # +# CONFIG_VT is not set # CONFIG_SERIAL_NONSTANDARD is not set # @@ -306,6 +338,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -319,27 +352,33 @@ # I2C support # CONFIG_I2C=y +# CONFIG_I2C_CHARDEV is not set + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -# CONFIG_I2C_IBM_OCP_ALGO is not set -# CONFIG_I2C_CHARDEV is not set # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set +CONFIG_I2C_IBM_IIC=y # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -370,7 +409,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -419,8 +457,10 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -479,11 +519,6 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # CONFIG_CRC32=y @@ -492,7 +527,6 @@ # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set CONFIG_SERIAL_TEXT_DEBUG=y CONFIG_OCP=y diff -Nru a/arch/ppc/configs/walnut_defconfig b/arch/ppc/configs/walnut_defconfig --- a/arch/ppc/configs/walnut_defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/configs/walnut_defconfig Wed Oct 8 12:24:57 2003 @@ -4,11 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -18,9 +23,14 @@ # CONFIG_BSD_PROCESS_ACCT is not set CONFIG_SYSCTL=y CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_IKCONFIG is not set CONFIG_EMBEDDED=y +# CONFIG_KALLSYMS is not set CONFIG_FUTEX=y # CONFIG_EPOLL is not set +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y # # Loadable module support @@ -33,14 +43,16 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y # CONFIG_6xx is not set CONFIG_40x=y +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +# CONFIG_MATH_EMULATION is not set +# CONFIG_CPU_FREQ is not set CONFIG_4xx=y # @@ -69,22 +81,24 @@ CONFIG_UART0_TTYS0=y # CONFIG_UART0_TTYS1 is not set CONFIG_NOT_COHERENT_CACHE=y + +# +# Platform options +# +# CONFIG_PC_KEYBOARD is not set # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -# CONFIG_MATH_EMULATION is not set -# CONFIG_CPU_FREQ is not set +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_MISC is not set +# CONFIG_CMDLINE_BOOL is not set # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -# CONFIG_PC_KEYBOARD is not set -CONFIG_KCORE_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_KERNEL_ELF=y -# CONFIG_BINFMT_MISC is not set CONFIG_PCI_LEGACY_PROC=y # CONFIG_PCI_NAMES is not set # CONFIG_HOTPLUG is not set @@ -93,7 +107,6 @@ # Parallel port support # # CONFIG_PARPORT is not set -# CONFIG_CMDLINE_BOOL is not set # # Advanced setup @@ -110,6 +123,10 @@ CONFIG_BOOT_LOAD=0x00400000 # +# Generic Driver Options +# + +# # Memory Technology Devices (MTD) # # CONFIG_MTD is not set @@ -122,16 +139,17 @@ # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_NBD is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y +# CONFIG_LBD is not set # # Multi-device support (RAID and LVM) @@ -139,12 +157,12 @@ # CONFIG_MD is not set # -# ATA/IDE/MFM/RLL support +# ATA/ATAPI/MFM/RLL support # # CONFIG_IDE is not set # -# SCSI support +# SCSI device support # # CONFIG_SCSI is not set @@ -172,7 +190,6 @@ # # CONFIG_PACKET is not set # CONFIG_NETLINK_DEV is not set -# CONFIG_NETFILTER is not set CONFIG_UNIX=y # CONFIG_NET_KEY is not set CONFIG_INET=y @@ -192,7 +209,9 @@ # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_IPV6 is not set -# CONFIG_XFRM_USER is not set +# CONFIG_DECNET is not set +# CONFIG_BRIDGE is not set +# CONFIG_NETFILTER is not set # # SCTP Configuration (EXPERIMENTAL) @@ -201,9 +220,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set -# CONFIG_DECNET is not set -# CONFIG_BRIDGE is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -231,7 +250,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -260,6 +278,7 @@ # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set +# CONFIG_SIS190 is not set # CONFIG_SK98LIN is not set # CONFIG_TIGON3 is not set @@ -278,8 +297,9 @@ # CONFIG_NET_RADIO is not set # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -299,6 +319,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -309,11 +334,6 @@ # CONFIG_FB is not set # -# Old CD-ROM drivers (not SCSI, not IDE) -# -# CONFIG_CD_NO_IDESCSI is not set - -# # Input device support # CONFIG_INPUT=y @@ -332,7 +352,11 @@ # # CONFIG_GAMEPORT is not set CONFIG_SOUND_GAMEPORT=y -# CONFIG_SERIO is not set +CONFIG_SERIO=y +# CONFIG_SERIO_I8042 is not set +# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO_CT82C710 is not set +# CONFIG_SERIO_PCIPS2 is not set # # Input Device Drivers @@ -358,6 +382,7 @@ # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # @@ -372,33 +397,42 @@ # I2C support # CONFIG_I2C=y +# CONFIG_I2C_CHARDEV is not set + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -CONFIG_I2C_IBM_OCP_ALGO=y -CONFIG_I2C_IBM_OCP_ADAP=y -# CONFIG_I2C_CHARDEV is not set # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # +# CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set +CONFIG_I2C_IBM_IIC=y +# CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIAPRO is not set # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -428,7 +462,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -472,10 +505,12 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -546,11 +581,6 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # CONFIG_CRC32=y @@ -559,7 +589,6 @@ # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set -# CONFIG_KALLSYMS is not set # CONFIG_SERIAL_TEXT_DEBUG is not set CONFIG_OCP=y diff -Nru a/arch/ppc/defconfig b/arch/ppc/defconfig --- a/arch/ppc/defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/defconfig Wed Oct 8 12:24:57 2003 @@ -4,12 +4,16 @@ CONFIG_MMU=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_HAVE_DEC_LOCK=y +CONFIG_PPC=y +CONFIG_PPC32=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y -# CONFIG_BROKEN is not set +CONFIG_CLEAN_COMPILE=y +# CONFIG_STANDALONE is not set +CONFIG_BROKEN_ON_SMP=y # # General setup @@ -40,25 +44,38 @@ CONFIG_KMOD=y # -# Platform support +# Processor # -CONFIG_PPC=y -CONFIG_PPC32=y CONFIG_6xx=y # CONFIG_40x is not set +# CONFIG_44x is not set # CONFIG_POWER3 is not set +# CONFIG_POWER4 is not set # CONFIG_8xx is not set +CONFIG_ALTIVEC=y +CONFIG_TAU=y +# CONFIG_TAU_INT is not set +# CONFIG_TAU_AVERAGE is not set +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_PROC_INTF=y +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +# CONFIG_CPU_FREQ_24_API is not set +CONFIG_CPU_FREQ_PMAC=y +CONFIG_CPU_FREQ_TABLE=y +CONFIG_PPC601_SYNC_FIX=y +CONFIG_PM=y +CONFIG_PPC_STD_MMU=y # -# IBM 4xx options +# Platform options # -CONFIG_PM=y -# CONFIG_8260 is not set -CONFIG_GENERIC_ISA_DMA=y -CONFIG_PPC_STD_MMU=y CONFIG_PPC_MULTIPLATFORM=y # CONFIG_APUS is not set -# CONFIG_WILLOW_2 is not set +# CONFIG_WILLOW is not set # CONFIG_PCORE is not set # CONFIG_POWERPMC250 is not set # CONFIG_EV64260 is not set @@ -74,32 +91,35 @@ # CONFIG_K2 is not set # CONFIG_PAL4 is not set # CONFIG_GEMINI is not set +# CONFIG_EST8260 is not set +# CONFIG_SBS8260 is not set +# CONFIG_RPX6 is not set +# CONFIG_TQM8260 is not set CONFIG_PPC_CHRP=y CONFIG_PPC_PMAC=y CONFIG_PPC_PREP=y CONFIG_PPC_OF=y +CONFIG_PPCBUG_NVRAM=y # CONFIG_SMP is not set # CONFIG_PREEMPT is not set -CONFIG_ALTIVEC=y -CONFIG_TAU=y -# CONFIG_TAU_INT is not set -# CONFIG_TAU_AVERAGE is not set -CONFIG_CPU_FREQ=y -CONFIG_CPU_FREQ_TABLE=y -CONFIG_CPU_FREQ_PROC_INTF=y -CONFIG_CPU_FREQ_24_API=y -CONFIG_CPU_FREQ_PMAC=y +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_ELF=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=m +CONFIG_PROC_DEVICETREE=y +CONFIG_PPC_RTAS=y +CONFIG_PREP_RESIDUAL=y +CONFIG_PROC_PREPRESIDUAL=y +CONFIG_CMDLINE_BOOL=y +CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" # -# General setup +# Bus options # -# CONFIG_HIGHMEM is not set +CONFIG_ISA=y +CONFIG_GENERIC_ISA_DMA=y CONFIG_PCI=y CONFIG_PCI_DOMAINS=y -CONFIG_KCORE_ELF=y -CONFIG_KERNEL_ELF=y -CONFIG_BINFMT_ELF=y -CONFIG_BINFMT_MISC=m CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y CONFIG_HOTPLUG=y @@ -108,19 +128,12 @@ # PCMCIA/CardBus support # # CONFIG_PCMCIA is not set +CONFIG_PCMCIA_PROBE=y # # Parallel port support # # CONFIG_PARPORT is not set -CONFIG_PPC601_SYNC_FIX=y -CONFIG_PROC_DEVICETREE=y -CONFIG_PPC_RTAS=y -CONFIG_PREP_RESIDUAL=y -CONFIG_PROC_PREPRESIDUAL=y -CONFIG_PPCBUG_NVRAM=y -CONFIG_CMDLINE_BOOL=y -CONFIG_CMDLINE="console=ttyS0,9600 console=tty0 root=/dev/sda2" # # Advanced setup @@ -154,6 +167,7 @@ # Block devices # CONFIG_BLK_DEV_FD=m +# CONFIG_BLK_DEV_XD is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set @@ -227,8 +241,11 @@ # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set CONFIG_BLK_DEV_IDE_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y CONFIG_BLK_DEV_IDEDMA_PMAC=y +CONFIG_BLK_DEV_IDE_PMAC_BLINK=y CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO=y +# CONFIG_IDE_CHIPSETS is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y @@ -239,6 +256,7 @@ # SCSI device support # CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) @@ -262,7 +280,10 @@ # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_7000FASST is not set # CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AHA1542 is not set # CONFIG_SCSI_AACRAID is not set CONFIG_SCSI_AIC7XXX=m CONFIG_AIC7XXX_CMDS_PER_DEVICE=253 @@ -274,30 +295,37 @@ CONFIG_AIC7XXX_REG_PRETTY_PRINT=y CONFIG_SCSI_AIC7XXX_OLD=m # CONFIG_SCSI_AIC79XX is not set -# CONFIG_SCSI_DPT_I2O is not set CONFIG_SCSI_ADVANSYS=m +# CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set -# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_NCR53C406A is not set CONFIG_SCSI_SYM53C8XX_2=y CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0 CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set -# CONFIG_SCSI_PCI2000 is not set -# CONFIG_SCSI_PCI2220I is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_PSI240I is not set +# CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC395x is not set -# CONFIG_SCSI_DC390T is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set CONFIG_SCSI_MESH=y @@ -368,6 +396,7 @@ # CONFIG_IP_NF_QUEUE is not set CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m @@ -383,15 +412,15 @@ CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m -CONFIG_IP_NF_MATCH_UNCLEAN=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_MIRROR=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_SAME=m # CONFIG_IP_NF_NAT_LOCAL is not set CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m @@ -415,7 +444,9 @@ # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set -# CONFIG_LLC is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_NET_DIVERT is not set @@ -443,7 +474,6 @@ # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set -# CONFIG_ETHERTAP is not set # # Ethernet (10 or 100Mbit) @@ -457,17 +487,26 @@ # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set # # Tulip family network device support # # CONFIG_NET_TULIP is not set +# CONFIG_AT1700 is not set +# CONFIG_DEPCA is not set # CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set CONFIG_NET_PCI=y CONFIG_PCNET32=y # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set +# CONFIG_AC3200 is not set +# CONFIG_APRICOT is not set # CONFIG_B44 is not set +# CONFIG_CS89x0 is not set # CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set # CONFIG_E100 is not set @@ -481,6 +520,7 @@ # CONFIG_SUNDANCE is not set # CONFIG_TLAN is not set # CONFIG_VIA_RHINE is not set +# CONFIG_NET_POCKET is not set # # Ethernet (1000 Mbit) @@ -521,6 +561,8 @@ # Obsolete Wireless cards support (pre-802.11) # # CONFIG_STRIP is not set +# CONFIG_ARLAN is not set +# CONFIG_WAVELAN is not set # # Wireless 802.11b ISA/PCI cards support @@ -534,8 +576,9 @@ CONFIG_NET_WIRELESS=y # -# Token Ring devices (depends on LLC=y) +# Token Ring devices # +# CONFIG_TR is not set # CONFIG_NET_FC is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set @@ -556,6 +599,11 @@ # CONFIG_IRDA is not set # +# Bluetooth support +# +# CONFIG_BT is not set + +# # ISDN subsystem # # CONFIG_ISDN_BOOL is not set @@ -564,8 +612,6 @@ # Graphics support # CONFIG_FB=y -# CONFIG_FB_CIRRUS is not set -# CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set CONFIG_FB_OF=y CONFIG_FB_CONTROL=y @@ -594,7 +640,6 @@ CONFIG_FB_3DFX=y # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set -# CONFIG_FB_PM3 is not set # CONFIG_FB_VIRTUAL is not set # @@ -618,6 +663,11 @@ CONFIG_LOGO_LINUX_CLUT224=y # +# Old CD-ROM drivers (not SCSI, not IDE) +# +# CONFIG_CD_NO_IDESCSI is not set + +# # Input device support # CONFIG_INPUT=y @@ -655,7 +705,11 @@ # CONFIG_KEYBOARD_NEWTON is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y +# CONFIG_MOUSE_PS2_SYNAPTICS is not set # CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_INPORT is not set +# CONFIG_MOUSE_LOGIBM is not set +# CONFIG_MOUSE_PC110PAD is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_MISC is not set @@ -689,12 +743,15 @@ # CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_CONSOLE is not set +CONFIG_SERIAL_8250_NR_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # # Non-8250 serial port support # CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_PMACZILOG=y +# CONFIG_SERIAL_PMACZILOG_CONSOLE is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 @@ -702,35 +759,43 @@ # I2C support # CONFIG_I2C=m +CONFIG_I2C_CHARDEV=m + +# +# I2C Algorithms +# # CONFIG_I2C_ALGOBIT is not set # CONFIG_I2C_ALGOPCF is not set -CONFIG_I2C_KEYWEST=m -CONFIG_I2C_CHARDEV=m # -# I2C Hardware Sensors Mainboard support +# I2C Hardware Bus support # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set +# CONFIG_I2C_ISA is not set +CONFIG_I2C_KEYWEST=m # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIAPRO is not set # # I2C Hardware Sensors Chip support # +# CONFIG_I2C_SENSOR is not set # CONFIG_SENSORS_ADM1021 is not set +# CONFIG_SENSORS_EEPROM is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_LM75 is not set -# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_W83781D is not set -# CONFIG_I2C_SENSOR is not set # # Mice @@ -761,7 +826,6 @@ # CONFIG_AGP is not set # CONFIG_DRM is not set # CONFIG_RAW_DRIVER is not set -# CONFIG_HANGCHECK_TIMER is not set # # Multimedia devices @@ -809,12 +873,14 @@ # Pseudo filesystems # CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y CONFIG_DEVFS_FS=y # CONFIG_DEVFS_MOUNT is not set # CONFIG_DEVFS_DEBUG is not set CONFIG_DEVPTS_FS=y # CONFIG_DEVPTS_FS_XATTR is not set CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set CONFIG_RAMFS=y # @@ -923,7 +989,8 @@ # Sound # CONFIG_SOUND=m -# CONFIG_DMASOUND_AWACS is not set +CONFIG_DMASOUND_PMAC=m +CONFIG_DMASOUND=m # # Advanced Linux Sound Architecture @@ -945,6 +1012,32 @@ # CONFIG_SND_MPU401 is not set # +# ISA devices +# +# CONFIG_SND_AD1848 is not set +# CONFIG_SND_CS4231 is not set +CONFIG_SND_CS4232=m +# CONFIG_SND_CS4236 is not set +# CONFIG_SND_ES1688 is not set +# CONFIG_SND_ES18XX is not set +# CONFIG_SND_GUSCLASSIC is not set +# CONFIG_SND_GUSEXTREME is not set +# CONFIG_SND_GUSMAX is not set +# CONFIG_SND_INTERWAVE is not set +# CONFIG_SND_INTERWAVE_STB is not set +# CONFIG_SND_OPTI92X_AD1848 is not set +# CONFIG_SND_OPTI92X_CS4231 is not set +# CONFIG_SND_OPTI93X is not set +# CONFIG_SND_SB8 is not set +# CONFIG_SND_SB16 is not set +# CONFIG_SND_SBAWE is not set +# CONFIG_SND_WAVEFRONT is not set +# CONFIG_SND_CMI8330 is not set +# CONFIG_SND_OPL3SA2 is not set +# CONFIG_SND_SGALAXY is not set +# CONFIG_SND_SSCAPE is not set + +# # PCI devices # # CONFIG_SND_ALI5451 is not set @@ -1062,7 +1155,6 @@ # # USB Network adaptors # -# CONFIG_USB_AX8817X is not set # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set @@ -1124,14 +1216,9 @@ # CONFIG_USB_GADGET is not set # -# Bluetooth support -# -# CONFIG_BT is not set - -# # Library routines # -# CONFIG_CRC32 is not set +CONFIG_CRC32=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y diff -Nru a/arch/ppc/kernel/head.S b/arch/ppc/kernel/head.S --- a/arch/ppc/kernel/head.S Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/kernel/head.S Wed Oct 8 12:24:56 2003 @@ -759,7 +759,10 @@ EXCEPTION(0x2c00, Trap_2c, UnknownException, EXC_XFER_EE) EXCEPTION(0x2d00, Trap_2d, UnknownException, EXC_XFER_EE) EXCEPTION(0x2e00, Trap_2e, UnknownException, EXC_XFER_EE) - EXCEPTION(0x2f00, Trap_2f, UnknownException, EXC_XFER_EE) + EXCEPTION(0x2f00, MOLTrampoline, UnknownException, EXC_XFER_EE_LITE) + + .globl mol_trampoline + .set mol_trampoline, i0x2f00 . = 0x3000 diff -Nru a/arch/ppc/kernel/irq.c b/arch/ppc/kernel/irq.c --- a/arch/ppc/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -27,6 +27,7 @@ */ #include +#include #include #include #include @@ -214,6 +215,8 @@ return; } +EXPORT_SYMBOL(free_irq); + int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, void *dev_id) @@ -252,6 +255,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + /* * Generic enable/disable code: this just calls * down into the PIC-specific version for the actual @@ -530,10 +535,14 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off (unsigned long irqs) { return 0; } + +EXPORT_SYMBOL(probe_irq_off); unsigned int probe_irq_mask(unsigned long irqs) { diff -Nru a/arch/ppc/kernel/process.c b/arch/ppc/kernel/process.c --- a/arch/ppc/kernel/process.c Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/kernel/process.c Wed Oct 8 12:24:56 2003 @@ -498,6 +498,8 @@ show_stack(current, NULL); } +EXPORT_SYMBOL(dump_stack); + void show_stack(struct task_struct *tsk, unsigned long *stack) { unsigned long sp, stack_top, prev_sp, ret; diff -Nru a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c --- a/arch/ppc/kernel/setup.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/kernel/setup.c Wed Oct 8 12:24:57 2003 @@ -119,15 +119,21 @@ ppc_md.restart(cmd); } +EXPORT_SYMBOL(machine_restart); + void machine_power_off(void) { ppc_md.power_off(); } +EXPORT_SYMBOL(machine_power_off); + void machine_halt(void) { ppc_md.halt(); } + +EXPORT_SYMBOL(machine_halt); void (*pm_power_off)(void) = machine_power_off; diff -Nru a/arch/ppc/kernel/smp.c b/arch/ppc/kernel/smp.c --- a/arch/ppc/kernel/smp.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/kernel/smp.c Wed Oct 8 12:24:57 2003 @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -51,6 +52,8 @@ cpumask_t cpu_possible_map; int smp_hw_index[NR_CPUS]; struct thread_info *secondary_ti; + +EXPORT_SYMBOL(cpu_online_map); /* SMP operations for this machine */ static struct smp_ops_t *smp_ops; diff -Nru a/arch/ppc/kernel/time.c b/arch/ppc/kernel/time.c --- a/arch/ppc/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -69,6 +69,8 @@ /* XXX false sharing with below? */ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + unsigned long disarm_decr[NR_CPUS]; extern struct timezone sys_tz; @@ -239,6 +241,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, new_sec = tv->tv_sec; @@ -292,6 +296,8 @@ write_sequnlock_irqrestore(&xtime_lock, flags); return 0; } + +EXPORT_SYMBOL(do_settimeofday); /* This function is only called on the boot processor */ void __init time_init(void) diff -Nru a/arch/ppc/mm/cachemap.c b/arch/ppc/mm/cachemap.c --- a/arch/ppc/mm/cachemap.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc/mm/cachemap.c Wed Oct 8 12:24:57 2003 @@ -101,7 +101,7 @@ if (! area) goto out; - va = VMALLOC_VMADDR(area->addr); + va = (unsigned long) area->addr; flags = _PAGE_KERNEL | _PAGE_NO_CACHE; diff -Nru a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c --- a/arch/ppc/mm/init.c Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/mm/init.c Wed Oct 8 12:24:56 2003 @@ -19,6 +19,7 @@ */ #include +#include #include #include #include @@ -80,6 +81,9 @@ #ifdef CONFIG_HIGHMEM pte_t *kmap_pte; pgprot_t kmap_prot; + +EXPORT_SYMBOL(kmap_prot); +EXPORT_SYMBOL(kmap_pte); #endif void MMU_init(void); diff -Nru a/arch/ppc/mm/pgtable.c b/arch/ppc/mm/pgtable.c --- a/arch/ppc/mm/pgtable.c Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/mm/pgtable.c Wed Oct 8 12:24:56 2003 @@ -195,7 +195,7 @@ area = get_vm_area(size, VM_IOREMAP); if (area == 0) return NULL; - v = VMALLOC_VMADDR(area->addr); + v = (unsigned long) area->addr; } else { v = (ioremap_bot -= size); } diff -Nru a/arch/ppc/syslib/ppc8xx_pic.c b/arch/ppc/syslib/ppc8xx_pic.c --- a/arch/ppc/syslib/ppc8xx_pic.c Wed Oct 8 12:24:56 2003 +++ b/arch/ppc/syslib/ppc8xx_pic.c Wed Oct 8 12:24:56 2003 @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -196,3 +197,5 @@ } #endif } + +EXPORT_SYMBOL(request_irq); diff -Nru a/arch/ppc64/kernel/init_task.c b/arch/ppc64/kernel/init_task.c --- a/arch/ppc64/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/ppc64/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -11,6 +12,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -28,3 +31,5 @@ * All other task structs will be allocated on slabs in fork.c */ struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_task); diff -Nru a/arch/ppc64/kernel/ioctl32.c b/arch/ppc64/kernel/ioctl32.c --- a/arch/ppc64/kernel/ioctl32.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc64/kernel/ioctl32.c Wed Oct 8 12:24:57 2003 @@ -328,396 +328,6 @@ return err; } -struct usbdevfs_ctrltransfer32 { - __u8 bRequestType; - __u8 bRequest; - __u16 wValue; - __u16 wIndex; - __u16 wLength; - __u32 timeout; /* in milliseconds */ - __u32 data; -}; - -#define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32) - -static int do_usbdevfs_control(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_ctrltransfer kctrl; - struct usbdevfs_ctrltransfer32 *uctrl; - mm_segment_t old_fs; - __u32 udata; - void *uptr, *kptr; - int err; - - uctrl = (struct usbdevfs_ctrltransfer32 *) arg; - - if (copy_from_user(&kctrl, uctrl, - (sizeof(struct usbdevfs_ctrltransfer) - - sizeof(void *)))) - return -EFAULT; - - if (get_user(udata, &uctrl->data)) - return -EFAULT; - uptr = (void *) A(udata); - - /* In usbdevice_fs, it limits the control buffer to a page, - * for simplicity so do we. - */ - if (!uptr || kctrl.wLength > PAGE_SIZE) - return -EINVAL; - - kptr = (void *)__get_free_page(GFP_KERNEL); - - if ((kctrl.bRequestType & 0x80) == 0) { - err = -EFAULT; - if (copy_from_user(kptr, uptr, kctrl.wLength)) - goto out; - } - - kctrl.data = kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_CONTROL, (unsigned long)&kctrl); - set_fs(old_fs); - - if (err >= 0 && - ((kctrl.bRequestType & 0x80) != 0)) { - if (copy_to_user(uptr, kptr, kctrl.wLength)) - err = -EFAULT; - } - -out: - free_page((unsigned long) kptr); - return err; -} - -struct usbdevfs_bulktransfer32 { - unsigned int ep; - unsigned int len; - unsigned int timeout; /* in milliseconds */ - __u32 data; -}; - -#define USBDEVFS_BULK32 _IOWR('U', 2, struct usbdevfs_bulktransfer32) - -static int do_usbdevfs_bulk(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_bulktransfer kbulk; - struct usbdevfs_bulktransfer32 *ubulk; - mm_segment_t old_fs; - __u32 udata; - void *uptr, *kptr; - int err; - - ubulk = (struct usbdevfs_bulktransfer32 *) arg; - - if (get_user(kbulk.ep, &ubulk->ep) || - get_user(kbulk.len, &ubulk->len) || - get_user(kbulk.timeout, &ubulk->timeout) || - get_user(udata, &ubulk->data)) - return -EFAULT; - - uptr = (void *) A(udata); - - /* In usbdevice_fs, it limits the control buffer to a page, - * for simplicity so do we. - */ - if (!uptr || kbulk.len > PAGE_SIZE) - return -EINVAL; - - kptr = (void *) __get_free_page(GFP_KERNEL); - - if ((kbulk.ep & 0x80) == 0) { - err = -EFAULT; - if (copy_from_user(kptr, uptr, kbulk.len)) - goto out; - } - - kbulk.data = kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_BULK, (unsigned long) &kbulk); - set_fs(old_fs); - - if (err >= 0 && - ((kbulk.ep & 0x80) != 0)) { - if (copy_to_user(uptr, kptr, kbulk.len)) - err = -EFAULT; - } - -out: - free_page((unsigned long) kptr); - return err; -} - -/* This needs more work before we can enable it. Unfortunately - * because of the fancy asynchronous way URB status/error is written - * back to userspace, we'll need to fiddle with USB devio internals - * and/or reimplement entirely the frontend of it ourselves. -DaveM - * - * The issue is: - * - * When an URB is submitted via usbdevicefs it is put onto an - * asynchronous queue. When the URB completes, it may be reaped - * via another ioctl. During this reaping the status is written - * back to userspace along with the length of the transfer. - * - * We must translate into 64-bit kernel types so we pass in a kernel - * space copy of the usbdevfs_urb structure. This would mean that we - * must do something to deal with the async entry reaping. First we - * have to deal somehow with this transitory memory we've allocated. - * This is problematic since there are many call sites from which the - * async entries can be destroyed (and thus when we'd need to free up - * this kernel memory). One of which is the close() op of usbdevicefs. - * To handle that we'd need to make our own file_operations struct which - * overrides usbdevicefs's release op with our own which runs usbdevicefs's - * real release op then frees up the kernel memory. - * - * But how to keep track of these kernel buffers? We'd need to either - * keep track of them in some table _or_ know about usbdevicefs internals - * (ie. the exact layout of its file private, which is actually defined - * in linux/usbdevice_fs.h, the layout of the async queues are private to - * devio.c) - * - * There is one possible other solution I considered, also involving knowledge - * of usbdevicefs internals: - * - * After an URB is submitted, we "fix up" the address back to the user - * space one. This would work if the status/length fields written back - * by the async URB completion lines up perfectly in the 32-bit type with - * the 64-bit kernel type. Unfortunately, it does not because the iso - * frame descriptors, at the end of the struct, can be written back. - * - * I think we'll just need to simply duplicate the devio URB engine here. - */ -#if 0 -struct usbdevfs_urb32 { - __u8 type; - __u8 endpoint; - __s32 status; - __u32 flags; - __u32 buffer; - __s32 buffer_length; - __s32 actual_length; - __s32 start_frame; - __s32 number_of_packets; - __s32 error_count; - __u32 signr; - __u32 usercontext; /* unused */ - struct usbdevfs_iso_packet_desc iso_frame_desc[0]; -}; - -#define USBDEVFS_SUBMITURB32 _IOR('U', 10, struct usbdevfs_urb32) - -static int get_urb32(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - if (get_user(kurb->type, &uurb->type) || - __get_user(kurb->endpoint, &uurb->endpoint) || - __get_user(kurb->status, &uurb->status) || - __get_user(kurb->flags, &uurb->flags) || - __get_user(kurb->buffer_length, &uurb->buffer_length) || - __get_user(kurb->actual_length, &uurb->actual_length) || - __get_user(kurb->start_frame, &uurb->start_frame) || - __get_user(kurb->number_of_packets, &uurb->number_of_packets) || - __get_user(kurb->error_count, &uurb->error_count) || - __get_user(kurb->signr, &uurb->signr)) - return -EFAULT; - - kurb->usercontext = 0; /* unused currently */ - - return 0; -} - -/* Just put back the values which usbdevfs actually changes. */ -static int put_urb32(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - if (put_user(kurb->status, &uurb->status) || - __put_user(kurb->actual_length, &uurb->actual_length) || - __put_user(kurb->error_count, &uurb->error_count)) - return -EFAULT; - - if (kurb->number_of_packets != 0) { - int i; - - for (i = 0; i < kurb->number_of_packets; i++) { - if (__put_user(kurb->iso_frame_desc[i].actual_length, - &uurb->iso_frame_desc[i].actual_length) || - __put_user(kurb->iso_frame_desc[i].status, - &uurb->iso_frame_desc[i].status)) - return -EFAULT; - } - } - - return 0; -} - -static int get_urb32_isoframes(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - unsigned int totlen; - int i; - - if (kurb->type != USBDEVFS_URB_TYPE_ISO) { - kurb->number_of_packets = 0; - return 0; - } - - if (kurb->number_of_packets < 1 || - kurb->number_of_packets > 128) - return -EINVAL; - - if (copy_from_user(&kurb->iso_frame_desc[0], - &uurb->iso_frame_desc[0], - sizeof(struct usbdevfs_iso_packet_desc) * - kurb->number_of_packets)) - return -EFAULT; - - totlen = 0; - for (i = 0; i < kurb->number_of_packets; i++) { - unsigned int this_len; - - this_len = kurb->iso_frame_desc[i].length; - if (this_len > 1023) - return -EINVAL; - - totlen += this_len; - } - - if (totlen > 32768) - return -EINVAL; - - kurb->buffer_length = totlen; - - return 0; -} - -static int do_usbdevfs_urb(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_urb *kurb; - struct usbdevfs_urb32 *uurb; - mm_segment_t old_fs; - __u32 udata; - void *uptr, *kptr; - unsigned int buflen; - int err; - - uurb = (struct usbdevfs_urb32 *) arg; - - err = -ENOMEM; - kurb = kmalloc(sizeof(struct usbdevfs_urb) + - (sizeof(struct usbdevfs_iso_packet_desc) * 128), - GFP_KERNEL); - if (!kurb) - goto out; - - err = -EFAULT; - if (get_urb32(kurb, uurb)) - goto out; - - err = get_urb32_isoframes(kurb, uurb); - if (err) - goto out; - - err = -EFAULT; - if (__get_user(udata, &uurb->buffer)) - goto out; - uptr = (void *) A(udata); - - err = -ENOMEM; - buflen = kurb->buffer_length; - kptr = kmalloc(buflen, GFP_KERNEL); - if (!kptr) - goto out; - - kurb->buffer = kptr; - - err = -EFAULT; - if (copy_from_user(kptr, uptr, buflen)) - goto out_kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_SUBMITURB, (unsigned long) kurb); - set_fs(old_fs); - - if (err >= 0) { - /* XXX Shit, this doesn't work for async URBs :-( XXX */ - if (put_urb32(kurb, uurb)) { - err = -EFAULT; - } else if ((kurb->endpoint & USB_DIR_IN) != 0) { - if (copy_to_user(uptr, kptr, buflen)) - err = -EFAULT; - } - } - -out_kptr: - kfree(kptr); - -out: - kfree(kurb); - return err; -} -#endif - -#define USBDEVFS_REAPURB32 _IOW('U', 12, u32) -#define USBDEVFS_REAPURBNDELAY32 _IOW('U', 13, u32) - -static int do_usbdevfs_reapurb(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - mm_segment_t old_fs; - void *kptr; - int err; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, - (cmd == USBDEVFS_REAPURB32 ? - USBDEVFS_REAPURB : - USBDEVFS_REAPURBNDELAY), - (unsigned long) &kptr); - set_fs(old_fs); - - if (err >= 0 && - put_user(((u32)(long)kptr), (u32 *) A(arg))) - err = -EFAULT; - - return err; -} - -struct usbdevfs_disconnectsignal32 { - unsigned int signr; - u32 context; -}; - -#define USBDEVFS_DISCSIGNAL32 _IOR('U', 14, struct usbdevfs_disconnectsignal32) - -static int do_usbdevfs_discsignal(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_disconnectsignal kdis; - struct usbdevfs_disconnectsignal32 *udis; - mm_segment_t old_fs; - u32 uctx; - int err; - - udis = (struct usbdevfs_disconnectsignal32 *) arg; - - if (get_user(kdis.signr, &udis->signr) || - __get_user(uctx, &udis->context)) - return -EFAULT; - - kdis.context = (void *) (long)uctx; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_DISCSIGNAL, (unsigned long) &kdis); - set_fs(old_fs); - - return err; -} #define HANDLE_IOCTL(cmd,handler) { cmd, (ioctl_trans_handler_t)handler, 0 }, #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd,sys_ioctl) @@ -734,8 +344,6 @@ COMPATIBLE_IOCTL(TCSBRKP) COMPATIBLE_IOCTL(TIOCSTART) COMPATIBLE_IOCTL(TIOCSTOP) -COMPATIBLE_IOCTL(TIOCGSERIAL) -COMPATIBLE_IOCTL(TIOCSSERIAL) COMPATIBLE_IOCTL(TIOCSLTC) #if 0 COMPATIBLE_IOCTL(FBIOBLANK) @@ -755,13 +363,6 @@ HANDLE_IOCTL(NCP_IOC_GETPRIVATEDATA_32, do_ncp_getprivatedata) HANDLE_IOCTL(NCP_IOC_SETPRIVATEDATA_32, do_ncp_setprivatedata) -/* USB devfs */ -HANDLE_IOCTL(USBDEVFS_CONTROL32, do_usbdevfs_control) -HANDLE_IOCTL(USBDEVFS_BULK32, do_usbdevfs_bulk) -/*HANDLE_IOCTL(USBDEVFS_SUBMITURB32, do_usbdevfs_urb)*/ -HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb) -HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb) -HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal) IOCTL_TABLE_END int ioctl_table_size = ARRAY_SIZE(ioctl_start); diff -Nru a/arch/ppc64/kernel/irq.c b/arch/ppc64/kernel/irq.c --- a/arch/ppc64/kernel/irq.c Wed Oct 8 12:24:56 2003 +++ b/arch/ppc64/kernel/irq.c Wed Oct 8 12:24:56 2003 @@ -24,6 +24,7 @@ */ #include +#include #include #include #include @@ -216,11 +217,15 @@ return 0; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { request_irq(irq, NULL, 0, NULL, dev_id); } +EXPORT_SYMBOL(free_irq); + /* * Generic enable/disable code: this just calls * down into the PIC-specific version for the actual @@ -603,10 +608,14 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off (unsigned long irqs) { return 0; } + +EXPORT_SYMBOL(probe_irq_off); unsigned int probe_irq_mask(unsigned long irqs) { diff -Nru a/arch/ppc64/kernel/process.c b/arch/ppc64/kernel/process.c --- a/arch/ppc64/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc64/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -17,6 +17,7 @@ */ #include +#include #include #include #include @@ -70,23 +71,6 @@ #endif /* CONFIG_SMP */ } -#ifdef CONFIG_SMP -static void smp_unlazy_onefpu(void *arg) -{ - struct pt_regs *regs = current->thread.regs; - - if (!regs) - return; - if (regs->msr & MSR_FP) - giveup_fpu(current); -} - -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; @@ -447,6 +431,8 @@ { show_stack(current, (unsigned long *)_get_SP()); } + +EXPORT_SYMBOL(dump_stack); void show_trace_task(struct task_struct *tsk) { diff -Nru a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c --- a/arch/ppc64/kernel/setup.c Wed Oct 8 12:24:56 2003 +++ b/arch/ppc64/kernel/setup.c Wed Oct 8 12:24:56 2003 @@ -228,16 +228,22 @@ { ppc_md.restart(cmd); } + +EXPORT_SYMBOL(machine_restart); void machine_power_off(void) { ppc_md.power_off(); } + +EXPORT_SYMBOL(machine_power_off); void machine_halt(void) { ppc_md.halt(); } + +EXPORT_SYMBOL(machine_halt); unsigned long ppc_proc_freq; unsigned long ppc_tb_freq; diff -Nru a/arch/ppc64/kernel/smp.c b/arch/ppc64/kernel/smp.c --- a/arch/ppc64/kernel/smp.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc64/kernel/smp.c Wed Oct 8 12:24:57 2003 @@ -17,6 +17,7 @@ #include #include +#include #include #include #include @@ -54,6 +55,8 @@ /* initialised so it doesn't end up in bss */ cpumask_t cpu_online_map = CPU_MASK_NONE; + +EXPORT_SYMBOL(cpu_online_map); static struct smp_ops_t *smp_ops; diff -Nru a/arch/ppc64/kernel/time.c b/arch/ppc64/kernel/time.c --- a/arch/ppc64/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/ppc64/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -67,6 +68,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + /* keep track of when we need to update the rtc */ time_t last_rtc_update; extern int piranha_simulator; @@ -345,6 +348,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, new_sec = tv->tv_sec; @@ -410,6 +415,8 @@ write_sequnlock_irqrestore(&xtime_lock, flags); return 0; } + +EXPORT_SYMBOL(do_settimeofday); /* * This function is a copy of the architecture independent function diff -Nru a/arch/s390/Makefile b/arch/s390/Makefile --- a/arch/s390/Makefile Wed Oct 8 12:24:56 2003 +++ b/arch/s390/Makefile Wed Oct 8 12:24:56 2003 @@ -48,20 +48,18 @@ drivers-y += drivers/s390/ drivers-$(CONFIG_MATHEMU) += arch/$(ARCH)/math-emu/ +boot := arch/$(ARCH)/boot -makeboot =$(Q)$(MAKE) -f scripts/Makefile.build obj=arch/$(ARCH)/boot $(1) - -all: image listing - -listing image: vmlinux - $(call makeboot,arch/$(ARCH)/boot/$@) +all: image install: vmlinux - $(call makeboot, $@) + $(Q)$(MAKE) $(build)=$(boot) $@ -archclean: - $(Q)$(MAKE) -f scripts/Makefile.clean obj=arch/$(ARCH)/boot +image: vmlinux + $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ +archclean: + $(Q)$(MAKE) $(clean)=$(boot) prepare: include/asm-$(ARCH)/offsets.h diff -Nru a/arch/s390/boot/Makefile b/arch/s390/boot/Makefile --- a/arch/s390/boot/Makefile Wed Oct 8 12:24:57 2003 +++ b/arch/s390/boot/Makefile Wed Oct 8 12:24:57 2003 @@ -6,7 +6,7 @@ tr -c '[0-9A-Za-z]' '_'`__`date | \ tr -c '[0-9A-Za-z]' '_'`_t -EXTRA_CFLAGS := -DCOMPILE_VERSION=$(COMPILE_VERSION) -gstabs -I . +EXTRA_CFLAGS := -DCOMPILE_VERSION=$(COMPILE_VERSION) -gstabs -I. targets := image diff -Nru a/arch/s390/defconfig b/arch/s390/defconfig --- a/arch/s390/defconfig Wed Oct 8 12:24:57 2003 +++ b/arch/s390/defconfig Wed Oct 8 12:24:57 2003 @@ -85,7 +85,35 @@ # # SCSI device support # -# CONFIG_SCSI is not set +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_ST=y +# CONFIG_CHR_DEV_OSST is not set +CONFIG_BLK_DEV_SR=y +CONFIG_BLK_DEV_SR_VENDOR=y +CONFIG_CHR_DEV_SG=y + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_REPORT_LUNS is not set +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y + +# +# SCSI low-level drivers +# +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_EATA_PIO is not set +# CONFIG_SCSI_DEBUG is not set +CONFIG_ZFCP=y CONFIG_CCW=y # @@ -383,7 +411,11 @@ # CONFIG_ATARI_PARTITION is not set CONFIG_IBM_PARTITION=y # CONFIG_MAC_PARTITION is not set -# CONFIG_MSDOS_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_NEC98_PARTITION is not set # CONFIG_SGI_PARTITION is not set diff -Nru a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c --- a/arch/s390/kernel/init_task.c Wed Oct 8 12:24:57 2003 +++ b/arch/s390/kernel/init_task.c Wed Oct 8 12:24:57 2003 @@ -7,6 +7,7 @@ */ #include +#include #include #include @@ -19,6 +20,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -37,3 +40,4 @@ */ struct task_struct init_task = INIT_TASK(init_task); +EXPORT_SYMBOL(init_task); diff -Nru a/arch/s390/kernel/s390_ksyms.c b/arch/s390/kernel/s390_ksyms.c --- a/arch/s390/kernel/s390_ksyms.c Wed Oct 8 12:24:57 2003 +++ b/arch/s390/kernel/s390_ksyms.c Wed Oct 8 12:24:57 2003 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -72,3 +73,5 @@ EXPORT_SYMBOL(console_device); EXPORT_SYMBOL_NOVERS(do_call_softirq); EXPORT_SYMBOL(sys_wait4); +EXPORT_SYMBOL(cpcmd); + diff -Nru a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c --- a/arch/s390/kernel/setup.c Wed Oct 8 12:24:55 2003 +++ b/arch/s390/kernel/setup.c Wed Oct 8 12:24:55 2003 @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -289,15 +290,21 @@ _machine_restart(command); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { _machine_halt(); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { _machine_power_off(); } + +EXPORT_SYMBOL(machine_power_off); /* * Setup function called from init/main.c just after the banner diff -Nru a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c --- a/arch/s390/kernel/smp.c Wed Oct 8 12:24:55 2003 +++ b/arch/s390/kernel/smp.c Wed Oct 8 12:24:55 2003 @@ -55,6 +55,8 @@ cpumask_t cpu_possible_map; unsigned long cache_decay_ticks = 0; +EXPORT_SYMBOL(cpu_online_map); + /* * Reboot, halt and power_off routines for SMP. */ diff -Nru a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S --- a/arch/s390/kernel/syscalls.S Wed Oct 8 12:24:55 2003 +++ b/arch/s390/kernel/syscalls.S Wed Oct 8 12:24:55 2003 @@ -249,7 +249,7 @@ SYSCALL(sys_futex,sys_futex,compat_sys_futex_wrapper) SYSCALL(sys_sched_setaffinity,sys_sched_setaffinity,sys32_sched_setaffinity_wrapper) SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper) /* 240 */ -NI_SYSCALL +SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill) NI_SYSCALL /* reserved for TUX */ SYSCALL(sys_io_setup,sys_io_setup,sys_ni_syscall) SYSCALL(sys_io_destroy,sys_io_destroy,sys_ni_syscall) @@ -268,6 +268,7 @@ SYSCALL(sys_timer_getoverrun,sys_timer_getoverrun,sys_ni_syscall) SYSCALL(sys_timer_delete,sys_timer_delete,sys_ni_syscall) SYSCALL(sys_clock_settime,sys_clock_settime,sys_ni_syscall) -SYSCALL(sys_clock_gettime,sys_clock_gettime,sys_ni_syscall) +SYSCALL(sys_clock_gettime,sys_clock_gettime,sys_ni_syscall) /* 260 */ SYSCALL(sys_clock_getres,sys_clock_getres,sys_ni_syscall) SYSCALL(sys_clock_nanosleep,sys_clock_nanosleep,sys_ni_syscall) +NI_SYSCALL /* reserved for vserver */ diff -Nru a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c --- a/arch/s390/kernel/time.c Wed Oct 8 12:24:55 2003 +++ b/arch/s390/kernel/time.c Wed Oct 8 12:24:55 2003 @@ -12,6 +12,7 @@ */ #include +#include #include #include #include @@ -48,6 +49,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + static ext_int_info_t ext_int_info_timer; static u64 init_timer_cc; static u64 jiffies_timer_cc; @@ -109,6 +112,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, sec = tv->tv_sec; @@ -140,6 +145,8 @@ return 0; } +EXPORT_SYMBOL(do_settimeofday); + #ifndef CONFIG_ARCH_S390X static inline __u32 @@ -266,7 +273,7 @@ jiffies_timer_cc = init_timer_cc - jiffies_64 * CLK_TICKS_PER_JIFFY; /* set xtime */ - xtime_cc = init_timer_cc; + xtime_cc = init_timer_cc + CLK_TICKS_PER_JIFFY; set_time_cc = init_timer_cc - 0x8126d60e46000000LL + (0x3c26700LL*1000000*4096); tod_to_timeval(set_time_cc, &xtime); diff -Nru a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c --- a/arch/s390/kernel/traps.c Wed Oct 8 12:24:56 2003 +++ b/arch/s390/kernel/traps.c Wed Oct 8 12:24:56 2003 @@ -147,6 +147,8 @@ show_stack(0, 0); } +EXPORT_SYMBOL(dump_stack); + void show_registers(struct pt_regs *regs) { mm_segment_t old_fs; diff -Nru a/arch/s390/mm/ioremap.c b/arch/s390/mm/ioremap.c --- a/arch/s390/mm/ioremap.c Wed Oct 8 12:24:55 2003 +++ b/arch/s390/mm/ioremap.c Wed Oct 8 12:24:55 2003 @@ -124,7 +124,7 @@ if (!area) return NULL; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vfree(addr); return NULL; } diff -Nru a/arch/sh/kernel/init_task.c b/arch/sh/kernel/init_task.c --- a/arch/sh/kernel/init_task.c Wed Oct 8 12:24:55 2003 +++ b/arch/sh/kernel/init_task.c Wed Oct 8 12:24:55 2003 @@ -1,4 +1,5 @@ #include +#include #include #include @@ -11,6 +12,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial thread structure. * @@ -28,3 +31,5 @@ * All other task structs will be allocated on slabs in fork.c */ struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_task); diff -Nru a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c --- a/arch/sh/kernel/irq.c Wed Oct 8 12:24:56 2003 +++ b/arch/sh/kernel/irq.c Wed Oct 8 12:24:56 2003 @@ -14,6 +14,7 @@ */ #include +#include #include #include #include @@ -354,6 +355,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { irq_desc_t *desc; @@ -391,6 +394,8 @@ } } +EXPORT_SYMBOL(free_irq); + static DECLARE_MUTEX(probe_sem); /* @@ -475,6 +480,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off(unsigned long val) { int i, irq_found, nr_irqs; @@ -505,6 +512,8 @@ irq_found = -irq_found; return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); int setup_irq(unsigned int irq, struct irqaction * new) { diff -Nru a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c --- a/arch/sh/kernel/process.c Wed Oct 8 12:24:57 2003 +++ b/arch/sh/kernel/process.c Wed Oct 8 12:24:57 2003 @@ -11,6 +11,7 @@ * This file handles the architecture-dependent parts of process handling.. */ +#include #include #include #include @@ -33,11 +34,15 @@ hlt_counter++; } +EXPORT_SYMBOL(disable_hlt); + void enable_hlt(void) { hlt_counter--; } +EXPORT_SYMBOL(enable_hlt); + void default_idle(void) { /* endless idle loop with no priority at all */ @@ -71,15 +76,21 @@ "mov.l @%1, %0" : : "r" (0x10000000), "r" (0x80000001)); } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { while (1) asm volatile("sleep" : : : "memory"); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { } + +EXPORT_SYMBOL(machine_power_off); void show_regs(struct pt_regs * regs) { diff -Nru a/arch/sh/kernel/time.c b/arch/sh/kernel/time.c --- a/arch/sh/kernel/time.c Wed Oct 8 12:24:55 2003 +++ b/arch/sh/kernel/time.c Wed Oct 8 12:24:55 2003 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -72,6 +73,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + /* XXX: Can we initialize this in a routine somewhere? Dreamcast doesn't want * these routines anywhere... */ #ifdef CONFIG_SH_RTC @@ -177,6 +180,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { time_t wtm_sec, sec = tv->tv_sec; @@ -210,6 +215,8 @@ return 0; } + +EXPORT_SYMBOL(do_settimeofday); /* last time the RTC clock got updated */ static long last_rtc_update; diff -Nru a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c --- a/arch/sh/kernel/traps.c Wed Oct 8 12:24:55 2003 +++ b/arch/sh/kernel/traps.c Wed Oct 8 12:24:55 2003 @@ -647,3 +647,4 @@ show_stack(NULL, NULL); } +EXPORT_SYMBOL(dump_stack); diff -Nru a/arch/sh/mm/init.c b/arch/sh/mm/init.c --- a/arch/sh/mm/init.c Wed Oct 8 12:24:57 2003 +++ b/arch/sh/mm/init.c Wed Oct 8 12:24:57 2003 @@ -51,8 +51,8 @@ #endif #ifdef CONFIG_DISCONTIGMEM -pg_data_t discontig_page_data[NR_NODES]; -bootmem_data_t discontig_node_bdata[NR_NODES]; +pg_data_t discontig_page_data[MAX_NUMNODES]; +bootmem_data_t discontig_node_bdata[MAX_NUMNODES]; #endif void show_mem(void) diff -Nru a/arch/sh/mm/ioremap.c b/arch/sh/mm/ioremap.c --- a/arch/sh/mm/ioremap.c Wed Oct 8 12:24:57 2003 +++ b/arch/sh/mm/ioremap.c Wed Oct 8 12:24:57 2003 @@ -149,7 +149,7 @@ if (!area) return NULL; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vfree(addr); return NULL; } diff -Nru a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S --- a/arch/sparc/kernel/entry.S Wed Oct 8 12:24:56 2003 +++ b/arch/sparc/kernel/entry.S Wed Oct 8 12:24:56 2003 @@ -38,7 +38,7 @@ #define curptr g6 -#define NR_SYSCALLS 267 /* Each OS is different... */ +#define NR_SYSCALLS 268 /* Each OS is different... */ /* These are just handy. */ #define _SV save %sp, -STACKFRAME_SZ, %sp diff -Nru a/arch/sparc/kernel/init_task.c b/arch/sparc/kernel/init_task.c --- a/arch/sparc/kernel/init_task.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc/kernel/init_task.c Wed Oct 8 12:24:57 2003 @@ -1,4 +1,5 @@ #include +#include #include #include @@ -11,6 +12,9 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_mm); +EXPORT_SYMBOL(init_task); /* .text section in head.S is aligned at 8k boundary and this gets linked * right after that so that the init_thread_union is aligned properly as well. diff -Nru a/arch/sparc/kernel/irq.c b/arch/sparc/kernel/irq.c --- a/arch/sparc/kernel/irq.c Wed Oct 8 12:24:55 2003 +++ b/arch/sparc/kernel/irq.c Wed Oct 8 12:24:55 2003 @@ -12,6 +12,7 @@ */ #include +#include #include #include #include @@ -203,6 +204,8 @@ restore_flags(flags); } +EXPORT_SYMBOL(free_irq); + #ifdef CONFIG_SMP /* Who has the global irq brlock */ @@ -621,6 +624,8 @@ return 0; } +EXPORT_SYMBOL(request_irq); + /* We really don't need these at all on the Sparc. We only have * stubs here because they are exported to modules. */ @@ -629,10 +634,14 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off(unsigned long mask) { return 0; } + +EXPORT_SYMBOL(probe_irq_off); /* djhr * This could probably be made indirect too and assigned in the CPU diff -Nru a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c --- a/arch/sparc/kernel/process.c Wed Oct 8 12:24:55 2003 +++ b/arch/sparc/kernel/process.c Wed Oct 8 12:24:55 2003 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -157,6 +158,8 @@ panic("Halt failed!"); } +EXPORT_SYMBOL(machine_halt); + void machine_restart(char * cmd) { char *p; @@ -177,6 +180,8 @@ panic("Reboot failed!"); } +EXPORT_SYMBOL(machine_restart); + void machine_power_off(void) { #ifdef CONFIG_SUN_AUXIO @@ -185,6 +190,8 @@ #endif machine_halt(); } + +EXPORT_SYMBOL(machine_power_off); static spinlock_t sparc_backtrace_lock = SPIN_LOCK_UNLOCKED; diff -Nru a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c --- a/arch/sparc/kernel/sparc_ksyms.c Wed Oct 8 12:24:55 2003 +++ b/arch/sparc/kernel/sparc_ksyms.c Wed Oct 8 12:24:55 2003 @@ -224,7 +224,6 @@ EXPORT_SYMBOL(svr4_getcontext); EXPORT_SYMBOL(_sigpause_common); -/* Should really be in linux/kernel/ksyms.c */ EXPORT_SYMBOL(dump_thread); /* prom symbols */ diff -Nru a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S --- a/arch/sparc/kernel/systbls.S Wed Oct 8 12:24:56 2003 +++ b/arch/sparc/kernel/systbls.S Wed Oct 8 12:24:56 2003 @@ -72,7 +72,7 @@ /*250*/ .long sparc_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl /*255*/ .long sys_nis_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep /*260*/ .long sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun -/*265*/ .long sys_timer_delete, sys_timer_create, sys_nis_syscall +/*265*/ .long sys_timer_delete, sys_timer_create, sys_nis_syscall, sys_nis_syscall #ifdef CONFIG_SUNOS_EMUL /* Now the SunOS syscall table. */ @@ -171,6 +171,6 @@ .long sunos_nosys /*260*/ .long sunos_nosys, sunos_nosys, sunos_nosys .long sunos_nosys, sunos_nosys, sunos_nosys - .long sunos_nosys, sunos_nosys + .long sunos_nosys, sunos_nosys, sunos_nosys #endif diff -Nru a/arch/sparc/kernel/time.c b/arch/sparc/kernel/time.c --- a/arch/sparc/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -17,6 +17,7 @@ */ #include #include +#include #include #include #include @@ -47,6 +48,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; enum sparc_clock_type sp_clock_typ; spinlock_t mostek_lock = SPIN_LOCK_UNLOCKED; @@ -500,6 +503,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { int ret; @@ -509,6 +514,8 @@ write_sequnlock_irq(&xtime_lock); return ret; } + +EXPORT_SYMBOL(do_settimeofday); static int sbus_do_settimeofday(struct timespec *tv) { diff -Nru a/arch/sparc/mm/init.c b/arch/sparc/mm/init.c --- a/arch/sparc/mm/init.c Wed Oct 8 12:24:56 2003 +++ b/arch/sparc/mm/init.c Wed Oct 8 12:24:56 2003 @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -56,6 +57,9 @@ pte_t *kmap_pte; pgprot_t kmap_prot; + +EXPORT_SYMBOL(kmap_prot); +EXPORT_SYMBOL(kmap_pte); /* These are set in {srmmu,sun4c}_paging_init() */ unsigned long fix_kmap_begin; diff -Nru a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig --- a/arch/sparc64/Kconfig Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/Kconfig Wed Oct 8 12:24:57 2003 @@ -359,6 +359,11 @@ depends on SPARC32_COMPAT default y +config UID16 + bool + depends on SPARC32_COMPAT + default y + config BINFMT_ELF32 tristate "Kernel support for 32-bit ELF binaries" depends on SPARC32_COMPAT diff -Nru a/arch/sparc64/defconfig b/arch/sparc64/defconfig --- a/arch/sparc64/defconfig Wed Oct 8 12:24:56 2003 +++ b/arch/sparc64/defconfig Wed Oct 8 12:24:56 2003 @@ -75,6 +75,7 @@ CONFIG_SUN_OPENPROMFS=m CONFIG_SPARC32_COMPAT=y CONFIG_COMPAT=y +CONFIG_UID16=y CONFIG_BINFMT_ELF32=y # CONFIG_BINFMT_AOUT32 is not set CONFIG_BINFMT_ELF=y @@ -571,6 +572,7 @@ CONFIG_BRIDGE_EBT_802_3=m CONFIG_BRIDGE_EBT_ARP=m CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m CONFIG_BRIDGE_EBT_MARK=m CONFIG_BRIDGE_EBT_PKTTYPE=m CONFIG_BRIDGE_EBT_STP=m @@ -665,7 +667,7 @@ # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y -# CONFIG_MII is not set +CONFIG_MII=m CONFIG_SUNLANCE=y CONFIG_HAPPYMEAL=y CONFIG_SUNBMAC=m @@ -729,15 +731,6 @@ CONFIG_R8169=m # CONFIG_SIS190 is not set CONFIG_SK98LIN=m -CONFIG_CONFIG_SK98LIN_T1=y -CONFIG_CONFIG_SK98LIN_T2=y -CONFIG_CONFIG_SK98LIN_T3=y -CONFIG_CONFIG_SK98LIN_T4=y -CONFIG_CONFIG_SK98LIN_T5=y -CONFIG_CONFIG_SK98LIN_T6=y -CONFIG_CONFIG_SK98LIN_T7=y -CONFIG_CONFIG_SK98LIN_T8=y -CONFIG_CONFIG_SK98LIN_T9=y CONFIG_TIGON3=m # @@ -895,6 +888,30 @@ # CONFIG_VLSI_FIR is not set # +# Bluetooth support +# +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y + +# +# Bluetooth device drivers +# +CONFIG_BT_HCIUSB=m +CONFIG_BT_USB_SCO=y +# CONFIG_BT_USB_ZERO_PACKET is not set +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_BCSP_TXCRC=y +CONFIG_BT_HCIVHCI=m + +# # ISDN subsystem # CONFIG_ISDN_BOOL=y @@ -963,8 +980,14 @@ # # Input I/O drivers # -# CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y +CONFIG_GAMEPORT=m +CONFIG_SOUND_GAMEPORT=m +# CONFIG_GAMEPORT_NS558 is not set +# CONFIG_GAMEPORT_L4 is not set +# CONFIG_GAMEPORT_EMU10K1 is not set +# CONFIG_GAMEPORT_VORTEX is not set +# CONFIG_GAMEPORT_FM801 is not set +# CONFIG_GAMEPORT_CS461x is not set CONFIG_SERIO=y CONFIG_SERIO_I8042=y # CONFIG_SERIO_SERPORT is not set @@ -1318,6 +1341,9 @@ # CONFIG_SND_ALI5451=m CONFIG_SND_AZT3328=m +CONFIG_SND_CS46XX=m +# CONFIG_SND_CS46XX_NEW_DSP is not set +CONFIG_SND_CS4281=m CONFIG_SND_EMU10K1=m CONFIG_SND_KORG1212=m CONFIG_SND_NM256=m @@ -1325,15 +1351,20 @@ # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_HDSP is not set +CONFIG_SND_TRIDENT=m CONFIG_SND_YMFPCI=m CONFIG_SND_ALS4000=m CONFIG_SND_CMIPCI=m +CONFIG_SND_ENS1370=m +CONFIG_SND_ENS1371=m +CONFIG_SND_ES1938=m CONFIG_SND_ES1968=m CONFIG_SND_MAESTRO3=m CONFIG_SND_FM801=m CONFIG_SND_ICE1712=m # CONFIG_SND_ICE1724 is not set CONFIG_SND_INTEL8X0=m +CONFIG_SND_SONICVIBES=m # CONFIG_SND_VIA82XX is not set CONFIG_SND_VX222=m @@ -1515,30 +1546,6 @@ CONFIG_USB_SPEEDTOUCH=m CONFIG_USB_TEST=m # CONFIG_USB_GADGET is not set - -# -# Bluetooth support -# -CONFIG_BT=m -CONFIG_BT_L2CAP=m -CONFIG_BT_SCO=m -CONFIG_BT_RFCOMM=m -CONFIG_BT_RFCOMM_TTY=y -CONFIG_BT_BNEP=m -CONFIG_BT_BNEP_MC_FILTER=y -CONFIG_BT_BNEP_PROTO_FILTER=y - -# -# Bluetooth device drivers -# -CONFIG_BT_HCIUSB=m -CONFIG_BT_USB_SCO=y -# CONFIG_BT_USB_ZERO_PACKET is not set -CONFIG_BT_HCIUART=m -CONFIG_BT_HCIUART_H4=y -CONFIG_BT_HCIUART_BCSP=y -CONFIG_BT_HCIUART_BCSP_TXCRC=y -CONFIG_BT_HCIVHCI=m # # Watchdog diff -Nru a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S --- a/arch/sparc64/kernel/entry.S Wed Oct 8 12:24:55 2003 +++ b/arch/sparc64/kernel/entry.S Wed Oct 8 12:24:55 2003 @@ -26,7 +26,7 @@ #define curptr g6 -#define NR_SYSCALLS 267 /* Each OS is different... */ +#define NR_SYSCALLS 268 /* Each OS is different... */ .text .align 32 diff -Nru a/arch/sparc64/kernel/init_task.c b/arch/sparc64/kernel/init_task.c --- a/arch/sparc64/kernel/init_task.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/init_task.c Wed Oct 8 12:24:57 2003 @@ -1,4 +1,5 @@ #include +#include #include #include @@ -12,6 +13,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* .text section in head.S is aligned at 2 page boundary and this gets linked * right after that so that the init_thread_union is aligned properly as well. * We really don't need this special alignment like the Intel does, but @@ -33,5 +36,7 @@ * * All other task structs will be allocated on slabs in fork.c */ +EXPORT_SYMBOL(init_task); + __asm__(".data"); struct task_struct init_task = INIT_TASK(init_task); diff -Nru a/arch/sparc64/kernel/ioctl32.c b/arch/sparc64/kernel/ioctl32.c --- a/arch/sparc64/kernel/ioctl32.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/ioctl32.c Wed Oct 8 12:24:57 2003 @@ -985,402 +985,6 @@ #endif -/* HERE! */ - -struct usbdevfs_ctrltransfer32 { - __u8 bRequestType; - __u8 bRequest; - __u16 wValue; - __u16 wIndex; - __u16 wLength; - __u32 timeout; /* in milliseconds */ - __u32 data; -}; - -#define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32) - -static int do_usbdevfs_control(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_ctrltransfer kctrl; - struct usbdevfs_ctrltransfer32 *uctrl; - mm_segment_t old_fs; - __u32 udata; - void __user *uptr; - void *kptr; - int err; - - uctrl = (struct usbdevfs_ctrltransfer32 *) arg; - - if (copy_from_user(&kctrl, uctrl, - (sizeof(struct usbdevfs_ctrltransfer) - - sizeof(void *)))) - return -EFAULT; - - if (get_user(udata, &uctrl->data)) - return -EFAULT; - uptr = A(udata); - - /* In usbdevice_fs, it limits the control buffer to a page, - * for simplicity so do we. - */ - if (!uptr || kctrl.wLength > PAGE_SIZE) - return -EINVAL; - - kptr = (void *)__get_free_page(GFP_KERNEL); - - if ((kctrl.bRequestType & 0x80) == 0) { - err = -EFAULT; - if (copy_from_user(kptr, uptr, kctrl.wLength)) - goto out; - } - - kctrl.data = kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_CONTROL, (unsigned long)&kctrl); - set_fs(old_fs); - - if (err >= 0 && - ((kctrl.bRequestType & 0x80) != 0)) { - if (copy_to_user(uptr, kptr, kctrl.wLength)) - err = -EFAULT; - } - -out: - free_page((unsigned long) kptr); - return err; -} - -struct usbdevfs_bulktransfer32 { - unsigned int ep; - unsigned int len; - unsigned int timeout; /* in milliseconds */ - __u32 data; -}; - -#define USBDEVFS_BULK32 _IOWR('U', 2, struct usbdevfs_bulktransfer32) - -static int do_usbdevfs_bulk(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_bulktransfer kbulk; - struct usbdevfs_bulktransfer32 *ubulk; - mm_segment_t old_fs; - __u32 udata; - void __user *uptr; - void *kptr; - int err; - - ubulk = (struct usbdevfs_bulktransfer32 *) arg; - - if (get_user(kbulk.ep, &ubulk->ep) || - get_user(kbulk.len, &ubulk->len) || - get_user(kbulk.timeout, &ubulk->timeout) || - get_user(udata, &ubulk->data)) - return -EFAULT; - - uptr = A(udata); - - /* In usbdevice_fs, it limits the control buffer to a page, - * for simplicity so do we. - */ - if (!uptr || kbulk.len > PAGE_SIZE) - return -EINVAL; - - kptr = (void *) __get_free_page(GFP_KERNEL); - - if ((kbulk.ep & 0x80) == 0) { - err = -EFAULT; - if (copy_from_user(kptr, uptr, kbulk.len)) - goto out; - } - - kbulk.data = kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_BULK, (unsigned long) &kbulk); - set_fs(old_fs); - - if (err >= 0 && - ((kbulk.ep & 0x80) != 0)) { - if (copy_to_user(uptr, kptr, kbulk.len)) - err = -EFAULT; - } - -out: - free_page((unsigned long) kptr); - return err; -} - -/* This needs more work before we can enable it. Unfortunately - * because of the fancy asynchronous way URB status/error is written - * back to userspace, we'll need to fiddle with USB devio internals - * and/or reimplement entirely the frontend of it ourselves. -DaveM - * - * The issue is: - * - * When an URB is submitted via usbdevicefs it is put onto an - * asynchronous queue. When the URB completes, it may be reaped - * via another ioctl. During this reaping the status is written - * back to userspace along with the length of the transfer. - * - * We must translate into 64-bit kernel types so we pass in a kernel - * space copy of the usbdevfs_urb structure. This would mean that we - * must do something to deal with the async entry reaping. First we - * have to deal somehow with this transitory memory we've allocated. - * This is problematic since there are many call sites from which the - * async entries can be destroyed (and thus when we'd need to free up - * this kernel memory). One of which is the close() op of usbdevicefs. - * To handle that we'd need to make our own file_operations struct which - * overrides usbdevicefs's release op with our own which runs usbdevicefs's - * real release op then frees up the kernel memory. - * - * But how to keep track of these kernel buffers? We'd need to either - * keep track of them in some table _or_ know about usbdevicefs internals - * (ie. the exact layout of its file private, which is actually defined - * in linux/usbdevice_fs.h, the layout of the async queues are private to - * devio.c) - * - * There is one possible other solution I considered, also involving knowledge - * of usbdevicefs internals: - * - * After an URB is submitted, we "fix up" the address back to the user - * space one. This would work if the status/length fields written back - * by the async URB completion lines up perfectly in the 32-bit type with - * the 64-bit kernel type. Unfortunately, it does not because the iso - * frame descriptors, at the end of the struct, can be written back. - * - * I think we'll just need to simply duplicate the devio URB engine here. - */ -#if 0 -struct usbdevfs_urb32 { - __u8 type; - __u8 endpoint; - __s32 status; - __u32 flags; - __u32 buffer; - __s32 buffer_length; - __s32 actual_length; - __s32 start_frame; - __s32 number_of_packets; - __s32 error_count; - __u32 signr; - __u32 usercontext; /* unused */ - struct usbdevfs_iso_packet_desc iso_frame_desc[0]; -}; - -#define USBDEVFS_SUBMITURB32 _IOR('U', 10, struct usbdevfs_urb32) - -static int get_urb32(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - if (get_user(kurb->type, &uurb->type) || - __get_user(kurb->endpoint, &uurb->endpoint) || - __get_user(kurb->status, &uurb->status) || - __get_user(kurb->flags, &uurb->flags) || - __get_user(kurb->buffer_length, &uurb->buffer_length) || - __get_user(kurb->actual_length, &uurb->actual_length) || - __get_user(kurb->start_frame, &uurb->start_frame) || - __get_user(kurb->number_of_packets, &uurb->number_of_packets) || - __get_user(kurb->error_count, &uurb->error_count) || - __get_user(kurb->signr, &uurb->signr)) - return -EFAULT; - - kurb->usercontext = 0; /* unused currently */ - - return 0; -} - -/* Just put back the values which usbdevfs actually changes. */ -static int put_urb32(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - if (put_user(kurb->status, &uurb->status) || - __put_user(kurb->actual_length, &uurb->actual_length) || - __put_user(kurb->error_count, &uurb->error_count)) - return -EFAULT; - - if (kurb->number_of_packets != 0) { - int i; - - for (i = 0; i < kurb->number_of_packets; i++) { - if (__put_user(kurb->iso_frame_desc[i].actual_length, - &uurb->iso_frame_desc[i].actual_length) || - __put_user(kurb->iso_frame_desc[i].status, - &uurb->iso_frame_desc[i].status)) - return -EFAULT; - } - } - - return 0; -} - -static int get_urb32_isoframes(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - unsigned int totlen; - int i; - - if (kurb->type != USBDEVFS_URB_TYPE_ISO) { - kurb->number_of_packets = 0; - return 0; - } - - if (kurb->number_of_packets < 1 || - kurb->number_of_packets > 128) - return -EINVAL; - - if (copy_from_user(&kurb->iso_frame_desc[0], - &uurb->iso_frame_desc[0], - sizeof(struct usbdevfs_iso_packet_desc) * - kurb->number_of_packets)) - return -EFAULT; - - totlen = 0; - for (i = 0; i < kurb->number_of_packets; i++) { - unsigned int this_len; - - this_len = kurb->iso_frame_desc[i].length; - if (this_len > 1023) - return -EINVAL; - - totlen += this_len; - } - - if (totlen > 32768) - return -EINVAL; - - kurb->buffer_length = totlen; - - return 0; -} - -static int do_usbdevfs_urb(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_urb *kurb; - struct usbdevfs_urb32 *uurb; - mm_segment_t old_fs; - __u32 udata; - void __user *uptr; - void *kptr; - unsigned int buflen; - int err; - - uurb = (struct usbdevfs_urb32 *) arg; - - err = -ENOMEM; - kurb = kmalloc(sizeof(struct usbdevfs_urb) + - (sizeof(struct usbdevfs_iso_packet_desc) * 128), - GFP_KERNEL); - if (!kurb) - goto out; - - err = -EFAULT; - if (get_urb32(kurb, uurb)) - goto out; - - err = get_urb32_isoframes(kurb, uurb); - if (err) - goto out; - - err = -EFAULT; - if (__get_user(udata, &uurb->buffer)) - goto out; - uptr = A(udata); - - err = -ENOMEM; - buflen = kurb->buffer_length; - kptr = kmalloc(buflen, GFP_KERNEL); - if (!kptr) - goto out; - - kurb->buffer = kptr; - - err = -EFAULT; - if (copy_from_user(kptr, uptr, buflen)) - goto out_kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_SUBMITURB, (unsigned long) kurb); - set_fs(old_fs); - - if (err >= 0) { - /* XXX Shit, this doesn't work for async URBs :-( XXX */ - if (put_urb32(kurb, uurb)) { - err = -EFAULT; - } else if ((kurb->endpoint & USB_DIR_IN) != 0) { - if (copy_to_user(uptr, kptr, buflen)) - err = -EFAULT; - } - } - -out_kptr: - kfree(kptr); - -out: - kfree(kurb); - return err; -} -#endif - -#define USBDEVFS_REAPURB32 _IOW('U', 12, u32) -#define USBDEVFS_REAPURBNDELAY32 _IOW('U', 13, u32) - -static int do_usbdevfs_reapurb(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - mm_segment_t old_fs; - void *kptr; - int err; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, - (cmd == USBDEVFS_REAPURB32 ? - USBDEVFS_REAPURB : - USBDEVFS_REAPURBNDELAY), - (unsigned long) &kptr); - set_fs(old_fs); - - if (err >= 0 && - put_user(((u32)(long)kptr), (u32 __user *) A(arg))) - err = -EFAULT; - - return err; -} - -struct usbdevfs_disconnectsignal32 { - unsigned int signr; - u32 context; -}; - -#define USBDEVFS_DISCSIGNAL32 _IOR('U', 14, struct usbdevfs_disconnectsignal32) - -static int do_usbdevfs_discsignal(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_disconnectsignal kdis; - struct usbdevfs_disconnectsignal32 *udis; - mm_segment_t old_fs; - u32 uctx; - int err; - - udis = (struct usbdevfs_disconnectsignal32 *) arg; - - if (get_user(kdis.signr, &udis->signr) || - __get_user(uctx, &udis->context)) - return -EFAULT; - - kdis.context = (void *) (long)uctx; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_DISCSIGNAL, (unsigned long) &kdis); - set_fs(old_fs); - - return err; -} - typedef int (* ioctl32_handler_t)(unsigned int, unsigned int, unsigned long, struct file *); #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL((cmd),sys_ioctl) @@ -1397,8 +1001,6 @@ COMPATIBLE_IOCTL(TCSBRKP) COMPATIBLE_IOCTL(TIOCSTART) COMPATIBLE_IOCTL(TIOCSTOP) -COMPATIBLE_IOCTL(TIOCGSERIAL) -COMPATIBLE_IOCTL(TIOCSSERIAL) COMPATIBLE_IOCTL(TIOCSLTC) COMPATIBLE_IOCTL(FBIOGTYPE) COMPATIBLE_IOCTL(FBIOSATTR) @@ -1467,9 +1069,6 @@ COMPATIBLE_IOCTL(AUDIO_GETDEV_SUNOS) COMPATIBLE_IOCTL(AUDIO_FLUSH) COMPATIBLE_IOCTL(AUTOFS_IOC_EXPIRE_MULTI) -/* Raw devices */ -COMPATIBLE_IOCTL(RAW_SETBIND) -COMPATIBLE_IOCTL(RAW_GETBIND) /* NCP ioctls which do not need any translations */ COMPATIBLE_IOCTL(NCP_IOC_CONN_LOGGED_IN) COMPATIBLE_IOCTL(NCP_IOC_SIGN_INIT) @@ -1575,12 +1174,6 @@ HANDLE_IOCTL(RTC32_EPOCH_READ, do_rtc_ioctl) HANDLE_IOCTL(RTC32_EPOCH_SET, do_rtc_ioctl) #endif -HANDLE_IOCTL(USBDEVFS_CONTROL32, do_usbdevfs_control) -HANDLE_IOCTL(USBDEVFS_BULK32, do_usbdevfs_bulk) -/*HANDLE_IOCTL(USBDEVFS_SUBMITURB32, do_usbdevfs_urb)*/ -HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb) -HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb) -HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal) /* take care of sizeof(sizeof()) breakage */ IOCTL_TABLE_END diff -Nru a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c --- a/arch/sparc64/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -486,6 +487,8 @@ return -ENOMEM; } +EXPORT_SYMBOL(request_irq); + void free_irq(unsigned int irq, void *dev_id) { struct irqaction *action; @@ -608,6 +611,8 @@ spin_unlock_irqrestore(&irq_action_lock, flags); } +EXPORT_SYMBOL(free_irq); + #ifdef CONFIG_SMP void synchronize_irq(unsigned int irq) { @@ -959,10 +964,14 @@ return 0; } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off(unsigned long mask) { return 0; } + +EXPORT_SYMBOL(probe_irq_off); #ifdef CONFIG_SMP static int retarget_one_irq(struct irqaction *p, int goal_cpu) diff -Nru a/arch/sparc64/kernel/module.c b/arch/sparc64/kernel/module.c --- a/arch/sparc64/kernel/module.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/module.c Wed Oct 8 12:24:57 2003 @@ -14,6 +14,9 @@ #include #include +#include +#include + static struct vm_struct * modvmlist = NULL; static void module_unmap(void * addr) @@ -279,6 +282,16 @@ const Elf_Shdr *sechdrs, struct module *me) { + /* Cheetah's I-cache is fully coherent. */ + if (tlb_type == spitfire) { + unsigned long va; + + flushw_all(); + for (va = 0; va < (PAGE_SIZE << 1); va += 32) + spitfire_put_icache_tag(va, 0x0); + __asm__ __volatile__("flush %g6"); + } + return 0; } diff -Nru a/arch/sparc64/kernel/power.c b/arch/sparc64/kernel/power.c --- a/arch/sparc64/kernel/power.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/power.c Wed Oct 8 12:24:57 2003 @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -60,6 +61,8 @@ } machine_halt(); } + +EXPORT_SYMBOL(machine_power_off); #ifdef CONFIG_PCI static int powerd(void *__unused) diff -Nru a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c --- a/arch/sparc64/kernel/process.c Wed Oct 8 12:24:56 2003 +++ b/arch/sparc64/kernel/process.c Wed Oct 8 12:24:56 2003 @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -125,6 +126,8 @@ panic("Halt failed!"); } +EXPORT_SYMBOL(machine_halt); + void machine_alt_power_off(void) { if (!serial_console && prom_palette) @@ -152,6 +155,8 @@ prom_reboot(""); panic("Reboot failed!"); } + +EXPORT_SYMBOL(machine_restart); static void show_regwindow32(struct pt_regs *regs) { diff -Nru a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c --- a/arch/sparc64/kernel/smp.c Wed Oct 8 12:24:55 2003 +++ b/arch/sparc64/kernel/smp.c Wed Oct 8 12:24:55 2003 @@ -118,7 +118,6 @@ inherit_locked_prom_mappings(0); - __flush_cache_all(); __flush_tlb_all(); smp_setup_percpu_timer(); @@ -661,7 +660,6 @@ extern unsigned long xcall_flush_tlb_kernel_range; extern unsigned long xcall_flush_tlb_all_spitfire; extern unsigned long xcall_flush_tlb_all_cheetah; -extern unsigned long xcall_flush_cache_all_spitfire; extern unsigned long xcall_report_regs; extern unsigned long xcall_receive_signal; extern unsigned long xcall_flush_dcache_page_cheetah; @@ -774,15 +772,6 @@ void smp_report_regs(void) { smp_cross_call(&xcall_report_regs, 0, 0, 0); -} - -void smp_flush_cache_all(void) -{ - /* Cheetah need do nothing. */ - if (tlb_type == spitfire) { - smp_cross_call(&xcall_flush_cache_all_spitfire, 0, 0, 0); - __flush_cache_all(); - } } void smp_flush_tlb_all(void) diff -Nru a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c --- a/arch/sparc64/kernel/sparc64_ksyms.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/sparc64_ksyms.c Wed Oct 8 12:24:57 2003 @@ -250,7 +250,6 @@ EXPORT_SYMBOL(_sigpause_common); EXPORT_SYMBOL(verify_compat_iovec); -/* Should really be in linux/kernel/ksyms.c */ EXPORT_SYMBOL(dump_thread); EXPORT_SYMBOL(dump_fpu); EXPORT_SYMBOL(pte_alloc_one_kernel); @@ -341,6 +340,7 @@ EXPORT_SYMBOL(__memmove); EXPORT_SYMBOL(memchr); +EXPORT_SYMBOL(csum_partial); EXPORT_SYMBOL(csum_partial_copy_sparc64); EXPORT_SYMBOL(ip_fast_csum); diff -Nru a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c --- a/arch/sparc64/kernel/sys_sparc32.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/sys_sparc32.c Wed Oct 8 12:24:57 2003 @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -99,34 +100,6 @@ extern asmlinkage long sys_setfsuid(uid_t); extern asmlinkage long sys_setfsgid(gid_t); -/* For this source file, we want overflow handling. */ - -#undef high2lowuid -#undef high2lowgid -#undef low2highuid -#undef low2highgid -#undef SET_UID16 -#undef SET_GID16 -#undef NEW_TO_OLD_UID -#undef NEW_TO_OLD_GID -#undef SET_OLDSTAT_UID -#undef SET_OLDSTAT_GID -#undef SET_STAT_UID -#undef SET_STAT_GID - -#define high2lowuid(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid) -#define high2lowgid(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid) -#define low2highuid(uid) ((uid) == (u16)-1) ? (uid_t)-1 : (uid_t)(uid) -#define low2highgid(gid) ((gid) == (u16)-1) ? (gid_t)-1 : (gid_t)(gid) -#define SET_UID16(var, uid) var = high2lowuid(uid) -#define SET_GID16(var, gid) var = high2lowgid(gid) -#define NEW_TO_OLD_UID(uid) high2lowuid(uid) -#define NEW_TO_OLD_GID(gid) high2lowgid(gid) -#define SET_OLDSTAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) -#define SET_OLDSTAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) -#define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) -#define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) - asmlinkage long sys32_chown16(const char * filename, u16 user, u16 group) { return sys_chown(filename, low2highuid(user), low2highgid(group)); diff -Nru a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S --- a/arch/sparc64/kernel/systbls.S Wed Oct 8 12:24:56 2003 +++ b/arch/sparc64/kernel/systbls.S Wed Oct 8 12:24:56 2003 @@ -72,7 +72,7 @@ /*250*/ .word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, sys32_nfsservctl .word sys_ni_syscall, compat_clock_settime, compat_clock_gettime, compat_clock_getres, compat_clock_nanosleep /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, compat_timer_settime, compat_timer_gettime, sys_timer_getoverrun - .word sys_timer_delete, sys32_timer_create, sys_ni_syscall + .word sys_timer_delete, sys32_timer_create, sys_ni_syscall, sys_ni_syscall /* Now the 64-bit native Linux syscall table. */ @@ -133,7 +133,7 @@ /*250*/ .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl .word sys_ni_syscall, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep /*260*/ .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun - .word sys_timer_delete, sys_timer_create, sys_ni_syscall + .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_ni_syscall #if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \ defined(CONFIG_SOLARIS_EMUL_MODULE) @@ -233,5 +233,6 @@ .word sunos_nosys, sunos_nosys, sunos_nosys .word sunos_nosys, sunos_nosys, sunos_nosys .word sunos_nosys, sunos_nosys, sunos_nosys + .word sunos_nosys #endif diff -Nru a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c --- a/arch/sparc64/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/sparc64/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -55,6 +56,8 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + static unsigned long mstk48t08_regs = 0UL; static unsigned long mstk48t59_regs = 0UL; @@ -1126,6 +1129,8 @@ return 0; } +EXPORT_SYMBOL(do_settimeofday); + /* Ok, my cute asm atomicity trick doesn't work anymore. * There are just too many variables that need to be protected * now (both members of xtime, wall_jiffies, et al.) @@ -1156,6 +1161,8 @@ tv->tv_sec = sec; tv->tv_usec = usec; } + +EXPORT_SYMBOL(do_gettimeofday); static int set_rtc_mmss(unsigned long nowtime) { diff -Nru a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c --- a/arch/sparc64/kernel/traps.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/kernel/traps.c Wed Oct 8 12:24:57 2003 @@ -10,6 +10,7 @@ */ #include +#include #include /* for jiffies */ #include #include @@ -1766,6 +1767,8 @@ : "=r" (ksp)); show_stack(current, ksp); } + +EXPORT_SYMBOL(dump_stack); void die_if_kernel(char *str, struct pt_regs *regs) { diff -Nru a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c --- a/arch/sparc64/mm/init.c Wed Oct 8 12:24:56 2003 +++ b/arch/sparc64/mm/init.c Wed Oct 8 12:24:56 2003 @@ -1025,19 +1025,6 @@ } } -void __flush_cache_all(void) -{ - /* Cheetah should be fine here too. */ - if (tlb_type == spitfire) { - unsigned long va; - - flushw_all(); - for (va = 0; va < (PAGE_SIZE << 1); va += 32) - spitfire_put_icache_tag(va, 0x0); - __asm__ __volatile__("flush %g6"); - } -} - /* If not locked, zap it. */ void __flush_tlb_all(void) { diff -Nru a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S --- a/arch/sparc64/mm/ultra.S Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/mm/ultra.S Wed Oct 8 12:24:57 2003 @@ -721,20 +721,6 @@ stxa %g0, [%g2] ASI_IMMU_DEMAP retry - .globl xcall_flush_cache_all_spitfire -xcall_flush_cache_all_spitfire: - sethi %hi(16383), %g2 - or %g2, %lo(16383), %g2 - clr %g3 -1: stxa %g0, [%g3] ASI_IC_TAG - membar #Sync - add %g3, 32, %g3 - cmp %g3, %g2 - bleu,pt %xcc, 1b - nop - flush %g6 - retry - /* These just get rescheduled to PIL vectors. */ .globl xcall_call_function xcall_call_function: diff -Nru a/arch/sparc64/solaris/misc.c b/arch/sparc64/solaris/misc.c --- a/arch/sparc64/solaris/misc.c Wed Oct 8 12:24:57 2003 +++ b/arch/sparc64/solaris/misc.c Wed Oct 8 12:24:57 2003 @@ -402,7 +402,7 @@ Solaris setpgrp and setsid? */ ret = sys_setpgid(0, 0); if (ret) return ret; - current->tty = NULL; + current->signal->tty = NULL; return process_group(current); } case 2: /* getsid */ diff -Nru a/arch/um/kernel/checksum.c b/arch/um/kernel/checksum.c --- a/arch/um/kernel/checksum.c Wed Oct 8 12:24:57 2003 +++ b/arch/um/kernel/checksum.c Wed Oct 8 12:24:57 2003 @@ -1,5 +1,6 @@ #include "asm/uaccess.h" #include "linux/errno.h" +#include "linux/module.h" extern unsigned int arch_csum_partial(const char *buff, int len, int sum); @@ -7,6 +8,8 @@ { return(arch_csum_partial(buff, len, sum)); } + +EXPORT_SYMBOL(csum_partial); unsigned int csum_partial_copy_to(const char *src, char *dst, int len, int sum, int *err_ptr) diff -Nru a/arch/um/kernel/init_task.c b/arch/um/kernel/init_task.c --- a/arch/um/kernel/init_task.c Wed Oct 8 12:24:57 2003 +++ b/arch/um/kernel/init_task.c Wed Oct 8 12:24:57 2003 @@ -5,6 +5,7 @@ #include "linux/config.h" #include "linux/mm.h" +#include "linux/module.h" #include "linux/sched.h" #include "linux/init_task.h" #include "linux/version.h" @@ -18,6 +19,8 @@ static struct files_struct init_files = INIT_FILES; static struct signal_struct init_signals = INIT_SIGNALS(init_signals); +EXPORT_SYMBOL(init_mm); + /* * Initial task structure. * @@ -25,6 +28,8 @@ */ struct task_struct init_task = INIT_TASK(init_task); + +EXPORT_SYMBOL(init_task); /* * Initial thread structure. diff -Nru a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c --- a/arch/um/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/um/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -7,6 +7,7 @@ #include "linux/config.h" #include "linux/kernel.h" +#include "linux/module.h" #include "linux/smp.h" #include "linux/irq.h" #include "linux/kernel_stat.h" @@ -429,6 +430,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + int um_request_irq(unsigned int irq, int fd, int type, void (*handler)(int, void *, struct pt_regs *), unsigned long irqflags, const char * devname, @@ -557,6 +560,8 @@ } } +EXPORT_SYMBOL(free_irq); + /* These are initialized by sysctl_init, which is called from init/main.c */ static struct proc_dir_entry * root_irq_dir; static struct proc_dir_entry * irq_dir [NR_IRQS]; @@ -751,10 +756,14 @@ return(0); } +EXPORT_SYMBOL(probe_irq_on); + int probe_irq_off(unsigned long val) { return(0); } + +EXPORT_SYMBOL(probe_irq_off); static unsigned int startup_SIGIO_irq(unsigned int irq) { diff -Nru a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c --- a/arch/um/kernel/mem.c Wed Oct 8 12:24:56 2003 +++ b/arch/um/kernel/mem.c Wed Oct 8 12:24:56 2003 @@ -4,6 +4,7 @@ */ #include "linux/config.h" +#include "linux/module.h" #include "linux/types.h" #include "linux/mm.h" #include "linux/fs.h" @@ -128,6 +129,9 @@ /* Changed during early boot */ pte_t *kmap_pte; pgprot_t kmap_prot; + +EXPORT_SYMBOL(kmap_prot); +EXPORT_SYMBOL(kmap_pte); #define kmap_get_fixmap_pte(vaddr) \ pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) diff -Nru a/arch/um/kernel/process_kern.c b/arch/um/kernel/process_kern.c --- a/arch/um/kernel/process_kern.c Wed Oct 8 12:24:56 2003 +++ b/arch/um/kernel/process_kern.c Wed Oct 8 12:24:56 2003 @@ -278,10 +278,14 @@ panic("enable_hlt"); } +EXPORT_SYMBOL(enable_hlt); + void disable_hlt(void) { panic("disable_hlt"); } + +EXPORT_SYMBOL(disable_hlt); extern int signal_frame_size; diff -Nru a/arch/um/kernel/reboot.c b/arch/um/kernel/reboot.c --- a/arch/um/kernel/reboot.c Wed Oct 8 12:24:56 2003 +++ b/arch/um/kernel/reboot.c Wed Oct 8 12:24:56 2003 @@ -3,6 +3,7 @@ * Licensed under the GPL */ +#include "linux/module.h" #include "linux/sched.h" #include "user_util.h" #include "kern_util.h" @@ -46,6 +47,8 @@ CHOOSE_MODE(reboot_tt(), reboot_skas()); } +EXPORT_SYMBOL(machine_restart); + void machine_power_off(void) { do_uml_exitcalls(); @@ -53,10 +56,14 @@ CHOOSE_MODE(halt_tt(), halt_skas()); } +EXPORT_SYMBOL(machine_power_off); + void machine_halt(void) { machine_power_off(); } + +EXPORT_SYMBOL(machine_halt); /* * Overrides for Emacs so that we follow Linus's tabbing style. diff -Nru a/arch/um/kernel/smp.c b/arch/um/kernel/smp.c --- a/arch/um/kernel/smp.c Wed Oct 8 12:24:56 2003 +++ b/arch/um/kernel/smp.c Wed Oct 8 12:24:56 2003 @@ -8,6 +8,7 @@ #ifdef CONFIG_SMP #include "linux/sched.h" +#include "linux/module.h" #include "linux/threads.h" #include "linux/interrupt.h" #include "linux/err.h" @@ -23,6 +24,8 @@ /* CPU online map, set by smp_boot_cpus */ unsigned long cpu_online_map = cpumask_of_cpu(0); + +EXPORT_SYMBOL(cpu_online_map); /* Per CPU bogomips and other parameters * The only piece used here is the ipi pipe, which is set before SMP is diff -Nru a/arch/um/kernel/sysrq.c b/arch/um/kernel/sysrq.c --- a/arch/um/kernel/sysrq.c Wed Oct 8 12:24:56 2003 +++ b/arch/um/kernel/sysrq.c Wed Oct 8 12:24:56 2003 @@ -43,6 +43,8 @@ show_trace(&stack); } +EXPORT_SYMBOL(dump_stack); + void show_trace_task(struct task_struct *tsk) { unsigned long esp = PT_REGS_SP(&tsk->thread.regs); diff -Nru a/arch/um/kernel/time.c b/arch/um/kernel/time.c --- a/arch/um/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/arch/um/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -9,6 +9,7 @@ #include #include #include +#include "linux/module.h" #include "user_util.h" #include "kern_util.h" #include "user.h" @@ -94,6 +95,8 @@ time_unlock(flags); } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { struct timeval now; @@ -111,6 +114,8 @@ timersub(&tv_in, &now, &local_offset); time_unlock(flags); } + +EXPORT_SYMBOL(do_settimeofday); void idle_sleep(int secs) { diff -Nru a/arch/um/kernel/time_kern.c b/arch/um/kernel/time_kern.c --- a/arch/um/kernel/time_kern.c Wed Oct 8 12:24:57 2003 +++ b/arch/um/kernel/time_kern.c Wed Oct 8 12:24:57 2003 @@ -4,6 +4,7 @@ */ #include "linux/kernel.h" +#include "linux/module.h" #include "linux/unistd.h" #include "linux/stddef.h" #include "linux/spinlock.h" @@ -21,6 +22,8 @@ #include "mode.h" u64 jiffies_64; + +EXPORT_SYMBOL(jiffies_64); int hz(void) { diff -Nru a/arch/v850/Kconfig b/arch/v850/Kconfig --- a/arch/v850/Kconfig Wed Oct 8 12:24:56 2003 +++ b/arch/v850/Kconfig Wed Oct 8 12:24:56 2003 @@ -326,39 +326,29 @@ menu "Kernel hacking" -config FULLDEBUG - bool "Full Symbolic/Source Debugging support" - help - Enable debuging symbols on kernel build. +config DEBUG_KERNEL + bool "Kernel debugging" + +config DEBUG_INFO + bool "Compile the kernel with debug info" + depends on DEBUG_KERNEL + help + If you say Y here the resulting kernel image will include + debugging info resulting in a larger kernel image. + Say Y here only if you plan to use gdb to debug the kernel. + If you don't debug the kernel, you can say N. config MAGIC_SYSRQ bool "Magic SysRq key" + depends on DEBUG_KERNEL help Enables console device to interprent special characters as commands to dump state information. -config HIGHPROFILE - bool "Use fast second timer for profiling" - help - Use a fast secondary clock to produce profiling information. - -config DUMPTOFLASH - bool "Panic/Dump to FLASH" - depends on COLDFIRE - help - Dump any panic of trap output into a flash memory segment - for later analysis. - config NO_KERNEL_MSG bool "Suppress Kernel BUG Messages" help Do not output any debug BUG messages within the kernel. - -config BDM_DISABLE - bool "Disable BDM signals" - depends on (EXPERIMENTAL && COLDFIRE) - help - Disable the CPU's BDM signals. endmenu diff -Nru a/arch/v850/anna-rom.ld b/arch/v850/anna-rom.ld --- a/arch/v850/anna-rom.ld Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,16 +0,0 @@ -/* Linker script for the Midas labs Anna V850E2 evaluation board - (CONFIG_V850E2_ANNA), with kernel in ROM (CONFIG_ROM_KERNEL). */ - -MEMORY { - /* 8MB of flash ROM. */ - ROM : ORIGIN = 0, LENGTH = 0x00800000 - - /* 1MB of static RAM. This memory is mirrored 64 times. */ - SRAM : ORIGIN = 0x04000000, LENGTH = 0x00100000 - /* 64MB of DRAM. */ - SDRAM : ORIGIN = 0x08000000, LENGTH = 0x04000000 -} - -SECTIONS { - ROMK_SECTIONS(ROM, SRAM) -} diff -Nru a/arch/v850/anna.ld b/arch/v850/anna.ld --- a/arch/v850/anna.ld Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,20 +0,0 @@ -/* Linker script for the Midas labs Anna V850E2 evaluation board - (CONFIG_V850E2_ANNA). */ - -MEMORY { - /* 256KB of internal memory (followed by one mirror). */ - iMEM0 : ORIGIN = 0, LENGTH = 0x00040000 - /* 256KB of internal memory (followed by one mirror). */ - iMEM1 : ORIGIN = 0x00040000, LENGTH = 0x00040000 - - /* 1MB of static RAM. This memory is mirrored 64 times. */ - SRAM : ORIGIN = 0x04000000, LENGTH = 0x00100000 - /* 64MB of DRAM. */ - SDRAM : ORIGIN = 0x08000000, LENGTH = 0x04000000 -} - -SECTIONS { - .intv : { INTV_CONTENTS } > iMEM0 - .sram : { RAMK_KRAM_CONTENTS } > SRAM - .root : { ROOT_FS_CONTENTS } > SDRAM -} diff -Nru a/arch/v850/as85ep1-rom.ld b/arch/v850/as85ep1-rom.ld --- a/arch/v850/as85ep1-rom.ld Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,21 +0,0 @@ -/* Linker script for the NEC AS85EP1 V850E evaluation board - (CONFIG_V850E_AS85EP1), with kernel in ROM (CONFIG_ROM_KERNEL). */ - -MEMORY { - /* 4MB of flash ROM. */ - ROM : ORIGIN = 0, LENGTH = 0x00400000 - - /* 1MB of static RAM. */ - SRAM : ORIGIN = 0x00400000, LENGTH = 0x00100000 - - /* About 58MB of DRAM. This can actually be at one of two - positions, determined by jumper JP3; we have to use the first - position because the second is partially out of processor - instruction addressing range (though in the second position - there's actually 64MB available). */ - SDRAM : ORIGIN = 0x00600000, LENGTH = 0x039F8000 -} - -SECTIONS { - ROMK_SECTIONS(ROM, SRAM) -} diff -Nru a/arch/v850/as85ep1.ld b/arch/v850/as85ep1.ld --- a/arch/v850/as85ep1.ld Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,49 +0,0 @@ -/* Linker script for the NEC AS85EP1 V850E evaluation board - (CONFIG_V850E_AS85EP1). */ - -MEMORY { - /* 1MB of internal memory ($BFbB"L?Na(BRAM). */ - iMEM0 : ORIGIN = 0, LENGTH = 0x00100000 - - /* 1MB of static RAM. */ - SRAM : ORIGIN = 0x00400000, LENGTH = 0x00100000 - - /* About 58MB of DRAM. This can actually be at one of two - positions, determined by jump JP3; we have to use the first - position because the second is partially out of processor - instruction addressing range (though in the second position - there's actually 64MB available). */ - SDRAM : ORIGIN = 0x00600000, LENGTH = 0x039F8000 -} - -SECTIONS { - .resetv : { - __intv_start = . ; - *(.intv.reset) /* Reset vector */ - } > iMEM0 - - .sram : { - RAMK_KRAM_CONTENTS - - /* We stick most of the interrupt vectors here; they'll be - copied into the proper location by the early init code (we - can't put them directly in the right place because of - hardware bugs). The vectors shouldn't need to be - relocated, so we don't have to use `> ... AT> ...' to - split the load/vm addresses (and we can't because of - problems with the loader). */ - . = ALIGN (0x10) ; - __intv_copy_src_start = . ; - *(.intv.common) /* Vectors common to all v850e proc. */ - *(.intv.mach) /* Machine-specific int. vectors. */ - . = ALIGN (0x10) ; - __intv_copy_src_end = . ; - } > SRAM - - /* Where we end up putting the vectors. */ - __intv_copy_dst_start = 0x10 ; - __intv_copy_dst_end = __intv_copy_dst_start + (__intv_copy_src_end - __intv_copy_src_start) ; - __intv_end = __intv_copy_dst_end ; - - .root : { ROOT_FS_CONTENTS } > SDRAM -} diff -Nru a/arch/v850/fpga85e2c.ld b/arch/v850/fpga85e2c.ld --- a/arch/v850/fpga85e2c.ld Wed Oct 8 12:24:55 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,62 +0,0 @@ -/* Linker script for the FPGA implementation of the V850E2 NA85E2C cpu core - (CONFIG_V850E2_FPGA85E2C). */ - -MEMORY { - /* Reset vector. */ - RESET : ORIGIN = 0, LENGTH = 0x10 - /* Interrupt vectors. */ - INTV : ORIGIN = 0x10, LENGTH = 0x470 - /* The `window' in RAM were we're allowed to load stuff. */ - RAM_LOW : ORIGIN = 0x480, LENGTH = 0x0005FB80 - /* Some more ram above the window were we can put bss &c. */ - RAM_HIGH : ORIGIN = 0x00060000, LENGTH = 0x000A0000 - /* This is the area visible from the outside world (we can use - this only for uninitialized data). */ - VISIBLE : ORIGIN = 0x00200000, LENGTH = 0x00060000 -} - -SECTIONS { - .reset : { - __kram_start = . ; - __intv_start = . ; - *(.intv.reset) /* Reset vector */ - } > RESET - - .ram_low : { - __r0_ram = . ; /* Must be near address 0. */ - . = . + 32 ; - - TEXT_CONTENTS - DATA_CONTENTS - ROOT_FS_CONTENTS - RAMK_INIT_CONTENTS_NO_END - INITRAMFS_CONTENTS - } > RAM_LOW - - /* Where the interrupt vectors are initially loaded. */ - __intv_load_start = . ; - - .intv : { - *(.intv.common) /* Vectors common to all v850e proc. */ - *(.intv.mach) /* Machine-specific int. vectors. */ - __intv_end = . ; - } > INTV AT> RAM_LOW - - .ram_high : { - /* This is here so that when we free init memory the - load-time copy of the interrupt vectors and any empty - space at the end of the `RAM_LOW' area is freed too. */ - . = ALIGN (4096); - __init_end = . ; - - BSS_CONTENTS - __kram_end = . ; - BOOTMAP_CONTENTS - } > RAM_HIGH - - .visible : { - _memcons_output = . ; - . = . + 0x8000 ; - _memcons_output_end = . ; - } > VISIBLE -} diff -Nru a/arch/v850/kernel/anna-rom.ld b/arch/v850/kernel/anna-rom.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/anna-rom.ld Wed Oct 8 12:24:56 2003 @@ -0,0 +1,16 @@ +/* Linker script for the Midas labs Anna V850E2 evaluation board + (CONFIG_V850E2_ANNA), with kernel in ROM (CONFIG_ROM_KERNEL). */ + +MEMORY { + /* 8MB of flash ROM. */ + ROM : ORIGIN = 0, LENGTH = 0x00800000 + + /* 1MB of static RAM. This memory is mirrored 64 times. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE + /* 64MB of DRAM. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +SECTIONS { + ROMK_SECTIONS(ROM, SRAM) +} diff -Nru a/arch/v850/kernel/anna.c b/arch/v850/kernel/anna.c --- a/arch/v850/kernel/anna.c Wed Oct 8 12:24:56 2003 +++ b/arch/v850/kernel/anna.c Wed Oct 8 12:24:56 2003 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -131,6 +132,8 @@ asm ("jmp r0"); /* Jump to the reset vector. */ } +EXPORT_SYMBOL(machine_restart); + void machine_halt (void) { #ifdef CONFIG_RESET_GUARD @@ -142,10 +145,14 @@ asm ("halt; nop; nop; nop; nop; nop"); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off (void) { machine_halt (); } + +EXPORT_SYMBOL(machine_power_off); /* Called before configuring an on-chip UART. */ void anna_uart_pre_configure (unsigned chan, unsigned cflags, unsigned baud) diff -Nru a/arch/v850/kernel/anna.ld b/arch/v850/kernel/anna.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/anna.ld Wed Oct 8 12:24:56 2003 @@ -0,0 +1,20 @@ +/* Linker script for the Midas labs Anna V850E2 evaluation board + (CONFIG_V850E2_ANNA). */ + +MEMORY { + /* 256KB of internal memory (followed by one mirror). */ + iMEM0 : ORIGIN = 0, LENGTH = 0x00040000 + /* 256KB of internal memory (followed by one mirror). */ + iMEM1 : ORIGIN = 0x00040000, LENGTH = 0x00040000 + + /* 1MB of static RAM. This memory is mirrored 64 times. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE + /* 64MB of DRAM. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +SECTIONS { + .intv : { INTV_CONTENTS } > iMEM0 + .sram : { RAMK_KRAM_CONTENTS } > SRAM + .root : { ROOT_FS_CONTENTS } > SDRAM +} diff -Nru a/arch/v850/kernel/as85ep1-rom.ld b/arch/v850/kernel/as85ep1-rom.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/as85ep1-rom.ld Wed Oct 8 12:24:56 2003 @@ -0,0 +1,21 @@ +/* Linker script for the NEC AS85EP1 V850E evaluation board + (CONFIG_V850E_AS85EP1), with kernel in ROM (CONFIG_ROM_KERNEL). */ + +MEMORY { + /* 4MB of flash ROM. */ + ROM : ORIGIN = 0, LENGTH = 0x00400000 + + /* 1MB of static RAM. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE + + /* About 58MB of DRAM. This can actually be at one of two + positions, determined by jumper JP3; we have to use the first + position because the second is partially out of processor + instruction addressing range (though in the second position + there's actually 64MB available). */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +SECTIONS { + ROMK_SECTIONS(ROM, SRAM) +} diff -Nru a/arch/v850/kernel/as85ep1.c b/arch/v850/kernel/as85ep1.c --- a/arch/v850/kernel/as85ep1.c Wed Oct 8 12:24:57 2003 +++ b/arch/v850/kernel/as85ep1.c Wed Oct 8 12:24:57 2003 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -171,6 +172,8 @@ asm ("jmp r0"); /* Jump to the reset vector. */ } +EXPORT_SYMBOL(machine_restart); + void machine_halt (void) { #ifdef CONFIG_RESET_GUARD @@ -182,10 +185,14 @@ asm ("halt; nop; nop; nop; nop; nop"); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off (void) { machine_halt (); } + +EXPORT_SYMBOL(machine_power_off); /* Called before configuring an on-chip UART. */ void as85ep1_uart_pre_configure (unsigned chan, unsigned cflags, unsigned baud) diff -Nru a/arch/v850/kernel/as85ep1.ld b/arch/v850/kernel/as85ep1.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/as85ep1.ld Wed Oct 8 12:24:57 2003 @@ -0,0 +1,49 @@ +/* Linker script for the NEC AS85EP1 V850E evaluation board + (CONFIG_V850E_AS85EP1). */ + +MEMORY { + /* 1MB of internal memory (Æâ¢̿ÎáRAM). */ + iMEM0 : ORIGIN = 0, LENGTH = 0x00100000 + + /* 1MB of static RAM. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE + + /* About 58MB of DRAM. This can actually be at one of two + positions, determined by jump JP3; we have to use the first + position because the second is partially out of processor + instruction addressing range (though in the second position + there's actually 64MB available). */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +SECTIONS { + .resetv : { + __intv_start = . ; + *(.intv.reset) /* Reset vector */ + } > iMEM0 + + .sram : { + RAMK_KRAM_CONTENTS + + /* We stick most of the interrupt vectors here; they'll be + copied into the proper location by the early init code (we + can't put them directly in the right place because of + hardware bugs). The vectors shouldn't need to be + relocated, so we don't have to use `> ... AT> ...' to + split the load/vm addresses (and we can't because of + problems with the loader). */ + . = ALIGN (0x10) ; + __intv_copy_src_start = . ; + *(.intv.common) /* Vectors common to all v850e proc. */ + *(.intv.mach) /* Machine-specific int. vectors. */ + . = ALIGN (0x10) ; + __intv_copy_src_end = . ; + } > SRAM + + /* Where we end up putting the vectors. */ + __intv_copy_dst_start = 0x10 ; + __intv_copy_dst_end = __intv_copy_dst_start + (__intv_copy_src_end - __intv_copy_src_start) ; + __intv_end = __intv_copy_dst_end ; + + .root : { ROOT_FS_CONTENTS } > SDRAM +} diff -Nru a/arch/v850/kernel/bug.c b/arch/v850/kernel/bug.c --- a/arch/v850/kernel/bug.c Wed Oct 8 12:24:57 2003 +++ b/arch/v850/kernel/bug.c Wed Oct 8 12:24:57 2003 @@ -137,3 +137,5 @@ { show_stack (0, 0); } + +EXPORT_SYMBOL(dump_stack); diff -Nru a/arch/v850/kernel/fpga85e2c.c b/arch/v850/kernel/fpga85e2c.c --- a/arch/v850/kernel/fpga85e2c.c Wed Oct 8 12:24:57 2003 +++ b/arch/v850/kernel/fpga85e2c.c Wed Oct 8 12:24:57 2003 @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -121,15 +122,21 @@ } } +EXPORT_SYMBOL(machine_halt); + void machine_restart (char *__unused) { machine_halt (); } +EXPORT_SYMBOL(machine_restart); + void machine_power_off (void) { machine_halt (); } + +EXPORT_SYMBOL(machine_power_off); /* Interrupts */ diff -Nru a/arch/v850/kernel/fpga85e2c.ld b/arch/v850/kernel/fpga85e2c.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/fpga85e2c.ld Wed Oct 8 12:24:55 2003 @@ -0,0 +1,62 @@ +/* Linker script for the FPGA implementation of the V850E2 NA85E2C cpu core + (CONFIG_V850E2_FPGA85E2C). */ + +MEMORY { + /* Reset vector. */ + RESET : ORIGIN = 0, LENGTH = 0x10 + /* Interrupt vectors. */ + INTV : ORIGIN = 0x10, LENGTH = 0x470 + /* The `window' in RAM were we're allowed to load stuff. */ + RAM_LOW : ORIGIN = 0x480, LENGTH = 0x0005FB80 + /* Some more ram above the window were we can put bss &c. */ + RAM_HIGH : ORIGIN = 0x00060000, LENGTH = 0x000A0000 + /* This is the area visible from the outside world (we can use + this only for uninitialized data). */ + VISIBLE : ORIGIN = 0x00200000, LENGTH = 0x00060000 +} + +SECTIONS { + .reset : { + __kram_start = . ; + __intv_start = . ; + *(.intv.reset) /* Reset vector */ + } > RESET + + .ram_low : { + __r0_ram = . ; /* Must be near address 0. */ + . = . + 32 ; + + TEXT_CONTENTS + DATA_CONTENTS + ROOT_FS_CONTENTS + RAMK_INIT_CONTENTS_NO_END + INITRAMFS_CONTENTS + } > RAM_LOW + + /* Where the interrupt vectors are initially loaded. */ + __intv_load_start = . ; + + .intv : { + *(.intv.common) /* Vectors common to all v850e proc. */ + *(.intv.mach) /* Machine-specific int. vectors. */ + __intv_end = . ; + } > INTV AT> RAM_LOW + + .ram_high : { + /* This is here so that when we free init memory the + load-time copy of the interrupt vectors and any empty + space at the end of the `RAM_LOW' area is freed too. */ + . = ALIGN (4096); + __init_end = . ; + + BSS_CONTENTS + __kram_end = . ; + BOOTMAP_CONTENTS + } > RAM_HIGH + + .visible : { + _memcons_output = . ; + . = . + 0x8000 ; + _memcons_output_end = . ; + } > VISIBLE +} diff -Nru a/arch/v850/kernel/init_task.c b/arch/v850/kernel/init_task.c --- a/arch/v850/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/v850/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -10,6 +10,7 @@ */ #include +#include #include #include #include @@ -24,12 +25,16 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM (init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial task structure. * * All other task structs will be allocated on slabs in fork.c */ struct task_struct init_task = INIT_TASK (init_task); + +EXPORT_SYMBOL(init_task); /* * Initial thread structure. diff -Nru a/arch/v850/kernel/irq.c b/arch/v850/kernel/irq.c --- a/arch/v850/kernel/irq.c Wed Oct 8 12:24:57 2003 +++ b/arch/v850/kernel/irq.c Wed Oct 8 12:24:57 2003 @@ -14,6 +14,7 @@ */ #include +#include #include #include #include @@ -400,6 +401,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + /** * free_irq - free an interrupt * @irq: Interrupt line to free @@ -456,6 +459,8 @@ } } +EXPORT_SYMBOL(free_irq); + /* * IRQ autodetection code.. * @@ -549,6 +554,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + /* * Return a mask of triggered interrupts (this * can handle only legacy ISA interrupts). @@ -646,6 +653,8 @@ irq_found = -irq_found; return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); /* this was setup_x86_irq but it seems pretty generic */ int setup_irq(unsigned int irq, struct irqaction * new) diff -Nru a/arch/v850/kernel/rte_cb.c b/arch/v850/kernel/rte_cb.c --- a/arch/v850/kernel/rte_cb.c Wed Oct 8 12:24:55 2003 +++ b/arch/v850/kernel/rte_cb.c Wed Oct 8 12:24:55 2003 @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -66,6 +67,8 @@ asm ("jmp r0"); /* Jump to the reset vector. */ } +EXPORT_SYMBOL(machine_restart); + /* This says `HALt.' in LEDese. */ static unsigned char halt_leds_msg[] = { 0x76, 0x77, 0x38, 0xF8 }; @@ -86,10 +89,14 @@ asm ("halt; nop; nop; nop; nop; nop"); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off (void) { machine_halt (); } + +EXPORT_SYMBOL(machine_power_off); /* Animated LED display for timer tick. */ diff -Nru a/arch/v850/kernel/rte_ma1_cb-rom.ld b/arch/v850/kernel/rte_ma1_cb-rom.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/rte_ma1_cb-rom.ld Wed Oct 8 12:24:57 2003 @@ -0,0 +1,14 @@ +/* Linker script for the Midas labs RTE-V850E/MA1-CB evaluation board + (CONFIG_RTE_CB_MA1), with kernel in ROM. */ + +MEMORY { + ROM : ORIGIN = 0x00000000, LENGTH = 0x00100000 + /* 1MB of SRAM. This memory is mirrored 4 times. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE + /* 32MB of SDRAM. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +SECTIONS { + ROMK_SECTIONS(ROM, SRAM) +} diff -Nru a/arch/v850/kernel/rte_ma1_cb.ld b/arch/v850/kernel/rte_ma1_cb.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/rte_ma1_cb.ld Wed Oct 8 12:24:55 2003 @@ -0,0 +1,57 @@ +/* Linker script for the Midas labs RTE-V850E/MA1-CB evaluation board + (CONFIG_RTE_CB_MA1), with kernel in SDRAM, under Multi debugger. */ + +MEMORY { + /* 1MB of SRAM; we can't use the last 32KB, because it's used by + the monitor scratch-RAM. This memory is mirrored 4 times. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = (SRAM_SIZE - MON_SCRATCH_SIZE) + /* Monitor scratch RAM; only the interrupt vectors should go here. */ + MRAM : ORIGIN = MON_SCRATCH_ADDR, LENGTH = MON_SCRATCH_SIZE + /* 32MB of SDRAM. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +#ifdef CONFIG_RTE_CB_MA1_KSRAM +# define KRAM SRAM +#else +# define KRAM SDRAM +#endif + +SECTIONS { + /* We can't use RAMK_KRAM_CONTENTS because that puts the whole + kernel in a single ELF segment, and the Multi debugger (which + we use to load the kernel) appears to have bizarre problems + dealing with it. */ + + .text : { + __kram_start = . ; + TEXT_CONTENTS + } > KRAM + + .data : { + DATA_CONTENTS + BSS_CONTENTS + RAMK_INIT_CONTENTS + __kram_end = . ; + BOOTMAP_CONTENTS + + /* The address at which the interrupt vectors are initially + loaded by the loader. We can't load the interrupt vectors + directly into their target location, because the monitor + ROM for the GHS Multi debugger barfs if we try. + Unfortunately, Multi also doesn't deal correctly with ELF + sections where the LMA and VMA differ (it just ignores the + LMA), so we can't use that feature to work around the + problem! What we do instead is just put the interrupt + vectors into a normal section, and have the + `mach_early_init' function for Midas boards do the + necessary copying and relocation at runtime (this section + basically only contains `jr' instructions, so it's not + that hard). */ + . = ALIGN (0x10) ; + __intv_load_start = . ; + INTV_CONTENTS + } > KRAM + + .root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM +} diff -Nru a/arch/v850/kernel/rte_me2_cb.ld b/arch/v850/kernel/rte_me2_cb.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/rte_me2_cb.ld Wed Oct 8 12:24:56 2003 @@ -0,0 +1,30 @@ +/* Linker script for the Midas labs RTE-V850E/ME2-CB evaluation board + (CONFIG_RTE_CB_ME2), with kernel in SDRAM. */ + +MEMORY { + /* 128Kbyte of IRAM */ + IRAM : ORIGIN = 0x00000000, LENGTH = 0x00020000 + + /* 32MB of SDRAM. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +#define KRAM SDRAM + +SECTIONS { + .text : { + __kram_start = . ; + TEXT_CONTENTS + INTV_CONTENTS /* copy to iRAM (0x0-0x620) */ + } > KRAM + + .data : { + DATA_CONTENTS + BSS_CONTENTS + RAMK_INIT_CONTENTS + __kram_end = . ; + BOOTMAP_CONTENTS + } > KRAM + + .root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM +} diff -Nru a/arch/v850/kernel/rte_nb85e_cb-multi.ld b/arch/v850/kernel/rte_nb85e_cb-multi.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/rte_nb85e_cb-multi.ld Wed Oct 8 12:24:57 2003 @@ -0,0 +1,57 @@ +/* Linker script for the Midas labs RTE-NB85E-CB evaluation board + (CONFIG_RTE_CB_NB85E), with the Multi debugger ROM monitor . */ + +MEMORY { + /* 1MB of SRAM; we can't use the last 96KB, because it's used by + the monitor scratch-RAM. This memory is mirrored 4 times. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = (SRAM_SIZE - MON_SCRATCH_SIZE) + /* Monitor scratch RAM; only the interrupt vectors should go here. */ + MRAM : ORIGIN = MON_SCRATCH_ADDR, LENGTH = MON_SCRATCH_SIZE + /* 16MB of SDRAM. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +#ifdef CONFIG_RTE_CB_NB85E_KSRAM +# define KRAM SRAM +#else +# define KRAM SDRAM +#endif + +SECTIONS { + /* We can't use RAMK_KRAM_CONTENTS because that puts the whole + kernel in a single ELF segment, and the Multi debugger (which + we use to load the kernel) appears to have bizarre problems + dealing with it. */ + + .text : { + __kram_start = . ; + TEXT_CONTENTS + } > KRAM + + .data : { + DATA_CONTENTS + BSS_CONTENTS + RAMK_INIT_CONTENTS + __kram_end = . ; + BOOTMAP_CONTENTS + + /* The address at which the interrupt vectors are initially + loaded by the loader. We can't load the interrupt vectors + directly into their target location, because the monitor + ROM for the GHS Multi debugger barfs if we try. + Unfortunately, Multi also doesn't deal correctly with ELF + sections where the LMA and VMA differ (it just ignores the + LMA), so we can't use that feature to work around the + problem! What we do instead is just put the interrupt + vectors into a normal section, and have the + `mach_early_init' function for Midas boards do the + necessary copying and relocation at runtime (this section + basically only contains `jr' instructions, so it's not + that hard). */ + . = ALIGN (0x10) ; + __intv_load_start = . ; + INTV_CONTENTS + } > KRAM + + .root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM +} diff -Nru a/arch/v850/kernel/rte_nb85e_cb.ld b/arch/v850/kernel/rte_nb85e_cb.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/rte_nb85e_cb.ld Wed Oct 8 12:24:57 2003 @@ -0,0 +1,22 @@ +/* Linker script for the Midas labs RTE-NB85E-CB evaluation board + (CONFIG_RTE_CB_NB85E). */ + +MEMORY { + LOW : ORIGIN = 0x0, LENGTH = 0x00100000 + /* 1MB of SRAM This memory is mirrored 4 times. */ + SRAM : ORIGIN = SRAM_ADDR, LENGTH = SRAM_SIZE + /* 16MB of SDRAM. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +#ifdef CONFIG_RTE_CB_NB85E_KSRAM +# define KRAM SRAM +#else +# define KRAM SDRAM +#endif + +SECTIONS { + .intv : { INTV_CONTENTS } > LOW + .sram : { RAMK_KRAM_CONTENTS } > KRAM + .root : { ROOT_FS_CONTENTS } > SDRAM +} diff -Nru a/arch/v850/kernel/sim.c b/arch/v850/kernel/sim.c --- a/arch/v850/kernel/sim.c Wed Oct 8 12:24:57 2003 +++ b/arch/v850/kernel/sim.c Wed Oct 8 12:24:57 2003 @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -103,17 +104,23 @@ V850_SIM_SYSCALL (exit, 0); } +EXPORT_SYMBOL(machine_restart); + void machine_halt (void) { V850_SIM_SYSCALL (write, 1, "HALT\n", 5); V850_SIM_SYSCALL (exit, 0); } +EXPORT_SYMBOL(machine_halt); + void machine_power_off (void) { V850_SIM_SYSCALL (write, 1, "POWER OFF\n", 10); V850_SIM_SYSCALL (exit, 0); } + +EXPORT_SYMBOL(machine_power_off); /* Load data from a file called NAME into ram. The address and length diff -Nru a/arch/v850/kernel/sim.ld b/arch/v850/kernel/sim.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/sim.ld Wed Oct 8 12:24:56 2003 @@ -0,0 +1,13 @@ +/* Linker script for the gdb v850e simulator (CONFIG_V850E_SIM). */ + +MEMORY { + /* Interrupt vectors. */ + INTV : ORIGIN = 0x0, LENGTH = 0xe0 + /* Main RAM. */ + RAM : ORIGIN = RAM_ADDR, LENGTH = RAM_SIZE +} + +SECTIONS { + .intv : { INTV_CONTENTS } > INTV + .ram : { RAMK_KRAM_CONTENTS } > RAM +} diff -Nru a/arch/v850/kernel/sim85e2.c b/arch/v850/kernel/sim85e2.c --- a/arch/v850/kernel/sim85e2.c Wed Oct 8 12:24:56 2003 +++ b/arch/v850/kernel/sim85e2.c Wed Oct 8 12:24:56 2003 @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -200,12 +201,18 @@ for (;;) {} } +EXPORT_SYMBOL(machine_halt); + void machine_restart (char *__unused) { machine_halt (); } +EXPORT_SYMBOL(machine_restart); + void machine_power_off (void) { machine_halt (); } + +EXPORT_SYMBOL(machine_power_off); diff -Nru a/arch/v850/kernel/sim85e2.ld b/arch/v850/kernel/sim85e2.ld --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/v850/kernel/sim85e2.ld Wed Oct 8 12:24:57 2003 @@ -0,0 +1,36 @@ +/* Linker script for the sim85e2c simulator, which is a verilog simulation of + the V850E2 NA85E2C cpu core (CONFIG_V850E2_SIM85E2C). */ + +MEMORY { + /* 1MB of `instruction RAM', starting at 0. + Instruction fetches are much faster from IRAM than from DRAM. */ + IRAM : ORIGIN = IRAM_ADDR, LENGTH = IRAM_SIZE + + /* 1MB of `data RAM', below and contiguous with the I/O space. + Data fetches are much faster from DRAM than from IRAM. */ + DRAM : ORIGIN = DRAM_ADDR, LENGTH = DRAM_SIZE + + /* `external ram' (CS1 area), comes after IRAM. */ + ERAM : ORIGIN = ERAM_ADDR, LENGTH = ERAM_SIZE + + /* Dynamic RAM; uses memory controller. */ + SDRAM : ORIGIN = SDRAM_ADDR, LENGTH = SDRAM_SIZE +} + +SECTIONS { + .iram : { + INTV_CONTENTS + *arch/v850/kernel/head.o + *(.early.text) + } > IRAM + .dram : { + _memcons_output = . ; + . = . + 0x8000 ; + _memcons_output_end = . ; + } > DRAM + .sdram : { + /* We stick console output into a buffer here. */ + RAMK_KRAM_CONTENTS + ROOT_FS_CONTENTS + } > SDRAM +} diff -Nru a/arch/v850/kernel/time.c b/arch/v850/kernel/time.c --- a/arch/v850/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/v850/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -13,6 +13,7 @@ #include /* CONFIG_HEARTBEAT */ #include #include +#include #include #include #include @@ -27,8 +28,18 @@ u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + #define TICK_SIZE (tick_nsec / 1000) +/* + * Scheduler clock - returns current time in nanosec units. + */ +unsigned long long sched_clock(void) +{ + return (unsigned long long)jiffies * (1000000000 / HZ); +} + static inline void do_profile (unsigned long pc) { if (prof_buffer && current->pid) { @@ -149,6 +160,8 @@ tv->tv_usec = usec; } +EXPORT_SYMBOL(do_gettimeofday); + int do_settimeofday(struct timespec *tv) { if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) @@ -182,6 +195,8 @@ write_sequnlock_irq (&xtime_lock); return 0; } + +EXPORT_SYMBOL(do_settimeofday); static int timer_dev_id; static struct irqaction timer_irqaction = { diff -Nru a/arch/v850/kernel/vmlinux.lds.S b/arch/v850/kernel/vmlinux.lds.S --- a/arch/v850/kernel/vmlinux.lds.S Wed Oct 8 12:24:57 2003 +++ b/arch/v850/kernel/vmlinux.lds.S Wed Oct 8 12:24:57 2003 @@ -14,6 +14,9 @@ #include #include +/* For most platforms, this will define useful things like RAM addr/size. */ +#include + /* The following macros contain the usual definitions for various data areas. The prefix `RAMK_' is used to indicate macros suitable for kernels loaded diff -Nru a/arch/v850/lib/checksum.c b/arch/v850/lib/checksum.c --- a/arch/v850/lib/checksum.c Wed Oct 8 12:24:57 2003 +++ b/arch/v850/lib/checksum.c Wed Oct 8 12:24:57 2003 @@ -17,6 +17,7 @@ * $Id: checksum.c,v 1.1 2002/09/28 14:58:40 gerg Exp $ */ #include +#include #include #include #include @@ -114,6 +115,8 @@ result += 1; return result; } + +EXPORT_SYMBOL(csum_partial); /* * copy while checksumming, otherwise like csum_partial diff -Nru a/arch/v850/rte_ma1_cb-rom.ld b/arch/v850/rte_ma1_cb-rom.ld --- a/arch/v850/rte_ma1_cb-rom.ld Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,14 +0,0 @@ -/* Linker script for the Midas labs RTE-V850E/MA1-CB evaluation board - (CONFIG_RTE_CB_MA1), with kernel in ROM. */ - -MEMORY { - ROM : ORIGIN = 0x00000000, LENGTH = 0x00100000 - /* 1MB of SRAM. This memory is mirrored 4 times. */ - SRAM : ORIGIN = 0x00400000, LENGTH = 0x00100000 - /* 32MB of SDRAM. */ - SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000 -} - -SECTIONS { - ROMK_SECTIONS(ROM, SRAM) -} diff -Nru a/arch/v850/rte_ma1_cb.ld b/arch/v850/rte_ma1_cb.ld --- a/arch/v850/rte_ma1_cb.ld Wed Oct 8 12:24:55 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,57 +0,0 @@ -/* Linker script for the Midas labs RTE-V850E/MA1-CB evaluation board - (CONFIG_RTE_CB_MA1), with kernel in SDRAM, under Multi debugger. */ - -MEMORY { - /* 1MB of SRAM; we can't use the last 32KB, because it's used by - the monitor scratch-RAM. This memory is mirrored 4 times. */ - SRAM : ORIGIN = 0x00400000, LENGTH = 0x000F8000 - /* Monitor scratch RAM; only the interrupt vectors should go here. */ - MRAM : ORIGIN = 0x004F8000, LENGTH = 0x00008000 - /* 32MB of SDRAM. */ - SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000 -} - -#ifdef CONFIG_RTE_CB_MA1_KSRAM -# define KRAM SRAM -#else -# define KRAM SDRAM -#endif - -SECTIONS { - /* We can't use RAMK_KRAM_CONTENTS because that puts the whole - kernel in a single ELF segment, and the Multi debugger (which - we use to load the kernel) appears to have bizarre problems - dealing with it. */ - - .text : { - __kram_start = . ; - TEXT_CONTENTS - } > KRAM - - .data : { - DATA_CONTENTS - BSS_CONTENTS - RAMK_INIT_CONTENTS - __kram_end = . ; - BOOTMAP_CONTENTS - - /* The address at which the interrupt vectors are initially - loaded by the loader. We can't load the interrupt vectors - directly into their target location, because the monitor - ROM for the GHS Multi debugger barfs if we try. - Unfortunately, Multi also doesn't deal correctly with ELF - sections where the LMA and VMA differ (it just ignores the - LMA), so we can't use that feature to work around the - problem! What we do instead is just put the interrupt - vectors into a normal section, and have the - `mach_early_init' function for Midas boards do the - necessary copying and relocation at runtime (this section - basically only contains `jr' instructions, so it's not - that hard). */ - . = ALIGN (0x10) ; - __intv_load_start = . ; - INTV_CONTENTS - } > KRAM - - .root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM -} diff -Nru a/arch/v850/rte_me2_cb.ld b/arch/v850/rte_me2_cb.ld --- a/arch/v850/rte_me2_cb.ld Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,30 +0,0 @@ -/* Linker script for the Midas labs RTE-V850E/ME2-CB evaluation board - (CONFIG_RTE_CB_ME2), with kernel in SDRAM. */ - -MEMORY { - /* 128Kbyte of IRAM */ - IRAM : ORIGIN = 0x00000000, LENGTH = 0x00020000 - - /* 32MB of SDRAM. */ - SDRAM : ORIGIN = 0x00800000, LENGTH = 0x02000000 -} - -#define KRAM SDRAM - -SECTIONS { - .text : { - __kram_start = . ; - TEXT_CONTENTS - INTV_CONTENTS /* copy to iRAM (0x0-0x620) */ - } > KRAM - - .data : { - DATA_CONTENTS - BSS_CONTENTS - RAMK_INIT_CONTENTS - __kram_end = . ; - BOOTMAP_CONTENTS - } > KRAM - - .root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM -} diff -Nru a/arch/v850/rte_nb85e_cb-multi.ld b/arch/v850/rte_nb85e_cb-multi.ld --- a/arch/v850/rte_nb85e_cb-multi.ld Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,57 +0,0 @@ -/* Linker script for the Midas labs RTE-NB85E-CB evaluation board - (CONFIG_RTE_CB_NB85E), with the Multi debugger ROM monitor . */ - -MEMORY { - /* 1MB of SRAM; we can't use the last 96KB, because it's used by - the monitor scratch-RAM. This memory is mirrored 4 times. */ - SRAM : ORIGIN = 0x03C00000, LENGTH = 0x000E8000 - /* Monitor scratch RAM; only the interrupt vectors should go here. */ - MRAM : ORIGIN = 0x03CE8000, LENGTH = 0x00018000 - /* 16MB of SDRAM. */ - SDRAM : ORIGIN = 0x01000000, LENGTH = 0x01000000 -} - -#ifdef CONFIG_RTE_CB_NB85E_KSRAM -# define KRAM SRAM -#else -# define KRAM SDRAM -#endif - -SECTIONS { - /* We can't use RAMK_KRAM_CONTENTS because that puts the whole - kernel in a single ELF segment, and the Multi debugger (which - we use to load the kernel) appears to have bizarre problems - dealing with it. */ - - .text : { - __kram_start = . ; - TEXT_CONTENTS - } > KRAM - - .data : { - DATA_CONTENTS - BSS_CONTENTS - RAMK_INIT_CONTENTS - __kram_end = . ; - BOOTMAP_CONTENTS - - /* The address at which the interrupt vectors are initially - loaded by the loader. We can't load the interrupt vectors - directly into their target location, because the monitor - ROM for the GHS Multi debugger barfs if we try. - Unfortunately, Multi also doesn't deal correctly with ELF - sections where the LMA and VMA differ (it just ignores the - LMA), so we can't use that feature to work around the - problem! What we do instead is just put the interrupt - vectors into a normal section, and have the - `mach_early_init' function for Midas boards do the - necessary copying and relocation at runtime (this section - basically only contains `jr' instructions, so it's not - that hard). */ - . = ALIGN (0x10) ; - __intv_load_start = . ; - INTV_CONTENTS - } > KRAM - - .root ALIGN (4096) : { ROOT_FS_CONTENTS } > SDRAM -} diff -Nru a/arch/v850/rte_nb85e_cb.ld b/arch/v850/rte_nb85e_cb.ld --- a/arch/v850/rte_nb85e_cb.ld Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,25 +0,0 @@ -/* Linker script for the Midas labs RTE-NB85E-CB evaluation board - (CONFIG_RTE_CB_NB85E). */ - -MEMORY { - LOW : ORIGIN = 0x0, LENGTH = 0x00100000 - /* 1MB of SRAM; we can't use the last 96KB, because it's used by - the monitor scratch-RAM. This memory is mirrored 4 times. */ - SRAM : ORIGIN = 0x03C00000, LENGTH = 0x000E8000 - /* Monitor scratch RAM; only the interrupt vectors should go here. */ - MRAM : ORIGIN = 0x03CE8000, LENGTH = 0x00018000 - /* 16MB of SDRAM. */ - SDRAM : ORIGIN = 0x01000000, LENGTH = 0x01000000 -} - -#ifdef CONFIG_RTE_CB_NB85E_KSRAM -# define KRAM SRAM -#else -# define KRAM SDRAM -#endif - -SECTIONS { - .intv : { INTV_CONTENTS } > LOW - .sram : { RAMK_KRAM_CONTENTS } > KRAM - .root : { ROOT_FS_CONTENTS } > SDRAM -} diff -Nru a/arch/v850/sim.ld b/arch/v850/sim.ld --- a/arch/v850/sim.ld Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,14 +0,0 @@ -/* Linker script for the gdb v850e simulator (CONFIG_V850E_SIM). */ - -MEMORY { - /* Interrupt vectors. */ - INTV : ORIGIN = 0x0, LENGTH = 0xe0 - /* 16MB of RAM. - This must match RAM_ADDR and RAM_SIZE in include/asm-v850/sim.h */ - RAM : ORIGIN = 0x8F000000, LENGTH = 0x01000000 -} - -SECTIONS { - .intv : { INTV_CONTENTS } > INTV - .ram : { RAMK_KRAM_CONTENTS } > RAM -} diff -Nru a/arch/v850/sim85e2.ld b/arch/v850/sim85e2.ld --- a/arch/v850/sim85e2.ld Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,44 +0,0 @@ -/* Linker script for the sim85e2c simulator, which is a verilog simulation of - the V850E2 NA85E2C cpu core (CONFIG_V850E2_SIM85E2C). */ - -MEMORY { - /* 1MB of `instruction RAM', starting at 0. - Instruction fetches are much faster from IRAM than from DRAM. - This should match IRAM_ADDR in "include/asm-v580/sim85e2c.h". */ - IRAM : ORIGIN = 0x00000000, LENGTH = 0x00100000 - - /* 1MB of `data RAM', below and contiguous with the I/O space. - Data fetches are much faster from DRAM than from IRAM. - This should match DRAM_ADDR in "include/asm-v580/sim85e2c.h". */ - DRAM : ORIGIN = 0xfff00000, LENGTH = 0x000ff000 - /* We have to load DRAM at a mirror-address of 0x1ff00000, - because the simulator's preprocessing script isn't smart - enough to deal with the above LMA. */ - DRAM_LOAD : ORIGIN = 0x1ff00000, LENGTH = 0x000ff000 - - /* `external ram' (CS1 area), comes after IRAM. - This should match ERAM_ADDR in "include/asm-v580/sim85e2c.h". */ - ERAM : ORIGIN = 0x00100000, LENGTH = 0x07f00000 - - /* Dynamic RAM; uses memory controller. */ - /* SDRAM : ORIGIN = 0x10000000, LENGTH = 0x01000000 */ - SDRAM : ORIGIN = 0x10000000, LENGTH = 0x00200000/*use 2MB*/ -} - -SECTIONS { - .iram : { - INTV_CONTENTS - *arch/v850/kernel/head.o - *(.early.text) - } > IRAM - .dram : { - _memcons_output = . ; - . = . + 0x8000 ; - _memcons_output_end = . ; - } > DRAM - .sdram : { - /* We stick console output into a buffer here. */ - RAMK_KRAM_CONTENTS - ROOT_FS_CONTENTS - } > SDRAM -} diff -Nru a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig --- a/arch/x86_64/Kconfig Wed Oct 8 12:24:57 2003 +++ b/arch/x86_64/Kconfig Wed Oct 8 12:24:57 2003 @@ -280,11 +280,7 @@ to the requisite support below. Power Management is most important for battery powered laptop - computers; if you have a laptop, check out the Linux Laptop home - page on the WWW at - and the - Battery Powered Linux mini-HOWTO, available from - . + computers. Note that, even if you say N here, Linux on the x86 architecture will issue the hlt instruction if nothing is to be done, thereby @@ -322,8 +318,9 @@ source "drivers/acpi/Kconfig" -endmenu +source "arch/x86_64/kernel/cpufreq/Kconfig" +endmenu menu "Bus options (PCI etc.)" diff -Nru a/arch/x86_64/ia32/ia32_binfmt.c b/arch/x86_64/ia32/ia32_binfmt.c --- a/arch/x86_64/ia32/ia32_binfmt.c Wed Oct 8 12:24:55 2003 +++ b/arch/x86_64/ia32/ia32_binfmt.c Wed Oct 8 12:24:55 2003 @@ -82,9 +82,12 @@ int i; \ Elf32_Off ofs = 0; \ for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \ - struct elf_phdr phdr = vsyscall_phdrs[i]; \ + struct elf32_phdr phdr = vsyscall_phdrs[i]; \ if (phdr.p_type == PT_LOAD) { \ + BUG_ON(ofs != 0); \ ofs = phdr.p_offset = offset; \ + phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); \ + phdr.p_filesz = phdr.p_memsz; \ offset += phdr.p_filesz; \ } \ else \ @@ -102,7 +105,7 @@ for (i = 0; i < VSYSCALL32_EHDR->e_phnum; ++i) { \ if (vsyscall_phdrs[i].p_type == PT_LOAD) \ DUMP_WRITE((void *) (u64) vsyscall_phdrs[i].p_vaddr, \ - vsyscall_phdrs[i].p_filesz); \ + PAGE_ALIGN(vsyscall_phdrs[i].p_memsz)); \ } \ } while (0) diff -Nru a/arch/x86_64/ia32/ia32_ioctl.c b/arch/x86_64/ia32/ia32_ioctl.c --- a/arch/x86_64/ia32/ia32_ioctl.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/ia32/ia32_ioctl.c Wed Oct 8 12:24:56 2003 @@ -38,87 +38,6 @@ return put_user(new_encode_dev(tty_devnum(real_tty)), ptr); } - -struct raw32_config_request -{ - compat_int_t raw_minor; - __u64 block_major; - __u64 block_minor; -} __attribute__((packed)); - -static int raw_ioctl(unsigned fd, unsigned cmd, void *ptr) -{ - int ret; - switch (cmd) { - case RAW_SETBIND: - case RAW_GETBIND: { - struct raw_config_request req; - struct raw32_config_request *user_req = ptr; - mm_segment_t oldfs = get_fs(); - - if (get_user(req.raw_minor, &user_req->raw_minor) || - get_user(req.block_major, &user_req->block_major) || - get_user(req.block_minor, &user_req->block_minor)) - return -EFAULT; - set_fs(KERNEL_DS); - ret = sys_ioctl(fd,cmd,(unsigned long)&req); - set_fs(oldfs); - break; - } - default: - ret = sys_ioctl(fd,cmd,(unsigned long)ptr); - break; - } - return ret; -} - - -#define REISERFS_IOC_UNPACK32 _IOW(0xCD,1,int) - -static int reiserfs_ioctl32(unsigned fd, unsigned cmd, unsigned long ptr) -{ - if (cmd == REISERFS_IOC_UNPACK32) - cmd = REISERFS_IOC_UNPACK; - return sys_ioctl(fd,cmd,ptr); -} - -struct dirent32 { - compat_int_t d_ino; - compat_off_t d_off; - unsigned short d_reclen; - char d_name[256]; /* We must not include limits.h! */ -}; - -#define VFAT_IOCTL_READDIR_BOTH32 _IOR('r', 1, struct dirent32 [2]) -#define VFAT_IOCTL_READDIR_SHORT32 _IOR('r', 2, struct dirent32 [2]) - -static int put_dirent32(struct dirent *src, struct dirent32 *dst) -{ - int ret; - ret = put_user(src->d_ino, &dst->d_ino); - ret |= __put_user(src->d_off, &dst->d_off); - ret |= __put_user(src->d_reclen, &dst->d_reclen); - if (__copy_to_user(&dst->d_name, src->d_name, src->d_reclen)) - ret |= -EFAULT; - return ret; -} - -static int vfat_ioctl32(unsigned fd, unsigned cmd, void *ptr) -{ - int ret; - mm_segment_t oldfs = get_fs(); - struct dirent d[2]; - - set_fs(KERNEL_DS); - ret = sys_ioctl(fd,cmd,(unsigned long)&d); - set_fs(oldfs); - if (!ret) { - ret |= put_dirent32(&d[0], (struct dirent32 *)ptr); - ret |= put_dirent32(&d[1], ((struct dirent32 *)ptr) + 1); - } - return ret; -} - #define RTC_IRQP_READ32 _IOR('p', 0x0b, unsigned int) /* Read IRQ rate */ #define RTC_IRQP_SET32 _IOW('p', 0x0c, unsigned int) /* Set IRQ rate */ #define RTC_EPOCH_READ32 _IOR('p', 0x0d, unsigned) /* Read epoch */ @@ -158,436 +77,6 @@ return sys_ioctl(fd,cmd,arg); } -struct serial_struct32 { - compat_int_t type; - compat_int_t line; - compat_uint_t port; - compat_int_t irq; - compat_int_t flags; - compat_int_t xmit_fifo_size; - compat_int_t custom_divisor; - compat_int_t baud_base; - unsigned short close_delay; - char io_type; - char reserved_char[1]; - compat_int_t hub6; - unsigned short closing_wait; /* time to wait before closing */ - unsigned short closing_wait2; /* no longer used... */ - compat_uint_t iomem_base; - unsigned short iomem_reg_shift; - unsigned int port_high; - compat_int_t reserved[1]; -}; - -static int serial_struct_ioctl(unsigned fd, unsigned cmd, void *ptr) -{ - typedef struct serial_struct SS; - struct serial_struct32 *ss32 = ptr; - int err; - struct serial_struct ss; - mm_segment_t oldseg = get_fs(); - if (cmd == TIOCSSERIAL) { - if (copy_from_user(&ss, ss32, sizeof(struct serial_struct32))) - return -EFAULT; - memmove(&ss.iomem_reg_shift, ((char*)&ss.iomem_base)+4, - sizeof(SS)-offsetof(SS,iomem_reg_shift)); - ss.iomem_base = (void *)((unsigned long)ss.iomem_base & 0xffffffff); - } - set_fs(KERNEL_DS); - err = sys_ioctl(fd,cmd,(unsigned long)(&ss)); - set_fs(oldseg); - if (cmd == TIOCGSERIAL && err >= 0) { - if (__copy_to_user(ss32,&ss,offsetof(SS,iomem_base)) || - __put_user((unsigned long)ss.iomem_base >> 32 ? - 0xffffffff : (unsigned)(unsigned long)ss.iomem_base, - &ss32->iomem_base) || - __put_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) || - __put_user(ss.port_high, &ss32->port_high)) - return -EFAULT; - } - return err; -} - - - -struct usbdevfs_ctrltransfer32 { - u8 bRequestType; - u8 bRequest; - u16 wValue; - u16 wIndex; - u16 wLength; - u32 timeout; /* in milliseconds */ - compat_caddr_t data; -}; - -#define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32) - -static int do_usbdevfs_control(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_ctrltransfer kctrl; - struct usbdevfs_ctrltransfer32 *uctrl; - mm_segment_t old_fs; - __u32 udata; - void *uptr, *kptr; - int err; - - uctrl = (struct usbdevfs_ctrltransfer32 *) arg; - - if (copy_from_user(&kctrl, uctrl, - (sizeof(struct usbdevfs_ctrltransfer) - - sizeof(void *)))) - return -EFAULT; - - if (get_user(udata, &uctrl->data)) - return -EFAULT; - uptr = compat_ptr(udata); - - /* In usbdevice_fs, it limits the control buffer to a page, - * for simplicity so do we. - */ - if (!uptr || kctrl.wLength > PAGE_SIZE) - return -EINVAL; - - kptr = (void *)__get_free_page(GFP_KERNEL); - - if ((kctrl.bRequestType & 0x80) == 0) { - err = -EFAULT; - if (copy_from_user(kptr, uptr, kctrl.wLength)) - goto out; - } - - kctrl.data = kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_CONTROL, (unsigned long)&kctrl); - set_fs(old_fs); - - if (err >= 0 && - ((kctrl.bRequestType & 0x80) != 0)) { - if (copy_to_user(uptr, kptr, kctrl.wLength)) - err = -EFAULT; - } - -out: - free_page((unsigned long) kptr); - return err; -} - -struct usbdevfs_bulktransfer32 { - compat_uint_t ep; - compat_uint_t len; - compat_uint_t timeout; /* in milliseconds */ - compat_caddr_t data; -}; - -#define USBDEVFS_BULK32 _IOWR('U', 2, struct usbdevfs_bulktransfer32) - -static int do_usbdevfs_bulk(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_bulktransfer kbulk; - struct usbdevfs_bulktransfer32 *ubulk; - mm_segment_t old_fs; - __u32 udata; - void *uptr, *kptr; - int err; - - ubulk = (struct usbdevfs_bulktransfer32 *) arg; - - if (get_user(kbulk.ep, &ubulk->ep) || - get_user(kbulk.len, &ubulk->len) || - get_user(kbulk.timeout, &ubulk->timeout) || - get_user(udata, &ubulk->data)) - return -EFAULT; - - uptr = compat_ptr(udata); - - /* In usbdevice_fs, it limits the control buffer to a page, - * for simplicity so do we. - */ - if (!uptr || kbulk.len > PAGE_SIZE) - return -EINVAL; - - kptr = (void *) __get_free_page(GFP_KERNEL); - - if ((kbulk.ep & 0x80) == 0) { - err = -EFAULT; - if (copy_from_user(kptr, uptr, kbulk.len)) - goto out; - } - - kbulk.data = kptr; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_BULK, (unsigned long) &kbulk); - set_fs(old_fs); - - if (err >= 0 && - ((kbulk.ep & 0x80) != 0)) { - if (copy_to_user(uptr, kptr, kbulk.len)) - err = -EFAULT; - } - -out: - free_page((unsigned long) kptr); - return err; -} - -/* This needs more work before we can enable it. Unfortunately - * because of the fancy asynchronous way URB status/error is written - * back to userspace, we'll need to fiddle with USB devio internals - * and/or reimplement entirely the frontend of it ourselves. -DaveM - * - * The issue is: - * - * When an URB is submitted via usbdevicefs it is put onto an - * asynchronous queue. When the URB completes, it may be reaped - * via another ioctl. During this reaping the status is written - * back to userspace along with the length of the transfer. - * - * We must translate into 64-bit kernel types so we pass in a kernel - * space copy of the usbdevfs_urb structure. This would mean that we - * must do something to deal with the async entry reaping. First we - * have to deal somehow with this transitory memory we've allocated. - * This is problematic since there are many call sites from which the - * async entries can be destroyed (and thus when we'd need to free up - * this kernel memory). One of which is the close() op of usbdevicefs. - * To handle that we'd need to make our own file_operations struct which - * overrides usbdevicefs's release op with our own which runs usbdevicefs's - * real release op then frees up the kernel memory. - * - * But how to keep track of these kernel buffers? We'd need to either - * keep track of them in some table _or_ know about usbdevicefs internals - * (ie. the exact layout of its file private, which is actually defined - * in linux/usbdevice_fs.h, the layout of the async queues are private to - * devio.c) - * - * There is one possible other solution I considered, also involving knowledge - * of usbdevicefs internals: - * - * After an URB is submitted, we "fix up" the address back to the user - * space one. This would work if the status/length fields written back - * by the async URB completion lines up perfectly in the 32-bit type with - * the 64-bit kernel type. Unfortunately, it does not because the iso - * frame descriptors, at the end of the struct, can be written back. - * - * I think we'll just need to simply duplicate the devio URB engine here. - */ -#if 0 -struct usbdevfs_urb32 { - unsigned char type; - unsigned char endpoint; - compat_int_t status; - compat_uint_t flags; - compat_caddr_t buffer; - compat_int_t buffer_length; - compat_int_t actual_length; - compat_int_t start_frame; - compat_int_t number_of_packets; - compat_int_t error_count; - compat_uint_t signr; - compat_caddr_t usercontext; /* unused */ - struct usbdevfs_iso_packet_desc iso_frame_desc[0]; -}; - -#define USBDEVFS_SUBMITURB32 _IOR('U', 10, struct usbdevfs_urb32) - -static int get_urb32(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - if (get_user(kurb->type, &uurb->type) || - __get_user(kurb->endpoint, &uurb->endpoint) || - __get_user(kurb->status, &uurb->status) || - __get_user(kurb->flags, &uurb->flags) || - __get_user(kurb->buffer_length, &uurb->buffer_length) || - __get_user(kurb->actual_length, &uurb->actual_length) || - __get_user(kurb->start_frame, &uurb->start_frame) || - __get_user(kurb->number_of_packets, &uurb->number_of_packets) || - __get_user(kurb->error_count, &uurb->error_count) || - __get_user(kurb->signr, &uurb->signr)) - return -EFAULT; - - kurb->usercontext = 0; /* unused currently */ - - return 0; -} - -/* Just put back the values which usbdevfs actually changes. */ -static int put_urb32(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - if (put_user(kurb->status, &uurb->status) || - __put_user(kurb->actual_length, &uurb->actual_length) || - __put_user(kurb->error_count, &uurb->error_count)) - return -EFAULT; - - if (kurb->number_of_packets != 0) { - int i; - - for (i = 0; i < kurb->number_of_packets; i++) { - if (__put_user(kurb->iso_frame_desc[i].actual_length, - &uurb->iso_frame_desc[i].actual_length) || - __put_user(kurb->iso_frame_desc[i].status, - &uurb->iso_frame_desc[i].status)) - return -EFAULT; - } - } - - return 0; -} - -static int get_urb32_isoframes(struct usbdevfs_urb *kurb, - struct usbdevfs_urb32 *uurb) -{ - unsigned int totlen; - int i; - - if (kurb->type != USBDEVFS_URB_TYPE_ISO) { - kurb->number_of_packets = 0; - return 0; - } - - if (kurb->number_of_packets < 1 || - kurb->number_of_packets > 128) - return -EINVAL; - - if (copy_from_user(&kurb->iso_frame_desc[0], - &uurb->iso_frame_desc[0], - sizeof(struct usbdevfs_iso_packet_desc) * - kurb->number_of_packets)) - return -EFAULT; - - totlen = 0; - for (i = 0; i < kurb->number_of_packets; i++) { - unsigned int this_len; - - this_len = kurb->iso_frame_desc[i].length; - if (this_len > 1023) - return -EINVAL; - - totlen += this_len; - } - - if (totlen > 32768) - return -EINVAL; - - kurb->buffer_length = totlen; - - return 0; -} - -static int do_usbdevfs_urb(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_urb *kurb; - struct usbdevfs_urb32 *uurb; - mm_segment_t old_fs; - __u32 udata; - void *uptr, *kptr; - unsigned int buflen; - int err; - - uurb = (struct usbdevfs_urb32 *) arg; - - err = -ENOMEM; - kurb = kmalloc(sizeof(struct usbdevfs_urb) + - (sizeof(struct usbdevfs_iso_packet_desc) * 128), - GFP_KERNEL); - if (!kurb) - goto out; - - err = -EFAULT; - if (get_urb32(kurb, uurb)) - goto out; - - err = get_urb32_isoframes(kurb, uurb); - if (err) - goto out; - - err = -EFAULT; - if (__get_user(udata, &uurb->buffer)) - goto out; - uptr = compat_ptr(udata); - - buflen = kurb->buffer_length; - err = verify_area(VERIFY_WRITE, uptr, buflen); - if (err) - goto out; - - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_SUBMITURB, (unsigned long) kurb); - set_fs(old_fs); - - if (err >= 0) { - /* RED-PEN Shit, this doesn't work for async URBs :-( XXX */ - if (put_urb32(kurb, uurb)) { - err = -EFAULT; - } - } - -out: - kfree(kurb); - return err; -} -#endif - -#define USBDEVFS_REAPURB32 _IOW('U', 12, u32) -#define USBDEVFS_REAPURBNDELAY32 _IOW('U', 13, u32) - -static int do_usbdevfs_reapurb(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - mm_segment_t old_fs; - void *kptr; - int err; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, - (cmd == USBDEVFS_REAPURB32 ? - USBDEVFS_REAPURB : - USBDEVFS_REAPURBNDELAY), - (unsigned long) &kptr); - set_fs(old_fs); - - if (err >= 0 && - put_user((u32)(u64)kptr, (u32 *)arg)) - err = -EFAULT; - - return err; -} - -struct usbdevfs_disconnectsignal32 { - compat_int_t signr; - compat_caddr_t context; -}; - -#define USBDEVFS_DISCSIGNAL32 _IOR('U', 14, struct usbdevfs_disconnectsignal32) - -static int do_usbdevfs_discsignal(unsigned int fd, unsigned int cmd, unsigned long arg) -{ - struct usbdevfs_disconnectsignal kdis; - struct usbdevfs_disconnectsignal32 *udis; - mm_segment_t old_fs; - u32 uctx; - int err; - - udis = (struct usbdevfs_disconnectsignal32 *) arg; - - if (get_user(kdis.signr, &udis->signr) || - __get_user(uctx, &udis->context)) - return -EFAULT; - - kdis.context = (void *) (long)uctx; - - old_fs = get_fs(); - set_fs(KERNEL_DS); - err = sys_ioctl(fd, USBDEVFS_DISCSIGNAL, (unsigned long) &kdis); - set_fs(old_fs); - - return err; -} /* /proc/mtrr ioctls */ @@ -726,27 +215,12 @@ /* And these ioctls need translation */ HANDLE_IOCTL(TIOCGDEV, tiocgdev) -HANDLE_IOCTL(TIOCGSERIAL, serial_struct_ioctl) -HANDLE_IOCTL(TIOCSSERIAL, serial_struct_ioctl) -/* Raw devices */ -HANDLE_IOCTL(RAW_SETBIND, raw_ioctl) /* realtime device */ HANDLE_IOCTL(RTC_IRQP_READ, rtc32_ioctl) HANDLE_IOCTL(RTC_IRQP_READ32,rtc32_ioctl) HANDLE_IOCTL(RTC_IRQP_SET32, rtc32_ioctl) HANDLE_IOCTL(RTC_EPOCH_READ32, rtc32_ioctl) HANDLE_IOCTL(RTC_EPOCH_SET32, rtc32_ioctl) -HANDLE_IOCTL(REISERFS_IOC_UNPACK32, reiserfs_ioctl32) -/* VFAT */ -HANDLE_IOCTL(VFAT_IOCTL_READDIR_BOTH32, vfat_ioctl32) -HANDLE_IOCTL(VFAT_IOCTL_READDIR_SHORT32, vfat_ioctl32) - -HANDLE_IOCTL(USBDEVFS_CONTROL32, do_usbdevfs_control) -HANDLE_IOCTL(USBDEVFS_BULK32, do_usbdevfs_bulk) -/*HANDLE_IOCTL(USBDEVFS_SUBMITURB32, do_usbdevfs_urb)*/ -HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb) -HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb) -HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal) /* take care of sizeof(sizeof()) breakage */ /* mtrr */ HANDLE_IOCTL(MTRRIOC32_ADD_ENTRY, mtrr_ioctl32) diff -Nru a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c --- a/arch/x86_64/ia32/sys_ia32.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/ia32/sys_ia32.c Wed Oct 8 12:24:56 2003 @@ -61,6 +61,7 @@ #include #include #include +#include #include #include #include @@ -78,28 +79,23 @@ #define ROUND_UP(x,a) ((__typeof__(x))(((unsigned long)(x) + ((a) - 1)) & ~((a) - 1))) #define NAME_OFFSET(de) ((int) ((de)->d_name - (char *) (de))) -#undef high2lowuid -#undef high2lowgid -#undef low2highuid -#undef low2highgid - -#define high2lowuid(uid) ((uid) > 65535) ? (u16)overflowuid : (u16)(uid) -#define high2lowgid(gid) ((gid) > 65535) ? (u16)overflowgid : (u16)(gid) -#define low2highuid(uid) ((uid) == (u16)-1) ? (uid_t)-1 : (uid_t)(uid) -#define low2highgid(gid) ((gid) == (u16)-1) ? (gid_t)-1 : (gid_t)(gid) -extern int overflowuid,overflowgid; - int cp_compat_stat(struct kstat *kbuf, struct compat_stat *ubuf) { + typeof(ubuf->st_uid) uid = 0; + typeof(ubuf->st_gid) gid = 0; + SET_UID(uid, kbuf->uid); + SET_GID(gid, kbuf->gid); if (!old_valid_dev(kbuf->dev) || !old_valid_dev(kbuf->rdev)) return -EOVERFLOW; + if (kbuf->size >= 0x7fffffff) + return -EOVERFLOW; if (verify_area(VERIFY_WRITE, ubuf, sizeof(struct compat_stat)) || __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) || __put_user (kbuf->ino, &ubuf->st_ino) || __put_user (kbuf->mode, &ubuf->st_mode) || __put_user (kbuf->nlink, &ubuf->st_nlink) || - __put_user (kbuf->uid, &ubuf->st_uid) || - __put_user (kbuf->gid, &ubuf->st_gid) || + __put_user (uid, &ubuf->st_uid) || + __put_user (gid, &ubuf->st_gid) || __put_user (old_encode_dev(kbuf->rdev), &ubuf->st_rdev) || __put_user (kbuf->size, &ubuf->st_size) || __put_user (kbuf->atime.tv_sec, &ubuf->st_atime) || @@ -120,14 +116,18 @@ static int cp_stat64(struct stat64 *ubuf, struct kstat *stat) { + typeof(ubuf->st_uid) uid = 0; + typeof(ubuf->st_gid) gid = 0; + SET_UID(uid, stat->uid); + SET_GID(gid, stat->gid); if (verify_area(VERIFY_WRITE, ubuf, sizeof(struct stat64)) || __put_user(huge_encode_dev(stat->dev), &ubuf->st_dev) || __put_user (stat->ino, &ubuf->__st_ino) || __put_user (stat->ino, &ubuf->st_ino) || __put_user (stat->mode, &ubuf->st_mode) || __put_user (stat->nlink, &ubuf->st_nlink) || - __put_user (stat->uid, &ubuf->st_uid) || - __put_user (stat->gid, &ubuf->st_gid) || + __put_user (uid, &ubuf->st_uid) || + __put_user (gid, &ubuf->st_gid) || __put_user (huge_encode_dev(stat->rdev), &ubuf->st_rdev) || __put_user (stat->size, &ubuf->st_size) || __put_user (stat->atime.tv_sec, &ubuf->st_atime) || @@ -1422,8 +1422,9 @@ __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN); __put_user(0,name->version+__OLD_UTS_LEN); { - char *arch = current->personality == PER_LINUX32 - ? "i386" : "x86_64"; + char *arch = "x86_64"; + if (personality(current->personality) == PER_LINUX32) + arch = "i686"; __copy_to_user(&name->machine,arch,strlen(arch)+1); } @@ -1443,7 +1444,7 @@ down_read(&uts_sem); err=copy_to_user(name, &system_utsname, sizeof (*name)); up_read(&uts_sem); - if (current->personality == PER_LINUX32) + if (personality(current->personality) == PER_LINUX32) err |= copy_to_user(&name->machine, "i686", 5); return err?-EFAULT:0; } @@ -1700,8 +1701,8 @@ &arg32->ca32_export.ex32_anon_uid); err |= __get_user(karg->ca_export.ex_anon_gid, &arg32->ca32_export.ex32_anon_gid); - karg->ca_export.ex_anon_uid = high2lowuid(karg->ca_export.ex_anon_uid); - karg->ca_export.ex_anon_gid = high2lowgid(karg->ca_export.ex_anon_gid); + SET_UID(karg->ca_export.ex_anon_uid, karg->ca_export.ex_anon_uid); + SET_GID(karg->ca_export.ex_anon_gid, karg->ca_export.ex_anon_gid); return err; } @@ -1952,6 +1953,9 @@ sys32_timer_create(u32 clock, struct sigevent32 *se32, timer_t *timer_id) { struct sigevent se; + mm_segment_t oldfs; + long err; + if (se32) { memset(&se, 0, sizeof(struct sigevent)); if (get_user(se.sigev_value.sival_int, &se32->sigev_value) || @@ -1964,9 +1968,9 @@ if (!access_ok(VERIFY_WRITE,timer_id,sizeof(timer_t))) return -EFAULT; - mm_segment_t oldfs = get_fs(); + oldfs = get_fs(); set_fs(KERNEL_DS); - long err = sys_timer_create(clock, se32 ? &se : NULL, timer_id); + err = sys_timer_create(clock, se32 ? &se : NULL, timer_id); set_fs(oldfs); return err; diff -Nru a/arch/x86_64/kernel/Makefile b/arch/x86_64/kernel/Makefile --- a/arch/x86_64/kernel/Makefile Wed Oct 8 12:24:57 2003 +++ b/arch/x86_64/kernel/Makefile Wed Oct 8 12:24:57 2003 @@ -26,3 +26,5 @@ bootflag-y += ../../i386/kernel/bootflag.o cpuid-$(CONFIG_X86_CPUID) += ../../i386/kernel/cpuid.o + +obj-$(CONFIG_CPU_FREQ) += cpufreq/ diff -Nru a/arch/x86_64/kernel/cpufreq/Kconfig b/arch/x86_64/kernel/cpufreq/Kconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/x86_64/kernel/cpufreq/Kconfig Wed Oct 8 12:24:58 2003 @@ -0,0 +1,44 @@ +# +# CPU Frequency scaling +# + +menu "CPU Frequency scaling" + +config CPU_FREQ + bool "CPU Frequency scaling" + help + Clock scaling allows you to change the clock speed of CPUs on the + fly. This is a nice method to save battery power on notebooks, + because the lower the clock speed, the less power the CPU consumes. + + For more information, take a look at linux/Documentation/cpu-freq or + at + + If in doubt, say N. + +source "drivers/cpufreq/Kconfig" + +config CPU_FREQ_TABLE + tristate "CPU frequency table helpers" + depends on CPU_FREQ + default y + help + Many CPUFreq drivers use these helpers, so only say N here if + the CPUFreq driver of your choice doesn't need these helpers. + + If in doubt, say Y. + +comment "CPUFreq processor drivers" + depends on CPU_FREQ + +config X86_POWERNOW_K8 + tristate "AMD Opteron/Athlon64 PowerNow!" + depends on CPU_FREQ_TABLE + help + This adds the CPUFreq driver for mobile AMD Opteron/Athlon64 processors. + + For details, take a look at linux/Documentation/cpu-freq. + + If in doubt, say N. + +endmenu diff -Nru a/arch/x86_64/kernel/cpufreq/Makefile b/arch/x86_64/kernel/cpufreq/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/arch/x86_64/kernel/cpufreq/Makefile Wed Oct 8 12:24:57 2003 @@ -0,0 +1,12 @@ +# +# Reuse the i386 cpufreq drivers +# + +obj-$(CONFIG_X86_POWERNOW_K8) += powernow-k8.o + +$(obj)/powernow-k8.c: $(obj)/powernow-k8.h + @ln -sf ../../../i386/kernel/cpu/cpufreq/powernow-k8.c $(obj)/powernow-k8.c +$(obj)/powernow-k8.h: + @ln -sf ../../../i386/kernel/cpu/cpufreq/powernow-k8.h $(obj)/powernow-k8.h + +clean-files += powernow-k8.c powernow-k8.h diff -Nru a/arch/x86_64/kernel/i387.c b/arch/x86_64/kernel/i387.c --- a/arch/x86_64/kernel/i387.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/kernel/i387.c Wed Oct 8 12:24:56 2003 @@ -53,6 +53,11 @@ */ void init_fpu(struct task_struct *child) { + if (child->used_math) { + if (child == current) + unlazy_fpu(child); + return; + } memset(&child->thread.i387.fxsave, 0, sizeof(struct i387_fxsave_struct)); child->thread.i387.fxsave.cwd = 0x37f; child->thread.i387.fxsave.mxcsr = 0x1f80; @@ -138,12 +143,3 @@ } return fpvalid; } - -#ifdef CONFIG_SMP -void dump_smp_unlazy_fpu(void) -{ - unlazy_fpu(current); - return; -} -#endif - diff -Nru a/arch/x86_64/kernel/init_task.c b/arch/x86_64/kernel/init_task.c --- a/arch/x86_64/kernel/init_task.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/kernel/init_task.c Wed Oct 8 12:24:56 2003 @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -14,6 +15,8 @@ static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); struct mm_struct init_mm = INIT_MM(init_mm); +EXPORT_SYMBOL(init_mm); + /* * Initial task structure. * @@ -32,6 +35,7 @@ */ struct task_struct init_task = INIT_TASK(init_task); +EXPORT_SYMBOL(init_task); /* * per-CPU TSS segments. Threads are completely 'soft' on Linux, * no more per-task TSS's. The TSS size is kept cacheline-aligned diff -Nru a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c --- a/arch/x86_64/kernel/irq.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/kernel/irq.c Wed Oct 8 12:24:56 2003 @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -481,6 +482,8 @@ return retval; } +EXPORT_SYMBOL(request_irq); + /** * free_irq - free an interrupt * @irq: Interrupt line to free @@ -537,6 +540,8 @@ } } +EXPORT_SYMBOL(free_irq); + /* * IRQ autodetection code.. * @@ -630,6 +635,8 @@ return val; } +EXPORT_SYMBOL(probe_irq_on); + /* * Return a mask of triggered interrupts (this * can handle only legacy ISA interrupts). @@ -727,6 +734,8 @@ irq_found = -irq_found; return irq_found; } + +EXPORT_SYMBOL(probe_irq_off); /* this was setup_x86_irq but it seems pretty generic */ int setup_irq(unsigned int irq, struct irqaction * new) diff -Nru a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c --- a/arch/x86_64/kernel/process.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/kernel/process.c Wed Oct 8 12:24:56 2003 @@ -65,10 +65,14 @@ hlt_counter++; } +EXPORT_SYMBOL(disable_hlt); + void enable_hlt(void) { hlt_counter--; } + +EXPORT_SYMBOL(enable_hlt); /* * We use this if we don't have any better diff -Nru a/arch/x86_64/kernel/reboot.c b/arch/x86_64/kernel/reboot.c --- a/arch/x86_64/kernel/reboot.c Wed Oct 8 12:24:57 2003 +++ b/arch/x86_64/kernel/reboot.c Wed Oct 8 12:24:57 2003 @@ -1,4 +1,5 @@ /* Various gunk just to reboot the machine. */ +#include #include #include #include @@ -169,12 +170,18 @@ } } +EXPORT_SYMBOL(machine_restart); + void machine_halt(void) { } +EXPORT_SYMBOL(machine_halt); + void machine_power_off(void) { if (pm_power_off) pm_power_off(); } + +EXPORT_SYMBOL(machine_power_off); diff -Nru a/arch/x86_64/kernel/sys_x86_64.c b/arch/x86_64/kernel/sys_x86_64.c --- a/arch/x86_64/kernel/sys_x86_64.c Wed Oct 8 12:24:57 2003 +++ b/arch/x86_64/kernel/sys_x86_64.c Wed Oct 8 12:24:57 2003 @@ -112,8 +112,8 @@ down_read(&uts_sem); err = copy_to_user(name, &system_utsname, sizeof (*name)); up_read(&uts_sem); - if (current->personality == PER_LINUX32) - err |= copy_to_user(&name->machine, "i386", 5); + if (personality(current->personality) == PER_LINUX32) + err |= copy_to_user(&name->machine, "i686", 5); return err ? -EFAULT : 0; } diff -Nru a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c --- a/arch/x86_64/kernel/time.c Wed Oct 8 12:24:57 2003 +++ b/arch/x86_64/kernel/time.c Wed Oct 8 12:24:57 2003 @@ -28,12 +28,15 @@ #include #include #include +#include #ifdef CONFIG_X86_LOCAL_APIC #include #endif u64 jiffies_64 = INITIAL_JIFFIES; +EXPORT_SYMBOL(jiffies_64); + extern int using_apic_timer; spinlock_t rtc_lock = SPIN_LOCK_UNLOCKED; @@ -118,6 +121,8 @@ tv->tv_usec = usec % 1000000; } +EXPORT_SYMBOL(do_gettimeofday); + /* * settimeofday() first undoes the correction that gettimeofday would do * on the time, and then saves it. This is ugly, but has been like this for @@ -153,6 +158,8 @@ return 0; } +EXPORT_SYMBOL(do_settimeofday); + /* * In order to set the CMOS clock precisely, set_rtc_mmss has to be called 500 * ms after the second nowtime has started, because when nowtime is written @@ -455,6 +462,51 @@ return mktime(year, mon, day, hour, min, sec); } +#ifdef CONFIG_CPU_FREQ + +/* Frequency scaling support. Adjust the TSC based timer when the cpu frequency + changes. + + RED-PEN: On SMP we assume all CPUs run with the same frequency. It's + not that important because current Opteron setups do not support + scaling on SMP anyroads. + + Should fix up last_tsc too. Currently gettimeofday in the + first tick after the change will be slightly wrong. */ + +static unsigned int ref_freq = 0; +static unsigned long loops_per_jiffy_ref = 0; + +//static unsigned long fast_gettimeoffset_ref = 0; +static unsigned long cpu_khz_ref = 0; + +static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, + void *data) +{ + struct cpufreq_freqs *freq = data; + + if (!ref_freq) { + ref_freq = freq->old; + loops_per_jiffy_ref = cpu_data[freq->cpu].loops_per_jiffy; + cpu_khz_ref = cpu_khz; + } + if ((val == CPUFREQ_PRECHANGE && freq->old < freq->new) || + (val == CPUFREQ_POSTCHANGE && freq->old > freq->new)) { + cpu_data[freq->cpu].loops_per_jiffy = + cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new); + + cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new); + vxtime.tsc_quot = (1000L << 32) / cpu_khz; + } + + return 0; +} + +static struct notifier_block time_cpufreq_notifier_block = { + .notifier_call = time_cpufreq_notifier +}; +#endif + /* * calibrate_tsc() calibrates the processor TSC in a very simple way, comparing * it to the HPET timer of known frequency. @@ -641,6 +693,11 @@ vxtime.hz = vxtime_hz; rdtscll_sync(&vxtime.last_tsc); setup_irq(0, &irq0); + +#ifdef CONFIG_CPU_FREQ + cpufreq_register_notifier(&time_cpufreq_notifier_block, + CPUFREQ_TRANSITION_NOTIFIER); +#endif } void __init time_init_smp(void) diff -Nru a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c --- a/arch/x86_64/kernel/traps.c Wed Oct 8 12:24:55 2003 +++ b/arch/x86_64/kernel/traps.c Wed Oct 8 12:24:55 2003 @@ -248,6 +248,8 @@ show_trace(&dummy); } +EXPORT_SYMBOL(dump_stack); + void show_registers(struct pt_regs *regs) { int i; diff -Nru a/arch/x86_64/lib/csum-partial.c b/arch/x86_64/lib/csum-partial.c --- a/arch/x86_64/lib/csum-partial.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/lib/csum-partial.c Wed Oct 8 12:24:56 2003 @@ -135,6 +135,8 @@ return add32_with_carry(do_csum(buff, len), sum); } +EXPORT_SYMBOL(csum_partial); + /* * this routine is used for miscellaneous IP-like checksums, mainly * in icmp.c diff -Nru a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c --- a/arch/x86_64/mm/init.c Wed Oct 8 12:24:56 2003 +++ b/arch/x86_64/mm/init.c Wed Oct 8 12:24:56 2003 @@ -355,9 +355,10 @@ for (; address < end; address += LARGE_PAGE_SIZE) { pgd_t *pgd = pgd_offset_k(address); + pmd_t *pmd; if (!pgd || pgd_none(*pgd)) continue; - pmd_t *pmd = pmd_offset(pgd, address); + pmd = pmd_offset(pgd, address); if (!pmd || pmd_none(*pmd)) continue; if (0 == (pmd_val(*pmd) & _PAGE_PSE)) { @@ -513,24 +514,29 @@ int kern_addr_valid(unsigned long addr) { unsigned long above = ((long)addr) >> __VIRTUAL_MASK_SHIFT; + pml4_t *pml4; + pgd_t *pgd; + pmd_t *pmd; + pte_t *pte; + if (above != 0 && above != -1UL) return 0; - pml4_t *pml4 = pml4_offset_k(addr); + pml4 = pml4_offset_k(addr); if (pml4_none(*pml4)) return 0; - pgd_t *pgd = pgd_offset_k(addr); + pgd = pgd_offset_k(addr); if (pgd_none(*pgd)) return 0; - pmd_t *pmd = pmd_offset(pgd, addr); + pmd = pmd_offset(pgd, addr); if (pmd_none(*pmd)) return 0; if (pmd_large(*pmd)) return pfn_valid(pmd_pfn(*pmd)); - pte_t *pte = pte_offset_kernel(pmd, addr); + pte = pte_offset_kernel(pmd, addr); if (pte_none(*pte)) return 0; return pfn_valid(pte_pfn(*pte)); diff -Nru a/arch/x86_64/mm/ioremap.c b/arch/x86_64/mm/ioremap.c --- a/arch/x86_64/mm/ioremap.c Wed Oct 8 12:24:57 2003 +++ b/arch/x86_64/mm/ioremap.c Wed Oct 8 12:24:57 2003 @@ -159,7 +159,7 @@ if (!area) return NULL; addr = area->addr; - if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) { + if (remap_area_pages((unsigned long) addr, phys_addr, size, flags)) { vunmap(addr); return NULL; } diff -Nru a/crypto/Kconfig b/crypto/Kconfig --- a/crypto/Kconfig Wed Oct 8 12:24:57 2003 +++ b/crypto/Kconfig Wed Oct 8 12:24:57 2003 @@ -78,7 +78,7 @@ designed for use on "large microprocessors". See also: - http://www.counterpane.com/blowfish.html + http://www.schneier.com/blowfish.html config CRYPTO_TWOFISH tristate "Twofish cipher algorithm" @@ -92,7 +92,7 @@ bits. See also: - http://www.counterpane.com/twofish.html + http://www.schneier.com/twofish.html config CRYPTO_SERPENT tristate "Serpent cipher algorithm" @@ -124,7 +124,7 @@ The AES specifies three key sizes: 128, 192 and 256 bits - See http://csrc.nist.gov/encryption/aes/ for more information. + See http://csrc.nist.gov/CryptoToolkit/aes/ for more information. config CRYPTO_CAST5 tristate "CAST5 (CAST-128) cipher algorithm" diff -Nru a/drivers/Kconfig b/drivers/Kconfig --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/Kconfig Wed Oct 8 12:24:58 2003 @@ -0,0 +1,51 @@ +# drivers/Kconfig + +menu "Device Drivers" + +source "drivers/base/Kconfig" + +source "drivers/mtd/Kconfig" + +source "drivers/parport/Kconfig" + +source "drivers/pnp/Kconfig" + +source "drivers/block/Kconfig" + +source "drivers/ide/Kconfig" + +source "drivers/scsi/Kconfig" + +source "drivers/cdrom/Kconfig" + +source "drivers/md/Kconfig" + +source "drivers/message/fusion/Kconfig" + +source "drivers/ieee1394/Kconfig" + +source "drivers/message/i2o/Kconfig" + +source "net/Kconfig" + +source "drivers/isdn/Kconfig" + +source "drivers/telephony/Kconfig" + +# input before char - char/joystick depends on it. As does USB. + +source "drivers/input/Kconfig" + +source "drivers/char/Kconfig" + +# source "drivers/misc/Kconfig" + +source "drivers/media/Kconfig" + +source "drivers/video/Kconfig" + +source "sound/Kconfig" + +source "drivers/usb/Kconfig" + +endmenu diff -Nru a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig --- a/drivers/acpi/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/Kconfig Wed Oct 8 12:24:57 2003 @@ -3,34 +3,14 @@ # menu "ACPI (Advanced Configuration and Power Interface) Support" - -config ACPI_HT - bool "ACPI Processor Enumeration for HT" - depends on X86 - default y - ---help--- - ACPI enumerates both logical (a.k.a. Hyper-Threaded -- HT) - and physical processors. It is designed to obsolete several older - specifications, including the MultiProcessor Specification (MPS), - which supported only physical processors. - - CONFIG_ACPI_HT includes the minimal ACPI boot-time code - necessary to enumerate logical processors and enable HT. - - CONFIG_ACPI includes CONFIG_ACPI_HT, plus IO APIC enumeration, - and the hooks to run the ACPI AML interpreter for run-time events. - - When CONFIG_ACPI is selected, the command-line option "acpi=ht" - is available to run just the ACPI boot-time code -- just as if - only CONFIG_ACPI_HT were selected. - - Note that "acpi=off" can be used to disable all ACPI code in the kernel. - -config ACPI - bool "Full ACPI Support" depends on !X86_VISWS depends on !IA64_HP_SIM - depends on IA64 || (X86 || ACPI_HT) + depends on IA64 || X86 + +config ACPI + bool "ACPI Support" + depends on IA64 || X86 + default y ---help--- Advanced Configuration and Power Interface (ACPI) support for @@ -62,12 +42,19 @@ config ACPI_BOOT bool - depends on ACPI || ACPI_HT + depends on ACPI || X86_HT + default y + +config ACPI_INTERPRETER + bool + depends on ACPI + depends on !IA64_SGI_SN default y config ACPI_SLEEP bool "Sleep States (EXPERIMENTAL)" depends on X86 && ACPI + depends on ACPI_INTERPRETER depends on EXPERIMENTAL && PM default y ---help--- @@ -93,7 +80,8 @@ config ACPI_AC tristate "AC Adapter" - depends on X86 && ACPI + depends on X86 + depends on ACPI_INTERPRETER default m help This driver adds support for the AC Adapter object, which indicates @@ -102,7 +90,8 @@ config ACPI_BATTERY tristate "Battery" - depends on X86 && ACPI + depends on X86 + depends on ACPI_INTERPRETER default m help This driver adds support for battery information through @@ -111,7 +100,7 @@ config ACPI_BUTTON tristate "Button" - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default m help @@ -123,7 +112,7 @@ config ACPI_FAN tristate "Fan" - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default m help @@ -132,7 +121,7 @@ config ACPI_PROCESSOR tristate "Processor" - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default m help @@ -152,14 +141,15 @@ config ACPI_NUMA bool "NUMA support" - depends on ACPI + depends on ACPI_INTERPRETER depends on NUMA depends on !X86_64 default y if IA64_GENERIC || IA64_SGI_SN2 config ACPI_ASUS tristate "ASUS/Medion Laptop Extras" - depends on X86 && ACPI + depends on X86 + depends on ACPI_INTERPRETER default m ---help--- This driver provides support for extra features of ACPI-compatible @@ -170,6 +160,9 @@ display brightness and output, switching the LCD backlight on and off, and most importantly, allows you to blink those fancy LEDs intended for reporting mail and wireless status. + + Note: display switching code is currently considered EXPERIMENTAL, + toying with these values may even lock your machine. All settings are changed via /proc/acpi/asus directory entries. Owner and group for these entries can be set with asus_uid and asus_gid @@ -185,7 +178,8 @@ config ACPI_TOSHIBA tristate "Toshiba Laptop Extras" - depends on X86 && ACPI + depends on X86 + depends on ACPI_INTERPRETER default m ---help--- This driver adds support for access to certain system settings @@ -212,7 +206,7 @@ config ACPI_DEBUG bool "Debug Statements" - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default n help @@ -222,19 +216,14 @@ config ACPI_BUS bool - depends on ACPI - depends on !IA64_SGI_SN - default y - -config ACPI_INTERPRETER - bool - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default y config ACPI_EC bool - depends on X86 && ACPI + depends on X86 + depends on ACPI_INTERPRETER default y help This driver is required on some systems for the proper operation of @@ -243,19 +232,19 @@ config ACPI_POWER bool - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default y config ACPI_PCI bool - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default PCI config ACPI_SYSTEM bool - depends on ACPI + depends on ACPI_INTERPRETER depends on !IA64_SGI_SN default y help @@ -264,9 +253,21 @@ config ACPI_EFI bool - depends on ACPI + depends on ACPI_INTERPRETER depends on IA64 default y + +config ACPI_RELAXED_AML + bool "Relaxed AML" + depends on ACPI_INTERPRETER + depends on !IA64_SGI_SN + default n + help + If you say `Y' here, the ACPI interpreter will relax its checking + for valid AML and will ignore some AML mistakes, such as off-by-one + errors in region sizes. Some laptops may require this option. In + particular, many Toshiba laptops require this for correct operation + of the AC module. endmenu diff -Nru a/drivers/acpi/Makefile b/drivers/acpi/Makefile --- a/drivers/acpi/Makefile Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/Makefile Wed Oct 8 12:24:57 2003 @@ -18,7 +18,7 @@ # ACPI Boot-Time Table Parsing # obj-$(CONFIG_ACPI_BOOT) += tables.o -obj-$(CONFIG_ACPI) += blacklist.o +obj-$(CONFIG_ACPI_INTERPRETER) += blacklist.o # # ACPI Core Subsystem (Interpreter) diff -Nru a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c --- a/drivers/acpi/asus_acpi.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/asus_acpi.c Wed Oct 8 12:24:56 2003 @@ -26,13 +26,14 @@ * Johann Wiesner - Small compile fixes * John Belmonte - ACPI code for Toshiba laptop was a good starting point. * - * TODO + * TODO: * add Fn key status - * Add mode selection on module loading (parameter) -> still necessary ? + * Add mode selection on module loading (parameter) -> still necessary? * Complete display switching -- may require dirty hacks? - * */ +#include + #include #include #include @@ -41,7 +42,7 @@ #include #include -#define ASUS_ACPI_VERSION "0.24a" +#define ASUS_ACPI_VERSION "0.26" #define PROC_ASUS "asus" //the directory #define PROC_MLED "mled" @@ -110,20 +111,24 @@ struct model_data *methods; //methods available on the laptop u8 brightness; //brighness level enum { - L2X = 0, //L200D -> TODO check Q11 (Fn+F8) - // Calling this method simply hang the + A1X=0, //A1340D, A1300F + A2X, //A2500H + D1X, //D1 + L1X, //L1400B + L2X, //L2000D -> TODO check Q11 (Fn+F8) + // Calling this method simply hangs the // computer, ISMI method hangs the laptop. - L3X, //L3C L3D, //L3400D + L3X, //L3C + L5X, //L5C TODO this model seems to have one more + // LED, add support M2X, //M2400E + M3N, //M3700N, but also S1300N -> TODO WLED S1X, //S1300A -> TODO special keys do not work ? - D1X, //D1 - L1X, //L1400B - A1X, //A1340D, A1300F - J1X, //S200 (J1) - //TODO A1370D does not seems to have a ATK device + S2X, //S200 (J1 reported), Victor MP-XP7210 + //TODO A1370D does not seem to have an ATK device // L8400 model doesn't have ATK - END_MODEL, + END_MODEL } model; //Models currently supported u16 event_count[128]; //count for each event TODO make this better }; @@ -133,7 +138,8 @@ #define S1X_PREFIX "\\_SB.PCI0.PX40." #define L1X_PREFIX S1X_PREFIX #define A1X_PREFIX "\\_SB.PCI0.ISA.EC0." -#define J1X_PREFIX A1X_PREFIX +#define S2X_PREFIX A1X_PREFIX +#define M3N_PREFIX "\\_SB.PCI0.SBRG.EC0." static struct model_data model_conf[END_MODEL] = { /* @@ -147,33 +153,43 @@ * it seems to be a kind of switch, but what for ? * */ + {"A1X", "MLED", "\\MAIL", NULL, NULL, A1X_PREFIX "_Q10", "\\BKLI", + A1X_PREFIX "_Q0E", A1X_PREFIX "_Q0F", NULL, NULL, NULL, NULL, NULL}, + + {"A2X", "MLED", NULL, "WLED", "\\SG66", "\\Q10", "\\BAOF", + "\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\CMOD", "SDSP", "\\INFB"}, + + {"D1X", "MLED", NULL, NULL, NULL, "\\Q0D", "\\GP11", + "\\Q0C", "\\Q0B", NULL, NULL, "\\BLVL", "SDSP","\\INFB"}, + + {"L1X", "MLED", NULL, "WLED", NULL, L1X_PREFIX "Q10", "\\PNOF", + L1X_PREFIX "Q0F", L1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL}, + {"L2X", "MLED", "\\SGP6", "WLED", "\\RCP3", "\\Q10", "\\SGP0", "\\Q0E", "\\Q0F", NULL, NULL, NULL, "SDSP", "\\INFB"}, + {"L3D", "MLED", "\\MALD", "WLED", NULL, "\\Q10", "\\BKLG", + "\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\INFB"}, + {"L3X", "MLED", NULL, "WLED", NULL, L3X_PREFIX "_Q10", "\\GL32", L3X_PREFIX "_Q0F", L3X_PREFIX "_Q0E", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\_SB.PCI0.PCI1.VGAC.NMAP"}, - {"L3D", "MLED", "\\MALD", "WLED", NULL, "\\Q10", "\\BKLG", - "\\Q0E", "\\Q0F", "SPLV", "GPLV", "\\BLVL", "SDSP", "\\INFB"}, - + {"L5X", "MLED", NULL, "WLED", "WRED", "\\Q0D", "\\BAOF", + "\\Q0C","\\Q0B", "SPLV", "GPLV", NULL, "SDSP", "\\INFB"}, + {"M2X", "MLED", NULL, "WLED", NULL, "\\Q10", "\\GP06", "\\Q0E","\\Q0F", "SPLV", "GPLV", NULL, "SDSP", "\\INFB"}, + + {"M3N", "MLED", NULL, "WLED", "\\PO33", M3N_PREFIX "_Q10", "\\BKLT", + M3N_PREFIX "_Q0F", M3N_PREFIX "_Q0E", "SPLV", "GPLV", "\\LBTN", "SDSP", + "\\ADVG"}, {"S1X", "MLED", "\\EMLE", "WLED", NULL, S1X_PREFIX "Q10", "\\PNOF", S1X_PREFIX "Q0F", S1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL}, - {"D1X", "MLED", NULL, NULL, NULL, "\\Q0D", "\\GP11", - "\\Q0C", "\\Q0B", NULL, NULL, "\\BLVL", "SDSP","\\INFB"}, - - {"L1X", "MLED", NULL, "WLED", NULL, L1X_PREFIX "Q10", "\\PNOF", - L1X_PREFIX "Q0F", L1X_PREFIX "Q0E", "SPLV", "GPLV", "\\BRIT", NULL, NULL}, - - {"A1X", "MLED", "\\MAIL", NULL, NULL, A1X_PREFIX "_Q10", "\\BKLI", - A1X_PREFIX "_Q0E", A1X_PREFIX "_Q0F", NULL, NULL, NULL, NULL, NULL}, - - {"J1X", "MLED", "\\MAIL", NULL, NULL, J1X_PREFIX "_Q10", "\\BKLI", - J1X_PREFIX "_Q0B", J1X_PREFIX "_Q0A", NULL, NULL, NULL, NULL, NULL} + {"S2X", "MLED", "\\MAIL", NULL, NULL, S2X_PREFIX "_Q10", "\\BKLI", + S2X_PREFIX "_Q0B", S2X_PREFIX "_Q0A", NULL, NULL, NULL, NULL, NULL} }; /* procdir we use */ @@ -234,7 +250,7 @@ output.length = sizeof(out_obj); output.pointer = &out_obj; - status = acpi_evaluate_object(handle, (char*) method, NULL, &output); + status = acpi_evaluate_object(handle, (char *) method, NULL, &output); *val = out_obj.integer.value; return (status == AE_OK) && (out_obj.type == ACPI_TYPE_INTEGER); } @@ -249,6 +265,7 @@ void *data) { int len = 0; + int sfun; struct asus_hotk *hotk = (struct asus_hotk *) data; char buf[16]; //enough for all info /* @@ -257,28 +274,27 @@ */ len += sprintf(page, ACPI_HOTK_NAME " " ASUS_ACPI_VERSION "\n"); - len += - sprintf(page + len, "Model reference : %s\n", - hotk->methods->name); + len += sprintf(page + len, "Model reference : %s\n", + hotk->methods->name); + if(read_acpi_int(hotk->handle, "SFUN", &sfun)) + len += sprintf(page + len, "SFUN value : 0x%04x\n", sfun); if (asus_info) { - snprintf(buf, 5, "%s", asus_info->signature); - len += sprintf(page + len, "ACPI signature : %s\n", buf); snprintf(buf, 16, "%d", asus_info->length); - len += sprintf(page + len, "Table length : %s\n", buf); - snprintf(buf, 16, "%d", asus_info->revision); - len += sprintf(page + len, "ACPI minor version : %s\n", buf); + len += sprintf(page + len, "DSDT length : %s\n", buf); snprintf(buf, 16, "%d", asus_info->checksum); - len += sprintf(page + len, "Checksum : %s\n", buf); + len += sprintf(page + len, "DSDT checksum : %s\n", buf); + snprintf(buf, 16, "%d", asus_info->revision); + len += sprintf(page + len, "DSDT revision : %s\n", buf); snprintf(buf, 7, "%s", asus_info->oem_id); - len += sprintf(page + len, "OEM identification : %s\n", buf); + len += sprintf(page + len, "OEM id : %s\n", buf); snprintf(buf, 9, "%s", asus_info->oem_table_id); len += sprintf(page + len, "OEM table id : %s\n", buf); snprintf(buf, 16, "%x", asus_info->oem_revision); - len += sprintf(page + len, "OEM rev number : 0x%s\n", buf); + len += sprintf(page + len, "OEM revision : 0x%s\n", buf); snprintf(buf, 5, "%s", asus_info->asl_compiler_id); - len += sprintf(page + len, "ASL comp vendor ID : %s\n", buf); + len += sprintf(page + len, "ASL comp vendor id : %s\n", buf); snprintf(buf, 16, "%x", asus_info->asl_compiler_revision); - len += sprintf(page + len, "ASL comp rev number: 0x%s\n", buf); + len += sprintf(page + len, "ASL comp revision : 0x%s\n", buf); } return len; @@ -304,7 +320,7 @@ &led_status)) len = sprintf(page, "%d\n", led_status); else - printk(KERN_NOTICE "Asus ACPI: Error reading MLED " + printk(KERN_WARNING "Asus ACPI: Error reading MLED " "status\n"); } else { len = sprintf(page, "%d\n", (hotk->status & MLED_ON) ? 1 : 0); @@ -334,7 +350,7 @@ /* We don't have to check mt_mled exists if we are here :) */ if (!write_acpi_int(hotk->handle, hotk->methods->mt_mled, led_out, NULL)) - printk(KERN_NOTICE "Asus ACPI: MLED write failed\n"); + printk(KERN_WARNING "Asus ACPI: MLED write failed\n"); @@ -355,11 +371,11 @@ int led_status; if (hotk->methods->wled_status) { - if (read_acpi_int(NULL, hotk->methods->mled_status, + if (read_acpi_int(NULL, hotk->methods->wled_status, &led_status)) len = sprintf(page, "%d\n", led_status); else - printk(KERN_NOTICE "Asus ACPI: Error reading WLED " + printk(KERN_WARNING "Asus ACPI: Error reading WLED " "status\n"); } else { len = sprintf(page, "%d\n", (hotk->status & WLED_ON) ? 1 : 0); @@ -386,7 +402,7 @@ /* We don't have to check if mt_wled exists if we are here :) */ if (!write_acpi_int(hotk->handle, hotk->methods->mt_wled, led_out, NULL)) - printk(KERN_NOTICE "Asus ACPI: WLED write failed\n"); + printk(KERN_WARNING "Asus ACPI: WLED write failed\n"); return count; @@ -399,7 +415,7 @@ /* We don't have to check anything, if we are here */ if (!read_acpi_int(NULL, hotk->methods->lcd_status, &lcd)) - printk(KERN_NOTICE "Asus ACPI: Error reading LCD status\n"); + printk(KERN_WARNING "Asus ACPI: Error reading LCD status\n"); if (hotk->model == L2X) lcd = ~lcd; @@ -438,7 +454,7 @@ acpi_evaluate_object(NULL, hotk->methods->mt_lcd_switch, NULL, NULL); if (ACPI_FAILURE(status)) - printk(KERN_NOTICE "Asus ACPI: Error switching LCD\n"); + printk(KERN_WARNING "Asus ACPI: Error switching LCD\n"); } return count; @@ -452,15 +468,15 @@ { acpi_status status = 0; - /* ATKD laptop */ + /* SPLV laptop */ if(hotk->methods->brightness_set) { if (!write_acpi_int(hotk->handle, hotk->methods->brightness_set, value, NULL)) - printk(KERN_NOTICE "Asus ACPI: Error changing brightness\n"); + printk(KERN_WARNING "Asus ACPI: Error changing brightness\n"); return; } - /* HOTK laptop if we are here, act as appropriate */ + /* No SPLV method if we are here, act as appropriate */ value -= hotk->brightness; while (value != 0) { status = acpi_evaluate_object(NULL, (value > 0) ? @@ -469,7 +485,7 @@ NULL, NULL); (value > 0) ? value-- : value++; if (ACPI_FAILURE(status)) - printk(KERN_NOTICE "Asus ACPI: Error changing brightness\n"); + printk(KERN_WARNING "Asus ACPI: Error changing brightness\n"); } return; } @@ -478,15 +494,15 @@ { int value; - if(hotk->methods->brightness_get) { /* ATKD laptop */ + if(hotk->methods->brightness_get) { /* SPLV/GPLV laptop */ if (!read_acpi_int(hotk->handle, hotk->methods->brightness_get, &value)) - printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n"); + printk(KERN_WARNING "Asus ACPI: Error reading brightness\n"); } else if (hotk->methods->brightness_status) { /* For D1 for example */ if (!read_acpi_int(NULL, hotk->methods->brightness_status, &value)) - printk(KERN_NOTICE "Asus ACPI: Error reading brightness\n"); - } else /* HOTK laptop */ + printk(KERN_WARNING "Asus ACPI: Error reading brightness\n"); + } else /* No GPLV method */ value = hotk->brightness; return value; } @@ -512,7 +528,7 @@ /* 0 <= value <= 15 */ set_brightness(value, hotk); } else { - printk(KERN_NOTICE "Asus ACPI: Error reading user input\n"); + printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); } return count; @@ -523,7 +539,7 @@ /* no sanity check needed for now */ if (!write_acpi_int(hotk->handle, hotk->methods->display_set, value, NULL)) - printk(KERN_NOTICE "Asus ACPI: Error setting display\n"); + printk(KERN_WARNING "Asus ACPI: Error setting display\n"); return; } @@ -540,12 +556,12 @@ struct asus_hotk *hotk = (struct asus_hotk *) data; if (!read_acpi_int(hotk->handle, hotk->methods->display_get, &value)) - printk(KERN_NOTICE "Asus ACPI: Error reading display status\n"); + printk(KERN_WARNING "Asus ACPI: Error reading display status\n"); return sprintf(page, "%d\n", value); } /* - * Preliminary support for display switching. As of now: 0x01 should activate + * Experimental support for display switching. As of now: 0x01 should activate * the LCD output, 0x02 should do for CRT, and 0x04 for TV-Out. Any combination * (bitwise) of these will suffice. I never actually tested 3 displays hooked up * simultaneously, so be warned. @@ -562,13 +578,13 @@ if (sscanf(buffer, "%d", &value) == 1) set_display(value, hotk); else { - printk(KERN_NOTICE "Asus ACPI: Error reading user input\n"); + printk(KERN_WARNING "Asus ACPI: Error reading user input\n"); } return count; } -static int asus_hotk_add_fs(struct acpi_device *device) +static int __init asus_hotk_add_fs(struct acpi_device *device) { struct proc_dir_entry *proc; struct asus_hotk *hotk = acpi_driver_data(device); @@ -582,7 +598,7 @@ if ((asus_uid == 0) && (asus_gid == 0)){ mode = S_IFREG | S_IRUGO | S_IWUGO; - }else{ + } else { mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP; } @@ -598,7 +614,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_INFOS + printk(KERN_WARNING " Unable to create " PROC_INFOS " fs entry\n"); } @@ -612,7 +628,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_WLED + printk(KERN_WARNING " Unable to create " PROC_WLED " fs entry\n"); } } @@ -627,7 +643,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_MLED + printk(KERN_WARNING " Unable to create " PROC_MLED " fs entry\n"); } } @@ -646,7 +662,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_LCD + printk(KERN_WARNING " Unable to create " PROC_LCD " fs entry\n"); } } @@ -662,7 +678,7 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_BRN + printk(KERN_WARNING " Unable to create " PROC_BRN " fs entry\n"); } } @@ -677,19 +693,19 @@ proc->uid = asus_uid; proc->gid = asus_gid;; } else { - printk(KERN_NOTICE " Unable to create " PROC_DISP + printk(KERN_WARNING " Unable to create " PROC_DISP " fs entry\n"); } } - return (AE_OK); + return 0; } static void asus_hotk_notify(acpi_handle handle, u32 event, void *data) { /* TODO Find a better way to handle events count. Here, in data, we receive - * the hotk, so we can make anything !! + * the hotk, so we can do anything! */ struct asus_hotk *hotk = (struct asus_hotk *) data; @@ -712,19 +728,40 @@ * This function is used to initialize the hotk with right values. In this * method, we can make all the detection we want, and modify the hotk struct */ -static int asus_hotk_get_info(struct asus_hotk *hotk) +static int __init asus_hotk_get_info(struct asus_hotk *hotk) { struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *model = NULL; + int bsts_result; + acpi_status status; - /* - * We have to write 0 on init this far for all ASUS models + /* + * Get DSDT headers early enough to allow for differentiating between + * models, but late enough to allow acpi_bus_register_driver() to fail + * before doing anything ACPI-specific. Should we encounter a machine, + * which needs special handling (i.e. its hotkey device has a different + * HID), this bit will be moved. A global variable asus_info contains + * the DSDT header. */ + status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt); + if (ACPI_FAILURE(status)) + printk(KERN_WARNING " Couldn't get the DSDT table header\n"); + else + asus_info = (struct acpi_table_header *) dsdt.pointer; + + /* We have to write 0 on init this far for all ASUS models */ if (!write_acpi_int(hotk->handle, "INIT", 0, &buffer)) { - printk(KERN_NOTICE " Hotkey initialization failed\n"); + printk(KERN_ERR " Hotkey initialization failed\n"); return -ENODEV; } + /* For testing purposes */ + if (!read_acpi_int(hotk->handle, "BSTS", &bsts_result)) + printk(KERN_WARNING " Error calling BSTS\n"); + else if (bsts_result) + printk(KERN_NOTICE " BSTS called, 0x%02x returned\n", bsts_result); + /* * Here, we also use asus_info to make decision. For example, on INIT * method, S1X and L1X models both reports to be L84F, but they don't @@ -749,26 +786,34 @@ hotk->model = L3X; else if (strncmp(model->string.pointer, "M2", 2) == 0) hotk->model = M2X; + else if (strncmp(model->string.pointer, "M3N", 3) == 0 || + strncmp(model->string.pointer, "S1N", 3) == 0) + hotk->model = M3N; /* S1300N is similar enough */ else if (strncmp(model->string.pointer, "L2", 2) == 0) hotk->model = L2X; - else if (strncmp(model->string.pointer, "L8", 2) == 0) + else if (strncmp(model->string.pointer, "L8", 2) == 0) { /* S1300A reports L84F, but L1400B too */ - if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) - hotk->model = L1X; - else + if (asus_info) { + if (strncmp(asus_info->oem_table_id, "L1", 2) == 0) + hotk->model = L1X; + } else hotk->model = S1X; + } else if (strncmp(model->string.pointer, "D1", 2) == 0) hotk->model = D1X; else if (strncmp(model->string.pointer, "A1", 2) == 0) hotk->model = A1X; + else if (strncmp(model->string.pointer, "A2", 2) == 0) + hotk->model = A2X; else if (strncmp(model->string.pointer, "J1", 2) == 0) - hotk->model = J1X; - + hotk->model = S2X; + else if (strncmp(model->string.pointer, "L5", 2) == 0) + hotk->model = L5X; if (hotk->model == END_MODEL) { /* By default use the same values, as I don't know others */ - printk("unsupported, trying default values, contact the " - "developers\n"); + printk("unsupported, trying default values, supply the " + "developers with your DSDT\n"); hotk->model = L2X; } else { printk("supported\n"); @@ -783,7 +828,7 @@ -static int asus_hotk_check(struct asus_hotk *hotk) +static int __init asus_hotk_check(struct asus_hotk *hotk) { int result = 0; @@ -797,7 +842,7 @@ if (hotk->device->status.present) { result = asus_hotk_get_info(hotk); } else { - printk(KERN_NOTICE " Hotkey device not present, aborting\n"); + printk(KERN_ERR " Hotkey device not present, aborting\n"); return(-EINVAL); } @@ -806,7 +851,7 @@ -static int asus_hotk_add(struct acpi_device *device) +static int __init asus_hotk_add(struct acpi_device *device) { struct asus_hotk *hotk = NULL; acpi_status status = AE_OK; @@ -815,6 +860,9 @@ if (!device) return(-EINVAL); + printk(KERN_NOTICE "Asus Laptop ACPI Extras version %s\n", + ASUS_ACPI_VERSION); + hotk = (struct asus_hotk *) kmalloc(sizeof(struct asus_hotk), GFP_KERNEL); if (!hotk) @@ -842,25 +890,23 @@ */ status = acpi_install_notify_handler(hotk->handle, ACPI_SYSTEM_NOTIFY, asus_hotk_notify, hotk); - if (ACPI_FAILURE(status)) { - printk(KERN_NOTICE - " Error installing notify handler\n"); - } else { - printk(KERN_DEBUG - " Notify Handler installed successfully\n"); - } + if (ACPI_FAILURE(status)) + printk(KERN_ERR " Error installing notify handler\n"); - /* For HOTK laptops: init the hotk->brightness value */ + /* For laptops without GPLV: init the hotk->brightness value */ if ((!hotk->methods->brightness_get) && (!hotk->methods->brightness_status) && (hotk->methods->brightness_up && hotk->methods->brightness_down)) { status = acpi_evaluate_object(NULL, hotk->methods->brightness_down, NULL, NULL); if (ACPI_FAILURE(status)) - printk(KERN_NOTICE " Error changing brightness\n"); - status = acpi_evaluate_object(NULL, hotk->methods->brightness_up, - NULL, NULL); - if (ACPI_FAILURE(status)) - printk(KERN_NOTICE " Error changing brightness\n"); + printk(KERN_WARNING " Error changing brightness\n"); + else { + status = acpi_evaluate_object(NULL, hotk->methods->brightness_up, + NULL, NULL); + if (ACPI_FAILURE(status)) + printk(KERN_WARNING " Strange, error changing" + " brightness\n"); + } } end: @@ -887,7 +933,7 @@ status = acpi_remove_notify_handler(hotk->handle, ACPI_SYSTEM_NOTIFY, asus_hotk_notify); if (ACPI_FAILURE(status)) - printk(KERN_NOTICE "Error removing notify handler\n"); + printk(KERN_ERR "Asus ACPI: Error removing notify handler\n"); kfree(hotk); @@ -899,35 +945,17 @@ static int __init asus_acpi_init(void) { - int result = 0; - acpi_status status = 0; - struct acpi_buffer dsdt = { ACPI_ALLOCATE_BUFFER, NULL }; - - printk(KERN_NOTICE "Asus Laptop ACPI Extras version %s\n", - ASUS_ACPI_VERSION); - /* - * Here is the code to know the model we are running on. We need to - * know this before calling the acpi_bus_register_driver function, in - * case the HID for the laptop we are running on is different from - * ACPI_HOTK_HID, which I have never seen yet :) - * - * This information is then available in the global var asus_info - */ - status = acpi_get_table(ACPI_TABLE_DSDT, 1, &dsdt); - if (ACPI_FAILURE(status)) { - printk(KERN_NOTICE " Couldn't get the DSDT table header\n"); - } else { - asus_info = (struct acpi_table_header *) dsdt.pointer; - } + int result; asus_proc_dir = proc_mkdir(PROC_ASUS, acpi_root_dir); - if (!asus_proc_dir) + if (!asus_proc_dir) { + printk(KERN_ERR "Asus ACPI: Unable to create /proc entry"); return(-ENODEV); + } asus_proc_dir->owner = THIS_MODULE; result = acpi_bus_register_driver(&asus_hotk_driver); if (result < 0) { - printk(KERN_NOTICE " Error registering " ACPI_HOTK_NAME " \n"); remove_proc_entry(PROC_ASUS, acpi_root_dir); return(-ENODEV); } diff -Nru a/drivers/acpi/bus.c b/drivers/acpi/bus.c --- a/drivers/acpi/bus.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/bus.c Wed Oct 8 12:24:57 2003 @@ -634,8 +634,7 @@ * the EC parameters out of that. */ status = acpi_ec_ecdt_probe(); - if (ACPI_FAILURE(status)) - goto error1; + /* Ignore result. Not having an ECDT is not fatal. */ #endif status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION); diff -Nru a/drivers/acpi/dispatcher/dsfield.c b/drivers/acpi/dispatcher/dsfield.c --- a/drivers/acpi/dispatcher/dsfield.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/dispatcher/dsfield.c Wed Oct 8 12:24:57 2003 @@ -105,27 +105,33 @@ return_ACPI_STATUS (AE_AML_NO_OPERAND); } - /* - * During the load phase, we want to enter the name of the field into - * the namespace. During the execute phase (when we evaluate the size - * operand), we want to lookup the name - */ - if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) { - flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE; + if (walk_state->deferred_node) { + node = walk_state->deferred_node; + status = AE_OK; } else { - flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND; - } + /* + * During the load phase, we want to enter the name of the field into + * the namespace. During the execute phase (when we evaluate the size + * operand), we want to lookup the name + */ + if (walk_state->parse_flags & ACPI_PARSE_EXECUTE) { + flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE; + } + else { + flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_ERROR_IF_FOUND; + } - /* - * Enter the name_string into the namespace - */ - status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, - ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, - flags, walk_state, &(node)); - if (ACPI_FAILURE (status)) { - ACPI_REPORT_NSERROR (arg->common.value.string, status); - return_ACPI_STATUS (status); + /* + * Enter the name_string into the namespace + */ + status = acpi_ns_lookup (walk_state->scope_info, arg->common.value.string, + ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1, + flags, walk_state, &(node)); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (arg->common.value.string, status); + return_ACPI_STATUS (status); + } } /* We could put the returned object (Node) on the object stack for later, but diff -Nru a/drivers/acpi/dispatcher/dsinit.c b/drivers/acpi/dispatcher/dsinit.c --- a/drivers/acpi/dispatcher/dsinit.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/dispatcher/dsinit.c Wed Oct 8 12:24:57 2003 @@ -135,7 +135,7 @@ } /* - * Always parse methods to detect errors, we may delete + * Always parse methods to detect errors, we will delete * the parse tree below */ status = acpi_ds_parse_method (obj_handle); @@ -150,7 +150,7 @@ } /* - * Delete the parse tree. We simple re-parse the method + * Delete the parse tree. We simply re-parse the method * for every execution since there isn't much overhead */ acpi_ns_delete_namespace_subtree (obj_handle); diff -Nru a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c --- a/drivers/acpi/dispatcher/dsopcode.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/dispatcher/dsopcode.c Wed Oct 8 12:24:57 2003 @@ -65,7 +65,7 @@ * * RETURN: Status. * - * DESCRIPTION: Late execution of region or field arguments + * DESCRIPTION: Late (deferred) execution of region or field arguments * ****************************************************************************/ @@ -111,7 +111,10 @@ return_ACPI_STATUS (status); } + /* Mark this parse as a deferred opcode */ + walk_state->parse_flags = ACPI_PARSE_DEFERRED_OP; + walk_state->deferred_node = node; /* Pass1: Parse the entire declaration */ @@ -128,7 +131,7 @@ arg->common.node = node; acpi_ps_delete_parse_tree (op); - /* Evaluate the address and length arguments for the Buffer Field */ + /* Evaluate the deferred arguments */ op = acpi_ps_alloc_op (AML_INT_EVAL_SUBTREE_OP); if (!op) { @@ -144,6 +147,8 @@ return_ACPI_STATUS (AE_NO_MEMORY); } + /* Execute the opcode and arguments */ + status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start, aml_length, NULL, NULL, 3); if (ACPI_FAILURE (status)) { @@ -151,6 +156,9 @@ return_ACPI_STATUS (status); } + /* Mark this execution as a deferred opcode */ + + walk_state->deferred_node = node; status = acpi_ps_parse_aml (walk_state); acpi_ps_delete_parse_tree (op); return_ACPI_STATUS (status); @@ -192,7 +200,7 @@ node = obj_desc->buffer_field.node; ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL)); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field JIT Init\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n", node->name.ascii)); /* Execute the AML code for the term_arg arguments */ @@ -207,7 +215,7 @@ * * FUNCTION: acpi_ds_get_buffer_arguments * - * PARAMETERS: obj_desc - A valid Bufferobject + * PARAMETERS: obj_desc - A valid Buffer object * * RETURN: Status. * @@ -240,7 +248,7 @@ return_ACPI_STATUS (AE_AML_INTERNAL); } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer JIT Init\n")); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n")); /* Execute the AML code for the term_arg arguments */ @@ -254,7 +262,7 @@ * * FUNCTION: acpi_ds_get_package_arguments * - * PARAMETERS: obj_desc - A valid Packageobject + * PARAMETERS: obj_desc - A valid Package object * * RETURN: Status. * @@ -287,7 +295,7 @@ return_ACPI_STATUS (AE_AML_INTERNAL); } - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package JIT Init\n")); + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n")); /* Execute the AML code for the term_arg arguments */ @@ -335,11 +343,12 @@ node = obj_desc->region.node; - ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL)); + ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL)); - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Init at AML %p\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Arg Init at AML %p\n", node->name.ascii, extra_desc->extra.aml_start)); + /* Execute the argument AML */ status = acpi_ds_execute_arguments (node, acpi_ns_get_parent_node (node), extra_desc->extra.aml_length, extra_desc->extra.aml_start); @@ -505,14 +514,16 @@ goto cleanup; } - /* Entire field must fit within the current length of the buffer */ if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, - "Field size %d exceeds Buffer size %d (bits)\n", - bit_offset + bit_count, 8 * (u32) buffer_desc->buffer.length)); + "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n", + ((struct acpi_namespace_node *) result_desc)->name.ascii, + bit_offset + bit_count, + buffer_desc->buffer.node->name.ascii, + 8 * (u32) buffer_desc->buffer.length)); status = AE_AML_BUFFER_LIMIT; goto cleanup; } diff -Nru a/drivers/acpi/dispatcher/dsutils.c b/drivers/acpi/dispatcher/dsutils.c --- a/drivers/acpi/dispatcher/dsutils.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/dispatcher/dsutils.c Wed Oct 8 12:24:56 2003 @@ -53,6 +53,7 @@ #define _COMPONENT ACPI_DISPATCHER ACPI_MODULE_NAME ("dsutils") + #ifndef ACPI_NO_METHOD_EXECUTION /******************************************************************************* @@ -196,7 +197,6 @@ acpi_ps_get_opcode_name (op->common.parent->common.aml_opcode), op)); return_VALUE (FALSE); - } @@ -239,7 +239,6 @@ return_VOID; } - if (!acpi_ds_is_result_used (op, walk_state)) { /* * Must pop the result stack (obj_desc should be equal to result_obj) @@ -389,61 +388,77 @@ * in name_string */ + /* - * Differentiate between a namespace "create" operation - * versus a "lookup" operation (IMODE_LOAD_PASS2 vs. - * IMODE_EXECUTE) in order to support the creation of - * namespace objects during the execution of control methods. + * Special handling for buffer_field declarations. This is a deferred + * opcode that unfortunately defines the field name as the last + * parameter instead of the first. We get here when we are performing + * the deferred execution, so the actual name of the field is already + * in the namespace. We don't want to attempt to look it up again + * because we may be executing in a different scope than where the + * actual opcode exists. */ - parent_op = arg->common.parent; - op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode); - if ((op_info->flags & AML_NSNODE) && - (parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) && - (parent_op->common.aml_opcode != AML_REGION_OP) && - (parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) { - /* Enter name into namespace if not found */ - - interpreter_mode = ACPI_IMODE_LOAD_PASS2; + if ((walk_state->deferred_node) && + (walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) && + (arg_index != 0)) { + obj_desc = ACPI_CAST_PTR (union acpi_operand_object, walk_state->deferred_node); + status = AE_OK; } + else /* All other opcodes */ { + /* + * Differentiate between a namespace "create" operation + * versus a "lookup" operation (IMODE_LOAD_PASS2 vs. + * IMODE_EXECUTE) in order to support the creation of + * namespace objects during the execution of control methods. + */ + parent_op = arg->common.parent; + op_info = acpi_ps_get_opcode_info (parent_op->common.aml_opcode); + if ((op_info->flags & AML_NSNODE) && + (parent_op->common.aml_opcode != AML_INT_METHODCALL_OP) && + (parent_op->common.aml_opcode != AML_REGION_OP) && + (parent_op->common.aml_opcode != AML_INT_NAMEPATH_OP)) { + /* Enter name into namespace if not found */ - else { - /* Return a failure if name not found */ - - interpreter_mode = ACPI_IMODE_EXECUTE; - } + interpreter_mode = ACPI_IMODE_LOAD_PASS2; + } + else { + /* Return a failure if name not found */ - status = acpi_ns_lookup (walk_state->scope_info, name_string, - ACPI_TYPE_ANY, interpreter_mode, - ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, - walk_state, - ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc)); - /* - * The only case where we pass through (ignore) a NOT_FOUND - * error is for the cond_ref_of opcode. - */ - if (status == AE_NOT_FOUND) { - if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) { - /* - * For the Conditional Reference op, it's OK if - * the name is not found; We just need a way to - * indicate this to the interpreter, set the - * object to the root - */ - obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node); - status = AE_OK; + interpreter_mode = ACPI_IMODE_EXECUTE; } - else { - /* - * We just plain didn't find it -- which is a - * very serious error at this point - */ - status = AE_AML_NAME_NOT_FOUND; + status = acpi_ns_lookup (walk_state->scope_info, name_string, + ACPI_TYPE_ANY, interpreter_mode, + ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, + walk_state, + ACPI_CAST_INDIRECT_PTR (struct acpi_namespace_node, &obj_desc)); + /* + * The only case where we pass through (ignore) a NOT_FOUND + * error is for the cond_ref_of opcode. + */ + if (status == AE_NOT_FOUND) { + if (parent_op->common.aml_opcode == AML_COND_REF_OF_OP) { + /* + * For the Conditional Reference op, it's OK if + * the name is not found; We just need a way to + * indicate this to the interpreter, set the + * object to the root + */ + obj_desc = ACPI_CAST_PTR (union acpi_operand_object, acpi_gbl_root_node); + status = AE_OK; + } + else { + /* + * We just plain didn't find it -- which is a + * very serious error at this point + */ + status = AE_AML_NAME_NOT_FOUND; + } } - } - if (ACPI_FAILURE (status)) { - ACPI_REPORT_NSERROR (name_string, status); + if (ACPI_FAILURE (status)) { + ACPI_REPORT_NSERROR (name_string, status); + } } /* Free the namestring created above */ @@ -464,8 +479,6 @@ } ACPI_DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state)); } - - else { /* Check for null name case */ @@ -480,7 +493,6 @@ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Null namepath: Arg=%p\n", arg)); } - else { opcode = arg->common.aml_opcode; } diff -Nru a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c --- a/drivers/acpi/dispatcher/dswload.c Wed Oct 8 12:24:55 2003 +++ b/drivers/acpi/dispatcher/dswload.c Wed Oct 8 12:24:55 2003 @@ -248,6 +248,14 @@ * buffer_field, or Package), the name of the object is already * in the namespace. */ + if (walk_state->deferred_node) { + /* This name is already in the namespace, get the node */ + + node = walk_state->deferred_node; + status = AE_OK; + break; + } + flags = ACPI_NS_NO_UPSEARCH; if ((walk_state->opcode != AML_SCOPE_OP) && (!(walk_state->parse_flags & ACPI_PARSE_DEFERRED_OP))) { @@ -589,7 +597,17 @@ * Enter the named type into the internal namespace. We enter the name * as we go downward in the parse tree. Any necessary subobjects that involve * arguments to the opcode must be created as we go back up the parse tree later. + * + * Note: Name may already exist if we are executing a deferred opcode. */ + if (walk_state->deferred_node) { + /* This name is already in the namespace, get the node */ + + node = walk_state->deferred_node; + status = AE_OK; + break; + } + status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, object_type, ACPI_IMODE_EXECUTE, ACPI_NS_NO_UPSEARCH, walk_state, &(node)); break; diff -Nru a/drivers/acpi/dispatcher/dswscope.c b/drivers/acpi/dispatcher/dswscope.c --- a/drivers/acpi/dispatcher/dswscope.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/dispatcher/dswscope.c Wed Oct 8 12:24:57 2003 @@ -121,10 +121,9 @@ /* Make sure object type is valid */ if (!acpi_ut_valid_object_type (type)) { - ACPI_REPORT_WARNING (("ds_scope_stack_push: type code out of range\n")); + ACPI_REPORT_WARNING (("ds_scope_stack_push: Invalid object type: 0x%X\n", type)); } - /* Allocate a new scope object */ scope_info = acpi_ut_create_generic_state (); @@ -146,13 +145,13 @@ old_scope_info = walk_state->scope_info; if (old_scope_info) { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, - "[%4.4s] (%10s)", + "[%4.4s] (%s)", old_scope_info->scope.node->name.ascii, acpi_ut_get_type_name (old_scope_info->common.value))); } else { ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, - "[\\___] (%10s)", "ROOT")); + "[\\___] (%s)", "ROOT")); } ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, @@ -163,7 +162,6 @@ /* Push new scope object onto stack */ acpi_ut_push_generic_state (&walk_state->scope_info, scope_info); - return_ACPI_STATUS (AE_OK); } @@ -207,7 +205,7 @@ walk_state->scope_depth--; ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, - "[%.2d] Popped scope [%4.4s] (%10s), New scope -> ", + "[%.2d] Popped scope [%4.4s] (%s), New scope -> ", (u32) walk_state->scope_depth, scope_info->scope.node->name.ascii, acpi_ut_get_type_name (scope_info->common.value))); @@ -225,7 +223,6 @@ } acpi_ut_delete_generic_state (scope_info); - return_ACPI_STATUS (AE_OK); } diff -Nru a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c --- a/drivers/acpi/dispatcher/dswstate.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/dispatcher/dswstate.c Wed Oct 8 12:24:57 2003 @@ -56,11 +56,12 @@ * FUNCTION: acpi_ds_result_insert * * PARAMETERS: Object - Object to push + * Index - Where to insert the object * walk_state - Current Walk state * * RETURN: Status * - * DESCRIPTION: Push an object onto this walk's result stack + * DESCRIPTION: Insert an object onto this walk's result stack * ******************************************************************************/ @@ -114,6 +115,7 @@ * FUNCTION: acpi_ds_result_remove * * PARAMETERS: Object - Where to return the popped object + * Index - Where to extract the object * walk_state - Current Walk state * * RETURN: Status @@ -233,6 +235,7 @@ return (AE_AML_NO_RETURN_VALUE); } + /******************************************************************************* * * FUNCTION: acpi_ds_result_pop_from_bottom @@ -295,7 +298,6 @@ *object, (*object) ? acpi_ut_get_object_type_name (*object) : "NULL", state, walk_state)); - return (AE_OK); } @@ -358,8 +360,7 @@ * * FUNCTION: acpi_ds_result_stack_push * - * PARAMETERS: Object - Object to push - * walk_state - Current Walk state + * PARAMETERS: walk_state - Current Walk state * * RETURN: Status * @@ -420,7 +421,6 @@ return (AE_AML_NO_OPERAND); } - state = acpi_ut_pop_generic_state (&walk_state->results); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, @@ -572,6 +572,7 @@ } #endif + /******************************************************************************* * * FUNCTION: acpi_ds_obj_stack_pop @@ -641,6 +642,7 @@ u32 i; union acpi_operand_object *obj_desc; + ACPI_FUNCTION_NAME ("ds_obj_stack_pop_and_delete"); @@ -883,8 +885,15 @@ * FUNCTION: acpi_ds_init_aml_walk * * PARAMETERS: walk_state - New state to be initialized + * Op - Current parse op + * method_node - Control method NS node, if any + * aml_start - Start of AML + * aml_length - Length of AML + * Params - Method args, if any + * return_obj_desc - Where to store a return object, if any + * pass_number - 1, 2, or 3 * - * RETURN: None + * RETURN: Status * * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk * @@ -927,9 +936,9 @@ if (method_node) { walk_state->parser_state.start_node = method_node; - walk_state->walk_type = ACPI_WALK_METHOD; - walk_state->method_node = method_node; - walk_state->method_desc = acpi_ns_get_attached_object (method_node); + walk_state->walk_type = ACPI_WALK_METHOD; + walk_state->method_node = method_node; + walk_state->method_desc = acpi_ns_get_attached_object (method_node); /* Push start scope on scope stack and make it current */ @@ -956,6 +965,7 @@ while (extra_op && !extra_op->common.node) { extra_op = extra_op->common.parent; } + if (!extra_op) { parser_state->start_node = NULL; } @@ -1014,7 +1024,7 @@ ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "%p walk still has a scope list\n", walk_state)); } - /* Always must free any linked control states */ + /* Always must free any linked control states */ while (walk_state->control_state) { state = walk_state->control_state; diff -Nru a/drivers/acpi/ec.c b/drivers/acpi/ec.c --- a/drivers/acpi/ec.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/ec.c Wed Oct 8 12:24:56 2003 @@ -32,7 +32,7 @@ #include #include #include - +#include #define _COMPONENT ACPI_EC_COMPONENT ACPI_MODULE_NAME ("acpi_ec") @@ -412,7 +412,10 @@ * The EC object is in the handler context and is needed * when calling the acpi_ec_space_handler. */ - *return_context = handler_context; + if(function == ACPI_REGION_DEACTIVATE) + *return_context = NULL; + else + *return_context = handler_context; return AE_OK; } diff -Nru a/drivers/acpi/events/evregion.c b/drivers/acpi/events/evregion.c --- a/drivers/acpi/events/evregion.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/events/evregion.c Wed Oct 8 12:24:57 2003 @@ -382,7 +382,7 @@ union acpi_operand_object *obj_desc; union acpi_operand_object **last_obj_ptr; acpi_adr_space_setup region_setup; - void *region_context; + void **region_context; union acpi_operand_object *region_obj2; acpi_status status; @@ -394,7 +394,7 @@ if (!region_obj2) { return_VOID; } - region_context = region_obj2->extra.region_context; + region_context = ®ion_obj2->extra.region_context; /* Get the address handler from the region object */ @@ -450,7 +450,7 @@ region_setup = handler_obj->address_space.setup; status = region_setup (region_obj, ACPI_REGION_DEACTIVATE, - handler_obj->address_space.context, ®ion_context); + handler_obj->address_space.context, region_context); /* Init routine may fail, Just ignore errors */ diff -Nru a/drivers/acpi/executer/excreate.c b/drivers/acpi/executer/excreate.c --- a/drivers/acpi/executer/excreate.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/executer/excreate.c Wed Oct 8 12:24:57 2003 @@ -286,7 +286,7 @@ ACPI_FUNCTION_TRACE ("ex_create_region"); - /* Get the Node from the object stack */ + /* Get the Namespace Node */ node = walk_state->op->common.node; @@ -311,7 +311,6 @@ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n", acpi_ut_get_region_name (region_space), region_space)); - /* Create the region descriptor */ obj_desc = acpi_ut_create_internal_object (ACPI_TYPE_REGION); @@ -375,6 +374,7 @@ ACPI_FUNCTION_TRACE ("ex_create_table_region"); + /* Get the Node from the object stack */ node = walk_state->op->common.node; @@ -392,7 +392,6 @@ status = acpi_tb_find_table (operand[1]->string.pointer, operand[2]->string.pointer, operand[3]->string.pointer, &table); - if (ACPI_FAILURE (status)) { return_ACPI_STATUS (status); } @@ -489,7 +488,6 @@ status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0], obj_desc, ACPI_TYPE_PROCESSOR); - /* Remove local reference to the object */ acpi_ut_remove_reference (obj_desc); @@ -540,7 +538,6 @@ status = acpi_ns_attach_object ((struct acpi_namespace_node *) operand[0], obj_desc, ACPI_TYPE_POWER); - /* Remove local reference to the object */ acpi_ut_remove_reference (obj_desc); @@ -609,7 +606,6 @@ obj_desc->method.concurrency = (u8) (((method_flags & METHOD_FLAGS_SYNCH_LEVEL) >> 4) + 1); } - else { obj_desc->method.concurrency = INFINITE_CONCURRENCY; } diff -Nru a/drivers/acpi/executer/exfldio.c b/drivers/acpi/executer/exfldio.c --- a/drivers/acpi/executer/exfldio.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/executer/exfldio.c Wed Oct 8 12:24:56 2003 @@ -139,7 +139,41 @@ field_datum_byte_offset, obj_desc->common_field.access_byte_width, rgn_desc->region.node->name.ascii, rgn_desc->region.length)); - return_ACPI_STATUS (AE_AML_REGION_LIMIT); + #ifdef CONFIG_ACPI_RELAXED_AML + { + /* + * Allow access to the field if it is within the region size + * rounded up to a multiple of the access byte width. This + * overcomes "off-by-one" programming errors in the AML often + * found in Toshiba laptops. These errors were allowed by + * the Microsoft ASL compiler. + */ + u32 rounded_length = ACPI_ROUND_UP(rgn_desc->region.length, + obj_desc->common_field.access_byte_width); + + if (rounded_length < (obj_desc->common_field.base_byte_offset + + field_datum_byte_offset + + obj_desc->common_field.access_byte_width)) { + return_ACPI_STATUS (AE_AML_REGION_LIMIT); + } else { + static int warn_once = 1; + if (warn_once) { + // Could also associate a flag with each field, and + // warn once for each field. + ACPI_REPORT_WARNING(( + "The ACPI AML in your computer contains errors, " + "please nag the manufacturer to correct it.\n")); + ACPI_REPORT_WARNING(( + "Allowing relaxed access to fields; " + "turn on CONFIG_ACPI_DEBUG for details.\n")); + warn_once = 0; + } + return_ACPI_STATUS (AE_OK); + } + } + #else + return_ACPI_STATUS (AE_AML_REGION_LIMIT); + #endif } return_ACPI_STATUS (AE_OK); diff -Nru a/drivers/acpi/namespace/nsdump.c b/drivers/acpi/namespace/nsdump.c --- a/drivers/acpi/namespace/nsdump.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/namespace/nsdump.c Wed Oct 8 12:24:57 2003 @@ -234,7 +234,7 @@ case ACPI_TYPE_DEVICE: - acpi_os_printf ("Notify object: %p", obj_desc); + acpi_os_printf ("Notify Object: %p\n", obj_desc); break; @@ -371,7 +371,7 @@ case ACPI_TYPE_LOCAL_BANK_FIELD: case ACPI_TYPE_LOCAL_INDEX_FIELD: - acpi_os_printf (" Off %.2X Len %.2X Acc %.2hd\n", + acpi_os_printf ("Off %.2X Len %.2X Acc %.2hd\n", (obj_desc->common_field.base_byte_offset * 8) + obj_desc->common_field.start_field_bit_offset, obj_desc->common_field.bit_length, diff -Nru a/drivers/acpi/namespace/nssearch.c b/drivers/acpi/namespace/nssearch.c --- a/drivers/acpi/namespace/nssearch.c Wed Oct 8 12:24:57 2003 +++ b/drivers/acpi/namespace/nssearch.c Wed Oct 8 12:24:57 2003 @@ -96,7 +96,7 @@ scope_name = acpi_ns_get_external_pathname (node); if (scope_name) { - ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s [%p] For %4.4s (%s)\n", + ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Searching %s (%p) For [%4.4s] (%s)\n", scope_name, node, (char *) &target_name, acpi_ut_get_type_name (type))); ACPI_MEM_FREE (scope_name); @@ -117,9 +117,9 @@ * Found matching entry. */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Name %4.4s Type [%s] found in scope [%4.4s] %p\n", + "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n", (char *) &target_name, acpi_ut_get_type_name (next_node->type), - next_node->name.ascii, next_node)); + next_node, node->name.ascii, node)); *return_node = next_node; return_ACPI_STATUS (AE_OK); @@ -143,7 +143,7 @@ /* Searched entire namespace level, not found */ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, - "Name %4.4s Type [%s] not found in search in scope [%4.4s] %p first child %p\n", + "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n", (char *) &target_name, acpi_ut_get_type_name (type), node->name.ascii, node, node->child)); diff -Nru a/drivers/acpi/namespace/nsutils.c b/drivers/acpi/namespace/nsutils.c --- a/drivers/acpi/namespace/nsutils.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/namespace/nsutils.c Wed Oct 8 12:24:56 2003 @@ -175,6 +175,11 @@ acpi_status status; + if (!node) { + acpi_os_printf ("[NULL NAME]"); + return; + } + /* Convert handle to a full pathname and print it (with supplied message) */ buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER; @@ -470,11 +475,11 @@ *result = 0; if (info->fully_qualified) { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (abs) \"\\%s\"\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (abs) \"\\%s\"\n", internal_name, internal_name)); } else { - ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "returning [%p] (rel) \"%s\"\n", + ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n", internal_name, internal_name)); } diff -Nru a/drivers/acpi/parser/psparse.c b/drivers/acpi/parser/psparse.c --- a/drivers/acpi/parser/psparse.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/parser/psparse.c Wed Oct 8 12:24:56 2003 @@ -437,7 +437,6 @@ return_ACPI_STATUS (AE_BAD_PARAMETER); } - parser_state = &walk_state->parser_state; walk_state->arg_types = 0; @@ -705,10 +704,9 @@ walk_state->arg_types = 0; break; - default: - /* Op is not a constant or string, append each argument */ + /* Op is not a constant or string, append each argument to the Op */ while (GET_CURRENT_ARG_TYPE (walk_state->arg_types) && !walk_state->arg_count) { @@ -727,23 +725,23 @@ INCREMENT_ARG_LIST (walk_state->arg_types); } + /* Special processing for certain opcodes */ + switch (op->common.aml_opcode) { case AML_METHOD_OP: - /* For a method, save the length and address of the body */ - /* - * Skip parsing of control method or opregion body, + * Skip parsing of control method * because we don't have enough info in the first pass - * to parse them correctly. + * to parse it correctly. + * + * Save the length and address of the body */ op->named.data = parser_state->aml; op->named.length = (u32) (parser_state->pkg_end - parser_state->aml); - /* - * Skip body of method. For op_regions, we must continue - * parsing because the opregion is not a standalone - * package (We don't know where the end is). - */ + + /* Skip body of method */ + parser_state->aml = parser_state->pkg_end; walk_state->arg_count = 0; break; @@ -756,15 +754,15 @@ (op->common.parent->common.aml_opcode == AML_NAME_OP) && (walk_state->descending_callback != acpi_ds_exec_begin_op)) { /* - * Skip parsing of + * Skip parsing of Buffers and Packages * because we don't have enough info in the first pass * to parse them correctly. */ op->named.data = aml_op_start; op->named.length = (u32) (parser_state->pkg_end - aml_op_start); - /* - * Skip body - */ + + /* Skip body */ + parser_state->aml = parser_state->pkg_end; walk_state->arg_count = 0; } @@ -778,6 +776,7 @@ break; default: + /* No action for all other opcodes */ break; } diff -Nru a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c --- a/drivers/acpi/pci_irq.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/pci_irq.c Wed Oct 8 12:24:56 2003 @@ -71,6 +71,9 @@ ACPI_FUNCTION_TRACE("acpi_pci_irq_find_prt_entry"); + if (!acpi_prt.count) + return_PTR(NULL); + /* * Parse through all PRT entries looking for a match on the specified * PCI device's segment, bus, device, and pin (don't care about func). diff -Nru a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c --- a/drivers/acpi/pci_link.c Wed Oct 8 12:24:55 2003 +++ b/drivers/acpi/pci_link.c Wed Oct 8 12:24:55 2003 @@ -220,7 +220,6 @@ return AE_CTRL_TERMINATE; } - static int acpi_pci_link_get_current ( struct acpi_pci_link *link) @@ -279,6 +278,28 @@ return_VALUE(result); } +static int +acpi_pci_link_try_get_current ( + struct acpi_pci_link *link, + int irq) +{ + int result; + + ACPI_FUNCTION_TRACE("acpi_pci_link_try_get_current"); + + result = acpi_pci_link_get_current(link); + if (result && link->irq.active) { + return_VALUE(result); + } + + if (!link->irq.active) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "No active IRQ resource found\n")); + printk(KERN_WARNING "_CRS returns NULL! Using IRQ %d for device (%s [%s]).\n", irq, acpi_device_name(link->device), acpi_device_bid(link->device)); + link->irq.active = irq; + } + + return 0; +} static int acpi_pci_link_set ( @@ -294,6 +315,7 @@ struct acpi_buffer buffer = {sizeof(resource)+1, &resource}; int i = 0; int valid = 0; + int resource_type = 0; ACPI_FUNCTION_TRACE("acpi_pci_link_set"); @@ -317,20 +339,32 @@ } } + /* If IRQ<=15, first try with a "normal" IRQ descriptor. If that fails, try with + * an extended one */ + if (irq <= 15) { + resource_type = ACPI_RSTYPE_IRQ; + } else { + resource_type = ACPI_RSTYPE_EXT_IRQ; + } + +retry_programming: + memset(&resource, 0, sizeof(resource)); /* NOTE: PCI interrupts are always level / active_low / shared. But not all interrupts > 15 are PCI interrupts. Rely on the ACPI IRQ definition for parameters */ - if (irq <= 15) { + switch(resource_type) { + case ACPI_RSTYPE_IRQ: resource.res.id = ACPI_RSTYPE_IRQ; resource.res.length = sizeof(struct acpi_resource); resource.res.data.irq.edge_level = link->irq.edge_level; resource.res.data.irq.active_high_low = link->irq.active_high_low; resource.res.data.irq.number_of_interrupts = 1; resource.res.data.irq.interrupts[0] = irq; - } - else { + break; + + case ACPI_RSTYPE_EXT_IRQ: resource.res.id = ACPI_RSTYPE_EXT_IRQ; resource.res.length = sizeof(struct acpi_resource); resource.res.data.extended_irq.producer_consumer = ACPI_CONSUMER; @@ -339,11 +373,21 @@ resource.res.data.extended_irq.number_of_interrupts = 1; resource.res.data.extended_irq.interrupts[0] = irq; /* ignore resource_source, it's optional */ + break; } resource.end.id = ACPI_RSTYPE_END_TAG; /* Attempt to set the resource */ status = acpi_set_current_resources(link->handle, &buffer); + + /* if we failed and IRQ <= 15, try again with an extended descriptor */ + if (ACPI_FAILURE(status) && (resource_type == ACPI_RSTYPE_IRQ)) { + resource_type = ACPI_RSTYPE_EXT_IRQ; + printk(PREFIX "Retrying with extended IRQ descriptor\n"); + goto retry_programming; + } + + /* check for total failure */ if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _SRS\n")); return_VALUE(-ENODEV); @@ -361,7 +405,7 @@ } /* Make sure the active IRQ is the one we requested. */ - result = acpi_pci_link_get_current(link); + result = acpi_pci_link_try_get_current(link, irq); if (result) { return_VALUE(result); } @@ -456,16 +500,16 @@ irq = link->irq.active; } else { irq = link->irq.possible[0]; - } - /* - * Select the best IRQ. This is done in reverse to promote + /* + * Select the best IRQ. This is done in reverse to promote * the use of IRQs 9, 10, 11, and >15. */ for (i=(link->irq.possible_count-1); i>0; i--) { if (acpi_irq_penalty[irq] > acpi_irq_penalty[link->irq.possible[i]]) irq = link->irq.possible[i]; } + } /* Attempt to enable the link device at this IRQ. */ if (acpi_pci_link_set(link, irq)) { @@ -574,10 +618,6 @@ else printk(" %d", link->irq.possible[i]); } - if (!link->irq.active) - printk(", disabled"); - else if (!found) - printk(", enabled at IRQ %d", link->irq.active); printk(")\n"); /* TBD: Acquire/release lock */ diff -Nru a/drivers/acpi/tables.c b/drivers/acpi/tables.c --- a/drivers/acpi/tables.c Wed Oct 8 12:24:56 2003 +++ b/drivers/acpi/tables.c Wed Oct 8 12:24:56 2003 @@ -69,7 +69,8 @@ static unsigned long sdt_pa; /* Physical Address */ static unsigned long sdt_count; /* Table count */ -static struct acpi_table_sdt *sdt_entry; + +static struct acpi_table_sdt sdt_entry[ACPI_MAX_TABLES]; void acpi_table_print ( @@ -418,12 +419,6 @@ sdt_count = ACPI_MAX_TABLES; } - sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt)); - if (!sdt_entry) { - printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n"); - return -ENOMEM; - } - for (i = 0; i < sdt_count; i++) sdt_entry[i].pa = (unsigned long) mapped_xsdt->entry[i]; } @@ -468,12 +463,6 @@ printk(KERN_WARNING PREFIX "Truncated %lu RSDT entries\n", (sdt_count - ACPI_MAX_TABLES)); sdt_count = ACPI_MAX_TABLES; - } - - sdt_entry = alloc_bootmem(sdt_count * sizeof(struct acpi_table_sdt)); - if (!sdt_entry) { - printk(KERN_ERR "ACPI: Could not allocate mem for SDT entries!\n"); - return -ENOMEM; } for (i = 0; i < sdt_count; i++) diff -Nru a/drivers/acpi/toshiba_acpi.c b/drivers/acpi/toshiba_acpi.c --- a/drivers/acpi/toshiba_acpi.c Wed Oct 8 12:24:55 2003 +++ b/drivers/acpi/toshiba_acpi.c Wed Oct 8 12:24:55 2003 @@ -41,7 +41,6 @@ #include #include #include -#include #include diff -Nru a/drivers/atm/Kconfig b/drivers/atm/Kconfig --- a/drivers/atm/Kconfig Wed Oct 8 12:24:56 2003 +++ b/drivers/atm/Kconfig Wed Oct 8 12:24:56 2003 @@ -32,9 +32,8 @@ The driver works with MMF (-MF or ...F) and UTP-5 (-U5 or ...D) adapters. - This driver is also available as a module. If you want to compile - it as a module, say M here and read - . The module will be called eni. + To compile this driver as a module, choose M here: the module will + be called eni. config ATM_ENI_DEBUG bool "Enable extended debugging" @@ -138,10 +137,8 @@ Driver for the Fujitsu FireStream 155 (MB86697) and FireStream 50 (MB86695) ATM PCI chips. - This driver is also available as a module. If you want to compile - it as a module, say M here and read - . The module will be called - firestream. + To compile this driver as a module, choose M here: the module will + be called firestream. config ATM_ZATM tristate "ZeitNet ZN1221/ZN1225" @@ -150,9 +147,8 @@ Driver for the ZeitNet ZN1221 (MMF) and ZN1225 (UTP-5) 155 Mbps ATM adapters. - This driver is also available as a module. If you want to compile - it as a module, say M here and read - . The module will be called zatm. + To compile this driver as a module, choose M here: the module will + be called zatm. config ATM_ZATM_DEBUG bool "Enable extended debugging" @@ -176,10 +172,8 @@ 25 and for 155 Mbps, including IDT cards and the Fore ForeRunnerLE series. Say Y if you have one of those. - This driver is also available as a module. If you want to compile - it as a module, say M here and read - . The module will be called - nicstar. + To compile this driver as a module, choose M here: the module will + be called nicstar. config ATM_NICSTAR_USE_SUNI bool "Use suni PHY driver (155Mbps)" @@ -209,9 +203,8 @@ help Driver for the IDT 77252 ATM PCI chips. - This driver is also available as a module. If you want to compile - it as a module, say M here and read - . The module will be called idt77252 + To compile this driver as a module, choose M here: the module will + be called idt77252. config ATM_IDT77252_DEBUG bool "Enable debugging messages" diff -Nru a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c --- a/drivers/atm/ambassador.c Wed Oct 8 12:24:55 2003 +++ b/drivers/atm/ambassador.c Wed Oct 8 12:24:55 2003 @@ -1064,7 +1064,8 @@ /********** Open a VC **********/ -static int amb_open (struct atm_vcc * atm_vcc, short vpi, int vci) { +static int amb_open (struct atm_vcc * atm_vcc) +{ int error; struct atm_qos * qos; @@ -1077,6 +1078,8 @@ amb_dev * dev = AMB_DEV(atm_vcc->dev); amb_vcc * vcc; unsigned char pool = -1; // hush gcc + short vpi = atm_vcc->vpi; + int vci = atm_vcc->vci; PRINTD (DBG_FLOW|DBG_VCC, "amb_open %x %x", vpi, vci); @@ -1088,14 +1091,6 @@ } #endif - // deal with possibly wildcarded VCs - error = atm_find_ci (atm_vcc, &vpi, &vci); - if (error) { - PRINTD (DBG_WARN|DBG_VCC, "atm_find_ci failed!"); - return error; - } - PRINTD (DBG_VCC, "atm_find_ci gives %x %x", vpi, vci); - if (!(0 <= vpi && vpi < (1<rxer[vci] = atm_vcc; up (&dev->vcc_sf); } - - // set elements of vcc - atm_vcc->vpi = vpi; // 0 - atm_vcc->vci = vci; // indicate readiness set_bit(ATM_VF_READY,&atm_vcc->flags); diff -Nru a/drivers/atm/atmtcp.c b/drivers/atm/atmtcp.c --- a/drivers/atm/atmtcp.c Wed Oct 8 12:24:57 2003 +++ b/drivers/atm/atmtcp.c Wed Oct 8 12:24:57 2003 @@ -115,10 +115,12 @@ } -static int atmtcp_v_open(struct atm_vcc *vcc,short vpi,int vci) +static int atmtcp_v_open(struct atm_vcc *vcc) { struct atmtcp_control msg; int error; + short vpi = vcc->vpi; + int vci = vcc->vci; memset(&msg,0,sizeof(msg)); msg.addr.sap_family = AF_ATMPVC; @@ -126,8 +128,6 @@ msg.addr.sap_addr.vpi = vpi; msg.hdr.vci = htons(vci); msg.addr.sap_addr.vci = vci; - error = atm_find_ci(vcc,&msg.addr.sap_addr.vpi,&msg.addr.sap_addr.vci); - if (error) return error; if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC) return 0; msg.type = ATMTCP_CTRL_OPEN; msg.qos = vcc->qos; @@ -158,6 +158,7 @@ struct atm_vcc *vcc; struct hlist_node *node; struct sock *s; + int i; if (cmd != ATM_SETCIRANGE) return -ENOIOCTLCMD; if (copy_from_user(&ci,(void *) arg,sizeof(ci))) return -EFAULT; @@ -166,14 +167,18 @@ if (ci.vpi_bits > MAX_VPI_BITS || ci.vpi_bits < 0 || ci.vci_bits > MAX_VCI_BITS || ci.vci_bits < 0) return -EINVAL; read_lock(&vcc_sklist_lock); - sk_for_each(s, node, &vcc_sklist) { - vcc = atm_sk(s); - if (vcc->dev != dev) - continue; - if ((vcc->vpi >> ci.vpi_bits) || - (vcc->vci >> ci.vci_bits)) { - read_unlock(&vcc_sklist_lock); - return -EBUSY; + for(i = 0; i < VCC_HTABLE_SIZE; ++i) { + struct hlist_head *head = &vcc_hash[i]; + + sk_for_each(s, node, head) { + vcc = atm_sk(s); + if (vcc->dev != dev) + continue; + if ((vcc->vpi >> ci.vpi_bits) || + (vcc->vci >> ci.vci_bits)) { + read_unlock(&vcc_sklist_lock); + return -EBUSY; + } } } read_unlock(&vcc_sklist_lock); @@ -244,6 +249,7 @@ struct sock *s; struct hlist_node *node; struct atm_vcc *walk; + int i; atmtcp_dev = (struct atm_dev *) vcc->dev_data; dev_data = PRIV(atmtcp_dev); @@ -254,11 +260,15 @@ shutdown_atm_dev(atmtcp_dev); vcc->dev_data = NULL; read_lock(&vcc_sklist_lock); - sk_for_each(s, node, &vcc_sklist) { - walk = atm_sk(s); - if (walk->dev != atmtcp_dev) - continue; - wake_up(walk->sk->sk_sleep); + for(i = 0; i < VCC_HTABLE_SIZE; ++i) { + struct hlist_head *head = &vcc_hash[i]; + + sk_for_each(s, node, head) { + walk = atm_sk(s); + if (walk->dev != atmtcp_dev) + continue; + wake_up(walk->sk->sk_sleep); + } } read_unlock(&vcc_sklist_lock); } @@ -272,7 +282,7 @@ struct hlist_node *node; struct atm_vcc *out_vcc = NULL; struct sk_buff *new_skb; - int result = 0; + int i, result = 0; if (!skb->len) return 0; dev = vcc->dev_data; @@ -283,14 +293,18 @@ goto done; } read_lock(&vcc_sklist_lock); - sk_for_each(s, node, &vcc_sklist) { - out_vcc = atm_sk(s); - if (out_vcc->dev != dev) - continue; - if (out_vcc->vpi == ntohs(hdr->vpi) && - out_vcc->vci == ntohs(hdr->vci) && - out_vcc->qos.rxtp.traffic_class != ATM_NONE) - break; + for(i = 0; i < VCC_HTABLE_SIZE; ++i) { + struct hlist_head *head = &vcc_hash[i]; + + sk_for_each(s, node, head) { + out_vcc = atm_sk(s); + if (out_vcc->dev != dev) + continue; + if (out_vcc->vpi == ntohs(hdr->vpi) && + out_vcc->vci == ntohs(hdr->vci) && + out_vcc->qos.rxtp.traffic_class != ATM_NONE) + break; + } } read_unlock(&vcc_sklist_lock); if (!out_vcc) { diff -Nru a/drivers/atm/eni.c b/drivers/atm/eni.c --- a/drivers/atm/eni.c Wed Oct 8 12:24:56 2003 +++ b/drivers/atm/eni.c Wed Oct 8 12:24:56 2003 @@ -1881,80 +1881,18 @@ } -static int get_ci(struct atm_vcc *vcc,short *vpi,int *vci) -{ - struct sock *s; - struct hlist_node *node; - struct atm_vcc *walk; - - read_lock(&vcc_sklist_lock); - if (*vpi == ATM_VPI_ANY) *vpi = 0; - if (*vci == ATM_VCI_ANY) { - for (*vci = ATM_NOT_RSV_VCI; *vci < NR_VCI; (*vci)++) { - if (vcc->qos.rxtp.traffic_class != ATM_NONE && - ENI_DEV(vcc->dev)->rx_map[*vci]) - continue; - if (vcc->qos.txtp.traffic_class != ATM_NONE) { - sk_for_each(s, node, &vcc_sklist) { - walk = atm_sk(s); - if (walk->dev != vcc->dev) - continue; - if (test_bit(ATM_VF_ADDR,&walk->flags) - && walk->vci == *vci && - walk->qos.txtp.traffic_class != - ATM_NONE) - break; - } - if (node) - continue; - } - break; - } - read_unlock(&vcc_sklist_lock); - return *vci == NR_VCI ? -EADDRINUSE : 0; - } - if (*vci == ATM_VCI_UNSPEC) { - read_unlock(&vcc_sklist_lock); - return 0; - } - if (vcc->qos.rxtp.traffic_class != ATM_NONE && - ENI_DEV(vcc->dev)->rx_map[*vci]) { - read_unlock(&vcc_sklist_lock); - return -EADDRINUSE; - } - if (vcc->qos.txtp.traffic_class == ATM_NONE) { - read_unlock(&vcc_sklist_lock); - return 0; - } - sk_for_each(s, node, &vcc_sklist) { - walk = atm_sk(s); - if (walk->dev != vcc->dev) - continue; - if (test_bit(ATM_VF_ADDR,&walk->flags) && walk->vci == *vci && - walk->qos.txtp.traffic_class != ATM_NONE) { - read_unlock(&vcc_sklist_lock); - return -EADDRINUSE; - } - } - read_unlock(&vcc_sklist_lock); - return 0; -} - - -static int eni_open(struct atm_vcc *vcc,short vpi,int vci) +static int eni_open(struct atm_vcc *vcc) { struct eni_dev *eni_dev; struct eni_vcc *eni_vcc; int error; + short vpi = vcc->vpi; + int vci = vcc->vci; DPRINTK(">eni_open\n"); EVENT("eni_open\n",0,0); if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) ENI_VCC(vcc) = NULL; eni_dev = ENI_DEV(vcc->dev); - error = get_ci(vcc,&vpi,&vci); - if (error) return error; - vcc->vpi = vpi; - vcc->vci = vci; if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC) set_bit(ATM_VF_ADDR,&vcc->flags); if (vcc->qos.aal != ATM_AAL0 && vcc->qos.aal != ATM_AAL5) @@ -2209,30 +2147,34 @@ skb_queue_len(&tx->backlog)); } read_lock(&vcc_sklist_lock); - sk_for_each(s, node, &vcc_sklist) { - struct eni_vcc *eni_vcc; - int length; - - vcc = atm_sk(s); - if (vcc->dev != dev) - continue; - eni_vcc = ENI_VCC(vcc); - if (--left) continue; - length = sprintf(page,"vcc %4d: ",vcc->vci); - if (eni_vcc->rx) { - length += sprintf(page+length,"0x%06lx-0x%06lx " - "(%6ld bytes)", - eni_vcc->recv-eni_dev->ram, - eni_vcc->recv-eni_dev->ram+eni_vcc->words*4-1, - eni_vcc->words*4); - if (eni_vcc->tx) length += sprintf(page+length,", "); + for(i = 0; i < VCC_HTABLE_SIZE; ++i) { + struct hlist_head *head = &vcc_hash[i]; + + sk_for_each(s, node, head) { + struct eni_vcc *eni_vcc; + int length; + + vcc = atm_sk(s); + if (vcc->dev != dev) + continue; + eni_vcc = ENI_VCC(vcc); + if (--left) continue; + length = sprintf(page,"vcc %4d: ",vcc->vci); + if (eni_vcc->rx) { + length += sprintf(page+length,"0x%06lx-0x%06lx " + "(%6ld bytes)", + eni_vcc->recv-eni_dev->ram, + eni_vcc->recv-eni_dev->ram+eni_vcc->words*4-1, + eni_vcc->words*4); + if (eni_vcc->tx) length += sprintf(page+length,", "); + } + if (eni_vcc->tx) + length += sprintf(page+length,"tx[%d], txing %d bytes", + eni_vcc->tx->index,eni_vcc->txing); + page[length] = '\n'; + read_unlock(&vcc_sklist_lock); + return length+1; } - if (eni_vcc->tx) - length += sprintf(page+length,"tx[%d], txing %d bytes", - eni_vcc->tx->index,eni_vcc->txing); - page[length] = '\n'; - read_unlock(&vcc_sklist_lock); - return length+1; } read_unlock(&vcc_sklist_lock); for (i = 0; i < eni_dev->free_len; i++) { diff -Nru a/drivers/atm/firestream.c b/drivers/atm/firestream.c --- a/drivers/atm/firestream.c Wed Oct 8 12:24:55 2003 +++ b/drivers/atm/firestream.c Wed Oct 8 12:24:55 2003 @@ -854,7 +854,7 @@ #define DO_DIRECTION(tp) ((tp)->traffic_class != ATM_NONE) -static int fs_open(struct atm_vcc *atm_vcc, short vpi, int vci) +static int fs_open(struct atm_vcc *atm_vcc) { struct fs_dev *dev; struct fs_vcc *vcc; @@ -867,6 +867,8 @@ int bfp; int to; unsigned short tmc0; + short vpi = atm_vcc->vpi; + int vci = atm_vcc->vci; func_enter (); @@ -874,14 +876,6 @@ fs_dprintk (FS_DEBUG_OPEN, "fs: open on dev: %p, vcc at %p\n", dev, atm_vcc); - error = atm_find_ci(atm_vcc, &vpi, &vci); - if (error) { - fs_dprintk (FS_DEBUG_OPEN, "fs: find_ci failed.\n"); - return error; - } - - atm_vcc->vpi = vpi; - atm_vcc->vci = vci; if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC) set_bit(ATM_VF_ADDR, &atm_vcc->flags); diff -Nru a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c --- a/drivers/atm/fore200e.c Wed Oct 8 12:24:57 2003 +++ b/drivers/atm/fore200e.c Wed Oct 8 12:24:57 2003 @@ -1071,14 +1071,16 @@ struct sock *s; struct atm_vcc* vcc; struct hlist_node *node; + int i; read_lock(&vcc_sklist_lock); - sk_for_each(s, node, &vcc_sklist) { + + sk_for_each(s, node, &vcc_hash[rpd->atm_header.vci & (VCC_HTABLE_SIZE-1)]) { vcc = atm_sk(s); if (vcc->dev != fore200e->atm_dev) - continue; + continue; if (vcc->vpi == rpd->atm_header.vpi && vcc->vci == rpd->atm_header.vci) { - read_unlock(&vcc_sklist_lock); + read_unlock(&vcc_sklist_lock); return vcc; } } @@ -1351,56 +1353,6 @@ } -static int -fore200e_walk_vccs(struct atm_vcc *vcc, short *vpi, int *vci) -{ - struct atm_vcc* walk; - struct sock *s; - struct hlist_node *node; - - /* find a free VPI */ - - read_lock(&vcc_sklist_lock); - - if (*vpi == ATM_VPI_ANY) { - - *vpi = 0; -restart_vpi_search: - sk_for_each(s, node, &vcc_sklist) { - walk = atm_sk(s); - if (walk->dev != vcc->dev) - continue; - - if ((walk->vci == *vci) && (walk->vpi == *vpi)) { - (*vpi)++; - goto restart_vpi_search; - } - } - } - - /* find a free VCI */ - if (*vci == ATM_VCI_ANY) { - - *vci = ATM_NOT_RSV_VCI; -restart_vci_search: - sk_for_each(s, node, &vcc_sklist) { - walk = atm_sk(s); - if (walk->dev != vcc->dev) - continue; - - if ((walk->vpi = *vpi) && (walk->vci == *vci)) { - *vci = walk->vci + 1; - goto restart_vci_search; - } - } - } - - read_unlock(&vcc_sklist_lock); - - return 0; -} - - #define FORE200E_MAX_BACK2BACK_CELLS 255 /* XXX depends on CDVT */ static void @@ -1420,17 +1372,13 @@ static int -fore200e_open(struct atm_vcc *vcc, short vpi, int vci) +fore200e_open(struct atm_vcc *vcc) { struct fore200e* fore200e = FORE200E_DEV(vcc->dev); struct fore200e_vcc* fore200e_vcc; + short vpi = vcc->vpi; + int vci = vcc->vci; - /* find a free VPI/VCI */ - fore200e_walk_vccs(vcc, &vpi, &vci); - - vcc->vpi = vpi; - vcc->vci = vci; - /* ressource checking only? */ if (vci == ATM_VCI_UNSPEC || vpi == ATM_VPI_UNSPEC) return 0; @@ -2660,7 +2608,7 @@ struct sock *s; struct hlist_node *node; struct fore200e* fore200e = FORE200E_DEV(dev); - int len, left = *pos; + int i, len, left = *pos; if (!left--) { @@ -2906,15 +2854,18 @@ " VCCs:\n address\tVPI.VCI:AAL\t(min/max tx PDU size) (min/max rx PDU size)\n"); read_lock(&vcc_sklist_lock); - sk_for_each(s, node, &vcc_sklist) { - vcc = atm_sk(s); + for(i = 0; i < VCC_HTABLE_SIZE; ++i) { + struct hlist_head *head = &vcc_hash[i]; + + sk_for_each(s, node, head) { + vcc = atm_sk(s); - if (vcc->dev != fore200e->atm_dev) + if (vcc->dev != fore200e->atm_dev) continue; - fore200e_vcc = FORE200E_VCC(vcc); + fore200e_vcc = FORE200E_VCC(vcc); - len += sprintf(page + len, + len += sprintf(page + len, " %x\t%d.%d:%d\t\t(%d/%d)\t(%d/%d)\n", (u32)(unsigned long)vcc, vcc->vpi, vcc->vci, fore200e_atm2fore_aal(vcc->qos.aal), @@ -2923,6 +2874,7 @@ fore200e_vcc->rx_min_pdu > 0xFFFF ? 0 : fore200e_vcc->rx_min_pdu, fore200e_vcc->rx_max_pdu ); + } } read_unlock(&vcc_sklist_lock); diff -Nru a/drivers/atm/he.c b/drivers/atm/he.c --- a/drivers/atm/he.c Wed Oct 8 12:24:55 2003 +++ b/drivers/atm/he.c Wed Oct 8 12:24:55 2003 @@ -135,7 +135,7 @@ /* declarations */ -static int he_open(struct atm_vcc *vcc, short vpi, int vci); +static int he_open(struct atm_vcc *vcc); static void he_close(struct atm_vcc *vcc); static int he_send(struct atm_vcc *vcc, struct sk_buff *skb); static int he_ioctl(struct atm_dev *dev, unsigned int cmd, void *arg); @@ -327,6 +327,7 @@ static __inline__ struct atm_vcc* __find_vcc(struct he_dev *he_dev, unsigned cid) { + struct hlist_head *head; struct atm_vcc *vcc; struct hlist_node *node; struct sock *s; @@ -335,8 +336,9 @@ vpi = cid >> he_dev->vcibits; vci = cid & ((1 << he_dev->vcibits) - 1); + head = &vcc_hash[vci & (VCC_HTABLE_SIZE -1)]; - sk_for_each(s, node, &vcc_sklist) { + sk_for_each(s, node, head) { vcc = atm_sk(s); if (vcc->dev == he_dev->atm_dev && vcc->vci == vci && vcc->vpi == vpi && @@ -2333,23 +2335,18 @@ } static int -he_open(struct atm_vcc *vcc, short vpi, int vci) +he_open(struct atm_vcc *vcc) { unsigned long flags; struct he_dev *he_dev = HE_DEV(vcc->dev); struct he_vcc *he_vcc; int err = 0; unsigned cid, rsr0, rsr1, rsr4, tsr0, tsr0_aal, tsr4, period, reg, clock; + short vpi = vcc->vpi; + int vci = vcc->vci; - - if ((err = atm_find_ci(vcc, &vpi, &vci))) { - HPRINTK("atm_find_ci err = %d\n", err); - return err; - } if (vci == ATM_VCI_UNSPEC || vpi == ATM_VPI_UNSPEC) return 0; - vcc->vpi = vpi; - vcc->vci = vci; HPRINTK("open vcc %p %d.%d\n", vcc, vpi, vci); @@ -2633,7 +2630,6 @@ (retry < MAX_RETRY)) { set_current_state(TASK_UNINTERRUPTIBLE); (void) schedule_timeout(sleep); - set_current_state(TASK_RUNNING); if (sleep < HZ) sleep = sleep * 2; diff -Nru a/drivers/atm/horizon.c b/drivers/atm/horizon.c --- a/drivers/atm/horizon.c Wed Oct 8 12:24:55 2003 +++ b/drivers/atm/horizon.c Wed Oct 8 12:24:55 2003 @@ -2174,7 +2174,8 @@ /********** open VC **********/ -static int hrz_open (struct atm_vcc * atm_vcc, short vpi, int vci) { +static int hrz_open (struct atm_vcc *atm_vcc) +{ int error; u16 channel; @@ -2185,6 +2186,8 @@ hrz_dev * dev = HRZ_DEV(atm_vcc->dev); hrz_vcc vcc; hrz_vcc * vccp; // allocated late + short vpi = atm_vcc->vpi; + int vci = atm_vcc->vci; PRINTD (DBG_FLOW|DBG_VCC, "hrz_open %x %x", vpi, vci); #ifdef ATM_VPI_UNSPEC @@ -2195,14 +2198,6 @@ } #endif - // deal with possibly wildcarded VCs - error = atm_find_ci (atm_vcc, &vpi, &vci); - if (error) { - PRINTD (DBG_WARN|DBG_VCC, "atm_find_ci failed!"); - return error; - } - PRINTD (DBG_VCC, "atm_find_ci gives %x %x", vpi, vci); - error = vpivci_to_channel (&channel, vpi, vci); if (error) { PRINTD (DBG_WARN|DBG_VCC, "VPI/VCI out of range: %hd/%d", vpi, vci); @@ -2557,8 +2552,6 @@ } // success, set elements of atm_vcc - atm_vcc->vpi = vpi; - atm_vcc->vci = vci; atm_vcc->dev_data = (void *) vccp; // indicate readiness diff -Nru a/drivers/atm/idt77252.c b/drivers/atm/idt77252.c --- a/drivers/atm/idt77252.c Wed Oct 8 12:24:56 2003 +++ b/drivers/atm/idt77252.c Wed Oct 8 12:24:56 2003 @@ -122,7 +122,7 @@ * ATM Interface. */ static void idt77252_dev_close(struct atm_dev *dev); -static int idt77252_open(struct atm_vcc *vcc, short vpi, int vci); +static int idt77252_open(struct atm_vcc *vcc); static void idt77252_close(struct atm_vcc *vcc); static int idt77252_send(struct atm_vcc *vcc, struct sk_buff *skb); static int idt77252_send_oam(struct atm_vcc *vcc, void *cell, @@ -2402,50 +2402,7 @@ } static int -idt77252_find_vcc(struct atm_vcc *vcc, short *vpi, int *vci) -{ - struct sock *s; - struct atm_vcc *walk; - - read_lock(&vcc_sklist_lock); - if (*vpi == ATM_VPI_ANY) { - *vpi = 0; - s = sk_head(&vcc_sklist); - while (s) { - walk = atm_sk(s); - if (walk->dev != vcc->dev) - continue; - if ((walk->vci == *vci) && (walk->vpi == *vpi)) { - (*vpi)++; - s = sk_head(&vcc_sklist); - continue; - } - s = sk_next(s); - } - } - - if (*vci == ATM_VCI_ANY) { - *vci = ATM_NOT_RSV_VCI; - s = sk_head(&vcc_sklist); - while (s) { - walk = atm_sk(s); - if (walk->dev != vcc->dev) - continue; - if ((walk->vci == *vci) && (walk->vpi == *vpi)) { - (*vci)++; - s = sk_head(&vcc_sklist); - continue; - } - s = sk_next(s); - } - } - - read_unlock(&vcc_sklist_lock); - return 0; -} - -static int -idt77252_open(struct atm_vcc *vcc, short vpi, int vci) +idt77252_open(struct atm_vcc *vcc) { struct atm_dev *dev = vcc->dev; struct idt77252_dev *card = dev->dev_data; @@ -2453,8 +2410,8 @@ unsigned int index; unsigned int inuse; int error; - - idt77252_find_vcc(vcc, &vpi, &vci); + int vci = vcc->vci; + short vpi = vcc->vpi; if (vpi == ATM_VPI_UNSPEC || vci == ATM_VCI_UNSPEC) return 0; @@ -2469,8 +2426,6 @@ return -EINVAL; } - vcc->vpi = vpi; - vcc->vci = vci; set_bit(ATM_VF_ADDR, &vcc->flags); down(&card->mutex); diff -Nru a/drivers/atm/iphase.c b/drivers/atm/iphase.c --- a/drivers/atm/iphase.c Wed Oct 8 12:24:57 2003 +++ b/drivers/atm/iphase.c Wed Oct 8 12:24:57 2003 @@ -2676,7 +2676,7 @@ return; } -static int ia_open(struct atm_vcc *vcc, short vpi, int vci) +static int ia_open(struct atm_vcc *vcc) { IADEV *iadev; struct ia_vcc *ia_vcc; @@ -2687,15 +2687,7 @@ INPH_IA_VCC(vcc) = NULL; } iadev = INPH_IA_DEV(vcc->dev); - error = atm_find_ci(vcc, &vpi, &vci); - if (error) - { - printk("iadev: atm_find_ci returned error %d\n", error); - return error; - } - vcc->vpi = vpi; - vcc->vci = vci; - if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC) + if (vcc->vci != ATM_VPI_UNSPEC && vcc->vpi != ATM_VCI_UNSPEC) { IF_EVENT(printk("iphase open: unspec part\n");) set_bit(ATM_VF_ADDR,&vcc->flags); diff -Nru a/drivers/atm/lanai.c b/drivers/atm/lanai.c --- a/drivers/atm/lanai.c Wed Oct 8 12:24:56 2003 +++ b/drivers/atm/lanai.c Wed Oct 8 12:24:56 2003 @@ -2350,11 +2350,13 @@ } /* open a vcc on the card to vpi/vci */ -static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci) +static int lanai_open(struct atm_vcc *atmvcc) { struct lanai_dev *lanai; struct lanai_vcc *lvcc; int result = 0; + int vci = atmvcc->vci; + short vpi = atmvcc->vpi; /* we don't support partial open - it's not really useful anyway */ if ((test_bit(ATM_VF_PARTIAL, &atmvcc->flags)) || (vpi == ATM_VPI_UNSPEC) || (vci == ATM_VCI_UNSPEC)) @@ -2363,8 +2365,6 @@ result = lanai_normalize_ci(lanai, atmvcc, &vpi, &vci); if (unlikely(result != 0)) goto out; - atmvcc->vpi = vpi; - atmvcc->vci = vci; set_bit(ATM_VF_ADDR, &atmvcc->flags); if (atmvcc->qos.aal != ATM_AAL0 && atmvcc->qos.aal != ATM_AAL5) return -EINVAL; diff -Nru a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c --- a/drivers/atm/nicstar.c Wed Oct 8 12:24:56 2003 +++ b/drivers/atm/nicstar.c Wed Oct 8 12:24:56 2003 @@ -221,7 +221,7 @@ static void push_rxbufs(ns_dev *card, u32 type, u32 handle1, u32 addr1, u32 handle2, u32 addr2); static irqreturn_t ns_irq_handler(int irq, void *dev_id, struct pt_regs *regs); -static int ns_open(struct atm_vcc *vcc, short vpi, int vci); +static int ns_open(struct atm_vcc *vcc); static void ns_close(struct atm_vcc *vcc); static void fill_tst(ns_dev *card, int n, vc_map *vc); static int ns_send(struct atm_vcc *vcc, struct sk_buff *skb); @@ -1371,11 +1371,10 @@ -static int ns_open(struct atm_vcc *vcc, short vpi, int vci) +static int ns_open(struct atm_vcc *vcc) { ns_dev *card; vc_map *vc; - int error; unsigned long tmpl, modl; int tcr, tcra; /* target cell rate, and absolute value */ int n = 0; /* Number of entries in the TST. Initialized to remove @@ -1386,6 +1385,8 @@ tell which variables can truly be used uninitialized... */ int inuse; /* tx or rx vc already in use by another vcc */ + short vpi = vcc->vpi; + int vci = vcc->vci; card = (ns_dev *) vcc->dev->dev_data; PRINTK("nicstar%d: opening vpi.vci %d.%d \n", card->index, (int) vpi, vci); @@ -1395,14 +1396,7 @@ return -EINVAL; } - if ((error = atm_find_ci(vcc, &vpi, &vci))) - { - PRINTK("nicstar%d: error in atm_find_ci().\n", card->index); - return error; - } vc = &(card->vcmap[vpi << card->vcibits | vci]); - vcc->vpi = vpi; - vcc->vci = vci; vcc->dev_data = vc; inuse = 0; diff -Nru a/drivers/atm/zatm.c b/drivers/atm/zatm.c --- a/drivers/atm/zatm.c Wed Oct 8 12:24:56 2003 +++ b/drivers/atm/zatm.c Wed Oct 8 12:24:56 2003 @@ -1373,19 +1373,17 @@ } -static int zatm_open(struct atm_vcc *vcc,short vpi,int vci) +static int zatm_open(struct atm_vcc *vcc) { struct zatm_dev *zatm_dev; struct zatm_vcc *zatm_vcc; + short vpi = vcc->vpi; + int vci = vcc->vci; int error; DPRINTK(">zatm_open\n"); zatm_dev = ZATM_DEV(vcc->dev); if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) ZATM_VCC(vcc) = NULL; - error = atm_find_ci(vcc,&vpi,&vci); - if (error) return error; - vcc->vpi = vpi; - vcc->vci = vci; if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC) set_bit(ATM_VF_ADDR,&vcc->flags); if (vcc->qos.aal != ATM_AAL5) return -EINVAL; /* @@@ AAL0 */ diff -Nru a/drivers/block/Kconfig b/drivers/block/Kconfig --- a/drivers/block/Kconfig Wed Oct 8 12:24:56 2003 +++ b/drivers/block/Kconfig Wed Oct 8 12:24:56 2003 @@ -6,7 +6,7 @@ config BLK_DEV_FD tristate "Normal floppy disk support" - depends on !X86_PC9800 && !ARCH_S390 + depends on ISA || M68 || SPARC64 ---help--- If you want to use the floppy disk drive(s) of your PC under Linux, say Y. Information about this driver, especially important for IBM @@ -35,7 +35,7 @@ config BLK_DEV_SWIM_IOP bool "Macintosh IIfx/Quadra 900/Quadra 950 floppy support (EXPERIMENTAL)" - depends on MAC && EXPERIMENTAL + depends on MAC && EXPERIMENTAL && BROKEN help Say Y here to support the SWIM (Super Woz Integrated Machine) IOP floppy controller on the Macintosh IIfx and Quadra 900/950. @@ -63,7 +63,7 @@ config ATARI_ACSI tristate "Atari ACSI support" - depends on ATARI + depends on ATARI && BROKEN ---help--- This enables support for the Atari ACSI interface. The driver supports hard disks and CD-ROMs, which have 512-byte sectors, or can diff -Nru a/drivers/block/acsi.c b/drivers/block/acsi.c --- a/drivers/block/acsi.c Wed Oct 8 12:24:57 2003 +++ b/drivers/block/acsi.c Wed Oct 8 12:24:57 2003 @@ -63,6 +63,7 @@ #include /* for HDIO_GETGEO */ #include #include +#include #include #include @@ -346,7 +347,7 @@ static int acsicmd_dma( const char *cmd, char *buffer, int blocks, int rwflag, int enable); static int acsi_reqsense( char *buffer, int targ, int lun); -static void acsi_print_error(const unsigned char *errblk, int struct acsi_info_struct *aip); +static void acsi_print_error(const unsigned char *errblk, struct acsi_info_struct *aip); static irqreturn_t acsi_interrupt (int irq, void *data, struct pt_regs *fp); static void unexpected_acsi_interrupt( void ); static void bad_rw_intr( void ); diff -Nru a/drivers/block/as-iosched.c b/drivers/block/as-iosched.c --- a/drivers/block/as-iosched.c Wed Oct 8 12:24:55 2003 +++ b/drivers/block/as-iosched.c Wed Oct 8 12:24:55 2003 @@ -173,13 +173,10 @@ /* * IO Context helper functions */ -/* Debug */ -static atomic_t nr_as_io_requests = ATOMIC_INIT(0); /* Called to deallocate the as_io_context */ static void free_as_io_context(struct as_io_context *aic) { - atomic_dec(&nr_as_io_requests); kfree(aic); } @@ -195,7 +192,6 @@ ret = kmalloc(sizeof(*ret), GFP_ATOMIC); if (ret) { - atomic_inc(&nr_as_io_requests); ret->dtor = free_as_io_context; ret->exit = exit_as_io_context; ret->state = 1 << AS_TASK_RUNNING; @@ -914,6 +910,8 @@ struct as_rq *arq = RQ_DATA(rq); struct as_io_context *aic; + WARN_ON(!list_empty(&rq->queuelist)); + if (unlikely(arq->state != AS_RQ_DISPATCHED)) return; @@ -926,6 +924,7 @@ if (ad->batch_data_dir == REQ_SYNC) ad->new_batch = 1; } + WARN_ON(ad->nr_dispatched == 0); ad->nr_dispatched--; /* @@ -1140,8 +1139,6 @@ /* * take it off the sort and fifo list, add to dispatch queue */ - as_remove_queued_request(ad->q, rq); - insert = ad->dispatch->prev; while (!list_empty(&rq->queuelist)) { @@ -1159,6 +1156,7 @@ ad->nr_dispatched++; } + as_remove_queued_request(ad->q, rq); list_add(&rq->queuelist, insert); if (arq->io_context && arq->io_context->aic) atomic_inc(&arq->io_context->aic->nr_dispatched); @@ -1325,12 +1323,27 @@ static inline void as_add_aliased_request(struct as_data *ad, struct as_rq *arq, struct as_rq *alias) { + struct request *req = arq->request; + struct list_head *insert = alias->request->queuelist.prev; + + /* + * Transfer list of aliases + */ + while (!list_empty(&req->queuelist)) { + struct request *__rq = list_entry_rq(req->queuelist.next); + struct as_rq *__arq = RQ_DATA(__rq); + + list_move_tail(&__rq->queuelist, &alias->request->queuelist); + + WARN_ON(__arq->state != AS_RQ_QUEUED); + } + /* * Another request with the same start sector on the rbtree. * Link this request to that sector. They are untangled in * as_move_to_dispatch */ - list_add_tail(&arq->request->queuelist, &alias->request->queuelist); + list_add(&arq->request->queuelist, insert); /* * Don't want to have to handle merges. @@ -1390,9 +1403,6 @@ } } - - - arq->state = AS_RQ_QUEUED; } @@ -1596,7 +1606,8 @@ */ } - q->last_merge = req; + if (arq->on_hash) + q->last_merge = req; } static void diff -Nru a/drivers/block/cciss.c b/drivers/block/cciss.c --- a/drivers/block/cciss.c Wed Oct 8 12:24:57 2003 +++ b/drivers/block/cciss.c Wed Oct 8 12:24:57 2003 @@ -111,8 +111,6 @@ static ctlr_info_t *hba[MAX_CTLR]; -static struct proc_dir_entry *proc_cciss; - static void do_cciss_request(request_queue_t *q); static int cciss_open(struct inode *inode, struct file *filep); static int cciss_release(struct inode *inode, struct file *filep); @@ -137,8 +135,6 @@ int length, int *eof, void *data); static void cciss_procinit(int i); #else -static int cciss_proc_get_info(char *buffer, char **start, off_t offset, - int length, int *eof, void *data) { return 0;} static void cciss_procinit(int i) {} #endif /* CONFIG_PROC_FS */ @@ -156,6 +152,9 @@ * Report information about this controller. */ #ifdef CONFIG_PROC_FS + +static struct proc_dir_entry *proc_cciss; + static int cciss_proc_get_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data) { @@ -636,9 +635,11 @@ { return -EINVAL; } +#if 0 /* 'buf_size' member is 16-bits, and always smaller than kmalloc limit */ /* Check kmalloc limits */ if(iocommand.buf_size > 128000) return -EINVAL; +#endif if(iocommand.buf_size > 0) { buff = kmalloc(iocommand.buf_size, GFP_KERNEL); diff -Nru a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c --- a/drivers/block/cpqarray.c Wed Oct 8 12:24:55 2003 +++ b/drivers/block/cpqarray.c Wed Oct 8 12:24:55 2003 @@ -99,8 +99,6 @@ static struct gendisk *ida_gendisk[MAX_CTLR][NWD]; -static struct proc_dir_entry *proc_array; - /* Debug... */ #define DBG(s) do { s } while(0) /* Debug (general info)... */ @@ -153,8 +151,6 @@ static int ida_proc_get_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data); #else static void ida_procinit(int i) {} -static int ida_proc_get_info(char *buffer, char **start, off_t offset, - int length, int *eof, void *data) { return 0;} #endif static inline drv_info_t *get_drv(struct gendisk *disk) @@ -178,6 +174,8 @@ #ifdef CONFIG_PROC_FS + +static struct proc_dir_entry *proc_array; /* * Get us a file in /proc/array that says something about each controller. diff -Nru a/drivers/block/genhd.c b/drivers/block/genhd.c --- a/drivers/block/genhd.c Wed Oct 8 12:24:56 2003 +++ b/drivers/block/genhd.c Wed Oct 8 12:24:56 2003 @@ -114,6 +114,8 @@ return ret; } +EXPORT_SYMBOL(register_blkdev); + /* todo: make void - error printk here */ int unregister_blkdev(unsigned int major, const char *name) { @@ -141,6 +143,8 @@ return ret; } +EXPORT_SYMBOL(unregister_blkdev); + static struct kobj_map *bdev_map; /* @@ -155,12 +159,13 @@ kobj_map(bdev_map, dev, range, module, probe, lock, data); } +EXPORT_SYMBOL(blk_register_region); + void blk_unregister_region(dev_t dev, unsigned long range) { kobj_unmap(bdev_map, dev, range); } -EXPORT_SYMBOL(blk_register_region); EXPORT_SYMBOL(blk_unregister_region); static struct kobject *exact_match(dev_t dev, int *part, void *data) @@ -250,7 +255,7 @@ { struct gendisk *sgp = v; int n; - char buf[64]; + char buf[BDEVNAME_SIZE]; if (&sgp->kobj.entry == block_subsys.kset.list.next) seq_puts(part, "major minor #blocks name\n\n"); @@ -472,7 +477,7 @@ static int diskstats_show(struct seq_file *s, void *v) { struct gendisk *gp = v; - char buf[64]; + char buf[BDEVNAME_SIZE]; int n = 0; /* @@ -545,6 +550,8 @@ return disk; } +EXPORT_SYMBOL(alloc_disk); + struct kobject *get_disk(struct gendisk *disk) { struct module *owner; @@ -564,14 +571,14 @@ } +EXPORT_SYMBOL(get_disk); + void put_disk(struct gendisk *disk) { if (disk) kobject_put(&disk->kobj); } -EXPORT_SYMBOL(alloc_disk); -EXPORT_SYMBOL(get_disk); EXPORT_SYMBOL(put_disk); void set_device_ro(struct block_device *bdev, int flag) @@ -582,6 +589,8 @@ bdev->bd_disk->policy = flag; } +EXPORT_SYMBOL(set_device_ro); + void set_disk_ro(struct gendisk *disk, int flag) { int i; @@ -590,6 +599,8 @@ if (disk->part[i]) disk->part[i]->policy = flag; } +EXPORT_SYMBOL(set_disk_ro); + int bdev_read_only(struct block_device *bdev) { if (!bdev) @@ -600,6 +611,8 @@ return bdev->bd_disk->policy; } +EXPORT_SYMBOL(bdev_read_only); + int invalidate_partition(struct gendisk *disk, int index) { int res = 0; @@ -610,7 +623,4 @@ return res; } -EXPORT_SYMBOL(bdev_read_only); -EXPORT_SYMBOL(set_device_ro); -EXPORT_SYMBOL(set_disk_ro); EXPORT_SYMBOL(invalidate_partition); diff -Nru a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c --- a/drivers/block/ll_rw_blk.c Wed Oct 8 12:24:55 2003 +++ b/drivers/block/ll_rw_blk.c Wed Oct 8 12:24:55 2003 @@ -51,6 +51,9 @@ unsigned long blk_max_low_pfn, blk_max_pfn; +EXPORT_SYMBOL(blk_max_low_pfn); +EXPORT_SYMBOL(blk_max_pfn); + /* Amount of time in which a process may batch requests */ #define BLK_BATCH_TIME (HZ/50UL) @@ -119,7 +122,7 @@ /** * blk_get_backing_dev_info - get the address of a queue's backing_dev_info - * @dev: device + * @bdev: device * * Locates the passed device's request queue and returns the address of its * backing_dev_info @@ -158,6 +161,8 @@ q->prep_rq_fn = pfn; } +EXPORT_SYMBOL(blk_queue_prep_rq); + /** * blk_queue_merge_bvec - set a merge_bvec function for queue * @q: queue @@ -177,6 +182,8 @@ q->merge_bvec_fn = mbfn; } +EXPORT_SYMBOL(blk_queue_merge_bvec); + /** * blk_queue_make_request - define an alternate make_request function for a device * @q: the request queue for the device to be affected @@ -235,6 +242,8 @@ blk_queue_activity_fn(q, NULL, NULL); } +EXPORT_SYMBOL(blk_queue_make_request); + /** * blk_queue_bounce_limit - set bounce buffer limit for queue * @q: the request queue for the device @@ -280,6 +289,7 @@ last_q = q; } +EXPORT_SYMBOL(blk_queue_bounce_limit); /** * blk_queue_max_sectors - set max sectors for a request for this queue @@ -300,6 +310,8 @@ q->max_sectors = max_sectors; } +EXPORT_SYMBOL(blk_queue_max_sectors); + /** * blk_queue_max_phys_segments - set max phys segments for a request for this queue * @q: the request queue for the device @@ -320,6 +332,8 @@ q->max_phys_segments = max_segments; } +EXPORT_SYMBOL(blk_queue_max_phys_segments); + /** * blk_queue_max_hw_segments - set max hw segments for a request for this queue * @q: the request queue for the device @@ -341,6 +355,8 @@ q->max_hw_segments = max_segments; } +EXPORT_SYMBOL(blk_queue_max_hw_segments); + /** * blk_queue_max_segment_size - set max segment size for blk_rq_map_sg * @q: the request queue for the device @@ -360,6 +376,8 @@ q->max_segment_size = max_size; } +EXPORT_SYMBOL(blk_queue_max_segment_size); + /** * blk_queue_hardsect_size - set hardware sector size for the queue * @q: the request queue for the device @@ -376,6 +394,8 @@ q->hardsect_size = size; } +EXPORT_SYMBOL(blk_queue_hardsect_size); + /* * Returns the minimum that is _not_ zero, unless both are zero. */ @@ -397,6 +417,8 @@ t->hardsect_size = max(t->hardsect_size,b->hardsect_size); } +EXPORT_SYMBOL(blk_queue_stack_limits); + /** * blk_queue_segment_boundary - set boundary rules for segment merging * @q: the request queue for the device @@ -412,10 +434,12 @@ q->seg_boundary_mask = mask; } +EXPORT_SYMBOL(blk_queue_segment_boundary); + /** * blk_queue_dma_alignment - set dma length and memory alignment - * @q: the request queue for the device - * @dma_mask: alignment mask + * @q: the request queue for the device + * @mask: alignment mask * * description: * set required memory and length aligment for direct dma transactions. @@ -427,6 +451,8 @@ q->dma_alignment = mask; } +EXPORT_SYMBOL(blk_queue_dma_alignment); + /** * blk_queue_find_tag - find a request by its tag and queue * @@ -449,6 +475,8 @@ return bqt->tag_index[tag]; } +EXPORT_SYMBOL(blk_queue_find_tag); + /** * blk_queue_free_tags - release tag maintenance info * @q: the request queue for the device @@ -482,6 +510,8 @@ q->queue_flags &= ~(1 << QUEUE_FLAG_QUEUED); } +EXPORT_SYMBOL(blk_queue_free_tags); + static int init_tag_map(request_queue_t *q, struct blk_queue_tag *tags, int depth) { @@ -551,6 +581,8 @@ return -ENOMEM; } +EXPORT_SYMBOL(blk_queue_init_tags); + /** * blk_queue_resize_tags - change the queueing depth * @q: the request queue for the device @@ -636,6 +668,8 @@ bqt->busy--; } +EXPORT_SYMBOL(blk_queue_end_tag); + /** * blk_queue_start_tag - find a free tag and assign it * @q: the request queue for the device @@ -686,6 +720,8 @@ return 0; } +EXPORT_SYMBOL(blk_queue_start_tag); + /** * blk_queue_invalidate_tags - invalidate all pending tags * @q: the request queue for the device @@ -719,6 +755,8 @@ } } +EXPORT_SYMBOL(blk_queue_invalidate_tags); + static char *rq_flags[] = { "REQ_RW", "REQ_FAILFAST", @@ -770,6 +808,8 @@ } } +EXPORT_SYMBOL(blk_dump_rq_flags); + void blk_recount_segments(request_queue_t *q, struct bio *bio) { struct bio_vec *bv, *bvprv = NULL; @@ -829,6 +869,8 @@ return 0; } +EXPORT_SYMBOL(blk_phys_contig_segment); + int blk_hw_contig_segment(request_queue_t *q, struct bio *bio, struct bio *nxt) { @@ -850,6 +892,8 @@ return 0; } +EXPORT_SYMBOL(blk_hw_contig_segment); + /* * map a request to scatterlist, return number of sg entries setup. Caller * must make sure sg can hold rq->nr_phys_segments entries @@ -900,6 +944,8 @@ return nsegs; } +EXPORT_SYMBOL(blk_rq_map_sg); + /* * the standard queue merge functions, can be overridden with device * specific ones if so desired @@ -1042,6 +1088,8 @@ } } +EXPORT_SYMBOL(blk_plug_device); + /* * remove the queue from the plugged list, if present. called with * queue lock held and interrupts disabled. @@ -1060,6 +1108,8 @@ return 0; } +EXPORT_SYMBOL(blk_remove_plug); + /* * remove the plug and let it rip.. */ @@ -1101,6 +1151,8 @@ spin_unlock_irq(q->queue_lock); } +EXPORT_SYMBOL(generic_unplug_device); + static void blk_unplug_work(void *data) { request_queue_t *q = data; @@ -1130,6 +1182,8 @@ schedule_work(&q->unplug_work); } +EXPORT_SYMBOL(blk_start_queue); + /** * blk_stop_queue - stop a queue * @q: The &request_queue_t in question @@ -1150,9 +1204,11 @@ set_bit(QUEUE_FLAG_STOPPED, &q->queue_flags); } +EXPORT_SYMBOL(blk_stop_queue); + /** * blk_run_queue - run a single device queue - * @q The queue to run + * @q: The queue to run */ void blk_run_queue(struct request_queue *q) { @@ -1164,6 +1220,8 @@ spin_unlock_irqrestore(q->queue_lock, flags); } +EXPORT_SYMBOL(blk_run_queue); + /** * blk_run_queues - fire all plugged queues * @@ -1198,6 +1256,8 @@ spin_unlock_irq(&blk_plug_lock); } +EXPORT_SYMBOL(blk_run_queues); + /** * blk_cleanup_queue: - release a &request_queue_t when it is no longer needed * @q: the request queue to be released @@ -1234,6 +1294,8 @@ kfree(q); } +EXPORT_SYMBOL(blk_cleanup_queue); + static int blk_init_free_list(request_queue_t *q) { struct request_list *rl = &q->rq; @@ -1298,6 +1360,8 @@ return q; } +EXPORT_SYMBOL(blk_alloc_queue); + /** * blk_init_queue - prepare a request queue for use with a block device * @rfn: The function to be called to process requests that have been @@ -1372,9 +1436,10 @@ out_init: kfree(q); return NULL; - } +EXPORT_SYMBOL(blk_init_queue); + int blk_get_queue(request_queue_t *q) { if (!test_bit(QUEUE_FLAG_DEAD, &q->queue_flags)) { @@ -1385,6 +1450,8 @@ return 1; } +EXPORT_SYMBOL(blk_get_queue); + static inline void blk_free_request(request_queue_t *q, struct request *rq) { elv_put_request(q, rq); @@ -1593,6 +1660,9 @@ return rq; } + +EXPORT_SYMBOL(blk_get_request); + /** * blk_requeue_request - put a request back on queue * @q: request queue where request should be inserted @@ -1611,6 +1681,8 @@ elv_requeue_request(q, rq); } +EXPORT_SYMBOL(blk_requeue_request); + /** * blk_insert_request - insert a special request in to a request queue * @q: request queue where request should be inserted @@ -1668,6 +1740,8 @@ spin_unlock_irqrestore(q->queue_lock, flags); } +EXPORT_SYMBOL(blk_insert_request); + void drive_stat_acct(struct request *rq, int nr_sectors, int new_io) { int rw = rq_data_dir(rq); @@ -1786,6 +1860,8 @@ } } +EXPORT_SYMBOL(blk_put_request); + /** * blk_congestion_wait - wait for a queue to become uncongested * @rw: READ or WRITE @@ -1806,6 +1882,8 @@ finish_wait(wqh, &wait); } +EXPORT_SYMBOL(blk_congestion_wait); + /* * Has to be called with the request spinlock acquired */ @@ -1893,6 +1971,8 @@ spin_unlock_irqrestore(q->queue_lock, flags); } +EXPORT_SYMBOL(blk_attempt_remerge); + /* * Non-locking blk_attempt_remerge variant. */ @@ -1901,6 +1981,8 @@ attempt_back_merge(q, rq); } +EXPORT_SYMBOL(__blk_attempt_remerge); + static int __make_request(request_queue_t *q, struct bio *bio) { struct request *req, *freereq = NULL; @@ -2186,6 +2268,8 @@ } while (ret); } +EXPORT_SYMBOL(generic_make_request); + /** * submit_bio: submit a bio to the block device layer for I/O * @rw: whether to %READ or %WRITE, or maybe to %READA (read ahead) @@ -2211,6 +2295,8 @@ return 1; } +EXPORT_SYMBOL(submit_bio); + /** * blk_rq_next_segment * @rq: the request being processed @@ -2286,6 +2372,8 @@ return 1; } +EXPORT_SYMBOL(process_that_request_first); + void blk_recalc_rq_segments(struct request *rq) { struct bio *bio; @@ -2454,6 +2542,8 @@ return __end_that_request_first(req, uptodate, nr_sectors << 9); } +EXPORT_SYMBOL(end_that_request_first); + /** * end_that_request_chunk - end I/O on a request * @req: the request being processed @@ -2474,6 +2564,8 @@ return __end_that_request_first(req, uptodate, nr_bytes); } +EXPORT_SYMBOL(end_that_request_chunk); + /* * queue lock must be held */ @@ -2503,6 +2595,8 @@ complete(waiting); } +EXPORT_SYMBOL(end_that_request_last); + void end_request(struct request *req, int uptodate) { if (!end_that_request_first(req, uptodate, req->hard_cur_sectors)) { @@ -2512,6 +2606,8 @@ } } +EXPORT_SYMBOL(end_request); + void blk_rq_bio_prep(request_queue_t *q, struct request *rq, struct bio *bio) { /* first three bits are identical in rq->flags and bio->bi_rw */ @@ -2529,6 +2625,8 @@ rq->cbio = rq->bio = rq->biotail = bio; } +EXPORT_SYMBOL(blk_rq_bio_prep); + void blk_rq_prep_restart(struct request *rq) { struct bio *bio; @@ -2545,6 +2643,8 @@ rq->current_nr_sectors = rq->hard_cur_sectors; } +EXPORT_SYMBOL(blk_rq_prep_restart); + int kblockd_schedule_work(struct work_struct *work) { return queue_work(kblockd_workqueue, work); @@ -2576,8 +2676,6 @@ return 0; } -static atomic_t nr_io_contexts = ATOMIC_INIT(0); - /* * IO Context helper functions */ @@ -2592,7 +2690,6 @@ if (ioc->aic && ioc->aic->dtor) ioc->aic->dtor(ioc->aic); kfree(ioc); - atomic_dec(&nr_io_contexts); } } @@ -2633,7 +2730,6 @@ if (ret == NULL) { ret = kmalloc(sizeof(*ret), GFP_ATOMIC); if (ret) { - atomic_inc(&nr_io_contexts); atomic_set(&ret->refcount, 1); ret->pid = tsk->pid; ret->last_waited = jiffies; /* doesn't matter... */ @@ -2824,59 +2920,3 @@ kobject_put(&disk->kobj); } } - - -EXPORT_SYMBOL(process_that_request_first); -EXPORT_SYMBOL(end_that_request_first); -EXPORT_SYMBOL(end_that_request_chunk); -EXPORT_SYMBOL(end_that_request_last); -EXPORT_SYMBOL(end_request); -EXPORT_SYMBOL(blk_init_queue); -EXPORT_SYMBOL(blk_cleanup_queue); -EXPORT_SYMBOL(blk_get_queue); -EXPORT_SYMBOL(blk_alloc_queue); -EXPORT_SYMBOL(blk_queue_make_request); -EXPORT_SYMBOL(blk_queue_bounce_limit); -EXPORT_SYMBOL(generic_make_request); -EXPORT_SYMBOL(generic_unplug_device); -EXPORT_SYMBOL(blk_plug_device); -EXPORT_SYMBOL(blk_remove_plug); -EXPORT_SYMBOL(blk_attempt_remerge); -EXPORT_SYMBOL(__blk_attempt_remerge); -EXPORT_SYMBOL(blk_max_low_pfn); -EXPORT_SYMBOL(blk_max_pfn); -EXPORT_SYMBOL(blk_queue_max_sectors); -EXPORT_SYMBOL(blk_queue_max_phys_segments); -EXPORT_SYMBOL(blk_queue_max_hw_segments); -EXPORT_SYMBOL(blk_queue_max_segment_size); -EXPORT_SYMBOL(blk_queue_hardsect_size); -EXPORT_SYMBOL(blk_queue_stack_limits); -EXPORT_SYMBOL(blk_queue_segment_boundary); -EXPORT_SYMBOL(blk_queue_dma_alignment); -EXPORT_SYMBOL(blk_rq_map_sg); -EXPORT_SYMBOL(blk_dump_rq_flags); -EXPORT_SYMBOL(submit_bio); -EXPORT_SYMBOL(blk_phys_contig_segment); -EXPORT_SYMBOL(blk_hw_contig_segment); -EXPORT_SYMBOL(blk_get_request); -EXPORT_SYMBOL(blk_put_request); -EXPORT_SYMBOL(blk_insert_request); -EXPORT_SYMBOL(blk_requeue_request); - -EXPORT_SYMBOL(blk_queue_prep_rq); -EXPORT_SYMBOL(blk_queue_merge_bvec); - -EXPORT_SYMBOL(blk_queue_find_tag); -EXPORT_SYMBOL(blk_queue_init_tags); -EXPORT_SYMBOL(blk_queue_free_tags); -EXPORT_SYMBOL(blk_queue_start_tag); -EXPORT_SYMBOL(blk_queue_end_tag); -EXPORT_SYMBOL(blk_queue_invalidate_tags); - -EXPORT_SYMBOL(blk_start_queue); -EXPORT_SYMBOL(blk_stop_queue); -EXPORT_SYMBOL(blk_run_queue); -EXPORT_SYMBOL(blk_run_queues); - -EXPORT_SYMBOL(blk_rq_bio_prep); -EXPORT_SYMBOL(blk_rq_prep_restart); diff -Nru a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c --- a/drivers/block/ps2esdi.c Wed Oct 8 12:24:55 2003 +++ b/drivers/block/ps2esdi.c Wed Oct 8 12:24:55 2003 @@ -39,7 +39,7 @@ #include #include #include -#include +#include #include #include #include diff -Nru a/drivers/block/scsi_ioctl.c b/drivers/block/scsi_ioctl.c --- a/drivers/block/scsi_ioctl.c Wed Oct 8 12:24:57 2003 +++ b/drivers/block/scsi_ioctl.c Wed Oct 8 12:24:57 2003 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -140,40 +141,36 @@ } static int sg_io(request_queue_t *q, struct block_device *bdev, - struct sg_io_hdr *uptr) + struct sg_io_hdr *hdr) { unsigned long start_time; int reading, writing; - struct sg_io_hdr hdr; struct request *rq; struct bio *bio; char sense[SCSI_SENSE_BUFFERSIZE]; void *buffer; - if (copy_from_user(&hdr, uptr, sizeof(*uptr))) - return -EFAULT; - - if (hdr.interface_id != 'S') + if (hdr->interface_id != 'S') return -EINVAL; - if (hdr.cmd_len > sizeof(rq->cmd)) + if (hdr->cmd_len > sizeof(rq->cmd)) return -EINVAL; /* * we'll do that later */ - if (hdr.iovec_count) + if (hdr->iovec_count) return -EOPNOTSUPP; - if (hdr.dxfer_len > (q->max_sectors << 9)) + if (hdr->dxfer_len > (q->max_sectors << 9)) return -EIO; reading = writing = 0; buffer = NULL; bio = NULL; - if (hdr.dxfer_len) { - unsigned int bytes = (hdr.dxfer_len + 511) & ~511; + if (hdr->dxfer_len) { + unsigned int bytes = (hdr->dxfer_len + 511) & ~511; - switch (hdr.dxfer_direction) { + switch (hdr->dxfer_direction) { default: return -EINVAL; case SG_DXFER_TO_FROM_DEV: @@ -191,8 +188,8 @@ * first try to map it into a bio. reading from device will * be a write to vm. */ - bio = bio_map_user(bdev, (unsigned long) hdr.dxferp, - hdr.dxfer_len, reading); + bio = bio_map_user(bdev, (unsigned long) hdr->dxferp, + hdr->dxfer_len, reading); /* * if bio setup failed, fall back to slow approach @@ -203,11 +200,11 @@ return -ENOMEM; if (writing) { - if (copy_from_user(buffer, hdr.dxferp, - hdr.dxfer_len)) + if (copy_from_user(buffer, hdr->dxferp, + hdr->dxfer_len)) goto out_buffer; } else - memset(buffer, 0, hdr.dxfer_len); + memset(buffer, 0, hdr->dxfer_len); } } @@ -216,11 +213,10 @@ /* * fill in request structure */ - rq->cmd_len = hdr.cmd_len; - if (copy_from_user(rq->cmd, hdr.cmdp, hdr.cmd_len)) - goto out_request; - if (sizeof(rq->cmd) != hdr.cmd_len) - memset(rq->cmd + hdr.cmd_len, 0, sizeof(rq->cmd) - hdr.cmd_len); + rq->cmd_len = hdr->cmd_len; + memcpy(rq->cmd, hdr->cmdp, hdr->cmd_len); + if (sizeof(rq->cmd) != hdr->cmd_len) + memset(rq->cmd + hdr->cmd_len, 0, sizeof(rq->cmd) - hdr->cmd_len); memset(sense, 0, sizeof(sense)); rq->sense = sense; @@ -234,9 +230,9 @@ blk_rq_bio_prep(q, rq, bio); rq->data = buffer; - rq->data_len = hdr.dxfer_len; + rq->data_len = hdr->dxfer_len; - rq->timeout = (hdr.timeout * HZ) / 1000; + rq->timeout = (hdr->timeout * HZ) / 1000; if (!rq->timeout) rq->timeout = q->sg_timeout; if (!rq->timeout) @@ -254,33 +250,30 @@ bio_unmap_user(bio, reading); /* write to all output members */ - hdr.status = rq->errors; - hdr.masked_status = (hdr.status >> 1) & 0x1f; - hdr.msg_status = 0; - hdr.host_status = 0; - hdr.driver_status = 0; - hdr.info = 0; - if (hdr.masked_status || hdr.host_status || hdr.driver_status) - hdr.info |= SG_INFO_CHECK; - hdr.resid = rq->data_len; - hdr.duration = ((jiffies - start_time) * 1000) / HZ; - hdr.sb_len_wr = 0; + hdr->status = rq->errors; + hdr->masked_status = (hdr->status >> 1) & 0x1f; + hdr->msg_status = 0; + hdr->host_status = 0; + hdr->driver_status = 0; + hdr->info = 0; + if (hdr->masked_status || hdr->host_status || hdr->driver_status) + hdr->info |= SG_INFO_CHECK; + hdr->resid = rq->data_len; + hdr->duration = ((jiffies - start_time) * 1000) / HZ; + hdr->sb_len_wr = 0; - if (rq->sense_len && hdr.sbp) { - int len = min((unsigned int) hdr.mx_sb_len, rq->sense_len); + if (rq->sense_len && hdr->sbp) { + int len = min((unsigned int) hdr->mx_sb_len, rq->sense_len); - if (!copy_to_user(hdr.sbp, rq->sense, len)) - hdr.sb_len_wr = len; + if (!copy_to_user(hdr->sbp, rq->sense, len)) + hdr->sb_len_wr = len; } blk_put_request(rq); - if (copy_to_user(uptr, &hdr, sizeof(*uptr))) - goto out_buffer; - if (buffer) { if (reading) - if (copy_to_user(hdr.dxferp, buffer, hdr.dxfer_len)) + if (copy_to_user(hdr->dxferp, buffer, hdr->dxfer_len)) goto out_buffer; kfree(buffer); @@ -289,8 +282,6 @@ /* may not have succeeded, but output values written to control * structure (struct sg_io_hdr). */ return 0; -out_request: - blk_put_request(rq); out_buffer: kfree(buffer); return -EFAULT; @@ -437,9 +428,71 @@ case SG_EMULATED_HOST: err = sg_emulated_host(q, (int *) arg); break; - case SG_IO: - err = sg_io(q, bdev, (struct sg_io_hdr *) arg); + case SG_IO: { + struct sg_io_hdr hdr; + + if (copy_from_user(&hdr, (struct sg_io_hdr *) arg, sizeof(hdr))) { + err = -EFAULT; + break; + } + err = sg_io(q, bdev, &hdr); + if (copy_to_user((struct sg_io_hdr *) arg, &hdr, sizeof(hdr))) + err = -EFAULT; break; + } + case CDROM_SEND_PACKET: { + struct cdrom_generic_command cgc; + struct sg_io_hdr hdr; + + if (copy_from_user(&cgc, (struct cdrom_generic_command *) arg, sizeof(cgc))) { + err = -EFAULT; + break; + } + cgc.timeout = clock_t_to_jiffies(cgc.timeout); + memset(&hdr, 0, sizeof(hdr)); + hdr.interface_id = 'S'; + hdr.cmd_len = sizeof(cgc.cmd); + hdr.dxfer_len = cgc.buflen; + err = 0; + switch (cgc.data_direction) { + case CGC_DATA_UNKNOWN: + hdr.dxfer_direction = SG_DXFER_UNKNOWN; + break; + case CGC_DATA_WRITE: + hdr.dxfer_direction = SG_DXFER_TO_DEV; + break; + case CGC_DATA_READ: + hdr.dxfer_direction = SG_DXFER_FROM_DEV; + break; + case CGC_DATA_NONE: + hdr.dxfer_direction = SG_DXFER_NONE; + break; + default: + err = -EINVAL; + } + if (err) + break; + + hdr.dxferp = cgc.buffer; + hdr.sbp = (char *) cgc.sense; + if (hdr.sbp) + hdr.mx_sb_len = sizeof(struct request_sense); + hdr.timeout = cgc.timeout; + hdr.cmdp = cgc.cmd; + hdr.cmd_len = sizeof(cgc.cmd); + err = sg_io(q, bdev, &hdr); + + if (hdr.status) + err = -EIO; + + cgc.stat = err; + cgc.buflen = hdr.resid; + if (copy_to_user((struct cdrom_generic_command *) arg, &cgc, sizeof(cgc))) + err = -EFAULT; + + break; + } + /* * old junk scsi send command ioctl */ diff -Nru a/drivers/block/swim_iop.c b/drivers/block/swim_iop.c --- a/drivers/block/swim_iop.c Wed Oct 8 12:24:55 2003 +++ b/drivers/block/swim_iop.c Wed Oct 8 12:24:55 2003 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include diff -Nru a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c --- a/drivers/cdrom/cdrom.c Wed Oct 8 12:24:55 2003 +++ b/drivers/cdrom/cdrom.c Wed Oct 8 12:24:55 2003 @@ -1856,57 +1856,6 @@ return cdo->generic_packet(cdi, &cgc); } -static int cdrom_do_cmd(struct cdrom_device_info *cdi, - struct cdrom_generic_command *cgc) -{ - struct request_sense *usense, sense; - unsigned char *ubuf; - int ret; - - if (cgc->data_direction == CGC_DATA_UNKNOWN) - return -EINVAL; - - if (cgc->buflen < 0 || cgc->buflen >= 131072) - return -EINVAL; - - usense = cgc->sense; - cgc->sense = &sense; - if (usense && !access_ok(VERIFY_WRITE, usense, sizeof(*usense))) { - return -EFAULT; - } - - ubuf = cgc->buffer; - if (cgc->data_direction == CGC_DATA_READ || - cgc->data_direction == CGC_DATA_WRITE) { - cgc->buffer = kmalloc(cgc->buflen, GFP_KERNEL); - if (cgc->buffer == NULL) - return -ENOMEM; - } - - - if (cgc->data_direction == CGC_DATA_READ) { - if (!access_ok(VERIFY_READ, ubuf, cgc->buflen)) { - kfree(cgc->buffer); - return -EFAULT; - } - } else if (cgc->data_direction == CGC_DATA_WRITE) { - if (copy_from_user(cgc->buffer, ubuf, cgc->buflen)) { - kfree(cgc->buffer); - return -EFAULT; - } - } - - ret = cdi->ops->generic_packet(cdi, cgc); - __copy_to_user(usense, cgc->sense, sizeof(*usense)); - if (!ret && cgc->data_direction == CGC_DATA_READ) - __copy_to_user(ubuf, cgc->buffer, cgc->buflen); - if (cgc->data_direction == CGC_DATA_READ || - cgc->data_direction == CGC_DATA_WRITE) { - kfree(cgc->buffer); - } - return ret; -} - static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, unsigned long arg) { @@ -2176,14 +2125,6 @@ return 0; } - case CDROM_SEND_PACKET: { - if (!CDROM_CAN(CDC_GENERIC_PACKET)) - return -ENOSYS; - cdinfo(CD_DO_IOCTL, "entering CDROM_SEND_PACKET\n"); - IOCTL_IN(arg, struct cdrom_generic_command, cgc); - cgc.timeout = clock_t_to_jiffies(cgc.timeout); - return cdrom_do_cmd(cdi, &cgc); - } case CDROM_NEXT_WRITABLE: { long next = 0; cdinfo(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n"); diff -Nru a/drivers/cdrom/sbpcd.c b/drivers/cdrom/sbpcd.c --- a/drivers/cdrom/sbpcd.c Wed Oct 8 12:24:55 2003 +++ b/drivers/cdrom/sbpcd.c Wed Oct 8 12:24:55 2003 @@ -363,7 +363,6 @@ #include -#include #include #include #include diff -Nru a/drivers/cdrom/sonycd535.c b/drivers/cdrom/sonycd535.c --- a/drivers/cdrom/sonycd535.c Wed Oct 8 12:24:56 2003 +++ b/drivers/cdrom/sonycd535.c Wed Oct 8 12:24:56 2003 @@ -1070,7 +1070,6 @@ Byte cmd_buff[10], params[10]; int i; int dsc_status; - int err; if (check_drive_status() != 0) return -EIO; @@ -1153,12 +1152,10 @@ break; case CDROMPLAYMSF: /* Play starting at the given MSF address. */ - err = verify_area(VERIFY_READ, (char *)arg, 6); - if (err) - return err; + if (copy_from_user(params, (void *)arg, 6)) + return -EFAULT; spin_up_drive(status); set_drive_mode(SONY535_AUDIO_DRIVE_MODE, status); - copy_from_user(params, (void *)arg, 6); /* The parameters are given in int, must be converted */ for (i = 0; i < 3; i++) { diff -Nru a/drivers/char/Kconfig b/drivers/char/Kconfig --- a/drivers/char/Kconfig Wed Oct 8 12:24:55 2003 +++ b/drivers/char/Kconfig Wed Oct 8 12:24:55 2003 @@ -954,6 +954,15 @@ Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. See the raw(8) manpage for more details. +config MAX_RAW_DEVS + int "Maximum number of RAW devices to support (1-8192)" + depends on RAW_DRIVER + default "256" + help + The maximum number of RAW devices that are supported. + Default is 256. Increase this number in case you need lots of + raw devices. + config HANGCHECK_TIMER tristate "Hangcheck timer" depends on X86_64 || X86 diff -Nru a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c --- a/drivers/char/agp/amd64-agp.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/agp/amd64-agp.c Wed Oct 8 12:24:57 2003 @@ -91,9 +91,9 @@ for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { tmp = agp_bridge->driver->mask_memory(mem->memory[i], mem->type); - BUG_ON(tmp & 0xffffff0000000ffc); - pte = (tmp & 0x000000ff00000000) >> 28; - pte |=(tmp & 0x00000000fffff000); + BUG_ON(tmp & 0xffffff0000000ffcULL); + pte = (tmp & 0x000000ff00000000ULL) >> 28; + pte |=(tmp & 0x00000000fffff000ULL); pte |= GPTE_VALID | GPTE_COHERENT; agp_bridge->gatt_table[j] = pte; diff -Nru a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c --- a/drivers/char/agp/via-agp.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/agp/via-agp.c Wed Oct 8 12:24:57 2003 @@ -251,6 +251,11 @@ .chipset_name = "Pro 266", }, + { + .device_id = PCI_DEVICE_ID_VIA_XN266, + .chipset_name = "Apollo Pro266", + }, + /* VT8361 */ { .device_id = PCI_DEVICE_ID_VIA_8361, diff -Nru a/drivers/char/amiserial.c b/drivers/char/amiserial.c --- a/drivers/char/amiserial.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/amiserial.c Wed Oct 8 12:24:57 2003 @@ -32,7 +32,6 @@ */ #include -#include #undef SERIAL_PARANOIA_CHECK #define SERIAL_DO_RESTART diff -Nru a/drivers/char/cyclades.c b/drivers/char/cyclades.c --- a/drivers/char/cyclades.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/cyclades.c Wed Oct 8 12:24:56 2003 @@ -670,7 +670,6 @@ #include #include #include -#include #include #include @@ -2724,7 +2723,6 @@ /* Run one more char cycle */ current->state = TASK_INTERRUPTIBLE; schedule_timeout(char_time * 5); - current->state = TASK_RUNNING; #ifdef CY_DEBUG_WAIT_UNTIL_SENT printk("Clean (jiff=%lu)...done\n", jiffies); #endif diff -Nru a/drivers/char/dsp56k.c b/drivers/char/dsp56k.c --- a/drivers/char/dsp56k.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/dsp56k.c Wed Oct 8 12:24:56 2003 @@ -24,7 +24,6 @@ */ #include -#include #include /* for kmalloc() and kfree() */ #include /* for struct wait_queue etc */ #include diff -Nru a/drivers/char/dtlk.c b/drivers/char/dtlk.c --- a/drivers/char/dtlk.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/dtlk.c Wed Oct 8 12:24:56 2003 @@ -48,7 +48,6 @@ */ #include -#include #define KERNEL #include diff -Nru a/drivers/char/dz.c b/drivers/char/dz.c --- a/drivers/char/dz.c Wed Oct 8 12:24:55 2003 +++ b/drivers/char/dz.c Wed Oct 8 12:24:55 2003 @@ -23,7 +23,6 @@ /* #define DEBUG_DZ 1 */ -#include #include #include diff -Nru a/drivers/char/esp.c b/drivers/char/esp.c --- a/drivers/char/esp.c Wed Oct 8 12:24:55 2003 +++ b/drivers/char/esp.c Wed Oct 8 12:24:55 2003 @@ -2612,7 +2612,7 @@ static void __exit espserial_exit(void) { unsigned long flags; - int e1, e2; + int e1; unsigned int region_start, region_end; struct esp_struct *temp_async; struct esp_pio_buffer *pio_buf; diff -Nru a/drivers/char/ftape/compressor/zftape-compress.c b/drivers/char/ftape/compressor/zftape-compress.c --- a/drivers/char/ftape/compressor/zftape-compress.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/ftape/compressor/zftape-compress.c Wed Oct 8 12:24:57 2003 @@ -31,6 +31,7 @@ char zftc_rev[] = "$Revision: 1.1.6.1 $"; char zftc_dat[] = "$Date: 1997/11/16 15:15:56 $"; +#include #include #include #include diff -Nru a/drivers/char/ftape/lowlevel/fdc-io.c b/drivers/char/ftape/lowlevel/fdc-io.c --- a/drivers/char/ftape/lowlevel/fdc-io.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/ftape/lowlevel/fdc-io.c Wed Oct 8 12:24:56 2003 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/char/generic_serial.c b/drivers/char/generic_serial.c --- a/drivers/char/generic_serial.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/generic_serial.c Wed Oct 8 12:24:56 2003 @@ -348,7 +348,7 @@ static int gs_wait_tx_flushed (void * ptr, int timeout) { struct gs_port *port = ptr; - long end_jiffies; + unsigned long end_jiffies; int jiffies_to_transmit, charsleft = 0, rv = 0; int rcib; diff -Nru a/drivers/char/i8k.c b/drivers/char/i8k.c --- a/drivers/char/i8k.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/i8k.c Wed Oct 8 12:24:56 2003 @@ -17,7 +17,6 @@ */ #include -#include #include #include #include diff -Nru a/drivers/char/ip2/i2os.h b/drivers/char/ip2/i2os.h --- a/drivers/char/ip2/i2os.h Wed Oct 8 12:24:56 2003 +++ b/drivers/char/ip2/i2os.h Wed Oct 8 12:24:56 2003 @@ -25,7 +25,6 @@ #include "ip2types.h" #include /* For inb, etc */ -#include //------------------------------------ // Defines for I/O instructions: diff -Nru a/drivers/char/ip2main.c b/drivers/char/ip2main.c --- a/drivers/char/ip2main.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/ip2main.c Wed Oct 8 12:24:57 2003 @@ -84,8 +84,6 @@ /************/ #include -#include - #include #include #include diff -Nru a/drivers/char/isicom.c b/drivers/char/isicom.c --- a/drivers/char/isicom.c Wed Oct 8 12:24:55 2003 +++ b/drivers/char/isicom.c Wed Oct 8 12:24:55 2003 @@ -38,7 +38,6 @@ */ #include -#include #include #include #include @@ -958,7 +957,6 @@ struct isi_port * port; struct isi_board * card; unsigned int line, board; - unsigned long flags; int error; #ifdef ISICOM_DEBUG diff -Nru a/drivers/char/istallion.c b/drivers/char/istallion.c --- a/drivers/char/istallion.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/istallion.c Wed Oct 8 12:24:57 2003 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -1489,7 +1488,6 @@ if (len > 0) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(len); - set_current_state(TASK_RUNNING); } } diff -Nru a/drivers/char/lp_old98.c b/drivers/char/lp_old98.c --- a/drivers/char/lp_old98.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/lp_old98.c Wed Oct 8 12:24:56 2003 @@ -23,7 +23,6 @@ #include #include #include -#include #include #include diff -Nru a/drivers/char/misc.c b/drivers/char/misc.c --- a/drivers/char/misc.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/misc.c Wed Oct 8 12:24:57 2003 @@ -157,12 +157,11 @@ list_for_each_entry(c, &misc_list, list) { if (c->minor == minor) { new_fops = fops_get(c->fops); - if (!new_fops) - goto fail; break; } } - goto fail; + if (!new_fops) + goto fail; } err = 0; diff -Nru a/drivers/char/moxa.c b/drivers/char/moxa.c --- a/drivers/char/moxa.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/moxa.c Wed Oct 8 12:24:57 2003 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/char/mxser.c b/drivers/char/mxser.c --- a/drivers/char/mxser.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/mxser.c Wed Oct 8 12:24:57 2003 @@ -39,7 +39,6 @@ #include #include -#include #include #include #include diff -Nru a/drivers/char/n_tty.c b/drivers/char/n_tty.c --- a/drivers/char/n_tty.c Wed Oct 8 12:24:55 2003 +++ b/drivers/char/n_tty.c Wed Oct 8 12:24:55 2003 @@ -974,7 +974,8 @@ /* NOTE: not yet done after every sleep pending a thorough check of the logic of this change. -- jlc */ /* don't stop on /dev/console */ - if (file->f_op->write != redirected_tty_write && current->tty == tty) { + if (file->f_op->write != redirected_tty_write && + process_tty(current) == tty) { if (tty->pgrp <= 0) printk("read_chan: tty->pgrp <= 0!\n"); else if (process_group(current) != tty->pgrp) { diff -Nru a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c --- a/drivers/char/pcmcia/synclink_cs.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/pcmcia/synclink_cs.c Wed Oct 8 12:24:56 2003 @@ -37,7 +37,6 @@ #include #include -#include #include #include #include diff -Nru a/drivers/char/pcxx.c b/drivers/char/pcxx.c --- a/drivers/char/pcxx.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/pcxx.c Wed Oct 8 12:24:57 2003 @@ -65,7 +65,6 @@ #include #include #include -#include #ifndef MODULE #include /* We only need it for parsing the "digi="-line */ diff -Nru a/drivers/char/random.c b/drivers/char/random.c --- a/drivers/char/random.c Wed Oct 8 12:24:55 2003 +++ b/drivers/char/random.c Wed Oct 8 12:24:55 2003 @@ -710,6 +710,8 @@ spin_unlock_irqrestore(&batch_lock, flags); } +EXPORT_SYMBOL(batch_entropy_store); + /* * Flush out the accumulated entropy operations, adding entropy to the passed * store (normally random_state). If that store has enough entropy, alternate @@ -854,11 +856,15 @@ } } +EXPORT_SYMBOL(add_keyboard_randomness); + void add_mouse_randomness(__u32 mouse_data) { add_timer_randomness(&mouse_timer_state, mouse_data); } +EXPORT_SYMBOL(add_mouse_randomness); + void add_interrupt_randomness(int irq) { if (irq >= NR_IRQS || irq_timer_state[irq] == 0) @@ -867,6 +873,8 @@ add_timer_randomness(irq_timer_state[irq], 0x100+irq); } +EXPORT_SYMBOL(add_interrupt_randomness); + void add_disk_randomness(struct gendisk *disk) { if (!disk || !disk->random) @@ -875,6 +883,8 @@ add_timer_randomness(disk->random, 0x100+MKDEV(disk->major, disk->first_minor)); } +EXPORT_SYMBOL(add_disk_randomness); + /****************************************************************** * * Hash function definition @@ -1458,6 +1468,8 @@ "random driver initialization\n"); } +EXPORT_SYMBOL(get_random_bytes); + /********************************************************************* * * Functions to interface with Linux @@ -1735,7 +1747,7 @@ tmp = kmalloc(size * sizeof(__u32), GFP_KERNEL); if (!tmp) - return -EFAULT; + return -ENOMEM; spin_lock_irqsave(&random_state->lock, flags); ent_count = random_state->entropy_count; @@ -1824,6 +1836,8 @@ uuid_out[8] = (uuid_out[8] & 0x3F) | 0x80; } +EXPORT_SYMBOL(generate_random_uuid); + /******************************************************************** * * Sysctl interface @@ -2323,6 +2337,8 @@ return seq; } +EXPORT_SYMBOL(secure_tcp_sequence_number); + /* The code below is shamelessly stolen from secure_tcp_sequence_number(). * All blames to Andrey V. Savochkin . */ @@ -2445,13 +2461,3 @@ return (cookie - tmp[17]) & COOKIEMASK; /* Leaving the data behind */ } #endif - - - -EXPORT_SYMBOL(add_keyboard_randomness); -EXPORT_SYMBOL(add_mouse_randomness); -EXPORT_SYMBOL(add_interrupt_randomness); -EXPORT_SYMBOL(add_disk_randomness); -EXPORT_SYMBOL(batch_entropy_store); -EXPORT_SYMBOL(generate_random_uuid); - diff -Nru a/drivers/char/raw.c b/drivers/char/raw.c --- a/drivers/char/raw.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/raw.c Wed Oct 8 12:24:57 2003 @@ -20,8 +20,6 @@ #include -#define MAX_RAW_MINORS 256 - struct raw_device_data { struct block_device *binding; int inuse; diff -Nru a/drivers/char/rio/rio_linux.c b/drivers/char/rio/rio_linux.c --- a/drivers/char/rio/rio_linux.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/rio/rio_linux.c Wed Oct 8 12:24:57 2003 @@ -53,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -333,7 +332,6 @@ rio_dprintk (RIO_DEBUG_DELAY, "delaying %d jiffies\n", njiffies); current->state = TASK_INTERRUPTIBLE; schedule_timeout(njiffies); - current->state = TASK_RUNNING; func_exit(); if (signal_pending(current)) @@ -351,7 +349,6 @@ rio_dprintk (RIO_DEBUG_DELAY, "delaying %d jiffies (ni)\n", njiffies); current->state = TASK_UNINTERRUPTIBLE; schedule_timeout(njiffies); - current->state = TASK_RUNNING; func_exit(); return !RIO_FAIL; } diff -Nru a/drivers/char/rocket.c b/drivers/char/rocket.c --- a/drivers/char/rocket.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/rocket.c Wed Oct 8 12:24:57 2003 @@ -85,11 +85,9 @@ #include #include #include -#include #include #include #include -#include #include #include #include @@ -955,7 +953,7 @@ /* * Info->count is now 1; so it's safe to sleep now. */ - info->session = current->session; + info->session = process_session(current); info->pgrp = process_group(current); if ((info->flags & ROCKET_INITIALIZED) == 0) { diff -Nru a/drivers/char/ser_a2232.c b/drivers/char/ser_a2232.c --- a/drivers/char/ser_a2232.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/ser_a2232.c Wed Oct 8 12:24:56 2003 @@ -703,7 +703,7 @@ a2232_driver->name = "ttyY"; a2232_driver->major = A2232_NORMAL_MAJOR; a2232_driver->type = TTY_DRIVER_TYPE_SERIAL; - a2232_driver->subtype = SERIAL_TTY_NORMAL; + a2232_driver->subtype = SERIAL_TYPE_NORMAL; a2232_driver->init_termios = tty_std_termios; a2232_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; diff -Nru a/drivers/char/serial167.c b/drivers/char/serial167.c --- a/drivers/char/serial167.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/serial167.c Wed Oct 8 12:24:56 2003 @@ -70,7 +70,6 @@ #include #include -#include #include #include diff -Nru a/drivers/char/stallion.c b/drivers/char/stallion.c --- a/drivers/char/stallion.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/stallion.c Wed Oct 8 12:24:57 2003 @@ -28,7 +28,6 @@ #include #include -#include /* for linux/stallion.h */ #include #include #include @@ -1225,7 +1224,6 @@ if (len > 0) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(len); - current->state = TASK_RUNNING; } } diff -Nru a/drivers/char/sx.c b/drivers/char/sx.c --- a/drivers/char/sx.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/sx.c Wed Oct 8 12:24:56 2003 @@ -240,7 +240,6 @@ #include "sxwindow.h" #include -#include #include "sx.h" diff -Nru a/drivers/char/toshiba.c b/drivers/char/toshiba.c --- a/drivers/char/toshiba.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/toshiba.c Wed Oct 8 12:24:57 2003 @@ -57,7 +57,6 @@ #define TOSH_DEBUG 0 #include -#include #include #include #include @@ -85,7 +84,6 @@ MODULE_PARM(tosh_fn, "i"); -static int tosh_get_info(char *, char **, off_t, int); static int tosh_ioctl(struct inode *, struct file *, unsigned int, unsigned long); @@ -104,6 +102,7 @@ /* * Read the Fn key status */ +#ifdef CONFIG_PROC_FS static int tosh_fn_status(void) { unsigned char scan; @@ -120,6 +119,7 @@ return (int) scan; } +#endif /* @@ -291,6 +291,7 @@ /* * Print the information for /proc/toshiba */ +#ifdef CONFIG_PROC_FS int tosh_get_info(char *buffer, char **start, off_t fpos, int length) { char *temp; @@ -319,6 +320,7 @@ return temp-buffer; } +#endif /* diff -Nru a/drivers/char/tty_io.c b/drivers/char/tty_io.c --- a/drivers/char/tty_io.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/tty_io.c Wed Oct 8 12:24:57 2003 @@ -117,6 +117,8 @@ .c_cc = INIT_C_CC }; +EXPORT_SYMBOL(tty_std_termios); + LIST_HEAD(tty_drivers); /* linked list of tty drivers */ struct tty_ldisc ldiscs[NR_LDISCS]; /* line disc dispatch table */ @@ -314,7 +316,7 @@ */ int tty_check_change(struct tty_struct * tty) { - if (current->tty != tty) + if (process_tty(current) != tty) return 0; if (tty->pgrp <= 0) { printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n"); @@ -481,14 +483,14 @@ if (tty->session > 0) { struct list_head *l; for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid) { - if (p->tty == tty) - p->tty = NULL; - if (!p->leader) + if (process_tty(p) == tty) + p->signal->tty = NULL; + if (!process_session_leader(p)) continue; send_group_sig_info(SIGHUP, SEND_SIG_PRIV, p); send_group_sig_info(SIGCONT, SEND_SIG_PRIV, p); if (tty->pgrp > 0) - p->tty_old_pgrp = tty->pgrp; + p->signal->tty_old_pgrp = tty->pgrp; } } read_unlock(&tasklist_lock); @@ -565,15 +567,15 @@ lock_kernel(); - tty = current->tty; + tty = process_tty(current); if (tty) { tty_pgrp = tty->pgrp; if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY) tty_vhangup(tty); } else { - if (current->tty_old_pgrp) { - kill_pg(current->tty_old_pgrp, SIGHUP, on_exit); - kill_pg(current->tty_old_pgrp, SIGCONT, on_exit); + if (current->signal->tty_old_pgrp) { + kill_pg(current->signal->tty_old_pgrp, SIGHUP, on_exit); + kill_pg(current->signal->tty_old_pgrp, SIGCONT, on_exit); } unlock_kernel(); return; @@ -584,13 +586,13 @@ kill_pg(tty_pgrp, SIGCONT, on_exit); } - current->tty_old_pgrp = 0; + current->signal->tty_old_pgrp = 0; tty->session = 0; tty->pgrp = -1; read_lock(&tasklist_lock); - for_each_task_pid(current->session, PIDTYPE_SID, p, l, pid) - p->tty = NULL; + for_each_task_pid(process_session(current), PIDTYPE_SID, p, l, pid) + p->signal->tty = NULL; read_unlock(&tasklist_lock); unlock_kernel(); } @@ -1218,10 +1220,10 @@ read_lock(&tasklist_lock); for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid) - p->tty = NULL; + p->signal->tty = NULL; if (o_tty) for_each_task_pid(o_tty->session, PIDTYPE_SID, p,l, pid) - p->tty = NULL; + p->signal->tty = NULL; read_unlock(&tasklist_lock); } @@ -1292,10 +1294,10 @@ retry_open: noctty = filp->f_flags & O_NOCTTY; if (device == MKDEV(TTYAUX_MAJOR,0)) { - if (!current->tty) + if (!process_tty(current)) return -ENXIO; - driver = current->tty->driver; - index = current->tty->index; + driver = process_tty(current)->driver; + index = process_tty(current)->index; filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */ /* noctty = 1; */ goto got_driver; @@ -1389,15 +1391,13 @@ filp->f_op = &tty_fops; goto retry_open; } - if (!noctty && - current->leader && - !current->tty && - tty->session == 0) { + if (!noctty && process_session_leader(current) && + !process_tty(current) && tty->session == 0) { task_lock(current); - current->tty = tty; + current->signal->tty = tty; task_unlock(current); - current->tty_old_pgrp = 0; - tty->session = current->session; + current->signal->tty_old_pgrp = 0; + tty->session = process_session(current); tty->pgrp = process_group(current); } return 0; @@ -1455,7 +1455,7 @@ { char ch, mbz = 0; - if ((current->tty != tty) && !capable(CAP_SYS_ADMIN)) + if ((process_tty(current) != tty) && !capable(CAP_SYS_ADMIN)) return -EPERM; if (get_user(ch, arg)) return -EFAULT; @@ -1541,14 +1541,14 @@ struct pid *pid; task_t *p; - if (current->leader && - (current->session == tty->session)) + if (process_session_leader(current) && + (process_session(current) == tty->session)) return 0; /* * The process must be a session leader and * not have a controlling tty already. */ - if (!current->leader || current->tty) + if (!process_session_leader(current) || process_tty(current)) return -EPERM; if (tty->session > 0) { /* @@ -1562,16 +1562,16 @@ read_lock(&tasklist_lock); for_each_task_pid(tty->session, PIDTYPE_SID, p, l, pid) - p->tty = NULL; + p->signal->tty = NULL; read_unlock(&tasklist_lock); } else return -EPERM; } task_lock(current); - current->tty = tty; + current->signal->tty = tty; task_unlock(current); - current->tty_old_pgrp = 0; - tty->session = current->session; + current->signal->tty_old_pgrp = 0; + tty->session = process_session(current); tty->pgrp = process_group(current); return 0; } @@ -1582,12 +1582,13 @@ * (tty == real_tty) is a cheap way of * testing if the tty is NOT a master pty. */ - if (tty == real_tty && current->tty != real_tty) + if (tty == real_tty && process_tty(current) != real_tty) return -ENOTTY; return put_user(real_tty->pgrp, arg); } -static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *arg) +static int tiocspgrp(struct tty_struct *tty, + struct tty_struct *real_tty, pid_t *arg) { pid_t pgrp; int retval = tty_check_change(real_tty); @@ -1596,15 +1597,14 @@ return -ENOTTY; if (retval) return retval; - if (!current->tty || - (current->tty != real_tty) || - (real_tty->session != current->session)) + if (!process_tty(current) || (process_tty(current) != real_tty) || + (real_tty->session != process_session(current))) return -ENOTTY; if (get_user(pgrp, (pid_t *) arg)) return -EFAULT; if (pgrp < 0) return -EINVAL; - if (session_of_pgrp(pgrp) != current->session) + if (session_of_pgrp(pgrp) != process_session(current)) return -EPERM; real_tty->pgrp = pgrp; return 0; @@ -1616,7 +1616,7 @@ * (tty == real_tty) is a cheap way of * testing if the tty is NOT a master pty. */ - if (tty == real_tty && current->tty != real_tty) + if (tty == real_tty && process_tty(current) != real_tty) return -ENOTTY; if (real_tty->session <= 0) return -ENOTTY; @@ -1774,12 +1774,12 @@ clear_bit(TTY_EXCLUSIVE, &tty->flags); return 0; case TIOCNOTTY: - if (current->tty != tty) + if (process_tty(current) != tty) return -ENOTTY; - if (current->leader) + if (process_session_leader(current)) disassociate_ctty(0); task_lock(current); - current->tty = NULL; + current->signal->tty = NULL; task_unlock(current); return 0; case TIOCSCTTY: @@ -1883,10 +1883,10 @@ tty->driver->flush_buffer(tty); read_lock(&tasklist_lock); for_each_task_pid(session, PIDTYPE_SID, p, l, pid) { - if (p->tty == tty || session > 0) { + if (process_tty(p) == tty || session > 0) { printk(KERN_NOTICE "SAK: killed process %d" - " (%s): p->session==tty->session\n", - p->pid, p->comm); + " (%s): process_session(p)==tty->session\n", + p->pid, p->comm); send_sig(SIGKILL, p, 1); continue; } @@ -2034,6 +2034,8 @@ schedule_delayed_work(&tty->flip.work, 1); } +EXPORT_SYMBOL(tty_flip_buffer_push); + /* * This subroutine initializes a tty structure. */ @@ -2313,6 +2315,8 @@ return 0; } +EXPORT_SYMBOL(tty_register_driver); + /* * Called by a tty driver to unregister itself. */ @@ -2358,6 +2362,8 @@ cdev_del(&driver->cdev); return 0; } + +EXPORT_SYMBOL(tty_unregister_driver); /* diff -Nru a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c --- a/drivers/char/tty_ioctl.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/tty_ioctl.c Wed Oct 8 12:24:57 2003 @@ -69,6 +69,8 @@ remove_wait_queue(&tty->write_wait, &wait); } +EXPORT_SYMBOL(tty_wait_until_sent); + static void unset_locked_termios(struct termios *termios, struct termios *old, struct termios *locked) diff -Nru a/drivers/char/vme_scc.c b/drivers/char/vme_scc.c --- a/drivers/char/vme_scc.c Wed Oct 8 12:24:55 2003 +++ b/drivers/char/vme_scc.c Wed Oct 8 12:24:55 2003 @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/char/vt.c b/drivers/char/vt.c --- a/drivers/char/vt.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/vt.c Wed Oct 8 12:24:57 2003 @@ -2226,7 +2226,7 @@ if (tty->driver->type != TTY_DRIVER_TYPE_CONSOLE) return -EINVAL; - if (current->tty != tty && !capable(CAP_SYS_ADMIN)) + if (process_tty(current) != tty && !capable(CAP_SYS_ADMIN)) return -EPERM; if (get_user(type, (char *)arg)) return -EFAULT; diff -Nru a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c --- a/drivers/char/vt_ioctl.c Wed Oct 8 12:24:57 2003 +++ b/drivers/char/vt_ioctl.c Wed Oct 8 12:24:57 2003 @@ -380,7 +380,7 @@ * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG. */ perm = 0; - if (current->tty == tty || capable(CAP_SYS_TTY_CONFIG)) + if (process_tty(current) == tty || capable(CAP_SYS_TTY_CONFIG)) perm = 1; kbd = kbd_table + console; @@ -1188,4 +1188,3 @@ complete_change_console(new_console); } - diff -Nru a/drivers/char/watchdog/amd7xx_tco.c b/drivers/char/watchdog/amd7xx_tco.c --- a/drivers/char/watchdog/amd7xx_tco.c Wed Oct 8 12:24:56 2003 +++ b/drivers/char/watchdog/amd7xx_tco.c Wed Oct 8 12:24:56 2003 @@ -19,13 +19,11 @@ #include #include -#include #include #include #include #include #include -#include #include #include #include diff -Nru a/drivers/cpufreq/Kconfig b/drivers/cpufreq/Kconfig --- a/drivers/cpufreq/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/cpufreq/Kconfig Wed Oct 8 12:24:57 2003 @@ -6,7 +6,7 @@ CPUFreq. Please note that it is recommended to use the sysfs interface instead (which is built automatically). - For details, take a look at linux/Documentation/cpufreq. + For details, take a look at linux/Documentation/cpu-freq. If in doubt, say N. @@ -62,9 +62,9 @@ Enable this cpufreq governor when you either want to set the CPU frequency manually or when an userspace programm shall be able to set the CPU dynamically, like on LART - ( http://www.lart.tudelft.nl/ ) + - For details, take a look at linux/Documentation/cpufreq. + For details, take a look at linux/Documentation/cpu-freq. If in doubt, say Y. @@ -78,6 +78,6 @@ the same functionality as long as "userspace" is the selected governor for the specified CPU. - For details, take a look at linux/Documentation/cpufreq. + For details, take a look at linux/Documentation/cpu-freq. If in doubt, say N. diff -Nru a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c --- a/drivers/cpufreq/cpufreq.c Wed Oct 8 12:24:56 2003 +++ b/drivers/cpufreq/cpufreq.c Wed Oct 8 12:24:56 2003 @@ -449,6 +449,9 @@ if (!kobject_get(&data->kobj)) return -EFAULT; + if (cpufreq_driver->target) + __cpufreq_governor(data, CPUFREQ_GOV_STOP); + kobject_unregister(&data->kobj); kobject_put(&data->kobj); @@ -458,9 +461,6 @@ * unloading. */ wait_for_completion(&data->kobj_unregister); - - if (cpufreq_driver->target) - __cpufreq_governor(data, CPUFREQ_GOV_STOP); if (cpufreq_driver->exit) cpufreq_driver->exit(data); diff -Nru a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c --- a/drivers/eisa/eisa-bus.c Wed Oct 8 12:24:56 2003 +++ b/drivers/eisa/eisa-bus.c Wed Oct 8 12:24:56 2003 @@ -33,23 +33,22 @@ #endif #define EISA_MAX_FORCED_DEV 16 -#define EISA_FORCED_OFFSET 2 -static int enable_dev[EISA_MAX_FORCED_DEV + EISA_FORCED_OFFSET] = { 1, EISA_MAX_FORCED_DEV, }; -static int disable_dev[EISA_MAX_FORCED_DEV + EISA_FORCED_OFFSET] = { 1, EISA_MAX_FORCED_DEV, }; +static int enable_dev[EISA_MAX_FORCED_DEV]; +static int enable_dev_count; +static int disable_dev[EISA_MAX_FORCED_DEV]; +static int disable_dev_count; static int is_forced_dev (int *forced_tab, + int forced_count, struct eisa_root_device *root, struct eisa_device *edev) { int i, x; - for (i = 0; i < EISA_MAX_FORCED_DEV; i++) { - if (!forced_tab[EISA_FORCED_OFFSET + i]) - return 0; - + for (i = 0; i < forced_count; i++) { x = (root->bus_nr << 8) | edev->slot; - if (forced_tab[EISA_FORCED_OFFSET + i] == x) + if (forced_tab[i] == x) return 1; } @@ -198,10 +197,10 @@ #endif } - if (is_forced_dev (enable_dev, root, edev)) + if (is_forced_dev (enable_dev, enable_dev_count, root, edev)) edev->state = EISA_CONFIG_ENABLED | EISA_CONFIG_FORCED; - if (is_forced_dev (disable_dev, root, edev)) + if (is_forced_dev (disable_dev, disable_dev_count, root, edev)) edev->state = EISA_CONFIG_FORCED; return 0; @@ -418,20 +417,13 @@ return 0; } -/* Couldn't use intarray with checking on... :-( */ -#undef param_check_intarray -#define param_check_intarray(name, p) - -module_param(enable_dev, intarray, 0444); -module_param(disable_dev, intarray, 0444); +module_param_array(enable_dev, int, enable_dev_count, 0444); +module_param_array(disable_dev, int, disable_dev_count, 0444); postcore_initcall (eisa_init); -#ifndef CONFIG_EISA_ALWAYS -int EISA_bus; -EXPORT_SYMBOL(EISA_bus); -#endif - +int EISA_bus; /* for legacy drivers */ +EXPORT_SYMBOL (EISA_bus); EXPORT_SYMBOL (eisa_bus_type); EXPORT_SYMBOL (eisa_driver_register); EXPORT_SYMBOL (eisa_driver_unregister); diff -Nru a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig --- a/drivers/i2c/busses/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/i2c/busses/Kconfig Wed Oct 8 12:24:57 2003 @@ -285,7 +285,7 @@ will be called i2c-velleman. config I2C_VIA - tristate "VIA 82C58B" + tristate "VIA 82C586B" depends on I2C_ALGOBIT && PCI && EXPERIMENTAL help diff -Nru a/drivers/i2c/i2c-sensor.c b/drivers/i2c/i2c-sensor.c --- a/drivers/i2c/i2c-sensor.c Wed Oct 8 12:24:56 2003 +++ b/drivers/i2c/i2c-sensor.c Wed Oct 8 12:24:56 2003 @@ -133,7 +133,7 @@ i += 2) { if (((adapter_id == address_data->probe[i]) || ((address_data-> - probe[i] == ANY_I2C_BUS) & !is_isa)) + probe[i] == ANY_I2C_BUS) && !is_isa)) && (addr == address_data->probe[i + 1])) { dev_dbg(&adapter->dev, "found probe parameter for adapter %d, addr %04x\n", adapter_id, addr); found = 1; @@ -141,7 +141,7 @@ } for (i = 0; !found && (address_data->probe_range[i] != I2C_CLIENT_END); i += 3) { if ( ((adapter_id == address_data->probe_range[i]) || - ((address_data->probe_range[i] == ANY_I2C_BUS) & !is_isa)) && + ((address_data->probe_range[i] == ANY_I2C_BUS) && !is_isa)) && (addr >= address_data->probe_range[i + 1]) && (addr <= address_data->probe_range[i + 2])) { found = 1; diff -Nru a/drivers/ide/Kconfig b/drivers/ide/Kconfig --- a/drivers/ide/Kconfig Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/Kconfig Wed Oct 8 12:24:56 2003 @@ -195,7 +195,7 @@ Note that older versions of LILO (LInux LOader) cannot properly deal with IDE/ATAPI CD-ROMs, so install LILO 16 or higher, available from - . + . To compile this driver as a module, choose M here: the module will be called ide-cd. @@ -673,7 +673,7 @@ Say Y here to support the on-board IDE controller on the Integrated Technology Express, Inc. ITE8172 SBC. Vendor page at ; picture of the - board at . + board at . config BLK_DEV_NS87415 tristate "NS87415 chipset support" @@ -778,7 +778,7 @@ available" as well. Please read the comments at the top of - drivers/ide/pci/slc90e66.c. + . config BLK_DEV_TRM290 tristate "Tekram TRM290 chipset support" diff -Nru a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c --- a/drivers/ide/ide-floppy.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/ide-floppy.c Wed Oct 8 12:24:56 2003 @@ -156,7 +156,6 @@ int request_transfer; /* Bytes to transfer */ int actually_transferred; /* Bytes actually transferred */ int buffer_size; /* Size of our data buffer */ - char *b_data; /* Pointer which runs on the buffers */ int b_count; /* Missing/Available data on the current buffer */ struct request *rq; /* The corresponding request */ u8 *buffer; /* Data buffer */ @@ -515,9 +514,6 @@ u8 reserved[4]; } idefloppy_mode_parameter_header_t; -#define IDEFLOPPY_MIN(a,b) ((a)<(b) ? (a):(b)) -#define IDEFLOPPY_MAX(a,b) ((a)>(b) ? (a):(b)) - /* * Too bad. The drive wants to send us data which we are not ready to accept. * Just throw it away. @@ -575,59 +571,68 @@ static void idefloppy_input_buffers (ide_drive_t *drive, idefloppy_pc_t *pc, unsigned int bcount) { struct request *rq = pc->rq; - struct bio *bio = rq->bio; - int count; + struct bio_vec *bvec; + struct bio *bio; + unsigned long flags; + char *data; + int count, i, done = 0; - while (bcount) { - if (pc->b_count == bio->bi_size) { - rq->sector += rq->current_nr_sectors; - rq->nr_sectors -= rq->current_nr_sectors; - idefloppy_do_end_request(drive, 1, 0); - if ((bio = rq->bio) != NULL) - pc->b_count = 0; - } - if (bio == NULL) { - printk(KERN_ERR "%s: bio == NULL in " - "idefloppy_input_buffers, bcount == %d\n", - drive->name, bcount); - idefloppy_discard_data(drive, bcount); - return; + rq_for_each_bio(bio, rq) { + bio_for_each_segment(bvec, bio, i) { + if (!bcount) + break; + + count = min(bvec->bv_len, bcount); + + data = bvec_kmap_irq(bvec, &flags); + atapi_input_bytes(drive, data, count); + bvec_kunmap_irq(data, &flags); + + bcount -= count; + pc->b_count += count; + done += count; } - count = IDEFLOPPY_MIN(bio->bi_size - pc->b_count, bcount); - atapi_input_bytes(drive, bio_data(bio) + pc->b_count, count); - bcount -= count; - pc->b_count += count; + } + + idefloppy_do_end_request(drive, 1, done >> 9); + + if (bcount) { + printk(KERN_ERR "%s: leftover data in idefloppy_input_buffers, bcount == %d\n", drive->name, bcount); + idefloppy_discard_data(drive, bcount); } } static void idefloppy_output_buffers (ide_drive_t *drive, idefloppy_pc_t *pc, unsigned int bcount) { struct request *rq = pc->rq; - struct bio *bio = rq->bio; - int count; - - while (bcount) { - if (!pc->b_count) { - rq->sector += rq->current_nr_sectors; - rq->nr_sectors -= rq->current_nr_sectors; - idefloppy_do_end_request(drive, 1, 0); - if ((bio = rq->bio) != NULL) { - pc->b_data = bio_data(bio); - pc->b_count = bio->bi_size; - } - } - if (bio == NULL) { - printk(KERN_ERR "%s: bio == NULL in " - "idefloppy_output_buffers, bcount == %d\n", - drive->name, bcount); - idefloppy_write_zeros(drive, bcount); - return; + struct bio *bio; + struct bio_vec *bvec; + unsigned long flags; + int count, i, done = 0; + char *data; + + rq_for_each_bio(bio, rq) { + bio_for_each_segment(bvec, bio, i) { + if (!bcount) + break; + + count = min(bvec->bv_len, bcount); + + data = bvec_kmap_irq(bvec, &flags); + atapi_output_bytes(drive, data, count); + bvec_kunmap_irq(data, &flags); + + bcount -= count; + pc->b_count += count; + done += count; } - count = IDEFLOPPY_MIN(pc->b_count, bcount); - atapi_output_bytes(drive, pc->b_data, count); - bcount -= count; - pc->b_data += count; - pc->b_count -= count; + } + + idefloppy_do_end_request(drive, 1, done >> 9); + + if (bcount) { + printk(KERN_ERR "%s: leftover data in idefloppy_output_buffers, bcount == %d\n", drive->name, bcount); + idefloppy_write_zeros(drive, bcount); } } @@ -732,8 +737,6 @@ pc->request_transfer = 0; pc->buffer = pc->pc_buffer; pc->buffer_size = IDEFLOPPY_PC_BUFFER_SIZE; - pc->b_data = NULL; -// pc->bio = NULL; pc->callback = &idefloppy_pc_callback; } @@ -1199,7 +1202,6 @@ put_unaligned(htonl(block), (unsigned int *) &pc->c[2]); pc->callback = &idefloppy_rw_callback; pc->rq = rq; - pc->b_data = rq->buffer; pc->b_count = cmd == READ ? 0 : rq->bio->bi_size; if (rq->flags & REQ_RW) set_bit(PC_WRITING, &pc->flags); diff -Nru a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c --- a/drivers/ide/ide-proc.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/ide-proc.c Wed Oct 8 12:24:56 2003 @@ -522,7 +522,8 @@ if (*p != ':') goto parse_error; len = IDE_MIN(p - start, MAX_LEN); - strlcpy(name, start, IDE_MIN(len, MAX_LEN)); + strncpy(name, start, IDE_MIN(len, MAX_LEN)); + name[len] = 0; if (n > 0) { --n; diff -Nru a/drivers/ide/ide.c b/drivers/ide/ide.c --- a/drivers/ide/ide.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/ide.c Wed Oct 8 12:24:56 2003 @@ -189,6 +189,7 @@ #endif EXPORT_SYMBOL(noautodma); +EXPORT_SYMBOL(ide_bus_type); int (*ide_probe)(void); @@ -1800,27 +1801,26 @@ #ifdef CONFIG_BLK_DEV_PDC4030 static int __initdata probe_pdc4030; -extern void init_pdc4030(void); #endif #ifdef CONFIG_BLK_DEV_ALI14XX static int __initdata probe_ali14xx; -extern void init_ali14xx(void); +extern int ali14xx_init(void); #endif #ifdef CONFIG_BLK_DEV_UMC8672 static int __initdata probe_umc8672; -extern void init_umc8672(void); +extern int umc8672_init(void); #endif #ifdef CONFIG_BLK_DEV_DTC2278 static int __initdata probe_dtc2278; -extern void init_dtc2278(void); +extern int dtc2278_init(void); #endif #ifdef CONFIG_BLK_DEV_HT6560B static int __initdata probe_ht6560b; -extern void init_ht6560b(void); +extern int ht6560b_init(void); #endif #ifdef CONFIG_BLK_DEV_QD65XX static int __initdata probe_qd65xx; -extern void init_qd65xx(void); +extern int qd65xx_init(void); #endif static int __initdata is_chipset_set[MAX_HWIFS]; @@ -2238,8 +2238,9 @@ #endif /* CONFIG_BLK_DEV_CMD640 */ #ifdef CONFIG_BLK_DEV_PDC4030 { - extern int ide_probe_for_pdc4030(void); - (void) ide_probe_for_pdc4030(); + extern int pdc4030_init(void); + if (probe_pdc4030) + (void)pdc4030_init(); } #endif /* CONFIG_BLK_DEV_PDC4030 */ #ifdef CONFIG_BLK_DEV_IDE_PMAC @@ -2595,29 +2596,25 @@ init_ide_data(); -#ifdef CONFIG_BLK_DEV_PDC4030 - if (probe_pdc4030) - init_pdc4030(); -#endif #ifdef CONFIG_BLK_DEV_ALI14XX if (probe_ali14xx) - init_ali14xx(); + (void)ali14xx_init(); #endif #ifdef CONFIG_BLK_DEV_UMC8672 if (probe_umc8672) - init_umc8672(); + (void)umc8672_init(); #endif #ifdef CONFIG_BLK_DEV_DTC2278 if (probe_dtc2278) - init_dtc2278(); + (void)dtc2278_init(); #endif #ifdef CONFIG_BLK_DEV_HT6560B if (probe_ht6560b) - init_ht6560b(); + (void)ht6560b_init(); #endif #ifdef CONFIG_BLK_DEV_QD65XX if (probe_qd65xx) - init_qd65xx(); + (void)qd65xx_init(); #endif initializing = 1; diff -Nru a/drivers/ide/legacy/ali14xx.c b/drivers/ide/legacy/ali14xx.c --- a/drivers/ide/legacy/ali14xx.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/legacy/ali14xx.c Wed Oct 8 12:24:56 2003 @@ -198,22 +198,12 @@ return t; } -int __init probe_ali14xx (void) +static int __init ali14xx_probe(void) { - /* auto-detect IDE controller port */ - if (!findPort()) { - printk(KERN_ERR "ali14xx: not found.\n"); - return 1; - } + ide_hwif_t *hwif, *mate; - printk(KERN_DEBUG "ali14xx: base= 0x%03x, regOn = 0x%02x.\n", basePort, regOn); - ide_hwifs[0].chipset = ide_ali14xx; - ide_hwifs[1].chipset = ide_ali14xx; - ide_hwifs[0].tuneproc = &ali14xx_tune_drive; - ide_hwifs[1].tuneproc = &ali14xx_tune_drive; - ide_hwifs[0].mate = &ide_hwifs[1]; - ide_hwifs[1].mate = &ide_hwifs[0]; - ide_hwifs[1].channel = 1; + printk(KERN_DEBUG "ali14xx: base=0x%03x, regOn=0x%02x.\n", + basePort, regOn); /* initialize controller registers */ if (!initRegisters()) { @@ -221,74 +211,59 @@ return 1; } - probe_hwif_init(&ide_hwifs[0]); - probe_hwif_init(&ide_hwifs[1]); + hwif = &ide_hwifs[0]; + mate = &ide_hwifs[1]; - return 0; -} + hwif->chipset = ide_ali14xx; + hwif->tuneproc = &ali14xx_tune_drive; + hwif->mate = mate; + + mate->chipset = ide_ali14xx; + mate->tuneproc = &ali14xx_tune_drive; + mate->mate = hwif; + mate->channel = 1; -static void ali14xx_release (void) -{ - if (ide_hwifs[0].chipset != ide_ali14xx && - ide_hwifs[1].chipset != ide_ali14xx) - return; + probe_hwif_init(hwif); + probe_hwif_init(mate); - ide_hwifs[0].chipset = ide_unknown; - ide_hwifs[1].chipset = ide_unknown; - ide_hwifs[0].tuneproc = NULL; - ide_hwifs[1].tuneproc = NULL; - ide_hwifs[0].mate = NULL; - ide_hwifs[1].mate = NULL; + return 0; } -#ifndef MODULE -/* - * init_ali14xx: - * - * called by ide.c when parsing command line - */ - -void __init init_ali14xx (void) +/* Can be called directly from ide.c. */ +int __init ali14xx_init(void) { /* auto-detect IDE controller port */ - if (findPort()) - if (probe_ali14xx()) - goto no_detect; - return; - -no_detect: + if (findPort()) { + if (ali14xx_probe()) + return -ENODEV; + return 0; + } printk(KERN_ERR "ali14xx: not found.\n"); - ali14xx_release(); + return -ENODEV; } -#else - -MODULE_AUTHOR("see local file"); -MODULE_DESCRIPTION("support of ALI 14XX IDE chipsets"); -MODULE_LICENSE("GPL"); - -static int __init ali14xx_mod_init(void) +#ifdef MODULE +static void __exit ali14xx_release_hwif(ide_hwif_t *hwif) { - /* auto-detect IDE controller port */ - if (findPort()) - if (probe_ali14xx()) { - ali14xx_release(); - return -ENODEV; - } + if (hwif->chipset != ide_ali14xx) + return; - if (ide_hwifs[0].chipset != ide_ali14xx && - ide_hwifs[1].chipset != ide_ali14xx) { - ali14xx_release(); - return -ENODEV; - } - return 0; + hwif->chipset = ide_unknown; + hwif->tuneproc = NULL; + hwif->mate = NULL; + hwif->channel = 0; } -module_init(ali14xx_mod_init); -static void __exit ali14xx_mod_exit(void) +static void __exit ali14xx_exit(void) { - ali14xx_release(); + ali14xx_release_hwif(&ide_hwifs[0]); + ali14xx_release_hwif(&ide_hwifs[1]); } -module_exit(ali14xx_mod_exit); + +module_init(ali14xx_init); +module_exit(ali14xx_exit); #endif +MODULE_AUTHOR("see local file"); +MODULE_DESCRIPTION("support of ALI 14XX IDE chipsets"); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/ide/legacy/dtc2278.c b/drivers/ide/legacy/dtc2278.c --- a/drivers/ide/legacy/dtc2278.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/legacy/dtc2278.c Wed Oct 8 12:24:56 2003 @@ -95,9 +95,16 @@ HWIF(drive)->drives[!drive->select.b.unit].io_32bit = 1; } -void __init probe_dtc2278 (void) +static int __init probe_dtc2278(void) { unsigned long flags; + ide_hwif_t *hwif, *mate; + + hwif = &ide_hwifs[0]; + mate = &ide_hwifs[1]; + + if (hwif->chipset != ide_unknown || mate->chipset != ide_unknown) + return 1; local_irq_save(flags); /* @@ -117,76 +124,60 @@ #endif local_irq_restore(flags); - ide_hwifs[0].serialized = 1; - ide_hwifs[1].serialized = 1; - ide_hwifs[0].chipset = ide_dtc2278; - ide_hwifs[1].chipset = ide_dtc2278; - ide_hwifs[0].tuneproc = &tune_dtc2278; - ide_hwifs[0].drives[0].no_unmask = 1; - ide_hwifs[0].drives[1].no_unmask = 1; - ide_hwifs[1].drives[0].no_unmask = 1; - ide_hwifs[1].drives[1].no_unmask = 1; - ide_hwifs[0].mate = &ide_hwifs[1]; - ide_hwifs[1].mate = &ide_hwifs[0]; - ide_hwifs[1].channel = 1; + hwif->serialized = 1; + hwif->chipset = ide_dtc2278; + hwif->tuneproc = &tune_dtc2278; + hwif->drives[0].no_unmask = 1; + hwif->drives[1].no_unmask = 1; + hwif->mate = mate; + + mate->serialized = 1; + mate->chipset = ide_dtc2278; + mate->drives[0].no_unmask = 1; + mate->drives[1].no_unmask = 1; + mate->mate = hwif; + mate->channel = 1; + + probe_hwif_init(hwif); + probe_hwif_init(mate); - probe_hwif_init(&ide_hwifs[0]); - probe_hwif_init(&ide_hwifs[1]); + return 0; } -static void dtc2278_release (void) +/* Can be called directly from ide.c. */ +int __init dtc2278_init(void) { - if (ide_hwifs[0].chipset != ide_dtc2278 && - ide_hwifs[1].chipset != ide_dtc2278) + if (probe_dtc2278()) { + printk(KERN_ERR "dtc2278: ide interfaces already in use!\n"); + return -EBUSY; + } + return 0; +} + +#ifdef MODULE +static void __exit dtc2278_release_hwif(ide_hwif_t *hwif) +{ + if (hwif->chipset != ide_dtc2278) return; - ide_hwifs[0].serialized = 0; - ide_hwifs[1].serialized = 0; - ide_hwifs[0].chipset = ide_unknown; - ide_hwifs[1].chipset = ide_unknown; - ide_hwifs[0].tuneproc = NULL; - ide_hwifs[0].drives[0].no_unmask = 0; - ide_hwifs[0].drives[1].no_unmask = 0; - ide_hwifs[1].drives[0].no_unmask = 0; - ide_hwifs[1].drives[1].no_unmask = 0; - ide_hwifs[0].mate = NULL; - ide_hwifs[1].mate = NULL; + hwif->serialized = 0; + hwif->chipset = ide_unknown; + hwif->tuneproc = NULL; + hwif->drives[0].no_unmask = 0; + hwif->drives[1].no_unmask = 0; + hwif->mate = NULL; } -#ifndef MODULE -/* - * init_dtc2278: - * - * called by ide.c when parsing command line - */ - -void __init init_dtc2278 (void) +static void __exit dtc2278_exit(void) { - probe_dtc2278(); + dtc2278_release_hwif(&ide_hwifs[0]); + dtc2278_release_hwif(&ide_hwifs[1]); } -#else +module_init(dtc2278_init); +module_exit(dtc2278_exit); +#endif MODULE_AUTHOR("See Local File"); MODULE_DESCRIPTION("support of DTC-2278 VLB IDE chipsets"); MODULE_LICENSE("GPL"); - -static int __init dtc2278_mod_init(void) -{ - probe_dtc2278(); - if (ide_hwifs[0].chipset != ide_dtc2278 && - ide_hwifs[1].chipset != ide_dtc2278) { - dtc2278_release(); - return -ENODEV; - } - return 0; -} -module_init(dtc2278_mod_init); - -static void __exit dtc2278_mod_exit(void) -{ - dtc2278_release(); -} -module_exit(dtc2278_mod_exit); -#endif - diff -Nru a/drivers/ide/legacy/ht6560b.c b/drivers/ide/legacy/ht6560b.c --- a/drivers/ide/legacy/ht6560b.c Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/legacy/ht6560b.c Wed Oct 8 12:24:57 2003 @@ -304,35 +304,16 @@ #endif } -void ht6560b_release (void) -{ - if (ide_hwifs[0].chipset != ide_ht6560b && - ide_hwifs[1].chipset != ide_ht6560b) - return; - - ide_hwifs[0].chipset = ide_unknown; - ide_hwifs[1].chipset = ide_unknown; - ide_hwifs[0].tuneproc = NULL; - ide_hwifs[1].tuneproc = NULL; - ide_hwifs[0].selectproc = NULL; - ide_hwifs[1].selectproc = NULL; - ide_hwifs[0].serialized = 0; - ide_hwifs[1].serialized = 0; - ide_hwifs[0].mate = NULL; - ide_hwifs[1].mate = NULL; - - ide_hwifs[0].drives[0].drive_data = 0; - ide_hwifs[0].drives[1].drive_data = 0; - ide_hwifs[1].drives[0].drive_data = 0; - ide_hwifs[1].drives[1].drive_data = 0; - release_region(HT_CONFIG_PORT, 1); -} - -static int __init ht6560b_mod_init(void) +/* Can be called directly from ide.c. */ +int __init ht6560b_init(void) { + ide_hwif_t *hwif, *mate; int t; - if (!request_region(HT_CONFIG_PORT, 1, ide_hwifs[0].name)) { + hwif = &ide_hwifs[0]; + mate = &ide_hwifs[1]; + + if (!request_region(HT_CONFIG_PORT, 1, hwif->name)) { printk(KERN_NOTICE "%s: HT_CONFIG_PORT not found\n", __FUNCTION__); return -ENODEV; @@ -343,39 +324,33 @@ goto release_region; } - ide_hwifs[0].chipset = ide_ht6560b; - ide_hwifs[1].chipset = ide_ht6560b; - ide_hwifs[0].selectproc = &ht6560b_selectproc; - ide_hwifs[1].selectproc = &ht6560b_selectproc; - ide_hwifs[0].tuneproc = &tune_ht6560b; - ide_hwifs[1].tuneproc = &tune_ht6560b; - ide_hwifs[0].serialized = 1; /* is this needed? */ - ide_hwifs[1].serialized = 1; /* is this needed? */ - ide_hwifs[0].mate = &ide_hwifs[1]; - ide_hwifs[1].mate = &ide_hwifs[0]; - ide_hwifs[1].channel = 1; + hwif->chipset = ide_ht6560b; + hwif->selectproc = &ht6560b_selectproc; + hwif->tuneproc = &tune_ht6560b; + hwif->serialized = 1; /* is this needed? */ + hwif->mate = mate; + + mate->chipset = ide_ht6560b; + mate->selectproc = &ht6560b_selectproc; + mate->tuneproc = &tune_ht6560b; + mate->serialized = 1; /* is this needed? */ + mate->mate = hwif; + mate->channel = 1; /* * Setting default configurations for drives */ t = (HT_CONFIG_DEFAULT << 8); t |= HT_TIMING_DEFAULT; - ide_hwifs[0].drives[0].drive_data = t; - ide_hwifs[0].drives[1].drive_data = t; - t |= (HT_SECONDARY_IF << 8); - ide_hwifs[1].drives[0].drive_data = t; - ide_hwifs[1].drives[1].drive_data = t; + hwif->drives[0].drive_data = t; + hwif->drives[1].drive_data = t; - probe_hwif_init(&ide_hwifs[0]); - probe_hwif_init(&ide_hwifs[1]); + t |= (HT_SECONDARY_IF << 8); + mate->drives[0].drive_data = t; + mate->drives[1].drive_data = t; -#ifdef MODULE - if (ide_hwifs[0].chipset != ide_ht6560b && - ide_hwifs[1].chipset != ide_ht6560b) { - ht6560b_release(); - return -ENODEV; - } -#endif + probe_hwif_init(hwif); + probe_hwif_init(mate); return 0; @@ -384,24 +359,34 @@ return -ENODEV; } -MODULE_AUTHOR("See Local File"); -MODULE_DESCRIPTION("HT-6560B EIDE-controller support"); -MODULE_LICENSE("GPL"); - #ifdef MODULE -static void __exit ht6560b_mod_exit(void) +static void __exit ht6560b_release_hwif(ide_hwif_t *hwif) { - ht6560b_release(); + if (hwif->chipset != ide_ht6560b) + return; + + hwif->chipset = ide_unknown; + hwif->tuneproc = NULL; + hwif->selectproc = NULL; + hwif->serialized = 0; + hwif->mate = NULL; + hwif->channel = 0; + + hwif->drives[0].drive_data = 0; + hwif->drives[1].drive_data = 0; } -module_init(ht6560b_mod_init); -module_exit(ht6560b_mod_exit); -#else -/* - * called by ide.c when parsing command line - */ -void __init init_ht6560b (void) +static void __exit ht6560b_exit(void) { - ht6560b_mod_init(); /* ignore return value */ + ht6560b_release_hwif(&ide_hwifs[0]); + ht6560b_release_hwif(&ide_hwifs[1]); + release_region(HT_CONFIG_PORT, 1); } + +module_init(ht6560b_init); +module_exit(ht6560b_exit); #endif + +MODULE_AUTHOR("See Local File"); +MODULE_DESCRIPTION("HT-6560B EIDE-controller support"); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/ide/legacy/pdc4030.c b/drivers/ide/legacy/pdc4030.c --- a/drivers/ide/legacy/pdc4030.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/legacy/pdc4030.c Wed Oct 8 12:24:56 2003 @@ -147,8 +147,6 @@ return pdc4030_cmd(drive, PROMISE_IDENTIFY); } -int enable_promise_support; - /* * setup_pdc4030() * Completes the setup of a Promise DC4030 controller card, once found. @@ -296,33 +294,24 @@ } } - -int __init ide_probe_for_pdc4030(void) +int __init pdc4030_init(void) { unsigned int index; ide_hwif_t *hwif; -#ifndef MODULE - if (enable_promise_support == 0) - return; -#endif - for (index = 0; index < MAX_HWIFS; index++) { hwif = &ide_hwifs[index]; if (hwif->chipset == ide_unknown && detect_pdc4030(hwif)) { -#ifndef MODULE - setup_pdc4030(hwif); -#else - return setup_pdc4030(hwif); -#endif + if (!setup_pdc4030(hwif)) + return -ENODEV; + return 0; } } -#ifdef MODULE - return 0; -#endif + return -ENODEV; } -static void __exit release_pdc4030(ide_hwif_t *hwif, ide_hwif_t *mate) +#ifdef MODULE +static void __exit pdc4030_release_hwif(ide_hwif_t *hwif) { hwif->chipset = ide_unknown; hwif->selectproc = NULL; @@ -333,71 +322,23 @@ hwif->drives[1].keep_settings = 0; hwif->drives[0].noprobe = 0; hwif->drives[1].noprobe = 0; - - if (mate != NULL) { - mate->chipset = ide_unknown; - mate->selectproc = NULL; - mate->serialized = 0; - mate->drives[0].io_32bit = 0; - mate->drives[1].io_32bit = 0; - mate->drives[0].keep_settings = 0; - mate->drives[1].keep_settings = 0; - mate->drives[0].noprobe = 0; - mate->drives[1].noprobe = 0; - } } -#ifndef MODULE -/* - * init_pdc4030: - * - * called by ide.c when parsing command line - */ - -void __init init_pdc4030(void) +static void __exit pdc4030_exit(void) { - enable_promise_support = 1; + unsigned int index; + + for (index = 0; index < MAX_HWIFS; index++) + pdc4030_release_hwif(&ide_hwifs[index]); } -#else +module_init(pdc4030_init); +module_exit(pdc4030_exit); +#endif MODULE_AUTHOR("Peter Denison"); MODULE_DESCRIPTION("Support of Promise 4030 VLB series IDE chipsets"); MODULE_LICENSE("GPL"); - -static int __init pdc4030_mod_init(void) -{ - if (enable_promise_support == 0) - enable_promise_support = 1; - - if (!ide_probe_for_pdc4030()) - return -ENODEV; - return 0; -} -module_init(pdc4030_mod_init); - -static void __exit pdc4030_mod_exit(void) -{ - unsigned int index; - ide_hwif_t *hwif; - - if (enable_promise_support == 0) - return; - - for (index = 0; index < MAX_HWIFS; index++) { - hwif = &ide_hwifs[index]; - if (hwif->chipset == ide_pdc4030) { - ide_hwif_t *mate = &ide_hwifs[hwif->index+1]; - if (mate->chipset == ide_pdc4030) - release_pdc4030(hwif, mate); - else - release_pdc4030(hwif, NULL); - } - } - enable_promise_support = 0; -} -module_exit(pdc4030_mod_exit); -#endif /* * promise_read_intr() is the handler for disk read/multread interrupts diff -Nru a/drivers/ide/legacy/qd65xx.c b/drivers/ide/legacy/qd65xx.c --- a/drivers/ide/legacy/qd65xx.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/legacy/qd65xx.c Wed Oct 8 12:24:56 2003 @@ -338,12 +338,12 @@ * called to setup an ata channel : adjusts attributes & links for tuning */ -void __init qd_setup (int unit, int base, int config, unsigned int data0, unsigned int data1, void (*tuneproc) (ide_drive_t *, u8 pio)) +static void __init qd_setup(ide_hwif_t *hwif, int base, int config, + unsigned int data0, unsigned int data1, + void (*tuneproc) (ide_drive_t *, u8 pio)) { - ide_hwif_t *hwif = &ide_hwifs[unit]; - hwif->chipset = ide_qd65xx; - hwif->channel = unit; + hwif->channel = hwif->index; hwif->select_data = base; hwif->config_data = config; hwif->drives[0].drive_data = data0; @@ -354,19 +354,20 @@ probe_hwif_init(hwif); } +#ifdef MODULE /* * qd_unsetup: * * called to unsetup an ata channel : back to default values, unlinks tuning */ -static void __exit qd_unsetup (int unit) +static void __exit qd_unsetup(ide_hwif_t *hwif) { - ide_hwif_t *hwif = &ide_hwifs[unit]; u8 config = hwif->config_data; int base = hwif->select_data; void *tuneproc = (void *) hwif->tuneproc; - if (!(hwif->chipset == ide_qd65xx)) return; + if (hwif->chipset != ide_qd65xx) + return; printk(KERN_NOTICE "%s: back to defaults\n", hwif->name); @@ -381,13 +382,14 @@ qd_write_reg(QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0])); qd_write_reg(QD6580_DEF_DATA2, QD_TIMREG(&hwif->drives[1])); } else { - qd_write_reg(unit?QD6580_DEF_DATA2:QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0])); + qd_write_reg(hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA, QD_TIMREG(&hwif->drives[0])); } } else { printk(KERN_WARNING "Unknown qd65xx tuning fonction !\n"); printk(KERN_WARNING "keeping settings !\n"); } } +#endif /* * qd_probe: @@ -396,8 +398,9 @@ * return 1 if another qd may be probed */ -int __init qd_probe (int base) +static int __init qd_probe(int base) { + ide_hwif_t *hwif; u8 config; u8 unit; @@ -414,9 +417,8 @@ /* qd6500 found */ - printk(KERN_NOTICE "%s: qd6500 at %#x\n", - ide_hwifs[unit].name, base); - + hwif = &ide_hwifs[unit]; + printk(KERN_NOTICE "%s: qd6500 at %#x\n", hwif->name, base); printk(KERN_DEBUG "qd6500: config=%#x, ID3=%u\n", config, QD_ID3); @@ -425,8 +427,8 @@ return 1; } - qd_setup(unit, base, config, QD6500_DEF_DATA, - QD6500_DEF_DATA, &qd6500_tune_drive); + qd_setup(hwif, base, config, QD6500_DEF_DATA, QD6500_DEF_DATA, + &qd6500_tune_drive); return 1; } @@ -448,25 +450,31 @@ if (control & QD_CONTR_SEC_DISABLED) { /* secondary disabled */ + + hwif = &ide_hwifs[unit]; printk(KERN_INFO "%s: qd6580: single IDE board\n", - ide_hwifs[unit].name); - qd_setup(unit, base, config | (control << 8), - QD6580_DEF_DATA, QD6580_DEF_DATA2, - &qd6580_tune_drive); + hwif->name); + qd_setup(hwif, base, config | (control << 8), + QD6580_DEF_DATA, QD6580_DEF_DATA2, + &qd6580_tune_drive); qd_write_reg(QD_DEF_CONTR,QD_CONTROL_PORT); return 1; } else { + ide_hwif_t *mate; + + hwif = &ide_hwifs[0]; + mate = &ide_hwifs[1]; /* secondary enabled */ printk(KERN_INFO "%s&%s: qd6580: dual IDE board\n", - ide_hwifs[0].name,ide_hwifs[1].name); + hwif->name, mate->name); - qd_setup(0, base, config | (control << 8), - QD6580_DEF_DATA, QD6580_DEF_DATA, - &qd6580_tune_drive); - qd_setup(1, base, config | (control << 8), - QD6580_DEF_DATA2, QD6580_DEF_DATA2, - &qd6580_tune_drive); + qd_setup(hwif, base, config | (control << 8), + QD6580_DEF_DATA, QD6580_DEF_DATA, + &qd6580_tune_drive); + qd_setup(mate, base, config | (control << 8), + QD6580_DEF_DATA2, QD6580_DEF_DATA2, + &qd6580_tune_drive); qd_write_reg(QD_DEF_CONTR,QD_CONTROL_PORT); return 0; /* no other qd65xx possible */ @@ -476,38 +484,28 @@ return 1; } -#ifndef MODULE -/* - * init_qd65xx: - * - * called by ide.c when parsing command line - */ - -void __init init_qd65xx (void) -{ - if (qd_probe(0x30)) qd_probe(0xb0); -} - -#else - -MODULE_AUTHOR("Samuel Thibault"); -MODULE_DESCRIPTION("support of qd65xx vlb ide chipset"); -MODULE_LICENSE("GPL"); - -static int __init qd65xx_mod_init(void) +/* Can be called directly from ide.c. */ +int __init qd65xx_init(void) { - if (qd_probe(0x30)) qd_probe(0xb0); + if (qd_probe(0x30)) + qd_probe(0xb0); if (ide_hwifs[0].chipset != ide_qd65xx && ide_hwifs[1].chipset != ide_qd65xx) return -ENODEV; return 0; } -module_init(qd65xx_mod_init); -static void __exit qd65xx_mod_exit(void) +#ifdef MODULE +static void __exit qd65xx_exit(void) { - qd_unsetup(0); - qd_unsetup(1); + qd_unsetup(&ide_hwifs[0]); + qd_unsetup(&ide_hwifs[1]); } -module_exit(qd65xx_mod_exit); + +module_init(qd65xx_init); +module_exit(qd65xx_exit); #endif + +MODULE_AUTHOR("Samuel Thibault"); +MODULE_DESCRIPTION("support of qd65xx vlb ide chipset"); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/ide/legacy/umc8672.c b/drivers/ide/legacy/umc8672.c --- a/drivers/ide/legacy/umc8672.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/legacy/umc8672.c Wed Oct 8 12:24:56 2003 @@ -124,16 +124,16 @@ spin_unlock_irqrestore(&ide_lock, flags); } -int __init probe_umc8672 (void) +static int __init umc8672_probe(void) { unsigned long flags; + ide_hwif_t *hwif, *mate; - local_irq_save(flags); if (!request_region(0x108, 2, "umc8672")) { - local_irq_restore(flags); printk(KERN_ERR "umc8672: ports 0x108-0x109 already in use.\n"); return 1; } + local_irq_save(flags); outb_p(0x5A,0x108); /* enable umc */ if (in_umc (0xd5) != 0xa0) { local_irq_restore(flags); @@ -146,82 +146,62 @@ umc_set_speeds (current_speeds); local_irq_restore(flags); - ide_hwifs[0].chipset = ide_umc8672; - ide_hwifs[1].chipset = ide_umc8672; - ide_hwifs[0].tuneproc = &tune_umc; - ide_hwifs[1].tuneproc = &tune_umc; - ide_hwifs[0].mate = &ide_hwifs[1]; - ide_hwifs[1].mate = &ide_hwifs[0]; - ide_hwifs[1].channel = 1; + hwif = &ide_hwifs[0]; + mate = &ide_hwifs[1]; - probe_hwif_init(&ide_hwifs[0]); - probe_hwif_init(&ide_hwifs[1]); + hwif->chipset = ide_umc8672; + hwif->tuneproc = &tune_umc; + hwif->mate = mate; + + mate->chipset = ide_umc8672; + mate->tuneproc = &tune_umc; + mate->mate = hwif; + mate->channel = 1; + + probe_hwif_init(hwif); + probe_hwif_init(mate); return 0; } -static void umc8672_release (void) +/* Can be called directly from ide.c. */ +int __init umc8672_init(void) { - unsigned long flags; + if (umc8672_probe()) + return -ENODEV; + return 0; +} - local_irq_save(flags); - if (ide_hwifs[0].chipset != ide_umc8672 && - ide_hwifs[1].chipset != ide_umc8672) { - local_irq_restore(flags); +#ifdef MODULE +static void __exit umc8672_release_hwif(ide_hwif_t *hwif) +{ + if (hwif->chipset != ide_umc8672) return; - } - ide_hwifs[0].chipset = ide_unknown; - ide_hwifs[1].chipset = ide_unknown; - ide_hwifs[0].tuneproc = NULL; - ide_hwifs[1].tuneproc = NULL; - ide_hwifs[0].mate = NULL; - ide_hwifs[1].mate = NULL; - ide_hwifs[0].channel = 0; - ide_hwifs[1].channel = 0; - - outb_p(0xa5,0x108); /* disable umc */ - - release_region(0x108, 2); - local_irq_restore(flags); + hwif->chipset = ide_unknown; + hwif->tuneproc = NULL; + hwif->mate = NULL; + hwif->channel = 0; } -#ifndef MODULE -/* - * init_umc8672: - * - * called by ide.c when parsing command line - */ - -void __init init_umc8672 (void) +static void __exit umc8672_exit(void) { - if (probe_umc8672()) - printk(KERN_ERR "init_umc8672: umc8672 controller not found.\n"); -} + unsigned long flags; -#else + umc8672_release_hwif(&ide_hwifs[0]); + umc8672_release_hwif(&ide_hwifs[1]); -MODULE_AUTHOR("Wolfram Podien"); -MODULE_DESCRIPTION("Support for UMC 8672 IDE chipset"); -MODULE_LICENSE("GPL"); + local_irq_save(flags); + outb_p(0xa5, 0x108); /* disable umc */ + local_irq_restore(flags); -static int __init umc8672_mod_init(void) -{ - if (probe_umc8672()) - return -ENODEV; - if (ide_hwifs[0].chipset != ide_umc8672 && - ide_hwifs[1].chipset != ide_umc8672) { - umc8672_release(); - return -ENODEV; - } - return 0; + release_region(0x108, 2); } -module_init(umc8672_mod_init); -static void __exit umc8672_mod_exit(void) -{ - umc8672_release(); -} -module_exit(umc8672_mod_exit); +module_init(umc8672_init); +module_exit(umc8672_exit); #endif +MODULE_AUTHOR("Wolfram Podien"); +MODULE_DESCRIPTION("Support for UMC 8672 IDE chipset"); +MODULE_LICENSE("GPL"); diff -Nru a/drivers/ide/pci/Makefile b/drivers/ide/pci/Makefile --- a/drivers/ide/pci/Makefile Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/Makefile Wed Oct 8 12:24:56 2003 @@ -18,7 +18,6 @@ obj-$(CONFIG_BLK_DEV_OPTI621) += opti621.o obj-$(CONFIG_BLK_DEV_PDC202XX_OLD) += pdc202xx_old.o obj-$(CONFIG_BLK_DEV_PDC202XX_NEW) += pdc202xx_new.o -obj-$(CONFIG_BLK_DEV_PDC_ADMA) += pdcadma.o ide-adma.o obj-$(CONFIG_BLK_DEV_PIIX) += piix.o obj-$(CONFIG_BLK_DEV_RZ1000) += rz1000.o obj-$(CONFIG_BLK_DEV_SVWKS) += serverworks.o diff -Nru a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c --- a/drivers/ide/pci/amd74xx.c Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/amd74xx.c Wed Oct 8 12:24:57 2003 @@ -1,5 +1,5 @@ /* - * Version 2.9 + * Version 2.11 * * AMD 755/756/766/8111 and nVidia nForce IDE driver for Linux. * @@ -65,7 +65,6 @@ }; static struct amd_ide_chip *amd_config; -static unsigned char amd_enabled; static unsigned int amd_80w; static unsigned int amd_clock; @@ -103,7 +102,7 @@ amd_print("----------AMD BusMastering IDE Configuration----------------"); - amd_print("Driver Version: 2.9"); + amd_print("Driver Version: 2.11"); amd_print("South Bridge: %s", pci_name(bmide_dev)); pci_read_config_byte(dev, PCI_REVISION_ID, &t); @@ -250,9 +249,6 @@ static void amd74xx_tune_drive(ide_drive_t *drive, u8 pio) { - if (!((amd_enabled >> HWIF(drive)->channel) & 1)) - return; - if (pio == 255) { amd_set_drive(drive, ide_find_best_mode(drive, XFER_PIO | XFER_EPIO)); return; @@ -330,9 +326,6 @@ break; } - pci_read_config_dword(dev, AMD_IDE_ENABLE, &u); - amd_enabled = ((u & 1) ? 2 : 0) | ((u & 2) ? 1 : 0); - /* * Take care of prefetch & postwrite. */ @@ -408,23 +401,13 @@ hwif->mwdma_mask = 0x07; hwif->swdma_mask = 0x07; - if (!(hwif->udma_four)) - hwif->udma_four = ((amd_enabled & amd_80w) >> hwif->channel) & 1; + if (!hwif->udma_four) + hwif->udma_four = (amd_80w >> hwif->channel) & 1; hwif->ide_dma_check = &amd74xx_ide_dma_check; if (!noautodma) hwif->autodma = 1; hwif->drives[0].autodma = hwif->autodma; hwif->drives[1].autodma = hwif->autodma; -} - -/* - * We allow the BM-DMA driver only work on enabled interfaces. - */ - -static void __init init_dma_amd74xx(ide_hwif_t *hwif, unsigned long dmabase) -{ - if ((amd_enabled >> hwif->channel) & 1) - ide_setup_dma(hwif, dmabase, 8); } extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); diff -Nru a/drivers/ide/pci/amd74xx.h b/drivers/ide/pci/amd74xx.h --- a/drivers/ide/pci/amd74xx.h Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/amd74xx.h Wed Oct 8 12:24:55 2003 @@ -27,7 +27,6 @@ static unsigned int init_chipset_amd74xx(struct pci_dev *, const char *); static void init_hwif_amd74xx(ide_hwif_t *); -static void init_dma_amd74xx(ide_hwif_t *, unsigned long); static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { { /* 0 */ @@ -35,9 +34,7 @@ .device = PCI_DEVICE_ID_AMD_COBRA_7401, .name = "AMD7401", .init_chipset = init_chipset_amd74xx, - .init_iops = NULL, .init_hwif = init_hwif_amd74xx, - .init_dma = init_dma_amd74xx, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, @@ -48,9 +45,7 @@ .device = PCI_DEVICE_ID_AMD_VIPER_7409, .name = "AMD7409", .init_chipset = init_chipset_amd74xx, - .init_iops = NULL, .init_hwif = init_hwif_amd74xx, - .init_dma = init_dma_amd74xx, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, @@ -61,9 +56,7 @@ .device = PCI_DEVICE_ID_AMD_VIPER_7411, .name = "AMD7411", .init_chipset = init_chipset_amd74xx, - .init_iops = NULL, .init_hwif = init_hwif_amd74xx, - .init_dma = init_dma_amd74xx, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, @@ -74,9 +67,7 @@ .device = PCI_DEVICE_ID_AMD_OPUS_7441, .name = "AMD7441", .init_chipset = init_chipset_amd74xx, - .init_iops = NULL, .init_hwif = init_hwif_amd74xx, - .init_dma = init_dma_amd74xx, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, @@ -87,9 +78,7 @@ .device = PCI_DEVICE_ID_AMD_8111_IDE, .name = "AMD8111", .init_chipset = init_chipset_amd74xx, - .init_iops = NULL, .init_hwif = init_hwif_amd74xx, - .init_dma = init_dma_amd74xx, .autodma = AUTODMA, .channels = 2, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, @@ -101,9 +90,7 @@ .device = PCI_DEVICE_ID_NVIDIA_NFORCE_IDE, .name = "NFORCE", .init_chipset = init_chipset_amd74xx, - .init_iops = NULL, .init_hwif = init_hwif_amd74xx, - .init_dma = init_dma_amd74xx, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, @@ -115,9 +102,7 @@ .device = PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE, .name = "NFORCE2", .init_chipset = init_chipset_amd74xx, - .init_iops = NULL, .init_hwif = init_hwif_amd74xx, - .init_dma = init_dma_amd74xx, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, diff -Nru a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c --- a/drivers/ide/pci/cmd64x.c Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/cmd64x.c Wed Oct 8 12:24:57 2003 @@ -742,11 +742,6 @@ hwif->drives[1].autodma = hwif->autodma; } -static void __init init_dma_cmd64x (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); static int __devinit cmd64x_init_one(struct pci_dev *dev, const struct pci_device_id *id) diff -Nru a/drivers/ide/pci/cmd64x.h b/drivers/ide/pci/cmd64x.h --- a/drivers/ide/pci/cmd64x.h Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/cmd64x.h Wed Oct 8 12:24:56 2003 @@ -81,7 +81,6 @@ static unsigned int init_chipset_cmd64x(struct pci_dev *, const char *); static void init_hwif_cmd64x(ide_hwif_t *); -static void init_dma_cmd64x(ide_hwif_t *, unsigned long); static ide_pci_device_t cmd64x_chipsets[] __devinitdata = { { /* 0 */ @@ -91,7 +90,6 @@ .init_chipset = init_chipset_cmd64x, .init_iops = NULL, .init_hwif = init_hwif_cmd64x, - .init_dma = init_dma_cmd64x, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -104,7 +102,6 @@ .init_chipset = init_chipset_cmd64x, .init_iops = NULL, .init_hwif = init_hwif_cmd64x, - .init_dma = init_dma_cmd64x, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x51,0x80,0x80}}, @@ -117,7 +114,6 @@ .init_chipset = init_chipset_cmd64x, .init_iops = NULL, .init_hwif = init_hwif_cmd64x, - .init_dma = init_dma_cmd64x, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -130,7 +126,6 @@ .init_chipset = init_chipset_cmd64x, .init_iops = NULL, .init_hwif = init_hwif_cmd64x, - .init_dma = init_dma_cmd64x, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/cs5530.c b/drivers/ide/pci/cs5530.c --- a/drivers/ide/pci/cs5530.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/cs5530.c Wed Oct 8 12:24:56 2003 @@ -404,19 +404,6 @@ hwif->drives[1].autodma = hwif->autodma; } -/** - * init_dma_cs5530 - set up for DMA - * @hwif: interface - * @dmabase: DMA base address - * - * FIXME: this can go away - */ - -static void __init init_dma_cs5530 (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); diff -Nru a/drivers/ide/pci/cs5530.h b/drivers/ide/pci/cs5530.h --- a/drivers/ide/pci/cs5530.h Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/cs5530.h Wed Oct 8 12:24:55 2003 @@ -27,7 +27,6 @@ static unsigned int init_chipset_cs5530(struct pci_dev *, const char *); static void init_hwif_cs5530(ide_hwif_t *); -static void init_dma_cs5530(ide_hwif_t *, unsigned long); static ide_pci_device_t cs5530_chipsets[] __devinitdata = { { /* 0 */ @@ -37,7 +36,6 @@ .init_chipset = init_chipset_cs5530, .init_iops = NULL, .init_hwif = init_hwif_cs5530, - .init_dma = init_dma_cs5530, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c --- a/drivers/ide/pci/generic.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/generic.c Wed Oct 8 12:24:56 2003 @@ -72,11 +72,6 @@ hwif->drives[1].autodma = hwif->autodma; } -static void init_dma_generic (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); #if 0 diff -Nru a/drivers/ide/pci/generic.h b/drivers/ide/pci/generic.h --- a/drivers/ide/pci/generic.h Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/generic.h Wed Oct 8 12:24:55 2003 @@ -7,7 +7,6 @@ static unsigned int init_chipset_generic(struct pci_dev *, const char *); static void init_hwif_generic(ide_hwif_t *); -static void init_dma_generic(ide_hwif_t *, unsigned long); static ide_pci_device_t generic_chipsets[] __devinitdata = { { /* 0 */ @@ -17,7 +16,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x43,0x08,0x08}, {0x47,0x08,0x08}}, @@ -30,7 +28,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -43,7 +40,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -56,7 +52,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = NODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -69,7 +64,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = NODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -82,7 +76,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = NODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -95,7 +88,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -108,7 +100,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -121,7 +112,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -134,7 +124,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -157,7 +146,6 @@ .init_chipset = init_chipset_generic, .init_iops = NULL, .init_hwif = init_hwif_generic, - .init_dma = init_dma_generic, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c --- a/drivers/ide/pci/hpt34x.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/hpt34x.c Wed Oct 8 12:24:56 2003 @@ -315,11 +315,6 @@ hwif->drives[1].autodma = hwif->autodma; } -static void __init init_dma_hpt34x (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); static int __devinit hpt34x_init_one(struct pci_dev *dev, const struct pci_device_id *id) diff -Nru a/drivers/ide/pci/hpt34x.h b/drivers/ide/pci/hpt34x.h --- a/drivers/ide/pci/hpt34x.h Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/hpt34x.h Wed Oct 8 12:24:55 2003 @@ -33,7 +33,6 @@ static unsigned int init_chipset_hpt34x(struct pci_dev *, const char *); static void init_hwif_hpt34x(ide_hwif_t *); -static void init_dma_hpt34x(ide_hwif_t *, unsigned long); static ide_pci_device_t hpt34x_chipsets[] __devinitdata = { { /* 0 */ @@ -43,7 +42,6 @@ .init_chipset = init_chipset_hpt34x, .init_iops = NULL, .init_hwif = init_hwif_hpt34x, - .init_dma = init_dma_hpt34x, .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/it8172.c b/drivers/ide/pci/it8172.c --- a/drivers/ide/pci/it8172.c Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/it8172.c Wed Oct 8 12:24:57 2003 @@ -284,11 +284,6 @@ hwif->drives[1].autodma = hwif->autodma; } -static void __init init_dma_it8172 (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); static int __devinit it8172_init_one(struct pci_dev *dev, const struct pci_device_id *id) diff -Nru a/drivers/ide/pci/it8172.h b/drivers/ide/pci/it8172.h --- a/drivers/ide/pci/it8172.h Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/it8172.h Wed Oct 8 12:24:56 2003 @@ -17,7 +17,6 @@ static void init_setup_it8172(struct pci_dev *, ide_pci_device_t *); static unsigned int init_chipset_it8172(struct pci_dev *, const char *); static void init_hwif_it8172(ide_hwif_t *); -static void init_dma_it8172(ide_hwif_t *, unsigned long); static ide_pci_device_t it8172_chipsets[] __devinitdata = { { /* 0 */ @@ -28,7 +27,6 @@ .init_chipset = init_chipset_it8172, .init_iops = NULL, .init_hwif = init_hwif_it8172, - .init_dma = init_dma_it8172, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x40,0x00,0x01}}, diff -Nru a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c --- a/drivers/ide/pci/ns87415.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/ns87415.c Wed Oct 8 12:24:56 2003 @@ -217,11 +217,6 @@ hwif->drives[1].autodma = hwif->autodma; } -static void __init init_dma_ns87415 (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); static int __devinit ns87415_init_one(struct pci_dev *dev, const struct pci_device_id *id) diff -Nru a/drivers/ide/pci/ns87415.h b/drivers/ide/pci/ns87415.h --- a/drivers/ide/pci/ns87415.h Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/ns87415.h Wed Oct 8 12:24:55 2003 @@ -6,7 +6,6 @@ #include static void init_hwif_ns87415(ide_hwif_t *); -static void init_dma_ns87415(ide_hwif_t *, unsigned long); static ide_pci_device_t ns87415_chipsets[] __devinitdata = { { /* 0 */ @@ -16,7 +15,6 @@ .init_chipset = NULL, .init_iops = NULL, .init_hwif = init_hwif_ns87415, - .init_dma = init_dma_ns87415, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/opti621.c b/drivers/ide/pci/opti621.c --- a/drivers/ide/pci/opti621.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/opti621.c Wed Oct 8 12:24:56 2003 @@ -348,11 +348,6 @@ hwif->drives[1].autodma = hwif->autodma; } -static void __init init_dma_opti621 (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); static void __init init_setup_opti621 (struct pci_dev *dev, ide_pci_device_t *d) diff -Nru a/drivers/ide/pci/opti621.h b/drivers/ide/pci/opti621.h --- a/drivers/ide/pci/opti621.h Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/opti621.h Wed Oct 8 12:24:57 2003 @@ -7,7 +7,6 @@ static void init_setup_opti621(struct pci_dev *, ide_pci_device_t *); static void init_hwif_opti621(ide_hwif_t *); -static void init_dma_opti621(ide_hwif_t *, unsigned long); static ide_pci_device_t opti621_chipsets[] __devinitdata = { { /* 0 */ @@ -18,7 +17,6 @@ .init_chipset = NULL, .init_iops = NULL, .init_hwif = init_hwif_opti621, - .init_dma = init_dma_opti621, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}}, @@ -32,7 +30,6 @@ .init_chipset = NULL, .init_iops = NULL, .init_hwif = init_hwif_opti621, - .init_dma = init_dma_opti621, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x45,0x80,0x00}, {0x40,0x08,0x00}}, diff -Nru a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c --- a/drivers/ide/pci/pdc202xx_new.c Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/pdc202xx_new.c Wed Oct 8 12:24:57 2003 @@ -563,11 +563,6 @@ #endif /* PDC202_DEBUG_CABLE */ } -static void __init init_dma_pdc202new (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); extern void ide_setup_pci_devices(struct pci_dev *, struct pci_dev *, ide_pci_device_t *); diff -Nru a/drivers/ide/pci/pdc202xx_new.h b/drivers/ide/pci/pdc202xx_new.h --- a/drivers/ide/pci/pdc202xx_new.h Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/pdc202xx_new.h Wed Oct 8 12:24:55 2003 @@ -188,7 +188,6 @@ static void init_setup_pdc20276(struct pci_dev *dev, ide_pci_device_t *d); static unsigned int init_chipset_pdcnew(struct pci_dev *, const char *); static void init_hwif_pdc202new(ide_hwif_t *); -static void init_dma_pdc202new(ide_hwif_t *, unsigned long); static ide_pci_device_t pdcnew_chipsets[] __devinitdata = { { /* 0 */ @@ -199,7 +198,6 @@ .init_chipset = init_chipset_pdcnew, .init_iops = NULL, .init_hwif = init_hwif_pdc202new, - .init_dma = init_dma_pdc202new, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -213,7 +211,6 @@ .init_chipset = init_chipset_pdcnew, .init_iops = NULL, .init_hwif = init_hwif_pdc202new, - .init_dma = init_dma_pdc202new, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -227,7 +224,6 @@ .init_chipset = init_chipset_pdcnew, .init_iops = NULL, .init_hwif = init_hwif_pdc202new, - .init_dma = init_dma_pdc202new, .channels = 2, .autodma = AUTODMA, #ifdef CONFIG_PDC202XX_FORCE @@ -245,7 +241,6 @@ .init_chipset = init_chipset_pdcnew, .init_iops = NULL, .init_hwif = init_hwif_pdc202new, - .init_dma = init_dma_pdc202new, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -259,7 +254,6 @@ .init_chipset = init_chipset_pdcnew, .init_iops = NULL, .init_hwif = init_hwif_pdc202new, - .init_dma = init_dma_pdc202new, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -273,7 +267,6 @@ .init_chipset = init_chipset_pdcnew, .init_iops = NULL, .init_hwif = init_hwif_pdc202new, - .init_dma = init_dma_pdc202new, .channels = 2, .autodma = AUTODMA, #ifdef CONFIG_PDC202XX_FORCE @@ -291,7 +284,6 @@ .init_chipset = init_chipset_pdcnew, .init_iops = NULL, .init_hwif = init_hwif_pdc202new, - .init_dma = init_dma_pdc202new, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/pdcadma.c b/drivers/ide/pci/pdcadma.c --- a/drivers/ide/pci/pdcadma.c Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,162 +0,0 @@ -/* - * linux/drivers/ide/pci/pdcadma.c Version 0.05 Sept 10, 2002 - * - * Copyright (C) 1999-2000 Andre Hedrick - * May be copied or modified under the terms of the GNU General Public License - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "pdcadma.h" - -#if defined(DISPLAY_PDCADMA_TIMINGS) && defined(CONFIG_PROC_FS) -#include -#include - -static u8 pdcadma_proc = 0; -#define PDC_MAX_DEVS 5 -static struct pci_dev *pdc_devs[PDC_MAX_DEVS]; -static int n_pdc_devs; - -static int pdcadma_get_info (char *buffer, char **addr, off_t offset, int count) -{ - char *p = buffer; - int i; - - for (i = 0; i < n_pdc_devs; i++) { - struct pci_dev *dev = pdc_devs[i]; - unsigned long bibma = pci_resource_start(dev, 4); - - p += sprintf(p, "\n " - "PDC ADMA %04X Chipset.\n", dev->device); - p += sprintf(p, "UDMA\n"); - p += sprintf(p, "PIO\n"); - - } - return p-buffer; /* => must be less than 4k! */ -} -#endif /* defined(DISPLAY_PDCADMA_TIMINGS) && defined(CONFIG_PROC_FS) */ - -/* - * pdcadma_dma functions() initiates/aborts (U)DMA read/write - * operations on a drive. - */ -#if 0 - int (*ide_dma_read)(ide_drive_t *drive); - int (*ide_dma_write)(ide_drive_t *drive); - int (*ide_dma_begin)(ide_drive_t *drive); - int (*ide_dma_end)(ide_drive_t *drive); - int (*ide_dma_check)(ide_drive_t *drive); - int (*ide_dma_on)(ide_drive_t *drive); - int (*ide_dma_off)(ide_drive_t *drive); - int (*ide_dma_off_quietly)(ide_drive_t *drive); - int (*ide_dma_test_irq)(ide_drive_t *drive); - int (*ide_dma_host_on)(ide_drive_t *drive); - int (*ide_dma_host_off)(ide_drive_t *drive); - int (*ide_dma_bad_drive)(ide_drive_t *drive); - int (*ide_dma_good_drive)(ide_drive_t *drive); - int (*ide_dma_count)(ide_drive_t *drive); - int (*ide_dma_verbose)(ide_drive_t *drive); - int (*ide_dma_retune)(ide_drive_t *drive); - int (*ide_dma_lostirq)(ide_drive_t *drive); - int (*ide_dma_timeout)(ide_drive_t *drive); - -#endif - -static unsigned int __init init_chipset_pdcadma (struct pci_dev *dev, const char *name) -{ -#if defined(DISPLAY_PDCADMA_TIMINGS) && defined(CONFIG_PROC_FS) - pdc_devs[n_pdc_devs++] = dev; - - if (!pdcadma_proc) { - pdcadma_proc = 1; - ide_pci_register_host_proc(&pdcadma_procs[0]); - } -#endif /* DISPLAY_PDCADMA_TIMINGS && CONFIG_PROC_FS */ - return 0; -} - -static void __init init_hwif_pdcadma (ide_hwif_t *hwif) -{ - hwif->autodma = 0; - hwif->dma_base = 0; - -// hwif->tuneproc = &pdcadma_tune_drive; -// hwif->speedproc = &pdcadma_tune_chipset; - -// if (hwif->dma_base) { -// hwif->autodma = 1; -// } - - hwif->udma_four = 1; - -// hwif->atapi_dma = 1; -// hwif->ultra_mask = 0x7f; -// hwif->mwdma_mask = 0x07; -// hwif->swdma_mask = 0x07; - -} - -static void __init init_dma_pdcadma (ide_hwif_t *hwif, unsigned long dmabase) -{ -#if 0 - ide_setup_dma(hwif, dmabase, 8); -#endif -} - -extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); - -static int __devinit pdcadma_init_one(struct pci_dev *dev, const struct pci_device_id *id) -{ - ide_pci_device_t *d = &pdcadma_chipsets[id->driver_data]; - if (dev->device != d->device) - BUG(); - ide_setup_pci_device(dev, d); - MOD_INC_USE_COUNT; - return 1; -} - -static struct pci_device_id pdcadma_pci_tbl[] = { - { PCI_VENDOR_ID_PDC, PCI_DEVICE_ID_PDC_1841, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - { 0, }, -}; - -static struct pci_driver driver = { - .name = "PDCADMA-IDE", - .id_table = pdcadma_pci_tbl, - .probe = pdcadma_init_one, -}; - -static int pdcadma_ide_init(void) -{ - return ide_pci_register_driver(&driver); -} - -static void pdcadma_ide_exit(void) -{ - ide_pci_unregister_driver(&driver); -} - -module_init(pdcadma_ide_init); -module_exit(pdcadma_ide_exit); - -MODULE_AUTHOR("Andre Hedrick"); -MODULE_DESCRIPTION("PCI driver module for PDCADMA IDE"); -MODULE_LICENSE("GPL"); diff -Nru a/drivers/ide/pci/pdcadma.h b/drivers/ide/pci/pdcadma.h --- a/drivers/ide/pci/pdcadma.h Wed Oct 8 12:24:55 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,56 +0,0 @@ -#ifndef PDC_ADMA_H -#define PDC_ADMA_H - -#include -#include -#include - -#undef DISPLAY_PDCADMA_TIMINGS - -#if defined(DISPLAY_PDCADMA_TIMINGS) && defined(CONFIG_PROC_FS) -#include -#include - -static u8 pdcadma_proc; - -static int pdcadma_get_info(char *, char **, off_t, int); - -static ide_pci_host_proc_t pdcadma_procs[] __initdata = { - { - .name = "pdcadma", - .set = 1, - .get_info = pdcadma_get_info, - .parent = NULL, - }, -}; -#endif /* defined(DISPLAY_PDCADMA_TIMINGS) && defined(CONFIG_PROC_FS) */ - -static void init_setup_pdcadma(struct pci_dev *, ide_pci_device_t *); -static unsigned int init_chipset_pdcadma(struct pci_dev *, const char *); -static void init_hwif_pdcadma(ide_hwif_t *); -static void init_dma_pdcadma(ide_hwif_t *, unsigned long); - -static ide_pci_device_t pdcadma_chipsets[] __devinitdata = { - { /* 0 */ - .vendor = PCI_VENDOR_ID_PDC, - .device = PCI_DEVICE_ID_PDC_1841, - .name = "PDCADMA", - .init_setup = init_setup_pdcadma, - .init_chipset = init_chipset_pdcadma, - .init_iops = NULL, - .init_hwif = init_hwif_pdcadma, - .init_dma = init_dma_pdcadma, - .channels = 2, - .autodma = NODMA, - .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, - .bootable = OFF_BOARD, - .extra = 0, - },{ - .vendor = 0, - .device = 0, - .channels = 0, - .bootable = EOL, - } -}; - -#endif /* PDC_ADMA_H */ diff -Nru a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c --- a/drivers/ide/pci/piix.c Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/piix.c Wed Oct 8 12:24:55 2003 @@ -709,21 +709,6 @@ hwif->drives[0].autodma = hwif->autodma; } -/** - * init_dma_piix - set up the PIIX DMA - * @hwif: IDE interface - * @dmabase: DMA PCI base - * - * Set up the DMA on the PIIX controller, providing a DMA base is - * available. The PIIX follows the normal specs so we do nothing - * magical here. - */ - -static void __init init_dma_piix (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); /** diff -Nru a/drivers/ide/pci/piix.h b/drivers/ide/pci/piix.h --- a/drivers/ide/pci/piix.h Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/piix.h Wed Oct 8 12:24:56 2003 @@ -30,8 +30,6 @@ static void init_setup_piix(struct pci_dev *, ide_pci_device_t *); static unsigned int __devinit init_chipset_piix(struct pci_dev *, const char *); static void init_hwif_piix(ide_hwif_t *); -static void init_dma_piix(ide_hwif_t *, unsigned long); - /* * Table of the various PIIX capability blocks @@ -47,7 +45,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -61,7 +58,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -75,7 +71,6 @@ .init_chipset = NULL, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = NULL, .channels = 2, .autodma = NODMA, .enablebits = {{0x6D,0x80,0x80}, {0x6F,0x80,0x80}}, @@ -89,7 +84,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -103,7 +97,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -117,7 +110,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -131,7 +123,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -145,7 +136,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -159,7 +149,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -173,7 +162,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -187,7 +175,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -201,7 +188,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -215,7 +201,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -229,7 +214,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -243,7 +227,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -257,7 +240,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -271,7 +253,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -285,7 +266,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, @@ -299,7 +279,6 @@ .init_chipset = init_chipset_piix, .init_iops = NULL, .init_hwif = init_hwif_piix, - .init_dma = init_dma_piix, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, diff -Nru a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c --- a/drivers/ide/pci/sc1200.c Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/sc1200.c Wed Oct 8 12:24:57 2003 @@ -396,44 +396,44 @@ __u32 regs[4]; } sc1200_saved_state_t; -static int sc1200_save_state (struct pci_dev *dev, u32 state) + +static int sc1200_suspend (struct pci_dev *dev, u32 state) { ide_hwif_t *hwif = NULL; -printk("SC1200: save_state(%u)\n", state); - if (state != 0) - return 0; // we only save state when going from full power to less - // - // Loop over all interfaces that are part of this PCI device: - // - while ((hwif = lookup_pci_dev(hwif, dev)) != NULL) { - sc1200_saved_state_t *ss; - unsigned int basereg, r; - // - // allocate a permanent save area, if not already allocated - // - ss = (sc1200_saved_state_t *)hwif->config_data; - if (ss == NULL) { - ss = kmalloc(sizeof(sc1200_saved_state_t), GFP_KERNEL); - if (ss == NULL) - return -ENOMEM; - (sc1200_saved_state_t *)hwif->config_data = ss; - } - ss = (sc1200_saved_state_t *)hwif->config_data; + printk("SC1200: suspend(%u)\n", state); + + if (state == 0) { + // we only save state when going from full power to less + // - // Save timing registers: this may be unnecessary if BIOS also does it + // Loop over all interfaces that are part of this PCI device: // - basereg = hwif->channel ? 0x50 : 0x40; - for (r = 0; r < 4; ++r) { - pci_read_config_dword (hwif->pci_dev, basereg + (r<<2), &ss->regs[r]); + while ((hwif = lookup_pci_dev(hwif, dev)) != NULL) { + sc1200_saved_state_t *ss; + unsigned int basereg, r; + // + // allocate a permanent save area, if not already allocated + // + ss = (sc1200_saved_state_t *)hwif->config_data; + if (ss == NULL) { + ss = kmalloc(sizeof(sc1200_saved_state_t), GFP_KERNEL); + if (ss == NULL) + return -ENOMEM; + (sc1200_saved_state_t *)hwif->config_data = ss; + } + ss = (sc1200_saved_state_t *)hwif->config_data; + // + // Save timing registers: this may be unnecessary if + // BIOS also does it + // + basereg = hwif->channel ? 0x50 : 0x40; + for (r = 0; r < 4; ++r) { + pci_read_config_dword (hwif->pci_dev, basereg + (r<<2), &ss->regs[r]); + } } } - return 0; -} -static int sc1200_suspend (struct pci_dev *dev, u32 state) -{ - printk("SC1200: suspend(%u)\n", state); /* You don't need to iterate over disks -- sysfs should have done that for you already */ pci_disable_device(dev); @@ -545,11 +545,6 @@ hwif->drives[1].autodma = hwif->autodma; } -static void __init init_dma_sc1200 (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); @@ -572,7 +567,6 @@ .name = "SC1200 IDE", .id_table = sc1200_pci_tbl, .probe = sc1200_init_one, - .save_state = sc1200_save_state, .suspend = sc1200_suspend, .resume = sc1200_resume, }; diff -Nru a/drivers/ide/pci/sc1200.h b/drivers/ide/pci/sc1200.h --- a/drivers/ide/pci/sc1200.h Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/sc1200.h Wed Oct 8 12:24:56 2003 @@ -27,7 +27,6 @@ static unsigned int init_chipset_sc1200(struct pci_dev *, const char *); static void init_hwif_sc1200(ide_hwif_t *); -static void init_dma_sc1200(ide_hwif_t *, unsigned long); static ide_pci_device_t sc1200_chipsets[] __devinitdata = { { /* 0 */ @@ -37,7 +36,6 @@ .init_chipset = init_chipset_sc1200, .init_iops = NULL, .init_hwif = init_hwif_sc1200, - .init_dma = init_dma_sc1200, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c --- a/drivers/ide/pci/siimage.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/siimage.c Wed Oct 8 12:24:56 2003 @@ -1150,20 +1150,6 @@ hwif->drives[1].autodma = hwif->autodma; } -/** - * init_dma_siimage - set up IDE DMA - * @hwif: interface - * @dmabase: DMA base address to use - * - * For the SI chips this requires no special set up so we can just - * let the IDE DMA core do the usual work. - */ - -static void __init init_dma_siimage (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); diff -Nru a/drivers/ide/pci/siimage.h b/drivers/ide/pci/siimage.h --- a/drivers/ide/pci/siimage.h Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/siimage.h Wed Oct 8 12:24:56 2003 @@ -44,7 +44,6 @@ static unsigned int init_chipset_siimage(struct pci_dev *, const char *); static void init_iops_siimage(ide_hwif_t *); static void init_hwif_siimage(ide_hwif_t *); -static void init_dma_siimage(ide_hwif_t *, unsigned long); static ide_pci_device_t siimage_chipsets[] __devinitdata = { { /* 0 */ @@ -54,7 +53,6 @@ .init_chipset = init_chipset_siimage, .init_iops = init_iops_siimage, .init_hwif = init_hwif_siimage, - .init_dma = init_dma_siimage, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -67,7 +65,6 @@ .init_chipset = init_chipset_siimage, .init_iops = init_iops_siimage, .init_hwif = init_hwif_siimage, - .init_dma = init_dma_siimage, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, @@ -80,7 +77,6 @@ .init_chipset = init_chipset_siimage, .init_iops = init_iops_siimage, .init_hwif = init_hwif_siimage, - .init_dma = init_dma_siimage, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, diff -Nru a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c --- a/drivers/ide/pci/sis5513.c Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/sis5513.c Wed Oct 8 12:24:56 2003 @@ -942,11 +942,6 @@ return; } -static void __init init_dma_sis5513 (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); diff -Nru a/drivers/ide/pci/sis5513.h b/drivers/ide/pci/sis5513.h --- a/drivers/ide/pci/sis5513.h Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/sis5513.h Wed Oct 8 12:24:57 2003 @@ -27,7 +27,6 @@ static unsigned int init_chipset_sis5513(struct pci_dev *, const char *); static void init_hwif_sis5513(ide_hwif_t *); -static void init_dma_sis5513(ide_hwif_t *, unsigned long); static ide_pci_device_t sis5513_chipsets[] __devinitdata = { { /* 0 */ @@ -37,7 +36,6 @@ .init_chipset = init_chipset_sis5513, .init_iops = NULL, .init_hwif = init_hwif_sis5513, - .init_dma = init_dma_sis5513, .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, diff -Nru a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c --- a/drivers/ide/pci/slc90e66.c Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/slc90e66.c Wed Oct 8 12:24:57 2003 @@ -362,11 +362,6 @@ #endif /* !CONFIG_BLK_DEV_IDEDMA */ } -static void __init init_dma_slc90e66 (ide_hwif_t *hwif, unsigned long dmabase) -{ - ide_setup_dma(hwif, dmabase, 8); -} - extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); diff -Nru a/drivers/ide/pci/slc90e66.h b/drivers/ide/pci/slc90e66.h --- a/drivers/ide/pci/slc90e66.h Wed Oct 8 12:24:56 2003 +++ b/drivers/ide/pci/slc90e66.h Wed Oct 8 12:24:56 2003 @@ -29,7 +29,6 @@ static unsigned int init_chipset_slc90e66(struct pci_dev *, const char *); static void init_hwif_slc90e66(ide_hwif_t *); -static void init_dma_slc90e66(ide_hwif_t *, unsigned long); static ide_pci_device_t slc90e66_chipsets[] __devinitdata = { { /* 0 */ @@ -39,7 +38,6 @@ .init_chipset = init_chipset_slc90e66, .init_iops = NULL, .init_hwif = init_hwif_slc90e66, - .init_dma = init_dma_slc90e66, .channels = 2, .autodma = AUTODMA, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, diff -Nru a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c --- a/drivers/ide/pci/via82cxxx.c Wed Oct 8 12:24:55 2003 +++ b/drivers/ide/pci/via82cxxx.c Wed Oct 8 12:24:55 2003 @@ -1,6 +1,6 @@ /* * - * Version 3.37 + * Version 3.38 * * VIA IDE driver for Linux. Supported southbridges: * @@ -96,7 +96,6 @@ }; static struct via_isa_bridge *via_config; -static unsigned char via_enabled; static unsigned int via_80w; static unsigned int via_clock; static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" }; @@ -146,7 +145,7 @@ via_print("----------VIA BusMastering IDE Configuration" "----------------"); - via_print("Driver Version: 3.37"); + via_print("Driver Version: 3.38"); via_print("South Bridge: VIA %s", via_config->name); @@ -370,9 +369,6 @@ static void via82cxxx_tune_drive(ide_drive_t *drive, u8 pio) { - if (!((via_enabled >> HWIF(drive)->channel) & 1)) - return; - if (pio == 255) { via_set_drive(drive, ide_find_best_mode(drive, XFER_PIO | XFER_EPIO)); @@ -506,7 +502,6 @@ */ pci_read_config_byte(dev, VIA_IDE_ENABLE, &v); - via_enabled = ((v & 1) ? 2 : 0) | ((v & 2) ? 1 : 0); /* * Set up FIFO sizes and thresholds. @@ -523,9 +518,9 @@ /* Fix FIFO split between channels */ if (via_config->flags & VIA_SET_FIFO) { t &= (t & 0x9f); - switch (via_enabled) { - case 1: t |= 0x00; break; /* 16 on primary */ - case 2: t |= 0x60; break; /* 16 on secondary */ + switch (v & 3) { + case 2: t |= 0x00; break; /* 16 on primary */ + case 1: t |= 0x60; break; /* 16 on secondary */ case 3: t |= 0x20; break; /* 8 pri 8 sec */ } } @@ -603,27 +598,13 @@ hwif->mwdma_mask = 0x07; hwif->swdma_mask = 0x07; - if (!(hwif->udma_four)) - hwif->udma_four = ((via_enabled & via_80w) >> hwif->channel) & 1; + if (!hwif->udma_four) + hwif->udma_four = (via_80w >> hwif->channel) & 1; hwif->ide_dma_check = &via82cxxx_ide_dma_check; if (!noautodma) hwif->autodma = 1; hwif->drives[0].autodma = hwif->autodma; hwif->drives[1].autodma = hwif->autodma; -} - -/** - * init_dma_via82cxxx - set up for IDE DMA - * @hwif: IDE interface - * @dmabase: DMA base address - * - * We allow the BM-DMA driver to only work on enabled interfaces. - */ - -static void __init init_dma_via82cxxx(ide_hwif_t *hwif, unsigned long dmabase) -{ - if ((via_enabled >> hwif->channel) & 1) - ide_setup_dma(hwif, dmabase, 8); } extern void ide_setup_pci_device(struct pci_dev *, ide_pci_device_t *); diff -Nru a/drivers/ide/pci/via82cxxx.h b/drivers/ide/pci/via82cxxx.h --- a/drivers/ide/pci/via82cxxx.h Wed Oct 8 12:24:57 2003 +++ b/drivers/ide/pci/via82cxxx.h Wed Oct 8 12:24:57 2003 @@ -27,7 +27,6 @@ static unsigned int init_chipset_via82cxxx(struct pci_dev *, const char *); static void init_hwif_via82cxxx(ide_hwif_t *); -static void init_dma_via82cxxx(ide_hwif_t *, unsigned long); static ide_pci_device_t via82cxxx_chipsets[] __devinitdata = { { /* 0 */ @@ -35,9 +34,7 @@ .device = PCI_DEVICE_ID_VIA_82C576_1, .name = "VP_IDE", .init_chipset = init_chipset_via82cxxx, - .init_iops = NULL, .init_hwif = init_hwif_via82cxxx, - .init_dma = init_dma_via82cxxx, .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, @@ -48,9 +45,7 @@ .device = PCI_DEVICE_ID_VIA_82C586_1, .name = "VP_IDE", .init_chipset = init_chipset_via82cxxx, - .init_iops = NULL, .init_hwif = init_hwif_via82cxxx, - .init_dma = init_dma_via82cxxx, .channels = 2, .autodma = NOAUTODMA, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, diff -Nru a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c --- a/drivers/input/joystick/analog.c Wed Oct 8 12:24:57 2003 +++ b/drivers/input/joystick/analog.c Wed Oct 8 12:24:57 2003 @@ -159,7 +159,7 @@ #define DELTA(x,y) ((y)-(x)) #define TIME_NAME "TSC" #elif __alpha__ -#define GET_TIME(x) do { x = get_cycles(x); } while (0) +#define GET_TIME(x) do { x = get_cycles(); } while (0) #define DELTA(x,y) ((y)-(x)) #define TIME_NAME "PCC" #else diff -Nru a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig --- a/drivers/input/keyboard/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/input/keyboard/Kconfig Wed Oct 8 12:24:57 2003 @@ -12,10 +12,11 @@ If unsure, say Y. config KEYBOARD_ATKBD - tristate "AT keyboard support" if EMBEDDED || !X86 + tristate "AT keyboard support" if !PC default y depends on INPUT && INPUT_KEYBOARD - select SERIO_I8042 + select SERIO + select SERIO_I8042 if PC help Say Y here if you want to use a standard AT or PS/2 keyboard. Usually you'll need this, unless you have a different type keyboard (USB, ADB diff -Nru a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig --- a/drivers/input/mouse/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/input/mouse/Kconfig Wed Oct 8 12:24:57 2003 @@ -15,7 +15,8 @@ tristate "PS/2 mouse" default y depends on INPUT && INPUT_MOUSE - select SERIO_I8042 + select SERIO + select SERIO_I8042 if PC ---help--- Say Y here if you have a PS/2 mouse connected to your system. This includes the standard 2 or 3-button PS/2 mouse, as well as PS/2 diff -Nru a/drivers/input/power.c b/drivers/input/power.c --- a/drivers/input/power.c Wed Oct 8 12:24:57 2003 +++ b/drivers/input/power.c Wed Oct 8 12:24:57 2003 @@ -45,9 +45,7 @@ static int suspend_button_pushed = 0; static void suspend_button_task_handler(void *data) { - //extern void pm_do_suspend(void); udelay(200); /* debounce */ - //pm_do_suspend(); suspend_button_pushed = 0; } @@ -66,8 +64,6 @@ switch (code) { case KEY_SUSPEND: printk("Powering down entire device\n"); - - //pm_send_all(PM_SUSPEND, dev); if (!suspend_button_pushed) { suspend_button_pushed = 1; diff -Nru a/drivers/isdn/hardware/eicon/debuglib.h b/drivers/isdn/hardware/eicon/debuglib.h --- a/drivers/isdn/hardware/eicon/debuglib.h Wed Oct 8 12:24:57 2003 +++ b/drivers/isdn/hardware/eicon/debuglib.h Wed Oct 8 12:24:57 2003 @@ -103,28 +103,28 @@ #define DL_TO_KERNEL 0x40000000 #ifdef DIVA_NO_DEBUGLIB -#define myDbgPrint_LOG(x,...) do { } while(0); -#define myDbgPrint_FTL(x,...) do { } while(0); -#define myDbgPrint_ERR(x,...) do { } while(0); -#define myDbgPrint_TRC(x,...) do { } while(0); -#define myDbgPrint_MXLOG(x,...) do { } while(0); -#define myDbgPrint_EVL(x,...) do { } while(0); -#define myDbgPrint_REG(x,...) do { } while(0); -#define myDbgPrint_MEM(x,...) do { } while(0); -#define myDbgPrint_SPL(x,...) do { } while(0); -#define myDbgPrint_IRP(x,...) do { } while(0); -#define myDbgPrint_TIM(x,...) do { } while(0); -#define myDbgPrint_BLK(x,...) do { } while(0); -#define myDbgPrint_TAPI(x,...) do { } while(0); -#define myDbgPrint_NDIS(x,...) do { } while(0); -#define myDbgPrint_CONN(x,...) do { } while(0); -#define myDbgPrint_STAT(x,...) do { } while(0); -#define myDbgPrint_SEND(x,...) do { } while(0); -#define myDbgPrint_RECV(x,...) do { } while(0); -#define myDbgPrint_PRV0(x,...) do { } while(0); -#define myDbgPrint_PRV1(x,...) do { } while(0); -#define myDbgPrint_PRV2(x,...) do { } while(0); -#define myDbgPrint_PRV3(x,...) do { } while(0); +#define myDbgPrint_LOG(x...) do { } while(0); +#define myDbgPrint_FTL(x...) do { } while(0); +#define myDbgPrint_ERR(x...) do { } while(0); +#define myDbgPrint_TRC(x...) do { } while(0); +#define myDbgPrint_MXLOG(x...) do { } while(0); +#define myDbgPrint_EVL(x...) do { } while(0); +#define myDbgPrint_REG(x...) do { } while(0); +#define myDbgPrint_MEM(x...) do { } while(0); +#define myDbgPrint_SPL(x...) do { } while(0); +#define myDbgPrint_IRP(x...) do { } while(0); +#define myDbgPrint_TIM(x...) do { } while(0); +#define myDbgPrint_BLK(x...) do { } while(0); +#define myDbgPrint_TAPI(x...) do { } while(0); +#define myDbgPrint_NDIS(x...) do { } while(0); +#define myDbgPrint_CONN(x...) do { } while(0); +#define myDbgPrint_STAT(x...) do { } while(0); +#define myDbgPrint_SEND(x...) do { } while(0); +#define myDbgPrint_RECV(x...) do { } while(0); +#define myDbgPrint_PRV0(x...) do { } while(0); +#define myDbgPrint_PRV1(x...) do { } while(0); +#define myDbgPrint_PRV2(x...) do { } while(0); +#define myDbgPrint_PRV3(x...) do { } while(0); #define DBG_TEST(func,args) do { } while(0); #define DBG_EVL_ID(args) do { } while(0); diff -Nru a/drivers/isdn/hardware/eicon/divamnt.c b/drivers/isdn/hardware/eicon/divamnt.c --- a/drivers/isdn/hardware/eicon/divamnt.c Wed Oct 8 12:24:56 2003 +++ b/drivers/isdn/hardware/eicon/divamnt.c Wed Oct 8 12:24:56 2003 @@ -1,4 +1,4 @@ -/* $Id: divamnt.c,v 1.27 2003/09/09 06:46:29 schindler Exp $ +/* $Id: divamnt.c,v 1.28 2003/09/18 06:57:18 schindler Exp $ * * Driver for Eicon DIVA Server ISDN cards. * Maint module @@ -24,10 +24,9 @@ #include "platform.h" #include "di_defs.h" #include "divasync.h" -#include "di_defs.h" #include "debug_if.h" -static char *main_revision = "$Revision: 1.27 $"; +static char *main_revision = "$Revision: 1.28 $"; static int major; diff -Nru a/drivers/isdn/hardware/eicon/divasmain.c b/drivers/isdn/hardware/eicon/divasmain.c --- a/drivers/isdn/hardware/eicon/divasmain.c Wed Oct 8 12:24:55 2003 +++ b/drivers/isdn/hardware/eicon/divasmain.c Wed Oct 8 12:24:55 2003 @@ -1,4 +1,4 @@ -/* $Id: divasmain.c,v 1.40 2003/09/10 08:02:33 schindler Exp $ +/* $Id: divasmain.c,v 1.43 2003/09/22 08:57:31 schindler Exp $ * * Low level driver for Eicon DIVA Server ISDN cards. * @@ -9,13 +9,11 @@ * of the GNU General Public License, incorporated herein by reference. */ -#define __KERNEL_SYSCALLS__ #include #include #include #include #include -#include #include #include #include @@ -43,7 +41,7 @@ #include "diva_dma.h" #include "diva_pci.h" -static char *main_revision = "$Revision: 1.40 $"; +static char *main_revision = "$Revision: 1.43 $"; static int major; diff -Nru a/drivers/isdn/hardware/eicon/dqueue.c b/drivers/isdn/hardware/eicon/dqueue.c --- a/drivers/isdn/hardware/eicon/dqueue.c Wed Oct 8 12:24:56 2003 +++ b/drivers/isdn/hardware/eicon/dqueue.c Wed Oct 8 12:24:56 2003 @@ -1,10 +1,10 @@ -/* $Id: dqueue.c,v 1.1.2.2 2001/02/11 14:40:41 armin Exp $ +/* $Id: dqueue.c,v 1.5 2003/04/12 21:40:49 schindler Exp $ * * Driver for Eicon DIVA Server ISDN cards. * User Mode IDI Interface * - * Copyright 2000,2001 by Armin Schindler (mac@melware.de) - * Copyright 2000,2001 Cytronics & Melware (info@melware.de) + * Copyright 2000-2003 by Armin Schindler (mac@melware.de) + * Copyright 2000-2003 Cytronics & Melware (info@melware.de) * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. diff -Nru a/drivers/isdn/hardware/eicon/mntfunc.c b/drivers/isdn/hardware/eicon/mntfunc.c --- a/drivers/isdn/hardware/eicon/mntfunc.c Wed Oct 8 12:24:55 2003 +++ b/drivers/isdn/hardware/eicon/mntfunc.c Wed Oct 8 12:24:55 2003 @@ -1,4 +1,4 @@ -/* $Id: mntfunc.c,v 1.15 2003/08/25 14:49:53 schindler Exp $ +/* $Id: mntfunc.c,v 1.16 2003/09/18 06:57:17 schindler Exp $ * * Driver for Eicon DIVA Server ISDN cards. * Maint module @@ -14,7 +14,6 @@ #include "platform.h" #include "di_defs.h" #include "divasync.h" -#include "di_defs.h" #include "debug_if.h" extern char *DRIVERRELEASE_MNT; diff -Nru a/drivers/isdn/hardware/eicon/os_capi.h b/drivers/isdn/hardware/eicon/os_capi.h --- a/drivers/isdn/hardware/eicon/os_capi.h Wed Oct 8 12:24:57 2003 +++ b/drivers/isdn/hardware/eicon/os_capi.h Wed Oct 8 12:24:57 2003 @@ -1,10 +1,10 @@ -/* $Id: os_capi.h,v 1.1.2.2 2002/10/02 14:38:38 armin Exp $ +/* $Id: os_capi.h,v 1.7 2003/04/12 21:40:49 schindler Exp $ * * ISDN interface module for Eicon active cards DIVA. * CAPI Interface OS include files * - * Copyright 2000-2002 by Armin Schindler (mac@melware.de) - * Copyright 2000-2002 Cytronics & Melware (info@melware.de) + * Copyright 2000-2003 by Armin Schindler (mac@melware.de) + * Copyright 2000-2003 Cytronics & Melware (info@melware.de) * * This software may be used and distributed according to the terms * of the GNU General Public License, incorporated herein by reference. diff -Nru a/drivers/isdn/hardware/eicon/platform.h b/drivers/isdn/hardware/eicon/platform.h --- a/drivers/isdn/hardware/eicon/platform.h Wed Oct 8 12:24:57 2003 +++ b/drivers/isdn/hardware/eicon/platform.h Wed Oct 8 12:24:57 2003 @@ -1,4 +1,4 @@ -/* $Id: platform.h,v 1.31 2003/09/08 15:15:22 schindler Exp $ +/* $Id: platform.h,v 1.32 2003/09/18 06:59:59 schindler Exp $ * * platform.h * @@ -19,7 +19,6 @@ #endif #include -#include #include #include #include diff -Nru a/drivers/isdn/hisax/Kconfig b/drivers/isdn/hisax/Kconfig --- a/drivers/isdn/hisax/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/isdn/hisax/Kconfig Wed Oct 8 12:24:57 2003 @@ -367,7 +367,7 @@ config HISAX_SEDLBAUER_CS tristate "Sedlbauer PCMCIA cards" - depends on PCMCIA + depends on PCMCIA && HISAX_SEDLBAUER help This enables the PCMCIA client driver for the Sedlbauer Speed Star and Speed Star II cards. diff -Nru a/drivers/isdn/i4l/isdn_common.c b/drivers/isdn/i4l/isdn_common.c --- a/drivers/isdn/i4l/isdn_common.c Wed Oct 8 12:24:56 2003 +++ b/drivers/isdn/i4l/isdn_common.c Wed Oct 8 12:24:56 2003 @@ -2229,8 +2229,10 @@ isdn_info_update(); return 0; -/* err_tty_modem:*/ +#ifdef CONFIG_ISDN_PPP + err_tty_modem: isdn_tty_exit(); +#endif err_cleanup_devfs: isdn_cleanup_devfs(); unregister_chrdev(ISDN_MAJOR, "isdn"); diff -Nru a/drivers/isdn/pcbit/drv.c b/drivers/isdn/pcbit/drv.c --- a/drivers/isdn/pcbit/drv.c Wed Oct 8 12:24:57 2003 +++ b/drivers/isdn/pcbit/drv.c Wed Oct 8 12:24:57 2003 @@ -87,15 +87,13 @@ if (mem_base >= 0xA0000 && mem_base <= 0xFFFFF ) { dev->ph_mem = mem_base; - if (check_mem_region(dev->ph_mem, 4096)) { + if (!request_mem_region(dev->ph_mem, 4096, "PCBIT mem")) { printk(KERN_WARNING "PCBIT: memory region %lx-%lx already in use\n", dev->ph_mem, dev->ph_mem + 4096); kfree(dev); dev_pcbit[board] = NULL; return -EACCES; - } else { - request_mem_region(dev->ph_mem, 4096, "PCBIT mem"); } dev->sh_mem = (unsigned char*)ioremap(dev->ph_mem, 4096); } diff -Nru a/drivers/isdn/pcbit/module.c b/drivers/isdn/pcbit/module.c --- a/drivers/isdn/pcbit/module.c Wed Oct 8 12:24:57 2003 +++ b/drivers/isdn/pcbit/module.c Wed Oct 8 12:24:57 2003 @@ -82,12 +82,14 @@ static void __exit pcbit_exit(void) { +#ifdef MODULE int board; for (board = 0; board < num_boards; board++) pcbit_terminate(board); printk(KERN_NOTICE "PCBIT-D module unloaded\n"); +#endif } #ifndef MODULE diff -Nru a/drivers/mca/mca-legacy.c b/drivers/mca/mca-legacy.c --- a/drivers/mca/mca-legacy.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mca/mca-legacy.c Wed Oct 8 12:24:57 2003 @@ -28,7 +28,7 @@ #include #include -#include +#include #include /* NOTE: This structure is stack allocated */ diff -Nru a/drivers/mca/mca-proc.c b/drivers/mca/mca-proc.c --- a/drivers/mca/mca-proc.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mca/mca-proc.c Wed Oct 8 12:24:57 2003 @@ -120,12 +120,13 @@ len += sprintf(buf+len, "Id: %02x%02x\n", mca_dev->pos[1], mca_dev->pos[0]); len += sprintf(buf+len, "Enabled: %s\nPOS: ", - mca_isenabled(slot) ? "Yes" : "No"); + mca_device_status(mca_dev) == MCA_ADAPTER_NORMAL ? + "Yes" : "No"); for(i=0; i<8; i++) { len += sprintf(buf+len, "%02x ", mca_dev->pos[i]); } len += sprintf(buf+len, "\nDriver Installed: %s", - mca_is_adapter_used(slot) ? "Yes" : "No"); + mca_device_claimed(mca_dev) ? "Yes" : "No"); buf[len++] = '\n'; buf[len] = 0; @@ -189,6 +190,7 @@ /* Initialize /proc/mca entries for existing adapters */ for(i = 0; i < MCA_NUMADAPTERS; i++) { + enum MCA_AdapterStatus status; mca_dev = mca_find_device_by_slot(i); if(!mca_dev) continue; @@ -200,7 +202,10 @@ else if(i == MCA_INTEGSCSI) sprintf(mca_dev->procname,"scsi"); else if(i == MCA_MOTHERBOARD) sprintf(mca_dev->procname,"planar"); - if(!mca_isadapter(i)) continue; + status = mca_device_status(mca_dev); + if (status != MCA_ADAPTER_NORMAL && + status != MCA_ADAPTER_DISABLED) + continue; node = create_proc_read_entry(mca_dev->procname, 0, proc_mca, mca_read_proc, (void *)mca_dev); diff -Nru a/drivers/md/Kconfig b/drivers/md/Kconfig --- a/drivers/md/Kconfig Wed Oct 8 12:24:55 2003 +++ b/drivers/md/Kconfig Wed Oct 8 12:24:55 2003 @@ -38,9 +38,7 @@ use the so-called linear mode, i.e. it will combine the hard disk partitions by simply appending one to the other. - If you want to compile this as a module ( = code which can be - inserted in and removed from the running kernel whenever you want), - say M here and read . The module + To compile this as a module, choose M here: the module will be called linear. If unsure, say Y. @@ -60,9 +58,7 @@ . There you will also learn where to get the supporting user space utilities raidtools. - If you want to compile this as a module ( = code which can be - inserted in and removed from the running kernel whenever you want), - say M here and read . The module + To compile this as a module, choose M here: the module will be called raid0. If unsure, say Y. @@ -84,11 +80,8 @@ . There you will also learn where to get the supporting user space utilities raidtools. - If you want to use such a RAID-1 set, say Y. This code is also - available as a module called raid1 ( = code which can be inserted - in and removed from the running kernel whenever you want). If you - want to compile it as a module, say M here and read - . + If you want to use such a RAID-1 set, say Y. To compile this code + as a module, choose M here: the module will be called raid1. If unsure, say Y. @@ -109,11 +102,8 @@ . There you will also learn where to get the supporting user space utilities raidtools. - If you want to use such a RAID-4/RAID-5 set, say Y. This code is - also available as a module called raid5 ( = code which can be - inserted in and removed from the running kernel whenever you want). - If you want to compile it as a module, say M here and read - . + If you want to use such a RAID-4/RAID-5 set, say Y. To compile + this code as a module, choose M here: the module will be called raid5. If unsure, say Y. @@ -140,8 +130,8 @@ Higher level volume managers such as LVM2 use this driver. - If you want to compile this as a module, say M here and read - . The module will be called dm-mod. + To compile this as a module, choose M here: the module will be + called dm-mod. If unsure, say N. diff -Nru a/drivers/media/Kconfig b/drivers/media/Kconfig --- a/drivers/media/Kconfig Wed Oct 8 12:24:56 2003 +++ b/drivers/media/Kconfig Wed Oct 8 12:24:56 2003 @@ -19,7 +19,7 @@ Documentation for the original API is included in the file Documentation/video4linux/API.html. Documentation for V4L2 is - available on the web at http://bytesex.org/v4l/ + available on the web at . To compile this driver as a module, choose M here: the module will be called videodev. diff -Nru a/drivers/media/common/Kconfig b/drivers/media/common/Kconfig --- a/drivers/media/common/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/media/common/Kconfig Wed Oct 8 12:24:57 2003 @@ -1,11 +1,12 @@ config VIDEO_SAA7146 tristate - default y if DVB_AV7110=y || DVB_BUDGET=y || DVB_BUDGET_AV=y || VIDEO_MXB=y || VIDEO_DPC=y || VIDEO_HEXIUM_ORION=y || VIDEO_HEXIUM_GEMINI=y - default m if DVB_AV7110=m || DVB_BUDGET=m || DVB_BUDGET_AV=m || VIDEO_MXB=m || VIDEO_DPC=m || VIDEO_HEXIUM_ORION=m || VIDEO_HEXIUM_GEMINI=m - depends on VIDEO_DEV && PCI && I2C + select I2C + +config VIDEO_SAA7146_VV + tristate + select VIDEO_BUF + select VIDEO_VIDEOBUF + select VIDEO_SAA7146 config VIDEO_VIDEOBUF tristate - default y if VIDEO_SAA7134=y || VIDEO_BT848=y || VIDEO_SAA7146=y - default m if VIDEO_SAA7134=m || VIDEO_BT848=m || VIDEO_SAA7146=m - depends on VIDEO_DEV diff -Nru a/drivers/media/common/Makefile b/drivers/media/common/Makefile --- a/drivers/media/common/Makefile Wed Oct 8 12:24:57 2003 +++ b/drivers/media/common/Makefile Wed Oct 8 12:24:57 2003 @@ -1,5 +1,6 @@ saa7146-objs := saa7146_i2c.o saa7146_core.o saa7146_vv-objs := saa7146_vv_ksyms.o saa7146_fops.o saa7146_video.o saa7146_hlp.o saa7146_vbi.o -obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o saa7146_vv.o +obj-$(CONFIG_VIDEO_SAA7146) += saa7146.o +obj-$(CONFIG_VIDEO_SAA7146_VV) += saa7146_vv.o diff -Nru a/drivers/media/common/saa7146_core.c b/drivers/media/common/saa7146_core.c --- a/drivers/media/common/saa7146_core.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/common/saa7146_core.c Wed Oct 8 12:24:57 2003 @@ -139,34 +139,42 @@ return 0; } -void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, struct scatterlist *list, int length ) +void saa7146_pgtable_build_single(struct pci_dev *pci, struct saa7146_pgtable *pt, + struct scatterlist *list, int sglen ) { u32 *ptr, fill; + int nr_pages = 0; int i,p; -//fm DEB_EE(("pci:%p, pt:%p, sl:%p, len:%d\n",pci,pt,list,length)); + BUG_ON( 0 == sglen); /* if we have a user buffer, the first page may not be aligned to a page boundary. */ pt->offset = list->offset; ptr = pt->cpu; - for (i = 0; i < length; i++, list++) { + for (i = 0; i < sglen; i++, list++) { +/* + printk("i:%d, adr:0x%08x, len:%d, offset:%d\n", i,sg_dma_address(list), sg_dma_len(list), list->offset); +*/ for (p = 0; p * 4096 < list->length; p++, ptr++) { - *ptr = sg_dma_address(list) - list->offset; + *ptr = sg_dma_address(list) + p * 4096; + nr_pages++; } } /* safety; fill the page table up with the last valid page */ fill = *(ptr-1); - for(;i<1024;i++) { + for(i=nr_pages;i<1024;i++) { *ptr++ = fill; } + /* ptr = pt->cpu; - for(j=0;j<60;j++) { - printk("ptr1 %d: 0x%08x\n",j,ptr[j]); + printk("offset: %d\n",pt->offset); + for(i=0;i<5;i++) { + printk("ptr1 %d: 0x%08x\n",i,ptr[i]); } */ } diff -Nru a/drivers/media/common/saa7146_fops.c b/drivers/media/common/saa7146_fops.c --- a/drivers/media/common/saa7146_fops.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/common/saa7146_fops.c Wed Oct 8 12:24:56 2003 @@ -304,6 +304,7 @@ return videobuf_poll_stream(file, &fh->vbi_q, wait); q = &fh->vbi_q; } else { + DEB_D(("using video queue.\n")); q = &fh->video_q; } @@ -311,14 +312,17 @@ buf = list_entry(q->stream.next, struct videobuf_buffer, stream); if (!buf) { + DEB_D(("buf == NULL!\n")); return POLLERR; } poll_wait(file, &buf->done, wait); if (buf->state == STATE_DONE || buf->state == STATE_ERROR) { + DEB_D(("poll succeeded!\n")); return POLLIN|POLLRDNORM; } + DEB_D(("nothing to poll for, buf->state:%d\n",buf->state)); return 0; } diff -Nru a/drivers/media/common/saa7146_hlp.c b/drivers/media/common/saa7146_hlp.c --- a/drivers/media/common/saa7146_hlp.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/common/saa7146_hlp.c Wed Oct 8 12:24:57 2003 @@ -742,6 +742,7 @@ int width = buf->fmt->width; int height = buf->fmt->height; + int bytesperline = buf->fmt->bytesperline; enum v4l2_field field = buf->fmt->field; int depth = sfmt->depth; @@ -749,7 +750,11 @@ DEB_CAP(("[size=%dx%d,fields=%s]\n", width,height,v4l2_field_names[field])); + if( bytesperline != 0) { + vdma1.pitch = bytesperline*2; + } else { vdma1.pitch = (width*depth*2)/8; + } vdma1.num_line_byte = ((vv->standard->v_field<<16) + vv->standard->h_pixels); vdma1.base_page = buf->pt[0].dma | ME1; @@ -799,6 +804,8 @@ vdma2->pitch = width; vdma3->pitch = width; + /* fixme: look at bytesperline! */ + if( 0 != vv->vflip ) { vdma2->prot_addr = buf->pt[1].offset; vdma2->base_even = ((vdma2->pitch/2)*height)+buf->pt[1].offset; @@ -871,6 +878,8 @@ DEB_CAP(("[size=%dx%d,fields=%s]\n", width,height,v4l2_field_names[field])); + /* fixme: look at bytesperline! */ + /* fixme: what happens for user space buffers here?. The offsets are most likely wrong, this version here only works for page-aligned buffers, modifications to the pagetable-functions are necessary...*/ @@ -997,8 +1006,10 @@ WRITE_RPS0(CMD_PAUSE | o_wait); WRITE_RPS0(CMD_PAUSE | e_wait); } else if ( vv->last_field == V4L2_FIELD_TOP ) { + WRITE_RPS0(CMD_PAUSE | (vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? MASK_10 : MASK_09)); WRITE_RPS0(CMD_PAUSE | o_wait); } else if ( vv->last_field == V4L2_FIELD_BOTTOM ) { + WRITE_RPS0(CMD_PAUSE | (vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? MASK_10 : MASK_09)); WRITE_RPS0(CMD_PAUSE | e_wait); } @@ -1033,16 +1044,6 @@ DEB_CAP(("buf:%p, next:%p\n",buf,next)); -/* - printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1)); - printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1)); - printk("vdma%d.prot_addr: 0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1)); - printk("vdma%d.base_page: 0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1)); - printk("vdma%d.pitch: 0x%08x\n", 1,saa7146_read(dev,PITCH1)); - printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1)); - printk("vdma%d => vptr : 0x%08x\n", 1,saa7146_read(dev,PCI_VDP1)); -*/ - vdma1_prot_addr = saa7146_read(dev, PROT_ADDR1); if( 0 == vdma1_prot_addr ) { /* clear out beginning of streaming bit (rps register 0)*/ @@ -1068,6 +1069,16 @@ calculate_video_dma_grab_packed(dev, buf); program_capture_engine(dev,0); } + +/* + printk("vdma%d.base_even: 0x%08x\n", 1,saa7146_read(dev,BASE_EVEN1)); + printk("vdma%d.base_odd: 0x%08x\n", 1,saa7146_read(dev,BASE_ODD1)); + printk("vdma%d.prot_addr: 0x%08x\n", 1,saa7146_read(dev,PROT_ADDR1)); + printk("vdma%d.base_page: 0x%08x\n", 1,saa7146_read(dev,BASE_PAGE1)); + printk("vdma%d.pitch: 0x%08x\n", 1,saa7146_read(dev,PITCH1)); + printk("vdma%d.num_line_byte: 0x%08x\n", 1,saa7146_read(dev,NUM_LINE_BYTE1)); + printk("vdma%d => vptr : 0x%08x\n", 1,saa7146_read(dev,PCI_VDP1)); +*/ /* write the address of the rps-program */ saa7146_write(dev, RPS_ADDR0, dev->d_rps0.dma_handle); diff -Nru a/drivers/media/common/saa7146_i2c.c b/drivers/media/common/saa7146_i2c.c --- a/drivers/media/common/saa7146_i2c.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/common/saa7146_i2c.c Wed Oct 8 12:24:57 2003 @@ -1,3 +1,4 @@ +#include #include /* helper function */ diff -Nru a/drivers/media/common/saa7146_vbi.c b/drivers/media/common/saa7146_vbi.c --- a/drivers/media/common/saa7146_vbi.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/common/saa7146_vbi.c Wed Oct 8 12:24:55 2003 @@ -235,7 +235,7 @@ saa7146_pgtable_free(dev->pci, &buf->pt[2]); saa7146_pgtable_alloc(dev->pci, &buf->pt[2]); - err = videobuf_iolock(dev->pci,&buf->vb); + err = videobuf_iolock(dev->pci,&buf->vb,NULL); if (err) goto oops; saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen); diff -Nru a/drivers/media/common/saa7146_video.c b/drivers/media/common/saa7146_video.c --- a/drivers/media/common/saa7146_video.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/common/saa7146_video.c Wed Oct 8 12:24:57 2003 @@ -169,6 +169,7 @@ struct saa7146_format *fmt; enum v4l2_field field; int maxw, maxh; + int calc_bpl; DEB_EE(("V4L2_BUF_TYPE_VIDEO_CAPTURE: dev:%p, fh:%p\n",dev,fh)); @@ -211,8 +212,18 @@ f->fmt.pix.width = maxw; if (f->fmt.pix.height > maxh) f->fmt.pix.height = maxh; - f->fmt.pix.sizeimage = - (f->fmt.pix.width * f->fmt.pix.height * fmt->depth)/8; + + calc_bpl = (f->fmt.pix.width * fmt->depth)/8; + + if (f->fmt.pix.bytesperline < calc_bpl) + f->fmt.pix.bytesperline = calc_bpl; + + if (f->fmt.pix.bytesperline > (2*PAGE_SIZE * fmt->depth)/8) /* arbitrary constraint */ + f->fmt.pix.bytesperline = calc_bpl; + + f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * f->fmt.pix.height; + DEB_D(("w:%d, h:%d, bytesperline:%d, sizeimage:%d\n",f->fmt.pix.width,f->fmt.pix.height,f->fmt.pix.bytesperline,f->fmt.pix.sizeimage)); + return 0; } case V4L2_BUF_TYPE_VIDEO_OVERLAY: @@ -359,41 +370,41 @@ static struct v4l2_queryctrl controls[] = { { - .id = V4L2_CID_BRIGHTNESS, - .name = "Brightness", - .minimum = 0, - .maximum = 255, - .step = 1, - .default_value = 128, - .type = V4L2_CTRL_TYPE_INTEGER, + id: V4L2_CID_BRIGHTNESS, + name: "Brightness", + minimum: 0, + maximum: 255, + step: 1, + default_value: 128, + type: V4L2_CTRL_TYPE_INTEGER, },{ - .id = V4L2_CID_CONTRAST, - .name = "Contrast", - .minimum = 0, - .maximum = 127, - .step = 1, - .default_value = 64, - .type = V4L2_CTRL_TYPE_INTEGER, + id: V4L2_CID_CONTRAST, + name: "Contrast", + minimum: 0, + maximum: 127, + step: 1, + default_value: 64, + type: V4L2_CTRL_TYPE_INTEGER, },{ - .id = V4L2_CID_SATURATION, - .name = "Saturation", - .minimum = 0, - .maximum = 127, - .step = 1, - .default_value = 64, - .type = V4L2_CTRL_TYPE_INTEGER, + id: V4L2_CID_SATURATION, + name: "Saturation", + minimum: 0, + maximum: 127, + step: 1, + default_value: 64, + type: V4L2_CTRL_TYPE_INTEGER, },{ - .id = V4L2_CID_VFLIP, - .name = "Vertical flip", - .minimum = 0, - .maximum = 1, - .type = V4L2_CTRL_TYPE_BOOLEAN, + id: V4L2_CID_VFLIP, + name: "Vertical flip", + minimum: 0, + maximum: 1, + type: V4L2_CTRL_TYPE_BOOLEAN, },{ - .id = V4L2_CID_HFLIP, - .name = "Horizontal flip", - .minimum = 0, - .maximum = 1, - .type = V4L2_CTRL_TYPE_BOOLEAN, + id: V4L2_CID_HFLIP, + name: "Horizontal flip", + minimum: 0, + maximum: 1, + type: V4L2_CTRL_TYPE_BOOLEAN, }, }; static int NUM_CONTROLS = sizeof(controls)/sizeof(struct v4l2_queryctrl); @@ -549,7 +560,7 @@ int length = buf->vb.dma.sglen; struct saa7146_format *sfmt = format_by_fourcc(dev,buf->fmt->pixelformat); - DEB_EE(("dev:%p, buf:%p\n",dev,buf)); + DEB_EE(("dev:%p, buf:%p, sg_len:%d\n",dev,buf,length)); if( 0 != IS_PLANAR(sfmt->trans)) { struct saa7146_pgtable *pt1 = &buf->pt[0]; @@ -729,6 +740,81 @@ return 0; } +/* capturing to framebuffer */ + +int overlay_reqbufs(struct saa7146_dev *dev, struct v4l2_requestbuffers *req) +{ +/* struct saa7146_fh *fh = file->private_data; + + if (req->count > VIDEO_MAX_FRAME) + req->count = VIDEO_MAX_FRAME; + + *size = fh->video_fmt.sizeimage; + +*/ + return 0; +} +int overlay_querybuf(struct saa7146_dev *dev, struct v4l2_buffer *buf) +{ + return 0; +} +int overlay_qbuf(struct saa7146_dev *dev, struct v4l2_buffer *b) +{ +/* if (b->index < 0 || b->index >= VIDEO_MAX_FRAME) { + DEB_D(("index %d out of bounds.\n",b->index)); + goto -EINVAL; + } + + buf = q->bufs[b->index]; + if (NULL == buf) { + printk("videobuf_qbuf: NULL == buf\n"); + goto done; + } + if (0 == buf->baddr) { + printk("videobuf_qbuf: 0 == buf->baddr\n"); + goto done; + } + if (buf->state == STATE_QUEUED || + buf->state == STATE_ACTIVE) { + printk("videobuf_qbuf: already queued or activated.\n"); + goto done; + } + + field = videobuf_next_field(q); + retval = q->ops->buf_prepare(file,buf,field); + if (0 != retval) { + printk("videobuf_qbuf: buf_prepare() failed.\n"); + goto done; + } + + list_add_tail(&buf->stream,&q->stream); + if (q->streaming) { + spin_lock_irqsave(q->irqlock,flags); + q->ops->buf_queue(file,buf); + spin_unlock_irqrestore(q->irqlock,flags); + } + retval = 0; + + done: + up(&q->lock); + return retval; +*/ + return 0; +} +int overlay_dqbuf(struct saa7146_dev *dev, struct v4l2_buffer *buf) +{ + return 0; +} +int overlay_streamon(struct saa7146_dev *dev) +{ + return 0; +} +int overlay_streamoff(struct saa7146_dev *dev) +{ + return 0; +} + + /* * This function is _not_ called directly, but from * video_generic_ioctl (and maybe others). userspace @@ -794,7 +880,7 @@ strcpy(cap->driver, "saa7146 v4l2"); strlcpy(cap->card, dev->ext->name, sizeof(cap->card)); - sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); + sprintf(cap->bus_info,"PCI:%s",dev->pci->slot_name); cap->version = SAA7146_VERSION_CODE; cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | @@ -818,6 +904,8 @@ { struct v4l2_framebuffer *fb = arg; struct saa7146_format *fmt; + struct saa7146_fh *ov_fh = NULL; + int restart_overlay = 0; DEB_EE(("VIDIOC_S_FBUF\n")); @@ -827,10 +915,6 @@ return -EPERM; } */ - if( 0 != vv->ov_data ) { - DEB_D(("VIDIOC_S_FBUF: overlay is active.\n")); - return -EPERM; - } /* check args */ fmt = format_by_fourcc(dev,fb->fmt.pixelformat); @@ -838,12 +922,27 @@ return -EINVAL; } + down(&dev->lock); + + if( vv->ov_data != NULL ) { + ov_fh = vv->ov_data->fh; + saa7146_stop_preview(ov_fh); + restart_overlay = 1; + } + /* ok, accept it */ vv->ov_fb = *fb; vv->ov_fmt = fmt; if (0 == vv->ov_fb.fmt.bytesperline) vv->ov_fb.fmt.bytesperline = vv->ov_fb.fmt.width*fmt->depth/8; + + if( 0 != restart_overlay ) { + saa7146_start_preview(ov_fh); + } + + up(&dev->lock); + return 0; } case VIDIOC_ENUM_FMT: @@ -884,8 +983,11 @@ ctrl = ctrl_by_id(c->id); if( NULL == ctrl ) { + return -EINVAL; +/* c->flags = V4L2_CTRL_FLAG_DISABLED; return 0; +*/ } DEB_EE(("VIDIOC_QUERYCTRL: id:%d\n",c->id)); @@ -1037,44 +1139,71 @@ return err; } case VIDIOC_REQBUFS: { - DEB_D(("VIDIOC_REQBUFS \n")); - return videobuf_reqbufs(file,q,arg); + struct v4l2_requestbuffers *req = arg; + DEB_D(("VIDIOC_REQBUFS, type:%d\n",req->type)); +/* + if( req->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) { + return overlay_reqbufs(dev,req); + } +*/ + return videobuf_reqbufs(file,q,req); } case VIDIOC_QUERYBUF: { - DEB_D(("VIDIOC_QUERYBUF \n")); - return videobuf_querybuf(q,arg); + struct v4l2_buffer *buf = arg; + DEB_D(("VIDIOC_QUERYBUF, type:%d, offset:%d\n",buf->type,buf->m.offset)); +/* if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) { + return overlay_querybuf(dev,buf); + } + */ return videobuf_querybuf(q,buf); } case VIDIOC_QBUF: { - struct v4l2_buffer *b = arg; + struct v4l2_buffer *buf = arg; int ret = 0; - ret = videobuf_qbuf(file,q,b); - DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,b->index)); +/* if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) { + return overlay_qbuf(dev,buf); + } + */ ret = videobuf_qbuf(file,q,buf); + DEB_D(("VIDIOC_QBUF: ret:%d, index:%d\n",ret,buf->index)); return ret; } case VIDIOC_DQBUF: { - struct v4l2_buffer *b = arg; + struct v4l2_buffer *buf = arg; int ret = 0; - ret = videobuf_dqbuf(file,q,b); - DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,b->index)); +/* if( buf->type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) { + return overlay_dqbuf(dev,buf); + } + */ ret = videobuf_dqbuf(file,q,buf); + DEB_D(("VIDIOC_DQBUF: ret:%d, index:%d\n",ret,buf->index)); return ret; } case VIDIOC_STREAMON: { - DEB_D(("VIDIOC_STREAMON \n")); + int *type = arg; + DEB_D(("VIDIOC_STREAMON, type:%d\n",*type)); + if( 0 != ops->capture_begin ) { if( 0 != (err = ops->capture_begin(fh))) { return err; } } +/* if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) { + err = overlay_streamon(dev); + } else { */ err = videobuf_streamon(file,q); +/* } */ return err; } case VIDIOC_STREAMOFF: { - DEB_D(("VIDIOC_STREAMOFF \n")); + int *type = arg; + + DEB_D(("VIDIOC_STREAMOFF, type:%d\n",*type)); if( 0 != ops->capture_end ) { ops->capture_end(fh); } - err = videobuf_streamoff(file,q); - return 0; +/* if( *type == V4L2_BUF_TYPE_VIDEO_OVERLAY ) { + return overlay_streamoff(dev); + } + */ err = videobuf_streamoff(file,q); + return err; } case VIDIOCGMBUF: { @@ -1090,7 +1219,8 @@ q = &fh->video_q; down(&q->lock); - err = videobuf_mmap_setup(file,q,gbuffers,gbufsize); // ,V4L2_MEMORY_MMAP); + err = videobuf_mmap_setup(file,q,gbuffers,gbufsize, + V4L2_MEMORY_MMAP); if (err < 0) { up(&q->lock); return err; @@ -1134,6 +1264,8 @@ struct saa7146_buf *buf = (struct saa7146_buf *)vb; int size,err = 0; + DEB_CAP(("vbuf:%p\n",vb)); + /* sanity checks */ if (fh->video_fmt.width < 64 || fh->video_fmt.height < 64 || @@ -1152,6 +1284,7 @@ DEB_CAP(("buffer_prepare [size=%dx%d,bytes=%d,fields=%s]\n", fh->video_fmt.width,fh->video_fmt.height,size,v4l2_field_names[fh->video_fmt.field])); if (buf->vb.width != fh->video_fmt.width || + buf->vb.bytesperline != fh->video_fmt.bytesperline || buf->vb.height != fh->video_fmt.height || buf->vb.size != size || buf->vb.field != field || @@ -1163,6 +1296,7 @@ if (STATE_NEEDS_INIT == buf->vb.state) { struct saa7146_format *sfmt; + buf->vb.bytesperline = fh->video_fmt.bytesperline; buf->vb.width = fh->video_fmt.width; buf->vb.height = fh->video_fmt.height; buf->vb.size = size; @@ -1185,7 +1319,7 @@ saa7146_pgtable_alloc(dev->pci, &buf->pt[0]); } - err = videobuf_iolock(dev->pci,&buf->vb); + err = videobuf_iolock(dev->pci,&buf->vb,NULL); if (err) goto oops; err = saa7146_pgtable_build(dev,buf); @@ -1280,6 +1414,7 @@ fh->video_fmt.width = 384; fh->video_fmt.height = 288; fh->video_fmt.pixelformat = V4L2_PIX_FMT_BGR24; + fh->video_fmt.bytesperline = 0; fh->video_fmt.field = V4L2_FIELD_ANY; sfmt = format_by_fourcc(dev,fh->video_fmt.pixelformat); fh->video_fmt.sizeimage = (fh->video_fmt.width * fh->video_fmt.height * sfmt->depth)/8; diff -Nru a/drivers/media/dvb/Kconfig b/drivers/media/dvb/Kconfig --- a/drivers/media/dvb/Kconfig Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/Kconfig Wed Oct 8 12:24:56 2003 @@ -3,16 +3,16 @@ # menu "Digital Video Broadcasting Devices" - depends on NET && INET config DVB bool "DVB For Linux" + depends on NET && INET ---help--- Support Digital Video Broadcasting hardware. Enable this if you own a DVB adapter and want to use it or if you compile Linux for a digital SetTopBox. - API specs and user tools and are available for example from + API specs and user tools are available from . Please report problems regarding this driver to the LinuxDVB @@ -33,18 +33,16 @@ source "drivers/media/dvb/frontends/Kconfig" comment "Supported SAA7146 based PCI Adapters" - depends on DVB && PCI - + depends on DVB_CORE && PCI source "drivers/media/dvb/ttpci/Kconfig" comment "Supported USB Adapters" - depends on DVB && USB - + depends on DVB_CORE && USB source "drivers/media/dvb/ttusb-budget/Kconfig" source "drivers/media/dvb/ttusb-dec/Kconfig" comment "Supported FlexCopII (B2C2) Adapters" - depends on DVB && PCI + depends on DVB_CORE && PCI source "drivers/media/dvb/b2c2/Kconfig" endmenu diff -Nru a/drivers/media/dvb/dvb-core/Kconfig b/drivers/media/dvb/dvb-core/Kconfig --- a/drivers/media/dvb/dvb-core/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/dvb-core/Kconfig Wed Oct 8 12:24:57 2003 @@ -4,5 +4,8 @@ select CRC32 help DVB core utility functions for device handling, software fallbacks etc. + Say Y when you have a DVB card and want to use it. Say Y if your want + to build your drivers outside the kernel, but need the DVB core. All + in-kernel drivers will select this automatically if needed. + If unsure say N. - Say Y when you have a DVB card and want to use it. If unsure say N. diff -Nru a/drivers/media/dvb/dvb-core/Makefile.lib b/drivers/media/dvb/dvb-core/Makefile.lib --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/dvb-core/Makefile.lib Wed Oct 8 12:24:58 2003 @@ -0,0 +1 @@ +obj-$(CONFIG_DVB_CORE) += crc32.o diff -Nru a/drivers/media/dvb/dvb-core/demux.h b/drivers/media/dvb/dvb-core/demux.h --- a/drivers/media/dvb/dvb-core/demux.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/demux.h Wed Oct 8 12:24:56 2003 @@ -1,4 +1,5 @@ -/* demux.h +/* + * demux.h * * Copyright (c) 2002 Convergence GmbH * diff -Nru a/drivers/media/dvb/dvb-core/dmxdev.h b/drivers/media/dvb/dvb-core/dmxdev.h --- a/drivers/media/dvb/dvb-core/dmxdev.h Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/dvb-core/dmxdev.h Wed Oct 8 12:24:57 2003 @@ -1,9 +1,8 @@ /* * dmxdev.h * - * Copyright (C) 2000 Ralph Metzler - * & Marcus Metzler - for convergence integrated media GmbH + * Copyright (C) 2000 Ralph Metzler & Marcus Metzler + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c --- a/drivers/media/dvb/dvb-core/dvb_demux.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvb_demux.c Wed Oct 8 12:24:56 2003 @@ -391,7 +391,9 @@ spin_lock(&demux->lock); while (count--) { + if(buf[0] == 0x47) { dvb_dmx_swfilter_packet(demux, buf); + } buf += 188; } diff -Nru a/drivers/media/dvb/dvb-core/dvb_demux.h b/drivers/media/dvb/dvb-core/dvb_demux.h --- a/drivers/media/dvb/dvb-core/dvb_demux.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvb_demux.h Wed Oct 8 12:24:56 2003 @@ -1,8 +1,7 @@ /* - * dvb_demux.h - DVB kernel demux API + * dvb_demux.h: DVB kernel demux API * - * Copyright (C) 2000-2001 Marcus Metzler - * & Ralph Metzler + * Copyright (C) 2000-2001 Marcus Metzler & Ralph Metzler * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or diff -Nru a/drivers/media/dvb/dvb-core/dvb_filter.h b/drivers/media/dvb/dvb-core/dvb_filter.h --- a/drivers/media/dvb/dvb-core/dvb_filter.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvb_filter.h Wed Oct 8 12:24:56 2003 @@ -1,3 +1,23 @@ +/* + * dvb_filter.h + * + * Copyright (C) 2003 Convergence GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + #ifndef _DVB_FILTER_H_ #define _DVB_FILTER_H_ diff -Nru a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c --- a/drivers/media/dvb/dvb-core/dvb_frontend.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c Wed Oct 8 12:24:56 2003 @@ -870,6 +870,7 @@ static const struct dvb_device dvbdev_template = { .users = ~0, .writers = 1, + .readers = (~0)-1, .fops = &dvb_frontend_fops, .kernel_ioctl = dvb_frontend_ioctl }; diff -Nru a/drivers/media/dvb/dvb-core/dvb_frontend.h b/drivers/media/dvb/dvb-core/dvb_frontend.h --- a/drivers/media/dvb/dvb-core/dvb_frontend.h Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/dvb-core/dvb_frontend.h Wed Oct 8 12:24:57 2003 @@ -1,9 +1,9 @@ /* - * dvb-core.h + * dvb_frontend.h + * + * Copyright (C) 2001 Ralph Metzler for convergence integrated media GmbH + * overhauled by Holger Waechtler for Convergence GmbH * - * Copyright (C) 2001 Ralph Metzler - * overhauled by Holger Waechtler - * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License diff -Nru a/drivers/media/dvb/dvb-core/dvb_functions.c b/drivers/media/dvb/dvb-core/dvb_functions.c --- a/drivers/media/dvb/dvb-core/dvb_functions.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/dvb-core/dvb_functions.c Wed Oct 8 12:24:57 2003 @@ -1,4 +1,3 @@ -#include #include #include #include diff -Nru a/drivers/media/dvb/dvb-core/dvb_functions.h b/drivers/media/dvb/dvb-core/dvb_functions.h --- a/drivers/media/dvb/dvb-core/dvb_functions.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvb_functions.h Wed Oct 8 12:24:56 2003 @@ -1,7 +1,28 @@ +/* + * dvb_functions.h: isolate some Linux specific stuff from the dvb-core + * that can't be expressed as a one-liner + * in order to make porting to other environments easier + * + * Copyright (C) 2003 Convergence GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Lesser Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + #ifndef __DVB_FUNCTIONS_H__ #define __DVB_FUNCTIONS_H__ - -#include /** * a sleeping delay function, waits i ms diff -Nru a/drivers/media/dvb/dvb-core/dvb_i2c.h b/drivers/media/dvb/dvb-core/dvb_i2c.h --- a/drivers/media/dvb/dvb-core/dvb_i2c.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvb_i2c.h Wed Oct 8 12:24:56 2003 @@ -4,8 +4,8 @@ * Copyright (C) 2002 Holger Waechtler for convergence integrated media GmbH * * 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 + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -13,10 +13,9 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License + * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * Or, point your browser to http://www.gnu.org/copyleft/gpl.html */ #ifndef _DVB_I2C_H_ diff -Nru a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c --- a/drivers/media/dvb/dvb-core/dvb_net.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvb_net.c Wed Oct 8 12:24:56 2003 @@ -456,7 +456,7 @@ } -static int dvb_net_init_dev(struct net_device *dev) +static void dvb_net_setup(struct net_device *dev) { ether_setup(dev); @@ -472,8 +472,6 @@ dev->hard_header_cache = NULL; dev->flags |= IFF_NOARP; - - return 0; } static int get_if(struct dvb_net *dvbnet) @@ -495,7 +493,6 @@ static int dvb_net_add_if(struct dvb_net *dvbnet, u16 pid) { struct net_device *net; - struct dmx_demux *demux; struct dvb_net_priv *priv; int result; int if_num; @@ -503,25 +500,20 @@ if ((if_num = get_if(dvbnet)) < 0) return -EINVAL; - net=&dvbnet->device[if_num]; - demux=dvbnet->demux; + net = alloc_netdev(sizeof(struct dvb_net_priv), "dvb", + dvb_net_setup); + if (!net) + return -ENOMEM; - memset(net, 0, sizeof(struct net_device)); + sprintf(net->name, "dvb%d_%d", dvbnet->dvbdev->adapter->num, if_num); - memcpy(net->name, "dvb0_0", 7); - net->name[3] = dvbnet->dvbdev->adapter->num + '0'; - net->name[5] = if_num + '0'; - net->addr_len = 6; + net->addr_len = 6; memcpy(net->dev_addr, dvbnet->dvbdev->adapter->proposed_mac, 6); - net->next = NULL; - net->init = dvb_net_init_dev; - - if (!(net->priv = kmalloc(sizeof(struct dvb_net_priv), GFP_KERNEL))) - return -ENOMEM; + dvbnet->device[if_num] = net; + priv = net->priv; - memset(priv, 0, sizeof(struct dvb_net_priv)); - priv->demux = demux; + priv->demux = dvbnet->demux; priv->pid = pid; priv->rx_mode = RX_MODE_UNI; @@ -531,6 +523,7 @@ net->base_addr = pid; if ((result = register_netdev(net)) < 0) { + kfree(net); return result; } @@ -540,18 +533,20 @@ static int dvb_net_remove_if(struct dvb_net *dvbnet, int num) { - struct dvb_net_priv *priv = dvbnet->device[num].priv; + struct net_device *net = dvbnet->device[num]; + struct dvb_net_priv *priv = net->priv; if (!dvbnet->state[num]) return -EINVAL; if (priv->in_use) return -EBUSY; - dvb_net_stop(&dvbnet->device[num]); + dvb_net_stop(net); flush_scheduled_work(); - kfree(priv); - unregister_netdev(&dvbnet->device[num]); + unregister_netdev(net); dvbnet->state[num]=0; + free_netdev(net); + return 0; } diff -Nru a/drivers/media/dvb/dvb-core/dvb_net.h b/drivers/media/dvb/dvb-core/dvb_net.h --- a/drivers/media/dvb/dvb-core/dvb_net.h Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/dvb-core/dvb_net.h Wed Oct 8 12:24:55 2003 @@ -1,8 +1,7 @@ /* * dvb_net.h * - * Copyright (C) 2001 Convergence integrated media GmbH - * Ralph Metzler + * Copyright (C) 2001 Ralph Metzler for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -35,7 +34,7 @@ struct dvb_net { struct dvb_device *dvbdev; - struct net_device device[DVB_NET_DEVICES_MAX]; + struct net_device *device[DVB_NET_DEVICES_MAX]; int state[DVB_NET_DEVICES_MAX]; struct dmx_demux *demux; }; diff -Nru a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h --- a/drivers/media/dvb/dvb-core/dvb_ringbuffer.h Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/dvb-core/dvb_ringbuffer.h Wed Oct 8 12:24:57 2003 @@ -5,28 +5,22 @@ * Copyright (C) 2003 Oliver Endriss * * based on code originally found in av7110.c: - * Copyright (C) 1999-2002 Ralph Metzler - * & Marcus Metzler for convergence integrated media GmbH + * Copyright (C) 1999-2002 Ralph Metzler & Marcus Metzler + * for convergence integrated media GmbH * * 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 + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * - * You should have received a copy of the GNU General Public License + * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * Or, point your browser to http://www.gnu.org/copyleft/gpl.html - * - * - * the project's page is at http://www.linuxtv.org/dvb/ */ #ifndef _DVB_RINGBUFFER_H_ diff -Nru a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c --- a/drivers/media/dvb/dvb-core/dvbdev.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvbdev.c Wed Oct 8 12:24:56 2003 @@ -112,7 +112,11 @@ if (!dvbdev->users) return -EBUSY; - if ((file->f_flags & O_ACCMODE) != O_RDONLY) { + if ((file->f_flags & O_ACCMODE) == O_RDONLY) { + if (!dvbdev->readers) + return -EBUSY; + dvbdev->readers--; + } else { if (!dvbdev->writers) return -EBUSY; dvbdev->writers--; @@ -130,8 +134,11 @@ if (!dvbdev) return -ENODEV; - if ((file->f_flags & O_ACCMODE) != O_RDONLY) + if ((file->f_flags & O_ACCMODE) == O_RDONLY) { + dvbdev->readers++; + } else { dvbdev->writers++; + } dvbdev->users++; return 0; diff -Nru a/drivers/media/dvb/dvb-core/dvbdev.h b/drivers/media/dvb/dvb-core/dvbdev.h --- a/drivers/media/dvb/dvb-core/dvbdev.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/dvb-core/dvbdev.h Wed Oct 8 12:24:56 2003 @@ -1,9 +1,8 @@ /* * dvbdev.h * - * Copyright (C) 2000 Ralph Metzler - * & Marcus Metzler - for convergence integrated media GmbH + * Copyright (C) 2000 Ralph Metzler & Marcus Metzler + * for convergence integrated media GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Lesser Public License @@ -28,7 +27,6 @@ #include #include #include -#include #include #define DVB_MAJOR 250 @@ -56,12 +54,18 @@ struct dvb_device { struct list_head list_head; struct file_operations *fops; + + + struct dvb_adapter *adapter; int type; u32 id; - int users; + /* in theory, 'users' can vanish now, + but I don't want to change too much now... */ + int readers; int writers; + int users; /* don't really need those !? -- FIXME: use video_usercopy */ int (*kernel_ioctl)(struct inode *inode, struct file *file, diff -Nru a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig --- a/drivers/media/dvb/frontends/Kconfig Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/frontends/Kconfig Wed Oct 8 12:24:55 2003 @@ -26,6 +26,16 @@ DVB adapter simply enable all supported frontends, the right one will get autodetected. +config DVB_SP887X + tristate "Frontends with sp887x demodulators, e.g. Microtune DTF7072" + depends on DVB_CORE + help + A DVB-T demodulator driver. Say Y when you want to support the sp887x. + + If you don't know what tuner module is soldered on your + DVB adapter simply enable all supported frontends, the + right one will get autodetected. + config DVB_ALPS_TDLB7 tristate "Alps TDLB7 (OFDM)" depends on DVB_CORE diff -Nru a/drivers/media/dvb/frontends/Makefile b/drivers/media/dvb/frontends/Makefile --- a/drivers/media/dvb/frontends/Makefile Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/frontends/Makefile Wed Oct 8 12:24:55 2003 @@ -15,3 +15,4 @@ obj-$(CONFIG_DVB_MT312) += mt312.o obj-$(CONFIG_DVB_VES1820) += ves1820.o obj-$(CONFIG_DVB_TDA1004X) += tda1004x.o +obj-$(CONFIG_DVB_SP887X) += sp887x.o diff -Nru a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c --- a/drivers/media/dvb/frontends/mt312.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/frontends/mt312.c Wed Oct 8 12:24:55 2003 @@ -85,7 +85,7 @@ printk(KERN_ERR "%s: ret == %d\n", __FUNCTION__, ret); return -EREMOTEIO; } -#ifdef MT312_DEBUG +#if MT312_DEBUG { int i; printk(KERN_INFO "R(%d):", reg & 0x7f); @@ -106,7 +106,7 @@ u8 buf[count + 1]; struct i2c_msg msg; -#ifdef MT312_DEBUG +#if MT312_DEBUG { int i; printk(KERN_INFO "W(%d):", reg & 0x7f); diff -Nru a/drivers/media/dvb/frontends/sp887x.c b/drivers/media/dvb/frontends/sp887x.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/sp887x.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,610 @@ + +#include +#include +#include + +#include "dvb_frontend.h" +#include "dvb_functions.h" + + +#if 0 +#define dprintk(x...) printk(x) +#else +#define dprintk(x...) +#endif + +#if 0 +#define LOG(dir,addr,buf,len) \ + do { \ + int i; \ + printk("%s (%02x):", dir, addr & 0xff); \ + for (i=0; ii2c; + struct i2c_msg msg = { addr: addr, flags: 0, buf: buf, len: len }; + int err; + + LOG("i2c_writebytes", msg.addr, msg.buf, msg.len); + + if ((err = i2c->xfer (i2c, &msg, 1)) != 1) { + printk ("%s: i2c write error (addr %02x, err == %i)\n", + __FUNCTION__, addr, err); + return -EREMOTEIO; + } + + return 0; +} + + + +static +int sp887x_writereg (struct dvb_frontend *fe, u16 reg, u16 data) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + u8 b0 [] = { reg >> 8 , reg & 0xff, data >> 8, data & 0xff }; + struct i2c_msg msg = { .addr = 0x70, .flags = 0, .buf = b0, .len = 4 }; + int ret; + + LOG("sp887x_writereg", msg.addr, msg.buf, msg.len); + + if ((ret = i2c->xfer(i2c, &msg, 1)) != 1) { + /** + * in case of soft reset we ignore ACK errors... + */ + if (!(reg == 0xf1a && data == 0x000 && + (ret == -EREMOTEIO || ret == -EFAULT))) + { + printk("%s: writereg error " + "(reg %03x, data %03x, ret == %i)\n", + __FUNCTION__, reg & 0xffff, data & 0xffff, ret); + return ret; + } + } + + return 0; +} + + +static +u16 sp887x_readreg (struct dvb_frontend *fe, u16 reg) +{ + struct dvb_i2c_bus *i2c = fe->i2c; + u8 b0 [] = { reg >> 8 , reg & 0xff }; + u8 b1 [2]; + int ret; + struct i2c_msg msg[] = {{ .addr = 0x70, .flags = 0, .buf = b0, .len = 2 }, + { .addr = 0x70, .flags = I2C_M_RD, .buf = b1, .len = 2 }}; + + LOG("sp887x_readreg (w)", msg[0].addr, msg[0].buf, msg[0].len); + LOG("sp887x_readreg (r)", msg[1].addr, msg[1].buf, msg[1].len); + + if ((ret = i2c->xfer(i2c, msg, 2)) != 2) + printk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + + return (((b1[0] << 8) | b1[1]) & 0xfff); +} + + +static +void sp887x_microcontroller_stop (struct dvb_frontend *fe) +{ + sp887x_writereg(fe, 0xf08, 0x000); + sp887x_writereg(fe, 0xf09, 0x000); + + /* microcontroller STOP */ + sp887x_writereg(fe, 0xf00, 0x000); +} + + +static +void sp887x_microcontroller_start (struct dvb_frontend *fe) +{ + sp887x_writereg(fe, 0xf08, 0x000); + sp887x_writereg(fe, 0xf09, 0x000); + + /* microcontroller START */ + sp887x_writereg(fe, 0xf00, 0x001); +} + + +static +void sp887x_setup_agc (struct dvb_frontend *fe) +{ + /* setup AGC parameters */ + sp887x_writereg(fe, 0x33c, 0x054); + sp887x_writereg(fe, 0x33b, 0x04c); + sp887x_writereg(fe, 0x328, 0x000); + sp887x_writereg(fe, 0x327, 0x005); + sp887x_writereg(fe, 0x326, 0x001); + sp887x_writereg(fe, 0x325, 0x001); + sp887x_writereg(fe, 0x324, 0x001); + sp887x_writereg(fe, 0x318, 0x050); + sp887x_writereg(fe, 0x317, 0x3fe); + sp887x_writereg(fe, 0x316, 0x001); + sp887x_writereg(fe, 0x313, 0x005); + sp887x_writereg(fe, 0x312, 0x002); + sp887x_writereg(fe, 0x306, 0x000); + sp887x_writereg(fe, 0x303, 0x000); +} + + +#include "sp887x_firm.h" + +#define BLOCKSIZE 30 + +/** + * load firmware and setup MPEG interface... + */ +static +int sp887x_initial_setup (struct dvb_frontend *fe) +{ + u8 buf [BLOCKSIZE]; + int i; + + /* soft reset */ + sp887x_writereg(fe, 0xf1a, 0x000); + + sp887x_microcontroller_stop (fe); + + printk ("%s: firmware upload... ", __FUNCTION__); + + /* setup write pointer to -1 (end of memory) */ + /* bit 0x8000 in address is set to enable 13bit mode */ + sp887x_writereg(fe, 0x8f08, 0x1fff); + + /* dummy write (wrap around to start of memory) */ + sp887x_writereg(fe, 0x8f0a, 0x0000); + + for (i=0; i sizeof(sp887x_firm)) + c = sizeof(sp887x_firm) - i; + + /* bit 0x8000 in address is set to enable 13bit mode */ + /* bit 0x4000 enables multibyte read/write transfers */ + /* write register is 0xf0a */ + buf[0] = 0xcf; + buf[1] = 0x0a; + + memcpy(&buf[2], &sp887x_firm[i], c); + + if ((err = i2c_writebytes (fe, 0x70, buf, c+2)) < 0) { + printk ("failed.\n"); + printk ("%s: i2c error (err == %i)\n", __FUNCTION__, err); + return err; + } + } + + /* don't write RS bytes between packets */ + sp887x_writereg(fe, 0xc13, 0x001); + + /* suppress clock if (!data_valid) */ + sp887x_writereg(fe, 0xc14, 0x000); + + /* setup MPEG interface... */ + sp887x_writereg(fe, 0xc1a, 0x872); + sp887x_writereg(fe, 0xc1b, 0x001); + sp887x_writereg(fe, 0xc1c, 0x000); /* parallel mode (serial mode == 1) */ + sp887x_writereg(fe, 0xc1a, 0x871); + + /* ADC mode, 2 for MT8872, 3 for SP8870/SP8871 */ + sp887x_writereg(fe, 0x301, 0x002); + + sp887x_setup_agc(fe); + + /* bit 0x010: enable data valid signal */ + sp887x_writereg(fe, 0xd00, 0x010); + sp887x_writereg(fe, 0x0d1, 0x000); + + printk ("done.\n"); + return 0; +}; + + +/** + * returns the actual tuned center frequency which can be used + * to initialise the AFC registers + */ +static +int tsa5060_setup_pll (struct dvb_frontend *fe, int freq) +{ + u8 cfg, cpump, band_select; + u8 buf [4]; + u32 div; + + div = (36000000 + freq + 83333) / 166666; + cfg = 0x88; + + cpump = freq < 175000000 ? 2 : freq < 390000000 ? 1 : + freq < 470000000 ? 2 : freq < 750000000 ? 2 : 3; + + band_select = freq < 175000000 ? 0x0e : freq < 470000000 ? 0x05 : 0x03; + + buf [0] = (div >> 8) & 0x7f; + buf [1] = div & 0xff; + buf [2] = ((div >> 10) & 0x60) | cfg; + buf [3] = cpump | band_select; + + /* open i2c gate for PLL message transmission... */ + sp887x_writereg(fe, 0x206, 0x001); + i2c_writebytes(fe, 0x60, buf, 4); + sp887x_writereg(fe, 0x206, 0x000); + + return (div * 166666 - 36000000); +} + + + +static +int configure_reg0xc05 (struct dvb_frontend_parameters *p, u16 *reg0xc05) +{ + int known_parameters = 1; + + *reg0xc05 = 0x000; + + switch (p->u.ofdm.constellation) { + case QPSK: + break; + case QAM_16: + *reg0xc05 |= (1 << 10); + break; + case QAM_64: + *reg0xc05 |= (2 << 10); + break; + case QAM_AUTO: + known_parameters = 0; + break; + default: + return -EINVAL; + }; + + switch (p->u.ofdm.hierarchy_information) { + case HIERARCHY_NONE: + break; + case HIERARCHY_1: + *reg0xc05 |= (1 << 7); + break; + case HIERARCHY_2: + *reg0xc05 |= (2 << 7); + break; + case HIERARCHY_4: + *reg0xc05 |= (3 << 7); + break; + case HIERARCHY_AUTO: + known_parameters = 0; + break; + default: + return -EINVAL; + }; + + switch (p->u.ofdm.code_rate_HP) { + case FEC_1_2: + break; + case FEC_2_3: + *reg0xc05 |= (1 << 3); + break; + case FEC_3_4: + *reg0xc05 |= (2 << 3); + break; + case FEC_5_6: + *reg0xc05 |= (3 << 3); + break; + case FEC_7_8: + *reg0xc05 |= (4 << 3); + break; + case FEC_AUTO: + known_parameters = 0; + break; + default: + return -EINVAL; + }; + + if (known_parameters) + *reg0xc05 |= (2 << 1); /* use specified parameters */ + else + *reg0xc05 |= (1 << 1); /* enable autoprobing */ + + return 0; +} + + +/** + * estimates division of two 24bit numbers, + * derived from the ves1820/stv0299 driver code + */ +static +void divide (int n, int d, int *quotient_i, int *quotient_f) +{ + unsigned int q, r; + + r = (n % d) << 8; + q = (r / d); + + if (quotient_i) + *quotient_i = q; + + if (quotient_f) { + r = (r % d) << 8; + q = (q << 8) | (r / d); + r = (r % d) << 8; + *quotient_f = (q << 8) | (r / d); + } +} + + +static +void sp887x_correct_offsets (struct dvb_frontend *fe, + struct dvb_frontend_parameters *p, + int actual_freq) +{ + static const u32 srate_correction [] = { 1879617, 4544878, 8098561 }; + int bw_index = p->u.ofdm.bandwidth - BANDWIDTH_8_MHZ; + int freq_offset = actual_freq - p->frequency; + int sysclock = 61003; //[kHz] + int ifreq = 36000000; + int freq; + int frequency_shift; + + if (p->inversion == INVERSION_ON) + freq = ifreq - freq_offset; + else + freq = ifreq + freq_offset; + + divide(freq / 333, sysclock, NULL, &frequency_shift); + + if (p->inversion == INVERSION_ON) + frequency_shift = -frequency_shift; + + /* sample rate correction */ + sp887x_writereg(fe, 0x319, srate_correction[bw_index] >> 12); + sp887x_writereg(fe, 0x31a, srate_correction[bw_index] & 0xfff); + + /* carrier offset correction */ + sp887x_writereg(fe, 0x309, frequency_shift >> 12); + sp887x_writereg(fe, 0x30a, frequency_shift & 0xfff); +} + + +static +int sp887x_setup_frontend_parameters (struct dvb_frontend *fe, + struct dvb_frontend_parameters *p) +{ + int actual_freq, err; + u16 val, reg0xc05; + + if (p->u.ofdm.bandwidth != BANDWIDTH_8_MHZ && + p->u.ofdm.bandwidth != BANDWIDTH_7_MHZ && + p->u.ofdm.bandwidth != BANDWIDTH_6_MHZ) + return -EINVAL; + + if ((err = configure_reg0xc05(p, ®0xc05))) + return err; + + sp887x_microcontroller_stop(fe); + + actual_freq = tsa5060_setup_pll(fe, p->frequency); + + /* read status reg in order to clear pending irqs */ + sp887x_readreg(fe, 0x200); + + sp887x_correct_offsets(fe, p, actual_freq); + + /* filter for 6/7/8 Mhz channel */ + if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ) + val = 2; + else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ) + val = 1; + else + val = 0; + + sp887x_writereg(fe, 0x311, val); + + /* scan order: 2k first = 0, 8k first = 1 */ + if (p->u.ofdm.transmission_mode == TRANSMISSION_MODE_2K) + sp887x_writereg(fe, 0x338, 0x000); + else + sp887x_writereg(fe, 0x338, 0x001); + + sp887x_writereg(fe, 0xc05, reg0xc05); + + if (p->u.ofdm.bandwidth == BANDWIDTH_6_MHZ) + val = 2 << 3; + else if (p->u.ofdm.bandwidth == BANDWIDTH_7_MHZ) + val = 3 << 3; + else + val = 0 << 3; + + /* enable OFDM and SAW bits as lock indicators in sync register 0xf17, + * optimize algorithm for given bandwidth... + */ + sp887x_writereg(fe, 0xf14, 0x160 | val); + sp887x_writereg(fe, 0xf15, 0x000); + + sp887x_microcontroller_start(fe); + return 0; +} + + +static +int sp887x_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg) +{ + switch (cmd) { + case FE_GET_INFO: + memcpy (arg, &sp887x_info, sizeof(struct dvb_frontend_info)); + break; + + case FE_READ_STATUS: + { + u16 snr12 = sp887x_readreg(fe, 0xf16); + u16 sync0x200 = sp887x_readreg(fe, 0x200); + u16 sync0xf17 = sp887x_readreg(fe, 0xf17); + fe_status_t *status = arg; + + *status = 0; + + if (snr12 > 0x00f) + *status |= FE_HAS_SIGNAL; + + //if (sync0x200 & 0x004) + // *status |= FE_HAS_SYNC | FE_HAS_CARRIER; + + //if (sync0x200 & 0x008) + // *status |= FE_HAS_VITERBI; + + if ((sync0xf17 & 0x00f) == 0x002) { + *status |= FE_HAS_LOCK; + *status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_CARRIER; + } + + if (sync0x200 & 0x001) { /* tuner adjustment requested...*/ + int steps = (sync0x200 >> 4) & 0x00f; + if (steps & 0x008) + steps = -steps; + dprintk("sp887x: implement tuner adjustment (%+i steps)!!\n", + steps); + } + + break; + + } + + case FE_READ_BER: + { + u32* ber = arg; + *ber = (sp887x_readreg(fe, 0xc08) & 0x3f) | + (sp887x_readreg(fe, 0xc07) << 6); + sp887x_writereg(fe, 0xc08, 0x000); + sp887x_writereg(fe, 0xc07, 0x000); + if (*ber >= 0x3fff0) + *ber = ~0; + break; + + } + + case FE_READ_SIGNAL_STRENGTH: // FIXME: correct registers ? + { + u16 snr12 = sp887x_readreg(fe, 0xf16); + u32 signal = 3 * (snr12 << 4); + *((u16*) arg) = (signal < 0xffff) ? signal : 0xffff; + break; + } + + case FE_READ_SNR: + { + u16 snr12 = sp887x_readreg(fe, 0xf16); + *(u16*) arg = (snr12 << 4) | (snr12 >> 8); + break; + } + + case FE_READ_UNCORRECTED_BLOCKS: + { + u32 *ublocks = (u32 *) arg; + *ublocks = sp887x_readreg(fe, 0xc0c); + if (*ublocks == 0xfff) + *ublocks = ~0; + break; + } + + case FE_SET_FRONTEND: + return sp887x_setup_frontend_parameters(fe, arg); + + case FE_GET_FRONTEND: // FIXME: read known values back from Hardware... + break; + + case FE_SLEEP: + /* tristate TS output and disable interface pins */ + sp887x_writereg(fe, 0xc18, 0x000); + break; + + case FE_INIT: + if (fe->data == NULL) { /* first time initialisation... */ + fe->data = (void*) ~0; + sp887x_initial_setup (fe); + } + /* enable TS output and interface pins */ + sp887x_writereg(fe, 0xc18, 0x00d); + break; + + default: + return -EOPNOTSUPP; + }; + + return 0; +} + + + +static +int sp887x_attach (struct dvb_i2c_bus *i2c) +{ + struct i2c_msg msg = { addr: 0x70, flags: 0, buf: NULL, len: 0 }; + + dprintk ("%s\n", __FUNCTION__); + + if (i2c->xfer (i2c, &msg, 1) != 1) + return -ENODEV; + + dvb_register_frontend (sp887x_ioctl, i2c, NULL, &sp887x_info); + + return 0; +} + + +static +void sp887x_detach (struct dvb_i2c_bus *i2c) +{ + dprintk ("%s\n", __FUNCTION__); + dvb_unregister_frontend (sp887x_ioctl, i2c); +} + + +static +int __init init_sp887x (void) +{ + dprintk ("%s\n", __FUNCTION__); + return dvb_register_i2c_device (NULL, sp887x_attach, sp887x_detach); +} + + +static +void __exit exit_sp887x (void) +{ + dprintk ("%s\n", __FUNCTION__); + dvb_unregister_i2c_device (sp887x_attach); +} + + +module_init(init_sp887x); +module_exit(exit_sp887x); + + +MODULE_DESCRIPTION("sp887x DVB-T demodulator driver"); +MODULE_LICENSE("GPL"); + + diff -Nru a/drivers/media/dvb/frontends/sp887x_firm.h b/drivers/media/dvb/frontends/sp887x_firm.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/dvb/frontends/sp887x_firm.h Wed Oct 8 12:24:57 2003 @@ -0,0 +1,1375 @@ +#ifndef __SP887x_FIRM_H__ +#define __SP887x_FIRM_H__ + + +static const +u8 sp887x_firm [16384] __devinitdata = { + 0x00, 0xb9, 0x00, 0xb9, 0x0f, 0xf9, 0x1f, 0x5d, 0x0f, 0xf9, 0x1b, 0x67, + 0x0f, 0xf9, 0x19, 0x2f, 0x0f, 0xf9, 0x00, 0x36, 0x0f, 0xf9, 0x00, 0x3c, + 0x0f, 0xf5, 0x00, 0x3e, 0x0f, 0xf9, 0x03, 0x0c, 0x0f, 0xf9, 0x0c, 0x59, + 0x0f, 0xf9, 0x15, 0xde, 0x0f, 0xf9, 0x19, 0x07, 0x0f, 0xf9, 0x08, 0x98, + 0x0f, 0xf9, 0x08, 0x03, 0x0f, 0xf9, 0x00, 0x26, 0x0f, 0xf9, 0x03, 0x11, + 0x0f, 0xf9, 0x1b, 0x47, 0x0f, 0xf9, 0x00, 0x76, 0x0f, 0xf9, 0x0a, 0xdd, + 0x0f, 0xf9, 0x0d, 0x09, 0x0f, 0xc4, 0x01, 0x62, 0x0b, 0x21, 0x0f, 0x38, + 0x00, 0x15, 0x0f, 0xf8, 0x00, 0x32, 0x09, 0xa1, 0x0f, 0xf9, 0x04, 0x2e, + 0x0f, 0xf9, 0x04, 0x5e, 0x0f, 0xd9, 0x00, 0x2e, 0x09, 0xfb, 0x0f, 0x39, + 0x0f, 0xf0, 0x02, 0x02, 0x0f, 0xc4, 0x01, 0x7a, 0x0f, 0xf9, 0x00, 0x42, + 0x0f, 0xf0, 0x02, 0x05, 0x0f, 0xc4, 0x01, 0x7b, 0x0f, 0xf9, 0x00, 0x42, + 0x0b, 0x21, 0x0f, 0xc4, 0x01, 0x7c, 0x0f, 0xd4, 0x02, 0xa0, 0x1f, 0xf8, + 0x00, 0x53, 0x11, 0xa1, 0x0f, 0xd4, 0x00, 0xa0, 0x1f, 0xf8, 0x00, 0x53, + 0x11, 0xe1, 0x08, 0x15, 0x1f, 0x39, 0x0f, 0x38, 0x0c, 0x32, 0x0b, 0x13, + 0x00, 0x08, 0x10, 0x48, 0x0f, 0x38, 0x0c, 0x32, 0x00, 0x21, 0x07, 0x04, + 0x0b, 0x94, 0x1b, 0x94, 0x1f, 0x39, 0x06, 0x45, 0x0b, 0xd5, 0x1f, 0xf9, + 0x00, 0x65, 0x0b, 0xd5, 0x1f, 0xf9, 0x00, 0x65, 0x0f, 0x39, 0x07, 0x84, + 0x0b, 0x27, 0x09, 0xa1, 0x06, 0xc5, 0x0b, 0x67, 0x09, 0x94, 0x1f, 0xf9, + 0x00, 0x6f, 0x0f, 0x38, 0x09, 0x97, 0x06, 0x44, 0x07, 0x05, 0x0b, 0xa1, + 0x0b, 0xd8, 0x0b, 0xa1, 0x0f, 0x38, 0x0b, 0xd2, 0x0f, 0xcb, 0x01, 0x39, + 0x0f, 0xf5, 0x02, 0x47, 0x0f, 0xf4, 0x02, 0x5d, 0x06, 0x0b, 0x05, 0x85, + 0x0b, 0xea, 0x0b, 0xe1, 0x02, 0xde, 0x09, 0xeb, 0x0f, 0xee, 0x01, 0xc0, + 0x0f, 0xee, 0x0a, 0x01, 0x0f, 0xcf, 0x0c, 0x80, 0x0e, 0x2a, 0x0e, 0x6b, + 0x0f, 0xec, 0x06, 0xbe, 0x09, 0x2d, 0x0d, 0xee, 0x0f, 0xc4, 0x00, 0x95, + 0x12, 0x35, 0x0f, 0xe1, 0x0d, 0xbd, 0x0e, 0x18, 0x09, 0xec, 0x0f, 0xe1, + 0x00, 0xcd, 0x0e, 0x51, 0x09, 0xed, 0x0d, 0xee, 0x0b, 0xe1, 0x02, 0xdf, + 0x09, 0xe7, 0x0f, 0xe1, 0x05, 0x6d, 0x0e, 0x18, 0x09, 0xec, 0x0f, 0xe1, + 0x02, 0x26, 0x0e, 0x51, 0x09, 0xed, 0x0d, 0xee, 0x12, 0x35, 0x0f, 0xe1, + 0x0d, 0x03, 0x0f, 0xce, 0x03, 0xd2, 0x0e, 0x18, 0x09, 0xec, 0x0d, 0xa1, + 0x0e, 0x51, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xcb, 0x0a, 0xe3, 0x0f, 0xe1, + 0x08, 0x10, 0x0f, 0xce, 0x05, 0x88, 0x0e, 0x18, 0x09, 0xec, 0x0d, 0xa1, + 0x0e, 0x51, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xca, 0x09, 0x00, 0x0f, 0xe1, + 0x00, 0x38, 0x0f, 0xce, 0x07, 0xa7, 0x0e, 0x18, 0x09, 0xec, 0x0d, 0xa1, + 0x0e, 0x51, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xe2, 0x00, 0x3f, 0x0f, 0xe1, + 0x0a, 0xb1, 0x0f, 0xce, 0x0b, 0x89, 0x0e, 0x18, 0x09, 0xec, 0x0d, 0xa1, + 0x0e, 0x51, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xc9, 0x0a, 0x75, 0x0f, 0xe1, + 0x03, 0xf3, 0x0f, 0xce, 0x07, 0x15, 0x0e, 0x18, 0x09, 0xec, 0x0d, 0xa1, + 0x0e, 0x53, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xcf, 0x07, 0xc0, 0x0d, 0xce, + 0x1f, 0xce, 0x01, 0xc0, 0x00, 0x21, 0x0d, 0xae, 0x0c, 0x6e, 0x09, 0x96, + 0x0f, 0xce, 0x05, 0x00, 0x0f, 0xcd, 0x05, 0x40, 0x0f, 0xcc, 0x03, 0x00, + 0x09, 0xab, 0x00, 0x2a, 0x0d, 0xee, 0x1d, 0xae, 0x1e, 0x18, 0x19, 0xea, + 0x1e, 0x58, 0x19, 0xeb, 0x1d, 0x6e, 0x1e, 0x18, 0x19, 0xec, 0x1e, 0x51, + 0x19, 0xed, 0x1d, 0x2e, 0x0c, 0xee, 0x0f, 0xe1, 0x1f, 0xe7, 0x0c, 0xae, + 0x05, 0x84, 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0xa4, 0x09, 0x99, 0x09, 0xe1, + 0x02, 0xdc, 0x12, 0xdd, 0x0f, 0x38, 0x09, 0xc2, 0x0f, 0xfb, 0x00, 0x7d, + 0x03, 0x37, 0x0f, 0xc4, 0x00, 0x9e, 0x05, 0xb7, 0x0f, 0xf5, 0x01, 0x39, + 0x0f, 0xfb, 0x00, 0x7d, 0x03, 0x37, 0x0f, 0xc4, 0x00, 0xa1, 0x05, 0xb7, + 0x0f, 0xf5, 0x01, 0x39, 0x05, 0x84, 0x0b, 0xaa, 0x0b, 0xab, 0x0f, 0xef, + 0x01, 0xc0, 0x0b, 0x88, 0x0c, 0x27, 0x09, 0xa6, 0x18, 0xb4, 0x05, 0x84, + 0x09, 0xa1, 0x0f, 0xd9, 0x0a, 0x69, 0x09, 0xee, 0x0f, 0xd7, 0x1f, 0xd0, + 0x18, 0xb5, 0x02, 0x97, 0x0c, 0x21, 0x1f, 0xf8, 0x01, 0x36, 0x02, 0xde, + 0x0f, 0xc4, 0x06, 0x28, 0x02, 0x34, 0x19, 0x44, 0x1f, 0xf9, 0x01, 0x45, + 0x0f, 0xee, 0x05, 0x00, 0x00, 0x21, 0x0e, 0x18, 0x09, 0xea, 0x0e, 0x58, + 0x09, 0xeb, 0x0f, 0xee, 0x05, 0x40, 0x0e, 0x18, 0x0f, 0xf8, 0x01, 0x4a, + 0x09, 0xc9, 0x0e, 0x09, 0x0f, 0xee, 0x05, 0x00, 0x0e, 0x2a, 0x0e, 0x6b, + 0x0f, 0xcf, 0x0c, 0x80, 0x0f, 0xec, 0x0e, 0x2d, 0x00, 0x2d, 0x0d, 0xee, + 0x0f, 0xe1, 0x01, 0xa4, 0x01, 0x4e, 0x0e, 0x20, 0x09, 0xec, 0x0d, 0xa1, + 0x0e, 0x59, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xe1, 0x0a, 0x35, 0x0f, 0xce, + 0x00, 0x27, 0x0e, 0x20, 0x09, 0xec, 0x0d, 0xa1, 0x0e, 0x59, 0x09, 0xed, + 0x0d, 0xee, 0x0f, 0xe1, 0x04, 0x34, 0x0f, 0xce, 0x00, 0xe3, 0x0e, 0x20, + 0x09, 0xec, 0x0d, 0xa1, 0x0e, 0x59, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xe1, + 0x0f, 0xb1, 0x0f, 0xce, 0x03, 0xd7, 0x0e, 0x20, 0x09, 0xec, 0x0d, 0xa1, + 0x0e, 0x59, 0x09, 0xed, 0x0d, 0xee, 0x0f, 0xe1, 0x02, 0x15, 0x0f, 0xce, + 0x0b, 0x17, 0x0e, 0x20, 0x09, 0xec, 0x0d, 0xa1, 0x0e, 0x59, 0x09, 0xed, + 0x0d, 0xee, 0x0f, 0xcf, 0x0a, 0xbf, 0x0f, 0xce, 0x09, 0x00, 0x0d, 0xee, + 0x0c, 0x61, 0x0d, 0xae, 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0x99, 0x09, 0xe1, + 0x12, 0xdf, 0x12, 0x34, 0x19, 0x44, 0x02, 0xdc, 0x0f, 0x38, 0x09, 0xc2, + 0x09, 0x44, 0x0f, 0xc2, 0x0f, 0xff, 0x0f, 0xc2, 0x0f, 0xff, 0x0f, 0xc2, + 0x03, 0xff, 0x0f, 0xc4, 0x00, 0x95, 0x0f, 0xc2, 0x0f, 0xff, 0x0f, 0xc2, + 0x0f, 0xff, 0x0f, 0xc2, 0x0b, 0xff, 0x0f, 0xc4, 0x00, 0x98, 0x00, 0x02, + 0x0f, 0xc2, 0x08, 0x00, 0x0f, 0xc2, 0x04, 0x00, 0x0f, 0xc4, 0x00, 0x9b, + 0x00, 0x02, 0x0f, 0xc2, 0x08, 0x00, 0x0f, 0xc2, 0x0c, 0x00, 0x0f, 0xc4, + 0x00, 0x9e, 0x0f, 0xc2, 0x08, 0xc1, 0x0f, 0xc2, 0x0c, 0x0a, 0x00, 0x42, + 0x0f, 0xc4, 0x00, 0xa1, 0x0f, 0xc2, 0x08, 0xc1, 0x0f, 0xc2, 0x0c, 0x0a, + 0x00, 0x82, 0x0f, 0xc4, 0x00, 0xa4, 0x00, 0x02, 0x0f, 0xc2, 0x0a, 0x00, + 0x00, 0xc2, 0x0f, 0xc4, 0x00, 0xa7, 0x00, 0x02, 0x0f, 0xc2, 0x0c, 0x80, + 0x0f, 0xf4, 0x04, 0xe0, 0x01, 0x82, 0x0f, 0xc4, 0x01, 0x5d, 0x0b, 0x3b, + 0x0f, 0x39, 0x04, 0x04, 0x0b, 0x21, 0x0f, 0xc4, 0x01, 0x5c, 0x0f, 0xc5, + 0x07, 0x3d, 0x0b, 0x01, 0x0b, 0x14, 0x1f, 0x39, 0x00, 0x14, 0x09, 0xc0, + 0x0f, 0xc8, 0x04, 0x18, 0x00, 0xd4, 0x1f, 0xc8, 0x1b, 0xb6, 0x00, 0x54, + 0x1f, 0xc8, 0x1c, 0xa7, 0x01, 0x14, 0x1f, 0xc8, 0x1c, 0x9f, 0x00, 0x94, + 0x1f, 0xc4, 0x01, 0x5e, 0x1b, 0x08, 0x02, 0x94, 0x1f, 0xc8, 0x04, 0x24, + 0x02, 0xd4, 0x1f, 0xc8, 0x04, 0x26, 0x03, 0x14, 0x1f, 0xc8, 0x04, 0x28, + 0x03, 0x54, 0x1f, 0xc8, 0x04, 0x2a, 0x03, 0x94, 0x1f, 0xc8, 0x04, 0x2c, + 0x03, 0xd4, 0x1f, 0xc8, 0x04, 0x2e, 0x05, 0x14, 0x1f, 0xc8, 0x04, 0x30, + 0x0f, 0xd4, 0x00, 0x28, 0x1f, 0xc8, 0x08, 0xeb, 0x0f, 0xd4, 0x00, 0x29, + 0x1f, 0xc8, 0x09, 0x49, 0x0f, 0xd4, 0x00, 0x2a, 0x1f, 0xc8, 0x09, 0xe6, + 0x0f, 0xd4, 0x00, 0x2b, 0x1f, 0xc8, 0x0b, 0x54, 0x0f, 0xd4, 0x00, 0x32, + 0x1f, 0xc8, 0x0b, 0x87, 0x0f, 0xd4, 0x00, 0x3c, 0x1f, 0xc8, 0x0b, 0xcf, + 0x0f, 0xd4, 0x00, 0x46, 0x1f, 0xc8, 0x11, 0x95, 0x0f, 0xd4, 0x00, 0x47, + 0x1f, 0xc8, 0x11, 0xb9, 0x0f, 0xd4, 0x00, 0x3f, 0x1f, 0xc8, 0x09, 0x85, + 0x0f, 0xd4, 0x00, 0x40, 0x1f, 0xc8, 0x09, 0x89, 0x0f, 0xd4, 0x00, 0x41, + 0x1f, 0xc8, 0x09, 0xcb, 0x02, 0x14, 0x1f, 0xc8, 0x04, 0x18, 0x0f, 0xd4, + 0x00, 0x50, 0x1f, 0xc8, 0x0e, 0xd9, 0x0f, 0xc4, 0x01, 0x5d, 0x0f, 0x38, + 0x0c, 0x00, 0x0f, 0xc8, 0x01, 0x00, 0x0f, 0xf7, 0x05, 0x82, 0x0f, 0xc4, + 0x01, 0x8b, 0x00, 0x00, 0x0f, 0xc4, 0x01, 0x8a, 0x00, 0x00, 0x0f, 0xf1, + 0x03, 0x39, 0x0f, 0xc5, 0x01, 0x89, 0x0f, 0xc4, 0x01, 0x8e, 0x0b, 0x21, + 0x0a, 0x48, 0x0c, 0x13, 0x1f, 0xf8, 0x02, 0x5f, 0x0c, 0x01, 0x0f, 0xc4, + 0x01, 0x90, 0x00, 0x21, 0x0b, 0x15, 0x1f, 0xc5, 0x01, 0x8b, 0x1c, 0x01, + 0x1f, 0xc5, 0x01, 0x8a, 0x1b, 0x3a, 0x1b, 0x01, 0x0f, 0xf1, 0x03, 0x39, + 0x0f, 0xc4, 0x01, 0x8e, 0x0b, 0x21, 0x0a, 0x48, 0x0c, 0x12, 0x1f, 0xf9, + 0x02, 0x4b, 0x0f, 0xc4, 0x01, 0x8c, 0x0f, 0xf6, 0x05, 0x9d, 0x0c, 0x00, + 0x0f, 0xf1, 0x03, 0x39, 0x0f, 0xc4, 0x01, 0x8d, 0x1f, 0x38, 0x0a, 0x40, + 0x0f, 0xc5, 0x01, 0x88, 0x0b, 0x01, 0x0f, 0xc4, 0x01, 0x89, 0x0f, 0xc5, + 0x07, 0x3b, 0x0b, 0x01, 0x0f, 0xc4, 0x01, 0x8b, 0x0f, 0xc5, 0x07, 0x3c, + 0x0b, 0x01, 0x0f, 0xc4, 0x01, 0x8c, 0x0f, 0xc5, 0x01, 0x87, 0x0b, 0x01, + 0x0f, 0xc4, 0x01, 0x8a, 0x0f, 0xc5, 0x01, 0x86, 0x0b, 0x01, 0x0f, 0xc4, + 0x01, 0x6a, 0x0f, 0xc5, 0x01, 0x85, 0x0b, 0x01, 0x0f, 0xc4, 0x01, 0x6b, + 0x0f, 0xc5, 0x01, 0x84, 0x0f, 0x38, 0x0b, 0x01, 0x0f, 0xc4, 0x01, 0x90, + 0x0c, 0x40, 0x0c, 0x21, 0x0f, 0xd9, 0x00, 0x67, 0x09, 0xc8, 0x00, 0xb6, + 0x00, 0x09, 0x0f, 0xf7, 0x04, 0x66, 0x0f, 0xc4, 0x06, 0x96, 0x0f, 0xc5, + 0x06, 0x2b, 0x0f, 0xf7, 0x02, 0x74, 0x07, 0x04, 0x00, 0x02, 0x0f, 0xc2, + 0x0c, 0x00, 0x0f, 0xf6, 0x02, 0x70, 0x01, 0x02, 0x05, 0x37, 0x0f, 0xf7, + 0x04, 0x6f, 0x0f, 0xf7, 0x02, 0x09, 0x0f, 0xf7, 0x01, 0x33, 0x0f, 0xc4, + 0x01, 0x8f, 0x07, 0x36, 0x0c, 0x00, 0x0f, 0xe1, 0x08, 0x0f, 0x1f, 0xe1, + 0x02, 0x0f, 0x0c, 0x11, 0x0f, 0xc4, 0x01, 0x8e, 0x0f, 0x38, 0x09, 0xc0, + 0x0f, 0xf0, 0x0f, 0x10, 0x0c, 0x32, 0x0f, 0xc4, 0x07, 0xc0, 0x0f, 0x38, + 0x0c, 0x00, 0x0f, 0xf1, 0x0f, 0x11, 0x00, 0x08, 0x0a, 0x61, 0x00, 0x15, + 0x11, 0x13, 0x10, 0x49, 0x10, 0x48, 0x0f, 0xf1, 0x0f, 0x13, 0x0f, 0xc4, + 0x07, 0xbc, 0x0b, 0x22, 0x00, 0x00, 0x0a, 0x65, 0x09, 0xb2, 0x00, 0x21, + 0x09, 0x95, 0x1c, 0x62, 0x10, 0xa5, 0x19, 0x89, 0x10, 0x48, 0x0c, 0x15, + 0x1f, 0xf0, 0x02, 0x04, 0x0c, 0x72, 0x0f, 0xf0, 0x02, 0x03, 0x00, 0x32, + 0x0f, 0x38, 0x00, 0x72, 0x0f, 0xfa, 0x02, 0xb8, 0x00, 0xc8, 0x0f, 0xf9, + 0x02, 0xbf, 0x0f, 0xc4, 0x07, 0xba, 0x0f, 0xc0, 0x00, 0x40, 0x0f, 0xc4, + 0x07, 0xbb, 0x00, 0x40, 0x0f, 0xc4, 0x07, 0xb8, 0x0f, 0xc0, 0x04, 0x00, + 0x0f, 0xc4, 0x07, 0xb9, 0x0f, 0xc0, 0x08, 0x00, 0x0f, 0xc4, 0x07, 0xbd, + 0x0f, 0xc0, 0x0f, 0xff, 0x0f, 0xc4, 0x07, 0xdd, 0x00, 0x00, 0x0f, 0xc4, + 0x07, 0xc2, 0x0f, 0x38, 0x00, 0x40, 0x0f, 0xf8, 0x03, 0x03, 0x0b, 0x22, + 0x0f, 0xf8, 0x03, 0x03, 0x0c, 0x22, 0x0f, 0xc4, 0x07, 0xbd, 0x0b, 0x24, + 0x09, 0xa2, 0x0f, 0xc4, 0x07, 0xbc, 0x0b, 0x25, 0x0f, 0x38, 0x09, 0x80, + 0x0f, 0xfa, 0x02, 0xb8, 0x00, 0x48, 0x0f, 0xf9, 0x02, 0xbf, 0x0f, 0xf0, + 0x0f, 0x10, 0x0c, 0x32, 0x0a, 0xe1, 0x0f, 0xc5, 0x07, 0xc3, 0x0f, 0xf1, + 0x0f, 0x10, 0x0a, 0x7f, 0x0f, 0xf0, 0x0f, 0x12, 0x0b, 0xf2, 0x0a, 0xd5, + 0x1f, 0xf9, 0x03, 0x1a, 0x03, 0xb9, 0x0a, 0x44, 0x0f, 0xf1, 0x0f, 0x12, + 0x0a, 0x7e, 0x0f, 0xfd, 0x03, 0x28, 0x00, 0x3f, 0x0b, 0x83, 0x07, 0x39, + 0x0a, 0x45, 0x0f, 0xf1, 0x0f, 0x12, 0x0a, 0x7e, 0x0f, 0xfd, 0x03, 0x33, + 0x00, 0x3f, 0x0f, 0xf1, 0x0f, 0x12, 0x0a, 0x43, 0x03, 0xb9, 0x0f, 0xc4, + 0x07, 0x6e, 0x00, 0x00, 0x04, 0x04, 0x00, 0x40, 0x0f, 0xc4, 0x07, 0xdd, + 0x00, 0x00, 0x0f, 0xc4, 0x07, 0xc2, 0x00, 0x40, 0x0f, 0xf0, 0x0f, 0x17, + 0x03, 0xb8, 0x00, 0x32, 0x04, 0x04, 0x00, 0xc0, 0x0f, 0xc4, 0x07, 0xdd, + 0x00, 0x40, 0x0f, 0xc4, 0x07, 0xc2, 0x03, 0xb8, 0x00, 0x40, 0x0f, 0xc4, + 0x07, 0x6e, 0x00, 0x00, 0x04, 0x04, 0x01, 0x00, 0x0f, 0xc4, 0x07, 0xdd, + 0x00, 0x00, 0x0f, 0xc4, 0x07, 0xc2, 0x03, 0xb8, 0x00, 0x40, 0x04, 0x04, + 0x02, 0x00, 0x0f, 0xc4, 0x07, 0x6e, 0x00, 0x00, 0x0f, 0xc4, 0x07, 0xdd, + 0x03, 0xb8, 0x00, 0x00, 0x0f, 0xc4, 0x01, 0x30, 0x0b, 0x83, 0x0b, 0x83, + 0x0f, 0xc4, 0x01, 0x32, 0x0b, 0x83, 0x07, 0x38, 0x0b, 0x83, 0x0f, 0xc4, + 0x06, 0x94, 0x0b, 0x83, 0x0b, 0x83, 0x0f, 0xc4, 0x01, 0x6c, 0x07, 0x38, + 0x0b, 0x83, 0x0f, 0xc4, 0x01, 0x38, 0x0b, 0x83, 0x0b, 0x83, 0x0f, 0xc4, + 0x01, 0x3a, 0x0b, 0x83, 0x0b, 0x83, 0x0f, 0xc4, 0x01, 0x3c, 0x0b, 0x83, + 0x0b, 0x83, 0x0f, 0xc4, 0x01, 0x76, 0x0b, 0x83, 0x0f, 0xc4, 0x01, 0x77, + 0x07, 0x38, 0x0b, 0x83, 0x0f, 0xc4, 0x01, 0x78, 0x0b, 0x83, 0x0f, 0xc4, + 0x01, 0x79, 0x07, 0x38, 0x0b, 0x83, 0x0f, 0xc4, 0x05, 0xe6, 0x0b, 0x83, + 0x0b, 0x83, 0x0f, 0xc4, 0x01, 0x40, 0x0b, 0x83, 0x07, 0x38, 0x0b, 0x83, + 0x0f, 0xf1, 0x0f, 0x11, 0x0a, 0x48, 0x0c, 0x21, 0x02, 0x13, 0x1f, 0xf9, + 0x02, 0xbf, 0x0f, 0xf1, 0x0f, 0x10, 0x00, 0x09, 0x02, 0x54, 0x13, 0x89, + 0x02, 0xd4, 0x1f, 0xc9, 0x03, 0x35, 0x03, 0x54, 0x1f, 0xc9, 0x03, 0x44, + 0x03, 0xd4, 0x1f, 0xc9, 0x03, 0x59, 0x0f, 0xd4, 0x00, 0x59, 0x1f, 0xc9, + 0x03, 0x4d, 0x0f, 0xd4, 0x00, 0x41, 0x1f, 0xc9, 0x03, 0x21, 0x0f, 0xd4, + 0x00, 0x49, 0x1f, 0xc9, 0x03, 0x2a, 0x0f, 0xd4, 0x00, 0x71, 0x1f, 0xc9, + 0x03, 0x62, 0x0f, 0xd4, 0x00, 0x73, 0x1f, 0xc9, 0x03, 0x6b, 0x0f, 0xd4, + 0x00, 0x80, 0x1f, 0xc9, 0x03, 0x73, 0x0f, 0xd4, 0x00, 0x81, 0x1f, 0xc9, + 0x03, 0x86, 0x0f, 0xd4, 0x00, 0x82, 0x1f, 0xc9, 0x03, 0x8d, 0x0c, 0x61, + 0x00, 0x15, 0x1f, 0xf1, 0x0f, 0x12, 0x1f, 0xc5, 0x07, 0xc3, 0x1c, 0x79, + 0x0f, 0xf9, 0x02, 0xde, 0x0f, 0xfb, 0x03, 0x96, 0x0f, 0xc4, 0x07, 0xdd, + 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xf9, 0x03, 0xd4, 0x0f, 0x39, 0x0f, 0xc8, + 0x00, 0x3c, 0x03, 0x3b, 0x1f, 0x39, 0x0f, 0xf1, 0x0a, 0x07, 0x00, 0x21, + 0x0f, 0xc4, 0x01, 0x91, 0x0b, 0x08, 0x0f, 0xc4, 0x01, 0x92, 0x0b, 0x15, + 0x1b, 0x08, 0x0c, 0x14, 0x1f, 0x39, 0x0c, 0x21, 0x0a, 0x55, 0x1f, 0xc4, + 0x01, 0x93, 0x1c, 0x00, 0x1f, 0xc8, 0x03, 0xf6, 0x15, 0x3b, 0x0f, 0x39, + 0x0f, 0xc4, 0x01, 0x93, 0x0b, 0x0f, 0x0d, 0xc8, 0x00, 0xb6, 0x00, 0x09, + 0x05, 0x37, 0x0d, 0xe1, 0x02, 0x19, 0x09, 0xc8, 0x00, 0xb6, 0x00, 0x09, + 0x0f, 0xf7, 0x02, 0x70, 0x0f, 0xc4, 0x00, 0xad, 0x00, 0x37, 0x01, 0xbb, + 0x0f, 0xc8, 0x00, 0x60, 0x00, 0xb6, 0x00, 0x09, 0x0f, 0xc4, 0x00, 0xad, + 0x0f, 0xf7, 0x02, 0x81, 0x0f, 0xf0, 0x0a, 0x07, 0x0f, 0xc4, 0x01, 0x93, + 0x0b, 0x32, 0x0f, 0xc4, 0x00, 0xaa, 0x00, 0x35, 0x02, 0x3a, 0x00, 0x08, + 0x02, 0xba, 0x00, 0x48, 0x0f, 0xfb, 0x03, 0xd4, 0x0f, 0xf6, 0x00, 0x3a, + 0x02, 0x08, 0x1f, 0xf9, 0x04, 0x1c, 0x0f, 0x39, 0x0f, 0xf5, 0x05, 0xc7, + 0x0f, 0xf5, 0x06, 0x07, 0x0f, 0xf5, 0x06, 0x14, 0x0f, 0xf5, 0x06, 0x79, + 0x0f, 0xf5, 0x06, 0x98, 0x0f, 0xf5, 0x06, 0xbc, 0x0f, 0xc4, 0x06, 0x8f, + 0x0b, 0x88, 0x00, 0xb6, 0x0b, 0x89, 0x03, 0x37, 0x02, 0x36, 0x04, 0xc4, + 0x06, 0xbb, 0x1f, 0xf7, 0x00, 0x8f, 0x0f, 0xfb, 0x00, 0x7a, 0x0f, 0xc4, + 0x00, 0xb0, 0x00, 0x37, 0x04, 0x44, 0x0f, 0xc5, 0x01, 0x94, 0x0b, 0x01, + 0x0f, 0xf7, 0x06, 0xdc, 0x0f, 0xc4, 0x00, 0xb0, 0x02, 0x37, 0x04, 0x44, + 0x0b, 0x21, 0x0f, 0xc4, 0x01, 0x94, 0x0b, 0x11, 0x01, 0x36, 0x09, 0xc8, + 0x03, 0xb7, 0x0f, 0xc4, 0x06, 0x8f, 0x0c, 0x02, 0x03, 0x36, 0x0c, 0x42, + 0x00, 0xb7, 0x05, 0x37, 0x04, 0x37, 0x06, 0xbb, 0x1f, 0xf7, 0x00, 0x8f, + 0x00, 0x34, 0x04, 0xc4, 0x01, 0x38, 0x00, 0x48, 0x07, 0x37, 0x0f, 0xc4, + 0x02, 0x0e, 0x0f, 0xc0, 0x08, 0xe1, 0x1f, 0xc0, 0x02, 0x39, 0x0f, 0xc4, + 0x07, 0x38, 0x1f, 0xc4, 0x07, 0x37, 0x0f, 0xc5, 0x01, 0x95, 0x0b, 0x01, + 0x0f, 0xc4, 0x07, 0x2e, 0x1f, 0xc4, 0x07, 0x2b, 0x02, 0x37, 0x0f, 0xc4, + 0x05, 0xf2, 0x0b, 0x21, 0x01, 0x9e, 0x0f, 0xc5, 0x01, 0x96, 0x0f, 0xc4, + 0x05, 0xea, 0x0b, 0x01, 0x1f, 0xc4, 0x05, 0xf0, 0x1b, 0x01, 0x0b, 0x61, + 0x0f, 0xc4, 0x06, 0x2b, 0x00, 0x14, 0x1f, 0xc4, 0x07, 0x31, 0x00, 0x54, + 0x1f, 0xc4, 0x07, 0x34, 0x06, 0xb7, 0x0f, 0xc4, 0x00, 0xb3, 0x00, 0x37, + 0x0f, 0xc4, 0x07, 0x39, 0x0b, 0x2a, 0x1f, 0xc4, 0x06, 0x07, 0x1b, 0x21, + 0x10, 0xd3, 0x11, 0x2a, 0x0f, 0xec, 0x00, 0x2b, 0x0f, 0xee, 0x0d, 0x40, + 0x0e, 0x21, 0x0f, 0xd9, 0x02, 0xd3, 0x0f, 0xc4, 0x02, 0x0a, 0x0f, 0xc2, + 0x02, 0xd3, 0x09, 0xc2, 0x0f, 0xc2, 0x02, 0xc7, 0x0f, 0xc2, 0x02, 0xd3, + 0x0f, 0xfb, 0x08, 0x15, 0x0f, 0xc8, 0x04, 0x60, 0x0f, 0xc9, 0x04, 0xae, + 0x0f, 0xfb, 0x02, 0x8c, 0x0f, 0xf9, 0x07, 0xed, 0x00, 0x21, 0x0f, 0xc4, + 0x04, 0x2b, 0x0b, 0x14, 0x1f, 0xc0, 0x04, 0xb6, 0x0b, 0x3b, 0x0f, 0x39, + 0x0f, 0xc0, 0x04, 0xe6, 0x0f, 0xc4, 0x04, 0x40, 0x0f, 0xc8, 0x04, 0x50, + 0x0f, 0xf7, 0x00, 0x71, 0x0f, 0xc5, 0x04, 0x2d, 0x0f, 0xfb, 0x08, 0x4d, + 0x0f, 0xfb, 0x08, 0x4d, 0x0f, 0xc4, 0x02, 0x10, 0x0b, 0x21, 0x00, 0x15, + 0x1f, 0xfa, 0x08, 0x4d, 0x00, 0x01, 0x0f, 0xc4, 0x02, 0x0e, 0x0b, 0x8f, + 0x00, 0x61, 0x0f, 0xc5, 0x04, 0x2c, 0x0b, 0x01, 0x0b, 0x19, 0x09, 0xc0, + 0x0f, 0xc5, 0x02, 0x10, 0x00, 0x41, 0x09, 0xe1, 0x0d, 0xd3, 0x1f, 0xf9, + 0x08, 0x82, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x0f, 0xfa, 0x08, 0x3d, + 0x00, 0x00, 0x0f, 0xc4, 0x04, 0x2b, 0x0f, 0xc0, 0x06, 0x8f, 0x0f, 0x39, + 0x0f, 0xc0, 0x04, 0xf3, 0x0f, 0xc4, 0x01, 0x82, 0x0f, 0xc5, 0x04, 0x33, + 0x0b, 0x01, 0x0f, 0xcf, 0x04, 0x34, 0x0f, 0xfb, 0x08, 0x5f, 0x0f, 0xf9, + 0x08, 0x82, 0x0f, 0xc5, 0x01, 0x82, 0x0b, 0x4f, 0x0f, 0xc5, 0x04, 0x33, + 0x0b, 0x61, 0x0d, 0xd4, 0x1f, 0x38, 0x0d, 0xc1, 0x0f, 0xc0, 0x05, 0x04, + 0x0f, 0xcf, 0x04, 0x50, 0x0f, 0xfb, 0x08, 0x5f, 0x0f, 0xf9, 0x08, 0x82, + 0x0f, 0xc0, 0x05, 0x10, 0x0f, 0xc4, 0x04, 0x50, 0x0f, 0xcf, 0x04, 0x34, + 0x04, 0x0e, 0x0f, 0xcd, 0x04, 0x56, 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, + 0x0f, 0xc0, 0x05, 0x1c, 0x0f, 0xc4, 0x04, 0x53, 0x0f, 0xcf, 0x04, 0x37, + 0x04, 0x0e, 0x0f, 0xcd, 0x04, 0x59, 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, + 0x0f, 0xc0, 0x05, 0x27, 0x0f, 0xc4, 0x04, 0x50, 0x0a, 0x8f, 0x0f, 0xce, + 0x01, 0x39, 0x0f, 0xcd, 0x04, 0x46, 0x05, 0xb8, 0x06, 0x0c, 0x0f, 0xc0, + 0x05, 0x32, 0x0f, 0xc4, 0x04, 0x53, 0x0a, 0x8f, 0x0f, 0xce, 0x01, 0x39, + 0x0f, 0xcd, 0x04, 0x46, 0x05, 0xb8, 0x06, 0x0c, 0x0f, 0xc0, 0x05, 0x3d, + 0x0f, 0xc4, 0x04, 0x56, 0x0a, 0x8f, 0x0f, 0xce, 0x01, 0x39, 0x0f, 0xcd, + 0x04, 0x49, 0x05, 0xb8, 0x06, 0x0c, 0x0f, 0xc0, 0x05, 0x56, 0x0f, 0xc5, + 0x04, 0x4f, 0x0b, 0x61, 0x00, 0x15, 0x1f, 0xc0, 0x05, 0x81, 0x0f, 0xc5, + 0x04, 0x2c, 0x0b, 0x62, 0x00, 0xe4, 0x09, 0xa1, 0x00, 0x15, 0x1f, 0xc0, + 0x05, 0x6b, 0x0f, 0xc4, 0x04, 0x59, 0x0a, 0x8f, 0x0f, 0xce, 0x01, 0x39, + 0x0f, 0xcd, 0x04, 0x49, 0x05, 0xb8, 0x06, 0x0c, 0x0f, 0xc5, 0x04, 0x4f, + 0x0b, 0x61, 0x00, 0x59, 0x09, 0xc1, 0x0f, 0xc5, 0x01, 0x95, 0x0b, 0x52, + 0x0f, 0xc0, 0x04, 0xf3, 0x1f, 0xc0, 0x05, 0xdf, 0x0f, 0xc4, 0x04, 0x50, + 0x0f, 0xc5, 0x04, 0x34, 0x03, 0x3e, 0x0f, 0xf7, 0x00, 0x2d, 0x0f, 0xf9, + 0x08, 0x82, 0x0f, 0xc0, 0x05, 0x76, 0x0f, 0xc4, 0x04, 0x56, 0x0f, 0xcf, + 0x04, 0x40, 0x06, 0x0e, 0x0d, 0xcd, 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, + 0x0f, 0xc0, 0x05, 0x56, 0x0f, 0xc4, 0x04, 0x59, 0x0f, 0xcf, 0x04, 0x43, + 0x06, 0x0e, 0x0d, 0xcd, 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, 0x0f, 0xc0, + 0x05, 0x8e, 0x0f, 0xc4, 0x04, 0x56, 0x0f, 0xcf, 0x04, 0x3a, 0x0f, 0xce, + 0x01, 0x39, 0x0f, 0xcd, 0x04, 0x5c, 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, + 0x0f, 0xc0, 0x05, 0x9a, 0x0f, 0xc4, 0x04, 0x59, 0x0f, 0xcf, 0x04, 0x3d, + 0x0f, 0xce, 0x01, 0x39, 0x0f, 0xcd, 0x04, 0x5c, 0x05, 0xb8, 0x06, 0x0c, + 0x0f, 0xc0, 0x05, 0xa7, 0x0f, 0xc4, 0x04, 0x59, 0x0f, 0xcf, 0x04, 0x3a, + 0x0f, 0xce, 0x01, 0x39, 0x0f, 0xcd, 0x04, 0x5f, 0x0f, 0xcc, 0x00, 0xc4, + 0x05, 0xb9, 0x0f, 0xc0, 0x05, 0xb3, 0x0f, 0xc4, 0x04, 0x56, 0x0f, 0xcf, + 0x04, 0x3d, 0x0f, 0xce, 0x01, 0x39, 0x0f, 0xcd, 0x04, 0x5f, 0x05, 0xb8, + 0x04, 0x0c, 0x0f, 0xc0, 0x05, 0xbe, 0x0f, 0xc4, 0x04, 0x5c, 0x0a, 0x8f, + 0x0f, 0xce, 0x01, 0x39, 0x0f, 0xcd, 0x04, 0x4c, 0x05, 0xb8, 0x06, 0x0c, + 0x0f, 0xc0, 0x05, 0xc9, 0x0f, 0xc4, 0x04, 0x5f, 0x0a, 0x8f, 0x0f, 0xce, + 0x01, 0x39, 0x0f, 0xcd, 0x04, 0x4c, 0x05, 0xb8, 0x06, 0x0c, 0x0f, 0xc0, + 0x05, 0xd4, 0x0f, 0xc4, 0x04, 0x5c, 0x0f, 0xcf, 0x04, 0x40, 0x06, 0x0e, + 0x0d, 0xcd, 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, 0x0f, 0xc0, 0x05, 0x56, + 0x0f, 0xc4, 0x04, 0x5f, 0x0f, 0xcf, 0x04, 0x43, 0x06, 0x0e, 0x0d, 0xcd, + 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, 0x0f, 0xc0, 0x05, 0xec, 0x0f, 0xc4, + 0x04, 0x40, 0x0f, 0xcf, 0x04, 0x40, 0x0f, 0xce, 0x01, 0x39, 0x0f, 0xcd, + 0x04, 0x62, 0x0f, 0xcc, 0x00, 0xc4, 0x05, 0xb9, 0x0f, 0xc0, 0x05, 0xf8, + 0x0f, 0xc4, 0x04, 0x43, 0x0f, 0xcf, 0x04, 0x43, 0x0f, 0xce, 0x01, 0x39, + 0x0f, 0xcd, 0x04, 0x62, 0x05, 0xb8, 0x06, 0x0c, 0x0f, 0xc0, 0x06, 0x1a, + 0x0f, 0xc5, 0x04, 0x2c, 0x0b, 0x62, 0x00, 0xe4, 0x09, 0xa1, 0x00, 0x15, + 0x0f, 0xcf, 0x04, 0x6c, 0x0f, 0xce, 0x04, 0x62, 0x0f, 0xcd, 0x04, 0x6f, + 0x0f, 0xcc, 0x04, 0x4c, 0x1f, 0xcf, 0x04, 0x72, 0x1f, 0xcd, 0x04, 0x75, + 0x1f, 0xcc, 0x04, 0x49, 0x0d, 0xc4, 0x0f, 0xf6, 0x02, 0x74, 0x0d, 0x85, + 0x00, 0x36, 0x0d, 0xc4, 0x0d, 0x44, 0x0f, 0xf6, 0x02, 0x74, 0x0d, 0x05, + 0x00, 0x34, 0x0d, 0x44, 0x0f, 0xc0, 0x06, 0x2a, 0x0f, 0xc4, 0x04, 0x46, + 0x02, 0x37, 0x0f, 0xf7, 0x02, 0x99, 0x0f, 0xc4, 0x04, 0x65, 0x00, 0x37, + 0x0f, 0xc4, 0x04, 0x78, 0x02, 0xb7, 0x0f, 0xc4, 0x04, 0x78, 0x00, 0x35, + 0x0f, 0xc0, 0x06, 0x3a, 0x0f, 0xc4, 0x04, 0x49, 0x0f, 0xc5, 0x00, 0xaa, + 0x08, 0x3b, 0x0f, 0xc4, 0x04, 0x49, 0x00, 0x37, 0x0f, 0xc4, 0x04, 0x65, + 0x06, 0xb7, 0x0f, 0xc4, 0x04, 0x68, 0x00, 0x35, 0x0f, 0xc0, 0x06, 0x57, + 0x0f, 0xc4, 0x04, 0x68, 0x0f, 0xf7, 0x00, 0xbd, 0x0f, 0xc4, 0x00, 0xb3, + 0x05, 0xb7, 0x0f, 0xfb, 0x00, 0x58, 0x00, 0x08, 0x10, 0x48, 0x0f, 0xc4, + 0x04, 0x6b, 0x0c, 0x00, 0x0f, 0xc4, 0x04, 0x87, 0x0b, 0x21, 0x0c, 0x19, + 0x09, 0xc0, 0x0f, 0xc5, 0x04, 0x2d, 0x0f, 0xfb, 0x08, 0x1b, 0x0f, 0xfb, + 0x08, 0x1b, 0x0f, 0xf9, 0x08, 0x1b, 0x0f, 0xc0, 0x06, 0x7a, 0x0f, 0xc4, + 0x04, 0x6b, 0x0b, 0x21, 0x00, 0x14, 0x0f, 0xcf, 0x04, 0x7b, 0x1f, 0xcf, + 0x04, 0x7e, 0x0f, 0xce, 0x06, 0x28, 0x1f, 0xce, 0x04, 0x49, 0x0f, 0xc4, + 0x04, 0x46, 0x02, 0x37, 0x0f, 0xc4, 0x02, 0xc4, 0x00, 0x37, 0x0d, 0xc4, + 0x0f, 0xc5, 0x04, 0x46, 0x0f, 0xf7, 0x02, 0x74, 0x00, 0x36, 0x0d, 0xc4, + 0x0f, 0xcf, 0x04, 0x81, 0x0d, 0xc4, 0x0f, 0xf6, 0x02, 0x74, 0x0d, 0x85, + 0x00, 0x34, 0x0d, 0xc4, 0x0f, 0xc0, 0x04, 0xb6, 0x0f, 0xc4, 0x04, 0x6b, + 0x0b, 0x21, 0x00, 0x14, 0x1f, 0x39, 0x0f, 0xc4, 0x04, 0x84, 0x0f, 0xf7, + 0x00, 0xbd, 0x0f, 0xc4, 0x04, 0x46, 0x05, 0xb7, 0x0f, 0xfb, 0x00, 0x58, + 0x1f, 0x39, 0x0f, 0xc4, 0x04, 0x84, 0x0f, 0xf5, 0x00, 0xb2, 0x0f, 0xc0, + 0x04, 0xe6, 0x0f, 0xc4, 0x04, 0x6c, 0x0f, 0xc5, 0x04, 0x88, 0x07, 0x3e, + 0x0f, 0xf7, 0x00, 0x2d, 0x0f, 0xfb, 0x08, 0x15, 0x0f, 0xc8, 0x06, 0x9f, + 0x05, 0x3b, 0x0f, 0xf9, 0x08, 0x82, 0x0f, 0xc4, 0x02, 0x0e, 0x0b, 0x08, + 0x00, 0xb6, 0x00, 0x09, 0x0f, 0xf7, 0x02, 0x99, 0x0f, 0xc4, 0x00, 0xb6, + 0x00, 0x37, 0x01, 0xbb, 0x0f, 0xc4, 0x04, 0x97, 0x0f, 0xc5, 0x04, 0x9a, + 0x0f, 0xf7, 0x02, 0x74, 0x0f, 0xc4, 0x00, 0xc2, 0x00, 0x37, 0x01, 0xbb, + 0x0f, 0xc4, 0x00, 0xc2, 0x0f, 0xc5, 0x04, 0x94, 0x08, 0x3b, 0x0f, 0xc4, + 0x00, 0xb6, 0x06, 0xb7, 0x0f, 0xc4, 0x00, 0xb6, 0x06, 0xb7, 0x0f, 0xc4, + 0x00, 0xc5, 0x00, 0x37, 0x01, 0xbb, 0x0f, 0xc4, 0x04, 0xa3, 0x0b, 0x08, + 0x00, 0xb6, 0x00, 0x09, 0x0f, 0xc4, 0x00, 0xb9, 0x00, 0x37, 0x0f, 0xc4, + 0x00, 0xb6, 0x06, 0xb7, 0x0f, 0xc4, 0x00, 0xce, 0x00, 0x37, 0x01, 0xbb, + 0x0f, 0xc4, 0x02, 0x0e, 0x0b, 0x21, 0x0f, 0xc4, 0x04, 0xa3, 0x0b, 0x11, + 0x09, 0xc8, 0x00, 0xb6, 0x00, 0x09, 0x0f, 0xc4, 0x00, 0xbc, 0x00, 0x37, + 0x0f, 0xc4, 0x04, 0x97, 0x06, 0xb7, 0x0f, 0xc4, 0x00, 0xbf, 0x00, 0x37, + 0x01, 0xbb, 0x0f, 0xc4, 0x00, 0xbf, 0x0f, 0xc5, 0x04, 0x9a, 0x0f, 0xf7, + 0x02, 0x7d, 0x0f, 0xc4, 0x00, 0xb9, 0x0f, 0xf7, 0x02, 0x81, 0x0f, 0xc4, + 0x00, 0xc8, 0x00, 0x37, 0x01, 0xbb, 0x0f, 0xc4, 0x04, 0xa0, 0x0f, 0xc5, + 0x04, 0x9a, 0x0f, 0xf7, 0x02, 0x7d, 0x0f, 0xc4, 0x00, 0xbc, 0x06, 0xb7, + 0x0f, 0xc4, 0x00, 0xcb, 0x00, 0x37, 0x01, 0xbb, 0x0f, 0xc4, 0x04, 0x8e, + 0x0f, 0xc5, 0x04, 0x91, 0x0f, 0xf7, 0x02, 0x7d, 0x0f, 0xc4, 0x00, 0xd1, + 0x00, 0x37, 0x01, 0xbb, 0x0f, 0xc4, 0x04, 0x88, 0x0f, 0xc5, 0x04, 0x8b, + 0x0f, 0xf7, 0x02, 0x7d, 0x0f, 0xc4, 0x00, 0xd4, 0x00, 0x37, 0x01, 0xbb, + 0x0f, 0xcf, 0x0f, 0xff, 0x0f, 0xce, 0x02, 0xbb, 0x0f, 0xc4, 0x00, 0xce, + 0x0f, 0xc9, 0x0f, 0x5c, 0x0f, 0xca, 0x07, 0xf8, 0x0f, 0xcc, 0x0f, 0xf8, + 0x06, 0x3a, 0x01, 0xcd, 0x0f, 0xc4, 0x00, 0xce, 0x0f, 0xc9, 0x09, 0x9a, + 0x0f, 0xca, 0x07, 0xfe, 0x07, 0xcc, 0x0f, 0xcd, 0x0f, 0xe7, 0x06, 0x3b, + 0x0f, 0xc4, 0x00, 0xcb, 0x0f, 0xc9, 0x0a, 0x66, 0x00, 0x0a, 0x0f, 0xcc, + 0x00, 0x3f, 0x0f, 0xcd, 0x0f, 0xdf, 0x06, 0x3b, 0x0f, 0xc4, 0x00, 0xc8, + 0x0f, 0xc9, 0x0b, 0x33, 0x0f, 0xca, 0x07, 0xff, 0x0f, 0xcc, 0x00, 0x7f, + 0x0f, 0xcd, 0x0f, 0xbf, 0x06, 0x3b, 0x0f, 0xc4, 0x00, 0xbf, 0x01, 0xba, + 0x0d, 0xc0, 0x0f, 0xc4, 0x00, 0xbf, 0x0b, 0x0f, 0x0f, 0xce, 0x02, 0xbf, + 0x0f, 0xc4, 0x00, 0xc5, 0x0f, 0xc9, 0x08, 0xcd, 0x00, 0x0a, 0x0f, 0xcc, + 0x0f, 0x7e, 0x0f, 0xcd, 0x00, 0xf9, 0x06, 0x3b, 0x0f, 0xc4, 0x00, 0xc5, + 0x0f, 0xc9, 0x0b, 0x00, 0x00, 0xca, 0x0f, 0xcc, 0x07, 0xff, 0x0f, 0xcd, + 0x0b, 0xff, 0x06, 0x3b, 0x0f, 0xc4, 0x00, 0xd1, 0x0f, 0xc9, 0x08, 0x00, + 0x00, 0x0a, 0x1f, 0xc9, 0x0c, 0x00, 0x1f, 0xca, 0x07, 0xff, 0x0f, 0xcc, + 0x01, 0xef, 0x0f, 0xcd, 0x0e, 0xff, 0x06, 0x3b, 0x0f, 0xc4, 0x00, 0xd4, + 0x0f, 0xc9, 0x0c, 0x00, 0x00, 0x4a, 0x1f, 0xc9, 0x0e, 0x00, 0x0f, 0xcc, + 0x03, 0xef, 0x0f, 0xcd, 0x0d, 0xff, 0x06, 0x3b, 0x0f, 0xc4, 0x00, 0xd1, + 0x0f, 0xc9, 0x08, 0x00, 0x00, 0x0a, 0x1f, 0xca, 0x07, 0xff, 0x0f, 0xcc, + 0x0f, 0xfb, 0x0f, 0xcd, 0x0f, 0xfd, 0x06, 0x3b, 0x0f, 0xc4, 0x01, 0x99, + 0x0f, 0xc5, 0x01, 0x97, 0x0b, 0x61, 0x0d, 0xd5, 0x1f, 0xf8, 0x07, 0x93, + 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x00, 0xd2, 0x0f, 0xf8, 0x07, 0x99, + 0x10, 0xc0, 0x00, 0x00, 0x00, 0xd2, 0x1f, 0xf9, 0x07, 0x99, 0x0f, 0xfb, + 0x07, 0xab, 0x0f, 0xc4, 0x01, 0x98, 0x0f, 0xfa, 0x07, 0xa2, 0x0b, 0x0e, + 0x0f, 0xc5, 0x01, 0x81, 0x0f, 0x38, 0x00, 0x41, 0x0f, 0xf1, 0x0f, 0x15, + 0x0f, 0xe2, 0x0f, 0xf8, 0x0a, 0x64, 0x09, 0xa2, 0x0d, 0xa5, 0x0f, 0x38, + 0x09, 0xb2, 0x0f, 0xc4, 0x01, 0x97, 0x0d, 0xc0, 0x00, 0x0e, 0x07, 0x36, + 0x04, 0x0d, 0x01, 0x0a, 0x12, 0x8a, 0x02, 0x09, 0x12, 0x09, 0x00, 0x4c, + 0x00, 0x0b, 0x0d, 0xe2, 0x00, 0x21, 0x0f, 0xe4, 0x00, 0x81, 0x09, 0x95, + 0x10, 0x4e, 0x10, 0x8d, 0x10, 0x0c, 0x0f, 0xe4, 0x00, 0x50, 0x09, 0x95, + 0x10, 0x8e, 0x10, 0x8d, 0x10, 0x0c, 0x08, 0x24, 0x09, 0x95, 0x10, 0xce, + 0x1c, 0x8d, 0x10, 0x4b, 0x0f, 0xe4, 0x08, 0x04, 0x09, 0x95, 0x11, 0x0e, + 0x11, 0x0d, 0x10, 0x0c, 0x0f, 0xe4, 0x03, 0x0a, 0x09, 0x95, 0x14, 0x24, + 0x19, 0x94, 0x11, 0x4e, 0x0f, 0xe4, 0x04, 0x00, 0x09, 0x95, 0x11, 0x8e, + 0x1c, 0x4d, 0x10, 0x4c, 0x0f, 0xc4, 0x07, 0x3a, 0x0b, 0x21, 0x00, 0x15, + 0x0f, 0xc4, 0x01, 0x98, 0x0d, 0x80, 0x1f, 0xc4, 0x01, 0x91, 0x1d, 0x40, + 0x1f, 0xc4, 0x01, 0x83, 0x1d, 0x00, 0x1f, 0xf0, 0x0a, 0x11, 0x0f, 0x38, + 0x1c, 0xf2, 0x01, 0xe2, 0x0f, 0xc4, 0x07, 0xf5, 0x0b, 0x24, 0x09, 0xa1, + 0x00, 0x0f, 0x00, 0x54, 0x10, 0x4f, 0x00, 0x94, 0x14, 0x0f, 0x01, 0x14, + 0x11, 0x0f, 0x01, 0x54, 0x10, 0x8f, 0x01, 0x94, 0x1f, 0xcf, 0x04, 0x00, + 0x0d, 0xe1, 0x00, 0x14, 0x1f, 0x39, 0x0f, 0xf9, 0x07, 0xab, 0x0f, 0xf7, + 0x00, 0xbd, 0x07, 0x04, 0x00, 0x02, 0x0c, 0x42, 0x0f, 0xfa, 0x00, 0x58, + 0x0c, 0x82, 0x0d, 0xe2, 0x0d, 0x64, 0x1d, 0x24, 0x09, 0x8f, 0x0d, 0x84, + 0x0d, 0x48, 0x1d, 0x08, 0x0c, 0x02, 0x07, 0x34, 0x0a, 0x8e, 0x0f, 0xc4, + 0x04, 0x6c, 0x0f, 0xc8, 0x04, 0x88, 0x0f, 0xf5, 0x00, 0x71, 0x0b, 0xc9, + 0x0b, 0xca, 0x00, 0x21, 0x0c, 0x54, 0x1f, 0x39, 0x0c, 0x9f, 0x09, 0xe2, + 0x0c, 0x44, 0x0b, 0x8b, 0x0b, 0x25, 0x09, 0x82, 0x09, 0x8c, 0x0c, 0x14, + 0x10, 0x22, 0x0b, 0x25, 0x09, 0x82, 0x09, 0x8d, 0x0f, 0xc4, 0x01, 0x80, + 0x0b, 0x21, 0x00, 0x14, 0x0f, 0xe1, 0x0f, 0xff, 0x0c, 0xd9, 0x0c, 0xce, + 0x19, 0xce, 0x0d, 0x14, 0x1f, 0xf0, 0x0a, 0x12, 0x1d, 0xb2, 0x1f, 0xf0, + 0x0a, 0x13, 0x0f, 0x38, 0x1d, 0x72, 0x0b, 0x0f, 0x0f, 0xc4, 0x02, 0x0c, + 0x0b, 0x21, 0x00, 0xd9, 0x09, 0xc0, 0x09, 0xe1, 0x0f, 0xd2, 0x02, 0xd3, + 0x1f, 0xc0, 0x02, 0xc7, 0x0b, 0x04, 0x0d, 0xc2, 0x00, 0x02, 0x0f, 0x38, + 0x00, 0x02, 0x0f, 0xc4, 0x02, 0x0c, 0x0b, 0x03, 0x0f, 0xc4, 0x02, 0x11, + 0x0b, 0x03, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x03, 0x13, + 0x1f, 0x39, 0x00, 0x02, 0x0b, 0x21, 0x00, 0x59, 0x0f, 0xf8, 0x08, 0x3d, + 0x09, 0xc0, 0x0f, 0xf1, 0x0a, 0x1f, 0x0f, 0xc4, 0x04, 0x2c, 0x07, 0x36, + 0x0b, 0x08, 0x1a, 0x66, 0x19, 0xa6, 0x19, 0xa6, 0x19, 0xa6, 0x19, 0xaa, + 0x1f, 0xec, 0x02, 0x39, 0x1f, 0xee, 0x0d, 0x40, 0x1e, 0x21, 0x1c, 0x19, + 0x0f, 0xf6, 0x0b, 0x3f, 0x19, 0xc8, 0x0c, 0x4d, 0x0c, 0x8e, 0x0f, 0xfa, + 0x08, 0x7a, 0x0c, 0x09, 0x0a, 0x8f, 0x0d, 0x49, 0x00, 0xb6, 0x00, 0x08, + 0x0d, 0xa1, 0x05, 0xd1, 0x01, 0x36, 0x09, 0xc8, 0x00, 0x34, 0x0d, 0xc4, + 0x0f, 0xc4, 0x02, 0x0a, 0x0a, 0x8f, 0x0b, 0x85, 0x0b, 0x0e, 0x0f, 0xc4, + 0x04, 0x2b, 0x0f, 0xfb, 0x08, 0x94, 0x0d, 0xc4, 0x0a, 0xc0, 0x0a, 0xe1, + 0x0d, 0x92, 0x1f, 0xc0, 0x02, 0xd3, 0x0b, 0x04, 0x0f, 0xc5, 0x04, 0x2b, + 0x0f, 0xfe, 0x00, 0x2b, 0x0f, 0xf5, 0x00, 0x2d, 0x0f, 0xf7, 0x00, 0xbd, + 0x05, 0xb6, 0x0d, 0xc4, 0x0d, 0xb7, 0x05, 0x37, 0x0f, 0xf6, 0x00, 0xbd, + 0x0d, 0x44, 0x0d, 0x37, 0x00, 0x34, 0x0d, 0x44, 0x00, 0x0a, 0x00, 0x0b, + 0x01, 0x3e, 0x0f, 0xfd, 0x08, 0xb4, 0x00, 0x3f, 0x0b, 0x88, 0x00, 0x09, + 0x0c, 0x21, 0x02, 0xdf, 0x1f, 0xc9, 0x0f, 0xff, 0x0c, 0xa0, 0x09, 0xca, + 0x0c, 0x61, 0x0c, 0xd9, 0x09, 0xcb, 0x0c, 0xaa, 0x0c, 0xeb, 0x0f, 0xee, + 0x02, 0x40, 0x0c, 0xe1, 0x02, 0xdf, 0x0f, 0xc8, 0x0a, 0x7e, 0x1f, 0xc8, + 0x0a, 0xbe, 0x0c, 0x2e, 0x0f, 0x38, 0x0e, 0x01, 0x0f, 0xc4, 0x00, 0x5c, + 0x0f, 0xc5, 0x01, 0xb8, 0x0f, 0xfb, 0x08, 0xa4, 0x0f, 0xc4, 0x00, 0x60, + 0x0f, 0xc5, 0x01, 0xb9, 0x0f, 0xfb, 0x08, 0xa4, 0x0f, 0xc4, 0x00, 0x64, + 0x0f, 0xc5, 0x01, 0xba, 0x0f, 0xfb, 0x08, 0xa4, 0x0f, 0xc4, 0x00, 0x68, + 0x0f, 0xc5, 0x01, 0xbb, 0x0f, 0xfb, 0x08, 0xa4, 0x0f, 0xc5, 0x05, 0x60, + 0x0f, 0xc4, 0x01, 0xb8, 0x0b, 0x03, 0x0f, 0xc4, 0x01, 0xb9, 0x0b, 0x03, + 0x0f, 0xc5, 0x05, 0x62, 0x0f, 0xc4, 0x01, 0xba, 0x0b, 0x03, 0x0f, 0xc4, + 0x01, 0xbb, 0x0f, 0x38, 0x0b, 0x03, 0x07, 0xb7, 0x1f, 0xf9, 0x08, 0xf8, + 0x0f, 0xc4, 0x01, 0x34, 0x00, 0x02, 0x00, 0x02, 0x0f, 0xc4, 0x01, 0x61, + 0x0f, 0xc0, 0x00, 0x2d, 0x0f, 0xf9, 0x09, 0x02, 0x0f, 0xc4, 0x01, 0x34, + 0x00, 0x02, 0x00, 0x02, 0x0f, 0xc4, 0x01, 0x61, 0x0f, 0xc0, 0x00, 0xd9, + 0x0f, 0xf9, 0x09, 0x02, 0x0f, 0xc4, 0x01, 0x34, 0x0f, 0xf0, 0x05, 0x01, + 0x0b, 0xb2, 0x0f, 0xf0, 0x05, 0x00, 0x0b, 0xb2, 0x0f, 0xc4, 0x01, 0x60, + 0x0f, 0xf0, 0x05, 0x02, 0x00, 0x00, 0x00, 0x32, 0x0f, 0xf0, 0x0a, 0x03, + 0x00, 0x32, 0x0f, 0xc4, 0x01, 0x61, 0x0f, 0xf0, 0x0a, 0x02, 0x0b, 0x32, + 0x0f, 0xc4, 0x01, 0xb0, 0x0f, 0xc0, 0x00, 0x64, 0x00, 0x08, 0x0f, 0xfa, + 0x19, 0x6d, 0x00, 0x09, 0x0f, 0xf7, 0x02, 0xb6, 0x0f, 0xfb, 0x12, 0xcf, + 0x0f, 0xc4, 0x06, 0x8d, 0x0b, 0x21, 0x0f, 0xd3, 0x00, 0x30, 0x0f, 0xc4, + 0x06, 0x94, 0x09, 0xe1, 0x0b, 0xa0, 0x0f, 0xf0, 0x03, 0x2a, 0x09, 0xf2, + 0x00, 0x21, 0x1f, 0xe1, 0x1f, 0xff, 0x0b, 0x99, 0x0f, 0xf0, 0x03, 0x29, + 0x09, 0xf2, 0x0f, 0xc4, 0x01, 0x9e, 0x00, 0x02, 0x0f, 0xc4, 0x01, 0xac, + 0x00, 0x00, 0x0f, 0xc4, 0x01, 0xaf, 0x00, 0x00, 0x0f, 0xc4, 0x05, 0x86, + 0x00, 0x00, 0x04, 0x05, 0x0f, 0xc1, 0x00, 0x29, 0x02, 0xba, 0x00, 0x08, + 0x0f, 0x39, 0x0f, 0xc4, 0x06, 0x94, 0x0f, 0xf0, 0x03, 0x2a, 0x0b, 0xb2, + 0x0f, 0xf0, 0x03, 0x29, 0x0b, 0xb2, 0x0f, 0xc4, 0x06, 0x8d, 0x0f, 0xf0, + 0x03, 0x2b, 0x0f, 0xc0, 0x00, 0x30, 0x0f, 0xf2, 0x00, 0x30, 0x0f, 0xf7, + 0x0b, 0xc3, 0x0f, 0xc8, 0x0a, 0xa1, 0x07, 0x36, 0x00, 0x49, 0x1f, 0xc8, + 0x06, 0xa9, 0x00, 0xb6, 0x10, 0x09, 0x0f, 0xc8, 0x1f, 0xe7, 0x01, 0x37, + 0x0f, 0xc4, 0x05, 0x5c, 0x00, 0x37, 0x09, 0x36, 0x04, 0x08, 0x0f, 0xc4, + 0x06, 0x01, 0x04, 0x00, 0x04, 0x04, 0x0f, 0xc0, 0x00, 0x2a, 0x0f, 0xc4, + 0x01, 0xa0, 0x00, 0x00, 0x08, 0xc4, 0x00, 0x80, 0x0f, 0xc8, 0x00, 0x3f, + 0x0f, 0xf7, 0x05, 0x23, 0x0f, 0x39, 0x08, 0xc4, 0x0b, 0x21, 0x00, 0x54, + 0x1f, 0xf9, 0x09, 0x82, 0x0f, 0x38, 0x09, 0xc0, 0x0f, 0xf7, 0x05, 0x37, + 0x0f, 0x39, 0x04, 0x3b, 0x0f, 0xfb, 0x09, 0x7b, 0x0f, 0x39, 0x04, 0x3b, + 0x07, 0x37, 0x1f, 0xf9, 0x09, 0x90, 0x0f, 0xf6, 0x05, 0x5c, 0x00, 0x48, + 0x0f, 0xfb, 0x0d, 0xb2, 0x0f, 0xc4, 0x01, 0xa2, 0x00, 0x21, 0x0b, 0x15, + 0x1f, 0xf9, 0x09, 0xae, 0x0f, 0xc4, 0x01, 0x5f, 0x0b, 0x21, 0x00, 0x59, + 0x09, 0xc0, 0x06, 0x53, 0x1f, 0xf9, 0x09, 0xa4, 0x0f, 0xf7, 0x05, 0x37, + 0x01, 0x38, 0x00, 0xc8, 0x09, 0xe2, 0x00, 0x64, 0x09, 0xa2, 0x00, 0x63, + 0x02, 0x3a, 0x09, 0x88, 0x0f, 0xf7, 0x0c, 0x13, 0x0f, 0xf5, 0x0c, 0x97, + 0x08, 0xc4, 0x0b, 0x21, 0x00, 0x54, 0x09, 0xe2, 0x00, 0x64, 0x09, 0xa2, + 0x00, 0x63, 0x02, 0x3a, 0x09, 0x88, 0x0f, 0xf7, 0x0c, 0x13, 0x0f, 0xf7, + 0x0c, 0x97, 0x0f, 0xfb, 0x09, 0x7b, 0x04, 0x04, 0x0f, 0xc5, 0x01, 0x5f, + 0x0b, 0x21, 0x0f, 0xd5, 0x00, 0x40, 0x1f, 0xf8, 0x09, 0xc7, 0x10, 0x01, + 0x0f, 0x39, 0x0f, 0xf0, 0x05, 0x0c, 0x0f, 0x38, 0x00, 0xb2, 0x04, 0x3b, + 0x0f, 0xf7, 0x0c, 0x13, 0x0f, 0xf7, 0x0c, 0x97, 0x07, 0x37, 0x1f, 0xf9, + 0x09, 0xd6, 0x0f, 0xf6, 0x05, 0x5c, 0x00, 0x48, 0x09, 0x3b, 0x04, 0x04, + 0x0f, 0xc0, 0x00, 0x41, 0x08, 0xc4, 0x0b, 0x21, 0x00, 0x54, 0x09, 0xe2, + 0x00, 0x64, 0x09, 0xa2, 0x00, 0x63, 0x02, 0x3a, 0x09, 0x88, 0x0f, 0xfb, + 0x09, 0x7b, 0x0f, 0x39, 0x04, 0x3b, 0x07, 0xba, 0x00, 0xc8, 0x0f, 0xc4, + 0x01, 0xa0, 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xf9, 0x09, 0xf3, 0x0f, 0xfb, + 0x0d, 0xf5, 0x0f, 0xf9, 0x0a, 0x38, 0x0f, 0xfb, 0x0d, 0xb2, 0x0f, 0xfb, + 0x0e, 0x05, 0x0f, 0xc4, 0x01, 0xb6, 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xf9, + 0x0a, 0xc3, 0x0f, 0xc4, 0x01, 0x9f, 0x0b, 0x22, 0x0f, 0xe4, 0x00, 0xc0, + 0x09, 0xa1, 0x0f, 0xd4, 0x00, 0xc0, 0x1f, 0xf9, 0x0a, 0x15, 0x0f, 0xd4, + 0x00, 0x40, 0x1f, 0xf9, 0x0a, 0x15, 0x00, 0x14, 0x1f, 0x39, 0x0f, 0xc4, + 0x01, 0xa1, 0x0b, 0x21, 0x00, 0x55, 0x1f, 0x38, 0x09, 0xc0, 0x0f, 0xf9, + 0x0a, 0x38, 0x0f, 0xc4, 0x01, 0x42, 0x0b, 0x08, 0x0f, 0xc4, 0x01, 0xa7, + 0x0b, 0x21, 0x0f, 0xd4, 0x08, 0x00, 0x1f, 0xf9, 0x0a, 0x2c, 0x0c, 0x14, + 0x1f, 0xf9, 0x0a, 0x99, 0x0f, 0xc4, 0x01, 0xa8, 0x0b, 0x21, 0x0f, 0xd4, + 0x08, 0x00, 0x1f, 0xf9, 0x0a, 0x2c, 0x0c, 0x14, 0x1f, 0xf9, 0x0a, 0x99, + 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0xa6, 0x0b, 0x21, 0x00, 0x54, 0x1f, 0xf8, + 0x0a, 0x38, 0x09, 0xc0, 0x0f, 0xc4, 0x01, 0xa1, 0x0f, 0x38, 0x01, 0x00, + 0x0f, 0xc4, 0x01, 0xa3, 0x00, 0x00, 0x0f, 0xc4, 0x01, 0xa2, 0x00, 0x00, + 0x0f, 0xc4, 0x01, 0xa1, 0x01, 0x00, 0x0f, 0xc4, 0x01, 0xa6, 0x00, 0xc0, + 0x0f, 0xc4, 0x01, 0xa7, 0x0f, 0xc0, 0x08, 0x00, 0x0f, 0xc4, 0x01, 0xa8, + 0x0f, 0xc0, 0x08, 0x00, 0x07, 0xb7, 0x01, 0x48, 0x13, 0xc8, 0x0f, 0xc4, + 0x01, 0xa0, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x09, 0xcb, 0x09, 0xe1, + 0x0c, 0x16, 0x1f, 0xf9, 0x0a, 0xda, 0x00, 0x54, 0x10, 0x08, 0x00, 0x94, + 0x16, 0x48, 0x00, 0xd4, 0x1f, 0xc8, 0x1f, 0xe7, 0x01, 0x14, 0x1f, 0xc8, + 0x00, 0x32, 0x01, 0x54, 0x1f, 0xc8, 0x1f, 0xce, 0x01, 0x94, 0x1f, 0xc8, + 0x00, 0x4b, 0x01, 0xd4, 0x1f, 0xc8, 0x1f, 0xb5, 0x02, 0x14, 0x1f, 0xc8, + 0x00, 0x64, 0x02, 0x54, 0x1f, 0xc8, 0x1f, 0x9c, 0x02, 0x94, 0x1f, 0xc8, + 0x00, 0x7d, 0x02, 0xd4, 0x1f, 0xc8, 0x1f, 0x83, 0x03, 0x14, 0x1f, 0xc8, + 0x00, 0x96, 0x03, 0x54, 0x1f, 0xc8, 0x1f, 0x6a, 0x03, 0x94, 0x1f, 0xc8, + 0x00, 0xaf, 0x03, 0xd4, 0x1f, 0xc8, 0x1f, 0x51, 0x0f, 0xfb, 0x19, 0x85, + 0x07, 0xb7, 0x0f, 0xc9, 0x00, 0x2d, 0x1f, 0xc9, 0x00, 0xd9, 0x0c, 0x61, + 0x0c, 0x1b, 0x09, 0xc8, 0x0c, 0x21, 0x0f, 0xd7, 0x1f, 0xff, 0x10, 0x08, + 0x0f, 0xf0, 0x0a, 0x02, 0x0c, 0x32, 0x0f, 0xc4, 0x01, 0x61, 0x0f, 0x38, + 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0x42, 0x0f, 0xf6, 0x0d, 0x7c, 0x00, 0x48, + 0x04, 0xc4, 0x0f, 0xc5, 0x05, 0x6e, 0x04, 0xb7, 0x0f, 0xc4, 0x01, 0xaa, + 0x00, 0x00, 0x0f, 0xc4, 0x06, 0x96, 0x0f, 0xc5, 0x05, 0x71, 0x04, 0xb7, + 0x0f, 0xc4, 0x01, 0xab, 0x00, 0x00, 0x04, 0x04, 0x0f, 0xc0, 0x00, 0x2b, + 0x08, 0xc4, 0x02, 0x80, 0x0f, 0xc8, 0x00, 0x40, 0x0f, 0xf7, 0x05, 0x23, + 0x07, 0xb7, 0x0f, 0xc8, 0x00, 0x2d, 0x1f, 0xc8, 0x00, 0xd9, 0x0f, 0xf0, + 0x0a, 0x02, 0x0c, 0x32, 0x00, 0x08, 0x0f, 0xfa, 0x19, 0x6d, 0x00, 0x09, + 0x0f, 0x39, 0x0f, 0xc4, 0x01, 0x62, 0x0b, 0x22, 0x00, 0x63, 0x09, 0x80, + 0x02, 0x36, 0x04, 0xc4, 0x0f, 0xf7, 0x00, 0x8f, 0x05, 0x84, 0x0f, 0xf6, + 0x0d, 0x7c, 0x00, 0x08, 0x08, 0xc4, 0x01, 0x80, 0x0f, 0xc8, 0x00, 0x3f, + 0x0f, 0xf7, 0x05, 0x23, 0x0f, 0xc4, 0x01, 0xa0, 0x0f, 0x38, 0x00, 0x00, + 0x01, 0x3a, 0x00, 0x88, 0x0f, 0x39, 0x00, 0x44, 0x0c, 0x00, 0x04, 0x3b, + 0x0f, 0xf7, 0x0c, 0x13, 0x0f, 0xf7, 0x0c, 0x97, 0x0f, 0xc8, 0x00, 0x2b, + 0x03, 0x3b, 0x1f, 0xf9, 0x0b, 0x02, 0x0f, 0xf0, 0x0a, 0x07, 0x01, 0x32, + 0x0f, 0xc4, 0x06, 0xe9, 0x0f, 0xc5, 0x07, 0x51, 0x04, 0xb7, 0x0f, 0xc4, + 0x06, 0xec, 0x0f, 0xc5, 0x07, 0x54, 0x04, 0xb7, 0x0f, 0xc4, 0x06, 0xe3, + 0x0f, 0xc5, 0x07, 0x3f, 0x04, 0xb7, 0x0f, 0xc4, 0x06, 0xe6, 0x0f, 0xc5, + 0x07, 0x42, 0x04, 0xb7, 0x0f, 0xf9, 0x0b, 0x16, 0x0f, 0xc4, 0x06, 0xf5, + 0x0f, 0xc5, 0x07, 0x51, 0x04, 0xb7, 0x0f, 0xc4, 0x06, 0xf8, 0x0f, 0xc5, + 0x07, 0x54, 0x04, 0xb7, 0x0f, 0xc4, 0x06, 0xef, 0x0f, 0xc5, 0x07, 0x3f, + 0x04, 0xb7, 0x0f, 0xc4, 0x06, 0xf2, 0x0f, 0xc5, 0x07, 0x42, 0x04, 0xb7, + 0x07, 0x37, 0x1f, 0xf9, 0x0b, 0x2d, 0x0f, 0xf7, 0x09, 0x2f, 0x0f, 0xf7, + 0x09, 0x62, 0x0f, 0xf7, 0x09, 0xc3, 0x0f, 0xc8, 0x00, 0x2b, 0x03, 0x3b, + 0x1f, 0xfb, 0x0b, 0xfa, 0x00, 0x44, 0x0f, 0xfa, 0x0c, 0x0e, 0x0b, 0x08, + 0x0f, 0xf6, 0x05, 0x5c, 0x00, 0x48, 0x0f, 0xf9, 0x0b, 0x4b, 0x0f, 0xf7, + 0x09, 0x2f, 0x0f, 0xf7, 0x09, 0xc3, 0x0f, 0xfb, 0x0b, 0xff, 0x0f, 0xf7, + 0x09, 0x2f, 0x0f, 0xf7, 0x09, 0x62, 0x0f, 0xc8, 0x00, 0x2b, 0x03, 0x3b, + 0x1f, 0xf7, 0x0a, 0x0a, 0x0f, 0xfb, 0x0b, 0xff, 0x0f, 0xc8, 0x00, 0x2b, + 0x03, 0x3b, 0x1f, 0xf7, 0x0a, 0x72, 0x0f, 0xfb, 0x17, 0x68, 0x0f, 0xfb, + 0x0b, 0xff, 0x00, 0x44, 0x0f, 0xfa, 0x0c, 0x0e, 0x0b, 0x08, 0x0f, 0xc4, + 0x01, 0x9e, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x00, 0x14, + 0x10, 0x40, 0x0f, 0x39, 0x0f, 0xc8, 0x00, 0x50, 0x08, 0xbb, 0x07, 0xba, + 0x01, 0x08, 0x0f, 0xc8, 0x00, 0x50, 0x03, 0x3b, 0x1f, 0xf9, 0x0b, 0x7e, + 0x0f, 0xc4, 0x01, 0x9e, 0x07, 0x36, 0x0b, 0x08, 0x1c, 0x27, 0x19, 0xa7, + 0x19, 0x88, 0x0c, 0x21, 0x0f, 0xd2, 0x00, 0x6f, 0x1f, 0xc4, 0x01, 0xb7, + 0x1f, 0xf8, 0x0b, 0x75, 0x10, 0x40, 0x0f, 0xc4, 0x05, 0xe8, 0x0b, 0x21, + 0x00, 0x14, 0x14, 0x04, 0x1f, 0xc0, 0x00, 0x2b, 0x1f, 0x39, 0x07, 0xba, + 0x01, 0x48, 0x0f, 0xf0, 0x0a, 0x07, 0x00, 0x32, 0x0f, 0xc4, 0x01, 0x9e, + 0x0f, 0x38, 0x00, 0x02, 0x0f, 0xc4, 0x01, 0x9e, 0x0f, 0xc5, 0x07, 0x5e, + 0x0b, 0xa1, 0x0b, 0xd2, 0x11, 0x3a, 0x11, 0x08, 0x0f, 0x39, 0x0f, 0xc8, + 0x00, 0x3c, 0x08, 0xbb, 0x0f, 0xc4, 0x01, 0x7f, 0x0b, 0x21, 0x00, 0x00, + 0x00, 0x15, 0x0f, 0xc4, 0x01, 0xbc, 0x0b, 0x21, 0x00, 0x19, 0x10, 0x59, + 0x09, 0xc0, 0x09, 0xe1, 0x00, 0x93, 0x14, 0x04, 0x1f, 0xc0, 0x00, 0x32, + 0x0f, 0xc8, 0x00, 0x3c, 0x03, 0x3b, 0x1f, 0x39, 0x0f, 0xc4, 0x01, 0xb0, + 0x0f, 0xc0, 0x00, 0x96, 0x0f, 0xc4, 0x01, 0x80, 0x0b, 0x21, 0x00, 0x15, + 0x1f, 0xc4, 0x01, 0x83, 0x1f, 0xfa, 0x04, 0x60, 0x10, 0x40, 0x0f, 0x39, + 0x0f, 0xc4, 0x01, 0x78, 0x0b, 0x21, 0x0f, 0xd3, 0x00, 0xfa, 0x1f, 0xf9, + 0x0b, 0xcd, 0x0f, 0xc5, 0x01, 0xbe, 0x0f, 0xc4, 0x01, 0xbd, 0x0b, 0x21, + 0x00, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x0f, 0xd3, 0x00, 0x28, 0x1f, 0x39, + 0x0f, 0xd2, 0x00, 0x3c, 0x1f, 0xc0, 0x00, 0x28, 0x10, 0x01, 0x0f, 0xc4, + 0x05, 0x86, 0x0b, 0x21, 0x00, 0x93, 0x1b, 0x61, 0x10, 0x59, 0x19, 0xc1, + 0x0b, 0x61, 0x02, 0x93, 0x1f, 0x39, 0x01, 0x38, 0x01, 0x08, 0x0f, 0xc8, + 0x00, 0x3c, 0x08, 0xbb, 0x0f, 0xfb, 0x0b, 0xac, 0x07, 0x37, 0x00, 0x48, + 0x11, 0x08, 0x0c, 0x21, 0x0f, 0xc4, 0x01, 0x2e, 0x0b, 0x20, 0x09, 0xc2, + 0x09, 0xc8, 0x00, 0x21, 0x0b, 0x19, 0x09, 0xc2, 0x07, 0xba, 0x00, 0x88, + 0x0f, 0xc8, 0x00, 0x3c, 0x0f, 0xf7, 0x00, 0x3a, 0x1f, 0xf9, 0x0b, 0xed, + 0x0f, 0xd5, 0x00, 0x32, 0x1f, 0xf9, 0x0b, 0xf2, 0x0f, 0x39, 0x02, 0x3a, + 0x00, 0x48, 0x0f, 0xfb, 0x11, 0x41, 0x0f, 0x39, 0x01, 0x3a, 0x01, 0x08, + 0x02, 0x3a, 0x00, 0x08, 0x02, 0xba, 0x00, 0x08, 0x0f, 0x39, 0x0f, 0x39, + 0x0f, 0xf7, 0x0a, 0x0a, 0x0f, 0xf7, 0x0a, 0x72, 0x0f, 0x39, 0x09, 0x3b, + 0x0f, 0xfb, 0x0c, 0xf8, 0x0f, 0xfb, 0x13, 0xae, 0x0f, 0xfb, 0x0c, 0x26, + 0x0f, 0xfb, 0x02, 0x35, 0x04, 0x3b, 0x0f, 0xf7, 0x0c, 0x13, 0x0f, 0xf7, + 0x0c, 0x97, 0x0f, 0x39, 0x00, 0x04, 0x0c, 0x00, 0x09, 0x3b, 0x0f, 0xf6, + 0x00, 0x3a, 0x00, 0x48, 0x1f, 0x39, 0x02, 0x14, 0x1f, 0x39, 0x0f, 0xc4, + 0x05, 0x86, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc8, 0x09, 0xe1, 0x02, 0x96, + 0x1f, 0xf9, 0x0c, 0x22, 0x0f, 0x38, 0x0c, 0x00, 0x04, 0x04, 0x00, 0x05, + 0x0b, 0x40, 0x0f, 0x39, 0x0f, 0xc4, 0x00, 0x56, 0x02, 0x37, 0x0f, 0xc5, + 0x00, 0x56, 0x04, 0xb7, 0x0f, 0xc4, 0x00, 0x74, 0x04, 0xb7, 0x0f, 0xc4, + 0x00, 0xe9, 0x00, 0x37, 0x03, 0x37, 0x0f, 0xc4, 0x05, 0xd7, 0x07, 0x05, + 0x0b, 0x83, 0x0b, 0x83, 0x0f, 0xc3, 0x07, 0xff, 0x0f, 0xf7, 0x01, 0x39, + 0x0f, 0xc4, 0x00, 0xec, 0x0f, 0xc5, 0x00, 0xef, 0x04, 0xb7, 0x0f, 0xc4, + 0x00, 0xec, 0x00, 0x37, 0x0f, 0xc4, 0x00, 0xe9, 0x0f, 0xf7, 0x02, 0x93, + 0x0f, 0xc4, 0x00, 0xef, 0x02, 0xb7, 0x0f, 0xc4, 0x00, 0xf2, 0x00, 0x37, + 0x0f, 0xc4, 0x06, 0xb1, 0x0f, 0xf7, 0x02, 0x81, 0x01, 0x36, 0x03, 0x08, + 0x03, 0xb7, 0x0f, 0xc4, 0x01, 0x64, 0x0f, 0x38, 0x0c, 0x00, 0x0f, 0xc4, + 0x01, 0xa2, 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xfb, 0x0d, 0xa1, 0x0f, 0xf1, + 0x05, 0x0d, 0x0a, 0x48, 0x0f, 0xf1, 0x05, 0x0e, 0x0f, 0xc4, 0x01, 0x9a, + 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0x9b, 0x0a, 0x49, 0x0f, 0xf6, 0x03, 0xcd, + 0x0c, 0x40, 0x0f, 0xc4, 0x01, 0x72, 0x0c, 0x00, 0x0f, 0xc4, 0x07, 0x06, + 0x0b, 0x21, 0x00, 0x14, 0x1f, 0xc4, 0x01, 0x64, 0x1c, 0x21, 0x1b, 0x19, + 0x19, 0xc8, 0x0f, 0xf6, 0x00, 0x47, 0x00, 0x4b, 0x10, 0x08, 0x0f, 0xc4, + 0x01, 0x83, 0x0b, 0x21, 0x00, 0x15, 0x10, 0x08, 0x0f, 0xc4, 0x01, 0x9c, + 0x0c, 0x21, 0x0b, 0x19, 0x09, 0xc0, 0x09, 0xc9, 0x0f, 0xc4, 0x01, 0x9d, + 0x0b, 0x21, 0x0c, 0x51, 0x09, 0xca, 0x0f, 0xc4, 0x01, 0xbf, 0x0b, 0x21, + 0x0c, 0x91, 0x09, 0xc8, 0x0c, 0x80, 0x0f, 0xf0, 0x05, 0x02, 0x07, 0x36, + 0x0c, 0xb2, 0x1f, 0xc4, 0x00, 0xd7, 0x1a, 0x85, 0x1b, 0x8b, 0x1b, 0x83, + 0x1b, 0x83, 0x1c, 0x83, 0x1c, 0xca, 0x0f, 0xf6, 0x00, 0x42, 0x01, 0xcb, + 0x1f, 0xf0, 0x05, 0x08, 0x1c, 0xb2, 0x0f, 0xc4, 0x01, 0xa9, 0x0c, 0x00, + 0x0f, 0xfb, 0x0e, 0x59, 0x0f, 0xfb, 0x13, 0x6f, 0x0f, 0xfb, 0x0e, 0xd8, + 0x0f, 0xc4, 0x01, 0xa9, 0x0b, 0x09, 0x00, 0xb6, 0x00, 0x08, 0x0f, 0xc8, + 0x1f, 0xe8, 0x01, 0x37, 0x0f, 0xc4, 0x00, 0xda, 0x00, 0x37, 0x03, 0x37, + 0x0f, 0xc4, 0x06, 0xb1, 0x05, 0xb7, 0x0f, 0xf7, 0x01, 0x39, 0x0f, 0xc4, + 0x00, 0xdd, 0x00, 0x37, 0x0f, 0xc4, 0x01, 0xa9, 0x0b, 0x08, 0x00, 0x09, + 0x0c, 0x21, 0x02, 0xdf, 0x1f, 0xc9, 0x0f, 0xff, 0x0f, 0xc4, 0x01, 0x44, + 0x0b, 0x21, 0x0c, 0x20, 0x09, 0xc2, 0x09, 0xc8, 0x0b, 0x21, 0x0c, 0x59, + 0x09, 0xc0, 0x09, 0xc9, 0x0f, 0xc5, 0x02, 0x1f, 0x0f, 0xc4, 0x02, 0x21, + 0x02, 0xbe, 0x0f, 0xf7, 0x00, 0x2d, 0x0c, 0x03, 0x0c, 0x43, 0x0f, 0xf1, + 0x0a, 0x18, 0x08, 0x84, 0x0b, 0x21, 0x0f, 0xd9, 0x00, 0x5c, 0x09, 0xc4, + 0x0a, 0x40, 0x0f, 0xf1, 0x0a, 0x19, 0x0f, 0xd9, 0x00, 0x60, 0x09, 0xc4, + 0x0a, 0x40, 0x0f, 0xf1, 0x0a, 0x1a, 0x0f, 0xd9, 0x00, 0x64, 0x09, 0xc4, + 0x0a, 0x40, 0x0f, 0xf1, 0x0a, 0x1b, 0x0f, 0xd9, 0x00, 0x68, 0x09, 0xc4, + 0x0a, 0x40, 0x0f, 0x39, 0x0f, 0xc4, 0x01, 0x34, 0x0b, 0x88, 0x0b, 0x89, + 0x0f, 0xf0, 0x05, 0x01, 0x0c, 0x32, 0x0f, 0xf0, 0x05, 0x00, 0x0c, 0x72, + 0x0f, 0xf0, 0x05, 0x07, 0x0c, 0x32, 0x0f, 0xf0, 0x05, 0x06, 0x0f, 0x38, + 0x0c, 0x72, 0x0f, 0xfb, 0x0d, 0xb2, 0x0f, 0xc4, 0x01, 0x9f, 0x0b, 0x22, + 0x0f, 0xf1, 0x0a, 0x04, 0x0a, 0x62, 0x00, 0x48, 0x00, 0x09, 0x00, 0x21, + 0x0f, 0xc4, 0x01, 0xad, 0x0b, 0x21, 0x00, 0xd9, 0x09, 0xca, 0x09, 0xe1, + 0x03, 0x12, 0x19, 0xca, 0x0c, 0x80, 0x04, 0x24, 0x00, 0x21, 0x09, 0x94, + 0x1f, 0xf9, 0x0d, 0x46, 0x00, 0x49, 0x08, 0x24, 0x09, 0x94, 0x1f, 0xf8, + 0x0d, 0x46, 0x10, 0x08, 0x03, 0xe4, 0x0c, 0xa1, 0x09, 0x95, 0x09, 0x80, + 0x10, 0x08, 0x0f, 0xe4, 0x00, 0x80, 0x09, 0x94, 0x1f, 0xf9, 0x0d, 0x46, + 0x00, 0x49, 0x0f, 0xe4, 0x00, 0x40, 0x09, 0x94, 0x10, 0x08, 0x0f, 0xc4, + 0x01, 0x42, 0x00, 0x21, 0x0b, 0x95, 0x10, 0x08, 0x0b, 0x95, 0x10, 0x08, + 0x08, 0x84, 0x0b, 0x0a, 0x0c, 0xa1, 0x0f, 0xc4, 0x01, 0xa4, 0x0b, 0x15, + 0x10, 0x08, 0x1c, 0x80, 0x00, 0x21, 0x0c, 0x54, 0x1f, 0xf9, 0x0d, 0x57, + 0x0c, 0x14, 0x1f, 0xf9, 0x0d, 0x57, 0x0f, 0xc4, 0x01, 0xaf, 0x0b, 0x0b, + 0x0f, 0xc5, 0x01, 0xae, 0x0c, 0xe1, 0x0b, 0x56, 0x00, 0x00, 0x0f, 0x38, + 0x1c, 0xc1, 0x0f, 0xc4, 0x01, 0xaf, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, + 0x09, 0xe1, 0x0f, 0xc4, 0x01, 0xb0, 0x0b, 0x17, 0x1f, 0x39, 0x0f, 0xc4, + 0x01, 0xa5, 0x0c, 0x67, 0x09, 0xa2, 0x0c, 0x25, 0x09, 0x80, 0x0c, 0x21, + 0x00, 0x15, 0x01, 0x48, 0x01, 0x38, 0x11, 0x88, 0x0f, 0x39, 0x0f, 0xc5, + 0x01, 0xa4, 0x08, 0x84, 0x00, 0x61, 0x00, 0xe2, 0x0b, 0x19, 0x09, 0xe4, + 0x09, 0x80, 0x09, 0x81, 0x0f, 0xf1, 0x0a, 0x04, 0x0f, 0xc5, 0x01, 0xb1, + 0x0f, 0xc4, 0x01, 0x9f, 0x0a, 0x48, 0x0c, 0x01, 0x0c, 0x22, 0x0f, 0xe4, + 0x00, 0xf0, 0x09, 0x80, 0x0f, 0xe4, 0x00, 0xc0, 0x09, 0xa1, 0x0f, 0xd5, + 0x00, 0xc0, 0x0f, 0x39, 0x00, 0x61, 0x00, 0xe2, 0x0f, 0xc4, 0x01, 0xa4, + 0x0b, 0x19, 0x09, 0xe4, 0x09, 0x80, 0x08, 0x84, 0x09, 0x80, 0x09, 0xa1, + 0x00, 0x14, 0x1f, 0xc4, 0x01, 0x82, 0x1b, 0x21, 0x10, 0x59, 0x19, 0xc0, + 0x0f, 0xc4, 0x01, 0x9f, 0x0f, 0xc0, 0x00, 0xf0, 0x0f, 0xe1, 0x00, 0xc0, + 0x0f, 0xd5, 0x00, 0xc0, 0x0f, 0x39, 0x00, 0x61, 0x00, 0xe2, 0x08, 0x84, + 0x0b, 0x19, 0x09, 0xe4, 0x0f, 0xf0, 0x0a, 0x05, 0x07, 0xb6, 0x09, 0xb2, + 0x0f, 0xcb, 0x00, 0xac, 0x1f, 0xcb, 0x02, 0xb0, 0x0f, 0xf0, 0x0a, 0x06, + 0x0c, 0xf2, 0x0f, 0x39, 0x0f, 0xc4, 0x01, 0xa2, 0x0b, 0x21, 0x00, 0x15, + 0x1f, 0xf9, 0x0d, 0xf2, 0x0f, 0xfb, 0x0d, 0x6d, 0x1f, 0x39, 0x07, 0xb7, + 0x0f, 0xcb, 0x00, 0xac, 0x1f, 0xcb, 0x02, 0xb0, 0x0f, 0xf1, 0x0a, 0x06, + 0x0a, 0x4a, 0x0c, 0xa1, 0x0c, 0xd8, 0x09, 0xca, 0x00, 0x21, 0x00, 0x11, + 0x09, 0xcb, 0x0f, 0xc4, 0x01, 0x42, 0x0c, 0x82, 0x0c, 0xc2, 0x00, 0x21, + 0x0c, 0x95, 0x1f, 0xf9, 0x0d, 0xe1, 0x0c, 0xd5, 0x1f, 0xf9, 0x0d, 0xe1, + 0x0f, 0xf1, 0x0a, 0x05, 0x08, 0x84, 0x00, 0xe2, 0x0a, 0x64, 0x09, 0x80, + 0x08, 0x84, 0x0b, 0x21, 0x0f, 0xc4, 0x01, 0xa4, 0x0b, 0x14, 0x1f, 0xf9, + 0x0d, 0xe5, 0x0f, 0xc4, 0x01, 0xa3, 0x0f, 0x38, 0x00, 0x00, 0x0f, 0xc4, + 0x01, 0xa3, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x00, 0xd5, + 0x1f, 0x39, 0x0f, 0xc4, 0x01, 0xa2, 0x0f, 0xc0, 0x0a, 0xaa, 0x0f, 0x39, + 0x0f, 0xf9, 0x0d, 0x88, 0x0f, 0x39, 0x0f, 0xc4, 0x01, 0xb6, 0x00, 0x00, + 0x0f, 0xc4, 0x01, 0xb3, 0x00, 0x00, 0x0f, 0xc4, 0x01, 0xb5, 0x00, 0x00, + 0x0f, 0xc4, 0x01, 0xb2, 0x08, 0x00, 0x0f, 0xc4, 0x01, 0xb4, 0x0f, 0x38, + 0x08, 0x00, 0x0f, 0xc4, 0x01, 0xb2, 0x0b, 0x21, 0x00, 0xd9, 0x09, 0xc8, + 0x09, 0xe1, 0x03, 0x12, 0x19, 0xc8, 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0xb4, + 0x0b, 0x21, 0x00, 0xd3, 0x09, 0xc8, 0x19, 0xe1, 0x13, 0x19, 0x19, 0xc8, + 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0xb1, 0x0b, 0x22, 0x0f, 0xe4, 0x00, 0x30, + 0x09, 0xa1, 0x0f, 0xd5, 0x00, 0x30, 0x1f, 0x39, 0x03, 0xe4, 0x09, 0xa1, + 0x0f, 0xc4, 0x01, 0xb2, 0x0b, 0x14, 0x09, 0x80, 0x0f, 0xc4, 0x01, 0xb3, + 0x0b, 0x21, 0x00, 0x19, 0x10, 0x59, 0x09, 0xc0, 0x09, 0xc8, 0x09, 0xa1, + 0x0f, 0xc4, 0x01, 0xb4, 0x0b, 0x14, 0x09, 0x80, 0x0f, 0xc4, 0x01, 0xb5, + 0x0b, 0x21, 0x00, 0x19, 0x10, 0x59, 0x09, 0xc0, 0x09, 0xc9, 0x0c, 0x61, + 0x03, 0x17, 0x1f, 0x39, 0x0c, 0x17, 0x1f, 0xf9, 0x0d, 0xf5, 0x0f, 0xc4, + 0x01, 0xb6, 0x00, 0x40, 0x0f, 0x39, 0x00, 0xe2, 0x0c, 0x24, 0x09, 0xa1, + 0x09, 0xa7, 0x09, 0x99, 0x09, 0xc9, 0x0f, 0xc4, 0x01, 0xa4, 0x0b, 0x19, + 0x09, 0xe4, 0x09, 0x80, 0x08, 0x84, 0x09, 0x80, 0x0f, 0xc4, 0x01, 0xad, + 0x0b, 0x21, 0x0c, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x03, 0x12, 0x0f, 0x38, + 0x19, 0xc0, 0x0f, 0xf1, 0x05, 0x0f, 0x00, 0x04, 0x0f, 0x00, 0x05, 0x84, + 0x0f, 0xc2, 0x08, 0x00, 0x0a, 0x42, 0x0f, 0xf1, 0x05, 0x10, 0x0f, 0xf6, + 0x02, 0x99, 0x00, 0x02, 0x05, 0x21, 0x0a, 0x51, 0x01, 0x36, 0x09, 0xc8, + 0x0f, 0xc4, 0x00, 0xe6, 0x00, 0x37, 0x05, 0x84, 0x0b, 0xaa, 0x0b, 0xab, + 0x0f, 0xee, 0x01, 0xc0, 0x0b, 0xa7, 0x09, 0xa6, 0x09, 0x89, 0x0c, 0x21, + 0x0f, 0xd7, 0x1f, 0xff, 0x0f, 0xd0, 0x1f, 0xfd, 0x1f, 0xd9, 0x1f, 0xfd, + 0x10, 0x09, 0x09, 0xe1, 0x0f, 0xd7, 0x1f, 0xf4, 0x1f, 0xe1, 0x1f, 0xf5, + 0x0f, 0xd9, 0x0a, 0x80, 0x09, 0xee, 0x0e, 0x48, 0x0c, 0x2a, 0x00, 0x2b, + 0x0f, 0xee, 0x01, 0xc0, 0x03, 0x61, 0x0c, 0x57, 0x1c, 0x61, 0x0f, 0xd9, + 0x0a, 0x00, 0x09, 0xee, 0x0f, 0xc4, 0x01, 0x46, 0x0b, 0xa1, 0x0e, 0x18, + 0x09, 0xca, 0x0b, 0xa1, 0x0e, 0x53, 0x09, 0xcb, 0x10, 0x21, 0x1c, 0x98, + 0x19, 0xca, 0x1c, 0xd1, 0x19, 0xcb, 0x0f, 0xc4, 0x01, 0x48, 0x0c, 0xa1, + 0x0b, 0x98, 0x0c, 0xe1, 0x0b, 0x93, 0x1f, 0xf9, 0x0e, 0xd6, 0x0f, 0xc4, + 0x01, 0x46, 0x0e, 0x02, 0x0e, 0x42, 0x0f, 0xf6, 0x00, 0x47, 0x01, 0x8b, + 0x1f, 0xf9, 0x0e, 0xd5, 0x0f, 0xf0, 0x05, 0x04, 0x0c, 0x32, 0x0f, 0xf0, + 0x05, 0x05, 0x07, 0x36, 0x0c, 0x72, 0x1f, 0xf9, 0x0e, 0xc2, 0x0f, 0xf6, + 0x00, 0x42, 0x01, 0xcb, 0x1f, 0xf0, 0x05, 0x0a, 0x1c, 0x32, 0x1f, 0xf0, + 0x05, 0x0b, 0x0f, 0xf8, 0x0e, 0xd5, 0x1c, 0x72, 0x0f, 0xf6, 0x00, 0x42, + 0x01, 0xcb, 0x0f, 0xc4, 0x00, 0x50, 0x0a, 0x85, 0x1f, 0xf0, 0x05, 0x0a, + 0x1b, 0xb2, 0x1f, 0xf0, 0x05, 0x0b, 0x1b, 0xb2, 0x0f, 0xc4, 0x00, 0x52, + 0x01, 0x3e, 0x0f, 0xf7, 0x00, 0x2d, 0x0c, 0x03, 0x0c, 0x43, 0x00, 0x3f, + 0x00, 0x04, 0x0b, 0x39, 0x0f, 0x39, 0x0f, 0xc8, 0x00, 0x80, 0x0f, 0xf7, + 0x05, 0x5c, 0x0f, 0xf1, 0x03, 0x2d, 0x0f, 0xc4, 0x01, 0xc2, 0x0a, 0x40, + 0x0f, 0xf0, 0x04, 0x00, 0x00, 0x72, 0x0f, 0xf0, 0x05, 0x11, 0x00, 0x72, + 0x0f, 0xf1, 0x0a, 0x1f, 0x03, 0xe2, 0x00, 0x61, 0x0f, 0xc4, 0x01, 0xc0, + 0x0a, 0x64, 0x09, 0x80, 0x0f, 0xc4, 0x05, 0x46, 0x09, 0x99, 0x09, 0xc0, + 0x0f, 0xc4, 0x05, 0x47, 0x00, 0x00, 0x02, 0xba, 0x00, 0x08, 0x0f, 0xf7, + 0x0a, 0xc2, 0x0f, 0xf7, 0x0b, 0xb6, 0x0f, 0xfb, 0x0f, 0x73, 0x09, 0x36, + 0x00, 0x48, 0x0f, 0xf6, 0x05, 0x5c, 0x00, 0x48, 0x0f, 0xf1, 0x03, 0x2d, + 0x0f, 0xc4, 0x01, 0xc3, 0x0a, 0x40, 0x0f, 0xc4, 0x06, 0x94, 0x0f, 0xc5, + 0x01, 0x4a, 0x0b, 0xa1, 0x0b, 0xe0, 0x0f, 0xf0, 0x03, 0x2a, 0x09, 0xf2, + 0x0b, 0xa1, 0x0b, 0xd9, 0x0f, 0xf0, 0x03, 0x29, 0x09, 0xf2, 0x0f, 0xf6, + 0x05, 0x5c, 0x00, 0x48, 0x0f, 0xc4, 0x06, 0x94, 0x0f, 0xf0, 0x03, 0x2a, + 0x0b, 0xb2, 0x0f, 0xf0, 0x03, 0x29, 0x0b, 0xb2, 0x0f, 0xf0, 0x05, 0x11, + 0x00, 0x32, 0x0f, 0xf0, 0x04, 0x00, 0x00, 0x32, 0x0f, 0xf6, 0x05, 0x5c, + 0x00, 0x48, 0x0f, 0xf0, 0x0a, 0x07, 0x04, 0x32, 0x0f, 0xc4, 0x04, 0xc8, + 0x0b, 0x21, 0x00, 0x92, 0x1f, 0xf9, 0x0f, 0x3b, 0x04, 0x04, 0x0f, 0xc0, + 0x00, 0x32, 0x09, 0x04, 0x0f, 0xf8, 0x0f, 0x42, 0x00, 0x80, 0x04, 0x04, + 0x0f, 0xc0, 0x00, 0x47, 0x0f, 0xfb, 0x16, 0x6c, 0x09, 0x04, 0x00, 0x00, + 0x08, 0xc4, 0x02, 0xc0, 0x0f, 0xc8, 0x00, 0x41, 0x0f, 0xf7, 0x05, 0x23, + 0x0f, 0xc4, 0x01, 0xaf, 0x00, 0x00, 0x0f, 0xc4, 0x05, 0x86, 0x00, 0x00, + 0x02, 0x36, 0x04, 0xc4, 0x0f, 0xc4, 0x05, 0x6e, 0x00, 0x37, 0x0f, 0xc4, + 0x06, 0x96, 0x02, 0x37, 0x0f, 0xc4, 0x05, 0x71, 0x00, 0x37, 0x0f, 0xf7, + 0x0b, 0xdb, 0x0f, 0xf7, 0x05, 0xb9, 0x0f, 0xc4, 0x01, 0x71, 0x0b, 0x21, + 0x00, 0x15, 0x0f, 0xc4, 0x01, 0xc3, 0x0b, 0x21, 0x0f, 0xc4, 0x01, 0xc2, + 0x0b, 0x11, 0x09, 0xe1, 0x00, 0xd9, 0x10, 0xd9, 0x0f, 0xc4, 0x01, 0xc4, + 0x09, 0xc0, 0x0f, 0xfa, 0x0e, 0x43, 0x09, 0xc8, 0x07, 0xba, 0x01, 0x88, + 0x0f, 0x39, 0x0f, 0xfb, 0x10, 0x36, 0x0f, 0xc4, 0x01, 0x07, 0x0f, 0xc5, + 0x01, 0x04, 0x0b, 0x83, 0x0b, 0x83, 0x0f, 0xfa, 0x10, 0xa4, 0x0b, 0x83, + 0x0f, 0xfb, 0x10, 0x36, 0x0f, 0xc4, 0x05, 0x49, 0x0b, 0x08, 0x0f, 0xe1, + 0x07, 0x55, 0x0c, 0x17, 0x1f, 0xf9, 0x0f, 0x8f, 0x00, 0x21, 0x0c, 0x18, + 0x09, 0xc8, 0x00, 0x11, 0x0f, 0xf8, 0x0f, 0x94, 0x09, 0xc9, 0x00, 0x09, + 0x0f, 0xe1, 0x08, 0x00, 0x0c, 0x11, 0x09, 0xc8, 0x00, 0xb7, 0x0f, 0xc4, + 0x01, 0x0a, 0x02, 0xb7, 0x07, 0x04, 0x0f, 0xc2, 0x0a, 0xab, 0x0f, 0xc2, + 0x0a, 0xaa, 0x0f, 0xc2, 0x07, 0xfe, 0x0f, 0xf7, 0x02, 0x70, 0x04, 0x44, + 0x00, 0x08, 0x03, 0x61, 0x0b, 0x14, 0x01, 0x36, 0x10, 0x88, 0x0f, 0xc4, + 0x00, 0xf5, 0x00, 0x37, 0x01, 0x08, 0x00, 0xb6, 0x00, 0x09, 0x0f, 0xc4, + 0x00, 0xf5, 0x0f, 0xf7, 0x02, 0x93, 0x03, 0xb7, 0x0f, 0xc4, 0x01, 0x4a, + 0x0c, 0x02, 0x00, 0xb6, 0x0c, 0x42, 0x05, 0x37, 0x04, 0x37, 0x03, 0x37, + 0x00, 0x08, 0x00, 0xb6, 0x00, 0x09, 0x05, 0x37, 0x04, 0x37, 0x0f, 0xc4, + 0x00, 0xf8, 0x00, 0x37, 0x03, 0xb7, 0x0f, 0xc4, 0x01, 0x63, 0x03, 0x36, + 0x0c, 0x00, 0x00, 0xb7, 0x05, 0x37, 0x04, 0x37, 0x0f, 0xc4, 0x06, 0xae, + 0x00, 0x37, 0x0f, 0xc4, 0x05, 0x74, 0x00, 0x37, 0x0f, 0xc4, 0x00, 0xf8, + 0x02, 0x37, 0x04, 0x44, 0x02, 0xc8, 0x02, 0xe1, 0x0b, 0x14, 0x01, 0x36, + 0x13, 0x48, 0x03, 0xb7, 0x0f, 0xc4, 0x01, 0x34, 0x0c, 0x02, 0x0f, 0xfa, + 0x0c, 0xf8, 0x0c, 0x42, 0x0f, 0x39, 0x0f, 0xf0, 0x05, 0x16, 0x0c, 0x32, + 0x0f, 0xc4, 0x01, 0x4c, 0x0c, 0x00, 0x0f, 0xf0, 0x05, 0x18, 0x0f, 0x38, + 0x0c, 0x32, 0x0f, 0xf0, 0x05, 0x32, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x33, + 0x0f, 0x38, 0x00, 0x32, 0x0f, 0xf1, 0x05, 0x12, 0x0f, 0xc4, 0x01, 0x4c, + 0x0c, 0x21, 0x0b, 0x15, 0x1f, 0xfb, 0x0f, 0xe1, 0x1f, 0xf1, 0x05, 0x12, + 0x0a, 0x49, 0x0f, 0xf1, 0x05, 0x13, 0x0f, 0xc4, 0x01, 0x4c, 0x00, 0x61, + 0x0b, 0x19, 0x09, 0xc0, 0x0f, 0x38, 0x0a, 0x48, 0x0f, 0xfb, 0x0f, 0xf2, + 0x0c, 0x2a, 0x0c, 0x6b, 0x0f, 0xee, 0x02, 0x40, 0x03, 0xe2, 0x0c, 0x24, + 0x0f, 0xee, 0x0a, 0x7e, 0x09, 0x8a, 0x0f, 0xe2, 0x0f, 0xfc, 0x0c, 0x64, + 0x09, 0x89, 0x0e, 0x24, 0x09, 0x88, 0x00, 0x2a, 0x00, 0x2c, 0x0c, 0x0b, + 0x00, 0x21, 0x0c, 0x16, 0x19, 0xcb, 0x0c, 0xeb, 0x0c, 0xed, 0x0f, 0xee, + 0x0c, 0x80, 0x0f, 0xc4, 0x01, 0x0d, 0x0c, 0x02, 0x0c, 0x42, 0x0c, 0x56, + 0x19, 0xc9, 0x0c, 0x6b, 0x0c, 0x6d, 0x0f, 0xee, 0x0c, 0xc0, 0x0c, 0x82, + 0x0c, 0xa7, 0x09, 0xa1, 0x05, 0x84, 0x0f, 0xee, 0x0a, 0xd3, 0x0e, 0x02, + 0x0e, 0x42, 0x0e, 0x99, 0x0f, 0x38, 0x09, 0xc2, 0x04, 0x44, 0x0b, 0x21, + 0x03, 0x54, 0x1f, 0xf9, 0x10, 0x54, 0x0f, 0xc4, 0x05, 0x49, 0x0b, 0x08, + 0x0f, 0xfa, 0x0f, 0xe1, 0x00, 0x09, 0x0f, 0xfb, 0x10, 0x06, 0x0f, 0xc4, + 0x01, 0x07, 0x00, 0x37, 0x0f, 0xc4, 0x00, 0xfe, 0x00, 0x37, 0x0f, 0xc4, + 0x00, 0xfb, 0x01, 0xb7, 0x0f, 0xc4, 0x01, 0x01, 0x01, 0xb7, 0x0f, 0xc4, + 0x01, 0x0a, 0x01, 0xb7, 0x0f, 0xf9, 0x0f, 0xeb, 0x0f, 0xc4, 0x05, 0x49, + 0x0b, 0x21, 0x00, 0x51, 0x09, 0xc8, 0x00, 0x09, 0x00, 0x04, 0x0c, 0x00, + 0x0f, 0xfb, 0x0f, 0xe1, 0x0f, 0xfb, 0x10, 0x06, 0x0f, 0xf7, 0x04, 0x66, + 0x03, 0x37, 0x0f, 0xc4, 0x00, 0xfb, 0x00, 0x37, 0x0f, 0xfb, 0x10, 0x99, + 0x0f, 0xfb, 0x10, 0x06, 0x05, 0x37, 0x0f, 0xc4, 0x00, 0xfe, 0x00, 0x37, + 0x06, 0x37, 0x03, 0x37, 0x0f, 0xfb, 0x10, 0x99, 0x0f, 0xfb, 0x10, 0x06, + 0x0f, 0xf7, 0x04, 0x66, 0x05, 0x37, 0x0f, 0xc4, 0x01, 0x01, 0x00, 0x37, + 0x06, 0x37, 0x0f, 0xc4, 0x01, 0x07, 0x00, 0x37, 0x0f, 0xf7, 0x04, 0x72, + 0x0f, 0xf7, 0x04, 0x6f, 0x04, 0x37, 0x0f, 0xc4, 0x01, 0x07, 0x0f, 0xf7, + 0x02, 0x81, 0x07, 0x04, 0x0f, 0xc2, 0x05, 0x3b, 0x0f, 0xc2, 0x08, 0x8c, + 0x0f, 0xf6, 0x02, 0x70, 0x00, 0x02, 0x0f, 0xc4, 0x01, 0x0a, 0x00, 0x37, + 0x0f, 0xc4, 0x00, 0xfe, 0x0f, 0xc5, 0x01, 0x07, 0x04, 0xb7, 0x0f, 0xf9, + 0x0f, 0xeb, 0x00, 0x04, 0x00, 0x61, 0x0f, 0xe2, 0x07, 0xff, 0x0b, 0x19, + 0x09, 0xe4, 0x09, 0x88, 0x0c, 0x00, 0x0f, 0x38, 0x00, 0x09, 0x0f, 0x39, + 0x01, 0x84, 0x0f, 0xc0, 0x07, 0xf8, 0x0f, 0xc4, 0x01, 0x04, 0x02, 0x37, + 0x00, 0x21, 0x0f, 0xc4, 0x07, 0x26, 0x0b, 0x11, 0x01, 0x36, 0x09, 0xc8, + 0x0f, 0xc4, 0x01, 0x10, 0x00, 0x37, 0x00, 0x36, 0x00, 0x44, 0x0f, 0xc4, + 0x05, 0x48, 0x0b, 0x08, 0x01, 0xc4, 0x0c, 0x00, 0x01, 0x44, 0x0c, 0x00, + 0x00, 0x04, 0x00, 0x40, 0x0c, 0x21, 0x01, 0x19, 0x09, 0xe2, 0x0f, 0xe4, + 0x07, 0xff, 0x09, 0x88, 0x00, 0x09, 0x01, 0x04, 0x0f, 0xfa, 0x0f, 0xe1, + 0x0c, 0x00, 0x0f, 0xc4, 0x04, 0xc8, 0x00, 0x00, 0x0f, 0xc4, 0x04, 0xc9, + 0x00, 0x00, 0x0f, 0xc4, 0x04, 0xca, 0x00, 0x00, 0x0f, 0xfb, 0x10, 0x06, + 0x03, 0x37, 0x0f, 0xc4, 0x01, 0x10, 0x05, 0xb7, 0x0f, 0xfb, 0x00, 0x58, + 0x1f, 0xf9, 0x10, 0xe7, 0x00, 0x04, 0x0b, 0x21, 0x00, 0x14, 0x1f, 0xf9, + 0x10, 0xe3, 0x0f, 0xfb, 0x11, 0x1b, 0x01, 0xb6, 0x00, 0x44, 0x0f, 0xf9, + 0x10, 0xfc, 0x05, 0xb6, 0x00, 0x44, 0x0f, 0xfb, 0x00, 0x58, 0x1f, 0xf9, + 0x10, 0xf4, 0x00, 0x04, 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xfb, 0x11, 0x1b, + 0x0f, 0xf9, 0x10, 0xf9, 0x01, 0x04, 0x01, 0x45, 0x0b, 0x01, 0x00, 0x04, + 0x00, 0x40, 0x0f, 0xf6, 0x00, 0xaf, 0x00, 0x44, 0x01, 0x84, 0x0b, 0x21, + 0x00, 0x54, 0x1f, 0xf8, 0x11, 0x0d, 0x09, 0xc0, 0x01, 0x04, 0x00, 0x61, + 0x0f, 0xe2, 0x07, 0xff, 0x0b, 0x19, 0x09, 0xe4, 0x09, 0x88, 0x0c, 0x00, + 0x0f, 0xf8, 0x10, 0xd2, 0x00, 0x09, 0x0f, 0xfb, 0x0f, 0xeb, 0x0f, 0xc4, + 0x04, 0xca, 0x0b, 0x21, 0x0f, 0xd9, 0x04, 0xb8, 0x09, 0xc4, 0x0f, 0xc5, + 0x05, 0x49, 0x0f, 0xfa, 0x12, 0x20, 0x0b, 0x01, 0x0f, 0x39, 0x01, 0x44, + 0x01, 0xc5, 0x0b, 0x0f, 0x0d, 0xc1, 0x00, 0x04, 0x00, 0x00, 0x0f, 0xc4, + 0x04, 0xc8, 0x0b, 0x21, 0x04, 0x12, 0x1f, 0x39, 0x0f, 0xd9, 0x04, 0xb8, + 0x09, 0xc5, 0x0d, 0xc1, 0x00, 0x59, 0x09, 0xc0, 0x00, 0x14, 0x1f, 0x38, + 0x09, 0xce, 0x0f, 0xc4, 0x04, 0xb8, 0x0d, 0xe1, 0x0b, 0x13, 0x19, 0xe1, + 0x1f, 0xd9, 0x08, 0x00, 0x09, 0xe1, 0x0f, 0xd2, 0x02, 0x00, 0x1f, 0x39, + 0x0f, 0xc4, 0x04, 0xc9, 0x0d, 0x80, 0x0f, 0xc4, 0x04, 0xca, 0x0f, 0x38, + 0x0d, 0x80, 0x0f, 0xc4, 0x04, 0xc9, 0x0b, 0x08, 0x0c, 0x21, 0x0f, 0xc5, + 0x04, 0xca, 0x0b, 0x49, 0x0c, 0x54, 0x1f, 0x39, 0x0c, 0x40, 0x0c, 0x53, + 0x0f, 0xe1, 0x04, 0xb8, 0x0c, 0x19, 0x09, 0xc4, 0x0b, 0x0a, 0x0c, 0x59, + 0x09, 0xc4, 0x0b, 0x0b, 0x0c, 0xa1, 0x1c, 0xe1, 0x0c, 0xd1, 0x1c, 0x91, + 0x09, 0xcc, 0x09, 0xe1, 0x0f, 0xd2, 0x08, 0x00, 0x19, 0xcc, 0x00, 0x0d, + 0x0c, 0x21, 0x0c, 0x53, 0x10, 0x21, 0x1d, 0x11, 0x19, 0xcc, 0x1f, 0xcd, + 0x0f, 0xff, 0x0f, 0xc4, 0x04, 0xcb, 0x0d, 0x00, 0x0d, 0x08, 0x00, 0xb6, + 0x0d, 0x49, 0x07, 0x04, 0x0f, 0xc2, 0x0a, 0xab, 0x0f, 0xc2, 0x0a, 0xaa, + 0x0f, 0xc2, 0x07, 0xfe, 0x0f, 0xf7, 0x02, 0x70, 0x07, 0xb7, 0x11, 0x36, + 0x10, 0x88, 0x03, 0xb7, 0x0f, 0xc4, 0x01, 0x4e, 0x0c, 0x02, 0x0c, 0x42, + 0x0f, 0xc4, 0x06, 0x94, 0x0b, 0x8a, 0x0b, 0x8b, 0x0f, 0xc4, 0x01, 0x50, + 0x0c, 0x82, 0x0c, 0xc2, 0x0c, 0xa1, 0x0c, 0x20, 0x09, 0xc8, 0x0c, 0xe1, + 0x0c, 0x59, 0x0f, 0xf6, 0x09, 0x24, 0x09, 0xc9, 0x04, 0x04, 0x0f, 0xc0, + 0x00, 0x46, 0x0f, 0xc4, 0x06, 0x01, 0x0f, 0xf6, 0x05, 0xb9, 0x00, 0x40, + 0x0f, 0x39, 0x0f, 0xc4, 0x01, 0x50, 0x0b, 0x88, 0x0f, 0xf6, 0x09, 0x24, + 0x0b, 0x89, 0x0f, 0xf6, 0x05, 0x5c, 0x00, 0x48, 0x09, 0x04, 0x00, 0xa1, + 0x0b, 0x16, 0x04, 0x04, 0x0f, 0xc0, 0x00, 0x32, 0x1f, 0xc0, 0x00, 0x47, + 0x1f, 0xfb, 0x16, 0x6c, 0x07, 0x37, 0x02, 0xc8, 0x12, 0xc8, 0x08, 0xc4, + 0x0c, 0x00, 0x0f, 0xc8, 0x00, 0x41, 0x0f, 0xf7, 0x05, 0x23, 0x0f, 0xfa, + 0x0e, 0x43, 0x00, 0x88, 0x0f, 0xc4, 0x06, 0x01, 0x0f, 0xf4, 0x05, 0xb9, + 0x04, 0x00, 0x00, 0x21, 0x0f, 0xc4, 0x06, 0xfe, 0x0b, 0x15, 0x1f, 0xf9, + 0x11, 0xdb, 0x0f, 0xc4, 0x01, 0xb7, 0x0b, 0x15, 0x1f, 0xf9, 0x11, 0xdb, + 0x0f, 0xc4, 0x01, 0xc5, 0x0f, 0xc0, 0x00, 0x47, 0x0f, 0xc4, 0x05, 0xe8, + 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xf9, 0x11, 0xe2, 0x0f, 0xc4, 0x01, 0xc6, + 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x0f, 0xd2, 0x00, 0x46, 0x11, 0x38, + 0x11, 0x88, 0x0f, 0xc8, 0x00, 0x47, 0x08, 0xbb, 0x0f, 0x39, 0x04, 0x04, + 0x0f, 0xc0, 0x00, 0x32, 0x0f, 0xc8, 0x00, 0x3c, 0x08, 0xbb, 0x0f, 0x39, + 0x04, 0x3b, 0x0f, 0xf7, 0x0c, 0x13, 0x0f, 0xf7, 0x0c, 0x97, 0x0f, 0xc4, + 0x01, 0x70, 0x0b, 0x21, 0x0f, 0xc4, 0x06, 0xff, 0x0b, 0x12, 0x1f, 0xf9, + 0x12, 0x07, 0x0f, 0xc4, 0x01, 0xc5, 0x0b, 0x21, 0x0f, 0xd5, 0x00, 0x47, + 0x1f, 0xf9, 0x12, 0x07, 0x0f, 0xfb, 0x16, 0x8b, 0x09, 0x3b, 0x0f, 0xfb, + 0x0c, 0xf8, 0x0f, 0xfb, 0x13, 0xae, 0x04, 0x04, 0x0f, 0xc5, 0x01, 0xc5, + 0x0b, 0x01, 0x0f, 0xc0, 0x00, 0x47, 0x0f, 0xf7, 0x05, 0x9d, 0x0f, 0xf9, + 0x11, 0xe2, 0x07, 0xb7, 0x1f, 0xf6, 0x05, 0x5c, 0x10, 0x48, 0x09, 0x3b, + 0x0f, 0xe1, 0x00, 0x47, 0x04, 0x04, 0x0b, 0x15, 0x19, 0x45, 0x1f, 0xc4, + 0x00, 0x80, 0x1f, 0xf7, 0x00, 0xa4, 0x0f, 0xc4, 0x01, 0xc5, 0x0b, 0x15, + 0x19, 0x45, 0x1f, 0xc4, 0x00, 0x80, 0x1f, 0xf7, 0x00, 0xa4, 0x0f, 0xfb, + 0x12, 0x46, 0x0f, 0x39, 0x09, 0x04, 0x00, 0x00, 0x0f, 0xc4, 0x04, 0xc9, + 0x0f, 0xc5, 0x04, 0xce, 0x0b, 0x01, 0x0f, 0xc5, 0x04, 0xcf, 0x0b, 0x01, + 0x0f, 0xc5, 0x04, 0xcc, 0x00, 0x01, 0x0f, 0xc5, 0x04, 0xcd, 0x00, 0x01, + 0x0f, 0xc5, 0x04, 0xd0, 0x00, 0x41, 0x0f, 0xc5, 0x04, 0xd5, 0x00, 0x01, + 0x0f, 0xc5, 0x04, 0xd1, 0x0b, 0x01, 0x02, 0x36, 0x09, 0x44, 0x0f, 0xc8, + 0x1f, 0xfc, 0x01, 0x37, 0x0f, 0xc4, 0x04, 0xd2, 0x00, 0x37, 0x0f, 0xfb, + 0x16, 0x2f, 0x0f, 0xfb, 0x16, 0x6c, 0x0f, 0x39, 0x0f, 0xc4, 0x00, 0x80, + 0x02, 0x37, 0x0f, 0xc4, 0x04, 0xc9, 0x0b, 0x21, 0x0b, 0x27, 0x09, 0x99, + 0x09, 0xe1, 0x0f, 0xd9, 0x04, 0xd6, 0x00, 0x36, 0x09, 0xc4, 0x0f, 0xc4, + 0x04, 0xd2, 0x0f, 0xf7, 0x00, 0xbd, 0x0f, 0xc4, 0x00, 0x80, 0x05, 0xb7, + 0x0f, 0xfb, 0x00, 0x58, 0x0f, 0xc4, 0x04, 0xd0, 0x0b, 0x0c, 0x1f, 0xf8, + 0x12, 0x65, 0x00, 0x21, 0x0f, 0xf8, 0x12, 0x75, 0x0d, 0x15, 0x0f, 0xc4, + 0x04, 0xd2, 0x0f, 0xf7, 0x00, 0xb2, 0x0f, 0xc4, 0x04, 0xd1, 0x0f, 0xc5, + 0x04, 0xc9, 0x0b, 0x40, 0x0f, 0xc4, 0x04, 0xd5, 0x0b, 0x14, 0x1f, 0xf8, + 0x12, 0x7a, 0x10, 0x40, 0x0d, 0x14, 0x0f, 0xc5, 0x04, 0xcc, 0x1f, 0xc5, + 0x04, 0xcd, 0x00, 0x41, 0x0f, 0xc4, 0x04, 0xcc, 0x0b, 0x88, 0x0b, 0x89, + 0x0b, 0x8a, 0x0b, 0x8b, 0x00, 0x21, 0x0c, 0x15, 0x1f, 0xf9, 0x12, 0x8c, + 0x0c, 0xa1, 0x00, 0x51, 0x09, 0xca, 0x09, 0xe1, 0x0f, 0xd7, 0x1f, 0xff, + 0x10, 0x0a, 0x10, 0x48, 0x00, 0x21, 0x0c, 0x55, 0x1f, 0xf9, 0x12, 0x9a, + 0x0c, 0xe1, 0x00, 0x59, 0x09, 0xe1, 0x0f, 0xc4, 0x04, 0xc8, 0x0b, 0x12, + 0x00, 0x11, 0x10, 0x51, 0x09, 0xcb, 0x10, 0x49, 0x00, 0x21, 0x0d, 0x15, + 0x1f, 0xf9, 0x12, 0xa4, 0x0c, 0x0d, 0x0d, 0x55, 0x10, 0x4c, 0x0f, 0xf8, + 0x12, 0xa8, 0x1c, 0x4d, 0x0c, 0x4d, 0x0d, 0x55, 0x10, 0x0c, 0x1c, 0x0d, + 0x0f, 0xc4, 0x04, 0xcc, 0x0c, 0x02, 0x0c, 0x42, 0x0f, 0xc4, 0x04, 0xd0, + 0x0d, 0x00, 0x0d, 0x54, 0x1f, 0xf9, 0x12, 0xbf, 0x0f, 0xc4, 0x04, 0xca, + 0x0f, 0xc5, 0x04, 0xd1, 0x0b, 0x40, 0x04, 0x04, 0x0f, 0xc0, 0x00, 0x32, + 0x09, 0x04, 0x0f, 0xfa, 0x11, 0x41, 0x00, 0x80, 0x0f, 0x39, 0x0d, 0x15, + 0x0c, 0x8d, 0x0f, 0xc4, 0x04, 0xce, 0x1c, 0xcd, 0x1f, 0xc4, 0x04, 0xcf, + 0x0d, 0x40, 0x0f, 0xc4, 0x04, 0xca, 0x0f, 0xfa, 0x11, 0x41, 0x0d, 0x40, + 0x09, 0x04, 0x0f, 0x38, 0x00, 0x00, 0x07, 0x37, 0x0f, 0xf0, 0x0b, 0x08, + 0x0f, 0xf2, 0x00, 0x3f, 0x0f, 0xf0, 0x0b, 0x09, 0x0f, 0xf2, 0x0d, 0x59, + 0x1f, 0xf2, 0x07, 0x4d, 0x0f, 0xf0, 0x0b, 0x10, 0x0f, 0xf2, 0x00, 0x87, + 0x1f, 0xf2, 0x01, 0x47, 0x0f, 0xf0, 0x0b, 0x11, 0x0f, 0xf2, 0x03, 0x12, + 0x0f, 0xf0, 0x0b, 0x12, 0x0f, 0xf2, 0x06, 0x61, 0x0f, 0xf0, 0x0b, 0x13, + 0x0f, 0xf2, 0x0b, 0xbf, 0x0f, 0xc4, 0x06, 0xc9, 0x0f, 0xc2, 0x0c, 0xcd, + 0x0f, 0xc2, 0x07, 0xfe, 0x1f, 0xc4, 0x06, 0xc9, 0x1f, 0xc2, 0x0a, 0xe1, + 0x1f, 0xc2, 0x07, 0xfd, 0x0f, 0x39, 0x0f, 0xc4, 0x01, 0xd9, 0x08, 0x02, + 0x00, 0x02, 0x0f, 0xc2, 0x0b, 0xb5, 0x0f, 0xc2, 0x07, 0xf0, 0x00, 0x02, + 0x0f, 0xc2, 0x0b, 0xb4, 0x0f, 0xc2, 0x07, 0xf0, 0x00, 0x02, 0x0f, 0xc2, + 0x0a, 0x5b, 0x0f, 0xc2, 0x07, 0xff, 0x00, 0x02, 0x0f, 0xc2, 0x0d, 0xdf, + 0x0f, 0xc2, 0x07, 0xfa, 0x00, 0x02, 0x0f, 0xc2, 0x0a, 0x22, 0x00, 0x02, + 0x00, 0x02, 0x0f, 0xc2, 0x0a, 0x2f, 0x0f, 0xc2, 0x07, 0xf2, 0x00, 0x02, + 0x0f, 0xc2, 0x0b, 0x40, 0x0f, 0xc2, 0x07, 0xfa, 0x00, 0x02, 0x0f, 0xc2, + 0x0c, 0x52, 0x00, 0x02, 0x00, 0x02, 0x0f, 0xc2, 0x08, 0x00, 0x00, 0x42, + 0x00, 0x02, 0x0f, 0xc2, 0x0c, 0xb5, 0x0f, 0xc2, 0x07, 0xfb, 0x00, 0x02, + 0x0f, 0xc2, 0x0f, 0x98, 0x0f, 0xc2, 0x07, 0xfa, 0x00, 0x02, 0x0f, 0xc2, + 0x0b, 0x23, 0x0f, 0xc2, 0x07, 0xfa, 0x00, 0x02, 0x0f, 0xc2, 0x08, 0x40, + 0x0f, 0xc2, 0x07, 0xfa, 0x00, 0x02, 0x0f, 0xc2, 0x0d, 0x4e, 0x0f, 0xc2, + 0x07, 0xf9, 0x00, 0x02, 0x0f, 0xc2, 0x0d, 0xc5, 0x00, 0x02, 0x00, 0x02, + 0x0f, 0xc2, 0x09, 0x06, 0x00, 0x42, 0x07, 0xc4, 0x0a, 0x8f, 0x0f, 0xc2, + 0x04, 0xf3, 0x0f, 0xc2, 0x0b, 0x50, 0x00, 0x02, 0x0d, 0xc4, 0x08, 0x3a, + 0x0d, 0xc5, 0x0f, 0xc4, 0x06, 0xcb, 0x00, 0x37, 0x06, 0xb6, 0x0d, 0xc4, + 0x0f, 0xc4, 0x06, 0xce, 0x00, 0x37, 0x06, 0xb6, 0x0d, 0xc4, 0x0f, 0xc4, + 0x06, 0xd1, 0x00, 0x37, 0x06, 0xb6, 0x0d, 0xc4, 0x0f, 0xc4, 0x06, 0xd4, + 0x00, 0x37, 0x06, 0xb6, 0x0d, 0xc4, 0x0f, 0xc4, 0x06, 0xd7, 0x00, 0x37, + 0x0f, 0xc4, 0x06, 0xda, 0x00, 0x02, 0x0f, 0xc2, 0x0c, 0x00, 0x0f, 0x38, + 0x00, 0xc2, 0x0f, 0xf1, 0x0a, 0x36, 0x0f, 0xc5, 0x01, 0x52, 0x0f, 0xc4, + 0x01, 0xd9, 0x07, 0x36, 0x0b, 0x0a, 0x0a, 0x43, 0x0f, 0xf1, 0x0a, 0x37, + 0x1c, 0xa7, 0x19, 0xa7, 0x19, 0x8a, 0x0f, 0xc4, 0x01, 0xc9, 0x0c, 0x80, + 0x0f, 0xc4, 0x01, 0xc8, 0x0b, 0x0c, 0x0d, 0x21, 0x00, 0x59, 0x09, 0xcb, + 0x0a, 0x43, 0x0c, 0x97, 0x1c, 0xcc, 0x0f, 0xc5, 0x01, 0xc7, 0x00, 0x21, + 0x0b, 0x55, 0x00, 0x01, 0x10, 0x0c, 0x0f, 0xc5, 0x01, 0x6e, 0x0b, 0x55, + 0x00, 0x01, 0x1f, 0xc5, 0x01, 0xcb, 0x10, 0x41, 0x1f, 0xc5, 0x01, 0xcc, + 0x10, 0x01, 0x1f, 0xc5, 0x01, 0xc7, 0x10, 0x41, 0x1c, 0xa1, 0x10, 0x59, + 0x19, 0xcc, 0x0d, 0x00, 0x0d, 0x21, 0x0c, 0x92, 0x0f, 0xc4, 0x01, 0xca, + 0x0b, 0x22, 0x00, 0xe4, 0x09, 0xa2, 0x03, 0x25, 0x10, 0x25, 0x0f, 0xf0, + 0x0a, 0x2f, 0x09, 0xb2, 0x0f, 0x38, 0x09, 0x80, 0x0f, 0xc4, 0x01, 0xc8, + 0x0b, 0x21, 0x0f, 0xc4, 0x01, 0xc9, 0x0b, 0x16, 0x1f, 0xf9, 0x14, 0x13, + 0x0f, 0xc4, 0x01, 0xcb, 0x00, 0x00, 0x00, 0x15, 0x0f, 0xc5, 0x01, 0x52, + 0x1f, 0xf9, 0x13, 0xc2, 0x0f, 0xc4, 0x05, 0x0b, 0x0f, 0x38, 0x0b, 0xc0, + 0x0b, 0xc8, 0x0c, 0x2a, 0x00, 0x2b, 0x0c, 0x2c, 0x00, 0x2d, 0x0f, 0xee, + 0x0c, 0x80, 0x0f, 0xe1, 0x0a, 0x00, 0x0b, 0xc9, 0x0c, 0x59, 0x09, 0xe1, + 0x0c, 0x59, 0x09, 0xee, 0x0f, 0xce, 0x05, 0x06, 0x0d, 0x84, 0x0b, 0xaa, + 0x0b, 0xab, 0x0b, 0xac, 0x0b, 0xad, 0x0f, 0xef, 0x08, 0x40, 0x1f, 0xf9, + 0x13, 0xe9, 0x0d, 0x84, 0x0f, 0xee, 0x05, 0x00, 0x0e, 0x02, 0x0e, 0x42, + 0x0f, 0xee, 0x05, 0x40, 0x0e, 0x02, 0x0e, 0x42, 0x0f, 0xc4, 0x05, 0x0a, + 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x0f, 0xf1, 0x05, 0x0f, 0x0f, 0xee, + 0x03, 0x80, 0x0f, 0xe1, 0x09, 0xf8, 0x00, 0x2d, 0x0f, 0xcf, 0x05, 0x10, + 0x0a, 0x6c, 0x0d, 0xf1, 0x0f, 0xee, 0x02, 0x80, 0x0f, 0xce, 0x05, 0x0c, + 0x0d, 0x84, 0x0b, 0xaa, 0x0b, 0xab, 0x0b, 0xac, 0x0b, 0xad, 0x0a, 0x59, + 0x09, 0xee, 0x0f, 0xcd, 0x05, 0x00, 0x0f, 0xcc, 0x05, 0x40, 0x0f, 0xef, + 0x08, 0x40, 0x1f, 0x39, 0x0d, 0x84, 0x0d, 0x6e, 0x0e, 0x02, 0x0e, 0x42, + 0x0d, 0x2e, 0x0e, 0x02, 0x0e, 0x42, 0x0f, 0xc4, 0x05, 0x10, 0x0b, 0x21, + 0x00, 0x59, 0x0f, 0x38, 0x09, 0xc0, 0x0f, 0xc4, 0x01, 0xcb, 0x0b, 0x21, + 0x00, 0x15, 0x1f, 0x39, 0x00, 0x40, 0x0f, 0xc4, 0x01, 0xcc, 0x0b, 0x21, + 0x00, 0x59, 0x09, 0xc8, 0x09, 0xe1, 0x01, 0x17, 0x1c, 0x00, 0x00, 0x54, + 0x1f, 0xc8, 0x14, 0x26, 0x15, 0x3b, 0x0f, 0x39, 0x0f, 0xc4, 0x01, 0xcc, + 0x0b, 0x21, 0x00, 0x14, 0x1f, 0x39, 0x0f, 0xc4, 0x05, 0x06, 0x0f, 0xc5, + 0x05, 0x11, 0x0b, 0x03, 0x00, 0x02, 0x0b, 0x03, 0x00, 0x02, 0x0b, 0x03, + 0x00, 0x02, 0x0b, 0x03, 0x00, 0x02, 0x0f, 0xc4, 0x05, 0x0a, 0x0f, 0xc5, + 0x05, 0x15, 0x0b, 0x03, 0x00, 0x02, 0x0f, 0xc4, 0x05, 0x0b, 0x0f, 0xc5, + 0x05, 0x16, 0x0b, 0x03, 0x00, 0x02, 0x0f, 0xc4, 0x05, 0x0c, 0x0f, 0xc5, + 0x05, 0x17, 0x0b, 0x03, 0x00, 0x02, 0x0b, 0x03, 0x00, 0x02, 0x0b, 0x03, + 0x00, 0x02, 0x0b, 0x03, 0x00, 0x02, 0x0f, 0xc4, 0x05, 0x10, 0x0f, 0xc5, + 0x05, 0x1b, 0x0b, 0x03, 0x00, 0x02, 0x0f, 0xc4, 0x01, 0xc7, 0x00, 0x40, + 0x0f, 0xc4, 0x05, 0x11, 0x0b, 0xaa, 0x0b, 0xab, 0x0b, 0xac, 0x0b, 0xad, + 0x0f, 0xee, 0x03, 0x00, 0x0f, 0xee, 0x0a, 0xef, 0x0f, 0xee, 0x09, 0x00, + 0x07, 0xc4, 0x0f, 0xe2, 0x00, 0x3f, 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0xa4, + 0x09, 0x82, 0x0f, 0xf6, 0x00, 0xbd, 0x07, 0xc4, 0x0f, 0xc4, 0x05, 0x16, + 0x0b, 0x2a, 0x0b, 0x2c, 0x0f, 0xee, 0x0d, 0x40, 0x0e, 0x2a, 0x0e, 0x6b, + 0x0f, 0xc4, 0x05, 0x15, 0x0b, 0x2c, 0x00, 0x2d, 0x0f, 0xee, 0x0c, 0x80, + 0x0f, 0xee, 0x0a, 0xef, 0x0f, 0xee, 0x09, 0x00, 0x07, 0x04, 0x0f, 0xe2, + 0x00, 0x3f, 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0xa4, 0x0f, 0xf6, 0x02, 0x09, + 0x09, 0x82, 0x0f, 0xc4, 0x00, 0x7d, 0x00, 0x37, 0x0f, 0xc4, 0x01, 0xcc, + 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xc4, 0x01, 0x6f, 0x01, 0xba, 0x10, 0x40, + 0x0f, 0xc4, 0x00, 0x7d, 0x02, 0x37, 0x07, 0x37, 0x0f, 0xc4, 0x01, 0xda, + 0x1f, 0xc4, 0x01, 0xdd, 0x06, 0xb7, 0x0f, 0xc4, 0x01, 0x1c, 0x00, 0x37, + 0x0f, 0xf1, 0x0a, 0x07, 0x0f, 0xc4, 0x01, 0xe0, 0x06, 0xb7, 0x04, 0x21, + 0x0a, 0x54, 0x0f, 0xf1, 0x0a, 0x10, 0x1f, 0xf9, 0x14, 0xc6, 0x00, 0x2a, + 0x09, 0xeb, 0x0f, 0xee, 0x01, 0xc0, 0x0f, 0xee, 0x0a, 0xcb, 0x0f, 0xf7, + 0x04, 0x66, 0x05, 0x84, 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0x82, 0x0f, 0xc4, + 0x01, 0xe3, 0x06, 0xb7, 0x0f, 0xc4, 0x00, 0x9e, 0x0f, 0xf7, 0x02, 0x81, + 0x0f, 0xfb, 0x01, 0x1c, 0x0f, 0xf7, 0x04, 0x72, 0x0f, 0xf7, 0x02, 0x70, + 0x0f, 0xf9, 0x14, 0xd0, 0x07, 0xb7, 0x1f, 0xf9, 0x14, 0xd0, 0x0a, 0x61, + 0x00, 0x14, 0x1f, 0xf9, 0x14, 0xd0, 0x0f, 0xc4, 0x01, 0xe6, 0x06, 0xb7, + 0x0f, 0xc4, 0x01, 0x13, 0x00, 0x37, 0x0f, 0xc4, 0x01, 0x1c, 0x02, 0x37, + 0x0f, 0xfb, 0x01, 0x0c, 0x0f, 0xf7, 0x00, 0x8f, 0x0f, 0xc4, 0x01, 0x22, + 0x00, 0x37, 0x0f, 0xc4, 0x01, 0x22, 0x0f, 0xc5, 0x00, 0xa7, 0x08, 0x3b, + 0x03, 0xb7, 0x00, 0x21, 0x0c, 0x55, 0x1f, 0xc8, 0x0f, 0xff, 0x0f, 0xc4, + 0x01, 0x79, 0x01, 0xba, 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0x13, 0x02, 0x37, + 0x0f, 0xfb, 0x01, 0x0c, 0x0f, 0xf7, 0x00, 0x8f, 0x0f, 0xc4, 0x06, 0xdd, + 0x00, 0x37, 0x0f, 0xc4, 0x00, 0xa7, 0x06, 0xb7, 0x03, 0xb7, 0x00, 0x21, + 0x0c, 0x55, 0x1f, 0xc8, 0x0f, 0xff, 0x0f, 0xf0, 0x0f, 0x16, 0x0c, 0x32, + 0x0f, 0xc4, 0x01, 0x78, 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0x7f, 0x0c, 0x00, + 0x0f, 0xfa, 0x03, 0x00, 0x08, 0x08, 0x0f, 0xc4, 0x05, 0x17, 0x0b, 0xaa, + 0x0b, 0xab, 0x0b, 0xac, 0x0b, 0xad, 0x0f, 0xee, 0x03, 0x00, 0x0f, 0xee, + 0x0a, 0xef, 0x0f, 0xf1, 0x05, 0x04, 0x0a, 0x4f, 0x0f, 0xf1, 0x05, 0x05, + 0x0f, 0xee, 0x09, 0x00, 0x0f, 0xe2, 0x00, 0x3f, 0x02, 0x21, 0x07, 0xc4, + 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0xa4, 0x09, 0x99, 0x09, 0xc2, 0x0f, 0xc4, + 0x01, 0x54, 0x0d, 0xc2, 0x01, 0xba, 0x0a, 0x42, 0x0f, 0xf6, 0x00, 0xbd, + 0x07, 0xc4, 0x0f, 0xc4, 0x05, 0x1b, 0x00, 0x2a, 0x0b, 0x2b, 0x0f, 0xee, + 0x01, 0xc0, 0x0f, 0xee, 0x0a, 0xcb, 0x07, 0x04, 0x00, 0x02, 0x0e, 0x42, + 0x0f, 0xf6, 0x02, 0x09, 0x0e, 0x82, 0x0f, 0xc4, 0x01, 0x54, 0x0b, 0x8f, + 0x00, 0x21, 0x0d, 0xd5, 0x10, 0x2a, 0x1d, 0xeb, 0x1f, 0xee, 0x01, 0xc0, + 0x1f, 0xe1, 0x0b, 0x02, 0x1b, 0x99, 0x19, 0xee, 0x17, 0x04, 0x1e, 0x02, + 0x1e, 0x42, 0x1e, 0xa2, 0x1f, 0xe4, 0x07, 0xff, 0x1f, 0xf6, 0x02, 0x70, + 0x19, 0x82, 0x0f, 0xc4, 0x01, 0xe9, 0x06, 0xb7, 0x07, 0x37, 0x11, 0x36, + 0x10, 0x88, 0x0f, 0xc4, 0x01, 0x1f, 0x00, 0x37, 0x01, 0xbb, 0x0f, 0xc4, + 0x06, 0xc7, 0x0b, 0x21, 0x00, 0x15, 0x1f, 0xf9, 0x15, 0x68, 0x0f, 0xc4, + 0x01, 0x1f, 0x02, 0x37, 0x0f, 0xfb, 0x01, 0x14, 0x0f, 0xc4, 0x06, 0xe0, + 0x0f, 0xf9, 0x15, 0x72, 0x0f, 0xc4, 0x06, 0xe0, 0x0f, 0xc5, 0x00, 0xa1, + 0x0f, 0xf7, 0x02, 0x7d, 0x0f, 0xfb, 0x01, 0x1c, 0x0f, 0xc4, 0x01, 0x1f, + 0x00, 0x37, 0x0f, 0xc4, 0x01, 0x1f, 0x02, 0x37, 0x0f, 0xc4, 0x01, 0xec, + 0x06, 0xb7, 0x0f, 0xc4, 0x01, 0x16, 0x00, 0x37, 0x0f, 0xc4, 0x01, 0x6c, + 0x0b, 0x22, 0x0f, 0xe4, 0x00, 0x38, 0x09, 0xa1, 0x0f, 0xc4, 0x01, 0xf5, + 0x02, 0x14, 0x1f, 0xc4, 0x01, 0xf8, 0x04, 0x14, 0x1f, 0xc4, 0x01, 0xfb, + 0x06, 0x14, 0x1f, 0xc4, 0x01, 0xfe, 0x08, 0x14, 0x1f, 0xc4, 0x02, 0x01, + 0x0f, 0xe4, 0x0c, 0x00, 0x09, 0xa1, 0x0f, 0xc5, 0x06, 0x2b, 0x0f, 0xd4, + 0x04, 0x00, 0x1f, 0xc5, 0x02, 0x04, 0x00, 0x14, 0x1f, 0xc5, 0x02, 0x07, + 0x08, 0x3b, 0x0f, 0xc4, 0x01, 0x7e, 0x0b, 0x21, 0x00, 0x15, 0x11, 0x36, + 0x10, 0x88, 0x0f, 0xc4, 0x01, 0x25, 0x00, 0x37, 0x0f, 0xc4, 0x01, 0x16, + 0x06, 0xb7, 0x0f, 0xc4, 0x01, 0x16, 0x06, 0xb7, 0x07, 0x37, 0x0f, 0xc4, + 0x01, 0xef, 0x1f, 0xc4, 0x01, 0xf2, 0x06, 0xb7, 0x0f, 0xc4, 0x01, 0x19, + 0x00, 0x37, 0x01, 0xbb, 0x0f, 0xc4, 0x01, 0xcd, 0x0f, 0xc0, 0x06, 0xc8, + 0x0f, 0xc4, 0x01, 0xce, 0x0f, 0xc0, 0x05, 0x1c, 0x04, 0xbb, 0x04, 0xbb, + 0x04, 0xbb, 0x04, 0xbb, 0x04, 0xbb, 0x04, 0xbb, 0x01, 0xbb, 0x04, 0xbb, + 0x0f, 0xc4, 0x05, 0x1c, 0x0f, 0xc8, 0x0a, 0x24, 0x00, 0x61, 0x01, 0xfe, + 0x0f, 0xfd, 0x15, 0xd2, 0x00, 0x3f, 0x0c, 0x30, 0x0b, 0xb2, 0x0c, 0x19, + 0x09, 0xc8, 0x0f, 0xc4, 0x01, 0xcc, 0x0b, 0x21, 0x00, 0x14, 0x1f, 0x39, + 0x00, 0x54, 0x1f, 0x38, 0x09, 0xc0, 0x01, 0xbb, 0x0f, 0xf8, 0x14, 0x26, + 0x0f, 0xc4, 0x01, 0xcd, 0x0b, 0x05, 0x0b, 0xc8, 0x0b, 0xc9, 0x0b, 0xca, + 0x0a, 0xc0, 0x05, 0x84, 0x0c, 0x02, 0x0c, 0x42, 0x0c, 0x82, 0x0f, 0xc4, + 0x01, 0x19, 0x06, 0xb7, 0x0f, 0xc4, 0x01, 0x80, 0x0b, 0x21, 0x00, 0x15, + 0x1f, 0xf9, 0x16, 0x0c, 0x05, 0x84, 0x0b, 0xaa, 0x0b, 0xab, 0x0f, 0xee, + 0x01, 0xc0, 0x0f, 0xee, 0x0a, 0x7a, 0x0b, 0xa7, 0x09, 0xa6, 0x09, 0xa1, + 0x01, 0x51, 0x09, 0xc8, 0x01, 0x16, 0x1f, 0xf9, 0x16, 0x24, 0x0c, 0x21, + 0x0f, 0xd7, 0x1f, 0xfa, 0x1f, 0xe1, 0x1f, 0xfa, 0x0f, 0xd9, 0x0a, 0x80, + 0x09, 0xee, 0x0f, 0xf8, 0x16, 0x24, 0x00, 0x08, 0x05, 0x84, 0x0b, 0xaa, + 0x0b, 0xab, 0x0f, 0xee, 0x01, 0xc0, 0x0f, 0xee, 0x0a, 0x7b, 0x0b, 0xa7, + 0x09, 0xa6, 0x09, 0xa1, 0x01, 0x91, 0x09, 0xc8, 0x01, 0x56, 0x1f, 0xf9, + 0x16, 0x24, 0x0c, 0x21, 0x0f, 0xd7, 0x1f, 0xf9, 0x1f, 0xe1, 0x1f, 0xf9, + 0x0f, 0xd9, 0x0a, 0x80, 0x09, 0xee, 0x00, 0x08, 0x0f, 0xf6, 0x00, 0x26, + 0x0c, 0x27, 0x09, 0xa2, 0x0e, 0x65, 0x0f, 0xc4, 0x01, 0xce, 0x0b, 0x05, + 0x09, 0x83, 0x0f, 0x38, 0x0a, 0xc0, 0x0f, 0xc4, 0x01, 0xcf, 0x00, 0x00, + 0x02, 0x04, 0x0f, 0xc2, 0x00, 0x28, 0x0f, 0xc2, 0x00, 0x29, 0x0f, 0xc2, + 0x00, 0x2b, 0x0f, 0xc2, 0x00, 0x2d, 0x0f, 0xc2, 0x00, 0x2f, 0x0f, 0xc2, + 0x00, 0x33, 0x0f, 0xc2, 0x00, 0x37, 0x0f, 0xc2, 0x00, 0x3b, 0x0f, 0xc4, + 0x00, 0x28, 0x0f, 0xc2, 0x00, 0x88, 0x0f, 0xc2, 0x00, 0x3d, 0x0f, 0xc2, + 0x00, 0xb6, 0x0f, 0xc2, 0x00, 0x56, 0x0f, 0xc2, 0x00, 0xac, 0x0f, 0xc2, + 0x00, 0x6b, 0x0f, 0xc2, 0x00, 0xa0, 0x07, 0x82, 0x0f, 0xc2, 0x00, 0x59, + 0x0f, 0xc2, 0x00, 0x94, 0x0f, 0xc2, 0x00, 0xcf, 0x0f, 0xc2, 0x00, 0x32, + 0x0f, 0xc2, 0x00, 0x63, 0x0f, 0xc2, 0x00, 0x95, 0x0f, 0xc2, 0x00, 0xc6, + 0x0f, 0xc2, 0x00, 0x4a, 0x0f, 0xc2, 0x00, 0x6f, 0x0f, 0xc2, 0x00, 0x94, + 0x0f, 0xc2, 0x00, 0xb9, 0x0f, 0x38, 0x00, 0x02, 0x0f, 0xc4, 0x01, 0x70, + 0x00, 0x00, 0x0f, 0xc4, 0x00, 0x6c, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x0f, 0x38, 0x00, 0x02, 0x00, 0x21, 0x0c, 0x16, 0x19, 0xc8, 0x0d, 0x09, + 0x0c, 0x84, 0x0c, 0xfe, 0x0f, 0xfd, 0x16, 0x86, 0x0b, 0xa1, 0x0c, 0x17, + 0x09, 0xce, 0x10, 0x21, 0x1d, 0x91, 0x19, 0xce, 0x0c, 0x61, 0x0d, 0x96, + 0x1d, 0x89, 0x0c, 0x6a, 0x0c, 0x6c, 0x0f, 0x38, 0x0d, 0x6e, 0x0f, 0xc4, + 0x05, 0xeb, 0x0b, 0x08, 0x0f, 0xc4, 0x05, 0xea, 0x0b, 0x09, 0x00, 0x0a, + 0x0c, 0x61, 0x00, 0x14, 0x1f, 0xf9, 0x16, 0xaa, 0x00, 0x55, 0x1f, 0xf9, + 0x16, 0xa1, 0x00, 0x4a, 0x0c, 0x21, 0x00, 0x94, 0x10, 0x8a, 0x00, 0xd4, + 0x0f, 0xf8, 0x16, 0xaa, 0x10, 0xca, 0x00, 0x55, 0x1f, 0xf9, 0x16, 0xaa, + 0x01, 0x0a, 0x0c, 0x21, 0x00, 0x94, 0x11, 0x4a, 0x00, 0xd4, 0x11, 0x8a, + 0x0f, 0xc4, 0x01, 0xcf, 0x0c, 0x80, 0x0f, 0xf0, 0x0a, 0x0d, 0x00, 0x32, + 0x0f, 0xf6, 0x05, 0x5c, 0x01, 0x08, 0x0f, 0xc4, 0x00, 0x6c, 0x0b, 0xaa, + 0x0b, 0xab, 0x0b, 0xac, 0x0b, 0xad, 0x0f, 0xee, 0x03, 0x00, 0x0f, 0xc5, + 0x01, 0xcf, 0x0b, 0x61, 0x02, 0x19, 0x09, 0xc5, 0x0b, 0xca, 0x0b, 0xe1, + 0x0c, 0x91, 0x09, 0xcb, 0x0f, 0xcc, 0x07, 0xff, 0x0f, 0xcd, 0x0c, 0xc0, + 0x00, 0x2b, 0x00, 0x2d, 0x0f, 0xf1, 0x03, 0x39, 0x0f, 0xce, 0x00, 0xc2, + 0x0f, 0xcf, 0x07, 0x68, 0x07, 0x37, 0x1f, 0xce, 0x00, 0x41, 0x1f, 0xcf, + 0x01, 0xe9, 0x0a, 0x61, 0x0f, 0xf1, 0x03, 0x39, 0x0d, 0x93, 0x1f, 0xf9, + 0x16, 0xd5, 0x0f, 0xf1, 0x0a, 0x22, 0x0a, 0x48, 0x0f, 0xf1, 0x0a, 0x23, + 0x0f, 0xfb, 0x16, 0x76, 0x0a, 0x48, 0x0f, 0xf1, 0x0a, 0x22, 0x0f, 0xfb, + 0x16, 0x76, 0x0a, 0x48, 0x0f, 0xf1, 0x03, 0x39, 0x0f, 0xc4, 0x01, 0x70, + 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x0f, 0xc4, 0x06, 0xff, + 0x0b, 0x12, 0x1f, 0xf9, 0x17, 0x04, 0x0a, 0x61, 0x0d, 0xd3, 0x1f, 0xf9, + 0x16, 0xde, 0x0f, 0xc4, 0x00, 0x6c, 0x0f, 0xee, 0x05, 0x00, 0x0e, 0x02, + 0x0e, 0x42, 0x0f, 0xee, 0x05, 0x40, 0x0e, 0x02, 0x0f, 0x38, 0x0e, 0x42, + 0x0f, 0xee, 0x0a, 0xef, 0x0f, 0xe2, 0x00, 0x3f, 0x0f, 0xe1, 0x1f, 0xf6, + 0x0f, 0xc4, 0x00, 0x80, 0x0f, 0xee, 0x09, 0x00, 0x0e, 0x02, 0x0e, 0x42, + 0x0e, 0xa4, 0x09, 0x99, 0x09, 0xe2, 0x0f, 0xe4, 0x07, 0xff, 0x0f, 0x38, + 0x09, 0x82, 0x0f, 0xfb, 0x17, 0x68, 0x0f, 0xfb, 0x0c, 0x26, 0x0f, 0xfb, + 0x0c, 0xf8, 0x0f, 0xf7, 0x0d, 0xa3, 0x0f, 0xfb, 0x18, 0x62, 0x0f, 0xfb, + 0x1f, 0x0b, 0x0f, 0xfb, 0x13, 0xae, 0x0f, 0xf7, 0x05, 0x92, 0x0f, 0xf6, + 0x05, 0x8d, 0x02, 0x48, 0x1f, 0xf9, 0x17, 0x33, 0x0f, 0xc4, 0x01, 0x69, + 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x0f, 0xfb, 0x1a, 0xa8, 0x0f, 0xf6, + 0x05, 0x8d, 0x02, 0x88, 0x1f, 0xf9, 0x17, 0x45, 0x00, 0x61, 0x0f, 0xc4, + 0x01, 0x67, 0x0b, 0x19, 0x09, 0xc0, 0x0f, 0xc4, 0x01, 0x66, 0x0b, 0x19, + 0x09, 0xc0, 0x02, 0xba, 0x00, 0x48, 0x0f, 0xf9, 0x17, 0x47, 0x02, 0xba, + 0x00, 0x08, 0x0f, 0xf6, 0x05, 0x8d, 0x02, 0xc8, 0x1f, 0xf9, 0x17, 0x54, + 0x0f, 0xc4, 0x01, 0x68, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x0f, 0xc4, + 0x07, 0xbf, 0x00, 0x40, 0x0f, 0xc8, 0x0e, 0x00, 0x0f, 0xf7, 0x05, 0x94, + 0x0f, 0xfb, 0x03, 0x96, 0x0f, 0xc4, 0x01, 0x6c, 0x0f, 0xf1, 0x0c, 0x06, + 0x0a, 0x40, 0x0f, 0xfb, 0x1a, 0xcf, 0x0f, 0xfb, 0x03, 0xdd, 0x0f, 0xfb, + 0x18, 0xd3, 0x0f, 0xfb, 0x19, 0x16, 0x0f, 0x39, 0x0f, 0xc4, 0x06, 0x92, + 0x0b, 0x22, 0x0f, 0xe4, 0x0d, 0xff, 0x09, 0x80, 0x07, 0x64, 0x09, 0xa2, + 0x0f, 0xe5, 0x1f, 0xe2, 0x09, 0xa2, 0x04, 0x84, 0x0b, 0x24, 0x09, 0x80, + 0x04, 0x84, 0x0b, 0x21, 0x01, 0x1e, 0x1f, 0xf9, 0x17, 0x87, 0x0f, 0xc4, + 0x06, 0xa7, 0x02, 0x37, 0x0f, 0xc4, 0x06, 0xae, 0x00, 0x37, 0x0f, 0xc4, + 0x07, 0x5a, 0x06, 0xb7, 0x0f, 0xc4, 0x00, 0x77, 0x00, 0x37, 0x04, 0x84, + 0x0b, 0x21, 0x00, 0xde, 0x1f, 0xf9, 0x17, 0x9b, 0x0f, 0xc4, 0x06, 0xaa, + 0x02, 0x37, 0x0f, 0xc4, 0x07, 0x0b, 0x02, 0xb7, 0x0f, 0xc4, 0x00, 0x7a, + 0x00, 0x37, 0x0f, 0xc4, 0x07, 0x57, 0x06, 0xb7, 0x0f, 0xc4, 0x00, 0x74, + 0x00, 0x37, 0x04, 0x84, 0x0b, 0x21, 0x00, 0x9e, 0x1f, 0xf9, 0x17, 0xb5, + 0x00, 0x21, 0x01, 0x9f, 0x09, 0xe1, 0x01, 0xdf, 0x09, 0xe2, 0x0b, 0x25, + 0x09, 0x80, 0x0f, 0xc4, 0x06, 0xa4, 0x02, 0x37, 0x0f, 0xc4, 0x00, 0x77, + 0x02, 0xb7, 0x0f, 0xc4, 0x07, 0x67, 0x02, 0xb7, 0x0f, 0xc4, 0x06, 0x96, + 0x00, 0x37, 0x0f, 0xf7, 0x0d, 0x69, 0x04, 0x84, 0x0b, 0x21, 0x00, 0x1e, + 0x1f, 0xf9, 0x17, 0xef, 0x00, 0x21, 0x01, 0x9f, 0x09, 0xe2, 0x0b, 0x25, + 0x09, 0x80, 0x0f, 0xc4, 0x01, 0x5c, 0x0b, 0x21, 0x03, 0x95, 0x1f, 0xf9, + 0x17, 0xd3, 0x04, 0xc4, 0x0f, 0xc5, 0x06, 0x9f, 0x0f, 0xf7, 0x02, 0x74, + 0x03, 0x37, 0x03, 0xb7, 0x00, 0xb7, 0x05, 0x37, 0x04, 0x37, 0x00, 0x36, + 0x04, 0xc4, 0x0f, 0xf9, 0x17, 0xef, 0x0f, 0xc4, 0x01, 0x44, 0x0b, 0x88, + 0x00, 0xb6, 0x0b, 0x89, 0x0f, 0xc8, 0x1f, 0xf4, 0x01, 0x37, 0x0f, 0xc4, + 0x00, 0x86, 0x00, 0x37, 0x0f, 0xc4, 0x07, 0x08, 0x06, 0xb7, 0x0f, 0xc4, + 0x00, 0x89, 0x00, 0x37, 0x0f, 0xc4, 0x06, 0x9f, 0x02, 0xb7, 0x0f, 0xc4, + 0x00, 0x74, 0x02, 0xb7, 0x0f, 0xc4, 0x07, 0x64, 0x02, 0xb7, 0x00, 0x36, + 0x04, 0xc4, 0x04, 0x84, 0x0b, 0x21, 0x00, 0x5e, 0x1f, 0xf9, 0x18, 0x0c, + 0x00, 0x21, 0x01, 0x9f, 0x09, 0xe2, 0x0b, 0x25, 0x09, 0x80, 0x00, 0x21, + 0x0f, 0xc4, 0x06, 0xa2, 0x0b, 0x88, 0x06, 0xba, 0x0b, 0x89, 0x10, 0x21, + 0x1c, 0x18, 0x19, 0xc8, 0x1c, 0x51, 0x19, 0xc9, 0x0f, 0xc4, 0x06, 0x8f, + 0x0b, 0x21, 0x0c, 0x20, 0x09, 0xc2, 0x0b, 0x21, 0x0c, 0x59, 0x09, 0xc2, + 0x04, 0x84, 0x0b, 0x21, 0x01, 0x9e, 0x1f, 0xf9, 0x18, 0x33, 0x0f, 0xc4, + 0x06, 0x8f, 0x0b, 0x88, 0x00, 0xb6, 0x0b, 0x89, 0x06, 0xbb, 0x1f, 0xf7, + 0x00, 0x8f, 0x02, 0xb6, 0x04, 0xc4, 0x0f, 0xc4, 0x00, 0x92, 0x00, 0x37, + 0x0f, 0xc4, 0x06, 0x9c, 0x06, 0xb7, 0x03, 0xb7, 0x06, 0xbb, 0x0f, 0xe1, + 0x04, 0x00, 0x1f, 0xe1, 0x0c, 0x00, 0x0c, 0x59, 0x09, 0xc9, 0x0f, 0xc4, + 0x01, 0x30, 0x0c, 0x02, 0x0c, 0x42, 0x0f, 0xf0, 0x03, 0x0a, 0x0c, 0x32, + 0x0f, 0xf0, 0x03, 0x09, 0x0c, 0x72, 0x04, 0x84, 0x0b, 0x21, 0x01, 0xde, + 0x1f, 0xf9, 0x18, 0x4e, 0x0f, 0xc4, 0x06, 0x96, 0x02, 0x37, 0x01, 0x36, + 0x06, 0x08, 0x03, 0xb7, 0x0f, 0xc4, 0x01, 0x32, 0x0c, 0x02, 0x0c, 0x42, + 0x0c, 0x61, 0x02, 0xdf, 0x11, 0x3a, 0x12, 0x08, 0x1f, 0xf9, 0x18, 0x50, + 0x0f, 0xf0, 0x03, 0x1a, 0x0c, 0x32, 0x0f, 0xf0, 0x03, 0x19, 0x0c, 0x72, + 0x04, 0x84, 0x00, 0x00, 0x0f, 0x39, 0x0f, 0xf1, 0x03, 0x3a, 0x0f, 0xc4, + 0x07, 0xe2, 0x0a, 0x48, 0x0c, 0x00, 0x0f, 0xc4, 0x07, 0xe3, 0x0c, 0x00, + 0x0f, 0xf1, 0x03, 0x03, 0x0f, 0xc4, 0x07, 0xe4, 0x0f, 0xc2, 0x08, 0x00, + 0x0f, 0x38, 0x0a, 0x42, 0x0f, 0xc4, 0x07, 0xe1, 0x00, 0x21, 0x0b, 0x14, + 0x1f, 0xf9, 0x18, 0xd2, 0x0f, 0xc4, 0x07, 0xea, 0x0b, 0x15, 0x0f, 0xc8, + 0x03, 0x03, 0x1f, 0xc8, 0x03, 0x06, 0x0c, 0x31, 0x0f, 0xc4, 0x07, 0xe5, + 0x0a, 0x40, 0x0f, 0xf1, 0x03, 0x3a, 0x0f, 0xc4, 0x07, 0xe2, 0x0a, 0x48, + 0x0c, 0x00, 0x0f, 0xc4, 0x07, 0xe3, 0x0c, 0x00, 0x0f, 0xc4, 0x07, 0xe1, + 0x0b, 0x09, 0x0c, 0x61, 0x0c, 0x13, 0x1c, 0x21, 0x1c, 0x51, 0x09, 0xe1, + 0x0f, 0xc4, 0x07, 0xf1, 0x0b, 0x13, 0x1f, 0xf9, 0x18, 0xd2, 0x0c, 0x61, + 0x0c, 0x12, 0x0f, 0xcb, 0x18, 0xa4, 0x1f, 0xcb, 0x18, 0xb2, 0x09, 0xca, + 0x00, 0x21, 0x0c, 0x91, 0x19, 0xd1, 0x09, 0xe1, 0x0f, 0xc4, 0x07, 0xf2, + 0x0b, 0x16, 0x0f, 0xc4, 0x07, 0xe6, 0x1f, 0xc4, 0x07, 0xe8, 0x0b, 0x88, + 0x0b, 0x89, 0x0f, 0xc4, 0x07, 0xf0, 0x0b, 0x21, 0x0f, 0xc4, 0x07, 0xe4, + 0x0c, 0xf8, 0x00, 0x15, 0x1f, 0xf9, 0x18, 0xb4, 0x0b, 0xa1, 0x0c, 0x18, + 0x09, 0xc8, 0x0b, 0xa1, 0x0c, 0x51, 0x09, 0xc9, 0x00, 0x21, 0x0c, 0x56, + 0x10, 0x08, 0x0f, 0xf8, 0x18, 0xc1, 0x10, 0x09, 0x1f, 0xf9, 0x18, 0xa6, + 0x0b, 0xa1, 0x0c, 0x20, 0x09, 0xc8, 0x0b, 0xa1, 0x0c, 0x59, 0x09, 0xc9, + 0x0c, 0x61, 0x0f, 0xd6, 0x00, 0xff, 0x1f, 0xc8, 0x0f, 0xff, 0x1f, 0xc9, + 0x00, 0xff, 0x0f, 0xc4, 0x07, 0xe4, 0x0c, 0x02, 0x0c, 0x42, 0x00, 0x21, + 0x0f, 0xc4, 0x07, 0xea, 0x0b, 0x14, 0x1f, 0xf0, 0x03, 0x03, 0x1c, 0x72, + 0x0f, 0xc4, 0x07, 0xeb, 0x0b, 0x14, 0x1f, 0xf0, 0x03, 0x06, 0x1c, 0x72, + 0x0f, 0x39, 0x0f, 0xc5, 0x01, 0x65, 0x0f, 0xc4, 0x01, 0x81, 0x0b, 0x21, + 0x00, 0x14, 0x1f, 0x38, 0x10, 0x01, 0x0f, 0xc4, 0x07, 0x6c, 0x0b, 0x21, + 0x00, 0x14, 0x09, 0xcb, 0x1f, 0x38, 0x10, 0x01, 0x0f, 0xc4, 0x07, 0x6a, + 0x0b, 0x08, 0x0f, 0xc4, 0x07, 0x6b, 0x0b, 0x09, 0x0c, 0x21, 0x0c, 0x59, + 0x09, 0xc9, 0x0f, 0xc4, 0x01, 0x65, 0x0f, 0xc5, 0x01, 0x66, 0x0b, 0x21, + 0x00, 0x59, 0x09, 0xc0, 0x0c, 0x14, 0x1f, 0x38, 0x10, 0x01, 0x0c, 0x55, + 0x1f, 0x39, 0x0c, 0x00, 0x0b, 0x61, 0x0c, 0xd6, 0x1f, 0x39, 0x01, 0x38, + 0x01, 0xc8, 0x0b, 0x21, 0x0f, 0xd9, 0x00, 0x48, 0x09, 0xc5, 0x00, 0x59, + 0x09, 0xc0, 0x09, 0xe1, 0x02, 0x12, 0x0f, 0x38, 0x10, 0x00, 0x0f, 0xc4, + 0x01, 0xd2, 0x0b, 0x21, 0x02, 0x13, 0x1f, 0xf9, 0x19, 0x0e, 0x0f, 0x39, + 0x00, 0x59, 0x09, 0xc0, 0x0f, 0xc4, 0x01, 0xd0, 0x0f, 0xfb, 0x18, 0xfd, + 0x0f, 0x38, 0x0c, 0x01, 0x0f, 0xf1, 0x03, 0x39, 0x0f, 0xc4, 0x01, 0x6a, + 0x00, 0x00, 0x0f, 0xc4, 0x01, 0x6b, 0x0a, 0x40, 0x0f, 0xc4, 0x01, 0xd2, + 0x0b, 0x21, 0x00, 0x17, 0x1f, 0x38, 0x10, 0x00, 0x00, 0x51, 0x09, 0xc0, + 0x0f, 0xc4, 0x01, 0xd1, 0x0f, 0xfb, 0x18, 0xfd, 0x0b, 0x48, 0x0f, 0xc4, + 0x01, 0x6a, 0x0c, 0x38, 0x0c, 0x00, 0x05, 0x38, 0x0f, 0x08, 0x0d, 0x30, + 0x0d, 0x21, 0x00, 0x59, 0x09, 0xcc, 0x0d, 0x61, 0x0c, 0xa0, 0x09, 0xea, + 0x00, 0x21, 0x0c, 0xd9, 0x09, 0xeb, 0x0f, 0xee, 0x01, 0xc0, 0x1f, 0xee, + 0x0a, 0x7e, 0x0c, 0x21, 0x0e, 0x20, 0x09, 0xce, 0x0c, 0x61, 0x0e, 0x59, + 0x09, 0xf2, 0x0d, 0x83, 0x09, 0xc3, 0x0d, 0x21, 0x00, 0x59, 0x0d, 0x30, + 0x0d, 0xb2, 0x0f, 0x38, 0x09, 0xcc, 0x0f, 0xc4, 0x07, 0x0e, 0x00, 0x02, + 0x00, 0x02, 0x0f, 0xc2, 0x01, 0x90, 0x00, 0x02, 0x0f, 0xc2, 0x00, 0x83, + 0x00, 0x42, 0x0f, 0xc2, 0x04, 0x07, 0x0f, 0x38, 0x00, 0x42, 0x0f, 0xc4, + 0x07, 0x0e, 0x0b, 0x8a, 0x0f, 0xfa, 0x19, 0x31, 0x0b, 0x8b, 0x0b, 0x8a, + 0x0f, 0xfa, 0x19, 0x31, 0x0b, 0x8b, 0x0b, 0x8a, 0x0f, 0xfa, 0x19, 0x31, + 0x0b, 0x8b, 0x0b, 0x8a, 0x0f, 0xf8, 0x19, 0x31, 0x0b, 0x8b, 0x0f, 0xc5, + 0x04, 0xa8, 0x07, 0x37, 0x0f, 0xcc, 0x05, 0x38, 0x0f, 0xcd, 0x02, 0xb0, + 0x0f, 0xfb, 0x19, 0x5b, 0x0f, 0xcc, 0x0a, 0x38, 0x0f, 0xfa, 0x19, 0x5b, + 0x00, 0x0d, 0x0f, 0xf0, 0x05, 0x2e, 0x00, 0xf2, 0x0f, 0xf1, 0x0a, 0x2e, + 0x0a, 0x62, 0x0f, 0xe5, 0x01, 0xc0, 0x0f, 0x38, 0x09, 0xb2, 0x00, 0x04, + 0x0c, 0x00, 0x0c, 0x21, 0x02, 0xdf, 0x1f, 0xf9, 0x19, 0x94, 0x0c, 0x27, + 0x0c, 0x21, 0x09, 0x99, 0x09, 0xc8, 0x0f, 0xfa, 0x19, 0x6d, 0x00, 0x09, + 0x0f, 0xf9, 0x19, 0xa1, 0x00, 0x21, 0x0c, 0x11, 0x09, 0xe7, 0x09, 0xe1, + 0x09, 0x99, 0x09, 0xc8, 0x00, 0x21, 0x0c, 0x11, 0x09, 0xc8, 0x0f, 0xc9, + 0x1f, 0xff, 0x0f, 0xfb, 0x19, 0x6d, 0x00, 0x04, 0x0f, 0x38, 0x0b, 0x08, + 0x0f, 0xf1, 0x0a, 0x33, 0x0f, 0xc4, 0x05, 0xe8, 0x0a, 0x48, 0x0c, 0x02, + 0x0f, 0xee, 0x0a, 0x7f, 0x0c, 0x2a, 0x00, 0x2b, 0x0f, 0xee, 0x02, 0x40, + 0x0f, 0xee, 0x0a, 0x01, 0x08, 0x36, 0x02, 0x08, 0x0f, 0xc4, 0x05, 0xe9, + 0x0b, 0x21, 0x00, 0x14, 0x1f, 0xc4, 0x01, 0x41, 0x1b, 0x22, 0x1f, 0xe4, + 0x0f, 0xef, 0x19, 0x80, 0x00, 0x1e, 0x0f, 0xc5, 0x01, 0x7d, 0x1f, 0x38, + 0x1c, 0x41, 0x00, 0x2b, 0x0c, 0x6a, 0x0f, 0xee, 0x01, 0xc0, 0x0f, 0xee, + 0x0a, 0x78, 0x0b, 0x6a, 0x0f, 0xee, 0x02, 0x40, 0x0f, 0xee, 0x0a, 0x08, + 0x0f, 0xc4, 0x01, 0x40, 0x04, 0x22, 0x0e, 0x02, 0x0e, 0x65, 0x0f, 0x38, + 0x09, 0x82, 0x0f, 0xc4, 0x05, 0xf3, 0x0f, 0xc2, 0x0f, 0x80, 0x0f, 0xc2, + 0x0f, 0xff, 0x0f, 0xc2, 0x07, 0xff, 0x00, 0x02, 0x0f, 0xc2, 0x0f, 0xc0, + 0x01, 0x82, 0x0f, 0xc4, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x82, 0x01, 0x82, + 0x03, 0x02, 0x07, 0x02, 0x0f, 0xc2, 0x00, 0x30, 0x0f, 0xc2, 0x00, 0x70, + 0x0f, 0xc2, 0x00, 0xf0, 0x0f, 0xc2, 0x01, 0xd0, 0x0f, 0xc2, 0x03, 0x50, + 0x0f, 0xc2, 0x07, 0x50, 0x0f, 0xc2, 0x0e, 0x50, 0x0f, 0x39, 0x0f, 0xc4, + 0x01, 0xd4, 0x0f, 0x00, 0x0f, 0xc4, 0x05, 0xf9, 0x02, 0x37, 0x0f, 0xc4, + 0x06, 0x34, 0x02, 0xb7, 0x0f, 0xc4, 0x05, 0xf6, 0x0f, 0xf7, 0x02, 0x85, + 0x0f, 0xf7, 0x01, 0x33, 0x0f, 0xc4, 0x01, 0xd3, 0x0c, 0x21, 0x00, 0x51, + 0x09, 0xc0, 0x09, 0xcf, 0x09, 0xe1, 0x0f, 0xd9, 0x00, 0x3c, 0x09, 0xc4, + 0x0b, 0x0d, 0x0f, 0xc4, 0x05, 0xf9, 0x0f, 0xc5, 0x01, 0x2b, 0x04, 0xb7, + 0x0f, 0xc4, 0x00, 0x70, 0x0d, 0x42, 0x0d, 0x82, 0x01, 0xba, 0x0d, 0xc2, + 0x0f, 0xc4, 0x00, 0x70, 0x0b, 0x8d, 0x0b, 0x8e, 0x0b, 0x8f, 0x0d, 0xe1, + 0x00, 0x2a, 0x00, 0x59, 0x09, 0xeb, 0x0f, 0xee, 0x01, 0xc0, 0x0f, 0xee, + 0x0a, 0xcb, 0x05, 0x84, 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0x82, 0x0f, 0xc4, + 0x01, 0x28, 0x00, 0x37, 0x0f, 0xc4, 0x05, 0xf9, 0x06, 0xb7, 0x0f, 0xf7, + 0x01, 0x33, 0x0c, 0x21, 0x0d, 0xe7, 0x09, 0x91, 0x09, 0xce, 0x0d, 0xa1, + 0x0f, 0xd2, 0x00, 0x80, 0x1f, 0xce, 0x00, 0x7f, 0x0d, 0xa1, 0x09, 0x99, + 0x00, 0x2a, 0x09, 0xeb, 0x0f, 0xee, 0x01, 0xc0, 0x0f, 0xee, 0x0a, 0xcb, + 0x05, 0x84, 0x0e, 0x02, 0x0e, 0x42, 0x0e, 0x82, 0x0f, 0xc4, 0x01, 0x28, + 0x0f, 0xf7, 0x02, 0x81, 0x0f, 0xc4, 0x05, 0xf9, 0x0f, 0xf7, 0x02, 0x93, + 0x0f, 0xf7, 0x02, 0x05, 0x02, 0xdf, 0x1f, 0xf9, 0x1a, 0x69, 0x0f, 0xc4, + 0x01, 0x2b, 0x0f, 0xf7, 0x02, 0x90, 0x0f, 0xf7, 0x02, 0x05, 0x1f, 0xf9, + 0x1a, 0x69, 0x06, 0x44, 0x0f, 0xc5, 0x01, 0x2b, 0x04, 0xb7, 0x0f, 0xc4, + 0x05, 0xfc, 0x0d, 0x80, 0x0f, 0xc4, 0x05, 0xfd, 0x0d, 0xc0, 0x0d, 0xe1, + 0x00, 0x53, 0x1f, 0xf9, 0x1a, 0x74, 0x09, 0xcf, 0x0d, 0x61, 0x0d, 0xdf, + 0x1f, 0xf9, 0x1a, 0x16, 0x0f, 0xf9, 0x1a, 0x69, 0x0f, 0xc4, 0x01, 0xd4, + 0x0b, 0x39, 0x0f, 0xc4, 0x05, 0xff, 0x0b, 0x0f, 0x0d, 0xe1, 0x00, 0x2b, + 0x0f, 0xea, 0x0c, 0xe5, 0x00, 0xd4, 0x1f, 0xea, 0x05, 0xac, 0x01, 0x14, + 0x1f, 0xea, 0x03, 0x44, 0x01, 0x94, 0x1f, 0xea, 0x01, 0x56, 0x02, 0x14, + 0x1f, 0xea, 0x00, 0x83, 0x0f, 0xc4, 0x05, 0xf0, 0x0b, 0x0e, 0x0d, 0xa1, + 0x00, 0x2c, 0x03, 0x2d, 0x00, 0x54, 0x11, 0xad, 0x00, 0x94, 0x11, 0x2d, + 0x0f, 0xee, 0x0c, 0x80, 0x00, 0xa1, 0x0f, 0xc4, 0x01, 0x73, 0x0e, 0x19, + 0x09, 0xc0, 0x0f, 0xc4, 0x01, 0x75, 0x00, 0x40, 0x0d, 0xa1, 0x00, 0x94, + 0x10, 0x00, 0x00, 0x54, 0x0d, 0xe1, 0x10, 0x96, 0x10, 0x00, 0x00, 0xd6, + 0x0f, 0x38, 0x10, 0x00, 0x0f, 0xc8, 0x1a, 0xab, 0x05, 0x39, 0x0f, 0xf7, + 0x0d, 0xf7, 0x0f, 0xfb, 0x19, 0xa4, 0x0f, 0xc4, 0x07, 0xba, 0x0f, 0xfb, + 0x02, 0xfd, 0x01, 0xbb, 0x0f, 0xf7, 0x0e, 0x2a, 0x01, 0xbb, 0x0f, 0xf7, + 0x0e, 0x7e, 0x01, 0xbb, 0x0f, 0xfb, 0x19, 0xf7, 0x01, 0xbb, 0x0f, 0xf7, + 0x0e, 0xff, 0x01, 0xbb, 0x0f, 0xfb, 0x1a, 0x77, 0x0f, 0xf6, 0x00, 0x42, + 0x02, 0x8b, 0x1f, 0xf7, 0x0f, 0x52, 0x0f, 0xc4, 0x06, 0x00, 0x0f, 0xf0, + 0x0a, 0x01, 0x0f, 0x38, 0x0b, 0x32, 0x0f, 0xff, 0x0f, 0x6b, 0x0f, 0xf1, + 0x0c, 0x0a, 0x0f, 0xc4, 0x01, 0x6d, 0x0a, 0x49, 0x0c, 0x61, 0x00, 0x1e, + 0x1f, 0xf8, 0x1b, 0x0b, 0x0c, 0x40, 0x0f, 0xf1, 0x0c, 0x07, 0x0f, 0xc4, + 0x01, 0x36, 0x0f, 0xc5, 0x07, 0x60, 0x00, 0x2b, 0x0a, 0x6a, 0x0f, 0xf1, + 0x0c, 0x08, 0x0f, 0xee, 0x01, 0xc0, 0x0f, 0xee, 0x0a, 0x06, 0x0e, 0x22, + 0x0a, 0x65, 0x09, 0x82, 0x0e, 0x42, 0x0f, 0xc4, 0x01, 0x56, 0x0b, 0x21, + 0x09, 0xa0, 0x09, 0xc2, 0x0b, 0x21, 0x0e, 0x59, 0x09, 0xc2, 0x0f, 0xc4, + 0x01, 0xd5, 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x0b, 0x53, + 0x1f, 0xf9, 0x1b, 0x0b, 0x0f, 0xc5, 0x01, 0x76, 0x0b, 0x01, 0x00, 0x00, + 0x0f, 0xc5, 0x01, 0x38, 0x0f, 0xc4, 0x01, 0x56, 0x0b, 0x03, 0x00, 0x02, + 0x0b, 0x03, 0x00, 0x02, 0x0f, 0xfa, 0x03, 0x00, 0x02, 0x08, 0x0c, 0x61, + 0x00, 0x5e, 0x1f, 0x39, 0x0f, 0xf1, 0x0c, 0x0c, 0x0f, 0xc4, 0x01, 0x5a, + 0x0b, 0x21, 0x0a, 0x60, 0x09, 0xc2, 0x0b, 0x21, 0x00, 0x19, 0x09, 0xc0, + 0x0f, 0xf1, 0x0c, 0x09, 0x0f, 0xc4, 0x01, 0x58, 0x0b, 0x21, 0x0f, 0xc5, + 0x07, 0x61, 0x0a, 0x48, 0x0c, 0x20, 0x09, 0xc2, 0x0b, 0x21, 0x00, 0x19, + 0x09, 0xc2, 0x0f, 0xc4, 0x01, 0x74, 0x0c, 0x00, 0x0f, 0xc4, 0x01, 0xd6, + 0x0b, 0x21, 0x00, 0x59, 0x09, 0xc0, 0x09, 0xe1, 0x0b, 0x53, 0x1f, 0x39, + 0x0f, 0xc5, 0x01, 0x77, 0x0b, 0x01, 0x00, 0x00, 0x0f, 0xc5, 0x01, 0x3a, + 0x0f, 0xc4, 0x01, 0x58, 0x0b, 0x03, 0x00, 0x02, 0x0b, 0x03, 0x00, 0x02, + 0x0f, 0xc5, 0x01, 0x3c, 0x0f, 0xc4, 0x01, 0x5a, 0x0b, 0x03, 0x00, 0x02, + 0x0b, 0x03, 0x00, 0x02, 0x0f, 0xf8, 0x03, 0x00, 0x04, 0x08, 0x0f, 0xf1, + 0x0f, 0x17, 0x0f, 0xe2, 0x0f, 0xf0, 0x0c, 0x21, 0x0a, 0x64, 0x09, 0x99, + 0x09, 0xf2, 0x00, 0x09, 0x0c, 0x22, 0x03, 0xe4, 0x09, 0xa1, 0x00, 0x94, + 0x11, 0x09, 0x00, 0x54, 0x10, 0x49, 0x01, 0x54, 0x10, 0x89, 0x0c, 0x61, + 0x00, 0x14, 0x1f, 0x39, 0x01, 0x14, 0x0f, 0xc4, 0x01, 0xd7, 0x0b, 0x21, + 0x10, 0x40, 0x10, 0x15, 0x1f, 0x39, 0x0f, 0xf8, 0x03, 0x00, 0x0c, 0x48, + 0x0f, 0x39, 0x00, 0x04, 0x0f, 0x00, 0x04, 0x04, 0x0b, 0x27, 0x09, 0xa7, + 0x09, 0xa7, 0x09, 0xa7, 0x09, 0xa2, 0x0c, 0x25, 0x0f, 0xc5, 0x07, 0x6e, + 0x09, 0x81, 0x07, 0xba, 0x04, 0x48, 0x0f, 0xc4, 0x07, 0x6d, 0x0b, 0x21, + 0x00, 0x15, 0x00, 0x48, 0x12, 0x08, 0x04, 0x04, 0x0c, 0x00, 0x00, 0x04, + 0x0b, 0x39, 0x00, 0x04, 0x0f, 0x00, 0x0f, 0xc4, 0x07, 0x80, 0x0f, 0xc8, + 0x08, 0x00, 0x0f, 0xf7, 0x00, 0x71, 0x0f, 0xf1, 0x0f, 0x14, 0x0f, 0xc4, + 0x07, 0xf4, 0x0a, 0x42, 0x0f, 0xf1, 0x0f, 0x15, 0x0a, 0x42, 0x0f, 0xf1, + 0x03, 0x0a, 0x0f, 0xc4, 0x07, 0xf6, 0x0a, 0x42, 0x0f, 0xf1, 0x03, 0x09, + 0x0a, 0x42, 0x0f, 0xf1, 0x03, 0x1a, 0x0f, 0xc4, 0x07, 0xf8, 0x0a, 0x42, + 0x0f, 0xf1, 0x03, 0x19, 0x0a, 0x42, 0x0f, 0xf1, 0x03, 0x38, 0x0f, 0xc4, + 0x07, 0xfa, 0x0a, 0x40, 0x0f, 0xf1, 0x03, 0x11, 0x0f, 0xc4, 0x07, 0xfb, + 0x0a, 0x40, 0x0f, 0xf1, 0x0c, 0x05, 0x0f, 0xc4, 0x07, 0xfc, 0x0a, 0x40, + 0x0f, 0xc4, 0x07, 0xfe, 0x0f, 0xc2, 0x07, 0x06, 0x0f, 0xc2, 0x00, 0x80, + 0x00, 0x04, 0x0b, 0x39, 0x0f, 0xc4, 0x07, 0xf3, 0x0f, 0x00, 0x0f, 0xc4, + 0x06, 0xc0, 0x0f, 0xc8, 0x07, 0x80, 0x0f, 0xf7, 0x00, 0x71, 0x0f, 0xf0, + 0x0f, 0x17, 0x00, 0x32, 0x0f, 0xf0, 0x02, 0x04, 0x00, 0x32, 0x0f, 0xfa, + 0x01, 0x92, 0x0e, 0xff, 0x0f, 0xc8, 0x08, 0x89, 0x0f, 0xc9, 0x08, 0x88, + 0x0f, 0xca, 0x07, 0xfc, 0x0f, 0xcb, 0x07, 0xfe, 0x0f, 0xc4, 0x06, 0xe3, + 0x0c, 0x02, 0x0c, 0x42, 0x0c, 0xc2, 0x0c, 0x02, 0x0c, 0x42, 0x0c, 0xc2, + 0x0f, 0xc2, 0x07, 0x0a, 0x0f, 0xc2, 0x0a, 0x3d, 0x0f, 0xc2, 0x07, 0xf6, + 0x0f, 0xc2, 0x03, 0x9c, 0x0f, 0xc2, 0x0c, 0x95, 0x0f, 0xc2, 0x07, 0xed, + 0x0c, 0x02, 0x0c, 0x42, 0x0c, 0x82, 0x0c, 0x02, 0x0c, 0x42, 0x0c, 0x82, + 0x0f, 0xc2, 0x07, 0x0a, 0x0f, 0xc2, 0x0a, 0x3d, 0x0f, 0xc2, 0x07, 0xf3, + 0x0f, 0xc2, 0x03, 0x9c, 0x0f, 0xc2, 0x0c, 0x95, 0x0f, 0xc2, 0x07, 0xea, + 0x0f, 0xc9, 0x08, 0x00, 0x0f, 0xca, 0x07, 0xfe, 0x0f, 0xc4, 0x07, 0x45, + 0x00, 0x02, 0x0f, 0xc2, 0x0c, 0x00, 0x0c, 0x82, 0x00, 0x02, 0x0c, 0x42, + 0x0c, 0x82, 0x0f, 0xc2, 0x0a, 0xab, 0x0f, 0xc2, 0x0a, 0xaa, 0x0f, 0xc2, + 0x07, 0xfd, 0x0f, 0xc2, 0x07, 0x0a, 0x0f, 0xc2, 0x0a, 0x3d, 0x0f, 0xc2, + 0x07, 0xf8, 0x0f, 0xc4, 0x07, 0x57, 0x00, 0x02, 0x0c, 0x42, 0x0f, 0xc2, + 0x07, 0xfa, 0x00, 0x02, 0x0c, 0x42, 0x0f, 0xc2, 0x07, 0xf0, 0x0f, 0xc4, + 0x07, 0x08, 0x0f, 0xc2, 0x09, 0x51, 0x0f, 0xc2, 0x09, 0xd4, 0x0f, 0xc2, + 0x07, 0xf5, 0x0f, 0xc4, 0x07, 0x0b, 0x00, 0x02, 0x0f, 0xc2, 0x08, 0x00, + 0x0f, 0xc2, 0x07, 0xfd, 0x0f, 0xc4, 0x07, 0x5d, 0x0f, 0xc0, 0x0d, 0xbf, + 0x0f, 0xc4, 0x07, 0xe1, 0x0f, 0xc0, 0x00, 0x50, 0x0f, 0xc4, 0x07, 0xe6, + 0x0f, 0xc2, 0x00, 0x40, 0x00, 0x02, 0x0f, 0xc2, 0x08, 0x00, 0x00, 0x02, + 0x0f, 0xc4, 0x07, 0xf0, 0x00, 0x02, 0x02, 0x02, 0x04, 0x02, 0x0f, 0xc4, + 0x07, 0x5e, 0x0f, 0xc2, 0x00, 0x64, 0x00, 0x02, 0x0f, 0xc4, 0x07, 0x26, + 0x02, 0x40, 0x0f, 0xf1, 0x03, 0x04, 0x0f, 0xc4, 0x07, 0x62, 0x02, 0x82, + 0x00, 0x02, 0x0f, 0xc4, 0x07, 0x6a, 0x0f, 0xc2, 0x0d, 0xac, 0x0f, 0xc2, + 0x00, 0x64, 0x0f, 0xc2, 0x00, 0x55, 0x0f, 0xc4, 0x07, 0x6d, 0x00, 0x00, + 0x0f, 0xc4, 0x07, 0xef, 0x02, 0x00, 0x0a, 0x72, 0x0f, 0xc4, 0x07, 0x70, + 0x0f, 0xc0, 0x0f, 0xff, 0x0f, 0xc4, 0x07, 0x72, 0x03, 0xc2, 0x0f, 0xc2, + 0x02, 0x80, 0x0f, 0xc2, 0x01, 0xe0, 0x02, 0x82, 0x0f, 0xc4, 0x06, 0xff, + 0x0f, 0xc2, 0x08, 0x00, 0x0f, 0xfb, 0x19, 0x4d, 0x0f, 0xf1, 0x0d, 0x00, + 0x0a, 0x61, 0x02, 0xde, 0x0f, 0xc4, 0x07, 0x22, 0x00, 0x40, 0x0f, 0xc4, + 0x07, 0x2b, 0x0f, 0xc2, 0x02, 0x6e, 0x0f, 0xc2, 0x08, 0x31, 0x0f, 0xc2, + 0x07, 0xf9, 0x0f, 0xc2, 0x0b, 0xa5, 0x0f, 0xc2, 0x0c, 0x49, 0x0f, 0xc2, + 0x07, 0xf7, 0x0f, 0xc2, 0x00, 0x38, 0x0f, 0xc2, 0x0e, 0xc3, 0x00, 0xc2, + 0x0f, 0xc2, 0x05, 0x0d, 0x0f, 0xc2, 0x0f, 0x5e, 0x00, 0x42, 0x02, 0x82, + 0x01, 0x82, 0x02, 0x02, 0x00, 0x42, 0x1f, 0xc4, 0x07, 0x5d, 0x1f, 0xe2, + 0x0e, 0xff, 0x1b, 0x24, 0x19, 0x80, 0x0f, 0xc4, 0x07, 0x60, 0x02, 0x00, + 0x12, 0x00, 0x0f, 0xc4, 0x07, 0x61, 0x01, 0x00, 0x0f, 0xf8, 0x1c, 0xa7, + 0x11, 0x00, 0x0f, 0xc4, 0x06, 0xfc, 0x00, 0x40, 0x0f, 0xc4, 0x07, 0xf3, + 0x0f, 0xf8, 0x1c, 0xa7, 0x00, 0x00, 0x0f, 0xc4, 0x07, 0xf3, 0x00, 0x21, + 0x0b, 0x14, 0x1f, 0x00, 0x0f, 0xc4, 0x07, 0xfd, 0x0b, 0x08, 0x00, 0x61, + 0x0c, 0x19, 0x09, 0xc0, 0x09, 0xe1, 0x00, 0x14, 0x10, 0x80, 0x0f, 0xfb, + 0x1e, 0xe0, 0x0f, 0xc4, 0x07, 0xf6, 0x0f, 0xf0, 0x03, 0x0a, 0x0b, 0xb2, + 0x0f, 0xf0, 0x03, 0x09, 0x0b, 0xb2, 0x0f, 0xc4, 0x07, 0xf8, 0x0b, 0x88, + 0x0b, 0x89, 0x0f, 0xf0, 0x03, 0x1a, 0x0c, 0x32, 0x0f, 0xf0, 0x03, 0x19, + 0x0c, 0x72, 0x0f, 0xc4, 0x07, 0xfa, 0x0f, 0xf0, 0x03, 0x38, 0x0b, 0x32, + 0x0f, 0xc4, 0x07, 0xfb, 0x0f, 0xf0, 0x03, 0x11, 0x0b, 0x32, 0x0f, 0xc4, + 0x07, 0xfc, 0x0f, 0xf0, 0x0c, 0x05, 0x0f, 0xf8, 0x1c, 0xdd, 0x0b, 0x32, + 0x0f, 0xc4, 0x07, 0xf3, 0x0f, 0x00, 0x00, 0x04, 0x0f, 0xc8, 0x06, 0xc0, + 0x0f, 0xf7, 0x00, 0x71, 0x0f, 0xc4, 0x07, 0x3d, 0x0f, 0xc5, 0x07, 0x3e, + 0x0b, 0x21, 0x0f, 0xd5, 0x00, 0x3c, 0x1f, 0xf8, 0x1c, 0xff, 0x10, 0x01, + 0x0f, 0xf1, 0x0f, 0x15, 0x01, 0xe2, 0x00, 0x21, 0x0f, 0xc4, 0x07, 0xf5, + 0x0a, 0x48, 0x0c, 0x24, 0x09, 0x95, 0x1c, 0x00, 0x0b, 0x61, 0x00, 0x59, + 0x09, 0xc1, 0x00, 0xd2, 0x10, 0x01, 0x1b, 0x22, 0x1f, 0xe4, 0x0f, 0xf8, + 0x19, 0x80, 0x02, 0x3a, 0x00, 0x48, 0x02, 0xba, 0x00, 0x48, 0x0f, 0xc4, + 0x07, 0xc2, 0x00, 0x61, 0x0b, 0x15, 0x1f, 0xc4, 0x07, 0x62, 0x1b, 0x88, + 0x1f, 0xf6, 0x00, 0x4c, 0x1b, 0x89, 0x0f, 0xfb, 0x01, 0x92, 0x0f, 0xfb, + 0x19, 0xd5, 0x0f, 0xc4, 0x05, 0x80, 0x00, 0x02, 0x0f, 0xc2, 0x0e, 0x00, + 0x0f, 0xc2, 0x07, 0xff, 0x0f, 0xc4, 0x06, 0x31, 0x0f, 0xc5, 0x05, 0x83, + 0x04, 0xb7, 0x0f, 0xfb, 0x12, 0xf9, 0x0f, 0xc4, 0x01, 0x5e, 0x0f, 0xc0, + 0x1c, 0xda, 0x0f, 0xc4, 0x06, 0x92, 0x0f, 0xc5, 0x07, 0x5d, 0x0b, 0x40, + 0x0f, 0xc4, 0x07, 0xf4, 0x0b, 0x21, 0x01, 0x88, 0x00, 0xdf, 0x11, 0xc8, + 0x01, 0x1e, 0x12, 0x08, 0x0f, 0xc4, 0x01, 0x7c, 0x0c, 0x00, 0x0f, 0xfb, + 0x1f, 0x0b, 0x0f, 0xf1, 0x03, 0x11, 0x00, 0xe2, 0x0f, 0xc4, 0x06, 0x8e, + 0x0a, 0x64, 0x09, 0x80, 0x0f, 0xf1, 0x0c, 0x05, 0x0f, 0xc4, 0x05, 0xf2, + 0x0a, 0x48, 0x0c, 0x00, 0x0f, 0xf1, 0x03, 0x38, 0x0a, 0x62, 0x00, 0x64, + 0x09, 0xa1, 0x00, 0x54, 0x03, 0x48, 0x12, 0xc8, 0x04, 0x44, 0x0c, 0x00, + 0x0f, 0xf1, 0x03, 0x1a, 0x0a, 0x48, 0x0f, 0xf1, 0x03, 0x19, 0x0a, 0x49, + 0x0f, 0xc4, 0x01, 0x32, 0x0c, 0x02, 0x00, 0xb6, 0x0c, 0x42, 0x0f, 0xc8, + 0x1f, 0xe8, 0x01, 0x37, 0x0f, 0xc4, 0x06, 0x96, 0x00, 0x37, 0x0f, 0xc4, + 0x06, 0x2b, 0x02, 0xb7, 0x0f, 0xf7, 0x04, 0x66, 0x0f, 0xc4, 0x01, 0x7c, + 0x0b, 0x08, 0x00, 0xb6, 0x00, 0x09, 0x03, 0x37, 0x0f, 0xf7, 0x04, 0x72, + 0x0f, 0xf7, 0x01, 0x39, 0x0f, 0xc8, 0x1f, 0xfd, 0x01, 0x37, 0x0f, 0xc4, + 0x00, 0x8f, 0x00, 0x37, 0x0f, 0xf7, 0x0d, 0x69, 0x0f, 0xf1, 0x03, 0x0a, + 0x0a, 0x48, 0x0f, 0xf1, 0x03, 0x09, 0x0a, 0x49, 0x0f, 0xc4, 0x01, 0x30, + 0x0c, 0x02, 0x0c, 0x42, 0x0c, 0x61, 0x00, 0x17, 0x1f, 0xf9, 0x1d, 0x8b, + 0x0f, 0xc4, 0x01, 0x62, 0x00, 0x00, 0x0c, 0x61, 0x0f, 0xd1, 0x04, 0x00, + 0x0f, 0xf8, 0x1d, 0x97, 0x09, 0xc9, 0x0f, 0xc4, 0x01, 0x62, 0x00, 0x40, + 0x0c, 0x61, 0x0f, 0xd1, 0x0c, 0x00, 0x09, 0xc9, 0x00, 0x21, 0x0c, 0x18, + 0x09, 0xc8, 0x0c, 0x51, 0x09, 0xc9, 0x00, 0xb7, 0x0f, 0xc4, 0x06, 0x99, + 0x06, 0xb7, 0x03, 0x37, 0x03, 0xb7, 0x0f, 0xc4, 0x06, 0x8f, 0x0c, 0x02, + 0x00, 0xb6, 0x0c, 0x42, 0x05, 0x37, 0x04, 0x37, 0x06, 0xbb, 0x1f, 0xf7, + 0x00, 0x8f, 0x00, 0x36, 0x04, 0xc4, 0x0f, 0xfa, 0x07, 0xa2, 0x00, 0x0e, + 0x07, 0x37, 0x0f, 0xf0, 0x03, 0x0b, 0x00, 0x32, 0x0f, 0xf0, 0x03, 0x1b, + 0x00, 0x32, 0x0f, 0xf1, 0x03, 0x1d, 0x0a, 0x7f, 0x0f, 0xf0, 0x03, 0x1c, + 0x0f, 0xf2, 0x00, 0x3f, 0x0f, 0xf0, 0x03, 0x1e, 0x00, 0x32, 0x0f, 0xf0, + 0x03, 0x1f, 0x00, 0x32, 0x0f, 0xf0, 0x03, 0x2a, 0x0f, 0xf2, 0x07, 0xff, + 0x0f, 0xf0, 0x03, 0x29, 0x00, 0xb2, 0x0f, 0xf0, 0x03, 0x2b, 0x0f, 0xf2, + 0x00, 0x28, 0x0f, 0xf0, 0x03, 0x2f, 0x00, 0x72, 0x0f, 0xf0, 0x04, 0x00, + 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x11, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x15, + 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x17, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x0c, + 0x00, 0xb2, 0x0f, 0xf0, 0x05, 0x02, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x08, + 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x01, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x00, + 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x07, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x06, + 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x04, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x05, + 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x0a, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x0b, + 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x03, 0x00, 0x32, 0x0f, 0xf0, 0x05, 0x09, + 0x00, 0x32, 0x0f, 0xf0, 0x0a, 0x00, 0x05, 0xb2, 0x0f, 0xc8, 0x01, 0x13, + 0x0f, 0xc4, 0x06, 0x00, 0x0f, 0xf0, 0x0a, 0x01, 0x0c, 0x32, 0x0c, 0x00, + 0x0f, 0xf0, 0x0a, 0x20, 0x00, 0x32, 0x0f, 0xf0, 0x0a, 0x10, 0x00, 0x72, + 0x0f, 0xf0, 0x0a, 0x11, 0x00, 0x32, 0x0f, 0xf0, 0x0a, 0x0a, 0x00, 0x32, + 0x0f, 0xf0, 0x0a, 0x07, 0x04, 0x32, 0x0f, 0xf0, 0x0a, 0x2e, 0x0f, 0xf2, + 0x01, 0xc8, 0x0f, 0xf0, 0x0a, 0x30, 0x0f, 0xf6, 0x0d, 0xdb, 0x06, 0x32, + 0x0f, 0xf0, 0x0c, 0x11, 0x02, 0xb2, 0x0f, 0xf0, 0x0c, 0x12, 0x00, 0x32, + 0x0f, 0xf0, 0x0c, 0x03, 0x00, 0x72, 0x0f, 0xf0, 0x0c, 0x1a, 0x0f, 0xf2, + 0x08, 0x72, 0x0f, 0xf1, 0x0c, 0x1b, 0x0a, 0x62, 0x01, 0x25, 0x09, 0xb2, + 0x0f, 0xc4, 0x01, 0x80, 0x00, 0x40, 0x0f, 0xc8, 0x0c, 0x1d, 0x0c, 0x30, + 0x0f, 0xf2, 0x00, 0xa0, 0x0c, 0x31, 0x0a, 0x61, 0x0f, 0xd5, 0x02, 0xa0, + 0x10, 0x00, 0x0c, 0x30, 0x0f, 0xf2, 0x00, 0x60, 0x0c, 0x31, 0x0a, 0x61, + 0x0f, 0xd5, 0x01, 0x60, 0x10, 0x00, 0x0f, 0xf0, 0x0c, 0x1a, 0x0f, 0xf2, + 0x08, 0x71, 0x0f, 0xf1, 0x0d, 0x00, 0x0a, 0x49, 0x0c, 0x61, 0x02, 0xde, + 0x0c, 0x62, 0x0f, 0xe4, 0x08, 0x18, 0x1f, 0xe4, 0x08, 0x1e, 0x09, 0xa2, + 0x04, 0x25, 0x09, 0xb2, 0x0f, 0xf1, 0x0d, 0x01, 0x00, 0x22, 0x1f, 0xe2, + 0x0a, 0xaa, 0x0a, 0x64, 0x09, 0xb2, 0x0f, 0xc4, 0x06, 0x93, 0x0f, 0xc0, + 0x00, 0x2b, 0x0f, 0xc8, 0x0f, 0xff, 0x09, 0x37, 0x0f, 0xc4, 0x06, 0x01, + 0x00, 0x40, 0x04, 0x84, 0x00, 0x00, 0x04, 0x04, 0x00, 0x80, 0x0f, 0xc4, + 0x06, 0xba, 0x0f, 0xc0, 0x06, 0xbb, 0x04, 0x04, 0x00, 0x40, 0x0f, 0xc8, + 0x00, 0x28, 0x0f, 0xf7, 0x05, 0x23, 0x0f, 0xf6, 0x05, 0x23, 0x02, 0x88, + 0x00, 0x69, 0x0e, 0xff, 0x00, 0x28, 0x0e, 0xff, 0x02, 0x3a, 0x00, 0x08, + 0x02, 0xba, 0x00, 0x08, 0x0f, 0xc4, 0x01, 0xc1, 0x0f, 0xc0, 0x00, 0x47, + 0x0f, 0xc4, 0x07, 0xf3, 0x0b, 0x08, 0x0c, 0x38, 0x00, 0x00, 0x01, 0x04, + 0x0f, 0xc2, 0x0c, 0x18, 0x0f, 0xc2, 0x03, 0x01, 0x0f, 0xc2, 0x0d, 0x01, + 0x0f, 0xc2, 0x0d, 0x00, 0x0f, 0xc2, 0x03, 0x03, 0x0f, 0xc2, 0x03, 0x06, + 0x0f, 0xc2, 0x03, 0x05, 0x0f, 0xc2, 0x03, 0x28, 0x0f, 0xc2, 0x03, 0x18, + 0x0f, 0xc2, 0x03, 0x3c, 0x0f, 0xc2, 0x03, 0x3b, 0x0f, 0xc2, 0x03, 0x16, + 0x0f, 0xc2, 0x03, 0x17, 0x0f, 0xc2, 0x03, 0x26, 0x0f, 0xc2, 0x03, 0x27, + 0x0f, 0xc2, 0x03, 0x24, 0x0f, 0xc2, 0x03, 0x25, 0x0f, 0xc2, 0x03, 0x12, + 0x0f, 0xc2, 0x0f, 0x00, 0x0f, 0xc8, 0x0f, 0x12, 0x0c, 0x02, 0x0c, 0x02, + 0x0c, 0x02, 0x0c, 0x02, 0x0c, 0x02, 0x0c, 0x02, 0x0c, 0x02, 0x0c, 0x02, + 0x0f, 0xc2, 0x0f, 0x10, 0x0f, 0xc2, 0x0f, 0x13, 0x0f, 0xc2, 0x02, 0x01, + 0x0f, 0xc2, 0x02, 0x04, 0x0f, 0xc2, 0x02, 0x03, 0x0f, 0xc2, 0x02, 0x06, + 0x00, 0xc5, 0x0a, 0x83, 0x0a, 0xa1, 0x0b, 0xf1, 0x0a, 0xd5, 0x0a, 0x42, + 0x1b, 0xf1, 0x1f, 0xf8, 0x1e, 0xd1, 0x1a, 0xd5, 0x0f, 0x39, 0x00, 0xc5, + 0x0b, 0xc4, 0x0a, 0xa1, 0x0a, 0xd5, 0x1b, 0xf0, 0x1f, 0xf8, 0x1e, 0xda, + 0x1b, 0xb2, 0x0f, 0x39, 0x0f, 0xc4, 0x06, 0xfd, 0x00, 0x61, 0x0b, 0x14, + 0x00, 0x00, 0x1f, 0xc4, 0x06, 0xfc, 0x1f, 0x38, 0x10, 0x00, 0x0f, 0xc4, + 0x06, 0xfb, 0x0b, 0x15, 0x0f, 0xc4, 0x06, 0xfc, 0x1b, 0x15, 0x1f, 0x39, + 0x00, 0x40, 0x0f, 0xe2, 0x0a, 0xaa, 0x00, 0x04, 0x0f, 0xc5, 0x07, 0xfd, + 0x0b, 0x63, 0x09, 0x82, 0x0f, 0xc5, 0x07, 0xfe, 0x0b, 0xe3, 0x09, 0x82, + 0x0b, 0xe3, 0x0f, 0xfa, 0x1e, 0x8f, 0x09, 0x82, 0x0f, 0xf0, 0x0f, 0x19, + 0x00, 0x32, 0x0f, 0xf0, 0x0f, 0x18, 0x00, 0x32, 0x0f, 0xf0, 0x0f, 0x1a, + 0x00, 0x72, 0x0f, 0xf9, 0x1f, 0x09, 0x0f, 0xf1, 0x0f, 0x14, 0x0f, 0xc4, + 0x01, 0x3e, 0x0a, 0x48, 0x0c, 0x02, 0x0f, 0xf1, 0x0f, 0x15, 0x0a, 0x42, + 0x0c, 0x21, 0x00, 0x1f, 0x0f, 0xc4, 0x07, 0xf0, 0x00, 0x00, 0x10, 0x40, + 0x00, 0x09, 0x00, 0x4a, 0x00, 0x5f, 0x10, 0x49, 0x10, 0x0a, 0x00, 0x9e, + 0x10, 0x49, 0x10, 0x4a, 0x0f, 0xc4, 0x07, 0xea, 0x0c, 0x40, 0x0f, 0xc4, + 0x07, 0xeb, 0x0c, 0x80, 0x0f, 0xe2, 0x02, 0xa0, 0x0f, 0xc4, 0x01, 0x7b, + 0x0c, 0x24, 0x09, 0x80, 0x0f, 0xc4, 0x01, 0x7a, 0x0c, 0x26, 0x09, 0xa4, + 0x0f, 0x38, 0x09, 0x80, 0x0f, 0xf9, 0x19, 0xf7, 0x0f, 0xf9, 0x1f, 0x42, + 0x0f, 0xf9, 0x1f, 0x46, 0x0f, 0xf9, 0x1f, 0x4a, 0x0f, 0xf9, 0x1f, 0x4e, + 0x0f, 0xf9, 0x1f, 0x52, 0x0f, 0xf9, 0x1f, 0x5a, 0x0f, 0xc4, 0x00, 0x83, + 0x00, 0x37, 0x0f, 0xb9, 0x0f, 0xc4, 0x00, 0xe0, 0x00, 0x37, 0x0f, 0xb9, + 0x0f, 0xc4, 0x00, 0xe3, 0x00, 0x37, 0x0f, 0xb9, 0x0f, 0xc4, 0x00, 0x8c, + 0x00, 0x37, 0x0f, 0xb9, 0x0f, 0xbb, 0x0f, 0xc4, 0x01, 0x71, 0x0b, 0x14, + 0x1f, 0x39, 0x0c, 0x51, 0x0f, 0x38, 0x09, 0xc9, 0x0f, 0xfb, 0x08, 0xc2, + 0x0f, 0xb9, 0x0f, 0xbf, 0x00, 0xf3, 0x0f, 0xfc, 0x1f, 0x34, 0x0f, 0xfc, + 0x0e, 0xe2, 0x0f, 0xfc, 0x09, 0x7e, 0x0f, 0xfc, 0x09, 0x84, 0x0f, 0xfc, + 0x09, 0x87, 0x0f, 0xfc, 0x0c, 0x9f, 0x0f, 0xfc, 0x0b, 0x5b, 0x0f, 0xfc, + 0x0a, 0x72, 0x0f, 0xff, 0x00, 0x00, 0x0f, 0xff, 0x0f, 0x77, 0x0f, 0xff, + 0x00, 0x26, 0x0f, 0xff, 0x00, 0x27, 0x0f, 0xff, 0x00, 0x28, 0x0f, 0xff, + 0x00, 0x29, 0x0f, 0xff, 0x00, 0x2a, 0x0f, 0xff, 0x02, 0x00, 0x0f, 0xff, + 0x02, 0x05, 0x0f, 0xff, 0x0c, 0xad, 0x0f, 0xff, 0x0a, 0xb6, 0x0f, 0xc4, + 0x06, 0xfd, 0x00, 0x00, 0x00, 0x04, 0x0f, 0xe2, 0x0a, 0xaa, 0x0f, 0xc5, + 0x07, 0xfd, 0x0b, 0xa3, 0x09, 0xa1, 0x0b, 0xd4, 0x1f, 0xc5, 0x07, 0xfe, + 0x1b, 0xa3, 0x19, 0xa1, 0x1b, 0xd4, 0x1b, 0xa3, 0x19, 0xa1, 0x1b, 0xd4, + 0x1f, 0xc4, 0x06, 0xfc, 0x1b, 0x21, 0x10, 0x54, 0x1f, 0xf9, 0x1f, 0xab, + 0x0f, 0xfb, 0x1b, 0x7f, 0x0f, 0xfb, 0x18, 0x51, 0x0f, 0xfb, 0x02, 0xe3, + 0x0f, 0xfb, 0x1b, 0xb6, 0x0f, 0xf0, 0x0f, 0x00, 0x0f, 0xf8, 0x1f, 0xb7, + 0x01, 0x72, 0x0f, 0xc4, 0x06, 0xfd, 0x0f, 0xfa, 0x1e, 0xd7, 0x00, 0x40, + 0x0f, 0xc4, 0x07, 0xf3, 0x0f, 0xfa, 0x1c, 0xa7, 0x00, 0x00, 0x0f, 0xf9, + 0x1f, 0xb7, 0x0f, 0xfb, 0x01, 0xcf, 0x0f, 0xf9, 0x1f, 0xc2, 0x03, 0x3a, + 0x00, 0xc8, 0x10, 0x55, 0x10, 0x95, 0x12, 0x15, 0x1f, 0xfb, 0x02, 0x35, + 0x0f, 0xfb, 0x01, 0xcb, 0x0f, 0xfb, 0x17, 0x17, 0x0f, 0xfb, 0x01, 0xcf, + 0x0f, 0xf8, 0x1f, 0xbb, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x07, 0x06 +}; + +#endif diff -Nru a/drivers/media/dvb/frontends/stv0299.c b/drivers/media/dvb/frontends/stv0299.c --- a/drivers/media/dvb/frontends/stv0299.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/frontends/stv0299.c Wed Oct 8 12:24:57 2003 @@ -913,7 +913,10 @@ static int uni0299_attach (struct dvb_i2c_bus *i2c) { long tuner_type; - u8 id = stv0299_readreg (i2c, 0x00); + u8 id; + + stv0299_writereg (i2c, 0x02, 0x00); /* standby off */ + id = stv0299_readreg (i2c, 0x00); dprintk ("%s: id == 0x%02x\n", __FUNCTION__, id); diff -Nru a/drivers/media/dvb/frontends/tda1004x.c b/drivers/media/dvb/frontends/tda1004x.c --- a/drivers/media/dvb/frontends/tda1004x.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/frontends/tda1004x.c Wed Oct 8 12:24:55 2003 @@ -1,5 +1,5 @@ /* - Driver for Philips tda1004x OFDM Frontend + Driver for Philips tda1004xh OFDM Frontend 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 diff -Nru a/drivers/media/dvb/frontends/ves1820.c b/drivers/media/dvb/frontends/ves1820.c --- a/drivers/media/dvb/frontends/ves1820.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/frontends/ves1820.c Wed Oct 8 12:24:56 2003 @@ -36,6 +36,9 @@ #define dprintk(x...) #endif +#define MAX_UNITS 4 +static int pwm[MAX_UNITS] = { -1, -1, -1, -1 }; +static int verbose; /** * since we need only a few bits to store internal state we don't allocate @@ -116,9 +119,9 @@ ret = i2c->xfer (i2c, &msg, 1); if (ret != 1) - dprintk("%s: writereg error " + printk("DVB: VES1820(%d): %s, writereg error " "(reg == 0x%02x, val == 0x%02x, ret == %i)\n", - __FUNCTION__, reg, data, ret); + fe->i2c->adapter->num, __FUNCTION__, reg, data, ret); dvb_delay(10); return (ret != 1) ? -EREMOTEIO : 0; @@ -138,7 +141,8 @@ ret = i2c->xfer (i2c, msg, 2); if (ret != 2) - dprintk("%s: readreg error (ret == %i)\n", __FUNCTION__, ret); + printk("DVB: VES1820(%d): %s: readreg error (ret == %i)\n", + fe->i2c->adapter->num, __FUNCTION__, ret); return b1[0]; } @@ -152,7 +156,8 @@ ret = i2c->xfer (i2c, &msg, 1); if (ret != 1) - printk("%s: i/o error (ret == %i)\n", __FUNCTION__, ret); + printk("DVB: VES1820(%d): %s: i/o error (ret == %i)\n", + i2c->adapter->num, __FUNCTION__, ret); return (ret != 1) ? -EREMOTEIO : 0; } @@ -173,7 +178,8 @@ if (tuner_type == 0xff) /* PLL not reachable over i2c ... */ return 0; - if (strstr (fe->i2c->adapter->name, "Technotrend")) + if (strstr (fe->i2c->adapter->name, "Technotrend") || + strstr (fe->i2c->adapter->name, "TT-Budget")) ifreq = 35937500; else ifreq = 36125000; @@ -232,7 +238,7 @@ { int i; - dprintk("VES1820: init chip\n"); + dprintk("DVB: VES1820(%d): init chip\n", fe->i2c->adapter->num); ves1820_writereg (fe, 0, 0); @@ -408,10 +414,11 @@ if (sync & 2) /* AFC only valid when carrier has been recovered */ afc = ves1820_readreg(fe, 0x19); - printk ("%s: AFC (%d) %dHz\n", __FILE__, afc, + if (verbose) + printk ("DVB: VES1820(%d): AFC (%d) %dHz\n", + fe->i2c->adapter->num, afc, -((s32)(p->u.qam.symbol_rate >> 3) * afc >> 7)); - p->inversion = reg0 & 0x20 ? INVERSION_OFF : INVERSION_ON; p->u.qam.modulation = ((reg0 >> 2) & 7) + QAM_16; @@ -449,15 +456,14 @@ if (i2c->xfer(i2c, &msg1, 1) == 1) { type = 0; - printk ("%s: setup for tuner spXXXX\n", __FILE__); + printk ("DVB: VES1820(%d): setup for tuner spXXXX\n", i2c->adapter->num); } else if (i2c->xfer(i2c, &msg2, 1) == 1) { type = 1; - printk ("%s: setup for tuner sp5659c\n", __FILE__); + printk ("DVB: VES1820(%d): setup for tuner sp5659c\n", i2c->adapter->num); } else { type = -1; - printk ("%s: unknown PLL, " - "please report to !!\n", - __FILE__); + printk ("DVB: VES1820(%d): unknown PLL, " + "please report to !!\n", i2c->adapter->num); } return type; @@ -473,7 +479,7 @@ i2c->xfer (i2c, msg, 2); - dprintk("VES1820: pwm=%02x\n", pwm); + printk("DVB: VES1820(%d): pwm=0x%02x\n", i2c->adapter->num, pwm); if (pwm == 0xff) pwm = 0x48; @@ -513,6 +519,12 @@ if ((tuner_type = probe_tuner(i2c)) < 0) return -ENODEV; + if ((i2c->adapter->num < MAX_UNITS) && pwm[i2c->adapter->num] != -1) { + printk("DVB: VES1820(%d): pwm=0x%02x (user specified)\n", + i2c->adapter->num, pwm[i2c->adapter->num]); + SET_PWM(data, pwm[i2c->adapter->num]); + } + else SET_PWM(data, read_pwm(i2c)); SET_REG0(data, ves1820_inittab[0]); SET_TUNER(data, tuner_type); @@ -532,6 +544,10 @@ static int __init init_ves1820 (void) { + int i; + for (i = 0; i < MAX_UNITS; i++) + if (pwm[i] < -1 || pwm[i] > 255) + return -EINVAL; return dvb_register_i2c_device (THIS_MODULE, ves1820_attach, ves1820_detach); } @@ -545,6 +561,11 @@ module_init(init_ves1820); module_exit(exit_ves1820); + +MODULE_PARM(pwm, "1-" __MODULE_STRING(MAX_UNITS) "i"); +MODULE_PARM_DESC(pwm, "override PWM value stored in EEPROM (tuner calibration)"); +MODULE_PARM(verbose, "i"); +MODULE_PARM_DESC(verbose, "print AFC offset after tuning for debugging the PWM setting"); MODULE_DESCRIPTION("VES1820 DVB-C frontend driver"); MODULE_AUTHOR("Ralph Metzler, Holger Waechtler"); diff -Nru a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig --- a/drivers/media/dvb/ttpci/Kconfig Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/ttpci/Kconfig Wed Oct 8 12:24:55 2003 @@ -1,6 +1,8 @@ config DVB_AV7110 tristate "AV7110 cards" - depends on VIDEO_DEV && DVB_CORE + depends on DVB_CORE + select VIDEO_DEV + select VIDEO_SAA7146_VV help Support for SAA7146 and AV7110 based DVB cards as produced by Fujitsu-Siemens, Technotrend, Hauppauge and others. @@ -26,6 +28,7 @@ config DVB_BUDGET tristate "Budget cards" depends on DVB_CORE + select VIDEO_SAA7146 help Support for simple SAA7146 based DVB cards (so called Budget- or Nova-PCI cards) without onboard @@ -38,7 +41,8 @@ config DVB_BUDGET_CI tristate "Budget cards with onboard CI connector" - depends on VIDEO_DEV && DVB_CORE && DVB_BUDGET + depends on DVB_CORE + select VIDEO_SAA7146 help Support for simple SAA7146 based DVB cards (so called Budget- or Nova-PCI cards) without onboard @@ -51,7 +55,9 @@ config DVB_BUDGET_AV tristate "Budget cards with analog video inputs" - depends on VIDEO_DEV && DVB_CORE && DVB_BUDGET + depends on DVB_CORE + select VIDEO_DEV + select VIDEO_SAA7146_VV help Support for simple SAA7146 based DVB cards (so called Budget- or Nova-PCI cards) without onboard @@ -64,7 +70,9 @@ config DVB_BUDGET_PATCH tristate "AV7110 cards with Budget Patch" - depends on DVB_CORE && DVB_BUDGET + depends on DVB_BUDGET + select VIDEO_DEV + select VIDEO_SAA7146_VV help Support for Budget Patch (full TS) modification on SAA7146+AV7110 based cards (DVB-S cards). This diff -Nru a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c --- a/drivers/media/dvb/ttpci/av7110.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/ttpci/av7110.c Wed Oct 8 12:24:57 2003 @@ -40,9 +40,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -55,10 +55,8 @@ #include #include #include -#include #include #include -#include #include #include #include @@ -196,17 +194,22 @@ return result; } -/* DEBI during interrupt */ -/* fixme: val can be a pointer to a memory or an u32 value -- this - won't work on 64bit platforms! */ +/* DEBI during interrupt */ +/* single word writes */ static inline void iwdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) { - if (count>4 && val) - memcpy(av7110->debi_virt, (char *) val, count); debiwrite(av7110, config, addr, val, count); } +/* buffer writes */ +static inline void mwdebi(struct av7110 *av7110, u32 config, int addr, char *val, int count) +{ + memcpy(av7110->debi_virt, val, count); + debiwrite(av7110, config, addr, 0, count); +} + + static inline u32 irdebi(struct av7110 *av7110, u32 config, int addr, u32 val, int count) { u32 res; @@ -604,7 +607,7 @@ enum dmx_success success, struct av7110 *av7110) { - DEB_EE(("av7110: %p\n",av7110)); + DEB_INT(("av7110: %p\n",av7110)); if (!dvbdmxfilter->feed->demux->dmx.frontend) return 0; @@ -1319,17 +1322,43 @@ * Firmware commands ****************************************************************************/ +/* msp3400 i2c subaddresses */ +#define MSP_WR_DEM 0x10 +#define MSP_RD_DEM 0x11 +#define MSP_WR_DSP 0x12 +#define MSP_RD_DSP 0x13 + static inline int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val) { u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff }; struct dvb_i2c_bus *i2c = av7110->i2c_bus; - struct i2c_msg msgs; + struct i2c_msg msgs = { .flags = 0, .addr = 0x40, .len = 5, .buf = msg}; - msgs.flags=0; - msgs.addr=0x40; - msgs.len=5; - msgs.buf=msg; - return i2c->xfer(i2c, &msgs, 1); + if (i2c->xfer(i2c, &msgs, 1) != 1) { + printk("av7110(%d): %s(%u = %u) failed\n", + av7110->dvb_adapter->num, __FUNCTION__, reg, val); + return -EIO; + } + return 0; +} + +static inline int msp_readreg(struct av7110 *av7110, u8 dev, u16 reg, u16 *val) +{ + u8 msg1[3]={ dev, reg>>8, reg&0xff }; + u8 msg2[2]; + struct dvb_i2c_bus *i2c = av7110->i2c_bus; + struct i2c_msg msgs[2] = { + { .flags = 0, .addr = 0x40, .len = 3, .buf = msg1}, + { .flags = I2C_M_RD, .addr = 0x40, .len = 2, .buf = msg2} + }; + + if (i2c->xfer(i2c, msgs, 2) != 2) { + printk("av7110(%d): %s(%u) failed\n", + av7110->dvb_adapter->num, __FUNCTION__, reg); + return -EIO; + } + *val = (msg2[0] << 8) | msg2[1]; + return 0; } static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data) @@ -1370,9 +1399,9 @@ if (vol > 0) { balance = ((volright-volleft) * 127) / vol; } - msp_writereg(av7110, 0x12, 0x0001, balance << 8); - msp_writereg(av7110, 0x12, 0x0000, val); /* loudspeaker */ - msp_writereg(av7110, 0x12, 0x0006, val); /* headphonesr */ + msp_writereg(av7110, MSP_WR_DSP, 0x0001, balance << 8); + msp_writereg(av7110, MSP_WR_DSP, 0x0000, val); /* loudspeaker */ + msp_writereg(av7110, MSP_WR_DSP, 0x0006, val); /* headphonesr */ return 0; } return 0; @@ -1915,8 +1944,8 @@ if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) return -1; DEB_D(("Writing DRAM block %d\n",i)); - iwdebi(av7110, DEBISWAB, bootblock, - i*(BOOT_MAX_SIZE)+(u32)data, + mwdebi(av7110, DEBISWAB, bootblock, + ((char*)data) + i*(BOOT_MAX_SIZE), BOOT_MAX_SIZE); bootblock^=0x1400; iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4); @@ -1929,9 +1958,9 @@ if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) return -1; if (rest>4) - iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)+(u32)data, rest); + mwdebi(av7110, DEBISWAB, bootblock, ((char*)data) + i*(BOOT_MAX_SIZE), rest); else - iwdebi(av7110, DEBISWAB, bootblock, i*(BOOT_MAX_SIZE)-4+(u32)data, rest+4); + mwdebi(av7110, DEBISWAB, bootblock, ((char*)data) + i*(BOOT_MAX_SIZE) - 4, rest+4); iwdebi(av7110, DEBISWAB, BOOT_BASE, swab32(base), 4); iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, rest, 2); @@ -2015,7 +2044,7 @@ //saa7146_setgpio(dev, DEBI_DONE_LINE, SAA7146_GPIO_INPUT); //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT); - iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) bootcode, sizeof(bootcode)); + mwdebi(av7110, DEBISWAB, DPRAM_BASE, bootcode, sizeof(bootcode)); iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); wait_for_debi_done(av7110); @@ -2033,7 +2062,7 @@ DEB_D(("bootarm: load dpram code\n")); - iwdebi(av7110, DEBISWAB, DPRAM_BASE, (u32) Dpram, sizeof(Dpram)); + mwdebi(av7110, DEBISWAB, DPRAM_BASE, Dpram, sizeof(Dpram)); wait_for_debi_done(av7110); @@ -2608,8 +2637,23 @@ ****************************************************************************/ static struct v4l2_input inputs[2] = { - { 0, "DVB", V4L2_INPUT_TYPE_CAMERA, 1, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 1, "ANALOG", V4L2_INPUT_TYPE_TUNER, 2, 1, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { + .index = 0, + .name = "DVB", + .type = V4L2_INPUT_TYPE_CAMERA, + .audioset = 1, + .tuner = 0, /* ignored */ + .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, + .status = 0, + }, { + .index = 1, + .name = "Television", + .type = V4L2_INPUT_TYPE_TUNER, + .audioset = 2, + .tuner = 0, + .std = V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, + .status = 0, + } }; /* taken from ves1820.c */ @@ -2652,9 +2696,9 @@ DEB_EE(("av7710: freq: 0x%08x\n",freq)); - /* magic number: 56. tuning with the frequency given by v4l2 - is always off by 56*62.5 kHz...*/ - div = freq + 56; + /* magic number: 614. tuning with the frequency given by v4l2 + is always off by 614*62.5 = 38375 kHz...*/ + div = freq + 614; buf[0] = (div >> 8) & 0x7f; buf[1] = div & 0xff; @@ -2677,13 +2721,18 @@ static struct saa7146_standard dvb_standard[]; static struct saa7146_standard standard[]; +static struct v4l2_audio msp3400_v4l2_audio = { + .index = 0, + .name = "Television", + .capability = V4L2_AUDCAP_STEREO +}; + int av7110_dvb_c_switch(struct saa7146_fh *fh) { struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; struct av7110 *av7110 = (struct av7110*)dev->ext_priv; - u16 buf[3] = { ((COMTYPE_AUDIODAC << 8) + ADSwitch), 1, 1 }; - + u16 adswitch; u8 band = 0; int source, sync; struct saa7146_fh *ov_fh = NULL; @@ -2698,23 +2747,36 @@ } if( 0 != av7110->current_input ) { - buf[2] = 0; + adswitch = 1; band = 0x68; /* analog band */ source = SAA7146_HPS_SOURCE_PORT_B; sync = SAA7146_HPS_SYNC_PORT_B; memcpy(standard,analog_standard,sizeof(struct saa7146_standard)*2); + printk("av7110: switching to analog TV\n"); + msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0000); // loudspeaker source + msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0000); // headphone source + msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0000); // SCART 1 source + msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono + msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); // loudspeaker + headphone + msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume } else { - buf[2] = 1; + adswitch = 0; band = 0x28; /* digital band */ source = SAA7146_HPS_SOURCE_PORT_A; sync = SAA7146_HPS_SYNC_PORT_A; memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2); + printk("av7110: switching DVB mode\n"); + msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source + msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source + msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source + msp_writereg(av7110, MSP_WR_DSP, 0x000e, 0x3000); // FM matrix, mono + msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone + msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume } /* hmm, this does not do anything!? */ - if (OutCommand(av7110, buf, 3)) { + if (outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, adswitch)) printk("ADSwitch error\n"); - } if( 0 != ves1820_writereg(dev, 0x0f, band )) { printk("setting band in demodulator failed.\n"); @@ -2739,10 +2801,12 @@ case VIDIOC_G_TUNER: { struct v4l2_tuner *t = arg; + u16 stereo_det; + s8 stereo; DEB_EE(("VIDIOC_G_TUNER: %d\n", t->index)); - if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) { + if( 0 == av7110->has_analog_tuner || t->index != 0 ) { return -EINVAL; } @@ -2750,21 +2814,39 @@ strcpy(t->name, "Television"); t->type = V4L2_TUNER_ANALOG_TV; - t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO | V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP; + t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO | + V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2 | V4L2_TUNER_CAP_SAP; t->rangelow = 772; /* 48.25 MHZ / 62.5 kHz = 772, see fi1216mk2-specs, page 2 */ t->rangehigh = 13684; /* 855.25 MHz / 62.5 kHz = 13684 */ /* FIXME: add the real signal strength here */ t->signal = 0xffff; t->afc = 0; - /* fixme: real autodetection here */ + +msp_readreg(av7110, MSP_RD_DEM, 0x007e, &stereo_det); +printk("VIDIOC_G_TUNER: msp3400 TV standard detection: 0x%04x\n", stereo_det); + + msp_readreg(av7110, MSP_RD_DSP, 0x0018, &stereo_det); + printk("VIDIOC_G_TUNER: msp3400 stereo detection: 0x%04x\n", stereo_det); + stereo = (s8)(stereo_det >> 8); + if (stereo > 0x10) { + /* stereo */ t->rxsubchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_MONO; + t->audmode = V4L2_TUNER_MODE_STEREO; + } + else if (stereo < -0x10) { + /* bilingual*/ + t->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2; + t->audmode = V4L2_TUNER_MODE_LANG1; + } + else /* mono */ + t->rxsubchans = V4L2_TUNER_SUB_MONO; return 0; } case VIDIOC_S_TUNER: { struct v4l2_tuner *t = arg; - + u16 fm_matrix, src; DEB_EE(("VIDIOC_S_TUNER: %d\n", t->index)); if( 0 == av7110->has_analog_tuner || av7110->current_input != 1 ) { @@ -2773,23 +2855,31 @@ switch(t->audmode) { - case V4L2_TUNER_MODE_STEREO: { + case V4L2_TUNER_MODE_STEREO: DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n")); + fm_matrix = 0x3001; // stereo + src = 0x0020; break; - } - case V4L2_TUNER_MODE_LANG1: { + case V4L2_TUNER_MODE_LANG1: DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n")); + fm_matrix = 0x3000; // mono + src = 0x0000; break; - } - case V4L2_TUNER_MODE_LANG2: { + case V4L2_TUNER_MODE_LANG2: DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG2\n")); + fm_matrix = 0x3000; // mono + src = 0x0010; break; - } - default: { /* case V4L2_TUNER_MODE_MONO: {*/ + default: /* case V4L2_TUNER_MODE_MONO: {*/ DEB_D(("VIDIOC_S_TUNER: TDA9840_SET_MONO\n")); + fm_matrix = 0x3000; // mono + src = 0x0030; break; } - } + msp_writereg(av7110, MSP_WR_DSP, 0x000e, fm_matrix); + msp_writereg(av7110, MSP_WR_DSP, 0x0008, src); + msp_writereg(av7110, MSP_WR_DSP, 0x0009, src); + msp_writereg(av7110, MSP_WR_DSP, 0x000a, src); return 0; } @@ -2822,10 +2912,18 @@ if (V4L2_TUNER_ANALOG_TV != f->type) return -EINVAL; + msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0xffe0); // fast mute + msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0xffe0); + /* tune in desired frequency */ tuner_set_tv_freq(dev, f->frequency); av7110->current_freq = f->frequency; + msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x003f); // start stereo detection + msp_writereg(av7110, MSP_WR_DSP, 0x0015, 0x0000); + msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x4f00); // loudspeaker + headphone + msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x4f00); // SCART 1 volume + return 0; } case VIDIOC_ENUMINPUT: @@ -2873,6 +2971,22 @@ av7110->current_input = input; return av7110_dvb_c_switch(fh); } + case VIDIOC_G_AUDIO: + { + struct v4l2_audio *a = arg; + + DEB_EE(("VIDIOC_G_AUDIO: %d\n", a->index)); + if (a->index != 0) + return -EINVAL; + memcpy(a, &msp3400_v4l2_audio, sizeof(struct v4l2_audio)); + break; + } + case VIDIOC_S_AUDIO: + { + struct v4l2_audio *a = arg; + DEB_EE(("VIDIOC_S_AUDIO: %d\n", a->index)); + break; + } default: printk("no such ioctl\n"); return -ENOIOCTLCMD; @@ -3257,7 +3371,7 @@ DEB_EE(("av7110: fwstc = %04hx %04hx %04hx %04hx\n", fwstc[0], fwstc[1], fwstc[2], fwstc[3])); - *stc = (((uint64_t)(~fwstc[2]) & 1) << 32) | + *stc = (((uint64_t) ((fwstc[3] & 0x8000) >> 15)) << 32) | (((uint64_t)fwstc[1]) << 16) | ((uint64_t)fwstc[0]); *base = 1; @@ -3630,17 +3744,22 @@ DEB_EE(("av7110: %p\n",av7110)); + if ((file->f_flags & O_ACCMODE) != O_RDONLY) { poll_wait(file, &av7110->avout.queue, wait); + } + poll_wait(file, &av7110->video_events.wait_queue, wait); if (av7110->video_events.eventw != av7110->video_events.eventr) mask = POLLPRI; + if ((file->f_flags & O_ACCMODE) != O_RDONLY) { if (av7110->playing) { if (FREE_COND) mask |= (POLLOUT | POLLWRNORM); } else /* if not playing: may play if asked for */ mask |= (POLLOUT | POLLWRNORM); + } return mask; } @@ -3653,6 +3772,10 @@ DEB_EE(("av7110: %p\n",av7110)); + if ((file->f_flags & O_ACCMODE) == O_RDONLY) { + return -EPERM; + } + if (av7110->videostate.stream_source!=VIDEO_SOURCE_MEMORY) return -EPERM; @@ -3690,6 +3813,10 @@ n=MIN_IFRAME/len+1; } + /* setting n always > 1, fixes problems when playing stillframes + consisting of I- and P-Frames */ + n=MIN_IFRAME/len+1; + /* FIXME: nonblock? */ dvb_play(av7110, iframe_header, sizeof(iframe_header), 0, 1, 0); @@ -3711,9 +3838,12 @@ DEB_EE(("av7110: %p\n",av7110)); - if (((file->f_flags&O_ACCMODE)==O_RDONLY) && - (cmd!=VIDEO_GET_STATUS)) + if ((file->f_flags&O_ACCMODE)==O_RDONLY) { + if ( cmd!=VIDEO_GET_STATUS && cmd!=VIDEO_GET_EVENT && + cmd!=VIDEO_GET_SIZE ) { return -EPERM; + } + } switch (cmd) { case VIDEO_STOP: @@ -4027,15 +4157,17 @@ if ((err=dvb_generic_open(inode, file))<0) return err; + + if ((file->f_flags & O_ACCMODE) != O_RDONLY) { dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); av7110->video_blank=1; av7110->audiostate.AV_sync_state=1; av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX; - if ((file->f_flags & O_ACCMODE) != O_RDONLY) /* empty event queue */ av7110->video_events.eventr = av7110->video_events.eventw = 0; + } return 0; } @@ -4047,7 +4179,10 @@ DEB_EE(("av7110: %p\n",av7110)); + if ((file->f_flags & O_ACCMODE) != O_RDONLY) { AV_Stop(av7110, RP_VIDEO); + } + return dvb_generic_release(inode, file); } @@ -4094,7 +4229,8 @@ static struct dvb_device dvbdev_video = { .priv = 0, - .users = 1, + .users = 6, + .readers = 5, /* arbitrary */ .writers = 1, .fops = &dvb_video_fops, .kernel_ioctl = dvb_video_ioctl, @@ -4324,9 +4460,46 @@ { VIDIOC_S_FREQUENCY, SAA7146_EXCLUSIVE }, { VIDIOC_G_TUNER, SAA7146_EXCLUSIVE }, { VIDIOC_S_TUNER, SAA7146_EXCLUSIVE }, + { VIDIOC_G_AUDIO, SAA7146_EXCLUSIVE }, + { VIDIOC_S_AUDIO, SAA7146_EXCLUSIVE }, { 0, 0 } }; +static u8 saa7113_init_regs[] = { + 0x02, 0xd0, + 0x03, 0x23, + 0x04, 0x00, + 0x05, 0x00, + 0x06, 0xe9, + 0x07, 0x0d, + 0x08, 0x98, + 0x09, 0x02, + 0x0a, 0x80, + 0x0b, 0x40, + 0x0c, 0x40, + 0x0d, 0x00, + 0x0e, 0x01, + 0x0f, 0x7c, + 0x10, 0x48, + 0x11, 0x0c, + 0x12, 0x8b, + 0x13, 0x1a, + 0x14, 0x00, + 0x15, 0x00, + 0x16, 0x00, + 0x17, 0x00, + 0x18, 0x00, + 0x19, 0x00, + 0x1a, 0x00, + 0x1b, 0x00, + 0x1c, 0x00, + 0x1d, 0x00, + 0x1e, 0x00, + + 0xff +}; + + static struct saa7146_ext_vv av7110_vv_data_st; static struct saa7146_ext_vv av7110_vv_data_c; @@ -4362,7 +4535,7 @@ return -1; } - if (saa7146_register_device(&av7110->vd, dev, "av7110", VFL_TYPE_GRABBER)) { + if (saa7146_register_device(&av7110->v4l_dev, dev, "av7110", VFL_TYPE_GRABBER)) { ERR(("cannot register capture device. skipping.\n")); saa7146_vv_release(dev); kfree(av7110); @@ -4382,7 +4555,7 @@ av7110->dvb_adapter, 0); if (!av7110->i2c_bus) { - saa7146_unregister_device(&av7110->vd, dev); + saa7146_unregister_device(&av7110->v4l_dev, dev); saa7146_vv_release(dev); dvb_unregister_adapter (av7110->dvb_adapter); kfree(av7110); @@ -4490,36 +4663,65 @@ /** * some special handling for the Siemens DVB-C cards... */ - } else if (i2c_writereg(av7110, 0x80, 0x0, 0x80)==1) { - i2c_writereg(av7110, 0x80, 0x0, 0); + } else if (i2c_writereg(av7110, 0x80, 0x0, 0x80) == 1 + && i2c_writereg(av7110, 0x80, 0x0, 0) == 1) { + u16 version1, version2; printk ("av7110(%d): DVB-C analog module detected, " "initializing MSP3400\n", av7110->dvb_adapter->num); av7110->adac_type = DVB_ADAC_MSP; - dvb_delay(100); - msp_writereg(av7110, 0x12, 0x0013, 0x0c00); - msp_writereg(av7110, 0x12, 0x0000, 0x7f00); // loudspeaker + headphone - msp_writereg(av7110, 0x12, 0x0008, 0x0220); // loudspeaker source - msp_writereg(av7110, 0x12, 0x0004, 0x7f00); // loudspeaker volume - msp_writereg(av7110, 0x12, 0x000a, 0x0220); // SCART 1 source - msp_writereg(av7110, 0x12, 0x0007, 0x7f00); // SCART 1 volume - msp_writereg(av7110, 0x12, 0x000d, 0x4800); // prescale SCART + dvb_delay(100); // the probing above resets the msp... + msp_readreg(av7110, MSP_RD_DSP, 0x001e, &version1); + msp_readreg(av7110, MSP_RD_DSP, 0x001f, &version2); + printk("av7110(%d): MSP3400 version 0x%04x 0x%04x\n", + av7110->dvb_adapter->num, version1, version2); + msp_writereg(av7110, MSP_WR_DSP, 0x0013, 0x0c00); + msp_writereg(av7110, MSP_WR_DSP, 0x0000, 0x7f00); // loudspeaker + headphone + msp_writereg(av7110, MSP_WR_DSP, 0x0008, 0x0220); // loudspeaker source + msp_writereg(av7110, MSP_WR_DSP, 0x0009, 0x0220); // headphone source + msp_writereg(av7110, MSP_WR_DSP, 0x0004, 0x7f00); // loudspeaker volume + msp_writereg(av7110, MSP_WR_DSP, 0x000a, 0x0220); // SCART 1 source + msp_writereg(av7110, MSP_WR_DSP, 0x0007, 0x7f00); // SCART 1 volume + msp_writereg(av7110, MSP_WR_DSP, 0x000d, 0x4800); // prescale SCART if (i2c_writereg(av7110, 0x48, 0x01, 0x00)!=1) { INFO(("saa7113 not accessible.\n")); - } else { + } + else { + u8 *i = saa7113_init_regs; av7110->has_analog_tuner = 1; /* init the saa7113 */ - i2c_writereg(av7110, 0x48, 0x02, 0xd0); i2c_writereg(av7110, 0x48, 0x03, 0x23); i2c_writereg(av7110, 0x48, 0x04, 0x00); - i2c_writereg(av7110, 0x48, 0x05, 0x00); i2c_writereg(av7110, 0x48, 0x06, 0xe9); i2c_writereg(av7110, 0x48, 0x07, 0x0d); - i2c_writereg(av7110, 0x48, 0x08, 0x98); i2c_writereg(av7110, 0x48, 0x09, 0x02); i2c_writereg(av7110, 0x48, 0x0a, 0x80); - i2c_writereg(av7110, 0x48, 0x0b, 0x40); i2c_writereg(av7110, 0x48, 0x0c, 0x40); i2c_writereg(av7110, 0x48, 0x0d, 0x00); - i2c_writereg(av7110, 0x48, 0x0e, 0x01); i2c_writereg(av7110, 0x48, 0x0f, 0x7c); i2c_writereg(av7110, 0x48, 0x10, 0x48); - i2c_writereg(av7110, 0x48, 0x11, 0x0c); i2c_writereg(av7110, 0x48, 0x12, 0x8b); i2c_writereg(av7110, 0x48, 0x13, 0x10); - i2c_writereg(av7110, 0x48, 0x14, 0x00); i2c_writereg(av7110, 0x48, 0x15, 0x00); i2c_writereg(av7110, 0x48, 0x16, 0x00); - i2c_writereg(av7110, 0x48, 0x17, 0x00); i2c_writereg(av7110, 0x48, 0x18, 0x00); i2c_writereg(av7110, 0x48, 0x19, 0x00); - i2c_writereg(av7110, 0x48, 0x1a, 0x00); i2c_writereg(av7110, 0x48, 0x1b, 0x00); i2c_writereg(av7110, 0x48, 0x1c, 0x00); - i2c_writereg(av7110, 0x48, 0x1d, 0x00); i2c_writereg(av7110, 0x48, 0x1e, 0x00); + while (*i != 0xff) { + if (i2c_writereg(av7110, 0x48, i[0], i[1]) != 1) { + printk("av7110(%d): saa7113 initialization failed", + av7110->dvb_adapter->num); + break; + } + i += 2; + } + /* setup msp for analog sound: B/G Dual-FM */ + msp_writereg(av7110, MSP_WR_DEM, 0x00bb, 0x02d0); // AD_CV + msp_writereg(av7110, MSP_WR_DEM, 0x0001, 3); // FIR1 + msp_writereg(av7110, MSP_WR_DEM, 0x0001, 18); // FIR1 + msp_writereg(av7110, MSP_WR_DEM, 0x0001, 27); // FIR1 + msp_writereg(av7110, MSP_WR_DEM, 0x0001, 48); // FIR1 + msp_writereg(av7110, MSP_WR_DEM, 0x0001, 66); // FIR1 + msp_writereg(av7110, MSP_WR_DEM, 0x0001, 72); // FIR1 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 4); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 64); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 0); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 3); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 18); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 27); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 48); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 66); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0005, 72); // FIR2 + msp_writereg(av7110, MSP_WR_DEM, 0x0083, 0xa000); // MODE_REG + msp_writereg(av7110, MSP_WR_DEM, 0x0093, 0x00aa); // DCO1_LO 5.74MHz + msp_writereg(av7110, MSP_WR_DEM, 0x009b, 0x04fc); // DCO1_HI + msp_writereg(av7110, MSP_WR_DEM, 0x00a3, 0x038e); // DCO2_LO 5.5MHz + msp_writereg(av7110, MSP_WR_DEM, 0x00ab, 0x04c6); // DCO2_HI + msp_writereg(av7110, MSP_WR_DEM, 0x0056, 0); // LOAD_REG 1/2 } memcpy(standard,dvb_standard,sizeof(struct saa7146_standard)*2); @@ -4527,13 +4729,13 @@ saa7146_write(dev, DD1_STREAM_B, 0x00000000); saa7146_write(dev, DD1_INIT, 0x0200700); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); - - - } else if (dev->pci->subsystem_vendor == 0x110a) { + } + else if (dev->pci->subsystem_vendor == 0x110a) { printk("av7110(%d): DVB-C w/o analog module detected\n", av7110->dvb_adapter->num); av7110->adac_type = DVB_ADAC_NONE; - } else { + } + else { av7110->adac_type = adac; printk("av7110(%d): adac type set to %d\n", av7110->dvb_adapter->num, av7110->adac_type); @@ -4561,7 +4763,7 @@ kfree(av7110); /* FIXME: error handling is pretty bogus: memory does not get freed...*/ - saa7146_unregister_device(&av7110->vd, dev); + saa7146_unregister_device(&av7110->v4l_dev, dev); saa7146_vv_release(dev); dvb_unregister_i2c_bus (master_xfer,av7110->i2c_bus->adapter, @@ -4577,7 +4779,7 @@ struct av7110 *av7110 = (struct av7110*)saa->ext_priv; DEB_EE(("av7110: %p\n",av7110)); - saa7146_unregister_device(&av7110->vd, saa); + saa7146_unregister_device(&av7110->v4l_dev, saa); av7110->arm_rmmod=1; wake_up_interruptible(&av7110->arm_wait); @@ -4616,7 +4818,7 @@ { struct av7110 *av7110 = (struct av7110*)dev->ext_priv; - DEB_EE(("dev: %p, av7110: %p\n",dev,av7110)); + DEB_INT(("dev: %p, av7110: %p\n",dev,av7110)); if (*isr & MASK_19) tasklet_schedule (&av7110->debi_tasklet); @@ -4629,19 +4831,45 @@ /* FIXME: these values are experimental values that look better than the values from the latest "official" driver -- at least for me... (MiHu) */ static struct saa7146_standard standard[] = { - { "PAL", V4L2_STD_PAL, 0x15, 288, 576, 0x4a, 708, 709, 576, 768 }, -// { "PAL", V4L2_STD_PAL, 0x15, 288, 576, 0x3a, 720, 721, 576, 768 }, - { "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 }, + { + .name = "PAL", .id = V4L2_STD_PAL_BG, + .v_offset = 0x15, .v_field = 288, .v_calc = 576, + .h_offset = 0x4a, .h_pixels = 708, .h_calc = 709, + .v_max_out = 576, .h_max_out = 768, + }, { + .name = "NTSC", .id = V4L2_STD_NTSC, + .v_offset = 0x10, .v_field = 244, .v_calc = 480, + .h_offset = 0x40, .h_pixels = 708, .h_calc = 709, + .v_max_out = 480, .h_max_out = 640, + } }; static struct saa7146_standard analog_standard[] = { - { "PAL", V4L2_STD_PAL, 0x18, 288, 576, 0x08, 708, 709, 576, 768 }, - { "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 }, + { + .name = "PAL", .id = V4L2_STD_PAL_BG, + .v_offset = 0x18, .v_field = 288, .v_calc = 576, + .h_offset = 0x08, .h_pixels = 708, .h_calc = 709, + .v_max_out = 576, .h_max_out = 768, + }, { + .name = "NTSC", .id = V4L2_STD_NTSC, + .v_offset = 0x10, .v_field = 244, .v_calc = 480, + .h_offset = 0x40, .h_pixels = 708, .h_calc = 709, + .v_max_out = 480, .h_max_out = 640, + } }; static struct saa7146_standard dvb_standard[] = { - { "PAL", V4L2_STD_PAL, 0x14, 288, 576, 0x4a, 708, 709, 576, 768 }, - { "NTSC", V4L2_STD_NTSC, 0x10, 244, 480, 0x40, 708, 709, 480, 640 }, + { + .name = "PAL", .id = V4L2_STD_PAL_BG, + .v_offset = 0x14, .v_field = 288, .v_calc = 576, + .h_offset = 0x4a, .h_pixels = 708, .h_calc = 709, + .v_max_out = 576, .h_max_out = 768, + }, { + .name = "NTSC", .id = V4L2_STD_NTSC, + .v_offset = 0x10, .v_field = 244, .v_calc = 480, + .h_offset = 0x40, .h_pixels = 708, .h_calc = 709, + .v_max_out = 480, .h_max_out = 640, + } }; static struct saa7146_extension av7110_extension; @@ -4660,6 +4888,7 @@ MAKE_AV7110_INFO(unkwn1, "Technotrend/Hauppauge PCI rev?(unknown1)?"); MAKE_AV7110_INFO(unkwn2, "Technotrend/Hauppauge PCI rev?(unknown2)?"); MAKE_AV7110_INFO(nexus, "Technotrend/Hauppauge Nexus PCI DVB-S"); +MAKE_AV7110_INFO(dvboc11,"Octal/Technotrend DVB-C for iTV"); static struct pci_device_id pci_tbl[] = { MAKE_EXTENSION_PCI(fs_1_5, 0x110a, 0xffff), @@ -4676,6 +4905,7 @@ MAKE_EXTENSION_PCI(unkwn1, 0xffc2, 0x0000), MAKE_EXTENSION_PCI(unkwn2, 0x00a1, 0x00a1), MAKE_EXTENSION_PCI(nexus, 0x00a1, 0xa1a0), + MAKE_EXTENSION_PCI(dvboc11,0x13c2, 0x000a), { .vendor = 0, } @@ -4745,12 +4975,19 @@ static int __init av7110_init(void) { - if (saa7146_register_extension(&av7110_extension)) - return -ENODEV; + int retval; + retval = saa7146_register_extension(&av7110_extension); + if (retval) + goto failed_saa7146_register; - av7110_ir_init(); - + retval = av7110_ir_init(); + if (retval) + goto failed_av7110_ir_init; return 0; +failed_av7110_ir_init: + saa7146_unregister_extension(&av7110_extension); +failed_saa7146_register: + return retval; } diff -Nru a/drivers/media/dvb/ttpci/av7110.h b/drivers/media/dvb/ttpci/av7110.h --- a/drivers/media/dvb/ttpci/av7110.h Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/ttpci/av7110.h Wed Oct 8 12:24:55 2003 @@ -399,7 +399,7 @@ struct dvb_device dvb_dev; struct dvb_net dvb_net; - struct video_device vd; + struct video_device v4l_dev; struct saa7146_dev *dev; diff -Nru a/drivers/media/dvb/ttpci/av7110_firm.h b/drivers/media/dvb/ttpci/av7110_firm.h --- a/drivers/media/dvb/ttpci/av7110_firm.h Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/ttpci/av7110_firm.h Wed Oct 8 12:24:55 2003 @@ -1,13 +1,13 @@ -#include +#include u8 Dpram [] __initdata = { 0xe5, 0x9f, 0xf0, 0x1c, 0xe1, 0xb0, 0xf0, 0x0e, 0xe5, 0x9f, 0xf0, 0x18, 0xe2, 0x5e, 0xf0, 0x04, 0xe2, 0x5e, 0xf0, 0x08, 0xe1, 0xa0, 0x00, 0x00, 0xea, 0x00, 0x00, 0x06, 0xe2, 0x5e, 0xf0, 0x04, - 0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0x55, 0x6c, - 0x2e, 0x01, 0xc3, 0xe0, 0xa5, 0xa5, 0x5a, 0x5a, + 0x2c, 0x00, 0x00, 0xe8, 0x2e, 0x02, 0x5c, 0xcc, + 0x2e, 0x01, 0xcb, 0x40, 0xa5, 0xa5, 0x5a, 0x5a, 0x00, 0x1f, 0x15, 0x55, 0x00, 0x00, 0x00, 0x09, 0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, 0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, @@ -29,9 +29,9 @@ 0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, 0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, - 0x2e, 0x08, 0x3a, 0xfc, 0x66, 0x00, 0x00, 0x14, + 0x2e, 0x08, 0x3a, 0xf4, 0x66, 0x00, 0x00, 0x14, 0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, - 0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0x56, 0x74, + 0x00, 0x00, 0x00, 0x0c, 0x2e, 0x02, 0x5d, 0xd4, 0x2c, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -54,16 +54,16 @@ 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 0x49, 0x13, 0x18, 0x09, 0x4a, 0x13, 0x60, 0x11, 0x49, 0x13, 0x18, 0x08, 0x49, 0x13, 0x60, 0x08, - 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x01, 0xc0, 0xa8, - 0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x01, 0xc1, 0xa8, - 0x2e, 0x01, 0xc0, 0xf8, 0x2e, 0x01, 0xc2, 0xc8, - 0x2e, 0x01, 0xc1, 0x30, 0x2e, 0x01, 0xc2, 0xcc, - 0x2e, 0x01, 0xc1, 0x4c, 0x2e, 0x01, 0xc2, 0xd0, - 0x2e, 0x01, 0xc0, 0xf8, 0x2e, 0x01, 0xc2, 0xd4, - 0x2e, 0x01, 0xc1, 0x14, 0x2e, 0x01, 0xc2, 0xd8, - 0x2e, 0x01, 0xc1, 0x4c, 0x2e, 0x01, 0xc2, 0xdc, - 0x2e, 0x01, 0xc1, 0x30, 0x2e, 0x01, 0xc2, 0xe0, - 0x2e, 0x01, 0xc0, 0xa8, 0x2e, 0x01, 0xc2, 0xe4, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x01, 0xc8, 0x08, + 0x9e, 0x00, 0x0a, 0x00, 0x2e, 0x01, 0xc9, 0x08, + 0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x28, + 0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x2c, + 0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x30, + 0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xca, 0x34, + 0x2e, 0x01, 0xc8, 0x74, 0x2e, 0x01, 0xca, 0x38, + 0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xca, 0x3c, + 0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xca, 0x40, + 0x2e, 0x01, 0xc8, 0x08, 0x2e, 0x01, 0xca, 0x44, 0xb5, 0xf0, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x07, 0xb0, 0x82, 0x2a, 0x00, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x0e, 0x38, @@ -77,7 +77,7 @@ 0x88, 0x38, 0x80, 0x20, 0x34, 0x02, 0x3d, 0x02, 0x37, 0x02, 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 0xd0, 0x08, 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, - 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x17, 0xff, 0xdc, + 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x6a, 0x19, 0x7f, 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x54, 0x68, 0x38, 0x90, 0x00, 0x46, 0x6f, 0x78, 0x38, 0x70, 0x20, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, @@ -91,7 +91,7 @@ 0x07, 0xb8, 0xd0, 0x01, 0x2d, 0x00, 0xdc, 0xe6, 0x07, 0xae, 0x0f, 0xb6, 0x1b, 0xad, 0xd0, 0x06, 0x9b, 0x01, 0x68, 0x1b, 0x1c, 0x38, 0x1c, 0x21, - 0x1c, 0x2a, 0xf0, 0x17, 0xff, 0xa5, 0x19, 0x7f, + 0x1c, 0x2a, 0xf0, 0x18, 0xfb, 0x33, 0x19, 0x7f, 0x19, 0x64, 0x2e, 0x00, 0xd0, 0x1d, 0x08, 0x60, 0xd3, 0x08, 0x1e, 0x60, 0x88, 0x01, 0x23, 0xff, 0x02, 0x1b, 0x40, 0x19, 0x78, 0x3a, 0x43, 0x11, @@ -99,20 +99,36 @@ 0x0e, 0x09, 0x78, 0x3a, 0x02, 0x12, 0x43, 0x11, 0x80, 0x21, 0x34, 0x01, 0x37, 0x01, 0x3e, 0x01, 0xd1, 0xe9, 0xe0, 0x06, 0x9b, 0x01, 0x68, 0x1b, - 0x1c, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x17, - 0xff, 0x83, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x1c, 0x38, 0x1c, 0x21, 0x1c, 0x2a, 0xf0, 0x18, + 0xfb, 0x11, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x48, - 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfb, 0xe2, + 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x03, 0xfc, 0x50, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x4f, 0x10, 0x89, 0x3c, 0x89, 0xbe, 0x8a, 0x3d, 0x23, 0x04, 0x43, 0xdb, 0x68, 0x78, 0x40, 0x18, 0x0c, 0x1a, 0x60, 0x78, 0xb4, 0x04, 0x1c, 0x13, 0x22, 0x00, - 0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x14, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x54, 0x20, 0x01, 0x60, 0x78, 0xb0, 0x01, 0x4a, 0x07, 0xb4, 0x04, 0x1c, 0x20, 0x1c, 0x31, 0x1c, 0x2a, - 0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x09, 0xb0, 0x01, + 0x4b, 0x04, 0xf0, 0x00, 0xf8, 0x49, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x1d, + 0x24, 0x10, 0x68, 0x3b, 0x2b, 0x00, 0xd1, 0x1a, + 0x28, 0x00, 0xd0, 0x18, 0x20, 0xa5, 0x01, 0xc0, + 0xf0, 0x05, 0xfb, 0x64, 0x60, 0x38, 0x8a, 0xbf, + 0x1c, 0x03, 0x2f, 0x00, 0xd0, 0x0c, 0x2b, 0x00, + 0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, + 0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d, 0x1c, 0x39, + 0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xc7, 0xb0, 0x03, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2b, 0x00, + 0xd0, 0xfa, 0x28, 0x00, 0xd1, 0xf8, 0x8a, 0xbd, + 0x2d, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00, + 0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x18, 0x22, 0x1d, + 0x1c, 0x29, 0x1c, 0x23, 0xf0, 0x0a, 0xfb, 0xb2, + 0xb0, 0x03, 0x68, 0x38, 0xf0, 0x05, 0xfb, 0x44, + 0x20, 0x00, 0x60, 0x38, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x00, 0xb5, 0xf0, 0x9f, 0x05, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0x04, 0x19, 0x0c, 0x09, 0xb0, 0x82, 0x91, 0x00, @@ -127,21 +143,21 @@ 0x68, 0x38, 0x90, 0x02, 0x28, 0x00, 0xd0, 0x1a, 0x2b, 0x00, 0xd0, 0x0a, 0x22, 0x00, 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07, 0x1c, 0x19, 0x23, 0x10, - 0x22, 0x1d, 0x98, 0x05, 0xf0, 0x0a, 0xf8, 0x1c, + 0x22, 0x1d, 0x98, 0x05, 0xf0, 0x0a, 0xfb, 0x6a, 0xb0, 0x03, 0x99, 0x01, 0x29, 0x00, 0xd0, 0x0a, 0x22, 0x01, 0x21, 0x00, 0x20, 0x1c, 0xb4, 0x07, 0x99, 0x04, 0x23, 0x10, 0x22, 0x1d, 0x68, 0x38, - 0xf0, 0x0a, 0xf8, 0x0e, 0xb0, 0x03, 0x99, 0x01, + 0xf0, 0x0a, 0xfb, 0x5c, 0xb0, 0x03, 0x99, 0x01, 0x82, 0xb9, 0x4b, 0x6d, 0x42, 0x9c, 0xd0, 0x37, 0xdc, 0x28, 0x2c, 0x00, 0xd0, 0x2e, 0x3b, 0x02, 0x42, 0x9c, 0xd0, 0x29, 0x4b, 0x69, 0x42, 0x9c, 0xd1, 0x00, 0x1c, 0x34, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x49, 0x62, 0x20, 0x1c, 0xf0, 0x0a, - 0xf9, 0x95, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, + 0xfc, 0xe3, 0x89, 0xb8, 0xb0, 0x01, 0x42, 0x85, 0xd1, 0x02, 0x89, 0x38, 0x42, 0x84, 0xd0, 0x44, - 0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x0a, 0xfc, 0xce, + 0x81, 0xbd, 0x20, 0x1f, 0xf0, 0x0b, 0xf8, 0x1c, 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, - 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0a, 0xfb, 0x46, + 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x0a, 0xfe, 0x94, 0x2d, 0x00, 0xd0, 0x33, 0x2d, 0x01, 0xd1, 0x11, 0x25, 0x00, 0xe0, 0x32, 0x4b, 0x55, 0x42, 0x9c, 0xd0, 0x04, 0x33, 0x01, 0x42, 0x9c, 0xd1, 0xd9, @@ -151,45 +167,45 @@ 0x20, 0x80, 0xe0, 0x00, 0x20, 0x00, 0x22, 0x00, 0xb4, 0x04, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 0x43, 0x02, 0x23, 0x01, 0x20, 0x1f, 0x1c, 0x29, - 0xf0, 0x0a, 0xf9, 0x5c, 0x23, 0x01, 0x02, 0x9b, + 0xf0, 0x0a, 0xfc, 0xaa, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, - 0xf0, 0x0a, 0xfb, 0x18, 0x21, 0x00, 0x20, 0x1f, - 0xf0, 0x0b, 0xf8, 0x0a, 0x20, 0x01, 0xf0, 0x0d, - 0xfb, 0xf9, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x0d, - 0xfb, 0xf5, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, + 0xf0, 0x0a, 0xfe, 0x66, 0x21, 0x00, 0x20, 0x1f, + 0xf0, 0x0b, 0xfb, 0x58, 0x20, 0x01, 0xf0, 0x0d, + 0xff, 0x47, 0xe0, 0x02, 0x20, 0x00, 0xf0, 0x0d, + 0xff, 0x43, 0x8a, 0x38, 0x42, 0x86, 0xd1, 0x02, 0x89, 0x39, 0x42, 0x8c, 0xd0, 0x52, 0x28, 0x00, - 0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x0d, 0xfd, 0x4c, - 0x20, 0x1e, 0xf0, 0x0a, 0xfd, 0x49, 0x23, 0x03, + 0xd0, 0x0d, 0x20, 0x03, 0xf0, 0x0e, 0xf8, 0x9a, + 0x20, 0x1e, 0xf0, 0x0b, 0xf8, 0x97, 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, - 0x20, 0x1e, 0xf0, 0x0a, 0xfa, 0xf7, 0x82, 0x3e, + 0x20, 0x1e, 0xf0, 0x0a, 0xfe, 0x45, 0x82, 0x3e, 0x2e, 0x00, 0xd0, 0x3f, 0x42, 0xb4, 0xd1, 0x02, 0x20, 0x80, 0x90, 0x00, 0xe0, 0x01, 0x20, 0x00, - 0x90, 0x00, 0xf0, 0x1b, 0xfd, 0xe7, 0x23, 0x01, - 0x04, 0x1b, 0x43, 0x18, 0xf0, 0x1b, 0xfd, 0xe6, - 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfa, 0x2a, + 0x90, 0x00, 0xf0, 0x1c, 0xf9, 0x57, 0x23, 0x01, + 0x04, 0x1b, 0x43, 0x18, 0xf0, 0x1c, 0xf9, 0x56, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0e, 0xfd, 0x78, 0x20, 0xff, 0x49, 0x29, 0x68, 0x09, 0x70, 0x08, 0x49, 0x28, 0x48, 0x29, 0x23, 0x1e, 0x22, 0x10, - 0xf0, 0x0e, 0xfb, 0x5e, 0x48, 0x27, 0x68, 0x00, + 0xf0, 0x0e, 0xfe, 0xac, 0x48, 0x27, 0x68, 0x00, 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, - 0xf0, 0x1b, 0xfd, 0xcc, 0x4b, 0x24, 0x40, 0x18, - 0xf0, 0x1b, 0xfd, 0xcc, 0x22, 0x00, 0xb4, 0x04, + 0xf0, 0x1c, 0xf9, 0x3c, 0x4b, 0x24, 0x40, 0x18, + 0xf0, 0x1c, 0xf9, 0x3c, 0x22, 0x00, 0xb4, 0x04, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x22, 0x02, 0x43, 0x02, 0x23, 0x02, 0x20, 0x1e, 0x1c, 0x31, - 0xf0, 0x0a, 0xf8, 0xfc, 0x23, 0x01, 0x02, 0x9b, + 0xf0, 0x0a, 0xfc, 0x4a, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, - 0xf0, 0x0a, 0xfa, 0xb8, 0x21, 0x00, 0x20, 0x1e, - 0xf0, 0x0a, 0xff, 0xaa, 0x42, 0xac, 0xd0, 0x13, + 0xf0, 0x0a, 0xfe, 0x06, 0x21, 0x00, 0x20, 0x1e, + 0xf0, 0x0b, 0xfa, 0xf8, 0x42, 0xac, 0xd0, 0x13, 0x42, 0xb4, 0xd0, 0x11, 0x2c, 0x00, 0xd0, 0x0f, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, - 0x20, 0x1c, 0xf0, 0x0a, 0xfa, 0xa7, 0x22, 0x00, + 0x20, 0x1c, 0xf0, 0x0a, 0xfd, 0xf5, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x22, 0x82, 0x20, 0x1c, - 0x1c, 0x21, 0xf0, 0x0a, 0xf8, 0xdb, 0xb0, 0x01, + 0x1c, 0x21, 0xf0, 0x0a, 0xfc, 0x29, 0xb0, 0x01, 0x81, 0x3c, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0xff, 0xfc, - 0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x47, 0x68, - 0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x08, 0x5e, 0x60, + 0x2e, 0x08, 0x5e, 0x2c, 0x2e, 0x08, 0x47, 0x60, + 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x5e, 0x58, 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0x22, 0x00, 0xb4, 0x04, 0x04, 0x01, 0x0c, 0x09, 0x23, 0x00, 0x4a, 0x03, 0x1e, 0x50, 0xf7, 0xff, 0xfe, 0xc0, @@ -201,13 +217,13 @@ 0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x0b, 0x28, 0x02, 0xd1, 0x02, 0x02, 0x00, 0xf0, 0x0d, - 0xfc, 0xa3, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x80, - 0xf0, 0x0d, 0xfc, 0x9e, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0xff, 0x30, 0x01, 0xf0, 0x0d, 0xfc, 0x98, + 0xff, 0xf1, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x80, + 0xf0, 0x0d, 0xff, 0xec, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0xff, 0x30, 0x01, 0xf0, 0x0d, 0xff, 0xe6, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, 0x27, 0x00, 0x4c, 0x1b, 0x20, 0x01, 0x04, 0x80, 0x21, 0x00, 0x22, 0x00, 0xc4, 0x86, 0xc4, 0x84, 0x3c, 0x14, - 0xf0, 0x05, 0xf9, 0x40, 0x61, 0x60, 0x28, 0x00, + 0xf0, 0x05, 0xf9, 0x70, 0x61, 0x60, 0x28, 0x00, 0xd0, 0x06, 0x21, 0x01, 0x04, 0x89, 0x61, 0xe1, 0x18, 0x41, 0x62, 0x20, 0x61, 0xa1, 0xe0, 0x02, 0x61, 0xe7, 0x61, 0xa7, 0x62, 0x27, 0x68, 0x21, @@ -219,10 +235,10 @@ 0x52, 0xa5, 0x00, 0x82, 0x50, 0xb9, 0x50, 0x99, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x78, - 0x2e, 0x08, 0x49, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x49, 0x38, 0x2e, 0x08, 0x49, 0xf0, - 0x2e, 0x08, 0x4a, 0x70, 0xb4, 0xf0, 0xb0, 0x81, + 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70, + 0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x49, 0xe8, + 0x2e, 0x08, 0x4a, 0x68, 0xb4, 0xf0, 0xb0, 0x81, 0x49, 0x25, 0xc9, 0x0c, 0x39, 0x08, 0x1a, 0xd2, 0x60, 0x8a, 0xd5, 0x02, 0x32, 0xff, 0x32, 0x01, 0x60, 0x8a, 0x6a, 0x0a, 0x62, 0x8a, 0x68, 0x8f, @@ -242,7 +258,7 @@ 0x42, 0xb2, 0xdb, 0x00, 0x62, 0x0c, 0x6a, 0x0a, 0x18, 0x10, 0x62, 0x08, 0x1c, 0x14, 0x1c, 0x20, 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x78, + 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x3b, 0x70, 0x48, 0x03, 0x6a, 0x81, 0x62, 0x01, 0x69, 0x01, 0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x1c, 0xb5, 0xf7, 0x04, 0x05, @@ -256,10 +272,10 @@ 0x29, 0x01, 0xd0, 0x02, 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xe9, 0x79, 0x81, 0x91, 0x00, 0x88, 0xa0, 0x08, 0x40, 0x07, 0x80, 0xd1, 0x02, 0x1c, 0x28, - 0xf0, 0x05, 0xfb, 0x98, 0x88, 0xa0, 0x23, 0x06, + 0xf0, 0x05, 0xfb, 0xca, 0x88, 0xa0, 0x23, 0x06, 0x40, 0x18, 0x28, 0x02, 0xd1, 0x09, 0x88, 0xe0, 0x99, 0x00, 0x42, 0x88, 0xd1, 0x05, 0x1c, 0x28, - 0xf0, 0x05, 0xfb, 0x8c, 0x20, 0xff, 0xb0, 0x01, + 0xf0, 0x05, 0xfb, 0xbe, 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xd1, 0x88, 0xe0, 0x4b, 0x10, 0x42, 0x98, 0xd1, 0x01, 0x99, 0x00, 0x80, 0xe1, 0x68, 0x39, 0x00, 0xc8, 0x4a, 0x0e, 0x52, 0x15, 0x18, 0x80, @@ -268,8 +284,8 @@ 0x42, 0x99, 0xd1, 0x00, 0x60, 0x38, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, 0x68, 0xfb, 0x42, 0x99, 0xdd, 0x00, 0x60, 0xf9, 0xb0, 0x01, 0xe7, 0xb2, - 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x47, 0x80, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x3b, 0x78, + 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x08, 0x47, 0x78, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x3b, 0x70, 0xb5, 0xf0, 0x20, 0xff, 0xb0, 0x82, 0x49, 0x33, 0x91, 0x01, 0x49, 0x33, 0x8e, 0x89, 0x29, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, @@ -282,10 +298,10 @@ 0x91, 0x00, 0x00, 0xa9, 0x4a, 0x25, 0x58, 0x56, 0x2e, 0x00, 0xd0, 0x07, 0x48, 0x24, 0x58, 0x43, 0x99, 0x00, 0x1c, 0x28, 0x1c, 0x22, 0xf0, 0x17, - 0xfc, 0xb1, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x29, + 0xff, 0xff, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x29, 0x06, 0xed, 0x0e, 0xed, 0x1c, 0xe0, 0x08, 0x82, 0x00, 0x92, 0x98, 0x00, 0x99, 0x01, 0x6a, 0xfb, - 0xf0, 0x17, 0xfc, 0x9e, 0x00, 0x68, 0x19, 0x40, + 0xf0, 0x17, 0xff, 0xec, 0x00, 0x68, 0x19, 0x40, 0x00, 0x80, 0x49, 0x1a, 0x18, 0x40, 0x88, 0x80, 0x21, 0x0c, 0x40, 0x01, 0x29, 0x0c, 0xd1, 0x04, 0x02, 0x29, 0x31, 0x02, 0x04, 0x09, 0x0c, 0x09, @@ -298,8 +314,8 @@ 0x30, 0x01, 0x60, 0x78, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x1c, - 0x2e, 0x08, 0x3b, 0x78, 0x2e, 0x08, 0x49, 0xf0, - 0x2e, 0x08, 0x4a, 0x70, 0x2e, 0x08, 0x47, 0x80, + 0x2e, 0x08, 0x3b, 0x70, 0x2e, 0x08, 0x49, 0xe8, + 0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x47, 0x78, 0xb4, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x4f, 0x14, 0x8e, 0xba, 0x2a, 0x00, 0xd0, 0x03, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0x47, 0x70, 0x1c, 0x05, @@ -319,7 +335,7 @@ 0x29, 0x00, 0xd1, 0xf7, 0x24, 0x00, 0x2f, 0xfe, 0xdd, 0x03, 0x27, 0xfe, 0x1d, 0xc1, 0x31, 0xd9, 0x77, 0xcc, 0x1c, 0x7a, 0x49, 0x08, 0xf7, 0xff, - 0xfc, 0x03, 0x20, 0x04, 0x85, 0x28, 0x1c, 0xf8, + 0xfb, 0xc3, 0x20, 0x04, 0x85, 0x28, 0x1c, 0xf8, 0x08, 0x80, 0x00, 0x80, 0x85, 0x68, 0x20, 0x0f, 0x02, 0x40, 0x86, 0xa8, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, @@ -353,7 +369,7 @@ 0x20, 0x00, 0x85, 0x90, 0x2f, 0x00, 0xd0, 0x0a, 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9f, 0xdc, 0x06, 0x1c, 0x3a, 0x48, 0x05, 0x4b, 0x05, 0x6a, 0xdb, - 0xf0, 0x17, 0xfb, 0x8e, 0x1c, 0x38, 0xbc, 0x80, + 0xf0, 0x17, 0xfe, 0xdc, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x00, 0x1c, 0xb5, 0xf0, 0xb0, 0x83, 0x49, 0x62, 0x8e, 0x88, @@ -378,7 +394,7 @@ 0xdd, 0x00, 0x1c, 0x1c, 0x68, 0x81, 0x89, 0xc0, 0x18, 0x08, 0x1c, 0xe1, 0x08, 0x8a, 0x00, 0x92, 0x49, 0x3e, 0x9b, 0x01, 0x6a, 0xdb, 0xf0, 0x17, - 0xfb, 0x2b, 0x88, 0x38, 0x02, 0x00, 0x30, 0x09, + 0xfe, 0x79, 0x88, 0x38, 0x02, 0x00, 0x30, 0x09, 0x49, 0x35, 0x85, 0x08, 0x85, 0x4c, 0x20, 0x01, 0x02, 0x40, 0x86, 0x88, 0x78, 0xf8, 0x00, 0xc0, 0x19, 0xc0, 0x89, 0xc1, 0x19, 0x09, 0x81, 0xc1, @@ -392,8 +408,8 @@ 0x42, 0x88, 0xd1, 0x3d, 0x79, 0x78, 0x21, 0x02, 0x40, 0x01, 0x29, 0x02, 0xd1, 0x1e, 0x70, 0xfc, 0x71, 0x3c, 0x71, 0x7c, 0x49, 0x22, 0x80, 0x39, - 0x6a, 0xb8, 0x68, 0x00, 0xf0, 0x04, 0xfe, 0x7c, - 0x6a, 0xb8, 0xf0, 0x04, 0xfe, 0x79, 0x20, 0x00, + 0x6a, 0xb8, 0x68, 0x00, 0xf0, 0x04, 0xfe, 0xac, + 0x6a, 0xb8, 0xf0, 0x04, 0xfe, 0xa9, 0x20, 0x00, 0x49, 0x1d, 0x00, 0x42, 0x18, 0x12, 0x01, 0x12, 0x5a, 0xaa, 0x42, 0x8a, 0xd1, 0x04, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, @@ -404,54 +420,59 @@ 0x6a, 0xb9, 0x72, 0x0c, 0x79, 0x79, 0x08, 0x49, 0x00, 0x49, 0x71, 0x79, 0x22, 0x04, 0x7b, 0x01, 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, - 0x6a, 0xbb, 0xf0, 0x09, 0xff, 0xb9, 0xb0, 0x02, + 0x6a, 0xbb, 0xf0, 0x0a, 0xfb, 0x07, 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xc0, - 0x2e, 0x08, 0x03, 0xbc, 0x2e, 0x08, 0x44, 0x70, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x03, 0xbc, + 0x2e, 0x08, 0x03, 0xb8, 0x2e, 0x08, 0x44, 0x68, 0x2e, 0x08, 0x00, 0x1c, 0x2c, 0x00, 0x02, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x4f, 0x0b, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x0f, 0x20, 0x2f, - 0x02, 0x80, 0xf0, 0x04, 0xfe, 0x57, 0x60, 0x38, + 0x02, 0x80, 0xf0, 0x04, 0xfe, 0x87, 0x60, 0x38, 0x20, 0x00, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x49, 0x07, 0x60, 0x08, 0x20, 0x2f, 0x02, 0x80, 0x49, 0x06, 0x60, 0x08, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x55, 0x30, - 0x2e, 0x02, 0x55, 0x38, 0x2e, 0x02, 0x55, 0x34, - 0x2e, 0x02, 0x55, 0x3c, 0x2e, 0x02, 0x55, 0x40, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90, + 0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94, + 0x2e, 0x02, 0x5c, 0x9c, 0x2e, 0x02, 0x5c, 0xa0, 0xb5, 0x80, 0x4f, 0x04, 0x68, 0x38, 0xf0, 0x04, - 0xfe, 0x43, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x55, 0x30, - 0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x34, 0x8e, 0x90, + 0xfe, 0x73, 0x20, 0x00, 0x60, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x02, 0x5c, 0x90, + 0xb5, 0xf0, 0xb0, 0x82, 0x4a, 0x36, 0x8e, 0x90, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x48, 0x31, 0x68, 0x01, - 0x4e, 0x31, 0x68, 0x30, 0x1a, 0x09, 0xd1, 0x03, + 0xbc, 0x08, 0x47, 0x18, 0x48, 0x33, 0x68, 0x01, + 0x4e, 0x33, 0x68, 0x30, 0x1a, 0x0f, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x29, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, - 0x18, 0xc9, 0x23, 0x2f, 0x01, 0x1b, 0x42, 0x99, - 0xda, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x4a, 0x25, 0x8e, 0xd2, 0x2a, 0x00, - 0xd0, 0x07, 0x23, 0xeb, 0x01, 0x1b, 0x42, 0x99, - 0xda, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x1f, 0xcf, 0x3f, 0xff, 0x3f, 0x72, - 0x4b, 0x20, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, - 0x21, 0x2f, 0x02, 0x89, 0x1a, 0x0c, 0x4d, 0x1e, - 0x49, 0x1e, 0x91, 0x01, 0x42, 0xa7, 0xdd, 0x14, - 0x1b, 0x3a, 0x92, 0x00, 0x99, 0x01, 0x68, 0x09, - 0x18, 0x08, 0x1c, 0x22, 0x49, 0x1a, 0x6b, 0x2b, - 0xf0, 0x17, 0xfa, 0x3a, 0x4b, 0x18, 0x18, 0xe1, - 0x98, 0x01, 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x2b, - 0xf0, 0x17, 0xfa, 0x32, 0x9a, 0x00, 0x60, 0x32, + 0x2f, 0x00, 0xda, 0x02, 0x23, 0x2f, 0x02, 0x9b, + 0x18, 0xff, 0x4c, 0x2e, 0x6b, 0xa1, 0x1c, 0x4a, + 0x49, 0x2d, 0x68, 0x09, 0x42, 0x8a, 0xd9, 0x13, + 0x23, 0x2f, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x4a, 0x23, 0x8e, 0xd2, 0x2a, 0x00, 0xd0, 0x07, + 0x23, 0xeb, 0x01, 0x1b, 0x42, 0x9f, 0xda, 0x03, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x63, 0xa1, 0x4b, 0x22, 0x42, 0x9f, 0xdd, 0x00, + 0x1c, 0x1f, 0x21, 0x2f, 0x02, 0x89, 0x1a, 0x0d, + 0x49, 0x1f, 0x91, 0x01, 0x42, 0xaf, 0xdd, 0x14, + 0x1b, 0x7a, 0x92, 0x00, 0x99, 0x01, 0x68, 0x09, + 0x18, 0x08, 0x1c, 0x2a, 0x49, 0x1b, 0x6b, 0x23, + 0xf0, 0x17, 0xfd, 0x84, 0x4b, 0x19, 0x18, 0xe9, + 0x98, 0x01, 0x9a, 0x00, 0x68, 0x00, 0x6b, 0x23, + 0xf0, 0x17, 0xfd, 0x7c, 0x9a, 0x00, 0x60, 0x32, 0xe0, 0x0e, 0x99, 0x01, 0x68, 0x09, 0x18, 0x08, - 0x1c, 0x3a, 0x49, 0x11, 0x6b, 0x2b, 0xf0, 0x17, - 0xfa, 0x27, 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, - 0x02, 0x80, 0xf0, 0x17, 0xfa, 0x2b, 0x60, 0x31, + 0x1c, 0x3a, 0x49, 0x12, 0x6b, 0x23, 0xf0, 0x17, + 0xfd, 0x71, 0x68, 0x30, 0x19, 0xc1, 0x20, 0x2f, + 0x02, 0x80, 0xf0, 0x17, 0xfd, 0x75, 0x60, 0x31, 0x20, 0x12, 0x4a, 0x05, 0x85, 0x10, 0x85, 0x57, 0x20, 0x01, 0x02, 0x40, 0x86, 0x90, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x02, 0x55, 0x38, - 0x2e, 0x02, 0x55, 0x34, 0x00, 0x00, 0x0f, 0x6c, - 0x2e, 0x08, 0x00, 0x1c, 0x2e, 0x02, 0x55, 0x30, - 0x2c, 0x00, 0x02, 0x00, 0x2a, 0x00, 0xd0, 0x05, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x02, 0x5c, 0x98, + 0x2e, 0x02, 0x5c, 0x94, 0x2e, 0x08, 0x00, 0x1c, + 0x2e, 0x08, 0x05, 0xb0, 0x00, 0x00, 0x0f, 0x6c, + 0x2e, 0x02, 0x5c, 0x90, 0x2c, 0x00, 0x02, 0x00, + 0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x49, 0x03, + 0x60, 0x08, 0x49, 0x03, 0x60, 0x08, 0x47, 0x70, + 0x2e, 0x02, 0x5c, 0x98, 0x2e, 0x02, 0x5c, 0x94, + 0x2e, 0x02, 0x5c, 0x9c, 0x2a, 0x00, 0xd0, 0x05, 0x78, 0x03, 0x70, 0x0b, 0x30, 0x01, 0x31, 0x01, 0x3a, 0x01, 0xd1, 0xf9, 0x47, 0x70, 0xb5, 0xf3, 0xb0, 0x83, 0x98, 0x03, 0x78, 0x40, 0x00, 0x80, @@ -467,15 +488,15 @@ 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xe7, 0xdc, 0x42, 0xac, 0xdb, 0x06, 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, - 0xf0, 0x17, 0xf9, 0xc6, 0xe0, 0x44, 0x2d, 0x00, + 0xf0, 0x17, 0xfd, 0x00, 0xe0, 0x44, 0x2d, 0x00, 0xdd, 0x42, 0x4b, 0x25, 0x93, 0x01, 0x99, 0x00, 0x42, 0x8f, 0xd9, 0x07, 0x9b, 0x02, 0x68, 0x18, 0x30, 0x01, 0x60, 0x18, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xe7, 0xc4, 0x42, 0xa5, 0xdd, 0x07, 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x22, - 0xf0, 0x17, 0xf9, 0xae, 0x68, 0x36, 0xe0, 0x05, + 0xf0, 0x17, 0xfc, 0xe8, 0x68, 0x36, 0xe0, 0x05, 0x9b, 0x02, 0x68, 0x5b, 0x1c, 0x39, 0x1c, 0x2a, - 0xf0, 0x17, 0xf9, 0xa6, 0x19, 0x3f, 0x1b, 0x2d, + 0xf0, 0x17, 0xfc, 0xe0, 0x19, 0x3f, 0x1b, 0x2d, 0x79, 0xb0, 0x19, 0x80, 0x9a, 0x03, 0x78, 0x52, 0x00, 0xd3, 0x1a, 0x9a, 0x00, 0x92, 0x9b, 0x01, 0x68, 0x1b, 0x18, 0xd2, 0x78, 0x92, 0x06, 0xd2, @@ -486,8 +507,8 @@ 0x2c, 0x00, 0xda, 0x03, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xe7, 0x90, 0x2d, 0x00, 0xdc, 0xbe, 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x8b, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x64, 0x2e, 0x08, 0x00, 0x58, - 0x2e, 0x08, 0x5d, 0xcc, 0xb4, 0xf0, 0x68, 0x42, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x00, 0x58, + 0x2e, 0x08, 0x5d, 0xc4, 0xb4, 0xf0, 0x68, 0x42, 0x68, 0x84, 0x1d, 0xe1, 0x31, 0xb7, 0x1c, 0x16, 0xb0, 0x81, 0x42, 0x91, 0xd9, 0x09, 0x78, 0x51, 0x07, 0x09, 0x0f, 0x09, 0x02, 0x09, 0x78, 0x92, @@ -516,14 +537,14 @@ 0x78, 0x0a, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, 0x78, 0x49, 0x43, 0x11, 0x31, 0x03, 0x04, 0x09, 0x0c, 0x09, 0x80, 0x41, 0xb0, 0x01, 0xbc, 0xf0, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4, 0x4a, 0x02, 0xc2, 0x03, 0x3a, 0x08, 0x20, 0x00, - 0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x78, + 0x60, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 0x48, 0x01, 0x68, 0x80, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x43, 0x78, 0x48, 0x01, 0x68, 0x80, - 0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x78, + 0x2e, 0x08, 0x43, 0x70, 0x48, 0x01, 0x68, 0x80, + 0x08, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 0x48, 0x02, 0x68, 0x81, 0x08, 0xc9, 0x68, 0x00, - 0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x78, + 0x18, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x43, 0x70, 0xb4, 0xf0, 0x1c, 0x03, 0x20, 0x00, 0xb0, 0x82, 0x49, 0x53, 0x91, 0x01, 0x68, 0x89, 0x18, 0xcf, 0x97, 0x00, 0x08, 0xca, 0x07, 0x4c, 0x0f, 0x64, @@ -567,63 +588,63 @@ 0x5c, 0x08, 0x21, 0x08, 0x1b, 0xc9, 0x40, 0xc8, 0x18, 0x80, 0x99, 0x01, 0x9f, 0x00, 0x60, 0x8f, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x43, 0x78, 0x2e, 0x08, 0x00, 0x60, + 0x2e, 0x08, 0x43, 0x70, 0x2e, 0x08, 0x00, 0x60, 0xb5, 0xb0, 0x1c, 0x07, 0x20, 0x00, 0x24, 0x00, 0x2f, 0x00, 0xdd, 0x09, 0x00, 0x85, 0x18, 0x2d, 0x00, 0x6d, 0x20, 0x04, 0xf7, 0xff, 0xff, 0x44, 0x19, 0x40, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x47, 0x70, 0xb5, 0xb0, 0x1c, 0x0c, 0x1c, 0x05, - 0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x1a, 0xff, 0xba, - 0x49, 0x25, 0x20, 0x0c, 0xf0, 0x1a, 0xff, 0x82, - 0xf0, 0x1a, 0xff, 0x78, 0x4b, 0x23, 0x40, 0x18, - 0xf0, 0x1a, 0xff, 0x78, 0xf0, 0x1a, 0xff, 0xe4, + 0x1c, 0x17, 0xb0, 0x90, 0xf0, 0x1b, 0xfb, 0x16, + 0x49, 0x25, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xde, + 0xf0, 0x1b, 0xfa, 0xd4, 0x4b, 0x23, 0x40, 0x18, + 0xf0, 0x1b, 0xfa, 0xd4, 0xf0, 0x1b, 0xfb, 0x40, 0x20, 0x10, 0x90, 0x0a, 0x20, 0xff, 0x90, 0x0b, 0xa8, 0x0f, 0x90, 0x0c, 0x20, 0x0c, 0x90, 0x0d, - 0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x0e, - 0xfd, 0x9b, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, + 0x48, 0x1d, 0x90, 0x0e, 0xa8, 0x0a, 0xf0, 0x0f, + 0xf8, 0xd5, 0xab, 0x07, 0x70, 0x1d, 0x94, 0x08, 0x72, 0x1f, 0x24, 0x00, 0xab, 0x09, 0x70, 0x5c, - 0x27, 0x00, 0x4d, 0x18, 0xf0, 0x0e, 0xfd, 0xfc, + 0x27, 0x00, 0x4d, 0x18, 0xf0, 0x0f, 0xf9, 0x36, 0x28, 0x00, 0xd0, 0x02, 0x37, 0x01, 0x42, 0xaf, - 0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x0e, - 0xfd, 0xfd, 0xf0, 0x0e, 0xfd, 0xf1, 0x28, 0x00, - 0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x0e, - 0xfd, 0x7f, 0xf0, 0x1a, 0xff, 0x83, 0x21, 0x00, - 0x20, 0x0c, 0xf0, 0x1a, 0xff, 0x4b, 0xf0, 0x1a, - 0xff, 0x41, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, - 0xf0, 0x1a, 0xff, 0x40, 0xf0, 0x1a, 0xff, 0xac, - 0x46, 0x68, 0xf0, 0x0e, 0xfd, 0xb9, 0x98, 0x04, + 0xdb, 0xf8, 0x20, 0x01, 0xa9, 0x07, 0xf0, 0x0f, + 0xf9, 0x37, 0xf0, 0x0f, 0xf9, 0x2b, 0x28, 0x00, + 0xd1, 0xfb, 0x94, 0x0b, 0xa8, 0x0a, 0xf0, 0x0f, + 0xf8, 0xb9, 0xf0, 0x1b, 0xfa, 0xdf, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0xa7, 0xf0, 0x1b, + 0xfa, 0x9d, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, + 0xf0, 0x1b, 0xfa, 0x9c, 0xf0, 0x1b, 0xfb, 0x08, + 0x46, 0x68, 0xf0, 0x0f, 0xf8, 0xf3, 0x98, 0x04, 0xb0, 0x10, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x00, 0x14, 0x9d, 0xff, 0xff, 0xf7, 0xff, + 0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, 0xb5, 0xff, 0x9e, 0x09, 0x1c, 0x04, 0x1c, 0x0d, - 0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x1a, 0xff, 0x5e, - 0x49, 0x31, 0x20, 0x0c, 0xf0, 0x1a, 0xff, 0x26, - 0xf0, 0x1a, 0xff, 0x1c, 0x4b, 0x2f, 0x40, 0x18, - 0xf0, 0x1a, 0xff, 0x1c, 0xf0, 0x1a, 0xff, 0x88, + 0x1c, 0x17, 0xb0, 0x93, 0xf0, 0x1b, 0xfa, 0xba, + 0x49, 0x31, 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x82, + 0xf0, 0x1b, 0xfa, 0x78, 0x4b, 0x2f, 0x40, 0x18, + 0xf0, 0x1b, 0xfa, 0x78, 0xf0, 0x1b, 0xfa, 0xe4, 0x20, 0x10, 0x90, 0x0d, 0x20, 0xff, 0x90, 0x0e, 0xa8, 0x12, 0x90, 0x0f, 0x20, 0x0c, 0x90, 0x10, - 0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x0e, - 0xfd, 0x3f, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08, + 0x48, 0x29, 0x90, 0x11, 0xa8, 0x0d, 0xf0, 0x0f, + 0xf8, 0x79, 0xab, 0x07, 0x70, 0x1c, 0x95, 0x08, 0x72, 0x1f, 0x20, 0xff, 0xab, 0x09, 0x70, 0x58, 0x1c, 0x60, 0x71, 0x18, 0x9b, 0x16, 0x93, 0x0b, 0xab, 0x0c, 0x70, 0x1e, 0x20, 0xff, 0x70, 0x58, - 0x24, 0x00, 0x4d, 0x20, 0xf0, 0x0e, 0xfd, 0x98, + 0x24, 0x00, 0x4d, 0x20, 0xf0, 0x0f, 0xf8, 0xd2, 0x28, 0x00, 0xd0, 0x02, 0x34, 0x01, 0x42, 0xac, 0xdb, 0xf8, 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, - 0xa9, 0x0a, 0xf0, 0x0e, 0xfd, 0x97, 0xe0, 0x03, - 0x20, 0x02, 0xa9, 0x07, 0xf0, 0x0e, 0xfd, 0x92, - 0xf0, 0x0e, 0xfd, 0x86, 0x28, 0x00, 0xd1, 0xfb, - 0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x0e, - 0xfd, 0x13, 0xf0, 0x1a, 0xff, 0x17, 0x21, 0x00, - 0x20, 0x0c, 0xf0, 0x1a, 0xfe, 0xdf, 0xf0, 0x1a, - 0xfe, 0xd5, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, - 0xf0, 0x1a, 0xfe, 0xd4, 0xf0, 0x1a, 0xff, 0x40, - 0x46, 0x68, 0xf0, 0x0e, 0xfd, 0x4d, 0x98, 0x01, + 0xa9, 0x0a, 0xf0, 0x0f, 0xf8, 0xd1, 0xe0, 0x03, + 0x20, 0x02, 0xa9, 0x07, 0xf0, 0x0f, 0xf8, 0xcc, + 0xf0, 0x0f, 0xf8, 0xc0, 0x28, 0x00, 0xd1, 0xfb, + 0x27, 0x00, 0x97, 0x0e, 0xa8, 0x0d, 0xf0, 0x0f, + 0xf8, 0x4d, 0xf0, 0x1b, 0xfa, 0x73, 0x21, 0x00, + 0x20, 0x0c, 0xf0, 0x1b, 0xfa, 0x3b, 0xf0, 0x1b, + 0xfa, 0x31, 0x23, 0x01, 0x02, 0xdb, 0x43, 0x18, + 0xf0, 0x1b, 0xfa, 0x30, 0xf0, 0x1b, 0xfa, 0x9c, + 0x46, 0x68, 0xf0, 0x0f, 0xf8, 0x87, 0x98, 0x01, 0x0a, 0x80, 0xd2, 0x05, 0x20, 0x01, 0xb0, 0x13, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, 0xb0, 0x13, 0xe7, 0xf8, 0x00, 0x00, - 0x2e, 0x00, 0x14, 0x9d, 0xff, 0xff, 0xf7, 0xff, + 0x2e, 0x00, 0x15, 0x45, 0xff, 0xff, 0xf7, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x27, 0x10, 0x1c, 0x01, 0x48, 0x04, 0x61, 0xc1, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x01, 0x48, 0x02, 0x60, 0x01, @@ -659,10 +680,10 @@ 0xd1, 0x0a, 0x69, 0xf9, 0x29, 0x00, 0xd0, 0x03, 0x61, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x61, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0xf0, 0x04, 0xf8, 0x90, 0x20, 0x00, 0x60, 0x38, + 0xf0, 0x04, 0xf8, 0xac, 0x20, 0x00, 0x60, 0x38, 0x69, 0xf8, 0x60, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x68, - 0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x43, 0x84, + 0x6e, 0x00, 0x17, 0x00, 0x2e, 0x08, 0x43, 0x7c, 0x2e, 0x08, 0x00, 0x68, 0xb5, 0xb0, 0x04, 0x0b, 0x0c, 0x1b, 0x04, 0x14, 0x0c, 0x24, 0x49, 0x14, 0x68, 0x0a, 0x2a, 0x00, 0xd0, 0x02, 0x68, 0x0a, @@ -673,65 +694,73 @@ 0xdb, 0xf9, 0x76, 0x0c, 0x20, 0xff, 0x18, 0xfa, 0x70, 0x50, 0x20, 0x00, 0x60, 0x4b, 0x22, 0x20, 0x61, 0x08, 0x61, 0x4a, 0x60, 0x88, 0x60, 0xc8, - 0x49, 0x05, 0x20, 0x32, 0xf0, 0x04, 0xf8, 0x2c, + 0x49, 0x05, 0x20, 0x32, 0xf0, 0x04, 0xf8, 0x48, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x43, 0x84, - 0x2e, 0x00, 0x16, 0x59, 0xb5, 0x80, 0x04, 0x01, + 0x2e, 0x08, 0x01, 0x68, 0x2e, 0x08, 0x43, 0x7c, + 0x2e, 0x00, 0x17, 0x01, 0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x22, 0x00, 0xb0, 0x88, 0x00, 0x47, 0x46, 0x6b, 0x53, 0xda, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, 0x22, 0x80, 0x00, 0x43, 0x46, 0x68, 0x52, 0xc2, 0x46, 0x6a, 0x1c, 0x08, 0x21, 0x05, 0xf0, 0x04, - 0xfa, 0xf9, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42, + 0xfb, 0x17, 0x49, 0x06, 0x80, 0x88, 0x00, 0x42, 0x18, 0x12, 0x00, 0x92, 0x4b, 0x04, 0x5a, 0x9a, 0x81, 0x0a, 0xb0, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x88, - 0x2e, 0x08, 0x47, 0x80, 0xb5, 0xf0, 0xb0, 0xb3, - 0xa8, 0x01, 0xf0, 0x0f, 0xfa, 0x8f, 0x48, 0x51, - 0x68, 0x06, 0x68, 0x45, 0x68, 0x84, 0x68, 0xc7, - 0x69, 0x00, 0x90, 0x00, 0x1c, 0x30, 0x1c, 0x29, - 0x1c, 0x3a, 0xf0, 0x00, 0xfa, 0x9b, 0x1c, 0x20, - 0xf0, 0x00, 0xfb, 0xb6, 0xa0, 0x4a, 0x22, 0x00, - 0x21, 0x11, 0xf0, 0x04, 0xff, 0xc5, 0x22, 0x0a, - 0x21, 0x11, 0x98, 0x1b, 0xf0, 0x05, 0xf8, 0x22, - 0x22, 0x14, 0x21, 0x11, 0x1c, 0x30, 0xf0, 0x05, - 0xf8, 0x1d, 0x22, 0x1e, 0x21, 0x11, 0x1c, 0x28, - 0xf0, 0x05, 0xf8, 0x18, 0x22, 0x28, 0x21, 0x11, - 0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x13, 0x22, 0x32, - 0x21, 0x11, 0x1c, 0x38, 0xf0, 0x05, 0xf8, 0x0e, - 0x22, 0x3c, 0x21, 0x11, 0x98, 0x00, 0xf0, 0x05, - 0xf8, 0x09, 0xa0, 0x3b, 0x22, 0x00, 0x21, 0x13, - 0xf0, 0x04, 0xff, 0xa2, 0x22, 0x0a, 0x21, 0x13, - 0x4f, 0x39, 0x8d, 0x78, 0xf0, 0x04, 0xff, 0xfe, - 0xa0, 0x38, 0x22, 0x14, 0x21, 0x13, 0xf0, 0x04, - 0xff, 0x97, 0x22, 0x1e, 0x21, 0x13, 0x8d, 0xf8, - 0xf0, 0x04, 0xff, 0xf4, 0xa0, 0x35, 0x22, 0x00, - 0x21, 0x14, 0xf0, 0x04, 0xff, 0x8d, 0x22, 0x0a, - 0x21, 0x14, 0x8e, 0xb8, 0xf0, 0x04, 0xff, 0xea, - 0xa0, 0x32, 0x22, 0x14, 0x21, 0x14, 0xf0, 0x04, - 0xff, 0x83, 0x22, 0x1e, 0x21, 0x14, 0x8e, 0xf8, - 0xf0, 0x04, 0xff, 0xe0, 0xa0, 0x2f, 0x22, 0x28, - 0x21, 0x14, 0xf0, 0x04, 0xff, 0x79, 0x22, 0x32, - 0x21, 0x14, 0x48, 0x2f, 0x6f, 0xc0, 0xf0, 0x04, - 0xff, 0xd5, 0xa0, 0x2e, 0x22, 0x00, 0x21, 0x15, - 0xf0, 0x04, 0xff, 0x6e, 0x22, 0x0a, 0x21, 0x15, - 0x8d, 0x38, 0xf0, 0x04, 0xff, 0xcb, 0xa0, 0x2c, - 0x22, 0x14, 0x21, 0x15, 0xf0, 0x04, 0xff, 0x64, - 0x22, 0x1e, 0x21, 0x15, 0x8d, 0xb8, 0xf0, 0x04, - 0xff, 0xc1, 0xa0, 0x2a, 0x22, 0x00, 0x21, 0x10, - 0xf0, 0x04, 0xff, 0x5a, 0xf0, 0x0f, 0xfb, 0xd8, - 0x22, 0x0a, 0x21, 0x10, 0xf0, 0x04, 0xff, 0xb6, - 0xa0, 0x26, 0x22, 0x14, 0x21, 0x10, 0xf0, 0x04, - 0xff, 0x4f, 0x22, 0x1e, 0x21, 0x10, 0x27, 0x33, - 0x06, 0x7f, 0x6d, 0x78, 0xf0, 0x04, 0xff, 0xaa, - 0xa0, 0x22, 0x22, 0x28, 0x21, 0x10, 0xf0, 0x04, - 0xff, 0x43, 0xf0, 0x0f, 0xfb, 0xc1, 0x6d, 0x79, - 0x1a, 0x08, 0x22, 0x32, 0x21, 0x10, 0xf0, 0x04, - 0xff, 0x9d, 0xb0, 0x33, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x0c, 0x00, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x3a, 0x00, 0x00, - 0x72, 0x78, 0x6c, 0x65, 0x6e, 0x3a, 0x00, 0x00, - 0x2c, 0x00, 0x1f, 0xc0, 0x74, 0x78, 0x6c, 0x65, + 0x2e, 0x08, 0x47, 0x78, 0xb5, 0xf0, 0xb0, 0xb3, + 0xa8, 0x01, 0xf0, 0x0f, 0xfd, 0xc9, 0x49, 0x61, + 0x68, 0x0f, 0x68, 0x4d, 0x68, 0x8c, 0x03, 0x20, + 0x05, 0x2a, 0x0d, 0x12, 0x43, 0x10, 0x04, 0x00, + 0x0c, 0x00, 0x4b, 0x5d, 0x8e, 0x9a, 0x2a, 0x00, + 0xd1, 0x16, 0x89, 0xda, 0x42, 0x90, 0xd0, 0x01, + 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, 0x89, 0x9e, + 0x42, 0xb7, 0xd0, 0x01, 0x26, 0x01, 0xe0, 0x00, + 0x26, 0x00, 0x43, 0x32, 0xd0, 0x08, 0x81, 0x9f, + 0x81, 0xd8, 0x20, 0x00, 0x85, 0x58, 0x20, 0x0d, + 0x85, 0x18, 0x20, 0x01, 0x02, 0x40, 0x86, 0x98, + 0x68, 0xce, 0x69, 0x08, 0x90, 0x00, 0x1c, 0x38, + 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x00, 0xfa, 0x72, + 0x1c, 0x20, 0xf0, 0x00, 0xfb, 0x8d, 0xa0, 0x4b, + 0x22, 0x00, 0x21, 0x11, 0xf0, 0x04, 0xff, 0xc2, + 0x22, 0x0a, 0x21, 0x11, 0x98, 0x1b, 0xf0, 0x05, + 0xf8, 0x1f, 0x22, 0x14, 0x21, 0x11, 0x1c, 0x38, + 0xf0, 0x05, 0xf8, 0x1a, 0x22, 0x1e, 0x21, 0x11, + 0x1c, 0x28, 0xf0, 0x05, 0xf8, 0x15, 0x22, 0x28, + 0x21, 0x11, 0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x10, + 0x22, 0x32, 0x21, 0x11, 0x1c, 0x30, 0xf0, 0x05, + 0xf8, 0x0b, 0x22, 0x3c, 0x21, 0x11, 0x98, 0x00, + 0xf0, 0x05, 0xf8, 0x06, 0xa0, 0x3b, 0x22, 0x00, + 0x21, 0x13, 0xf0, 0x04, 0xff, 0x9f, 0x22, 0x0a, + 0x21, 0x13, 0x4f, 0x35, 0x8d, 0x78, 0xf0, 0x04, + 0xff, 0xfb, 0xa0, 0x38, 0x22, 0x14, 0x21, 0x13, + 0xf0, 0x04, 0xff, 0x94, 0x22, 0x1e, 0x21, 0x13, + 0x8d, 0xf8, 0xf0, 0x04, 0xff, 0xf1, 0xa0, 0x35, + 0x22, 0x00, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x8a, + 0x22, 0x0a, 0x21, 0x14, 0x8e, 0xb8, 0xf0, 0x04, + 0xff, 0xe7, 0xa0, 0x32, 0x22, 0x14, 0x21, 0x14, + 0xf0, 0x04, 0xff, 0x80, 0x22, 0x1e, 0x21, 0x14, + 0x8e, 0xf8, 0xf0, 0x04, 0xff, 0xdd, 0xa0, 0x2f, + 0x22, 0x28, 0x21, 0x14, 0xf0, 0x04, 0xff, 0x76, + 0x22, 0x32, 0x21, 0x14, 0x48, 0x2e, 0x6f, 0xc0, + 0xf0, 0x04, 0xff, 0xd2, 0xa0, 0x2d, 0x22, 0x00, + 0x21, 0x15, 0xf0, 0x04, 0xff, 0x6b, 0x22, 0x0a, + 0x21, 0x15, 0x8d, 0x38, 0xf0, 0x04, 0xff, 0xc8, + 0xa0, 0x2b, 0x22, 0x14, 0x21, 0x15, 0xf0, 0x04, + 0xff, 0x61, 0x22, 0x1e, 0x21, 0x15, 0x8d, 0xb8, + 0xf0, 0x04, 0xff, 0xbe, 0xa0, 0x29, 0x22, 0x00, + 0x21, 0x10, 0xf0, 0x04, 0xff, 0x57, 0xf0, 0x0f, + 0xfe, 0xf1, 0x22, 0x0a, 0x21, 0x10, 0xf0, 0x04, + 0xff, 0xb3, 0xa0, 0x26, 0x22, 0x14, 0x21, 0x10, + 0xf0, 0x04, 0xff, 0x4c, 0x22, 0x1e, 0x21, 0x10, + 0x27, 0x33, 0x06, 0x7f, 0x6d, 0x78, 0xf0, 0x04, + 0xff, 0xa7, 0xa0, 0x22, 0x22, 0x28, 0x21, 0x10, + 0xf0, 0x04, 0xff, 0x40, 0xf0, 0x0f, 0xfe, 0xda, + 0x6d, 0x79, 0x1a, 0x08, 0x22, 0x32, 0x21, 0x10, + 0xf0, 0x04, 0xff, 0x9a, 0xb0, 0x33, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0c, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x6c, 0x65, + 0x6e, 0x3a, 0x00, 0x00, 0x74, 0x78, 0x6c, 0x65, 0x6e, 0x3a, 0x00, 0x00, 0x72, 0x78, 0x62, 0x75, 0x66, 0x66, 0x3a, 0x00, 0x74, 0x78, 0x62, 0x75, 0x66, 0x66, 0x3a, 0x00, 0x69, 0x66, 0x5f, 0x75, @@ -742,122 +771,112 @@ 0x00, 0x00, 0x00, 0x00, 0x65, 0x6e, 0x64, 0x63, 0x75, 0x72, 0x3a, 0x00, 0x76, 0x69, 0x64, 0x62, 0x75, 0x66, 0x3a, 0x00, 0x6f, 0x73, 0x64, 0x3a, - 0x00, 0x00, 0x00, 0x00, 0xb5, 0x00, 0x06, 0x00, - 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, 0xf0, 0x09, - 0xfe, 0xa1, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, - 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, 0x0e, 0x09, - 0x4b, 0x04, 0x68, 0x1b, 0x06, 0x1b, 0x0e, 0x1b, - 0x2b, 0x30, 0xd3, 0x01, 0xf0, 0x09, 0xfe, 0x92, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc0, - 0xb5, 0xf0, 0x25, 0x00, 0x4e, 0x1a, 0x4c, 0x1b, - 0x4f, 0x1b, 0x68, 0x30, 0x68, 0x00, 0x00, 0x40, - 0x0a, 0x40, 0x02, 0x40, 0x21, 0x19, 0x06, 0x89, - 0x6a, 0x89, 0x4b, 0x18, 0x40, 0x19, 0x0a, 0x49, - 0x43, 0x08, 0x49, 0x17, 0x64, 0x08, 0xf0, 0x01, - 0xfc, 0x65, 0xf0, 0x02, 0xf9, 0x4d, 0x68, 0x38, - 0x30, 0x01, 0x60, 0x38, 0x48, 0x13, 0x88, 0x01, - 0x31, 0x01, 0x80, 0x01, 0x20, 0x0c, 0x68, 0x21, - 0xf0, 0x16, 0xfd, 0x6a, 0x29, 0x00, 0xd1, 0x01, - 0xf7, 0xff, 0xfe, 0xe0, 0x20, 0x32, 0x68, 0x21, - 0xf0, 0x16, 0xfd, 0x62, 0x4b, 0x0c, 0x42, 0x98, - 0xd9, 0x01, 0x49, 0x0c, 0x60, 0xf9, 0x42, 0x85, - 0xd0, 0xd3, 0x1c, 0x05, 0xf0, 0x00, 0xfe, 0x42, - 0x20, 0x00, 0x60, 0x38, 0xe7, 0xcd, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x05, 0xc0, - 0x2e, 0x08, 0x01, 0x88, 0x00, 0x03, 0xfe, 0x00, - 0x2c, 0x00, 0x1f, 0x80, 0x2c, 0x00, 0x1f, 0xc8, - 0x00, 0x00, 0x05, 0x46, 0x2e, 0x00, 0x19, 0xfb, - 0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x94, 0x46, 0x68, - 0x4c, 0x2f, 0xcc, 0x6e, 0xc0, 0x6e, 0xcc, 0x6e, - 0xc0, 0x6e, 0x23, 0x28, 0x22, 0x41, 0x00, 0xd2, - 0x21, 0x00, 0x20, 0x01, 0xf0, 0x07, 0xfe, 0xd8, - 0x22, 0xff, 0x21, 0x64, 0x20, 0x01, 0x32, 0xf5, - 0xf0, 0x07, 0xff, 0x9a, 0x20, 0x00, 0x46, 0x69, - 0x5c, 0x09, 0x40, 0x41, 0x23, 0x35, 0x40, 0x59, - 0xaa, 0x0a, 0x54, 0x11, 0x30, 0x01, 0x28, 0x25, - 0xdb, 0xf5, 0x24, 0x00, 0xa9, 0x0a, 0x54, 0x0c, - 0x22, 0x00, 0x20, 0x01, 0x1c, 0x23, 0xf0, 0x08, - 0xf9, 0xf8, 0x4e, 0x1e, 0x4d, 0x1e, 0x4c, 0x1f, - 0xf0, 0x03, 0xff, 0x66, 0xf0, 0x03, 0xff, 0x64, - 0x28, 0x28, 0xd9, 0x10, 0x42, 0xb0, 0xd3, 0x0e, - 0x69, 0xe9, 0x08, 0xc9, 0xd3, 0x0b, 0x4b, 0x1a, - 0x18, 0xc1, 0x20, 0x1e, 0xf0, 0x16, 0xfd, 0x08, - 0x21, 0x64, 0x1d, 0xc2, 0x32, 0xff, 0x32, 0xee, - 0x20, 0x01, 0xf0, 0x07, 0xff, 0x6d, 0xf0, 0x01, - 0xfb, 0xed, 0xf0, 0x02, 0xf8, 0xd5, 0xf0, 0x03, - 0xff, 0x4b, 0x1c, 0x01, 0x20, 0x7d, 0x00, 0xc0, - 0xf0, 0x16, 0xfc, 0xf6, 0x1c, 0x01, 0x48, 0x0f, - 0x88, 0x02, 0x32, 0x01, 0x80, 0x02, 0x42, 0xb9, - 0xd0, 0xd6, 0x2f, 0x04, 0xd3, 0x06, 0x20, 0x01, - 0xf0, 0x07, 0xfe, 0x76, 0xb0, 0x14, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0f, 0xf0, 0x00, - 0xfd, 0xcd, 0x20, 0x00, 0x60, 0x20, 0xe7, 0xc7, - 0x2e, 0x02, 0x56, 0xa0, 0x00, 0x00, 0x0b, 0xb8, - 0x72, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x01, 0x88, - 0xff, 0xff, 0xf4, 0x48, 0x2c, 0x00, 0x1f, 0xc8, - 0xb5, 0x80, 0x27, 0x00, 0x48, 0x09, 0x81, 0x07, - 0x48, 0x09, 0x49, 0x0a, 0x60, 0xc8, 0xf0, 0x03, - 0xfd, 0x45, 0xf7, 0xff, 0xff, 0x85, 0xf0, 0x00, - 0xf8, 0xd5, 0xf0, 0x05, 0xfb, 0x90, 0xf7, 0xff, - 0xff, 0x37, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, - 0x2e, 0x00, 0x19, 0xe9, 0x2e, 0x08, 0x01, 0x88, - 0x47, 0x70, 0xb5, 0xf0, 0x4d, 0x29, 0x68, 0x01, - 0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, 0x68, 0x41, - 0x10, 0x89, 0x68, 0x82, 0x10, 0x92, 0x00, 0x89, - 0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, 0x05, 0x89, - 0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, 0x49, 0x22, - 0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, 0x60, 0x0e, - 0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, 0xc8, 0x40, - 0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, 0xd3, 0xfa, - 0x23, 0x00, 0x49, 0x1c, 0x65, 0x8b, 0x20, 0x00, - 0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, 0x64, 0x8d, - 0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, 0x48, 0x18, - 0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, 0x60, 0x3b, - 0x22, 0x01, 0x64, 0xca, 0x21, 0x00, 0x4a, 0x15, - 0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, 0x33, 0x01, - 0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, 0x42, 0x91, - 0xdb, 0xf6, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, - 0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, 0x20, 0x33, - 0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, 0x65, 0x81, - 0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, 0x66, 0x41, - 0x21, 0x03, 0x67, 0x01, 0x21, 0x00, 0x20, 0x0d, - 0xf0, 0x0e, 0xfe, 0x88, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x25, 0x00, + 0x20, 0x00, 0x49, 0x19, 0x81, 0xc8, 0x81, 0x88, + 0x4e, 0x18, 0x4c, 0x19, 0x4f, 0x19, 0x68, 0x30, + 0x68, 0x00, 0x00, 0x40, 0x0a, 0x40, 0x02, 0x40, + 0x21, 0x19, 0x06, 0x89, 0x6a, 0x89, 0x4b, 0x16, + 0x40, 0x19, 0x0a, 0x49, 0x43, 0x08, 0x49, 0x15, + 0x64, 0x08, 0xf0, 0x01, 0xfc, 0x57, 0xf0, 0x02, + 0xf9, 0x6b, 0x68, 0x38, 0x30, 0x01, 0x60, 0x38, + 0x48, 0x11, 0x88, 0x01, 0x31, 0x01, 0x80, 0x01, + 0x20, 0x0c, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x9a, + 0x29, 0x00, 0xd1, 0x01, 0xf7, 0xff, 0xfe, 0xd6, + 0x20, 0x32, 0x68, 0x21, 0xf0, 0x17, 0xf8, 0x92, + 0x42, 0x85, 0xd0, 0xd8, 0x1c, 0x05, 0xf0, 0x00, + 0xfe, 0x39, 0x20, 0x00, 0x60, 0x38, 0xe7, 0xd2, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x5e, 0x38, + 0x2e, 0x08, 0x05, 0xb0, 0x2e, 0x08, 0x01, 0x88, + 0x00, 0x03, 0xfe, 0x00, 0x2c, 0x00, 0x1f, 0x80, + 0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0xf0, 0x27, 0x00, + 0xb0, 0x94, 0x46, 0x68, 0x4c, 0x2f, 0xcc, 0x6e, + 0xc0, 0x6e, 0xcc, 0x6e, 0xc0, 0x6e, 0x23, 0x28, + 0x22, 0x41, 0x00, 0xd2, 0x21, 0x00, 0x20, 0x01, + 0xf0, 0x08, 0xfa, 0x30, 0x22, 0xff, 0x21, 0x64, + 0x20, 0x01, 0x32, 0xf5, 0xf0, 0x08, 0xfa, 0xf2, + 0x20, 0x00, 0x46, 0x69, 0x5c, 0x09, 0x40, 0x41, + 0x23, 0x35, 0x40, 0x59, 0xaa, 0x0a, 0x54, 0x11, + 0x30, 0x01, 0x28, 0x25, 0xdb, 0xf5, 0x24, 0x00, + 0xa9, 0x0a, 0x54, 0x0c, 0x22, 0x00, 0x20, 0x01, + 0x1c, 0x23, 0xf0, 0x08, 0xfd, 0x50, 0x4e, 0x1e, + 0x4d, 0x1e, 0x4c, 0x1f, 0xf0, 0x03, 0xff, 0x80, + 0xf0, 0x03, 0xff, 0x7e, 0x28, 0x28, 0xd9, 0x10, + 0x42, 0xb0, 0xd3, 0x0e, 0x69, 0xe9, 0x08, 0xc9, + 0xd3, 0x0b, 0x4b, 0x1a, 0x18, 0xc1, 0x20, 0x1e, + 0xf0, 0x17, 0xf8, 0x40, 0x21, 0x64, 0x1d, 0xc2, + 0x32, 0xff, 0x32, 0xee, 0x20, 0x01, 0xf0, 0x08, + 0xfa, 0xc5, 0xf0, 0x01, 0xfb, 0xe7, 0xf0, 0x02, + 0xf8, 0xfb, 0xf0, 0x03, 0xff, 0x65, 0x1c, 0x01, + 0x20, 0x7d, 0x00, 0xc0, 0xf0, 0x17, 0xf8, 0x2e, + 0x1c, 0x01, 0x48, 0x0f, 0x88, 0x02, 0x32, 0x01, + 0x80, 0x02, 0x42, 0xb9, 0xd0, 0xd6, 0x2f, 0x04, + 0xd3, 0x06, 0x20, 0x01, 0xf0, 0x08, 0xf9, 0xce, + 0xb0, 0x14, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0xc7, 0x20, 0x00, + 0x60, 0x20, 0xe7, 0xc7, 0x2e, 0x02, 0x5e, 0x00, + 0x00, 0x00, 0x0b, 0xb8, 0x72, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x01, 0x88, 0xff, 0xff, 0xf4, 0x48, + 0x2c, 0x00, 0x1f, 0xc8, 0xb5, 0x80, 0x27, 0x00, + 0x48, 0x07, 0x81, 0x07, 0xf0, 0x03, 0xfd, 0x5e, + 0xf7, 0xff, 0xff, 0x88, 0xf0, 0x00, 0xf8, 0xce, + 0xf0, 0x05, 0xfe, 0xfe, 0xf7, 0xff, 0xff, 0x3e, + 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x4d, 0x29, + 0x68, 0x01, 0x31, 0x03, 0x10, 0x89, 0x1e, 0xcb, + 0x68, 0x41, 0x10, 0x89, 0x68, 0x82, 0x10, 0x92, + 0x00, 0x89, 0x30, 0x0c, 0x18, 0x0c, 0x21, 0x03, + 0x05, 0x89, 0x27, 0x35, 0x06, 0x7f, 0x60, 0x39, + 0x49, 0x21, 0x68, 0x0e, 0x08, 0xb6, 0x00, 0xb6, + 0x60, 0x0e, 0x21, 0x00, 0x2b, 0x00, 0xd9, 0x04, + 0xc8, 0x40, 0xc5, 0x40, 0x31, 0x01, 0x42, 0x99, + 0xd3, 0xfa, 0x23, 0x00, 0x49, 0x1b, 0x65, 0x8b, + 0x20, 0x00, 0x2a, 0x00, 0xd9, 0x04, 0xcc, 0x20, + 0x64, 0x8d, 0x30, 0x01, 0x42, 0x90, 0xd3, 0xfa, + 0x48, 0x17, 0x60, 0x03, 0x60, 0x3b, 0x66, 0x8b, + 0x60, 0x3b, 0x22, 0x01, 0x64, 0xca, 0x21, 0x00, + 0x4a, 0x14, 0x68, 0x03, 0x2b, 0x00, 0xd1, 0x05, + 0x33, 0x01, 0x2b, 0x64, 0xdb, 0xfc, 0x31, 0x01, + 0x42, 0x91, 0xdb, 0xf6, 0x48, 0x10, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x49, 0x0f, + 0x20, 0x33, 0x06, 0x40, 0x65, 0x41, 0x49, 0x0e, + 0x65, 0x81, 0x49, 0x0e, 0x66, 0x81, 0x39, 0x04, + 0x66, 0x41, 0x21, 0x03, 0x67, 0x01, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x0f, 0xf9, 0xc9, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x70, 0x6a, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, 0x6a, 0x00, 0x00, 0x10, 0xcc, 0x00, 0x0f, 0x84, 0xcc, 0x00, 0x0f, 0x88, 0x98, 0x00, 0x0f, 0x88, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, - 0xf0, 0x0f, 0xfa, 0xc2, 0x48, 0x08, 0x21, 0x40, - 0xf0, 0x0e, 0xff, 0x92, 0x20, 0x01, 0x21, 0x35, + 0xf0, 0x0f, 0xfe, 0x04, 0x48, 0x08, 0x21, 0x40, + 0xf0, 0x0f, 0xfa, 0xd4, 0x20, 0x01, 0x21, 0x35, 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 0x49, 0x04, 0x63, 0x08, 0x20, 0x00, 0x21, 0x39, 0x06, 0x49, 0x62, 0xc8, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x01, 0xc5, 0x30, 0x72, 0x00, 0x01, 0x00, + 0x2e, 0x01, 0xcc, 0x90, 0x72, 0x00, 0x01, 0x00, 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0f, 0xd0, 0x10, 0x29, 0x01, 0xd0, 0x12, 0x29, 0x02, 0xd0, 0x14, 0x29, 0x03, 0xd1, 0x01, 0x49, 0x0c, 0x60, 0x01, 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, - 0x21, 0x1e, 0xf0, 0x0f, 0xfb, 0x01, 0xbc, 0x08, + 0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x43, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, 0x04, 0x49, 0x60, 0x01, 0xe7, 0xf2, 0x21, 0x21, 0x03, 0x09, 0x60, 0x01, 0xe7, 0xee, 0x21, 0x41, 0x03, 0x09, 0x60, 0x01, - 0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, + 0xe7, 0xea, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94, 0x00, 0x08, 0x10, 0x08, 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x0b, 0xd0, 0x0e, 0x29, 0x01, 0xd0, 0x0f, 0x29, 0x02, 0xd1, 0x01, 0x21, 0x04, 0x60, 0x41, 0x68, 0x01, 0x68, 0x40, 0x43, 0x08, 0x22, 0x00, - 0x21, 0x1e, 0xf0, 0x0f, 0xfa, 0xdd, 0xbc, 0x08, + 0x21, 0x1e, 0xf0, 0x0f, 0xfe, 0x1f, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, 0x60, 0x41, 0xe7, 0xf3, 0x21, 0x02, 0x60, 0x41, 0xe7, 0xf0, 0x00, 0x00, - 0x2e, 0x08, 0x01, 0x98, 0xb5, 0x80, 0x4b, 0x09, - 0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x0f, - 0xfd, 0x11, 0x20, 0x0b, 0xf0, 0x0f, 0xfe, 0x33, + 0x2e, 0x08, 0x01, 0x94, 0xb5, 0x80, 0x4b, 0x09, + 0x22, 0x0a, 0x21, 0x0a, 0x20, 0x0b, 0xf0, 0x10, + 0xf8, 0x53, 0x20, 0x0b, 0xf0, 0x10, 0xf9, 0x75, 0x4f, 0x05, 0x60, 0x38, 0x00, 0x80, 0xf0, 0x03, - 0xff, 0x21, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc4, - 0x2e, 0x08, 0x01, 0xd4, 0xb5, 0xb0, 0x25, 0x00, + 0xff, 0x45, 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xc0, + 0x2e, 0x08, 0x01, 0xd0, 0xb5, 0xb0, 0x25, 0x00, 0x1c, 0x0c, 0x1c, 0x07, 0x2a, 0x08, 0xd2, 0x30, 0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 0x2c, 0x29, 0x29, 0x03, 0x29, 0x29, 0x03, 0x29, @@ -876,57 +895,57 @@ 0xd0, 0x12, 0x1f, 0xda, 0x3a, 0x0d, 0x21, 0x03, 0x1d, 0x10, 0xb4, 0x07, 0x22, 0x0b, 0xb4, 0x04, 0x1c, 0x19, 0x23, 0x00, 0x22, 0x00, 0x20, 0x00, - 0xf0, 0x0a, 0xf9, 0x0a, 0x6a, 0xb8, 0x1c, 0x29, - 0xb0, 0x04, 0xf0, 0x0b, 0xfa, 0x59, 0xe0, 0x04, + 0xf0, 0x0a, 0xfc, 0x4c, 0x6a, 0xb8, 0x1c, 0x29, + 0xb0, 0x04, 0xf0, 0x0b, 0xfd, 0x9b, 0xe0, 0x04, 0x21, 0x00, 0x6a, 0xb8, 0x1c, 0x1a, 0xf0, 0x0a, - 0xfc, 0x0f, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x98, + 0xff, 0x51, 0x64, 0x7d, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0x94, 0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x81, 0x4d, 0x56, 0x1d, 0xee, 0x36, 0x19, 0x79, 0x30, 0x42, 0x87, 0xd1, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x24, 0x00, 0x6c, 0x68, 0x28, 0x00, 0xd0, 0x05, 0x64, 0x6c, 0x4a, 0x4f, 0x21, 0x00, - 0x6a, 0xa8, 0xf0, 0x0a, 0xfb, 0xf1, 0x71, 0x37, - 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0e, 0xfd, 0x82, - 0x20, 0x00, 0xf0, 0x0c, 0xf8, 0x83, 0x20, 0x1f, - 0xf0, 0x09, 0xf9, 0x18, 0x26, 0x03, 0x02, 0x76, + 0x6a, 0xa8, 0xf0, 0x0a, 0xff, 0x33, 0x71, 0x37, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0f, 0xf8, 0xc4, + 0x20, 0x00, 0xf0, 0x0c, 0xfb, 0xc5, 0x20, 0x1f, + 0xf0, 0x09, 0xfc, 0x5a, 0x26, 0x03, 0x02, 0x76, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, - 0x1c, 0x33, 0xf0, 0x08, 0xff, 0x8f, 0x20, 0x1e, - 0xf0, 0x09, 0xf9, 0xd6, 0x22, 0x01, 0x02, 0xd2, - 0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x08, - 0xff, 0x85, 0x26, 0x1c, 0x1c, 0x39, 0x48, 0x3e, - 0x27, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02, + 0x1c, 0x33, 0xf0, 0x09, 0xfa, 0xd1, 0x20, 0x1e, + 0xf0, 0x09, 0xfd, 0x18, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1e, 0x1c, 0x33, 0xf0, 0x09, + 0xfa, 0xc7, 0x1c, 0x39, 0x27, 0x1c, 0x48, 0x3e, + 0x26, 0x0c, 0x29, 0x06, 0xd2, 0x07, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, 0x03, 0x12, 0x03, 0x21, 0x12, 0x30, 0x48, 0x39, - 0x21, 0x40, 0xf0, 0x0e, 0xfe, 0x81, 0xab, 0x00, - 0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9e, + 0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xc3, 0xab, 0x00, + 0x70, 0x1c, 0x20, 0x08, 0x70, 0x58, 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0f, - 0xf9, 0xa3, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, - 0xf0, 0x0e, 0xfe, 0x72, 0xab, 0x00, 0x70, 0x1c, - 0x70, 0x5c, 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, - 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, 0xf9, 0x94, - 0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x0e, 0xfe, 0x64, + 0xfc, 0xe5, 0xe0, 0x2b, 0x21, 0x1f, 0x43, 0xc9, + 0xf0, 0x0f, 0xf9, 0xb4, 0xab, 0x00, 0x70, 0x1c, + 0x70, 0x5c, 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0f, 0xfc, 0xd6, + 0xe0, 0x1c, 0x21, 0x40, 0xf0, 0x0f, 0xf9, 0xa6, 0xab, 0x00, 0x70, 0x1c, 0x20, 0x10, 0x70, 0x58, - 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, - 0x20, 0x08, 0xf0, 0x0f, 0xf9, 0x85, 0xe0, 0x0d, - 0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x0e, 0xfe, 0x54, - 0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9f, + 0x70, 0x9f, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, + 0x20, 0x08, 0xf0, 0x0f, 0xfc, 0xc7, 0xe0, 0x0d, + 0x21, 0x1f, 0x43, 0xc9, 0xf0, 0x0f, 0xf9, 0x96, + 0xab, 0x00, 0x70, 0x1c, 0x70, 0x5c, 0x70, 0x9e, 0x70, 0xdc, 0x22, 0x00, 0x21, 0x00, 0x20, 0x08, - 0xf0, 0x0f, 0xf9, 0x76, 0x20, 0x01, 0x21, 0x35, + 0xf0, 0x0f, 0xfc, 0xb8, 0x20, 0x01, 0x21, 0x35, 0x06, 0x49, 0x61, 0x08, 0x20, 0x02, 0x43, 0xc0, 0x49, 0x19, 0x63, 0x08, 0x20, 0x39, 0x06, 0x40, 0x62, 0xc4, 0xcd, 0x03, 0x43, 0x08, 0x22, 0x00, - 0x21, 0x1e, 0xf0, 0x0f, 0xf9, 0xcd, 0x48, 0x15, - 0xf0, 0x0b, 0xff, 0x8e, 0x20, 0x00, 0xf0, 0x0b, - 0xff, 0xff, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, - 0x20, 0x00, 0xf0, 0x03, 0xfb, 0x15, 0x20, 0x01, - 0xf0, 0x0c, 0xf8, 0x04, 0x4a, 0x0e, 0xb4, 0x04, + 0x21, 0x1e, 0xf0, 0x0f, 0xfd, 0x0f, 0x48, 0x15, + 0xf0, 0x0c, 0xfa, 0xd0, 0x20, 0x00, 0xf0, 0x0c, + 0xfb, 0x41, 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x68, + 0x20, 0x00, 0xf0, 0x03, 0xfb, 0x3f, 0x20, 0x01, + 0xf0, 0x0c, 0xfb, 0x46, 0x4a, 0x0e, 0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0d, 0x1e, 0xc8, - 0xf7, 0xfe, 0xfb, 0x5a, 0x21, 0x00, 0x20, 0x0d, - 0xb0, 0x01, 0xf0, 0x0e, 0xfc, 0xf3, 0xb0, 0x01, + 0xf7, 0xfe, 0xfb, 0x4e, 0x21, 0x00, 0x20, 0x0d, + 0xb0, 0x01, 0xf0, 0x0f, 0xf8, 0x35, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xd4, - 0x2e, 0x02, 0x0b, 0x9c, 0x2e, 0x01, 0xc5, 0x30, + 0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xd0, + 0x2e, 0x02, 0x12, 0xfc, 0x2e, 0x01, 0xcc, 0x90, 0x72, 0x00, 0x01, 0x00, 0x00, 0x80, 0x10, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, 0xb5, 0xb0, 0x1c, 0x07, 0x4c, 0x10, 0x6a, 0x20, @@ -935,49 +954,49 @@ 0x61, 0x60, 0x21, 0x02, 0x4d, 0x0b, 0x60, 0x29, 0x71, 0x28, 0x71, 0x68, 0x22, 0x01, 0xb4, 0x04, 0x7a, 0x23, 0x7c, 0x22, 0x7b, 0x21, 0x20, 0x00, - 0xf0, 0x0e, 0xff, 0xc0, 0x69, 0x61, 0x1c, 0x28, - 0xb0, 0x01, 0xf0, 0x10, 0xf8, 0x67, 0x62, 0x27, + 0xf0, 0x0f, 0xfb, 0x02, 0x69, 0x61, 0x1c, 0x28, + 0xb0, 0x01, 0xf0, 0x10, 0xfb, 0xa9, 0x62, 0x27, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, + 0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac, 0xb5, 0x00, 0x22, 0x02, 0x49, 0x09, 0x60, 0x0a, 0x22, 0x00, 0x71, 0x0a, 0x71, 0x4a, 0x39, 0x48, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd1, 0x00, 0x72, 0x08, 0x6a, 0x08, 0x62, 0x0a, 0xf7, 0xff, 0xff, 0xc7, 0xbc, 0x08, 0x47, 0x18, 0x72, 0x0a, - 0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xe0, + 0xe7, 0xf7, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xdc, 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x0b, 0xd0, 0x02, 0x20, 0x00, 0x73, 0x38, 0xe0, 0x01, 0x20, 0x01, 0x73, 0x38, 0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7c, 0x3a, 0x7b, 0x39, 0x20, 0x00, - 0xf0, 0x0e, 0xff, 0x88, 0x69, 0x79, 0xb0, 0x01, - 0x48, 0x03, 0xf0, 0x10, 0xf8, 0x2f, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x98, - 0x2e, 0x08, 0x01, 0xb0, 0xb5, 0x80, 0x06, 0x00, + 0xf0, 0x0f, 0xfa, 0xca, 0x69, 0x79, 0xb0, 0x01, + 0x48, 0x03, 0xf0, 0x10, 0xfb, 0x71, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x01, 0x94, + 0x2e, 0x08, 0x01, 0xac, 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x01, 0x4f, 0x08, 0x74, 0x39, 0x22, 0x01, 0xb4, 0x04, 0x7a, 0x3b, 0x7b, 0x39, - 0x1c, 0x02, 0x20, 0x00, 0xf0, 0x0e, 0xff, 0x6e, + 0x1c, 0x02, 0x20, 0x00, 0xf0, 0x0f, 0xfa, 0xb0, 0x69, 0x79, 0xb0, 0x01, 0x48, 0x03, 0xf0, 0x10, - 0xf8, 0x15, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x01, 0x98, 0x2e, 0x08, 0x01, 0xb0, + 0xfb, 0x57, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0x94, 0x2e, 0x08, 0x01, 0xac, 0xb4, 0xb0, 0x21, 0x00, 0x48, 0x08, 0x60, 0x01, 0x20, 0x00, 0x4c, 0x08, 0x4f, 0x08, 0x4b, 0x09, 0x4a, 0x09, 0x00, 0x85, 0x51, 0x61, 0x54, 0x39, 0x54, 0x19, 0x54, 0x11, 0x30, 0x01, 0x28, 0x20, 0xdb, 0xf7, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x43, 0x90, - 0x2e, 0x08, 0x44, 0x10, 0x2e, 0x08, 0x44, 0x50, - 0x2e, 0x08, 0x44, 0x30, 0x06, 0x00, 0x0e, 0x00, + 0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x43, 0x88, + 0x2e, 0x08, 0x44, 0x08, 0x2e, 0x08, 0x44, 0x48, + 0x2e, 0x08, 0x44, 0x28, 0x06, 0x00, 0x0e, 0x00, 0x21, 0x01, 0x40, 0x81, 0x43, 0xca, 0x49, 0x05, 0x68, 0x0b, 0x40, 0x1a, 0x60, 0x0a, 0x21, 0x00, 0x00, 0x82, 0x4b, 0x03, 0x50, 0x99, 0x4a, 0x03, - 0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe8, - 0x2e, 0x08, 0x43, 0x90, 0x2e, 0x08, 0x44, 0x10, + 0x54, 0x11, 0x47, 0x70, 0x2e, 0x08, 0x01, 0xe4, + 0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 0xb5, 0xf0, 0xb0, 0x84, 0x4f, 0x36, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x23, - 0xf8, 0x5d, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, - 0x31, 0x05, 0x20, 0x00, 0xf0, 0x23, 0xf8, 0x56, + 0xfb, 0xc1, 0x1c, 0x04, 0x68, 0x38, 0x1d, 0xc1, + 0x31, 0x05, 0x20, 0x00, 0xf0, 0x23, 0xfb, 0xba, 0x1c, 0x05, 0x68, 0x38, 0x1d, 0xc1, 0x31, 0x09, - 0x20, 0x00, 0xf0, 0x23, 0xf8, 0x4f, 0x43, 0x2c, + 0x20, 0x00, 0xf0, 0x23, 0xfb, 0xb3, 0x43, 0x2c, 0x1c, 0x20, 0x4c, 0x2c, 0x68, 0x21, 0x43, 0x08, 0x27, 0x00, 0x60, 0x20, 0x1c, 0x05, 0xd0, 0x4a, 0x48, 0x29, 0x90, 0x03, 0x48, 0x29, 0x90, 0x02, @@ -985,7 +1004,7 @@ 0xd3, 0x3c, 0x98, 0x03, 0x5d, 0xc0, 0x28, 0x00, 0xd0, 0x32, 0x98, 0x02, 0x5d, 0xc0, 0x28, 0x00, 0xd0, 0x2a, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10, - 0xfc, 0x27, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, + 0xff, 0x69, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x1b, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 0x5d, 0xf0, 0x28, 0x00, 0xd1, 0x06, 0x20, 0xff, 0x55, 0xf0, 0x21, 0x00, 0x00, 0xb8, 0x9a, 0x01, @@ -1000,9 +1019,9 @@ 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xbb, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x14, 0x2e, 0x08, 0x01, 0xe8, - 0x2e, 0x08, 0x44, 0x30, 0x2e, 0x08, 0x44, 0x50, - 0x2e, 0x08, 0x43, 0x90, 0x2e, 0x08, 0x44, 0x10, + 0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x01, 0xe4, + 0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x44, 0x48, + 0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, 0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x4c, 0x26, 0x68, 0x25, 0x2d, 0x00, 0xd0, 0x44, 0x4e, 0x25, 0x48, 0x25, 0x90, 0x04, 0x49, 0x25, 0x91, 0x03, @@ -1010,7 +1029,7 @@ 0x08, 0x68, 0xd3, 0x34, 0x5d, 0xf0, 0x28, 0x00, 0xd0, 0x2b, 0x98, 0x04, 0x5d, 0xc0, 0x28, 0x00, 0xd0, 0x2d, 0x46, 0x68, 0x1c, 0x39, 0xf0, 0x10, - 0xfb, 0xc3, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, + 0xff, 0x05, 0xa8, 0x00, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x18, 0x68, 0x60, 0x30, 0x01, 0x60, 0x60, 0x00, 0xb8, 0x99, 0x03, 0x58, 0x09, 0x69, 0x09, 0x9a, 0x02, 0x50, 0x11, 0x20, 0x02, 0x1c, 0x39, @@ -1023,39 +1042,40 @@ 0x68, 0x21, 0x40, 0x08, 0x60, 0x20, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0x08, 0x6d, 0xd1, 0xc3, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x01, 0xe8, 0x2e, 0x08, 0x44, 0x30, - 0x2e, 0x08, 0x44, 0x50, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x43, 0x90, 0x2e, 0x08, 0x44, 0x10, - 0xb4, 0xf0, 0x06, 0x02, 0x0e, 0x12, 0xb0, 0x82, - 0x92, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa0, - 0xb0, 0x81, 0x49, 0x31, 0x58, 0x09, 0x91, 0x00, - 0x29, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, - 0xbc, 0xf0, 0x47, 0x70, 0x49, 0x2d, 0x68, 0x09, - 0x18, 0x47, 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, - 0x4a, 0x2b, 0x68, 0x12, 0x18, 0x89, 0x9a, 0x01, - 0x4d, 0x2a, 0x4b, 0x2b, 0x93, 0x02, 0x2a, 0x01, - 0xd0, 0x28, 0x2a, 0x02, 0xd1, 0x44, 0x4b, 0x29, - 0x58, 0x1a, 0x2a, 0x00, 0xd1, 0x03, 0x20, 0xff, - 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4a, - 0x22, 0x00, 0x50, 0x1a, 0x5c, 0xa8, 0x42, 0xa0, - 0xd1, 0x06, 0x00, 0x90, 0x9b, 0x02, 0x58, 0x18, - 0x78, 0x46, 0x23, 0x80, 0x43, 0x9e, 0x70, 0x46, - 0x1c, 0x50, 0x06, 0x02, 0x0e, 0x12, 0x2a, 0x20, - 0xdb, 0xf0, 0x88, 0x08, 0x4b, 0x1c, 0x40, 0x18, - 0x80, 0x08, 0x98, 0x00, 0x9a, 0x01, 0x70, 0xc2, - 0x68, 0x38, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, - 0x60, 0x38, 0xe0, 0x19, 0x68, 0x38, 0x4b, 0x17, - 0x40, 0x18, 0x60, 0x38, 0x98, 0x00, 0x9a, 0x01, - 0x70, 0xc2, 0x20, 0x00, 0x60, 0x88, 0x70, 0xc8, - 0x60, 0xc8, 0x5c, 0x29, 0x42, 0xa1, 0xd1, 0x06, - 0x00, 0x81, 0x9b, 0x02, 0x58, 0x59, 0x78, 0x4a, - 0x23, 0x80, 0x43, 0x1a, 0x70, 0x4a, 0x30, 0x01, - 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf0, - 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, - 0x20, 0xbc, 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, - 0x2e, 0x08, 0x5e, 0x64, 0x2e, 0x08, 0x5d, 0xd4, - 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5f, 0xac, - 0x2e, 0x08, 0x5e, 0xec, 0x2e, 0x08, 0x43, 0x90, + 0x2e, 0x08, 0x01, 0xe4, 0x2e, 0x08, 0x44, 0x28, + 0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x5e, 0x5c, + 0x2e, 0x08, 0x43, 0x88, 0x2e, 0x08, 0x44, 0x08, + 0xb4, 0xf0, 0x06, 0x03, 0x0e, 0x1b, 0xb0, 0x82, + 0x93, 0x00, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xa2, + 0xb0, 0x81, 0x48, 0x33, 0x58, 0x80, 0x90, 0x00, + 0x28, 0x00, 0xd1, 0x03, 0x20, 0xb0, 0xb0, 0x03, + 0xbc, 0xf0, 0x47, 0x70, 0x48, 0x2f, 0x68, 0x00, + 0x18, 0x17, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, + 0x49, 0x2d, 0x68, 0x09, 0x18, 0x41, 0x9b, 0x01, + 0x48, 0x2c, 0x4d, 0x2d, 0x95, 0x02, 0x2b, 0x01, + 0xd0, 0x2a, 0x2b, 0x02, 0xd1, 0x47, 0x4d, 0x2b, + 0x58, 0xab, 0x2b, 0x00, 0xd1, 0x03, 0x20, 0xff, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x60, 0x4b, + 0x23, 0x00, 0x50, 0xab, 0x22, 0x00, 0x5c, 0x83, + 0x42, 0xa3, 0xd1, 0x07, 0x00, 0x93, 0x9d, 0x02, + 0x58, 0xeb, 0x78, 0x5e, 0x1c, 0x5d, 0x23, 0x80, + 0x43, 0x9e, 0x70, 0x2e, 0x32, 0x01, 0x06, 0x12, + 0x0e, 0x12, 0x2a, 0x20, 0xdb, 0xef, 0x88, 0x08, + 0x4b, 0x1d, 0x40, 0x18, 0x80, 0x08, 0x98, 0x00, + 0x9b, 0x01, 0x70, 0xc3, 0x68, 0x38, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0x60, 0x38, 0xe0, 0x1a, + 0x68, 0x3a, 0x4b, 0x18, 0x40, 0x1a, 0x60, 0x3a, + 0x9a, 0x00, 0x9b, 0x01, 0x70, 0xd3, 0x23, 0x00, + 0x60, 0x8b, 0x70, 0xcb, 0x60, 0xcb, 0x21, 0x00, + 0x5c, 0x42, 0x42, 0xa2, 0xd1, 0x06, 0x00, 0x8a, + 0x9d, 0x02, 0x58, 0xaa, 0x78, 0x57, 0x23, 0x80, + 0x43, 0x3b, 0x70, 0x53, 0x31, 0x01, 0x06, 0x09, + 0x0e, 0x09, 0x29, 0x20, 0xdb, 0xf0, 0x20, 0x00, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x20, 0xbc, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc, + 0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4, + 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x43, 0x88, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xb4, 0xf0, 0x78, 0x43, 0x00, 0x9e, 0x49, 0x32, 0x59, 0x8c, 0x88, 0x42, 0x68, 0x87, 0x68, 0x40, @@ -1083,8 +1103,8 @@ 0x4b, 0x07, 0x51, 0x9a, 0x60, 0x08, 0x69, 0xa2, 0x69, 0x23, 0x60, 0x13, 0x61, 0xa1, 0x61, 0x27, 0x61, 0x67, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x64, 0x2e, 0x08, 0x5d, 0xcc, - 0x2e, 0x08, 0x43, 0x90, 0xb5, 0xf0, 0x06, 0x07, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, + 0x2e, 0x08, 0x43, 0x88, 0xb5, 0xf0, 0x06, 0x07, 0x0e, 0x3f, 0x04, 0x0c, 0x0c, 0x24, 0x06, 0x15, 0x0e, 0x2d, 0x00, 0xf8, 0x49, 0x2c, 0x68, 0x09, 0x18, 0x40, 0x00, 0xb9, 0x4a, 0x2b, 0x68, 0x12, @@ -1107,11 +1127,11 @@ 0x18, 0xc9, 0x60, 0x4a, 0x68, 0x01, 0x4b, 0x0d, 0x43, 0x19, 0x60, 0x01, 0x68, 0x01, 0x60, 0x01, 0x21, 0x0f, 0x60, 0x41, 0xe0, 0x04, 0x1c, 0x38, - 0xf0, 0x0d, 0xfb, 0xdc, 0x28, 0x00, 0xd1, 0x00, + 0xf0, 0x0d, 0xff, 0x1a, 0x28, 0x00, 0xd1, 0x00, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x5d, 0xd8, 0x2e, 0x08, 0x5d, 0xd4, - 0x2e, 0x08, 0x5d, 0xcc, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x5d, 0xdc, 0x00, 0x00, 0x20, 0xa0, + 0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc, + 0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0xa0, 0xb5, 0xf0, 0x06, 0x09, 0x0e, 0x09, 0x1c, 0x07, 0xb0, 0x8a, 0x48, 0x58, 0x29, 0x00, 0xd1, 0x0a, 0x4d, 0x57, 0x69, 0x01, 0x91, 0x04, 0x49, 0x57, @@ -1153,33 +1173,33 @@ 0xbc, 0x08, 0x47, 0x18, 0x42, 0x88, 0xd3, 0xf5, 0x1d, 0xcb, 0x33, 0xb9, 0x42, 0x83, 0xd3, 0xf1, 0x60, 0xb9, 0x61, 0x51, 0x1c, 0x38, 0xf0, 0x0d, - 0xfb, 0xe6, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02, + 0xff, 0x24, 0xb0, 0x02, 0x98, 0x04, 0x99, 0x02, 0x42, 0x88, 0xd0, 0x01, 0x2c, 0x00, 0xd0, 0x83, 0x70, 0x3c, 0x98, 0x04, 0x99, 0x03, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, - 0x2e, 0x08, 0x60, 0x98, 0x9e, 0x00, 0x04, 0x90, - 0x2e, 0x08, 0x69, 0x98, 0x9e, 0x00, 0x04, 0x98, - 0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, - 0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xec, - 0x2e, 0x08, 0x5e, 0x64, 0xb5, 0x00, 0x20, 0xff, + 0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x90, + 0x2e, 0x08, 0x69, 0x90, 0x9e, 0x00, 0x04, 0x98, + 0x2e, 0x08, 0x5f, 0xc4, 0x2e, 0x08, 0x5f, 0x64, + 0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5e, 0xe4, + 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0x00, 0x20, 0xff, 0x49, 0x03, 0x60, 0x08, 0x20, 0x01, 0x05, 0x00, - 0xf0, 0x19, 0xfe, 0x3e, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x01, 0xe8, 0xb5, 0xf0, 0x06, 0x07, + 0xf0, 0x1a, 0xf9, 0x9e, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x01, 0xe4, 0xb5, 0xf0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x20, 0x10, 0x2f, 0x1f, 0xdc, 0x2c, 0x2c, 0x1f, 0xdc, 0x2a, 0x1c, 0x39, 0x43, 0x21, 0x08, 0x49, 0xd2, 0x26, - 0x49, 0x14, 0x1c, 0x38, 0xf0, 0x19, 0xfe, 0x3a, + 0x49, 0x14, 0x1c, 0x38, 0xf0, 0x1a, 0xf9, 0x9a, 0x26, 0x01, 0x1c, 0x35, 0x40, 0xbd, 0x1c, 0x30, - 0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x19, - 0xfe, 0x24, 0xf0, 0x19, 0xfe, 0x27, 0x43, 0xa8, - 0xf0, 0x19, 0xfe, 0x28, 0xf0, 0x19, 0xfe, 0x22, - 0x43, 0xa0, 0xf0, 0x19, 0xfe, 0x23, 0x1c, 0x38, - 0xf0, 0x0f, 0xfd, 0x28, 0x1c, 0x04, 0xd1, 0x07, + 0x40, 0xa0, 0x1c, 0x04, 0x43, 0x28, 0xf0, 0x1a, + 0xf9, 0x84, 0xf0, 0x1a, 0xf9, 0x87, 0x43, 0xa8, + 0xf0, 0x1a, 0xf9, 0x88, 0xf0, 0x1a, 0xf9, 0x82, + 0x43, 0xa0, 0xf0, 0x1a, 0xf9, 0x83, 0x1c, 0x38, + 0xf0, 0x10, 0xf8, 0x66, 0x1c, 0x04, 0xd1, 0x07, 0x21, 0x03, 0x05, 0x09, 0x20, 0x00, 0x1c, 0x3a, - 0x1c, 0x33, 0xf0, 0x10, 0xfb, 0xd9, 0x1c, 0x04, - 0xf7, 0xff, 0xfc, 0x92, 0x1c, 0x20, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2c, 0xa3, + 0x1c, 0x33, 0xf0, 0x10, 0xff, 0x17, 0x1c, 0x04, + 0xf7, 0xff, 0xfc, 0x8e, 0x1c, 0x20, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x00, 0x2d, 0x43, 0xb5, 0xf0, 0x06, 0x04, 0x0e, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x05, 0x06, 0x38, 0x0e, 0x00, 0x22, 0x00, 0x21, 0x00, @@ -1211,10 +1231,10 @@ 0x0c, 0x09, 0xb0, 0x88, 0x91, 0x00, 0x06, 0x15, 0x0e, 0x2d, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x06, 0x32, 0x0e, 0x12, 0x92, 0x02, 0x06, 0x38, - 0x0e, 0x00, 0x90, 0x03, 0xb0, 0x82, 0xf0, 0x19, - 0xfd, 0x89, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, - 0x90, 0x00, 0xf0, 0x19, 0xfd, 0x83, 0x23, 0x01, - 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x19, 0xfd, 0x82, + 0x0e, 0x00, 0x90, 0x03, 0xb0, 0x82, 0xf0, 0x1a, + 0xf8, 0xe9, 0x0d, 0x40, 0xd2, 0x09, 0x20, 0xff, + 0x90, 0x00, 0xf0, 0x1a, 0xf8, 0xe3, 0x23, 0x01, + 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x1a, 0xf8, 0xe2, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x98, 0x03, 0x08, 0x40, 0xd3, 0x02, 0x22, 0x12, 0x92, 0x01, 0xe0, 0x01, 0x22, 0x11, 0x92, 0x01, 0x22, 0x01, @@ -1223,59 +1243,59 @@ 0xe0, 0xa2, 0x27, 0x00, 0x43, 0x08, 0x60, 0x18, 0x23, 0x1c, 0x98, 0x05, 0x40, 0x18, 0x28, 0x1c, 0xd1, 0x06, 0x21, 0x01, 0x20, 0x7d, 0x01, 0x00, - 0xf0, 0x10, 0xf8, 0x86, 0x1c, 0x06, 0xe0, 0x0d, + 0xf0, 0x10, 0xfb, 0xc4, 0x1c, 0x06, 0xe0, 0x0d, 0x98, 0x05, 0x08, 0x40, 0xd3, 0x05, 0x21, 0x01, - 0x20, 0xc8, 0xf0, 0x10, 0xf8, 0x7d, 0x1c, 0x06, + 0x20, 0xc8, 0xf0, 0x10, 0xfb, 0xbb, 0x1c, 0x06, 0xe0, 0x04, 0x21, 0x01, 0x20, 0x3c, 0xf0, 0x10, - 0xf8, 0x77, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, - 0xf9, 0x4d, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c, + 0xfb, 0xb5, 0x1c, 0x06, 0x20, 0x34, 0xf0, 0x03, + 0xf9, 0x6d, 0x00, 0xaa, 0x92, 0x09, 0x49, 0x4c, 0x91, 0x08, 0x50, 0x88, 0x00, 0xa1, 0x91, 0x07, 0x48, 0x4a, 0x90, 0x06, 0x58, 0x40, 0x28, 0x00, - 0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x3e, + 0xd1, 0x05, 0x00, 0xb0, 0xf0, 0x03, 0xf9, 0x5e, 0x99, 0x07, 0x9a, 0x06, 0x50, 0x50, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x04, 0x98, 0x06, 0x99, 0x07, 0x58, 0x40, 0x28, 0x00, 0xd1, 0x01, 0x27, 0x13, 0xe0, 0x64, 0x99, 0x07, 0x4a, 0x3f, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x3a, 0x9a, 0x01, 0xb4, 0x04, 0x23, 0x40, 0x1c, 0x31, - 0x1c, 0x22, 0xf0, 0x10, 0xf8, 0xd5, 0xb0, 0x01, + 0x1c, 0x22, 0xf0, 0x10, 0xfc, 0x13, 0xb0, 0x01, 0x1c, 0x07, 0xd1, 0x17, 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0x1c, 0x20, - 0xf0, 0x08, 0xfa, 0x18, 0x22, 0x00, 0xb4, 0x04, + 0xf0, 0x08, 0xfd, 0x56, 0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x99, 0x03, 0x9b, 0x02, 0x1c, 0x20, - 0xf0, 0x08, 0xf8, 0x4c, 0xb0, 0x01, 0x1c, 0x07, + 0xf0, 0x08, 0xfb, 0x8a, 0xb0, 0x01, 0x1c, 0x07, 0xd1, 0x04, 0x22, 0x01, 0x48, 0x2f, 0x55, 0x02, 0x48, 0x2f, 0x55, 0x02, 0x2f, 0x00, 0xd1, 0x16, 0x98, 0x16, 0x28, 0x00, 0xd0, 0x13, 0x21, 0x02, - 0x98, 0x16, 0xf0, 0x10, 0xf8, 0x25, 0x1c, 0x07, - 0x00, 0x80, 0xf0, 0x03, 0xf8, 0xfb, 0x99, 0x07, + 0x98, 0x16, 0xf0, 0x10, 0xfb, 0x63, 0x1c, 0x07, + 0x00, 0x80, 0xf0, 0x03, 0xf9, 0x1b, 0x99, 0x07, 0x4a, 0x28, 0x50, 0x50, 0x28, 0x00, 0xd0, 0x05, - 0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x10, 0xf8, 0x39, + 0x1c, 0x39, 0x1c, 0x22, 0xf0, 0x10, 0xfb, 0x77, 0x1c, 0x07, 0xe0, 0x00, 0x27, 0x13, 0x2f, 0x00, 0xd1, 0x22, 0x98, 0x03, 0x09, 0x80, 0xd3, 0x06, - 0x20, 0x5c, 0xf0, 0x03, 0xf8, 0xe7, 0x28, 0x00, + 0x20, 0x5c, 0xf0, 0x03, 0xf9, 0x07, 0x28, 0x00, 0xd1, 0x02, 0x27, 0x13, 0xe0, 0x00, 0x20, 0x00, 0x1c, 0x02, 0x98, 0x05, 0x99, 0x17, 0xb4, 0x07, 0x1c, 0x2a, 0xb4, 0x04, 0x98, 0x0d, 0x99, 0x0c, 0x58, 0x08, 0x99, 0x18, 0x9a, 0x08, 0x9b, 0x07, 0xf0, 0x00, 0xf9, 0x1c, 0xb0, 0x04, 0x2f, 0x00, 0xd1, 0x06, 0x98, 0x09, 0x99, 0x08, 0x58, 0x08, - 0x1c, 0x21, 0xf0, 0x0c, 0xfa, 0xb9, 0x1c, 0x07, + 0x1c, 0x21, 0xf0, 0x0c, 0xfd, 0xf7, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0x1c, 0x29, 0xf0, 0x00, 0xf8, 0x20, 0x98, 0x00, 0x28, 0x00, - 0xd0, 0x05, 0xf0, 0x19, 0xfc, 0xbb, 0x4b, 0x0c, - 0x40, 0x18, 0xf0, 0x19, 0xfc, 0xbb, 0x1c, 0x38, + 0xd0, 0x05, 0xf0, 0x1a, 0xf8, 0x1b, 0x4b, 0x0c, + 0x40, 0x18, 0xf0, 0x1a, 0xf8, 0x1b, 0x1c, 0x38, 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xf0, - 0x2e, 0x08, 0x01, 0xf4, 0x2e, 0x08, 0x02, 0x74, - 0x2e, 0x08, 0x5e, 0x64, 0x2e, 0x08, 0x44, 0x50, - 0x2e, 0x08, 0x44, 0x30, 0x2e, 0x08, 0x02, 0xf4, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x01, 0xec, + 0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x02, 0x70, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x44, 0x48, + 0x2e, 0x08, 0x44, 0x28, 0x2e, 0x08, 0x02, 0xf0, 0xff, 0xef, 0xff, 0xff, 0xb5, 0xf0, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, - 0xf0, 0x19, 0xfc, 0x98, 0x0d, 0x40, 0xd2, 0x09, - 0x20, 0xff, 0x90, 0x00, 0xf0, 0x19, 0xfc, 0x92, + 0xf0, 0x19, 0xff, 0xf8, 0x0d, 0x40, 0xd2, 0x09, + 0x20, 0xff, 0x90, 0x00, 0xf0, 0x19, 0xff, 0xf2, 0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0xf0, 0x19, - 0xfc, 0x91, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, + 0xff, 0xf1, 0xe0, 0x01, 0x20, 0x00, 0x90, 0x00, 0x24, 0x00, 0x20, 0x01, 0x40, 0xa8, 0x1c, 0x02, 0x49, 0x3f, 0x1c, 0x13, 0x68, 0x08, 0x40, 0x03, 0xd0, 0x69, 0x43, 0xd2, 0x40, 0x10, 0x00, 0xae, @@ -1283,53 +1303,53 @@ 0xd0, 0x62, 0x78, 0x81, 0x91, 0x02, 0x08, 0x49, 0xd3, 0x02, 0x23, 0x12, 0x93, 0x01, 0xe0, 0x01, 0x23, 0x11, 0x93, 0x01, 0x1c, 0x39, 0xf0, 0x0c, - 0xfa, 0xd3, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, - 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0x8c, + 0xfe, 0x11, 0x1c, 0x04, 0x59, 0xa8, 0x6b, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x03, 0xf8, 0xac, 0x59, 0xa8, 0x6a, 0xc0, 0x28, 0x00, 0xd0, 0x01, - 0xf0, 0x03, 0xf8, 0x86, 0x59, 0xa8, 0xf0, 0x03, - 0xf8, 0x83, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, + 0xf0, 0x03, 0xf8, 0xa6, 0x59, 0xa8, 0xf0, 0x03, + 0xf8, 0xa3, 0x20, 0x00, 0x51, 0xa8, 0x00, 0xbd, 0x48, 0x2b, 0x59, 0x40, 0x78, 0x80, 0x28, 0x00, - 0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x0f, 0xfd, 0xf8, + 0xd1, 0x40, 0x1c, 0x39, 0xf0, 0x10, 0xf9, 0x36, 0x2c, 0x00, 0xd1, 0x2a, 0x98, 0x02, 0x09, 0x80, 0xd3, 0x0a, 0x21, 0x00, 0x1c, 0x3a, 0x48, 0x25, - 0xf0, 0x0f, 0xff, 0x93, 0x28, 0x00, 0xd0, 0x03, + 0xf0, 0x10, 0xfa, 0xd1, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x00, 0xb4, 0x04, 0x22, 0x02, 0x9b, 0x02, - 0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x07, 0xff, 0x7a, + 0x1c, 0x38, 0x49, 0x1e, 0xf0, 0x08, 0xfa, 0xb8, 0xb0, 0x01, 0x1c, 0x04, 0xd1, 0x11, 0x9a, 0x01, 0xb4, 0x04, 0x26, 0x00, 0x21, 0x00, 0x1c, 0x3a, - 0x1c, 0x33, 0x48, 0x18, 0xf0, 0x0f, 0xff, 0xe4, + 0x1c, 0x33, 0x48, 0x18, 0xf0, 0x10, 0xfb, 0x22, 0x1c, 0x04, 0xb0, 0x01, 0x48, 0x16, 0x55, 0xc6, 0x48, 0x16, 0x55, 0xc6, 0x1c, 0x38, 0xf7, 0xff, - 0xfa, 0xc5, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, - 0xf8, 0x47, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, + 0xfa, 0xc1, 0x4f, 0x15, 0x59, 0x78, 0xf0, 0x03, + 0xf8, 0x67, 0x26, 0x00, 0x51, 0x7e, 0x37, 0x80, 0x59, 0x78, 0x28, 0x00, 0xd0, 0x04, 0xf0, 0x03, - 0xf8, 0x3f, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, + 0xf8, 0x5f, 0x51, 0x7e, 0xe0, 0x02, 0xe0, 0x00, 0xe0, 0x00, 0x24, 0x12, 0x98, 0x00, 0x28, 0x00, - 0xd0, 0x05, 0xf0, 0x19, 0xfc, 0x0f, 0x4b, 0x0b, - 0x40, 0x18, 0xf0, 0x19, 0xfc, 0x0f, 0x1c, 0x20, + 0xd0, 0x05, 0xf0, 0x19, 0xff, 0x6f, 0x4b, 0x0b, + 0x40, 0x18, 0xf0, 0x19, 0xff, 0x6f, 0x1c, 0x20, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x01, 0xf0, 0x2e, 0x08, 0x01, 0xf4, - 0x2e, 0x08, 0x5e, 0x64, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x44, 0x50, 0x2e, 0x08, 0x44, 0x30, - 0x2e, 0x08, 0x02, 0x74, 0xff, 0xef, 0xff, 0xff, + 0x2e, 0x08, 0x01, 0xec, 0x2e, 0x08, 0x01, 0xf0, + 0x2e, 0x08, 0x5e, 0x5c, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x44, 0x48, 0x2e, 0x08, 0x44, 0x28, + 0x2e, 0x08, 0x02, 0x70, 0xff, 0xef, 0xff, 0xff, 0xb5, 0xb0, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x80, 0x1c, 0x0c, 0x1c, 0x17, 0xb0, 0xad, 0x49, 0x1c, 0x58, 0x08, 0x90, 0x04, 0x78, 0x81, 0x23, 0x04, 0x40, 0x19, 0x25, 0x00, 0x29, 0x00, 0xd0, 0x0b, - 0xa9, 0x25, 0xf0, 0x0c, 0xfe, 0x95, 0xab, 0x00, + 0xa9, 0x25, 0xf0, 0x0d, 0xf9, 0xd3, 0xab, 0x00, 0x80, 0x5d, 0xa8, 0x25, 0x90, 0x24, 0x46, 0x68, - 0x21, 0x00, 0xf0, 0x0c, 0xfe, 0xb4, 0xe0, 0x0c, + 0x21, 0x00, 0xf0, 0x0d, 0xf9, 0xf2, 0xe0, 0x0c, 0x78, 0x00, 0x0a, 0x00, 0xd3, 0x04, 0x20, 0x01, 0x03, 0x00, 0xab, 0x00, 0x80, 0x58, 0xe0, 0x03, 0x20, 0x01, 0x02, 0x80, 0xab, 0x00, 0x80, 0x58, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x0e, 0xa8, 0x00, - 0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xca, + 0x88, 0x40, 0x60, 0x38, 0xf0, 0x02, 0xff, 0xea, 0x60, 0x20, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x13, - 0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x0c, - 0xfe, 0x96, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, + 0xe0, 0x06, 0x1c, 0x01, 0x46, 0x68, 0xf0, 0x0d, + 0xf9, 0xd4, 0xe0, 0x01, 0x60, 0x25, 0x60, 0x3d, 0xb0, 0x2d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x01, 0xf4, 0xb4, 0xf0, 0x06, 0x12, + 0x2e, 0x08, 0x01, 0xf0, 0xb4, 0xf0, 0x06, 0x12, 0x0e, 0x12, 0x06, 0x1b, 0x0e, 0x1b, 0x9c, 0x06, 0x9f, 0x07, 0x9d, 0x05, 0x9e, 0x04, 0x06, 0x36, 0x0e, 0x36, 0x06, 0x2d, 0xd0, 0x02, 0x25, 0x80, @@ -1342,65 +1362,65 @@ 0x1c, 0x3c, 0x18, 0x24, 0x77, 0x26, 0x33, 0x02, 0x06, 0x1b, 0x0e, 0x1b, 0x1c, 0x2f, 0x42, 0x93, 0xdb, 0xee, 0xbc, 0xf0, 0x47, 0x70, 0xb5, 0xf0, - 0xb0, 0xac, 0x21, 0x00, 0xa8, 0x07, 0xf0, 0x0c, - 0xfd, 0x1b, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, + 0xb0, 0xac, 0x21, 0x00, 0xa8, 0x07, 0xf0, 0x0d, + 0xf8, 0x59, 0xa8, 0x07, 0x78, 0x00, 0x90, 0x06, 0x28, 0x00, 0xd0, 0x4b, 0x24, 0x00, 0x98, 0x06, 0x28, 0x00, 0xdd, 0x43, 0xa8, 0x07, 0xf0, 0x0d, - 0xf8, 0xe2, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08, + 0xfc, 0x20, 0x00, 0xa1, 0xa8, 0x07, 0x18, 0x08, 0x69, 0x07, 0x78, 0xfe, 0xad, 0x07, 0x88, 0x6d, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, 0xa8, 0x07, - 0xa9, 0x01, 0xf0, 0x10, 0xfb, 0x31, 0x78, 0xb8, + 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x6f, 0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, 0x1c, 0x38, - 0xa9, 0x01, 0xf0, 0x10, 0xfb, 0x5e, 0xe0, 0x08, + 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x9c, 0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, - 0xfb, 0x9b, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, + 0xfe, 0xd9, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, - 0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0x4a, + 0xd3, 0x16, 0x1c, 0x28, 0xf7, 0xfd, 0xfe, 0x3a, 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x07, 0x1c, 0x39, - 0xf0, 0x0c, 0xff, 0x54, 0x28, 0x00, 0xd1, 0x09, + 0xf0, 0x0d, 0xfa, 0x92, 0x28, 0x00, 0xd1, 0x09, 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfd, - 0xfe, 0x99, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, - 0xfe, 0x8b, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x88, + 0xfe, 0x89, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, + 0xfe, 0x7b, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x78, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0x98, 0x06, - 0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x0c, - 0xfd, 0xbd, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x5c, + 0x42, 0x84, 0xdb, 0xbb, 0xa8, 0x07, 0xf0, 0x0d, + 0xf8, 0xfb, 0xe7, 0xaa, 0xf7, 0xff, 0xfa, 0x58, 0xb0, 0x2c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0xb0, 0xad, 0x21, 0x00, 0xa8, 0x08, - 0xf0, 0x0c, 0xfc, 0xbe, 0x22, 0x05, 0x21, 0x16, - 0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x54, 0x2c, 0xb2, + 0xf0, 0x0c, 0xff, 0xfc, 0x22, 0x05, 0x21, 0x16, + 0x1c, 0x04, 0xf0, 0x03, 0xfd, 0x76, 0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, 0xf0, 0x0c, - 0xfc, 0x6d, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, + 0xff, 0xab, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x25, 0x00, 0x98, 0x06, 0x28, 0x00, 0xdd, 0x57, 0xa8, 0x08, 0xf0, 0x0d, - 0xf8, 0x7a, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08, + 0xfb, 0xb8, 0x00, 0xa9, 0xa8, 0x08, 0x18, 0x08, 0x69, 0x07, 0x78, 0xf8, 0x90, 0x07, 0xae, 0x08, 0x88, 0x76, 0x78, 0xb8, 0x09, 0xc0, 0xd3, 0x12, - 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 0xfa, 0xc8, + 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x06, 0x78, 0xb8, 0x08, 0x40, 0xd3, 0x05, 0x46, 0x6a, - 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 0xfa, 0xf5, + 0x1c, 0x38, 0xa9, 0x01, 0xf0, 0x10, 0xfe, 0x33, 0xe0, 0x08, 0x46, 0x6a, 0x1c, 0x38, 0xa9, 0x01, - 0xf0, 0x10, 0xfb, 0x32, 0xe0, 0x02, 0x20, 0x40, + 0xf0, 0x10, 0xfe, 0x70, 0xe0, 0x02, 0x20, 0x40, 0xab, 0x00, 0x70, 0x18, 0xa8, 0x00, 0x78, 0x00, 0x09, 0xc0, 0xd3, 0x29, 0x78, 0xb8, 0x09, 0x80, 0xd3, 0x0f, 0xa8, 0x08, 0xa9, 0x01, 0xf0, 0x10, - 0xfc, 0x8f, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, + 0xff, 0xcd, 0x1c, 0x04, 0xa8, 0x00, 0x78, 0x00, 0x08, 0x80, 0xd2, 0x02, 0x78, 0xb8, 0x08, 0x80, - 0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x96, - 0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfd, 0xce, + 0xd3, 0x1a, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0xd4, + 0xe0, 0x16, 0x1c, 0x30, 0xf7, 0xfd, 0xfd, 0xbe, 0x1c, 0x07, 0xd0, 0x11, 0xa8, 0x08, 0x1c, 0x39, - 0xf0, 0x0c, 0xfe, 0xd8, 0x28, 0x00, 0xd1, 0x09, + 0xf0, 0x0d, 0xfa, 0x16, 0x28, 0x00, 0xd1, 0x09, 0x98, 0x07, 0x1c, 0x31, 0x1c, 0x3a, 0xf7, 0xfd, - 0xfe, 0x1d, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, - 0xfe, 0x0f, 0xe0, 0x01, 0xf7, 0xfd, 0xfe, 0x0c, + 0xfe, 0x0d, 0x28, 0x00, 0xd0, 0x04, 0xf7, 0xfd, + 0xfd, 0xff, 0xe0, 0x01, 0xf7, 0xfd, 0xfd, 0xfc, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x06, 0x42, 0x85, 0xdb, 0xa7, 0x98, 0x06, 0x28, 0x00, - 0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x0c, 0xfd, 0x3e, + 0xd0, 0x08, 0xa8, 0x08, 0xf0, 0x0d, 0xf8, 0x7c, 0x2c, 0xb2, 0xd1, 0x03, 0x21, 0x00, 0xa8, 0x08, - 0xf0, 0x0c, 0xfc, 0x00, 0xf7, 0xff, 0xf9, 0x5c, + 0xf0, 0x0c, 0xff, 0x3e, 0xf7, 0xff, 0xf9, 0x58, 0x21, 0x00, 0xa8, 0x08, 0xf7, 0xff, 0xfb, 0x88, 0x1c, 0x04, 0xa8, 0x08, 0x78, 0x00, 0x90, 0x06, 0x28, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xd1, 0x89, - 0xf7, 0xff, 0xf9, 0xca, 0xb0, 0x2d, 0xbc, 0xf0, + 0xf7, 0xff, 0xf9, 0xc6, 0xb0, 0x2d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x26, 0x00, 0x48, 0x28, 0x71, 0x06, 0x70, 0x06, 0x20, 0x00, 0x4f, 0x27, 0x4a, 0x28, 0x49, 0x28, 0x00, 0x43, @@ -1409,10 +1429,10 @@ 0xdb, 0xf5, 0x28, 0x20, 0xda, 0x08, 0x00, 0x43, 0x52, 0xd6, 0x00, 0x83, 0x50, 0xce, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x20, 0xdb, 0xf6, - 0x20, 0x01, 0x02, 0x80, 0xf0, 0x19, 0xfa, 0x6d, - 0xf0, 0x19, 0xfa, 0x70, 0x4b, 0x1b, 0x40, 0x18, - 0xf0, 0x19, 0xfa, 0x70, 0x49, 0x1a, 0x20, 0x0a, - 0xf0, 0x19, 0xfa, 0x70, 0x21, 0x00, 0x4f, 0x19, + 0x20, 0x01, 0x02, 0x80, 0xf0, 0x19, 0xfd, 0xcd, + 0xf0, 0x19, 0xfd, 0xd0, 0x4b, 0x1b, 0x40, 0x18, + 0xf0, 0x19, 0xfd, 0xd0, 0x49, 0x1a, 0x20, 0x0a, + 0xf0, 0x19, 0xfd, 0xd0, 0x21, 0x00, 0x4f, 0x19, 0x20, 0xff, 0x4a, 0x19, 0x00, 0x4b, 0x18, 0x5b, 0x01, 0x1b, 0x52, 0xd7, 0x18, 0x9b, 0x70, 0x98, 0x70, 0xde, 0x71, 0x1e, 0x1d, 0xdc, 0x34, 0x19, @@ -1422,11 +1442,11 @@ 0x0e, 0x1b, 0x60, 0xa6, 0x2b, 0x04, 0xdb, 0xf5, 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, 0xdb, 0xe0, 0x1c, 0x30, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xbc, - 0x2e, 0x08, 0x49, 0xb8, 0x2e, 0x08, 0x49, 0x78, - 0x2e, 0x08, 0x45, 0xf0, 0xff, 0xff, 0xfb, 0xff, - 0x2e, 0x00, 0x30, 0xdd, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x44, 0x70, 0xb5, 0xf0, 0x06, 0x00, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xb8, + 0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70, + 0x2e, 0x08, 0x45, 0xe8, 0xff, 0xff, 0xfb, 0xff, + 0x2e, 0x00, 0x31, 0x7d, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x44, 0x68, 0xb5, 0xf0, 0x06, 0x00, 0x0e, 0x00, 0xb0, 0x83, 0x90, 0x00, 0x04, 0x09, 0x0c, 0x09, 0x91, 0x01, 0x06, 0x10, 0x0e, 0x00, 0x04, 0x1c, 0x0c, 0x24, 0x27, 0x00, 0x49, 0x5a, @@ -1441,7 +1461,7 @@ 0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x9f, 0x02, 0x53, 0xbb, 0x00, 0x53, 0x18, 0x9a, 0x01, 0x12, 0x18, 0x57, 0x80, 0x38, 0x20, 0x14, 0xf0, 0x02, - 0xfd, 0xf9, 0x1c, 0x01, 0x62, 0xb8, 0x20, 0x00, + 0xfe, 0x19, 0x1c, 0x01, 0x62, 0xb8, 0x20, 0x00, 0x29, 0x00, 0xd1, 0x08, 0x49, 0x41, 0x80, 0x39, 0x9f, 0x02, 0x53, 0xb8, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x0d, @@ -1456,9 +1476,9 @@ 0x24, 0x01, 0x03, 0xa4, 0xe0, 0x04, 0x24, 0x01, 0x03, 0xe4, 0xe0, 0x01, 0x24, 0x01, 0x02, 0xa4, 0x80, 0xac, 0x88, 0xa8, 0x00, 0x80, 0xf0, 0x02, - 0xfd, 0xbd, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, + 0xfd, 0xdd, 0x60, 0x28, 0x28, 0x00, 0xd1, 0x0d, 0x48, 0x24, 0x80, 0x38, 0x20, 0x00, 0x9f, 0x02, - 0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xd4, + 0x53, 0xb8, 0x1c, 0x28, 0xf0, 0x02, 0xfd, 0xf4, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x70, 0xb8, 0x26, 0x00, 0x88, 0x38, 0x00, 0x80, 0x49, 0x1d, @@ -1466,19 +1486,19 @@ 0x68, 0x2a, 0x18, 0x8a, 0x00, 0xc1, 0x19, 0xc9, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x60, 0x8a, 0x28, 0x04, 0xdb, 0xf3, 0x20, 0xb8, 0x1c, 0x21, - 0xf0, 0x15, 0xfa, 0x56, 0x1d, 0xfc, 0x34, 0x19, + 0xf0, 0x15, 0xfd, 0x94, 0x1d, 0xfc, 0x34, 0x19, 0x73, 0x20, 0x72, 0x2e, 0x78, 0xb8, 0x23, 0x01, - 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x07, - 0xfe, 0x89, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0xf0, 0x08, + 0xf9, 0xc7, 0x22, 0x00, 0xb4, 0x04, 0x78, 0xb8, 0x23, 0x05, 0x22, 0x02, 0x99, 0x02, 0xf0, 0x07, - 0xfc, 0xbd, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, + 0xff, 0xfb, 0x22, 0x04, 0x7b, 0x21, 0xb0, 0x01, 0xb4, 0x06, 0x78, 0xb9, 0x22, 0x0a, 0x20, 0x85, - 0x6a, 0xbb, 0xf0, 0x07, 0xff, 0x05, 0x1c, 0x30, + 0x6a, 0xbb, 0xf0, 0x08, 0xfa, 0x43, 0x1c, 0x30, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x44, 0x70, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x49, 0x78, 0x2e, 0x08, 0x45, 0xf0, + 0x2e, 0x08, 0x44, 0x68, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x45, 0xe8, 0xb5, 0xf0, 0xb0, 0x82, 0x46, 0x68, 0xf0, 0x08, - 0xfc, 0x99, 0x21, 0x00, 0x4f, 0x24, 0x4b, 0x25, + 0xff, 0xd7, 0x21, 0x00, 0x4f, 0x24, 0x4b, 0x25, 0x93, 0x01, 0x4a, 0x25, 0x00, 0x48, 0x18, 0x40, 0x01, 0x00, 0x19, 0xc0, 0x78, 0x84, 0x9d, 0x00, 0x40, 0xe5, 0x07, 0xeb, 0x0f, 0xdb, 0x2b, 0x01, @@ -1497,8 +1517,8 @@ 0x68, 0x03, 0x33, 0x01, 0x60, 0x03, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 0x29, 0x08, 0xdb, 0xbd, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x44, 0x70, 0x2e, 0x08, 0x45, 0xf0, - 0x2e, 0x08, 0x03, 0xbc, 0xb5, 0xf0, 0x04, 0x05, + 0x2e, 0x08, 0x44, 0x68, 0x2e, 0x08, 0x45, 0xe8, + 0x2e, 0x08, 0x03, 0xb8, 0xb5, 0xf0, 0x04, 0x05, 0x0c, 0x2d, 0x20, 0x00, 0x4c, 0x31, 0x00, 0x42, 0x18, 0x12, 0x01, 0x12, 0x5a, 0xa2, 0x42, 0xaa, 0xd1, 0x01, 0x1c, 0x01, 0xe0, 0x04, 0x30, 0x01, @@ -1506,7 +1526,7 @@ 0x28, 0x08, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x48, 0x18, 0x40, 0x01, 0x00, 0x19, 0x07, 0x78, 0xb8, - 0x49, 0x25, 0xf0, 0x07, 0xfe, 0xd1, 0x79, 0x78, + 0x49, 0x25, 0xf0, 0x08, 0xfa, 0x0f, 0x79, 0x78, 0x23, 0x02, 0x43, 0x18, 0x71, 0x78, 0x78, 0xbe, 0x20, 0xff, 0x70, 0xb8, 0x21, 0x00, 0x1d, 0xf8, 0x30, 0x19, 0x73, 0x01, 0x21, 0x06, 0x73, 0x41, @@ -1514,31 +1534,31 @@ 0x79, 0x78, 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 0xd0, 0x0c, 0x20, 0x00, 0x70, 0xf8, 0x71, 0x38, 0x71, 0x78, 0x48, 0x17, 0x80, 0x38, 0x6a, 0xb8, - 0x68, 0x00, 0xf0, 0x02, 0xfc, 0xf5, 0x6a, 0xb8, - 0xf0, 0x02, 0xfc, 0xf2, 0x4f, 0x12, 0x00, 0x68, + 0x68, 0x00, 0xf0, 0x02, 0xfd, 0x15, 0x6a, 0xb8, + 0xf0, 0x02, 0xfd, 0x12, 0x4f, 0x12, 0x00, 0x68, 0x49, 0x12, 0x52, 0x0f, 0x00, 0x71, 0x4a, 0x12, 0x52, 0x57, 0x21, 0x00, 0x4a, 0x11, 0x52, 0x11, - 0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x02, 0xff, 0xf0, + 0x1c, 0x30, 0x1c, 0x29, 0xf0, 0x03, 0xf8, 0x12, 0x20, 0x00, 0x00, 0x41, 0x18, 0x09, 0x01, 0x09, 0x5a, 0x61, 0x42, 0xb9, 0xd1, 0x04, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x08, 0xdb, 0xf4, 0x28, 0x08, 0xd1, 0x03, 0x21, 0x00, 0x48, 0x08, 0x71, 0x01, 0x70, 0x01, 0x20, 0x00, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x44, 0x70, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x38, - 0x2e, 0x08, 0x49, 0x00, 0x2e, 0x08, 0x49, 0x78, - 0x2e, 0x08, 0x03, 0xbc, 0xb5, 0x80, 0x1c, 0x07, - 0x30, 0x28, 0xf0, 0x02, 0xfc, 0x9b, 0x49, 0x07, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x44, 0x68, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, + 0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x49, 0x70, + 0x2e, 0x08, 0x03, 0xb8, 0xb5, 0x80, 0x1c, 0x07, + 0x30, 0x28, 0xf0, 0x02, 0xfc, 0xbb, 0x49, 0x07, 0x64, 0x88, 0x65, 0x08, 0x65, 0x48, 0x19, 0xc0, 0x64, 0xc8, 0x20, 0x00, 0x64, 0x08, 0x64, 0x4f, 0x49, 0x03, 0x84, 0x08, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x01, 0x00, 0xb5, 0x80, 0x1c, 0x07, - 0x30, 0x28, 0xf0, 0x02, 0xfc, 0x83, 0x49, 0x06, + 0x30, 0x28, 0xf0, 0x02, 0xfc, 0xa3, 0x49, 0x06, 0x66, 0x08, 0x66, 0x88, 0x66, 0xc8, 0x19, 0xc0, 0x66, 0x48, 0x20, 0x00, 0x65, 0x88, 0x65, 0xcf, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x03, 0xc4, 0xb4, 0x80, 0x04, 0x09, + 0x2e, 0x08, 0x03, 0xc0, 0xb4, 0x80, 0x04, 0x09, 0x0c, 0x09, 0x88, 0x02, 0x42, 0x8a, 0xd0, 0x18, 0x4a, 0x0d, 0x8f, 0x13, 0x2b, 0x01, 0xd0, 0x04, 0x23, 0x01, 0x87, 0x13, 0x8f, 0x17, 0x2f, 0x01, @@ -1560,21 +1580,21 @@ 0x88, 0x38, 0xf0, 0x00, 0xf8, 0xbd, 0xe0, 0x0e, 0xf0, 0x00, 0xf9, 0x6a, 0xe0, 0x0b, 0xf0, 0x00, 0xf9, 0xd5, 0xe0, 0x08, 0x88, 0x79, 0x88, 0x38, - 0xf0, 0x00, 0xfc, 0x70, 0xe0, 0x03, 0x48, 0x08, + 0xf0, 0x00, 0xfc, 0x9c, 0xe0, 0x03, 0x48, 0x08, 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9f, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, - 0x2e, 0x08, 0x04, 0x04, 0xb5, 0xf0, 0x04, 0x04, + 0x2e, 0x08, 0x04, 0x00, 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x1c, 0x17, 0x2d, 0x10, 0xdd, 0x03, 0x20, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x19, 0xf8, 0x32, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x19, 0xfb, 0x92, 0x1c, 0x68, 0x10, 0x40, 0x00, 0x40, 0x04, 0x01, 0x0c, 0x09, 0x1c, 0x88, 0x00, 0x40, 0x1d, 0x02, 0x48, 0x1c, 0x6c, 0x03, 0x18, 0x9d, 0x6c, 0x46, 0x4b, 0x1b, 0x42, 0xb5, 0xdd, 0x0a, 0x88, 0x19, 0x1c, 0x18, 0x23, 0x20, 0x43, 0x19, 0x80, 0x01, - 0xf0, 0x19, 0xf8, 0x52, 0x20, 0x01, 0xbc, 0xf0, + 0xf0, 0x19, 0xfb, 0xb2, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x64, 0x05, 0x35, 0x28, 0x42, 0xb5, 0xdd, 0x04, 0x88, 0x1e, 0x1c, 0x1d, 0x23, 0x10, 0x43, 0x33, 0x80, 0x2b, 0x6d, 0x03, @@ -1584,8 +1604,8 @@ 0x37, 0x02, 0x42, 0x8b, 0xdb, 0xf6, 0x6d, 0x01, 0x18, 0x8a, 0x6c, 0xc3, 0x42, 0x9a, 0xd9, 0x00, 0x6c, 0x82, 0x60, 0x0a, 0x65, 0x02, 0xf0, 0x19, - 0xf8, 0x2b, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, + 0xfb, 0x8b, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8, 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x08, 0x0c, 0x00, 0x28, 0x10, 0xdd, 0x02, 0x20, 0x02, 0xbc, 0xf0, 0x47, 0x70, @@ -1604,11 +1624,11 @@ 0x6e, 0x43, 0x42, 0x99, 0xd3, 0x00, 0x6e, 0x01, 0x60, 0x11, 0x66, 0x81, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, - 0x2e, 0x08, 0x03, 0xc4, 0x2c, 0x00, 0x00, 0xf8, + 0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0xb0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, - 0x0c, 0x2d, 0x1c, 0x17, 0xf0, 0x18, 0xff, 0x9a, + 0x0c, 0x2d, 0x1c, 0x17, 0xf0, 0x19, 0xfa, 0xfa, 0x1c, 0x20, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xff, - 0xff, 0xa9, 0x1c, 0x07, 0xf0, 0x18, 0xff, 0xc8, + 0xff, 0xa9, 0x1c, 0x07, 0xf0, 0x19, 0xfb, 0x28, 0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x09, 0x0c, 0x09, 0x29, 0x08, 0xdd, 0x02, 0x20, 0x02, @@ -1626,29 +1646,29 @@ 0x6e, 0x81, 0x19, 0xca, 0x6e, 0x43, 0x42, 0x9a, 0xd3, 0x00, 0x6e, 0x02, 0x60, 0x0a, 0x66, 0x82, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x03, 0xc4, 0x2c, 0x00, 0x00, 0xf8, + 0x2e, 0x08, 0x03, 0xc0, 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x48, 0x28, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x4f, 0x27, 0x28, 0x01, 0xd0, 0x13, 0x28, 0x02, 0xd0, 0x1a, 0x28, 0x03, 0xd1, 0x0c, 0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xdb, 0x02, 0x88, 0x41, 0x29, 0x0f, 0xdd, 0x2f, 0x88, 0x01, - 0x04, 0x09, 0x88, 0x40, 0x43, 0x08, 0xf0, 0x0a, - 0xfe, 0x43, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x04, 0x09, 0x88, 0x40, 0x43, 0x08, 0xf0, 0x0b, + 0xf9, 0x81, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 0x88, 0x82, 0x88, 0x41, 0x88, 0x00, - 0xf0, 0x0d, 0xfd, 0x22, 0xbc, 0x80, 0xbc, 0x08, + 0xf0, 0x0e, 0xf8, 0x60, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09, 0x88, 0xc2, 0x43, 0x11, 0x88, 0x02, 0x04, 0x12, - 0x88, 0x40, 0x43, 0x10, 0xf0, 0x0d, 0xf9, 0xc6, + 0x88, 0x40, 0x43, 0x10, 0xf0, 0x0d, 0xfd, 0x04, 0x68, 0x38, 0x88, 0x41, 0x29, 0x0e, 0xd1, 0x08, 0x88, 0x81, 0x04, 0x09, 0x88, 0xc0, 0x43, 0x08, - 0xf0, 0x0a, 0xfc, 0xc0, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x20, 0x01, 0xf0, 0x0a, 0xfc, 0xba, + 0xf0, 0x0a, 0xff, 0xfe, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0xf0, 0x0a, 0xff, 0xf8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x41, 0x48, 0x08, 0x29, 0x0e, 0xd1, 0x02, 0x21, 0x00, 0x60, 0x01, 0xe0, 0x01, 0x21, 0x01, 0x60, 0x01, - 0x68, 0x00, 0xf0, 0x00, 0xfb, 0xc3, 0xbc, 0x80, + 0x68, 0x00, 0xf0, 0x00, 0xfb, 0xe1, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x00, 0xfc, - 0x2e, 0x08, 0x03, 0xc4, 0x2e, 0x08, 0x04, 0xfc, + 0x2e, 0x08, 0x03, 0xc0, 0x2e, 0x08, 0x04, 0xf4, 0xb5, 0x90, 0x48, 0x31, 0x88, 0x00, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x30, 0x22, 0x03, 0x21, 0x02, 0x4f, 0x2f, 0x2c, 0x08, 0xd2, 0x4f, 0xa3, 0x02, @@ -1656,18 +1676,18 @@ 0x04, 0x4b, 0x10, 0x16, 0x1c, 0x28, 0x34, 0x3f, 0x68, 0x39, 0x88, 0x49, 0x06, 0x09, 0x0e, 0x09, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x03, - 0xfa, 0x85, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x03, 0xf7, 0xfd, 0xff, 0xdd, 0xbc, 0x90, + 0xfa, 0xa7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x03, 0xf7, 0xfd, 0xff, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, 0xf7, 0xfd, - 0xff, 0xd7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xff, 0xdb, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x00, 0x4b, 0x1e, 0x28, 0x00, 0xd0, 0x03, 0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x00, 0x4b, 0x19, 0x28, 0x00, 0xd0, 0x03, 0x60, 0x1a, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x60, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0xf0, 0x02, 0xfe, 0x50, 0x68, 0x39, 0x88, 0x4a, - 0x1d, 0x08, 0x88, 0x09, 0xf7, 0xfe, 0xf8, 0x4e, + 0xf0, 0x02, 0xfe, 0x72, 0x68, 0x39, 0x88, 0x4a, + 0x1d, 0x08, 0x88, 0x09, 0xf7, 0xfe, 0xf8, 0x52, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x38, 0x88, 0x81, 0x04, 0x09, 0x88, 0xc2, 0x18, 0x8a, 0x88, 0x01, 0x04, 0x09, 0x88, 0x40, 0x50, 0x0a, @@ -1675,1138 +1695,1146 @@ 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, 0x86, 0x81, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x01, 0x00, - 0x2e, 0x08, 0x03, 0xc4, 0x6e, 0x00, 0x13, 0x00, - 0x6e, 0x00, 0x12, 0x00, 0xb5, 0x90, 0xb0, 0x84, - 0x48, 0x76, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, - 0x4c, 0x75, 0x4f, 0x76, 0x28, 0x0a, 0xd2, 0x60, + 0x2e, 0x08, 0x03, 0xc0, 0x6e, 0x00, 0x13, 0x00, + 0x6e, 0x00, 0x12, 0x00, 0xb5, 0x90, 0xb0, 0x86, + 0x48, 0x80, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0x4c, 0x7f, 0x4f, 0x80, 0x28, 0x0b, 0xd2, 0x61, 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, - 0x04, 0x0e, 0x16, 0x39, 0x5d, 0x85, 0x8f, 0xbc, - 0xc4, 0xd2, 0xf0, 0x0a, 0xff, 0xfb, 0x90, 0x03, - 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x03, - 0x68, 0x39, 0x80, 0x48, 0xe0, 0xcd, 0x20, 0x1e, - 0xa9, 0x03, 0xf0, 0x0a, 0xfe, 0xfd, 0x98, 0x03, - 0x68, 0x39, 0x80, 0x08, 0xe0, 0xc5, 0x1c, 0x20, - 0xf0, 0x0d, 0xfa, 0xf4, 0x20, 0x00, 0x00, 0x81, - 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 0x52, 0x99, - 0x30, 0x01, 0x28, 0x04, 0xdd, 0xf7, 0x20, 0x07, + 0x05, 0x0f, 0x17, 0x3a, 0x5e, 0x86, 0x90, 0xbd, + 0xc5, 0xd3, 0xd8, 0x00, 0xf0, 0x0b, 0xfb, 0x38, + 0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, + 0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0xe0, + 0x20, 0x1e, 0xa9, 0x05, 0xf0, 0x0b, 0xfa, 0x3a, + 0x98, 0x05, 0x68, 0x39, 0x80, 0x08, 0xe0, 0xd8, + 0x1c, 0x20, 0xf0, 0x0d, 0xfe, 0x31, 0x20, 0x00, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, - 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x91, 0x30, 0x01, - 0x28, 0x0b, 0xdd, 0xf5, 0x20, 0x0d, 0x00, 0x81, - 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, - 0x3a, 0x40, 0x87, 0x51, 0x30, 0x01, 0x28, 0x12, - 0xdd, 0xf5, 0xe0, 0xa2, 0x20, 0x13, 0x00, 0x81, - 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, - 0x3a, 0x40, 0x83, 0x51, 0x30, 0x01, 0x28, 0x15, - 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 0x19, 0x09, - 0x6d, 0x89, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, - 0x80, 0xd1, 0x30, 0x01, 0x28, 0x0a, 0xdd, 0xf5, - 0x20, 0x00, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, - 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, - 0x83, 0x91, 0x30, 0x01, 0x28, 0x01, 0xdd, 0xf4, - 0xe0, 0x7f, 0xe0, 0x79, 0x20, 0x02, 0x00, 0x81, - 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, + 0x52, 0x99, 0x30, 0x01, 0x28, 0x04, 0xdd, 0xf7, + 0x20, 0x07, 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x91, - 0x30, 0x01, 0x28, 0x05, 0xdd, 0xf3, 0x20, 0x09, + 0x30, 0x01, 0x28, 0x0b, 0xdd, 0xf5, 0x20, 0x0d, + 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, + 0x18, 0xd2, 0x3a, 0x40, 0x87, 0x51, 0x30, 0x01, + 0x28, 0x12, 0xdd, 0xf5, 0xe0, 0xb5, 0x20, 0x13, + 0x00, 0x81, 0x58, 0x61, 0x00, 0x42, 0x68, 0x3b, + 0x18, 0xd2, 0x3a, 0x40, 0x83, 0x51, 0x30, 0x01, + 0x28, 0x15, 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, + 0x19, 0x09, 0x6d, 0x89, 0x00, 0x42, 0x68, 0x3b, + 0x18, 0xd2, 0x80, 0xd1, 0x30, 0x01, 0x28, 0x0a, + 0xdd, 0xf5, 0x20, 0x00, 0x00, 0x81, 0x19, 0x09, + 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, + 0x18, 0xd2, 0x83, 0x91, 0x30, 0x01, 0x28, 0x01, + 0xdd, 0xf4, 0xe0, 0x92, 0xe0, 0x8c, 0x20, 0x02, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, 0x3a, 0x40, - 0x86, 0xd1, 0x30, 0x01, 0x28, 0x0f, 0xdd, 0xf3, - 0x20, 0x11, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, + 0x87, 0x91, 0x30, 0x01, 0x28, 0x05, 0xdd, 0xf3, + 0x20, 0x09, 0x00, 0x81, 0x19, 0x09, 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, 0x18, 0xd2, - 0x3a, 0x40, 0x86, 0x91, 0x30, 0x01, 0x28, 0x13, - 0xdd, 0xf3, 0xe0, 0x56, 0x22, 0x00, 0x21, 0x00, - 0x20, 0x01, 0x02, 0xc0, 0xf7, 0xff, 0xfe, 0x48, - 0x6f, 0xb8, 0x49, 0x2d, 0x80, 0x08, 0xe0, 0x4c, - 0x46, 0x68, 0xf0, 0x10, 0xf8, 0xdb, 0x98, 0x00, - 0x0c, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x00, - 0x68, 0x39, 0x80, 0x48, 0x98, 0x01, 0x0c, 0x00, - 0x68, 0x39, 0x80, 0x88, 0x98, 0x01, 0x68, 0x39, - 0x80, 0xc8, 0x98, 0x02, 0x0c, 0x00, 0x68, 0x39, - 0x81, 0x08, 0x98, 0x02, 0x68, 0x39, 0x81, 0x48, - 0x20, 0x00, 0x68, 0x39, 0x81, 0x88, 0x68, 0x38, - 0x89, 0x81, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x19, - 0x81, 0x81, 0x48, 0x1c, 0x68, 0x39, 0x81, 0xc8, - 0x48, 0x1b, 0x68, 0x01, 0x14, 0x09, 0x68, 0x3a, - 0x82, 0x11, 0x68, 0x00, 0x68, 0x39, 0x82, 0x48, - 0xe0, 0x1f, 0x20, 0x19, 0x06, 0x80, 0x6b, 0x80, - 0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, 0x80, 0x08, - 0xe0, 0x17, 0x68, 0x38, 0x88, 0x01, 0x04, 0x09, - 0x88, 0x40, 0x18, 0x08, 0x68, 0x00, 0x90, 0x03, - 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, 0x98, 0x03, - 0x68, 0x39, 0x80, 0x48, 0xe0, 0x09, 0x48, 0x0d, - 0x68, 0x00, 0x68, 0x39, 0x80, 0x08, 0xe0, 0x04, + 0x3a, 0x40, 0x86, 0xd1, 0x30, 0x01, 0x28, 0x0f, + 0xdd, 0xf3, 0x20, 0x11, 0x00, 0x81, 0x19, 0x09, + 0x31, 0x80, 0x68, 0x49, 0x00, 0x42, 0x68, 0x3b, + 0x18, 0xd2, 0x3a, 0x40, 0x86, 0x91, 0x30, 0x01, + 0x28, 0x13, 0xdd, 0xf3, 0xe0, 0x69, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x01, 0x02, 0xc0, 0xf7, 0xff, + 0xfe, 0x47, 0x6f, 0xb8, 0x49, 0x36, 0x80, 0x08, + 0xe0, 0x5f, 0xa8, 0x02, 0xf0, 0x10, 0xfc, 0x18, + 0x98, 0x02, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x08, + 0x98, 0x02, 0x68, 0x39, 0x80, 0x48, 0x98, 0x03, + 0x0c, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x03, + 0x68, 0x39, 0x80, 0xc8, 0x98, 0x04, 0x0c, 0x00, + 0x68, 0x39, 0x81, 0x08, 0x98, 0x04, 0x68, 0x39, + 0x81, 0x48, 0x20, 0x00, 0x68, 0x39, 0x81, 0x88, + 0x68, 0x38, 0x89, 0x81, 0x23, 0x01, 0x03, 0xdb, + 0x43, 0x19, 0x81, 0x81, 0x48, 0x25, 0x68, 0x39, + 0x81, 0xc8, 0x48, 0x25, 0x68, 0x01, 0x14, 0x09, + 0x68, 0x3a, 0x82, 0x11, 0x68, 0x00, 0x68, 0x39, + 0x82, 0x48, 0xe0, 0x32, 0x20, 0x19, 0x06, 0x80, + 0x6b, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x68, 0x39, + 0x80, 0x08, 0xe0, 0x2a, 0x68, 0x38, 0x88, 0x01, + 0x04, 0x09, 0x88, 0x40, 0x18, 0x08, 0x68, 0x00, + 0x90, 0x05, 0x14, 0x00, 0x68, 0x39, 0x80, 0x08, + 0x98, 0x05, 0x68, 0x39, 0x80, 0x48, 0xe0, 0x1c, + 0x48, 0x16, 0x68, 0x00, 0x68, 0x39, 0x80, 0x08, + 0xe0, 0x17, 0x46, 0x69, 0xa8, 0x01, 0xf0, 0x08, + 0xfb, 0xb9, 0x98, 0x01, 0x68, 0x39, 0x80, 0x08, + 0x98, 0x01, 0x0c, 0x00, 0x68, 0x39, 0x80, 0x48, + 0x98, 0x00, 0x68, 0x39, 0x80, 0x88, 0x98, 0x00, + 0x0c, 0x00, 0x68, 0x39, 0x80, 0xc8, 0xe0, 0x04, 0x1d, 0xf8, 0x30, 0x39, 0x8e, 0x81, 0x31, 0x01, - 0x86, 0x81, 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, + 0x86, 0x81, 0xb0, 0x06, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x00, 0xfc, - 0x2e, 0x08, 0x46, 0x70, 0x2e, 0x08, 0x03, 0xc4, - 0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x26, 0x10, - 0x2e, 0x08, 0x05, 0x78, 0x2e, 0x08, 0x00, 0x58, - 0xb5, 0xb0, 0x4f, 0x60, 0x25, 0x00, 0x24, 0x01, - 0x6f, 0xf8, 0x28, 0x00, 0xd0, 0x08, 0xf0, 0x06, - 0xfc, 0x1f, 0x28, 0x00, 0xd0, 0x00, 0x67, 0xfd, - 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x6c, 0x38, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x28, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, - 0x6d, 0x39, 0x42, 0x81, 0xd1, 0x03, 0x1c, 0x28, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x88, 0x81, - 0x06, 0x09, 0x0e, 0x09, 0x29, 0x12, 0xd2, 0x57, - 0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, - 0x08, 0x0f, 0x19, 0x13, 0x1f, 0x4f, 0x23, 0x2e, - 0x39, 0x44, 0x54, 0x5e, 0x65, 0x6a, 0x6e, 0x72, - 0x79, 0x80, 0x89, 0xc3, 0x89, 0x82, 0x89, 0x41, - 0x89, 0x00, 0xf0, 0x05, 0xff, 0x7d, 0xe0, 0x72, - 0x89, 0x00, 0xf0, 0x05, 0xff, 0x61, 0xe0, 0x6e, - 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, - 0xf8, 0x3b, 0xe0, 0x68, 0x89, 0x82, 0x89, 0x41, - 0x89, 0x00, 0xf0, 0x05, 0xff, 0xe3, 0xe0, 0x62, - 0x89, 0x00, 0xf0, 0x06, 0xf8, 0x79, 0xe0, 0x5e, - 0x8a, 0x42, 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, - 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, - 0xf8, 0xfd, 0xb0, 0x02, 0xe0, 0x53, 0x8a, 0x42, - 0x8a, 0x01, 0xb4, 0x06, 0x89, 0xc3, 0x89, 0x82, - 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 0xf9, 0x44, - 0xb0, 0x02, 0xe0, 0x48, 0x89, 0x83, 0x89, 0x42, - 0x89, 0x00, 0x49, 0x2f, 0xf0, 0x06, 0xfa, 0x85, - 0x21, 0x00, 0x48, 0x2d, 0xf7, 0xff, 0xfc, 0x6e, - 0xe0, 0x3d, 0x89, 0xc1, 0x04, 0x0b, 0x14, 0x1b, - 0x89, 0x81, 0x04, 0x0a, 0x14, 0x12, 0x89, 0x41, - 0x89, 0x00, 0xf0, 0x06, 0xfa, 0xa5, 0xe0, 0x32, - 0x89, 0x00, 0xf0, 0x06, 0xf8, 0x59, 0xe0, 0x2e, - 0xe0, 0x2d, 0x89, 0xc1, 0x04, 0x09, 0x8a, 0x02, - 0x18, 0x8b, 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, - 0xf0, 0x06, 0xfa, 0xde, 0xe0, 0x23, 0x89, 0xc3, - 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, - 0xfb, 0x09, 0xe0, 0x1c, 0x89, 0x41, 0x89, 0x00, - 0xf0, 0x06, 0xf8, 0x7a, 0xe0, 0x17, 0x89, 0x00, - 0xf0, 0x06, 0xf8, 0x94, 0xe0, 0x13, 0x89, 0x00, - 0xf0, 0x06, 0xf8, 0xa4, 0xe0, 0x0f, 0x67, 0xfc, - 0x89, 0x82, 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, - 0xfb, 0xdd, 0xe0, 0x08, 0x89, 0xc3, 0x89, 0x82, - 0x89, 0x41, 0x89, 0x00, 0xf0, 0x06, 0xfc, 0x40, - 0xe0, 0x01, 0xf0, 0x06, 0xfc, 0xd7, 0x6d, 0x78, - 0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, 0x64, 0x38, - 0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x05, - 0x48, 0x08, 0x88, 0x01, 0x23, 0x10, 0x43, 0xdb, - 0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, 0x68, 0x00, - 0x65, 0x78, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x03, 0xc4, - 0x2c, 0x00, 0x01, 0x20, 0x2c, 0x00, 0x00, 0xf8, - 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x09, - 0x0e, 0x09, 0x89, 0xd7, 0x23, 0xc7, 0x40, 0x7b, - 0x81, 0xd3, 0x4b, 0x06, 0x68, 0x1f, 0x37, 0x01, - 0x60, 0x1f, 0x2f, 0x28, 0xda, 0x03, 0x4b, 0x04, - 0x68, 0x1b, 0xf0, 0x14, 0xfd, 0x09, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, - 0x2e, 0x08, 0x01, 0x94, 0xb5, 0x90, 0x4f, 0x5c, - 0x6e, 0xf8, 0x6e, 0xb9, 0x42, 0x81, 0xd0, 0x5a, - 0x88, 0x81, 0x0a, 0x0a, 0x2a, 0x0a, 0xd2, 0x57, + 0x2e, 0x08, 0x46, 0x68, 0x2e, 0x08, 0x03, 0xc0, + 0x2c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x26, 0x1a, + 0x2e, 0x08, 0x05, 0x68, 0x2e, 0x08, 0x00, 0x58, + 0xb5, 0xf0, 0x4f, 0x6e, 0x25, 0x00, 0x6f, 0xf8, + 0x28, 0x00, 0xd0, 0x08, 0xf0, 0x06, 0xff, 0x4a, + 0x28, 0x00, 0xd0, 0x00, 0x67, 0xfd, 0x20, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0x38, + 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x38, 0x6d, 0x7c, + 0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x88, 0xa0, 0x06, 0x00, + 0x0e, 0x00, 0x28, 0x15, 0xd2, 0x56, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x0b, 0x12, 0x1c, 0x16, 0x22, 0x53, 0x26, 0x31, + 0x3c, 0x47, 0x57, 0x61, 0x68, 0x6d, 0x71, 0x75, + 0x7d, 0x84, 0x83, 0x83, 0x87, 0x00, 0x89, 0xe3, + 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, + 0xfa, 0xc5, 0xe0, 0x70, 0x89, 0x20, 0xf0, 0x06, + 0xfa, 0xa9, 0xe0, 0x6c, 0x89, 0xa2, 0x89, 0x61, + 0x89, 0x20, 0xf0, 0x06, 0xfb, 0x83, 0xe0, 0x66, + 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, + 0xfb, 0x2b, 0xe0, 0x60, 0x89, 0x20, 0xf0, 0x06, + 0xfb, 0xc1, 0xe0, 0x5c, 0x8a, 0x62, 0x8a, 0x21, + 0xb4, 0x06, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, + 0x89, 0x20, 0xf0, 0x06, 0xfc, 0x45, 0xb0, 0x02, + 0xe0, 0x51, 0x8a, 0x62, 0x8a, 0x21, 0xb4, 0x06, + 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, 0x89, 0x20, + 0xf0, 0x06, 0xfc, 0x8c, 0xb0, 0x02, 0xe0, 0x46, + 0x89, 0xa3, 0x89, 0x62, 0x89, 0x20, 0x49, 0x3c, + 0xf0, 0x06, 0xfd, 0xcd, 0x21, 0x00, 0x48, 0x3a, + 0xf7, 0xff, 0xfc, 0x58, 0xe0, 0x3b, 0x89, 0xe0, + 0x04, 0x03, 0x14, 0x1b, 0x89, 0xa0, 0x04, 0x02, + 0x14, 0x12, 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, + 0xfd, 0xed, 0xe0, 0x30, 0xe0, 0x4c, 0x89, 0x20, + 0xf0, 0x06, 0xfb, 0xa0, 0xe0, 0x2b, 0x89, 0xe0, + 0x04, 0x00, 0x8a, 0x21, 0x18, 0x43, 0x89, 0xa2, + 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfe, 0x40, + 0xe0, 0x21, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, + 0x89, 0x20, 0xf0, 0x06, 0xfe, 0x71, 0xe0, 0x1a, + 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xc2, + 0xe0, 0x15, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xdc, + 0xe0, 0x11, 0x89, 0x20, 0xf0, 0x06, 0xfb, 0xec, + 0xe0, 0x0d, 0x20, 0x01, 0x67, 0xf8, 0x89, 0xa2, + 0x89, 0x61, 0x89, 0x20, 0xf0, 0x06, 0xff, 0x04, + 0xe0, 0x05, 0x89, 0xe3, 0x89, 0xa2, 0x89, 0x61, + 0x89, 0x20, 0xf0, 0x06, 0xff, 0x67, 0xe0, 0x1b, + 0xf0, 0x06, 0xff, 0xfe, 0xe0, 0x18, 0x89, 0x20, + 0xb0, 0x82, 0x90, 0x01, 0x89, 0x61, 0x91, 0x00, + 0x89, 0xa5, 0x89, 0xe0, 0x1b, 0x40, 0x24, 0x00, + 0x1c, 0x46, 0x2e, 0x00, 0xdd, 0x0b, 0x00, 0xa0, + 0x4b, 0x12, 0x18, 0xc0, 0x19, 0x2a, 0x68, 0x03, + 0x98, 0x01, 0x99, 0x00, 0xf0, 0x06, 0xfe, 0x04, + 0x34, 0x01, 0x42, 0xb4, 0xdb, 0xf3, 0xb0, 0x02, + 0x6d, 0x78, 0x88, 0xc0, 0x6c, 0x39, 0x1a, 0x08, + 0x64, 0x38, 0x6c, 0x79, 0x1a, 0x08, 0x28, 0x28, + 0xdb, 0x05, 0x48, 0x09, 0x88, 0x01, 0x23, 0x10, + 0x43, 0xdb, 0x40, 0x19, 0x80, 0x01, 0x6d, 0x78, + 0x68, 0x00, 0x65, 0x78, 0x20, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x03, 0xc0, + 0x2c, 0x00, 0x01, 0x20, 0x2c, 0x00, 0x1a, 0x00, + 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x90, 0x4f, 0x66, + 0x6e, 0xf8, 0x6e, 0xb9, 0x42, 0x81, 0xd0, 0x57, + 0x88, 0x81, 0x0a, 0x0a, 0x2a, 0x0a, 0xd2, 0x5a, 0xa3, 0x01, 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, - 0x97, 0x04, 0x3d, 0x97, 0x97, 0x43, 0x97, 0x97, - 0x6a, 0x70, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, - 0x29, 0x0c, 0xd2, 0x49, 0xa3, 0x01, 0x5c, 0x5b, - 0x00, 0x5b, 0x44, 0x9f, 0x1d, 0x09, 0x13, 0x2a, - 0x89, 0x89, 0x89, 0x89, 0x89, 0x27, 0x89, 0x05, - 0x89, 0x00, 0xf0, 0x03, 0xf8, 0xb7, 0xe0, 0x7f, + 0x93, 0x04, 0x50, 0x93, 0x93, 0x57, 0x93, 0x93, + 0x7c, 0x82, 0x06, 0x09, 0x0e, 0x09, 0x24, 0x00, + 0x29, 0x0c, 0xd2, 0x4c, 0xa3, 0x01, 0x5c, 0x5b, + 0x00, 0x5b, 0x44, 0x9f, 0x1d, 0x09, 0x13, 0x3c, + 0x85, 0x85, 0x85, 0x85, 0x85, 0x39, 0x85, 0x05, + 0x89, 0x00, 0xf0, 0x03, 0xf8, 0xc1, 0xe0, 0x7b, 0x22, 0x00, 0xb4, 0x04, 0x89, 0x01, 0x1c, 0x23, - 0x4a, 0x48, 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0x84, - 0xb0, 0x01, 0xe0, 0x75, 0x22, 0x00, 0xb4, 0x04, - 0x89, 0x02, 0x1c, 0x23, 0x49, 0x43, 0x1e, 0x48, - 0xf7, 0xfc, 0xfd, 0x7a, 0xb0, 0x01, 0xe0, 0x6b, + 0x4a, 0x52, 0x1e, 0x50, 0xf7, 0xfc, 0xfd, 0x5c, + 0xb0, 0x01, 0xe0, 0x71, 0x22, 0x00, 0xb4, 0x04, + 0x89, 0x02, 0x1c, 0x23, 0x49, 0x4d, 0x1e, 0x48, + 0xf7, 0xfc, 0xfd, 0x52, 0xb0, 0x01, 0xe0, 0x67, 0x8a, 0x02, 0xb4, 0x04, 0x89, 0xc3, 0x89, 0x82, - 0x89, 0x41, 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0x70, - 0xb0, 0x01, 0xe0, 0x61, 0xf7, 0xfc, 0xfd, 0x40, - 0xe0, 0x5e, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, - 0xfd, 0xd9, 0xe0, 0x59, 0x06, 0x09, 0xd1, 0x57, - 0x89, 0x00, 0xf7, 0xfc, 0xfe, 0xb7, 0xe0, 0x53, - 0x06, 0x09, 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x0b, + 0x89, 0x41, 0x89, 0x00, 0xf7, 0xfc, 0xfd, 0x48, + 0x6e, 0xf8, 0x89, 0x01, 0xb0, 0x01, 0x29, 0x00, + 0xd1, 0x5a, 0x89, 0x41, 0x29, 0x00, 0xd1, 0x57, + 0x89, 0x81, 0x29, 0x00, 0xd1, 0x54, 0x89, 0xc1, + 0x29, 0x00, 0xd1, 0x51, 0x8a, 0x00, 0x28, 0x00, + 0xd1, 0x4e, 0xf7, 0xfd, 0xfa, 0x85, 0xe0, 0x62, + 0xf7, 0xfc, 0xfc, 0xc6, 0xe0, 0x5f, 0x21, 0x18, + 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0xaf, 0xe0, 0x5a, + 0xe0, 0x6a, 0x06, 0x09, 0xd1, 0x40, 0x89, 0x00, + 0xf7, 0xfc, 0xfe, 0x7c, 0xe0, 0x53, 0xe0, 0x52, + 0x06, 0x09, 0x0e, 0x09, 0x29, 0x06, 0xd2, 0x4e, 0xa3, 0x01, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, - 0x02, 0x08, 0x0c, 0x10, 0x14, 0x18, 0x89, 0x00, - 0xf7, 0xfe, 0xf8, 0x9a, 0xe0, 0x44, 0xe0, 0x54, - 0xe0, 0x42, 0x89, 0x00, 0xf7, 0xfe, 0xf8, 0xba, - 0xe0, 0x3e, 0x89, 0x00, 0xf7, 0xfe, 0xf9, 0x48, - 0xe0, 0x3a, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x2c, - 0xe0, 0x36, 0x89, 0x00, 0xf7, 0xfe, 0xfa, 0x5e, - 0xe0, 0x32, 0x89, 0x00, 0x06, 0x00, 0x0e, 0x00, - 0xf7, 0xfe, 0xfa, 0x3a, 0xe0, 0x2c, 0x06, 0x08, - 0xd1, 0x2a, 0x6f, 0xb8, 0x30, 0x01, 0x67, 0xb8, - 0xe0, 0x26, 0x06, 0x09, 0x0e, 0x09, 0x29, 0x08, - 0xd2, 0x22, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x0c, 0x08, 0x0f, - 0x12, 0x16, 0x19, 0x1c, 0x89, 0x00, 0xf0, 0x01, - 0xf9, 0x83, 0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, - 0xf9, 0xab, 0xe0, 0x11, 0xf0, 0x01, 0xf9, 0xf6, - 0xe0, 0x0e, 0xf0, 0x01, 0xfa, 0x4d, 0xe0, 0x0b, - 0x89, 0x00, 0xf0, 0x01, 0xfa, 0xd1, 0xe0, 0x07, - 0xf0, 0x01, 0xfb, 0x0a, 0xe0, 0x04, 0xf0, 0x01, - 0xfb, 0x23, 0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x80, - 0x6e, 0xf8, 0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, - 0x65, 0xb8, 0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, - 0xdb, 0x04, 0x48, 0x07, 0x88, 0x01, 0x08, 0x49, - 0x00, 0x49, 0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, - 0x66, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x03, 0xc4, 0x00, 0x00, 0xff, 0xff, + 0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, 0x89, 0x00, + 0xf7, 0xfe, 0xf8, 0x6a, 0xe0, 0x43, 0x89, 0x00, + 0xf7, 0xfe, 0xf8, 0x8c, 0xe0, 0x3f, 0x89, 0x00, + 0xf7, 0xfe, 0xf9, 0x1a, 0xe0, 0x3b, 0x89, 0x00, + 0xf7, 0xfe, 0xf9, 0xfe, 0xe0, 0x37, 0x89, 0x00, + 0xf7, 0xfe, 0xfa, 0x30, 0xe0, 0x33, 0x89, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0xf7, 0xfe, 0xfa, 0x0c, + 0xe0, 0x2d, 0x06, 0x08, 0xd1, 0x14, 0x6f, 0xb8, + 0x30, 0x01, 0x67, 0xb8, 0xe0, 0x27, 0x06, 0x09, + 0x0e, 0x09, 0x29, 0x08, 0xd2, 0x23, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x04, 0x0d, 0x09, 0x10, 0x13, 0x17, 0x1a, 0x1d, + 0x89, 0x00, 0xf0, 0x01, 0xf9, 0x7f, 0xe0, 0x16, + 0xe0, 0x15, 0x89, 0x00, 0xf0, 0x01, 0xf9, 0xa6, + 0xe0, 0x11, 0xf0, 0x01, 0xf9, 0xf1, 0xe0, 0x0e, + 0xf0, 0x01, 0xfa, 0x48, 0xe0, 0x0b, 0x89, 0x00, + 0xf0, 0x01, 0xfa, 0xcc, 0xe0, 0x07, 0xf0, 0x01, + 0xfb, 0x05, 0xe0, 0x04, 0xf0, 0x01, 0xfb, 0x1e, + 0xe0, 0x01, 0xf0, 0x01, 0xfa, 0x7b, 0x6e, 0xf8, + 0x88, 0xc0, 0x6d, 0xb9, 0x1a, 0x08, 0x65, 0xb8, + 0x6d, 0xf9, 0x1a, 0x08, 0x28, 0x28, 0xdb, 0x04, + 0x48, 0x07, 0x88, 0x01, 0x08, 0x49, 0x00, 0x49, + 0x80, 0x01, 0x6e, 0xf8, 0x68, 0x00, 0x66, 0xf8, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x03, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x00, 0xf8, 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x17, 0x28, 0x03, 0xd0, 0x0b, 0x28, 0x07, 0xd0, 0x0e, 0x28, 0x08, 0xd1, 0x03, - 0x88, 0x38, 0xf0, 0x02, 0xfa, 0x43, 0x80, 0x78, + 0x88, 0x38, 0xf0, 0x02, 0xfa, 0x39, 0x80, 0x78, 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x4e, + 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfe, 0xfd, 0x22, 0xe7, 0xf6, 0x88, 0x79, 0x88, 0x38, 0x1d, 0x3a, - 0xf0, 0x02, 0xf8, 0xb4, 0x49, 0x01, 0x68, 0x09, - 0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc4, + 0xf0, 0x02, 0xf8, 0xaa, 0x49, 0x01, 0x68, 0x09, + 0x80, 0x08, 0xe7, 0xed, 0x2e, 0x08, 0x03, 0xc0, 0x48, 0x0d, 0x6f, 0xc0, 0x28, 0x00, 0xd1, 0x0c, - 0x49, 0x0c, 0x60, 0x48, 0x48, 0x0c, 0x8e, 0x83, + 0x49, 0x0c, 0x60, 0x08, 0x48, 0x0c, 0x8e, 0x83, 0x49, 0x0c, 0x22, 0x01, 0x2b, 0x00, 0xd0, 0x05, 0x8d, 0x03, 0x86, 0x8b, 0x8d, 0x43, 0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x8e, 0xc3, 0x2b, 0x00, 0xd0, 0xfb, 0x8d, 0x83, 0x86, 0x8b, 0x8d, 0xc3, 0x86, 0xcb, 0x87, 0x82, 0x47, 0x70, 0x00, 0x00, - 0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x44, + 0x2c, 0x00, 0x1f, 0x80, 0x2e, 0x08, 0x04, 0x40, 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x00, 0xc0, - 0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x7f, 0xf7, 0xfd, - 0xf8, 0x73, 0xf7, 0xfc, 0xff, 0x19, 0xf7, 0xfd, - 0xf9, 0x73, 0xf0, 0x03, 0xf8, 0x75, 0xf7, 0xff, - 0xff, 0xcf, 0x48, 0x10, 0x8e, 0x80, 0x28, 0x00, - 0xd1, 0x19, 0x48, 0x0f, 0x6f, 0xc0, 0x28, 0x00, - 0xd1, 0x0f, 0xb0, 0x82, 0x46, 0x69, 0xa8, 0x01, - 0xf0, 0x01, 0xfa, 0xcc, 0xa8, 0x01, 0x78, 0x00, - 0x28, 0x32, 0xda, 0x05, 0xa8, 0x00, 0x78, 0x00, - 0x28, 0x32, 0xda, 0x01, 0xf0, 0x03, 0xfa, 0x90, - 0xb0, 0x02, 0xf7, 0xff, 0xfd, 0xf1, 0x28, 0x00, - 0xd1, 0x01, 0xf7, 0xff, 0xfe, 0xcf, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, - 0x2c, 0x00, 0x1f, 0x80, 0xb4, 0x80, 0x02, 0x4f, - 0x4b, 0x07, 0x40, 0x3b, 0x43, 0x1a, 0x23, 0x19, - 0x06, 0x9b, 0x62, 0x9a, 0x0a, 0x49, 0x02, 0x49, - 0x08, 0x49, 0x07, 0xc0, 0x43, 0x08, 0x49, 0x03, - 0x68, 0x09, 0x60, 0x08, 0xbc, 0x80, 0x47, 0x70, - 0x00, 0x03, 0xfe, 0x00, 0x2e, 0x08, 0x5e, 0x40, - 0xb4, 0x90, 0x4b, 0x0c, 0x68, 0x1f, 0x68, 0x3f, - 0x0f, 0xff, 0x60, 0x07, 0x68, 0x18, 0x68, 0x00, - 0x00, 0x40, 0x0a, 0x47, 0x02, 0x7f, 0x20, 0x19, - 0x06, 0x80, 0x6a, 0x84, 0x4b, 0x06, 0x40, 0x23, - 0x0a, 0x5b, 0x43, 0x3b, 0x60, 0x0b, 0x6a, 0x80, - 0x05, 0xc0, 0x0d, 0xc0, 0x60, 0x10, 0xbc, 0x90, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x40, - 0x00, 0x03, 0xfe, 0x00, 0xb5, 0x00, 0x49, 0x1d, - 0x62, 0xc8, 0x28, 0x00, 0xd0, 0x11, 0x28, 0x01, - 0xd0, 0x1b, 0x28, 0x02, 0xd0, 0x25, 0x28, 0x03, - 0xd1, 0x09, 0x48, 0x19, 0x68, 0x01, 0x08, 0x49, - 0x00, 0x49, 0x60, 0x01, 0x22, 0x01, 0x21, 0x01, - 0x20, 0x00, 0xf0, 0x0a, 0xfe, 0x6f, 0xbc, 0x08, - 0x47, 0x18, 0x48, 0x13, 0x68, 0x01, 0x08, 0x49, - 0x00, 0x49, 0x60, 0x01, 0x48, 0x11, 0x68, 0x01, - 0x04, 0x03, 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, - 0x47, 0x18, 0x48, 0x0d, 0x68, 0x01, 0x23, 0x01, - 0x43, 0x19, 0x60, 0x01, 0x48, 0x0b, 0x68, 0x01, - 0x4b, 0x0b, 0x40, 0x19, 0x60, 0x01, 0xbc, 0x08, - 0x47, 0x18, 0x48, 0x07, 0x68, 0x01, 0x08, 0x49, - 0x00, 0x49, 0x60, 0x01, 0x22, 0x00, 0x21, 0x00, - 0x20, 0x00, 0xf0, 0x0a, 0xfe, 0x4b, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xcc, - 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, - 0xff, 0xdf, 0xff, 0xff, 0xb5, 0x90, 0x48, 0x11, - 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x0f, 0x48, 0x10, - 0xd5, 0x01, 0x69, 0x01, 0x18, 0x7f, 0x69, 0x00, - 0x10, 0x80, 0x4c, 0x0e, 0x42, 0xb8, 0xda, 0x0b, - 0x68, 0xe0, 0x28, 0x00, 0xd1, 0x08, 0x48, 0x0c, - 0x68, 0x01, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, - 0x60, 0x01, 0x20, 0x02, 0xf0, 0x0a, 0xf9, 0xec, - 0x2f, 0x00, 0xd1, 0x04, 0x20, 0x01, 0x61, 0xe0, - 0x6b, 0xa0, 0x30, 0x01, 0x63, 0xa0, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x66, 0x00, 0x00, 0x80, - 0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, - 0x6c, 0x00, 0x00, 0x20, 0xb5, 0x00, 0x20, 0x03, - 0xf0, 0x0a, 0xf9, 0xd6, 0x20, 0x1e, 0xf0, 0x07, - 0xf9, 0xd3, 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, - 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1e, 0xf0, 0x06, - 0xff, 0x81, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x02, - 0x22, 0x02, 0x49, 0x07, 0x20, 0x1e, 0xf0, 0x06, - 0xfd, 0xb5, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, - 0x21, 0x01, 0x20, 0x1e, 0xb0, 0x01, 0xf0, 0x06, - 0xff, 0x71, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x1f, 0xff, 0xb5, 0x00, 0x21, 0x00, - 0x20, 0x0e, 0xf0, 0x0c, 0xfd, 0x4b, 0x20, 0x1f, - 0xf0, 0x07, 0xf8, 0xe4, 0x23, 0x03, 0x02, 0x5b, - 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0x20, 0x1f, - 0xf0, 0x06, 0xff, 0x5c, 0x20, 0x00, 0xf0, 0x0a, - 0xf8, 0x41, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x01, - 0x22, 0x02, 0x49, 0x07, 0x20, 0x1f, 0xf0, 0x06, - 0xfd, 0x8d, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, - 0x21, 0x01, 0x20, 0x1f, 0xb0, 0x01, 0xf0, 0x06, - 0xff, 0x49, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x1f, 0xfe, 0xb5, 0x80, 0x20, 0x0f, - 0x02, 0x40, 0x4f, 0x0a, 0x61, 0x38, 0x49, 0x0a, - 0x6c, 0x89, 0x61, 0x79, 0xf0, 0x01, 0xfe, 0x3a, - 0x1d, 0xf9, 0x31, 0x79, 0x61, 0x08, 0x28, 0x00, - 0xd0, 0x05, 0x20, 0x00, 0x61, 0xf8, 0x62, 0x38, - 0x64, 0xf8, 0x20, 0xff, 0x72, 0x08, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, - 0x66, 0x00, 0x00, 0x80, 0xb5, 0x80, 0x4f, 0x05, - 0x69, 0x38, 0x28, 0x00, 0xd0, 0x03, 0xf0, 0x01, - 0xfe, 0x43, 0x20, 0x00, 0x61, 0x38, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0xcc, - 0xb5, 0x00, 0x4a, 0x0d, 0xb4, 0x04, 0x1f, 0x10, - 0x1e, 0x51, 0x1c, 0x13, 0xf7, 0xfc, 0xfb, 0x58, - 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, - 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x07, 0x62, 0x42, - 0x6d, 0x49, 0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, - 0x21, 0x01, 0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, - 0x30, 0x60, 0x76, 0x01, 0xbc, 0x08, 0x47, 0x18, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x04, 0x4c, - 0xb5, 0x00, 0x4a, 0x10, 0xb4, 0x04, 0x1c, 0x13, - 0x3a, 0x01, 0x49, 0x0f, 0x1e, 0xc8, 0xf7, 0xfc, - 0xfb, 0x37, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, - 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0b, - 0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1, 0x21, 0x00, - 0x65, 0x81, 0x21, 0x01, 0x02, 0xc9, 0x64, 0x41, - 0x21, 0x01, 0x30, 0x60, 0x76, 0x01, 0x48, 0x06, - 0x23, 0x02, 0x68, 0x01, 0x43, 0x19, 0x60, 0x01, + 0xb5, 0x00, 0xf0, 0x00, 0xfa, 0x71, 0xf7, 0xfd, + 0xf8, 0x37, 0xf7, 0xfc, 0xfe, 0xdd, 0xf7, 0xfd, + 0xf9, 0x37, 0xf0, 0x03, 0xf8, 0x71, 0xf7, 0xff, + 0xff, 0xcf, 0x48, 0x09, 0x8e, 0x80, 0x28, 0x00, + 0xd1, 0x0b, 0x48, 0x08, 0x6f, 0xc0, 0x28, 0x00, + 0xd1, 0x01, 0xf0, 0x03, 0xfd, 0xe3, 0xf7, 0xff, + 0xfd, 0xe7, 0x28, 0x00, 0xd1, 0x01, 0xf7, 0xff, + 0xfe, 0xc9, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1f, 0x80, + 0xb4, 0x80, 0x02, 0x4f, 0x4b, 0x07, 0x40, 0x3b, + 0x43, 0x1a, 0x23, 0x19, 0x06, 0x9b, 0x62, 0x9a, + 0x0a, 0x49, 0x02, 0x49, 0x08, 0x49, 0x07, 0xc0, + 0x43, 0x08, 0x49, 0x03, 0x68, 0x09, 0x60, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x00, 0x03, 0xfe, 0x00, + 0x2e, 0x08, 0x5e, 0x38, 0xb4, 0x90, 0x4b, 0x0c, + 0x68, 0x1f, 0x68, 0x3f, 0x0f, 0xff, 0x60, 0x07, + 0x68, 0x18, 0x68, 0x00, 0x00, 0x40, 0x0a, 0x47, + 0x02, 0x7f, 0x20, 0x19, 0x06, 0x80, 0x6a, 0x84, + 0x4b, 0x06, 0x40, 0x23, 0x0a, 0x5b, 0x43, 0x3b, + 0x60, 0x0b, 0x6a, 0x80, 0x05, 0xc0, 0x0d, 0xc0, + 0x60, 0x10, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x38, 0x00, 0x03, 0xfe, 0x00, + 0xb5, 0x00, 0x49, 0x1d, 0x62, 0xc8, 0x28, 0x00, + 0xd0, 0x11, 0x28, 0x01, 0xd0, 0x1b, 0x28, 0x02, + 0xd0, 0x25, 0x28, 0x03, 0xd1, 0x09, 0x48, 0x19, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0x0b, + 0xf9, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x13, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x48, 0x11, 0x68, 0x01, 0x04, 0x03, 0x43, 0x19, + 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x0d, + 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x0b, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, + 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x07, + 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, + 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b, + 0xf9, 0x6b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc4, 0x6a, 0x00, 0x00, 0x18, + 0x6c, 0x00, 0x00, 0x20, 0xff, 0xdf, 0xff, 0xff, + 0xb5, 0x90, 0x48, 0x11, 0x6c, 0xc1, 0x6c, 0x80, + 0x1a, 0x0f, 0x48, 0x10, 0xd5, 0x01, 0x69, 0x01, + 0x18, 0x7f, 0x69, 0x00, 0x10, 0x80, 0x4c, 0x0e, + 0x42, 0xb8, 0xda, 0x0b, 0x68, 0xe0, 0x28, 0x00, + 0xd1, 0x08, 0x48, 0x0c, 0x68, 0x01, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x20, 0x02, + 0xf0, 0x0a, 0xfd, 0x0c, 0x2f, 0x00, 0xd1, 0x04, + 0x20, 0x01, 0x61, 0xe0, 0x6b, 0xa0, 0x30, 0x01, + 0x63, 0xa0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44, + 0x2e, 0x08, 0x04, 0xc4, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0x00, 0x20, 0x03, 0xf0, 0x0a, 0xfc, 0xf6, + 0x20, 0x1e, 0xf0, 0x07, 0xfc, 0xf3, 0x23, 0x03, + 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, + 0x20, 0x1e, 0xf0, 0x07, 0xfa, 0xa1, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x02, 0x22, 0x02, 0x49, 0x07, + 0x20, 0x1e, 0xf0, 0x07, 0xf8, 0xd5, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1e, + 0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x91, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0x00, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0d, + 0xf8, 0x6b, 0x20, 0x1f, 0xf0, 0x07, 0xfc, 0x04, + 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, + 0x21, 0x02, 0x20, 0x1f, 0xf0, 0x07, 0xfa, 0x7c, + 0x20, 0x00, 0xf0, 0x0a, 0xfb, 0x61, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x01, 0x22, 0x02, 0x49, 0x07, + 0x20, 0x1f, 0xf0, 0x07, 0xf8, 0xad, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x20, 0x1f, + 0xb0, 0x01, 0xf0, 0x07, 0xfa, 0x69, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xfe, + 0xb5, 0x80, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x0a, + 0x61, 0x38, 0x49, 0x0a, 0x6c, 0x89, 0x61, 0x79, + 0xf0, 0x01, 0xfe, 0x3c, 0x1d, 0xf9, 0x31, 0x79, + 0x61, 0x08, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, + 0x61, 0xf8, 0x62, 0x38, 0x64, 0xf8, 0x20, 0xff, + 0x72, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0x80, 0x4f, 0x05, 0x69, 0x38, 0x28, 0x00, + 0xd0, 0x03, 0xf0, 0x01, 0xfe, 0x45, 0x20, 0x00, + 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x4a, 0x0d, + 0xb4, 0x04, 0x1f, 0x10, 0x1e, 0x51, 0x1c, 0x13, + 0xf7, 0xfc, 0xfb, 0x2a, 0x21, 0x33, 0x06, 0x49, + 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, + 0x48, 0x07, 0x62, 0x42, 0x6d, 0x49, 0x62, 0xc1, + 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, 0x02, 0xc9, + 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, 0x76, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x04, 0x4c, - 0x2e, 0x08, 0x00, 0x04, 0x48, 0x03, 0x23, 0x02, - 0x43, 0xdb, 0x68, 0x01, 0x40, 0x19, 0x60, 0x01, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x00, 0x04, - 0xb5, 0xf0, 0x20, 0x0f, 0x02, 0x40, 0x4c, 0x11, - 0x61, 0x20, 0x20, 0x00, 0xf7, 0xfc, 0xfc, 0x4a, - 0x48, 0x0f, 0xf7, 0xfc, 0xfc, 0x47, 0x26, 0x00, - 0x1d, 0xe0, 0x30, 0x59, 0x77, 0x06, 0x25, 0xff, - 0x1d, 0xe7, 0x37, 0x79, 0x70, 0x3d, 0x20, 0x01, - 0x63, 0x78, 0x60, 0xe6, 0x69, 0x78, 0x28, 0x00, - 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, 0xf0, 0x01, - 0xfd, 0xa9, 0x61, 0x78, 0x69, 0x78, 0x28, 0x00, - 0xd0, 0x01, 0x76, 0x3e, 0x70, 0x3d, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, - 0x00, 0x00, 0x1f, 0xff, 0xb5, 0x00, 0x20, 0x00, - 0xf7, 0xfd, 0xff, 0xde, 0x22, 0x00, 0xb4, 0x04, - 0x23, 0x00, 0x4a, 0x06, 0x21, 0x00, 0x20, 0x00, - 0xf7, 0xfc, 0xfa, 0xd6, 0x21, 0x00, 0x20, 0x0d, - 0xb0, 0x01, 0xf0, 0x0c, 0xfc, 0x6f, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xb5, 0x80, 0x22, 0x00, 0xb4, 0x04, 0x27, 0x00, - 0x1c, 0x3b, 0x4a, 0x17, 0x21, 0x00, 0x20, 0x00, - 0xf7, 0xfc, 0xfa, 0xc2, 0x22, 0x00, 0xb0, 0x01, - 0xb4, 0x04, 0x1c, 0x3b, 0x4a, 0x12, 0x49, 0x13, - 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0xb9, 0x21, 0x33, + 0x2e, 0x08, 0x04, 0x44, 0xb5, 0x00, 0x4a, 0x10, + 0xb4, 0x04, 0x1c, 0x13, 0x3a, 0x01, 0x49, 0x0f, + 0x1e, 0xc8, 0xf7, 0xfc, 0xfb, 0x09, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, 0x6d, 0x4a, 0x1a, 0x82, - 0xb0, 0x01, 0x48, 0x0f, 0x62, 0x42, 0x6d, 0x49, - 0x63, 0x01, 0x21, 0x01, 0x02, 0xc9, 0x64, 0x81, - 0x21, 0x01, 0x65, 0x87, 0x30, 0x60, 0x76, 0x01, - 0x77, 0x07, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, - 0xf7, 0xff, 0xfe, 0x28, 0x20, 0x00, 0xf7, 0xff, - 0xfe, 0x59, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0c, - 0xfc, 0x39, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x1f, 0xfe, - 0x2e, 0x08, 0x04, 0x4c, 0xb5, 0xf0, 0x06, 0x05, - 0x0e, 0x2d, 0x20, 0x0f, 0x02, 0x40, 0x4f, 0x2f, - 0x26, 0x33, 0x06, 0x76, 0x61, 0x38, 0x6d, 0xb0, - 0x6d, 0x71, 0x1a, 0x40, 0x62, 0x78, 0x62, 0xb8, - 0x20, 0x00, 0x1d, 0xfc, 0x34, 0x79, 0x60, 0xe0, - 0x2d, 0x00, 0xd0, 0x02, 0x20, 0xff, 0xf7, 0xfd, - 0xff, 0x7b, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, - 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0x74, - 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, 0xb0, 0x01, - 0xf0, 0x0a, 0xfc, 0xac, 0x21, 0x00, 0x20, 0x00, - 0xf0, 0x0a, 0xfd, 0x6c, 0x22, 0x00, 0xb4, 0x04, - 0x23, 0x00, 0x4a, 0x1d, 0x20, 0x00, 0x1e, 0x51, - 0xf7, 0xfc, 0xfa, 0x62, 0x20, 0x01, 0x63, 0x60, - 0x69, 0x60, 0xb0, 0x01, 0x28, 0x00, 0xd1, 0x04, - 0x20, 0x41, 0x01, 0x40, 0xf0, 0x01, 0xfd, 0x12, - 0x61, 0x60, 0x69, 0x60, 0x28, 0x00, 0xd0, 0x03, - 0x20, 0x00, 0x76, 0x20, 0x20, 0xff, 0x70, 0x20, - 0x6d, 0x70, 0x63, 0x38, 0x20, 0x01, 0x02, 0xc0, - 0x64, 0xb8, 0x20, 0x00, 0x26, 0x01, 0x65, 0xb8, - 0x1d, 0xf9, 0x31, 0x59, 0x76, 0x0e, 0x22, 0x00, - 0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfd, 0xc6, - 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0c, 0xfb, 0xda, - 0x20, 0x00, 0x60, 0xf8, 0x2d, 0x00, 0xd1, 0x02, - 0xf7, 0xff, 0xfd, 0xf0, 0x61, 0xe6, 0x20, 0x00, - 0x60, 0xb8, 0x66, 0x38, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, - 0x00, 0x00, 0x1f, 0xff, 0xb5, 0xb0, 0x4f, 0x45, - 0x25, 0x00, 0x6d, 0x38, 0x4c, 0x44, 0x28, 0x05, - 0xd2, 0x14, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x10, 0x03, 0x2e, 0x65, - 0x73, 0x00, 0x4d, 0x40, 0x68, 0x28, 0x08, 0x41, - 0xd2, 0x08, 0x08, 0xc0, 0xd3, 0x09, 0xf7, 0xff, - 0xfe, 0xb3, 0x23, 0x04, 0x43, 0xdb, 0x68, 0x28, - 0x40, 0x18, 0x60, 0x28, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x6d, 0x78, 0x28, 0x00, 0xd0, 0xf9, - 0x28, 0x01, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x06, - 0xf0, 0x00, 0xf8, 0x6c, 0x8e, 0xa0, 0x28, 0x00, - 0xd1, 0xf0, 0xf0, 0x00, 0xf9, 0x29, 0x6d, 0x78, - 0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0xe9, - 0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xe6, 0xf0, 0x00, - 0xfa, 0x4b, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0xde, 0x8d, 0xa0, - 0x06, 0x00, 0x0e, 0x00, 0x28, 0x06, 0xd1, 0x15, - 0x48, 0x27, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x06, - 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x05, - 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xc5, 0x6d, 0x78, - 0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, - 0xf0, 0x00, 0xfc, 0x2e, 0x85, 0xa5, 0xbc, 0xb0, - 0xbc, 0x08, 0x47, 0x18, 0x8d, 0xa0, 0x28, 0x00, - 0xd1, 0xc0, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x08, - 0x28, 0x04, 0xd0, 0x0b, 0x28, 0x05, 0xd1, 0xb9, - 0xf0, 0x00, 0xfd, 0xdc, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0xf0, 0x00, 0xfd, 0xb1, 0xbc, 0xb0, - 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, 0xfd, 0x80, + 0xb0, 0x01, 0x48, 0x0b, 0x62, 0x42, 0x6d, 0x49, + 0x62, 0xc1, 0x21, 0x00, 0x65, 0x81, 0x21, 0x01, + 0x02, 0xc9, 0x64, 0x41, 0x21, 0x01, 0x30, 0x60, + 0x76, 0x01, 0x48, 0x06, 0x23, 0x02, 0x68, 0x01, + 0x43, 0x19, 0x60, 0x01, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xfe, + 0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x00, 0x04, + 0x48, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x68, 0x01, + 0x40, 0x19, 0x60, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x00, 0x04, 0xb5, 0xf0, 0x20, 0x0f, + 0x02, 0x40, 0x4c, 0x11, 0x61, 0x20, 0x20, 0x00, + 0xf7, 0xfc, 0xfc, 0x1c, 0x48, 0x0f, 0xf7, 0xfc, + 0xfc, 0x19, 0x26, 0x00, 0x1d, 0xe0, 0x30, 0x59, + 0x77, 0x06, 0x25, 0xff, 0x1d, 0xe7, 0x37, 0x79, + 0x70, 0x3d, 0x20, 0x01, 0x63, 0x78, 0x60, 0xe6, + 0x69, 0x78, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, + 0x01, 0x40, 0xf0, 0x01, 0xfd, 0xab, 0x61, 0x78, + 0x69, 0x78, 0x28, 0x00, 0xd0, 0x01, 0x76, 0x3e, + 0x70, 0x3d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0x00, 0x20, 0x00, 0xf7, 0xfd, 0xff, 0xbc, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x06, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0xa8, + 0x21, 0x00, 0x20, 0x0d, 0xb0, 0x01, 0xf0, 0x0c, + 0xff, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x22, 0x00, + 0xb4, 0x04, 0x27, 0x00, 0x1c, 0x3b, 0x4a, 0x17, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xfc, 0xfa, 0x94, + 0x22, 0x00, 0xb0, 0x01, 0xb4, 0x04, 0x1c, 0x3b, + 0x4a, 0x12, 0x49, 0x13, 0x20, 0x00, 0xf7, 0xfc, + 0xfa, 0x8b, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x88, + 0x6d, 0x4a, 0x1a, 0x82, 0xb0, 0x01, 0x48, 0x0f, + 0x62, 0x42, 0x6d, 0x49, 0x63, 0x01, 0x21, 0x01, + 0x02, 0xc9, 0x64, 0x81, 0x21, 0x01, 0x65, 0x87, + 0x30, 0x60, 0x76, 0x01, 0x77, 0x07, 0x22, 0x00, + 0x21, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x28, + 0x20, 0x00, 0xf7, 0xff, 0xfe, 0x59, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x0c, 0xff, 0x59, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x00, 0x1f, 0xfe, 0x2e, 0x08, 0x04, 0x44, + 0xb5, 0xf0, 0x06, 0x05, 0x0e, 0x2d, 0x20, 0x0f, + 0x02, 0x40, 0x4f, 0x2f, 0x26, 0x33, 0x06, 0x76, + 0x61, 0x38, 0x6d, 0xb0, 0x6d, 0x71, 0x1a, 0x40, + 0x62, 0x78, 0x62, 0xb8, 0x20, 0x00, 0x1d, 0xfc, + 0x34, 0x79, 0x60, 0xe0, 0x2d, 0x00, 0xd0, 0x02, + 0x20, 0xff, 0xf7, 0xfd, 0xff, 0x59, 0x22, 0x00, + 0xb4, 0x04, 0x23, 0x00, 0x21, 0x00, 0x20, 0x00, + 0xf7, 0xfc, 0xfa, 0x46, 0x22, 0x01, 0x21, 0x01, + 0x20, 0x00, 0xb0, 0x01, 0xf0, 0x0a, 0xff, 0xcc, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x0b, 0xf8, 0x8c, + 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x4a, 0x1d, + 0x20, 0x00, 0x1e, 0x51, 0xf7, 0xfc, 0xfa, 0x34, + 0x20, 0x01, 0x63, 0x60, 0x69, 0x60, 0xb0, 0x01, + 0x28, 0x00, 0xd1, 0x04, 0x20, 0x41, 0x01, 0x40, + 0xf0, 0x01, 0xfd, 0x14, 0x61, 0x60, 0x69, 0x60, + 0x28, 0x00, 0xd0, 0x03, 0x20, 0x00, 0x76, 0x20, + 0x20, 0xff, 0x70, 0x20, 0x6d, 0x70, 0x63, 0x38, + 0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x20, 0x00, + 0x26, 0x01, 0x65, 0xb8, 0x1d, 0xf9, 0x31, 0x59, + 0x76, 0x0e, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, + 0xf7, 0xff, 0xfd, 0xc6, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x0c, 0xfe, 0xfa, 0x20, 0x00, 0x60, 0xf8, + 0x2d, 0x00, 0xd1, 0x02, 0xf7, 0xff, 0xfd, 0xf0, + 0x61, 0xe6, 0x20, 0x00, 0x60, 0xb8, 0x66, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x44, 0x00, 0x00, 0x1f, 0xff, + 0xb5, 0xb0, 0x4f, 0x45, 0x25, 0x00, 0x6d, 0x38, + 0x4c, 0x44, 0x28, 0x05, 0xd2, 0x14, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x10, 0x03, 0x2e, 0x65, 0x73, 0x00, 0x4d, 0x40, + 0x68, 0x28, 0x08, 0x41, 0xd2, 0x08, 0x08, 0xc0, + 0xd3, 0x09, 0xf7, 0xff, 0xfe, 0xb3, 0x23, 0x04, + 0x43, 0xdb, 0x68, 0x28, 0x40, 0x18, 0x60, 0x28, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, + 0x28, 0x00, 0xd0, 0xf9, 0x28, 0x01, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x06, 0xf0, 0x00, 0xf8, 0x6c, + 0x8e, 0xa0, 0x28, 0x00, 0xd1, 0xf0, 0xf0, 0x00, + 0xf9, 0x29, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0xe9, 0x8e, 0xa0, 0x28, 0x00, + 0xd1, 0xe6, 0xf0, 0x00, 0xfa, 0x4b, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, + 0xd1, 0xde, 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, + 0x28, 0x06, 0xd1, 0x15, 0x48, 0x27, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x06, 0x6d, 0x78, 0x28, 0x01, + 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, + 0xfc, 0xcd, 0x6d, 0x78, 0x28, 0x04, 0xd0, 0x01, + 0x28, 0x05, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0x2e, + 0x85, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x8d, 0xa0, 0x28, 0x00, 0xd1, 0xc0, 0x6d, 0x78, + 0x28, 0x01, 0xd0, 0x08, 0x28, 0x04, 0xd0, 0x0b, + 0x28, 0x05, 0xd1, 0xb9, 0xf0, 0x00, 0xfd, 0xe4, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x00, + 0xfd, 0xb9, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0xf0, 0x00, 0xfd, 0x88, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0xa7, + 0x20, 0x06, 0x85, 0xa0, 0x85, 0xe5, 0x20, 0x09, + 0x02, 0x40, 0x86, 0xe0, 0x20, 0x04, 0x65, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x8e, 0xe0, - 0x28, 0x00, 0xd1, 0xa7, 0x20, 0x06, 0x85, 0xa0, - 0x85, 0xe5, 0x20, 0x09, 0x02, 0x40, 0x86, 0xe0, - 0x20, 0x04, 0x65, 0x38, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x8e, 0xe0, 0x28, 0x00, 0xd1, 0x99, - 0x8d, 0xa0, 0x06, 0x00, 0x0e, 0x00, 0x28, 0x06, - 0xd1, 0x94, 0x85, 0xa5, 0x65, 0x3d, 0xbc, 0xb0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, - 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x00, 0x04, - 0x2e, 0x08, 0x04, 0xcc, 0xb5, 0xb0, 0x48, 0x46, - 0x6c, 0xc1, 0x4c, 0x46, 0x64, 0x21, 0x69, 0x60, - 0x1a, 0x09, 0x1d, 0xe7, 0x37, 0x79, 0x63, 0xf9, - 0x29, 0x00, 0xda, 0x02, 0x69, 0x22, 0x18, 0x89, - 0x63, 0xf9, 0x23, 0xff, 0x6b, 0xf9, 0x33, 0x01, - 0x42, 0x99, 0xdb, 0x73, 0x22, 0x01, 0x03, 0x12, - 0x42, 0x91, 0xdd, 0x00, 0x63, 0xfa, 0x6b, 0xf9, - 0x08, 0x89, 0x00, 0x89, 0x63, 0xf9, 0x7a, 0x3a, - 0x2a, 0x00, 0xd0, 0x05, 0x23, 0xff, 0x03, 0x5b, - 0x1a, 0xc2, 0x61, 0xe2, 0x22, 0x00, 0x72, 0x3a, - 0x18, 0x42, 0x49, 0x35, 0x25, 0x12, 0x42, 0x8a, - 0xdd, 0x2c, 0x1a, 0x08, 0x64, 0x38, 0xf0, 0x18, - 0xf8, 0x1d, 0x4b, 0x32, 0x40, 0x18, 0xf0, 0x18, - 0xf8, 0x1d, 0x22, 0x00, 0x49, 0x30, 0xb4, 0x06, - 0x69, 0x60, 0x69, 0x39, 0x18, 0x41, 0x23, 0xff, - 0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, - 0x1a, 0xc0, 0x6c, 0x3a, 0x1c, 0x2b, 0xf0, 0x0e, - 0xfd, 0x47, 0x22, 0x00, 0xb0, 0x02, 0x49, 0x28, - 0xb4, 0x06, 0x6b, 0xf8, 0x6c, 0x39, 0x1a, 0x42, - 0x69, 0x39, 0x1c, 0x2b, 0x48, 0x25, 0xf0, 0x0e, - 0xfd, 0x3b, 0xb0, 0x02, 0xf0, 0x17, 0xff, 0xfa, - 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, - 0xff, 0xf9, 0xe0, 0x1d, 0xf0, 0x17, 0xff, 0xf2, - 0x4b, 0x1c, 0x40, 0x18, 0xf0, 0x17, 0xff, 0xf2, - 0x22, 0x00, 0x49, 0x1b, 0xb4, 0x06, 0x69, 0x60, - 0x69, 0x39, 0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, - 0x1a, 0xc9, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, - 0x6b, 0xfa, 0x1c, 0x2b, 0xf0, 0x0e, 0xfd, 0x1c, - 0xb0, 0x02, 0xf0, 0x17, 0xff, 0xdb, 0x23, 0x01, - 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, 0xff, 0xda, - 0x69, 0x60, 0x6b, 0xf9, 0x18, 0x40, 0x23, 0x0d, - 0x06, 0x9b, 0x1a, 0xc1, 0x61, 0x60, 0x4b, 0x0e, - 0x42, 0x99, 0xd3, 0x02, 0x69, 0x21, 0x1a, 0x40, - 0x61, 0x60, 0x23, 0xff, 0x03, 0x5b, 0x69, 0x60, - 0x1a, 0xc0, 0xe0, 0x00, 0xe0, 0x00, 0x62, 0x20, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x4c, - 0x00, 0x1f, 0xfe, 0x00, 0xff, 0xfb, 0xff, 0xff, - 0x9e, 0x00, 0x08, 0x00, 0xcc, 0x1f, 0xe0, 0x00, - 0xcc, 0x1f, 0xfe, 0x00, 0x21, 0x00, 0x23, 0xff, - 0x68, 0x02, 0x33, 0xc1, 0x42, 0x9a, 0xd0, 0x01, - 0x1c, 0x08, 0x47, 0x70, 0x79, 0xc2, 0x0a, 0x12, - 0xd2, 0x01, 0x1c, 0x08, 0x47, 0x70, 0x7a, 0x41, - 0x23, 0x0e, 0x40, 0x19, 0x07, 0x49, 0x7a, 0x82, - 0x05, 0x92, 0x43, 0x11, 0x7a, 0xc2, 0x23, 0xfe, - 0x40, 0x1a, 0x03, 0x92, 0x43, 0x11, 0x7b, 0x02, - 0x01, 0xd2, 0x43, 0x11, 0x7b, 0x40, 0x40, 0x18, - 0x08, 0x40, 0x43, 0x08, 0x49, 0x01, 0x67, 0x08, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, - 0xb5, 0xf0, 0xb0, 0x86, 0x4c, 0x8c, 0x6c, 0xe0, - 0x1d, 0xe7, 0x37, 0x79, 0x1d, 0xfd, 0x35, 0x39, - 0x28, 0x00, 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x3a, - 0x28, 0x02, 0xd1, 0x73, 0xe0, 0x74, 0x69, 0xe0, - 0x6a, 0x21, 0x1a, 0x09, 0x63, 0xf9, 0x1c, 0x0a, - 0xd5, 0x02, 0x69, 0x21, 0x18, 0x51, 0x63, 0xf9, - 0x6b, 0xf9, 0x29, 0x04, 0xdb, 0x67, 0x69, 0x3e, - 0x5c, 0x31, 0x06, 0x0a, 0x65, 0x7a, 0x92, 0x05, - 0x1c, 0x41, 0x69, 0x20, 0x90, 0x04, 0xf0, 0x14, - 0xf8, 0x09, 0x61, 0xe1, 0x5c, 0x70, 0x04, 0x00, - 0x9a, 0x05, 0x18, 0x82, 0x65, 0x7a, 0x92, 0x03, - 0x98, 0x04, 0x31, 0x01, 0xf0, 0x13, 0xff, 0xfe, - 0x61, 0xe1, 0x5c, 0x70, 0x02, 0x00, 0x9a, 0x03, - 0x18, 0x80, 0x65, 0x78, 0x90, 0x02, 0x98, 0x04, - 0x31, 0x01, 0xf0, 0x13, 0xff, 0xf3, 0x61, 0xe1, - 0x5c, 0x70, 0x9a, 0x02, 0x18, 0x80, 0x65, 0x78, - 0x98, 0x04, 0x31, 0x01, 0xf0, 0x13, 0xff, 0xea, - 0x20, 0x01, 0x64, 0xe0, 0x61, 0xe1, 0x6a, 0x20, - 0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, - 0xd4, 0x05, 0x48, 0x67, 0x69, 0x06, 0x30, 0x80, - 0x69, 0x02, 0x92, 0x01, 0xe0, 0x03, 0x69, 0x20, - 0x18, 0x08, 0x63, 0xf8, 0xe7, 0xf5, 0x6b, 0xf8, - 0x90, 0x00, 0x28, 0x02, 0xdb, 0x22, 0x6d, 0x78, - 0x09, 0x01, 0x01, 0x09, 0x23, 0xff, 0x33, 0xc1, - 0x42, 0x99, 0xd1, 0x31, 0x9a, 0x01, 0x69, 0xe0, - 0x5c, 0x11, 0x02, 0x09, 0x83, 0x29, 0x1c, 0x41, - 0x1c, 0x30, 0xf0, 0x13, 0xff, 0xc3, 0x61, 0xe1, - 0x69, 0x38, 0x5c, 0x40, 0x8b, 0x2a, 0x18, 0x80, - 0x83, 0x28, 0x8b, 0x28, 0x30, 0x06, 0x83, 0x28, - 0x19, 0x88, 0x1f, 0x41, 0x1c, 0x30, 0xf0, 0x13, - 0xff, 0xb5, 0x61, 0xe1, 0x21, 0xff, 0x71, 0x39, - 0x20, 0x02, 0x64, 0xe0, 0x6c, 0xe0, 0x28, 0x02, - 0xd1, 0x00, 0xe0, 0x01, 0xe0, 0x94, 0xe0, 0x93, - 0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40, 0x63, 0xf8, - 0x1c, 0x01, 0xd5, 0x02, 0x69, 0x20, 0x18, 0x08, - 0x63, 0xf8, 0x79, 0x38, 0x28, 0x00, 0xd0, 0x13, - 0x20, 0x01, 0x02, 0xc0, 0x83, 0xa8, 0xe0, 0x11, - 0x02, 0x01, 0x65, 0x79, 0x9a, 0x01, 0x69, 0xe0, - 0x5c, 0x12, 0x18, 0x51, 0x65, 0x79, 0x1c, 0x41, - 0x1c, 0x30, 0xf0, 0x13, 0xff, 0x8f, 0x61, 0xe1, - 0x98, 0x00, 0x38, 0x01, 0x63, 0xf8, 0xe7, 0xb2, - 0x48, 0x3c, 0x83, 0xa8, 0x8b, 0x28, 0x6b, 0xf9, - 0x42, 0x88, 0xda, 0x01, 0x63, 0xf8, 0xe0, 0x02, - 0x8b, 0xa8, 0x42, 0x81, 0xdb, 0x68, 0x8b, 0xa8, - 0x6b, 0xf9, 0x42, 0x81, 0xdd, 0x00, 0x63, 0xf8, - 0x48, 0x35, 0x21, 0x00, 0x66, 0x78, 0x80, 0x01, - 0x30, 0x02, 0x21, 0xff, 0x31, 0xc1, 0x66, 0x78, - 0x80, 0x01, 0x48, 0x32, 0x66, 0x78, 0x79, 0x39, - 0x29, 0x00, 0xd0, 0x21, 0x21, 0x00, 0x71, 0x39, - 0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, - 0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x2a, - 0xf0, 0x00, 0xfe, 0xec, 0x6b, 0xf8, 0x38, 0x06, - 0x6e, 0x79, 0x80, 0x08, 0x31, 0x02, 0x66, 0x79, - 0xb0, 0x01, 0x48, 0x25, 0xf7, 0xff, 0xff, 0x02, - 0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, - 0x69, 0xe0, 0x6b, 0xf9, 0x18, 0x41, 0x69, 0x20, - 0xf0, 0x13, 0xff, 0x4c, 0x61, 0xe1, 0xe0, 0x26, - 0x6b, 0xf9, 0x31, 0x03, 0x80, 0x01, 0x48, 0x1e, - 0x21, 0x01, 0x03, 0xc9, 0x66, 0x78, 0x80, 0x01, - 0x30, 0x02, 0x21, 0xff, 0x66, 0x78, 0x80, 0x01, - 0x48, 0x1a, 0x66, 0x78, 0x69, 0x3b, 0x69, 0x20, + 0x28, 0x00, 0xd1, 0x99, 0x8d, 0xa0, 0x06, 0x00, + 0x0e, 0x00, 0x28, 0x06, 0xd1, 0x94, 0x85, 0xa5, + 0x65, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x44, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x00, 0x04, 0x2e, 0x08, 0x04, 0xc4, + 0xb5, 0xb0, 0x48, 0x46, 0x6c, 0xc1, 0x4c, 0x46, + 0x64, 0x21, 0x69, 0x60, 0x1a, 0x09, 0x1d, 0xe7, + 0x37, 0x79, 0x63, 0xf9, 0x29, 0x00, 0xda, 0x02, + 0x69, 0x22, 0x18, 0x89, 0x63, 0xf9, 0x23, 0xff, + 0x6b, 0xf9, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x73, + 0x22, 0x01, 0x03, 0x12, 0x42, 0x91, 0xdd, 0x00, + 0x63, 0xfa, 0x6b, 0xf9, 0x08, 0x89, 0x00, 0x89, + 0x63, 0xf9, 0x7a, 0x3a, 0x2a, 0x00, 0xd0, 0x05, + 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc2, 0x61, 0xe2, + 0x22, 0x00, 0x72, 0x3a, 0x18, 0x42, 0x49, 0x35, + 0x25, 0x12, 0x42, 0x8a, 0xdd, 0x2c, 0x1a, 0x08, + 0x64, 0x38, 0xf0, 0x18, 0xfb, 0x5f, 0x4b, 0x32, + 0x40, 0x18, 0xf0, 0x18, 0xfb, 0x5f, 0x22, 0x00, + 0x49, 0x30, 0xb4, 0x06, 0x69, 0x60, 0x69, 0x39, + 0x18, 0x41, 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x6c, 0x3a, + 0x1c, 0x2b, 0xf0, 0x0f, 0xf8, 0x67, 0x22, 0x00, + 0xb0, 0x02, 0x49, 0x28, 0xb4, 0x06, 0x6b, 0xf8, + 0x6c, 0x39, 0x1a, 0x42, 0x69, 0x39, 0x1c, 0x2b, + 0x48, 0x25, 0xf0, 0x0f, 0xf8, 0x5b, 0xb0, 0x02, + 0xf0, 0x18, 0xfb, 0x3c, 0x23, 0x01, 0x04, 0x9b, + 0x43, 0x18, 0xf0, 0x18, 0xfb, 0x3b, 0xe0, 0x1d, + 0xf0, 0x18, 0xfb, 0x34, 0x4b, 0x1c, 0x40, 0x18, + 0xf0, 0x18, 0xfb, 0x34, 0x22, 0x00, 0x49, 0x1b, + 0xb4, 0x06, 0x69, 0x60, 0x69, 0x39, 0x18, 0x41, + 0x23, 0xff, 0x03, 0x5b, 0x1a, 0xc9, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc0, 0x6b, 0xfa, 0x1c, 0x2b, + 0xf0, 0x0f, 0xf8, 0x3c, 0xb0, 0x02, 0xf0, 0x18, + 0xfb, 0x1d, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, + 0xf0, 0x18, 0xfb, 0x1c, 0x69, 0x60, 0x6b, 0xf9, + 0x18, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, + 0x61, 0x60, 0x4b, 0x0e, 0x42, 0x99, 0xd3, 0x02, + 0x69, 0x21, 0x1a, 0x40, 0x61, 0x60, 0x23, 0xff, + 0x03, 0x5b, 0x69, 0x60, 0x1a, 0xc0, 0xe0, 0x00, + 0xe0, 0x00, 0x62, 0x20, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x04, 0x44, 0x00, 0x1f, 0xfe, 0x00, + 0xff, 0xfb, 0xff, 0xff, 0x9e, 0x00, 0x08, 0x00, + 0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00, + 0x21, 0x00, 0x23, 0xff, 0x68, 0x02, 0x33, 0xc1, + 0x42, 0x9a, 0xd0, 0x01, 0x1c, 0x08, 0x47, 0x70, + 0x79, 0xc2, 0x0a, 0x12, 0xd2, 0x01, 0x1c, 0x08, + 0x47, 0x70, 0x7a, 0x41, 0x23, 0x0e, 0x40, 0x19, + 0x07, 0x49, 0x7a, 0x82, 0x05, 0x92, 0x43, 0x11, + 0x7a, 0xc2, 0x23, 0xfe, 0x40, 0x1a, 0x03, 0x92, + 0x43, 0x11, 0x7b, 0x02, 0x01, 0xd2, 0x43, 0x11, + 0x7b, 0x40, 0x40, 0x18, 0x08, 0x40, 0x43, 0x08, + 0x49, 0x01, 0x67, 0x08, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x44, 0xb5, 0xf0, 0xb0, 0x86, + 0x4c, 0x8c, 0x6c, 0xe0, 0x1d, 0xe7, 0x37, 0x79, + 0x1d, 0xfd, 0x35, 0x39, 0x28, 0x00, 0xd0, 0x04, + 0x28, 0x01, 0xd0, 0x3a, 0x28, 0x02, 0xd1, 0x73, + 0xe0, 0x74, 0x69, 0xe0, 0x6a, 0x21, 0x1a, 0x09, + 0x63, 0xf9, 0x1c, 0x0a, 0xd5, 0x02, 0x69, 0x21, + 0x18, 0x51, 0x63, 0xf9, 0x6b, 0xf9, 0x29, 0x04, + 0xdb, 0x67, 0x69, 0x3e, 0x5c, 0x31, 0x06, 0x0a, + 0x65, 0x7a, 0x92, 0x05, 0x1c, 0x41, 0x69, 0x20, + 0x90, 0x04, 0xf0, 0x14, 0xfb, 0x29, 0x61, 0xe1, + 0x5c, 0x70, 0x04, 0x00, 0x9a, 0x05, 0x18, 0x82, + 0x65, 0x7a, 0x92, 0x03, 0x98, 0x04, 0x31, 0x01, + 0xf0, 0x14, 0xfb, 0x1e, 0x61, 0xe1, 0x5c, 0x70, + 0x02, 0x00, 0x9a, 0x03, 0x18, 0x80, 0x65, 0x78, + 0x90, 0x02, 0x98, 0x04, 0x31, 0x01, 0xf0, 0x14, + 0xfb, 0x13, 0x61, 0xe1, 0x5c, 0x70, 0x9a, 0x02, + 0x18, 0x80, 0x65, 0x78, 0x98, 0x04, 0x31, 0x01, + 0xf0, 0x14, 0xfb, 0x0a, 0x20, 0x01, 0x64, 0xe0, + 0x61, 0xe1, 0x6a, 0x20, 0x69, 0xe1, 0x1a, 0x40, + 0x63, 0xf8, 0x1c, 0x01, 0xd4, 0x05, 0x48, 0x67, + 0x69, 0x06, 0x30, 0x80, 0x69, 0x02, 0x92, 0x01, + 0xe0, 0x03, 0x69, 0x20, 0x18, 0x08, 0x63, 0xf8, + 0xe7, 0xf5, 0x6b, 0xf8, 0x90, 0x00, 0x28, 0x02, + 0xdb, 0x22, 0x6d, 0x78, 0x09, 0x01, 0x01, 0x09, + 0x23, 0xff, 0x33, 0xc1, 0x42, 0x99, 0xd1, 0x31, + 0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x11, 0x02, 0x09, + 0x83, 0x29, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14, + 0xfa, 0xe3, 0x61, 0xe1, 0x69, 0x38, 0x5c, 0x40, + 0x8b, 0x2a, 0x18, 0x80, 0x83, 0x28, 0x8b, 0x28, + 0x30, 0x06, 0x83, 0x28, 0x19, 0x88, 0x1f, 0x41, + 0x1c, 0x30, 0xf0, 0x14, 0xfa, 0xd5, 0x61, 0xe1, + 0x21, 0xff, 0x71, 0x39, 0x20, 0x02, 0x64, 0xe0, + 0x6c, 0xe0, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x01, + 0xe0, 0x94, 0xe0, 0x93, 0x6a, 0x20, 0x69, 0xe1, + 0x1a, 0x40, 0x63, 0xf8, 0x1c, 0x01, 0xd5, 0x02, + 0x69, 0x20, 0x18, 0x08, 0x63, 0xf8, 0x79, 0x38, + 0x28, 0x00, 0xd0, 0x13, 0x20, 0x01, 0x02, 0xc0, + 0x83, 0xa8, 0xe0, 0x11, 0x02, 0x01, 0x65, 0x79, + 0x9a, 0x01, 0x69, 0xe0, 0x5c, 0x12, 0x18, 0x51, + 0x65, 0x79, 0x1c, 0x41, 0x1c, 0x30, 0xf0, 0x14, + 0xfa, 0xaf, 0x61, 0xe1, 0x98, 0x00, 0x38, 0x01, + 0x63, 0xf8, 0xe7, 0xb2, 0x48, 0x3c, 0x83, 0xa8, + 0x8b, 0x28, 0x6b, 0xf9, 0x42, 0x88, 0xda, 0x01, + 0x63, 0xf8, 0xe0, 0x02, 0x8b, 0xa8, 0x42, 0x81, + 0xdb, 0x68, 0x8b, 0xa8, 0x6b, 0xf9, 0x42, 0x81, + 0xdd, 0x00, 0x63, 0xf8, 0x48, 0x35, 0x21, 0x00, + 0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff, + 0x31, 0xc1, 0x66, 0x78, 0x80, 0x01, 0x48, 0x32, + 0x66, 0x78, 0x79, 0x39, 0x29, 0x00, 0xd0, 0x21, + 0x21, 0x00, 0x71, 0x39, 0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, 0x69, 0xe0, 0x18, 0x18, - 0x6b, 0xfa, 0x49, 0x17, 0xf0, 0x00, 0xfe, 0xbe, - 0x8b, 0x28, 0x6b, 0xf9, 0x1a, 0x40, 0x83, 0x28, - 0x69, 0xe0, 0x6b, 0xfe, 0x19, 0x81, 0x69, 0x20, - 0xb0, 0x01, 0xf0, 0x13, 0xff, 0x27, 0x1d, 0xf0, - 0x30, 0x02, 0x61, 0xe1, 0x63, 0xf8, 0x8b, 0x28, - 0x28, 0x00, 0xd1, 0x01, 0x21, 0x00, 0x64, 0xe0, - 0x21, 0x10, 0x48, 0x0c, 0x85, 0x01, 0x6b, 0xf9, - 0x85, 0x41, 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, - 0xb0, 0x06, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x04, 0x4c, 0x00, 0x00, 0x07, 0xf7, - 0x2c, 0x00, 0x02, 0x00, 0x2c, 0x00, 0x02, 0x04, - 0x2c, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x02, 0x0a, - 0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0, - 0xb5, 0xf0, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x40, - 0xb0, 0x81, 0x4f, 0x77, 0x63, 0xb8, 0x6a, 0xf9, - 0x1a, 0x40, 0x1d, 0xfc, 0x34, 0x79, 0x63, 0xe0, - 0x28, 0x00, 0xda, 0x02, 0x6a, 0x79, 0x18, 0x40, - 0x63, 0xe0, 0x6b, 0xe0, 0x4b, 0x71, 0x42, 0x98, - 0xdc, 0x03, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x6d, 0xb9, 0x48, 0x6e, 0x1d, 0xc5, - 0x35, 0x59, 0x29, 0x00, 0xd1, 0x16, 0x7e, 0x01, - 0x29, 0x00, 0xd1, 0x13, 0x21, 0x01, 0x75, 0x01, - 0x21, 0x05, 0x84, 0x29, 0x23, 0x0d, 0x06, 0x9b, - 0x6c, 0x79, 0x1a, 0xca, 0x68, 0x52, 0x31, 0x08, - 0x23, 0x05, 0x02, 0x5b, 0x64, 0x79, 0x66, 0xba, - 0x42, 0x99, 0xdb, 0x06, 0x21, 0x01, 0x02, 0xc9, - 0x64, 0x79, 0xe0, 0x02, 0x21, 0x00, 0x75, 0x01, - 0x84, 0x29, 0x8c, 0x29, 0x1c, 0x4a, 0x6a, 0xfb, - 0x1a, 0x9a, 0x07, 0x92, 0x0f, 0x92, 0x18, 0x51, - 0x84, 0x29, 0x7e, 0x01, 0x29, 0x00, 0xd0, 0x03, - 0x21, 0x00, 0x66, 0x39, 0x66, 0x79, 0x76, 0x01, - 0x6c, 0x79, 0x4a, 0x58, 0x69, 0x52, 0x42, 0x91, - 0xd0, 0x26, 0x6e, 0x7a, 0x2a, 0x00, 0xd1, 0x10, - 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc9, 0x68, 0x09, - 0x66, 0x79, 0x1c, 0x0a, 0x6e, 0x3b, 0x18, 0x59, - 0x66, 0x39, 0x4b, 0x51, 0x42, 0x99, 0xdb, 0x04, - 0x32, 0x01, 0x31, 0x01, 0x40, 0x19, 0x66, 0x39, - 0x66, 0x7a, 0x6e, 0x79, 0x6d, 0xba, 0x1a, 0x89, - 0x65, 0x21, 0x91, 0x00, 0x8c, 0x2b, 0x4e, 0x4b, - 0x1a, 0xf3, 0x42, 0x8b, 0xd3, 0x04, 0x63, 0xe1, - 0x21, 0x00, 0x65, 0xb9, 0x66, 0x79, 0xe0, 0x0a, - 0x18, 0xd1, 0x63, 0xe3, 0x65, 0xb9, 0xe0, 0x06, - 0x8c, 0x29, 0x4a, 0x44, 0x1a, 0x51, 0x63, 0xe1, - 0x6d, 0xba, 0x18, 0x51, 0x65, 0xb9, 0x49, 0x42, - 0x66, 0x61, 0x8c, 0x2a, 0x6b, 0xe1, 0x18, 0x89, - 0x31, 0x03, 0x83, 0xa9, 0x22, 0x00, 0x6e, 0x61, - 0x80, 0x0a, 0x31, 0x02, 0x22, 0xff, 0x32, 0xe1, - 0x66, 0x61, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, - 0x8b, 0xaa, 0x80, 0x0a, 0x31, 0x02, 0x66, 0x61, - 0x7d, 0x00, 0x28, 0x00, 0xd0, 0x1d, 0x4a, 0x37, - 0x80, 0x0a, 0x1c, 0x88, 0x66, 0x60, 0x8c, 0x29, - 0x02, 0x09, 0x6e, 0xba, 0x0f, 0x52, 0x23, 0x06, - 0x40, 0x1a, 0x43, 0x11, 0x23, 0x21, 0x43, 0x19, - 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, - 0x0b, 0x89, 0x23, 0x01, 0x43, 0x19, 0x80, 0x01, - 0x30, 0x02, 0x66, 0x60, 0x6e, 0xb9, 0x00, 0x49, + 0x6b, 0xfa, 0x49, 0x2a, 0xf0, 0x00, 0xfe, 0xf4, + 0x6b, 0xf8, 0x38, 0x06, 0x6e, 0x79, 0x80, 0x08, + 0x31, 0x02, 0x66, 0x79, 0xb0, 0x01, 0x48, 0x25, + 0xf7, 0xff, 0xff, 0x02, 0x8b, 0x28, 0x6b, 0xf9, + 0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xf9, + 0x18, 0x41, 0x69, 0x20, 0xf0, 0x14, 0xfa, 0x6c, + 0x61, 0xe1, 0xe0, 0x26, 0x6b, 0xf9, 0x31, 0x03, + 0x80, 0x01, 0x48, 0x1e, 0x21, 0x01, 0x03, 0xc9, + 0x66, 0x78, 0x80, 0x01, 0x30, 0x02, 0x21, 0xff, + 0x66, 0x78, 0x80, 0x01, 0x48, 0x1a, 0x66, 0x78, + 0x69, 0x3b, 0x69, 0x20, 0x18, 0x1a, 0xb4, 0x04, + 0x69, 0xe0, 0x18, 0x18, 0x6b, 0xfa, 0x49, 0x17, + 0xf0, 0x00, 0xfe, 0xc6, 0x8b, 0x28, 0x6b, 0xf9, + 0x1a, 0x40, 0x83, 0x28, 0x69, 0xe0, 0x6b, 0xfe, + 0x19, 0x81, 0x69, 0x20, 0xb0, 0x01, 0xf0, 0x14, + 0xfa, 0x47, 0x1d, 0xf0, 0x30, 0x02, 0x61, 0xe1, + 0x63, 0xf8, 0x8b, 0x28, 0x28, 0x00, 0xd1, 0x01, + 0x21, 0x00, 0x64, 0xe0, 0x21, 0x10, 0x48, 0x0c, + 0x85, 0x01, 0x6b, 0xf9, 0x85, 0x41, 0x21, 0x01, + 0x02, 0x49, 0x86, 0x81, 0xb0, 0x06, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, + 0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00, + 0x2c, 0x00, 0x02, 0x04, 0x2c, 0x00, 0x02, 0x06, + 0x2c, 0x00, 0x02, 0x0a, 0x2c, 0x00, 0x02, 0x09, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xf0, 0x20, 0x33, + 0x06, 0x40, 0x6e, 0x40, 0xb0, 0x81, 0x4f, 0x77, + 0x63, 0xb8, 0x6a, 0xf9, 0x1a, 0x40, 0x1d, 0xfc, + 0x34, 0x79, 0x63, 0xe0, 0x28, 0x00, 0xda, 0x02, + 0x6a, 0x79, 0x18, 0x40, 0x63, 0xe0, 0x6b, 0xe0, + 0x4b, 0x71, 0x42, 0x98, 0xdc, 0x03, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0xb9, + 0x48, 0x6e, 0x1d, 0xc5, 0x35, 0x59, 0x29, 0x00, + 0xd1, 0x16, 0x7e, 0x01, 0x29, 0x00, 0xd1, 0x13, + 0x21, 0x01, 0x75, 0x01, 0x21, 0x05, 0x84, 0x29, + 0x23, 0x0d, 0x06, 0x9b, 0x6c, 0x79, 0x1a, 0xca, + 0x68, 0x52, 0x31, 0x08, 0x23, 0x05, 0x02, 0x5b, + 0x64, 0x79, 0x66, 0xba, 0x42, 0x99, 0xdb, 0x06, + 0x21, 0x01, 0x02, 0xc9, 0x64, 0x79, 0xe0, 0x02, + 0x21, 0x00, 0x75, 0x01, 0x84, 0x29, 0x8c, 0x29, + 0x1c, 0x4a, 0x6a, 0xfb, 0x1a, 0x9a, 0x07, 0x92, + 0x0f, 0x92, 0x18, 0x51, 0x84, 0x29, 0x7e, 0x01, + 0x29, 0x00, 0xd0, 0x03, 0x21, 0x00, 0x66, 0x39, + 0x66, 0x79, 0x76, 0x01, 0x6c, 0x79, 0x4a, 0x58, + 0x69, 0x52, 0x42, 0x91, 0xd0, 0x26, 0x6e, 0x7a, + 0x2a, 0x00, 0xd1, 0x10, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc9, 0x68, 0x09, 0x66, 0x79, 0x1c, 0x0a, + 0x6e, 0x3b, 0x18, 0x59, 0x66, 0x39, 0x4b, 0x51, + 0x42, 0x99, 0xdb, 0x04, 0x32, 0x01, 0x31, 0x01, + 0x40, 0x19, 0x66, 0x39, 0x66, 0x7a, 0x6e, 0x79, + 0x6d, 0xba, 0x1a, 0x89, 0x65, 0x21, 0x91, 0x00, + 0x8c, 0x2b, 0x4e, 0x4b, 0x1a, 0xf3, 0x42, 0x8b, + 0xd3, 0x04, 0x63, 0xe1, 0x21, 0x00, 0x65, 0xb9, + 0x66, 0x79, 0xe0, 0x0a, 0x18, 0xd1, 0x63, 0xe3, + 0x65, 0xb9, 0xe0, 0x06, 0x8c, 0x29, 0x4a, 0x44, + 0x1a, 0x51, 0x63, 0xe1, 0x6d, 0xba, 0x18, 0x51, + 0x65, 0xb9, 0x49, 0x42, 0x66, 0x61, 0x8c, 0x2a, + 0x6b, 0xe1, 0x18, 0x89, 0x31, 0x03, 0x83, 0xa9, + 0x22, 0x00, 0x6e, 0x61, 0x80, 0x0a, 0x31, 0x02, + 0x22, 0xff, 0x32, 0xe1, 0x66, 0x61, 0x80, 0x0a, + 0x31, 0x02, 0x66, 0x61, 0x8b, 0xaa, 0x80, 0x0a, + 0x31, 0x02, 0x66, 0x61, 0x7d, 0x00, 0x28, 0x00, + 0xd0, 0x1d, 0x4a, 0x37, 0x80, 0x0a, 0x1c, 0x88, + 0x66, 0x60, 0x8c, 0x29, 0x02, 0x09, 0x6e, 0xba, + 0x0f, 0x52, 0x23, 0x06, 0x40, 0x1a, 0x43, 0x11, + 0x23, 0x21, 0x43, 0x19, 0x80, 0x01, 0x30, 0x02, + 0x66, 0x60, 0x6e, 0xb9, 0x0b, 0x89, 0x23, 0x01, 0x43, 0x19, 0x80, 0x01, 0x30, 0x02, 0x66, 0x60, - 0xe0, 0x0b, 0x20, 0x01, 0x03, 0xc0, 0x80, 0x08, - 0x31, 0x02, 0x66, 0x61, 0x8c, 0x28, 0x02, 0x00, - 0x23, 0xff, 0x43, 0x18, 0x80, 0x08, 0x31, 0x02, - 0x66, 0x61, 0x48, 0x23, 0x6e, 0x61, 0x80, 0x08, - 0x31, 0x02, 0x66, 0x61, 0x80, 0x08, 0x31, 0x02, - 0x22, 0x33, 0x06, 0x52, 0x66, 0x61, 0x00, 0x53, - 0x6d, 0x90, 0x18, 0xc2, 0xb4, 0x04, 0x08, 0x5a, - 0x6d, 0x50, 0x18, 0xc6, 0x8c, 0x28, 0x4b, 0x1b, - 0x18, 0xc1, 0x00, 0x53, 0x6a, 0xf8, 0x18, 0xc0, - 0x6b, 0xe2, 0x1c, 0x33, 0xf0, 0x00, 0xfd, 0xb6, - 0x6a, 0xf8, 0x6b, 0xe1, 0x18, 0x40, 0x22, 0x33, - 0x06, 0x52, 0x62, 0xf8, 0x6d, 0x92, 0xb0, 0x01, - 0x42, 0x90, 0xdb, 0x02, 0x6a, 0x79, 0x1a, 0x40, - 0x62, 0xf8, 0x21, 0xff, 0x31, 0x11, 0x48, 0x10, - 0x85, 0x01, 0x8b, 0xa9, 0x31, 0x06, 0x85, 0x41, - 0x21, 0x01, 0x02, 0x49, 0x86, 0x81, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x04, 0x4c, 0x00, 0x00, 0x0f, 0xee, - 0x2e, 0x08, 0x04, 0xac, 0xcc, 0x00, 0x0f, 0x00, - 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x07, 0xf7, - 0x2c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x80, - 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x02, 0x09, - 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0xb0, 0x1c, 0x07, - 0xb0, 0x83, 0x4d, 0x20, 0x6b, 0x28, 0xf7, 0xff, - 0xfa, 0x51, 0x48, 0x1f, 0x6c, 0xc1, 0x6c, 0x80, - 0x1a, 0x08, 0xd5, 0x03, 0x1f, 0xe9, 0x39, 0x79, - 0x69, 0x09, 0x18, 0x40, 0x6e, 0xa9, 0x29, 0x00, - 0xd0, 0x22, 0x29, 0x10, 0xd0, 0x20, 0x29, 0x20, - 0xd0, 0x24, 0x29, 0x30, 0xd1, 0x04, 0x24, 0x2d, - 0x43, 0x44, 0xd5, 0x00, 0x34, 0x3f, 0x11, 0xa4, - 0x46, 0x6a, 0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, - 0xfa, 0x17, 0x1b, 0x38, 0x99, 0x02, 0x1a, 0x08, - 0x22, 0x7d, 0x01, 0x52, 0x42, 0x90, 0xdc, 0x01, - 0x42, 0x90, 0xda, 0x05, 0x1a, 0x09, 0x91, 0x02, - 0x22, 0x00, 0x20, 0x00, 0xf7, 0xff, 0xf9, 0xf2, - 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x01, 0x04, 0x1a, 0x24, 0xd5, 0x00, 0x34, 0x1f, - 0x11, 0x64, 0xe7, 0xe1, 0x21, 0x4b, 0x43, 0x41, - 0x20, 0x93, 0xf0, 0x13, 0xfd, 0xb7, 0x1c, 0x04, - 0xe7, 0xda, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xcc, - 0x66, 0x00, 0x00, 0x80, 0xb5, 0x90, 0x1c, 0x07, - 0xb0, 0x83, 0x4c, 0x18, 0x6f, 0x60, 0x30, 0x01, - 0x46, 0x6a, 0x67, 0x60, 0xa8, 0x01, 0xa9, 0x02, - 0xf7, 0xff, 0xf9, 0xe6, 0x4b, 0x14, 0x18, 0xf9, - 0x98, 0x02, 0x1a, 0x40, 0x4b, 0x13, 0x42, 0x98, - 0xdc, 0x04, 0x42, 0xd8, 0xdb, 0x02, 0x69, 0xe0, - 0x28, 0x01, 0xd1, 0x07, 0x91, 0x02, 0x20, 0x00, - 0x90, 0x01, 0x22, 0x00, 0xf7, 0xff, 0xf9, 0xbe, - 0x20, 0x01, 0x61, 0xe0, 0x69, 0xe0, 0x28, 0x00, - 0xd0, 0x0b, 0x6b, 0x20, 0xf7, 0xff, 0xf9, 0xea, - 0x6f, 0x60, 0x67, 0xa0, 0x48, 0x08, 0x60, 0x07, - 0x6f, 0xe0, 0x30, 0x01, 0x67, 0xe0, 0x20, 0x00, - 0x61, 0xe0, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xcc, - 0xff, 0xff, 0xec, 0x78, 0x00, 0x02, 0xbf, 0x20, - 0x2e, 0x08, 0x05, 0x4c, 0xb4, 0xf0, 0x1c, 0x1c, - 0x23, 0x00, 0x9f, 0x04, 0x60, 0x3b, 0x79, 0x85, - 0x23, 0xc0, 0x40, 0x1d, 0x4b, 0x33, 0x2d, 0x80, - 0xd1, 0x16, 0x25, 0x02, 0x60, 0x9d, 0x79, 0xc5, - 0x0a, 0x2b, 0xd3, 0x06, 0x7a, 0x45, 0x23, 0xe0, - 0x40, 0x2b, 0x2b, 0x20, 0xd1, 0x01, 0x23, 0x09, - 0x60, 0x3b, 0x7a, 0x03, 0x33, 0x09, 0x60, 0x13, - 0x79, 0x02, 0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, - 0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22, 0xe0, 0x25, - 0x25, 0x06, 0x26, 0x01, 0x60, 0x9e, 0x79, 0x83, - 0x2b, 0xff, 0xd1, 0x03, 0x35, 0x01, 0x5d, 0x43, - 0x2b, 0xff, 0xd0, 0xfb, 0x5d, 0x46, 0x23, 0xc0, - 0x40, 0x33, 0x2b, 0x40, 0xd1, 0x00, 0x35, 0x02, - 0x5d, 0x46, 0x09, 0x33, 0x07, 0x9b, 0xd0, 0x08, - 0x60, 0x3d, 0x5d, 0x46, 0x09, 0x73, 0xd3, 0x02, - 0x1d, 0xeb, 0x33, 0x03, 0xe0, 0x02, 0x1d, 0x6b, - 0xe0, 0x00, 0x1c, 0x6b, 0x60, 0x13, 0x79, 0x02, - 0x02, 0x12, 0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, - 0x1a, 0xd2, 0x60, 0x22, 0x68, 0x3a, 0x2a, 0x00, - 0xd0, 0x20, 0x5c, 0x82, 0x23, 0x0e, 0x40, 0x1a, - 0x07, 0x52, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, - 0x78, 0x5b, 0x05, 0x9b, 0x43, 0x1a, 0x60, 0x0a, - 0x68, 0x3b, 0x18, 0xc3, 0x78, 0x9c, 0x23, 0xfe, - 0x40, 0x23, 0x03, 0x9b, 0x43, 0x1a, 0x60, 0x0a, - 0x68, 0x3b, 0x18, 0xc3, 0x78, 0xdb, 0x01, 0xdb, - 0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc0, - 0x79, 0x00, 0x23, 0xfe, 0x40, 0x18, 0x08, 0x40, - 0x43, 0x10, 0x60, 0x08, 0x20, 0x00, 0xbc, 0xf0, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, - 0xb5, 0xb0, 0xb0, 0x83, 0x48, 0x3f, 0x49, 0x40, - 0x8d, 0xc9, 0x4c, 0x40, 0x63, 0xe1, 0x29, 0x06, - 0xda, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x68, 0x01, 0x09, 0x49, 0x01, 0x49, - 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, 0xd0, 0x03, + 0x6e, 0xb9, 0x00, 0x49, 0x43, 0x19, 0x80, 0x01, + 0x30, 0x02, 0x66, 0x60, 0xe0, 0x0b, 0x20, 0x01, + 0x03, 0xc0, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, + 0x8c, 0x28, 0x02, 0x00, 0x23, 0xff, 0x43, 0x18, + 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, 0x48, 0x23, + 0x6e, 0x61, 0x80, 0x08, 0x31, 0x02, 0x66, 0x61, + 0x80, 0x08, 0x31, 0x02, 0x22, 0x33, 0x06, 0x52, + 0x66, 0x61, 0x00, 0x53, 0x6d, 0x90, 0x18, 0xc2, + 0xb4, 0x04, 0x08, 0x5a, 0x6d, 0x50, 0x18, 0xc6, + 0x8c, 0x28, 0x4b, 0x1b, 0x18, 0xc1, 0x00, 0x53, + 0x6a, 0xf8, 0x18, 0xc0, 0x6b, 0xe2, 0x1c, 0x33, + 0xf0, 0x00, 0xfd, 0xbe, 0x6a, 0xf8, 0x6b, 0xe1, + 0x18, 0x40, 0x22, 0x33, 0x06, 0x52, 0x62, 0xf8, + 0x6d, 0x92, 0xb0, 0x01, 0x42, 0x90, 0xdb, 0x02, + 0x6a, 0x79, 0x1a, 0x40, 0x62, 0xf8, 0x21, 0xff, + 0x31, 0x11, 0x48, 0x10, 0x85, 0x01, 0x8b, 0xa9, + 0x31, 0x06, 0x85, 0x41, 0x21, 0x01, 0x02, 0x49, + 0x86, 0x81, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, + 0x00, 0x00, 0x0f, 0xee, 0x2e, 0x08, 0x04, 0xa4, + 0xcc, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x07, 0xf7, 0x2c, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0xff, 0xff, + 0x2c, 0x00, 0x02, 0x09, 0x2c, 0x00, 0x1f, 0xc0, + 0xb5, 0xb0, 0x1c, 0x07, 0xb0, 0x83, 0x4d, 0x20, + 0x6b, 0x28, 0xf7, 0xff, 0xfa, 0x51, 0x48, 0x1f, + 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x03, + 0x1f, 0xe9, 0x39, 0x79, 0x69, 0x09, 0x18, 0x40, + 0x6e, 0xa9, 0x29, 0x00, 0xd0, 0x22, 0x29, 0x10, + 0xd0, 0x20, 0x29, 0x20, 0xd0, 0x24, 0x29, 0x30, + 0xd1, 0x04, 0x24, 0x2d, 0x43, 0x44, 0xd5, 0x00, + 0x34, 0x3f, 0x11, 0xa4, 0x46, 0x6a, 0xa8, 0x01, + 0xa9, 0x02, 0xf7, 0xff, 0xfa, 0x17, 0x1b, 0x38, + 0x99, 0x02, 0x1a, 0x08, 0x22, 0x7d, 0x01, 0x52, + 0x42, 0x90, 0xdc, 0x01, 0x42, 0x90, 0xda, 0x05, + 0x1a, 0x09, 0x91, 0x02, 0x22, 0x00, 0x20, 0x00, + 0xf7, 0xff, 0xf9, 0xf2, 0xb0, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x01, 0x04, 0x1a, 0x24, + 0xd5, 0x00, 0x34, 0x1f, 0x11, 0x64, 0xe7, 0xe1, + 0x21, 0x4b, 0x43, 0x41, 0x20, 0x93, 0xf0, 0x14, + 0xf8, 0xd7, 0x1c, 0x04, 0xe7, 0xda, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc4, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x83, 0x4c, 0x18, + 0x6f, 0x60, 0x30, 0x01, 0x46, 0x6a, 0x67, 0x60, + 0xa8, 0x01, 0xa9, 0x02, 0xf7, 0xff, 0xf9, 0xe6, + 0x4b, 0x14, 0x18, 0xf9, 0x98, 0x02, 0x1a, 0x40, + 0x4b, 0x13, 0x42, 0x98, 0xdc, 0x04, 0x42, 0xd8, + 0xdb, 0x02, 0x69, 0xe0, 0x28, 0x01, 0xd1, 0x07, + 0x91, 0x02, 0x20, 0x00, 0x90, 0x01, 0x22, 0x00, + 0xf7, 0xff, 0xf9, 0xbe, 0x20, 0x01, 0x61, 0xe0, + 0x69, 0xe0, 0x28, 0x00, 0xd0, 0x0b, 0x6b, 0x20, + 0xf7, 0xff, 0xf9, 0xea, 0x6f, 0x60, 0x67, 0xa0, + 0x48, 0x08, 0x60, 0x07, 0x6f, 0xe0, 0x30, 0x01, + 0x67, 0xe0, 0x20, 0x00, 0x61, 0xe0, 0xb0, 0x03, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0xc4, 0xff, 0xff, 0xec, 0x78, + 0x00, 0x02, 0xbf, 0x20, 0x2e, 0x08, 0x05, 0x44, + 0xb4, 0xf0, 0x1c, 0x1c, 0x23, 0x00, 0x9f, 0x04, + 0x60, 0x3b, 0x79, 0x85, 0x23, 0xc0, 0x40, 0x1d, + 0x4b, 0x33, 0x2d, 0x80, 0xd1, 0x16, 0x25, 0x02, + 0x60, 0x9d, 0x79, 0xc5, 0x0a, 0x2b, 0xd3, 0x06, + 0x7a, 0x45, 0x23, 0xe0, 0x40, 0x2b, 0x2b, 0x20, + 0xd1, 0x01, 0x23, 0x09, 0x60, 0x3b, 0x7a, 0x03, + 0x33, 0x09, 0x60, 0x13, 0x79, 0x02, 0x02, 0x12, + 0x79, 0x45, 0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2, + 0x60, 0x22, 0xe0, 0x25, 0x25, 0x06, 0x26, 0x01, + 0x60, 0x9e, 0x79, 0x83, 0x2b, 0xff, 0xd1, 0x03, + 0x35, 0x01, 0x5d, 0x43, 0x2b, 0xff, 0xd0, 0xfb, + 0x5d, 0x46, 0x23, 0xc0, 0x40, 0x33, 0x2b, 0x40, + 0xd1, 0x00, 0x35, 0x02, 0x5d, 0x46, 0x09, 0x33, + 0x07, 0x9b, 0xd0, 0x08, 0x60, 0x3d, 0x5d, 0x46, + 0x09, 0x73, 0xd3, 0x02, 0x1d, 0xeb, 0x33, 0x03, + 0xe0, 0x02, 0x1d, 0x6b, 0xe0, 0x00, 0x1c, 0x6b, + 0x60, 0x13, 0x79, 0x02, 0x02, 0x12, 0x79, 0x45, + 0x43, 0x2a, 0x32, 0x06, 0x1a, 0xd2, 0x60, 0x22, + 0x68, 0x3a, 0x2a, 0x00, 0xd0, 0x20, 0x5c, 0x82, + 0x23, 0x0e, 0x40, 0x1a, 0x07, 0x52, 0x60, 0x0a, + 0x68, 0x3b, 0x18, 0xc3, 0x78, 0x5b, 0x05, 0x9b, + 0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, + 0x78, 0x9c, 0x23, 0xfe, 0x40, 0x23, 0x03, 0x9b, + 0x43, 0x1a, 0x60, 0x0a, 0x68, 0x3b, 0x18, 0xc3, + 0x78, 0xdb, 0x01, 0xdb, 0x43, 0x1a, 0x60, 0x0a, + 0x68, 0x3b, 0x18, 0xc0, 0x79, 0x00, 0x23, 0xfe, + 0x40, 0x18, 0x08, 0x40, 0x43, 0x10, 0x60, 0x08, + 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x44, 0xb5, 0xb0, 0xb0, 0x83, + 0x48, 0x43, 0x49, 0x44, 0x8d, 0xc9, 0x4c, 0x44, + 0x63, 0xe1, 0x29, 0x06, 0xda, 0x03, 0xb0, 0x03, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x01, + 0x09, 0x09, 0x01, 0x09, 0x23, 0xff, 0x33, 0xe1, + 0x42, 0x99, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04, + 0xaa, 0x03, 0xab, 0x02, 0x49, 0x39, 0xf7, 0xff, + 0xff, 0x6f, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, - 0x49, 0x35, 0xf7, 0xff, 0xff, 0x6f, 0xb0, 0x01, - 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, - 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, 0x99, 0x01, - 0x18, 0x40, 0x6b, 0xe1, 0x42, 0x88, 0xd0, 0x03, + 0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x6b, 0xe1, + 0x42, 0x88, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x00, 0x4f, 0x30, + 0x28, 0x00, 0xd0, 0x2e, 0x6e, 0x38, 0x6d, 0xb9, + 0x18, 0x40, 0x23, 0x01, 0x06, 0x1b, 0x66, 0x38, + 0x42, 0x98, 0xdb, 0x04, 0x43, 0xdb, 0x18, 0xc0, + 0x66, 0x38, 0x1e, 0x48, 0x65, 0xb8, 0x23, 0x0d, + 0x06, 0x9b, 0x6d, 0xb8, 0x6c, 0xb9, 0x1a, 0xc9, + 0x60, 0x08, 0x6e, 0xe0, 0x6c, 0xb9, 0x1a, 0xc9, + 0x60, 0x48, 0x20, 0x00, 0x65, 0xb8, 0x6c, 0xb8, + 0x30, 0x08, 0x23, 0x05, 0x02, 0x5b, 0x64, 0xb8, + 0x42, 0x98, 0xd1, 0x02, 0x20, 0x01, 0x02, 0xc0, + 0x64, 0xb8, 0x6c, 0xb8, 0x49, 0x1d, 0x61, 0x48, + 0x6d, 0x78, 0x28, 0x04, 0xd1, 0x05, 0x68, 0xe0, + 0x28, 0x00, 0xd1, 0x02, 0x6e, 0xe0, 0xf7, 0xff, + 0xfe, 0xef, 0x24, 0x33, 0x06, 0x64, 0x00, 0x63, + 0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, 0x6d, 0x60, + 0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, 0x98, 0x03, + 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x2b, + 0xf0, 0x00, 0xfc, 0x52, 0xb0, 0x01, 0x6d, 0xb8, + 0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, 0x48, 0x0e, + 0x68, 0x02, 0x18, 0x51, 0x60, 0x01, 0x6e, 0x60, + 0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, 0x48, 0x0a, + 0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, 0x60, 0x01, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x98, 0x00, 0x4f, 0x2c, 0x28, 0x00, 0xd0, 0x25, - 0x6e, 0x38, 0x6d, 0xb9, 0x18, 0x40, 0x23, 0x01, - 0x06, 0x1b, 0x66, 0x38, 0x42, 0x98, 0xdb, 0x04, - 0x43, 0xdb, 0x18, 0xc0, 0x66, 0x38, 0x1e, 0x48, - 0x65, 0xb8, 0x23, 0x0d, 0x06, 0x9b, 0x6d, 0xb8, - 0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x08, 0x6e, 0xe0, - 0x6c, 0xb9, 0x1a, 0xc9, 0x60, 0x48, 0x20, 0x00, - 0x65, 0xb8, 0x6c, 0xb8, 0x30, 0x08, 0x23, 0x05, - 0x02, 0x5b, 0x64, 0xb8, 0x42, 0x98, 0xd1, 0x02, - 0x20, 0x01, 0x02, 0xc0, 0x64, 0xb8, 0x6c, 0xb8, - 0x49, 0x19, 0x61, 0x48, 0x24, 0x33, 0x06, 0x64, - 0x00, 0x63, 0x6d, 0xa0, 0x18, 0xc2, 0xb4, 0x04, - 0x6d, 0x60, 0x18, 0xc5, 0x6e, 0x60, 0x18, 0xc1, - 0x98, 0x03, 0x4b, 0x0e, 0x18, 0xc0, 0x9a, 0x02, - 0x1c, 0x2b, 0xf0, 0x00, 0xfc, 0x53, 0xb0, 0x01, - 0x6d, 0xb8, 0x99, 0x01, 0x18, 0x40, 0x65, 0xb8, - 0x48, 0x0e, 0x68, 0x02, 0x18, 0x51, 0x60, 0x01, - 0x6e, 0x60, 0x6d, 0xa1, 0x42, 0x88, 0xdb, 0x04, - 0x48, 0x0a, 0x68, 0x01, 0x6a, 0x7a, 0x1a, 0x89, - 0x60, 0x01, 0xb0, 0x03, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, - 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x04, 0xcc, - 0x2e, 0x08, 0x05, 0x38, 0x2e, 0x08, 0x04, 0x4c, - 0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x64, - 0xb5, 0xf0, 0xb0, 0x83, 0x4e, 0x65, 0x25, 0x00, - 0x4f, 0x65, 0x6a, 0xf8, 0xf7, 0xff, 0xf8, 0xca, - 0x48, 0x64, 0x8d, 0xc0, 0x63, 0xf8, 0x28, 0x0a, - 0xda, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x68, 0x34, 0x09, 0x60, 0x01, 0x40, - 0x23, 0xff, 0x33, 0xc1, 0x42, 0x98, 0xd0, 0x07, - 0x23, 0xff, 0x33, 0xbe, 0x42, 0x9c, 0xd0, 0x03, - 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x46, 0x6a, 0xb4, 0x04, 0xaa, 0x03, 0xab, 0x02, - 0x49, 0x57, 0x1c, 0x30, 0xf7, 0xff, 0xfe, 0xd6, - 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, - 0x99, 0x01, 0x18, 0x41, 0x6b, 0xfa, 0x42, 0x91, + 0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x04, 0xc4, 0x2e, 0x08, 0x05, 0x30, + 0x2e, 0x08, 0x04, 0x44, 0xcc, 0x00, 0x0f, 0x00, + 0x66, 0x00, 0x00, 0x64, 0xb5, 0xf0, 0xb0, 0x83, + 0x4e, 0x65, 0x25, 0x00, 0x4f, 0x65, 0x6a, 0xf8, + 0xf7, 0xff, 0xf8, 0xc2, 0x48, 0x64, 0x8d, 0xc0, + 0x63, 0xf8, 0x28, 0x0a, 0xda, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x34, + 0x09, 0x60, 0x01, 0x40, 0x23, 0xff, 0x33, 0xc1, + 0x42, 0x98, 0xd0, 0x07, 0x23, 0xff, 0x33, 0xbe, + 0x42, 0x9c, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x46, 0x6a, 0xb4, 0x04, + 0xaa, 0x03, 0xab, 0x02, 0x49, 0x57, 0x1c, 0x30, + 0xf7, 0xff, 0xfe, 0xce, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x21, 0x01, 0x1c, 0x22, 0x4c, 0x4d, - 0x23, 0xff, 0x33, 0xbe, 0x42, 0x9a, 0xd1, 0x3c, - 0x5c, 0x30, 0x28, 0xa0, 0xd0, 0x03, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe0, - 0x28, 0x00, 0xd1, 0x1b, 0x20, 0x02, 0x63, 0x78, - 0x60, 0xe1, 0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, - 0xfa, 0x75, 0x20, 0x00, 0xf7, 0xfb, 0xfe, 0x0a, - 0x98, 0x02, 0x4b, 0x3c, 0x18, 0xc0, 0x79, 0x40, - 0x23, 0x30, 0x40, 0x18, 0x66, 0xb8, 0xd0, 0x16, - 0x28, 0x10, 0xd0, 0x14, 0x28, 0x20, 0xd0, 0x17, - 0x28, 0x30, 0xd1, 0x03, 0x21, 0x20, 0x20, 0x1e, - 0xf0, 0x09, 0xfd, 0x8f, 0x98, 0x00, 0x28, 0x00, - 0xd0, 0x2b, 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x28, - 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x25, 0x6f, 0x38, - 0xf7, 0xff, 0xfe, 0x08, 0xe0, 0x21, 0x21, 0x02, - 0x20, 0x1e, 0xf0, 0x09, 0xfd, 0x7e, 0xe7, 0xed, - 0x21, 0x08, 0x20, 0x1e, 0xf0, 0x09, 0xfd, 0x79, - 0xe7, 0xe8, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x08, - 0x20, 0x00, 0x63, 0x79, 0x21, 0x00, 0x60, 0xe0, - 0xf0, 0x09, 0xfa, 0x40, 0x20, 0x02, 0xf0, 0x09, - 0xfa, 0x93, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x08, - 0x6d, 0x60, 0x28, 0x05, 0xd1, 0x05, 0x68, 0xf8, - 0x28, 0x00, 0xd1, 0x02, 0x6f, 0x38, 0xf7, 0xff, - 0xfe, 0x2d, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, - 0x98, 0x02, 0x1d, 0xc5, 0x6b, 0xf8, 0x1b, 0x42, - 0x63, 0xfa, 0x7e, 0x39, 0x69, 0x78, 0x18, 0x41, - 0x4b, 0x16, 0x18, 0xe8, 0xf7, 0xfb, 0xfb, 0xb0, - 0x7e, 0x38, 0x6b, 0xf9, 0x18, 0x40, 0x07, 0x81, - 0x0f, 0x89, 0x76, 0x39, 0x1a, 0x44, 0x20, 0x01, - 0x06, 0x00, 0x49, 0x15, 0x60, 0x08, 0xf0, 0x17, - 0xfb, 0x1d, 0x4b, 0x14, 0x40, 0x18, 0xf0, 0x17, - 0xfb, 0x1d, 0x22, 0x04, 0x49, 0x10, 0xb4, 0x06, - 0x23, 0x12, 0x21, 0x1e, 0x69, 0x78, 0x1c, 0x22, - 0xf0, 0x0e, 0xf8, 0x4e, 0xb0, 0x02, 0xf0, 0x17, - 0xfb, 0x0d, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x18, - 0xf0, 0x17, 0xfb, 0x0c, 0x69, 0x78, 0x59, 0x01, - 0x60, 0x01, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, - 0x2e, 0x08, 0x04, 0xcc, 0x2c, 0x00, 0x1f, 0xc0, - 0x2e, 0x08, 0x05, 0x3c, 0x2e, 0x08, 0x04, 0x4c, - 0x9e, 0x00, 0x08, 0x00, 0xff, 0xfb, 0xff, 0xff, - 0x20, 0x33, 0x06, 0x40, 0x6e, 0x81, 0x6e, 0x40, - 0x1a, 0x09, 0x48, 0x0f, 0x63, 0xc1, 0x29, 0x00, - 0xdc, 0x04, 0x1f, 0xc2, 0x3a, 0x79, 0x6a, 0x52, - 0x18, 0x89, 0x63, 0xc1, 0x6b, 0xc1, 0x08, 0x89, - 0x00, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x63, 0xc1, - 0x42, 0x99, 0xdd, 0x0b, 0x4a, 0x07, 0x42, 0x91, - 0xdd, 0x00, 0x63, 0xc2, 0x4a, 0x06, 0x49, 0x07, - 0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, - 0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x04, 0xcc, 0x00, 0x00, 0xff, 0xff, - 0x00, 0x00, 0x02, 0x06, 0x2c, 0x00, 0x1f, 0xc0, - 0x48, 0x0f, 0x78, 0x01, 0x29, 0x00, 0xd0, 0x1a, - 0x49, 0x0e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x51, - 0x63, 0xc1, 0x1c, 0x0a, 0x29, 0x00, 0xdc, 0x04, - 0x1f, 0xc1, 0x39, 0x79, 0x69, 0x09, 0x18, 0x51, - 0x63, 0xc1, 0x23, 0x01, 0x03, 0x1b, 0x6b, 0xc1, - 0x42, 0x99, 0xdb, 0x08, 0x22, 0xff, 0x32, 0x07, - 0x49, 0x05, 0x85, 0x8a, 0x6b, 0xc0, 0x85, 0xc8, - 0x20, 0x09, 0x02, 0x40, 0x86, 0xc8, 0x47, 0x70, - 0x2e, 0x08, 0x04, 0xcc, 0x66, 0x00, 0x00, 0x80, - 0x2c, 0x00, 0x1f, 0xc0, 0xb4, 0x80, 0x20, 0x00, - 0x49, 0x1e, 0x6c, 0x8a, 0x6c, 0xc9, 0x1a, 0x52, - 0x49, 0x1d, 0x2a, 0x00, 0xdc, 0x01, 0x69, 0x0b, - 0x18, 0xd2, 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9a, - 0xdd, 0x00, 0x08, 0xd8, 0x22, 0x33, 0x06, 0x52, - 0x6e, 0x93, 0x6e, 0x52, 0x1a, 0x9a, 0x2a, 0x00, - 0xdc, 0x01, 0x6a, 0x4b, 0x18, 0xd2, 0x08, 0x92, - 0x00, 0x92, 0x4b, 0x14, 0x68, 0xdb, 0x2b, 0x00, - 0xd0, 0x06, 0x23, 0x01, 0x03, 0x1b, 0x6a, 0x4f, - 0x18, 0xfb, 0x6a, 0x89, 0x1a, 0x59, 0xe0, 0x01, - 0x21, 0x01, 0x03, 0x09, 0x42, 0x8a, 0xdd, 0x04, - 0x04, 0x00, 0x0c, 0x00, 0x23, 0x01, 0x02, 0x5b, - 0x43, 0x18, 0x28, 0x00, 0xd0, 0x0b, 0x4b, 0x0a, - 0x42, 0x9a, 0xdd, 0x00, 0x1c, 0x1a, 0x21, 0x06, - 0x43, 0x01, 0x48, 0x08, 0x85, 0x81, 0x85, 0xc2, - 0x21, 0x09, 0x02, 0x49, 0x86, 0xc1, 0xbc, 0x80, - 0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, - 0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, - 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x1f, 0xc0, - 0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x13, - 0x6d, 0x39, 0x29, 0x00, 0xd1, 0x10, 0x24, 0x01, - 0x28, 0x01, 0xd0, 0x10, 0x28, 0x04, 0xd0, 0x15, - 0x28, 0x05, 0xd1, 0x09, 0xf7, 0xff, 0xf8, 0x50, - 0xf7, 0xff, 0xf8, 0x04, 0x20, 0x00, 0x66, 0xf8, - 0x67, 0x38, 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, - 0xff, 0xf9, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x3c, - 0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, - 0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x4f, 0x23, - 0x6d, 0x39, 0x29, 0x00, 0xd0, 0x0e, 0x29, 0x02, - 0xd1, 0x09, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x34, - 0x28, 0x04, 0xd0, 0x27, 0x28, 0x05, 0xd1, 0x02, - 0x20, 0xff, 0xf7, 0xff, 0xf8, 0xcf, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x24, 0x02, 0x28, 0x01, - 0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x12, 0x28, 0x05, - 0xd1, 0xf5, 0x20, 0x00, 0xf7, 0xff, 0xf8, 0xc2, - 0x20, 0x05, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x40, - 0x20, 0x01, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xf8, 0x78, - 0x20, 0x04, 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, - 0xf0, 0x0b, 0xfc, 0xd8, 0x21, 0x00, 0x20, 0x0d, - 0xf0, 0x0b, 0xfc, 0xd4, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x20, 0x02, 0xf0, 0x09, 0xf9, 0x34, - 0x20, 0xff, 0x49, 0x03, 0x70, 0x08, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x4c, - 0x2e, 0x08, 0x04, 0xcc, 0xb5, 0xf0, 0x4f, 0x2b, - 0x24, 0x00, 0x6d, 0x38, 0x28, 0x01, 0xd0, 0x1e, - 0x28, 0x02, 0xd1, 0x19, 0x26, 0x03, 0x6d, 0x78, - 0x1d, 0xfd, 0x35, 0x79, 0x28, 0x01, 0xd0, 0x34, - 0x28, 0x04, 0xd0, 0x3f, 0x28, 0x05, 0xd1, 0x0f, - 0x20, 0x02, 0x63, 0x6c, 0xf0, 0x09, 0xf9, 0x14, - 0x20, 0x00, 0xf7, 0xfb, 0xfc, 0x53, 0xf7, 0xff, - 0xf8, 0x29, 0x65, 0x3e, 0x20, 0x00, 0x65, 0x78, - 0xf7, 0xfe, 0xfe, 0xc0, 0x20, 0x01, 0x61, 0xe8, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x78, - 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04, 0xd0, 0x11, - 0x28, 0x05, 0xd1, 0xf5, 0xf7, 0xfe, 0xff, 0x8a, - 0xf7, 0xfe, 0xff, 0xe0, 0x65, 0x3c, 0x65, 0x7c, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, - 0xff, 0x81, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xd2, + 0x47, 0x18, 0x98, 0x02, 0x99, 0x01, 0x18, 0x41, + 0x6b, 0xfa, 0x42, 0x91, 0xd0, 0x03, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, + 0x1c, 0x22, 0x4c, 0x4d, 0x23, 0xff, 0x33, 0xbe, + 0x42, 0x9a, 0xd1, 0x3c, 0x5c, 0x30, 0x28, 0xa0, + 0xd0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xe0, 0x28, 0x00, 0xd1, 0x1b, + 0x20, 0x02, 0x63, 0x78, 0x60, 0xe1, 0x21, 0x00, + 0x20, 0x00, 0xf0, 0x09, 0xfd, 0x8d, 0x20, 0x00, + 0xf7, 0xfb, 0xfd, 0xd4, 0x98, 0x02, 0x4b, 0x3c, + 0x18, 0xc0, 0x79, 0x40, 0x23, 0x30, 0x40, 0x18, + 0x66, 0xb8, 0xd0, 0x16, 0x28, 0x10, 0xd0, 0x14, + 0x28, 0x20, 0xd0, 0x17, 0x28, 0x30, 0xd1, 0x03, + 0x21, 0x20, 0x20, 0x1e, 0xf0, 0x0a, 0xf8, 0xa7, + 0x98, 0x00, 0x28, 0x00, 0xd0, 0x2b, 0x6d, 0x60, + 0x28, 0x05, 0xd1, 0x28, 0x68, 0xf8, 0x28, 0x00, + 0xd1, 0x25, 0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x00, + 0xe0, 0x21, 0x21, 0x02, 0x20, 0x1e, 0xf0, 0x0a, + 0xf8, 0x96, 0xe7, 0xed, 0x21, 0x08, 0x20, 0x1e, + 0xf0, 0x0a, 0xf8, 0x91, 0xe7, 0xe8, 0x68, 0xe0, + 0x28, 0x00, 0xd0, 0x08, 0x20, 0x00, 0x63, 0x79, + 0x21, 0x00, 0x60, 0xe0, 0xf0, 0x09, 0xfd, 0x58, + 0x20, 0x02, 0xf0, 0x09, 0xfd, 0xab, 0x98, 0x00, + 0x28, 0x00, 0xd0, 0x08, 0x6d, 0x60, 0x28, 0x05, + 0xd1, 0x05, 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x02, + 0x6f, 0x38, 0xf7, 0xff, 0xfe, 0x25, 0x68, 0xe0, + 0x28, 0x00, 0xd0, 0x01, 0x98, 0x02, 0x1d, 0xc5, + 0x6b, 0xf8, 0x1b, 0x42, 0x63, 0xfa, 0x7e, 0x39, + 0x69, 0x78, 0x18, 0x41, 0x4b, 0x16, 0x18, 0xe8, + 0xf7, 0xfb, 0xfb, 0x3a, 0x7e, 0x38, 0x6b, 0xf9, + 0x18, 0x40, 0x07, 0x81, 0x0f, 0x89, 0x76, 0x39, + 0x1a, 0x44, 0x20, 0x01, 0x06, 0x00, 0x49, 0x15, + 0x60, 0x08, 0xf0, 0x17, 0xfe, 0x57, 0x4b, 0x14, + 0x40, 0x18, 0xf0, 0x17, 0xfe, 0x57, 0x22, 0x04, + 0x49, 0x10, 0xb4, 0x06, 0x23, 0x12, 0x21, 0x1e, + 0x69, 0x78, 0x1c, 0x22, 0xf0, 0x0e, 0xfb, 0x66, + 0xb0, 0x02, 0xf0, 0x17, 0xfe, 0x47, 0x23, 0x01, + 0x04, 0x9b, 0x43, 0x18, 0xf0, 0x17, 0xfe, 0x46, + 0x69, 0x78, 0x59, 0x01, 0x60, 0x01, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2c, 0x00, 0x12, 0x00, 0x2e, 0x08, 0x04, 0xc4, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x34, + 0x2e, 0x08, 0x04, 0x44, 0x9e, 0x00, 0x08, 0x00, + 0xff, 0xfb, 0xff, 0xff, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x81, 0x6e, 0x40, 0x1a, 0x09, 0x48, 0x0f, + 0x63, 0xc1, 0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc2, + 0x3a, 0x79, 0x6a, 0x52, 0x18, 0x89, 0x63, 0xc1, + 0x6b, 0xc1, 0x08, 0x89, 0x00, 0x89, 0x23, 0x01, + 0x02, 0xdb, 0x63, 0xc1, 0x42, 0x99, 0xdd, 0x0b, + 0x4a, 0x07, 0x42, 0x91, 0xdd, 0x00, 0x63, 0xc2, + 0x4a, 0x06, 0x49, 0x07, 0x85, 0x8a, 0x6b, 0xc0, + 0x85, 0xc8, 0x20, 0x09, 0x02, 0x40, 0x86, 0xc8, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x02, 0x06, + 0x2c, 0x00, 0x1f, 0xc0, 0x48, 0x0f, 0x78, 0x01, + 0x29, 0x00, 0xd0, 0x1a, 0x49, 0x0e, 0x6c, 0x8a, + 0x6c, 0xc9, 0x1a, 0x51, 0x63, 0xc1, 0x1c, 0x0a, + 0x29, 0x00, 0xdc, 0x04, 0x1f, 0xc1, 0x39, 0x79, + 0x69, 0x09, 0x18, 0x51, 0x63, 0xc1, 0x23, 0x01, + 0x03, 0x1b, 0x6b, 0xc1, 0x42, 0x99, 0xdb, 0x08, + 0x22, 0xff, 0x32, 0x07, 0x49, 0x05, 0x85, 0x8a, + 0x6b, 0xc0, 0x85, 0xc8, 0x20, 0x09, 0x02, 0x40, + 0x86, 0xc8, 0x47, 0x70, 0x2e, 0x08, 0x04, 0xc4, + 0x66, 0x00, 0x00, 0x80, 0x2c, 0x00, 0x1f, 0xc0, + 0xb4, 0x80, 0x20, 0x00, 0x49, 0x1e, 0x6c, 0x8a, + 0x6c, 0xc9, 0x1a, 0x52, 0x49, 0x1d, 0x2a, 0x00, + 0xdc, 0x01, 0x69, 0x0b, 0x18, 0xd2, 0x23, 0x01, + 0x02, 0xdb, 0x42, 0x9a, 0xdd, 0x00, 0x08, 0xd8, + 0x22, 0x33, 0x06, 0x52, 0x6e, 0x93, 0x6e, 0x52, + 0x1a, 0x9a, 0x2a, 0x00, 0xdc, 0x01, 0x6a, 0x4b, + 0x18, 0xd2, 0x08, 0x92, 0x00, 0x92, 0x4b, 0x14, + 0x68, 0xdb, 0x2b, 0x00, 0xd0, 0x06, 0x23, 0x01, + 0x03, 0x1b, 0x6a, 0x4f, 0x18, 0xfb, 0x6a, 0x89, + 0x1a, 0x59, 0xe0, 0x01, 0x21, 0x01, 0x03, 0x09, + 0x42, 0x8a, 0xdd, 0x04, 0x04, 0x00, 0x0c, 0x00, + 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, 0x28, 0x00, + 0xd0, 0x0b, 0x4b, 0x0a, 0x42, 0x9a, 0xdd, 0x00, + 0x1c, 0x1a, 0x21, 0x06, 0x43, 0x01, 0x48, 0x08, + 0x85, 0x81, 0x85, 0xc2, 0x21, 0x09, 0x02, 0x49, + 0x86, 0xc1, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x04, 0x44, + 0x2e, 0x08, 0x04, 0xc4, 0x00, 0x00, 0xff, 0xff, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x4f, 0x13, 0x6d, 0x39, 0x29, 0x00, + 0xd1, 0x10, 0x24, 0x01, 0x28, 0x01, 0xd0, 0x10, + 0x28, 0x04, 0xd0, 0x15, 0x28, 0x05, 0xd1, 0x09, + 0xf7, 0xff, 0xf8, 0x48, 0xf7, 0xfe, 0xff, 0xfc, + 0x20, 0x00, 0x66, 0xf8, 0x67, 0x38, 0x20, 0x05, + 0x65, 0x78, 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf1, 0x65, 0x3c, + 0x65, 0x7c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xf7, 0xff, 0xf8, 0x34, 0x20, 0x04, 0x65, 0x78, + 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x4f, 0x23, 0x6d, 0x39, 0x29, 0x00, + 0xd0, 0x0e, 0x29, 0x02, 0xd1, 0x09, 0x6d, 0x78, + 0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x27, + 0x28, 0x05, 0xd1, 0x02, 0x20, 0xff, 0xf7, 0xff, + 0xf8, 0xc7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x24, 0x02, 0x28, 0x01, 0xd0, 0x0c, 0x28, 0x04, + 0xd0, 0x12, 0x28, 0x05, 0xd1, 0xf5, 0x20, 0x00, + 0xf7, 0xff, 0xf8, 0xba, 0x20, 0x05, 0x65, 0x78, + 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xf7, 0xff, 0xf8, 0x38, 0x20, 0x01, 0x65, 0x78, + 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xf7, 0xff, 0xf8, 0x70, 0x20, 0x04, 0x65, 0x78, + 0x65, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0xf0, + 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0xec, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x02, + 0xf0, 0x09, 0xfc, 0x4c, 0x20, 0xff, 0x49, 0x03, + 0x70, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x04, 0x44, 0x2e, 0x08, 0x04, 0xc4, + 0xb5, 0xf0, 0x4f, 0x2b, 0x24, 0x00, 0x6d, 0x38, + 0x28, 0x01, 0xd0, 0x1e, 0x28, 0x02, 0xd1, 0x19, + 0x26, 0x03, 0x6d, 0x78, 0x1d, 0xfd, 0x35, 0x79, + 0x28, 0x01, 0xd0, 0x34, 0x28, 0x04, 0xd0, 0x3f, + 0x28, 0x05, 0xd1, 0x0f, 0x20, 0x02, 0x63, 0x6c, + 0xf0, 0x09, 0xfc, 0x2c, 0x20, 0x00, 0xf7, 0xfb, + 0xfc, 0x1d, 0xf7, 0xff, 0xf8, 0x21, 0x65, 0x3e, + 0x20, 0x00, 0x65, 0x78, 0xf7, 0xfe, 0xfe, 0xb8, + 0x20, 0x01, 0x61, 0xe8, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x0c, + 0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0xf5, + 0xf7, 0xfe, 0xff, 0x82, 0xf7, 0xfe, 0xff, 0xd8, 0x65, 0x3c, 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x63, 0x6c, 0x20, 0x02, 0x60, 0xfc, - 0xf0, 0x09, 0xf8, 0xe2, 0x20, 0x00, 0xf7, 0xfb, - 0xfc, 0x21, 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xfe, 0xff, 0xf2, - 0x65, 0x7c, 0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, - 0xb5, 0x90, 0x4c, 0x1b, 0x68, 0xe0, 0x28, 0x03, - 0xd0, 0x1f, 0x1f, 0xe7, 0x3f, 0x79, 0x6d, 0x38, - 0x28, 0x02, 0xd1, 0x1a, 0x6d, 0x78, 0x28, 0x01, - 0xd0, 0x1a, 0x28, 0x04, 0xd0, 0x20, 0x28, 0x05, - 0xd1, 0x13, 0x4a, 0x14, 0x49, 0x14, 0x48, 0x15, - 0xf7, 0xfe, 0xfe, 0x52, 0x21, 0x00, 0x20, 0x0e, - 0xf0, 0x0b, 0xfc, 0x50, 0x20, 0x01, 0xf0, 0x09, - 0xf8, 0xb3, 0x20, 0x03, 0x60, 0xe0, 0x68, 0xf8, - 0x28, 0x00, 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x09, - 0xf8, 0xab, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x01, 0xf0, 0x09, 0xf8, 0xa5, 0x20, 0x00, - 0x70, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x21, 0x00, 0x20, 0x0b, 0xf0, 0x0b, 0xfc, 0x36, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x04, 0xcc, 0x2e, 0x08, 0x05, 0x58, - 0x2e, 0x08, 0x05, 0x50, 0x2e, 0x08, 0x05, 0x54, - 0xb5, 0xf0, 0x4c, 0x21, 0x6d, 0x20, 0x28, 0x02, - 0xd1, 0x24, 0x26, 0xff, 0x6d, 0x60, 0x1d, 0xe7, - 0x37, 0x79, 0x28, 0x01, 0xd0, 0x1d, 0x28, 0x04, - 0xd0, 0x1f, 0x28, 0x05, 0xd1, 0x1a, 0x20, 0x01, - 0xf0, 0x09, 0xf8, 0x7e, 0x25, 0x00, 0x68, 0xe0, - 0x28, 0x00, 0xd0, 0x04, 0x21, 0x00, 0x20, 0x00, - 0xf0, 0x09, 0xf8, 0x20, 0x60, 0xe5, 0x70, 0x3e, - 0x68, 0xf8, 0x28, 0x03, 0xd1, 0x14, 0x48, 0x13, - 0x22, 0x00, 0x68, 0x41, 0x20, 0x00, 0xf7, 0xfe, - 0xfd, 0xed, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x1e, - 0xe0, 0x0f, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, - 0xfb, 0xf9, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x01, 0x61, 0xf8, 0x6b, 0x38, 0xf7, 0xfe, - 0xfe, 0x0d, 0x20, 0x02, 0x60, 0xfd, 0xf0, 0x09, - 0xf8, 0x53, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, - 0xfb, 0xe9, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x05, 0x4c, - 0xb5, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x2f, 0x01, - 0xda, 0x00, 0x27, 0x01, 0x2f, 0x3f, 0xdd, 0x00, - 0x27, 0x3f, 0x48, 0x17, 0x6d, 0x01, 0x29, 0x02, - 0xd1, 0x13, 0x6d, 0x40, 0x25, 0x02, 0x4c, 0x15, - 0x28, 0x04, 0xd0, 0x11, 0x28, 0x05, 0xd1, 0x0c, - 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xfb, 0xca, - 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xfb, 0xc6, - 0x20, 0x22, 0x1c, 0x39, 0xf0, 0x0b, 0xfb, 0xc2, - 0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xfb, 0xba, - 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, 0xfb, 0xb6, - 0x20, 0x22, 0x1c, 0x39, 0xf0, 0x0b, 0xfb, 0xb2, - 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xcb, 0x60, 0xe5, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, - 0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, - 0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, - 0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x16, - 0xf0, 0x0b, 0xfb, 0x98, 0x20, 0x00, 0xf7, 0xfe, - 0xfd, 0xb1, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, - 0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, - 0xb5, 0x00, 0x48, 0x0b, 0x6d, 0x01, 0x29, 0x02, - 0xd1, 0x10, 0x6d, 0x40, 0x28, 0x04, 0xd0, 0x01, - 0x28, 0x05, 0xd1, 0x0b, 0x21, 0x00, 0x20, 0x1a, - 0xf0, 0x0b, 0xfb, 0x7c, 0x20, 0x00, 0xf7, 0xfe, - 0xfd, 0x95, 0x21, 0x00, 0x48, 0x03, 0x70, 0x01, - 0x21, 0x01, 0x60, 0xc1, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x04, 0x4c, 0x2e, 0x08, 0x04, 0xcc, - 0x48, 0x03, 0x6d, 0x00, 0x28, 0x00, 0xd1, 0x00, - 0x47, 0x70, 0x20, 0xff, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x04, 0x4c, 0xb5, 0xf0, 0x1c, 0x04, - 0x1c, 0x0f, 0x4d, 0x52, 0x6d, 0x29, 0x48, 0x52, - 0x26, 0x00, 0x29, 0x01, 0xd0, 0x4c, 0x29, 0x02, - 0xd1, 0x6e, 0x6d, 0x69, 0x29, 0x01, 0xd0, 0x20, - 0x29, 0x04, 0xd0, 0x2e, 0x29, 0x05, 0xd1, 0x3e, - 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, - 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, - 0x69, 0x28, 0xf0, 0x13, 0xf9, 0x03, 0x70, 0x20, - 0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, - 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, - 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, - 0xf8, 0xf5, 0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x6c, 0xc1, 0x6c, 0x80, 0x1a, 0x08, + 0x47, 0x18, 0xf7, 0xfe, 0xff, 0x79, 0x65, 0x3c, + 0x65, 0x7c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xf7, 0xfe, 0xff, 0xca, 0x65, 0x3c, 0x65, 0x7c, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x63, 0x6c, + 0x20, 0x02, 0x60, 0xfc, 0xf0, 0x09, 0xfb, 0xfa, + 0x20, 0x00, 0xf7, 0xfb, 0xfb, 0xeb, 0x65, 0x7c, + 0x65, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xf7, 0xfe, 0xff, 0xea, 0x65, 0x7c, 0x65, 0x3e, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x04, 0x44, 0xb5, 0x90, 0x4c, 0x1b, + 0x68, 0xe0, 0x28, 0x03, 0xd0, 0x1f, 0x1f, 0xe7, + 0x3f, 0x79, 0x6d, 0x38, 0x28, 0x02, 0xd1, 0x1a, + 0x6d, 0x78, 0x28, 0x01, 0xd0, 0x1a, 0x28, 0x04, + 0xd0, 0x20, 0x28, 0x05, 0xd1, 0x13, 0x4a, 0x14, + 0x49, 0x14, 0x48, 0x15, 0xf7, 0xfe, 0xfe, 0x4a, + 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x0b, 0xff, 0x68, + 0x20, 0x01, 0xf0, 0x09, 0xfb, 0xcb, 0x20, 0x03, + 0x60, 0xe0, 0x68, 0xf8, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0x01, 0xf0, 0x09, 0xfb, 0xc3, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0xf0, 0x09, + 0xfb, 0xbd, 0x20, 0x00, 0x70, 0x20, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0b, + 0xf0, 0x0b, 0xff, 0x4e, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, + 0x2e, 0x08, 0x05, 0x50, 0x2e, 0x08, 0x05, 0x48, + 0x2e, 0x08, 0x05, 0x4c, 0xb5, 0xf0, 0x4c, 0x21, + 0x6d, 0x20, 0x28, 0x02, 0xd1, 0x24, 0x26, 0xff, + 0x6d, 0x60, 0x1d, 0xe7, 0x37, 0x79, 0x28, 0x01, + 0xd0, 0x1d, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x05, + 0xd1, 0x1a, 0x20, 0x01, 0xf0, 0x09, 0xfb, 0x96, + 0x25, 0x00, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x04, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xfb, 0x38, + 0x60, 0xe5, 0x70, 0x3e, 0x68, 0xf8, 0x28, 0x03, + 0xd1, 0x14, 0x48, 0x13, 0x22, 0x00, 0x68, 0x41, + 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xe5, 0x6b, 0x38, + 0xf7, 0xfe, 0xfe, 0x16, 0xe0, 0x0f, 0x70, 0x3e, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x11, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x61, 0xf8, + 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x05, 0x20, 0x02, + 0x60, 0xfd, 0xf0, 0x09, 0xfb, 0x6b, 0x21, 0x00, + 0x20, 0x0d, 0xf0, 0x0b, 0xff, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, + 0x2e, 0x08, 0x05, 0x44, 0xb5, 0xb0, 0x04, 0x07, + 0x0c, 0x3f, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, + 0x2f, 0x3f, 0xdd, 0x00, 0x27, 0x3f, 0x48, 0x17, + 0x6d, 0x01, 0x29, 0x02, 0xd1, 0x13, 0x6d, 0x40, + 0x25, 0x02, 0x4c, 0x15, 0x28, 0x04, 0xd0, 0x11, + 0x28, 0x05, 0xd1, 0x0c, 0x21, 0x00, 0x20, 0x0e, + 0xf0, 0x0b, 0xfe, 0xe2, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x0b, 0xfe, 0xde, 0x20, 0x22, 0x1c, 0x39, + 0xf0, 0x0b, 0xfe, 0xda, 0x60, 0xe5, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x20, 0x0e, + 0xf0, 0x0b, 0xfe, 0xd2, 0x21, 0x00, 0x20, 0x0d, + 0xf0, 0x0b, 0xfe, 0xce, 0x20, 0x22, 0x1c, 0x39, + 0xf0, 0x0b, 0xfe, 0xca, 0x20, 0x00, 0xf7, 0xfe, + 0xfd, 0xc3, 0x60, 0xe5, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, + 0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b, + 0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40, + 0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b, + 0x21, 0x00, 0x20, 0x16, 0xf0, 0x0b, 0xfe, 0xb0, + 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0xa9, 0x21, 0x00, + 0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, + 0x2e, 0x08, 0x04, 0xc4, 0xb5, 0x00, 0x48, 0x0b, + 0x6d, 0x01, 0x29, 0x02, 0xd1, 0x10, 0x6d, 0x40, + 0x28, 0x04, 0xd0, 0x01, 0x28, 0x05, 0xd1, 0x0b, + 0x21, 0x00, 0x20, 0x1a, 0xf0, 0x0b, 0xfe, 0x94, + 0x20, 0x00, 0xf7, 0xfe, 0xfd, 0x8d, 0x21, 0x00, + 0x48, 0x03, 0x70, 0x01, 0x21, 0x01, 0x60, 0xc1, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x04, 0x44, + 0x2e, 0x08, 0x04, 0xc4, 0x48, 0x03, 0x6d, 0x00, + 0x28, 0x00, 0xd1, 0x00, 0x47, 0x70, 0x20, 0xff, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x44, + 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x52, + 0x6d, 0x29, 0x48, 0x52, 0x26, 0x00, 0x29, 0x01, + 0xd0, 0x4c, 0x29, 0x02, 0xd1, 0x6e, 0x6d, 0x69, + 0x29, 0x01, 0xd0, 0x20, 0x29, 0x04, 0xd0, 0x2e, + 0x29, 0x05, 0xd1, 0x3e, 0x6c, 0xc1, 0x6c, 0x80, + 0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, + 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, + 0xfc, 0x1b, 0x70, 0x20, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01, + 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, + 0x6a, 0x68, 0xf0, 0x13, 0xfc, 0x0d, 0x70, 0x38, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x6c, 0xc1, + 0x6c, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x69, 0x29, + 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, + 0xf0, 0x13, 0xfb, 0xfe, 0x70, 0x20, 0x70, 0x3e, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, + 0x06, 0x40, 0x6e, 0x41, 0x6e, 0x80, 0x1a, 0x08, + 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, + 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xec, + 0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x6d, 0x69, 0x29, 0x01, + 0xd0, 0x21, 0x29, 0x04, 0xd0, 0x2f, 0x29, 0x05, + 0xd1, 0x3f, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, - 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xf8, 0xe6, - 0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x41, - 0x6e, 0x80, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, + 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xfb, 0xd0, + 0x70, 0x20, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, + 0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, - 0xf0, 0x13, 0xf8, 0xd4, 0x70, 0x38, 0x70, 0x26, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, - 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x6d, 0x69, 0x29, 0x01, 0xd0, 0x21, 0x29, 0x04, - 0xd0, 0x2f, 0x29, 0x05, 0xd1, 0x3f, 0x69, 0x69, + 0xf0, 0x13, 0xfb, 0xc2, 0x70, 0x38, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x26, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x69, 0x28, - 0xf0, 0x13, 0xf8, 0xb8, 0x70, 0x20, 0x21, 0x33, + 0xf0, 0x13, 0xfb, 0xb2, 0x70, 0x20, 0x70, 0x3e, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, 0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, 0x18, 0x40, 0x21, 0x64, - 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xf8, 0xaa, - 0x70, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xe0, 0x26, 0x69, 0x69, 0x6c, 0xc0, 0x1a, 0x40, - 0xd5, 0x01, 0x69, 0x29, 0x18, 0x40, 0x21, 0x64, - 0x43, 0x41, 0x69, 0x28, 0xf0, 0x13, 0xf8, 0x9a, - 0x70, 0x20, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x21, 0x33, 0x06, 0x49, 0x6a, 0xe8, - 0x6e, 0x49, 0x1a, 0x08, 0xd5, 0x01, 0x6a, 0x69, - 0x18, 0x40, 0x21, 0x64, 0x43, 0x41, 0x6a, 0x68, - 0xf0, 0x13, 0xf8, 0x88, 0x70, 0x38, 0x70, 0x26, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, - 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0x4c, - 0x66, 0x00, 0x00, 0x80, 0xb5, 0xf0, 0x1c, 0x17, - 0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x0d, 0x21, 0x00, - 0x1c, 0x1c, 0x42, 0xba, 0xda, 0x03, 0x1c, 0x08, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x42, 0xa0, - 0xd3, 0x01, 0x42, 0xb0, 0xd9, 0x03, 0x1c, 0x08, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x19, 0xc1, - 0x42, 0xb1, 0xd9, 0x0c, 0x1a, 0x32, 0x4e, 0x0a, - 0x64, 0x32, 0x1c, 0x29, 0xf7, 0xfb, 0xf8, 0x38, - 0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x29, 0x1c, 0x20, - 0xf7, 0xfb, 0xf8, 0x32, 0xe0, 0x03, 0x1c, 0x29, - 0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x2d, 0x1c, 0x38, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x04, 0xcc, 0xb5, 0xf0, 0x1c, 0x17, - 0x9e, 0x05, 0x1a, 0xf2, 0x1c, 0x05, 0x20, 0x00, - 0x1c, 0x1c, 0x42, 0xba, 0xdb, 0x18, 0x42, 0xa1, - 0xd3, 0x16, 0x42, 0xb1, 0xd2, 0x14, 0x19, 0xc8, - 0x42, 0xb0, 0xd9, 0x0c, 0x1a, 0x72, 0x4e, 0x0a, - 0x64, 0x32, 0x1c, 0x28, 0xf7, 0xfb, 0xf8, 0x10, - 0x6c, 0x30, 0x1a, 0x3a, 0x18, 0x28, 0x1c, 0x21, - 0xf7, 0xfb, 0xf8, 0x0a, 0xe0, 0x03, 0x1c, 0x28, - 0x1c, 0x3a, 0xf7, 0xfb, 0xf8, 0x05, 0x1c, 0x38, + 0x43, 0x41, 0x6a, 0x68, 0xf0, 0x13, 0xfb, 0xa0, + 0x70, 0x38, 0x70, 0x26, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x70, 0x26, 0x70, 0x3e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x04, 0xcc, 0x47, 0x70, 0xb5, 0x00, - 0xb0, 0x82, 0x46, 0x6a, 0x49, 0x06, 0xa8, 0x01, - 0xf7, 0xfe, 0xfc, 0x56, 0x21, 0x00, 0x20, 0x0b, - 0xf0, 0x0b, 0xfa, 0x54, 0x20, 0x03, 0x49, 0x03, - 0x61, 0x88, 0xb0, 0x02, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x05, 0x68, 0x2e, 0x08, 0x05, 0x4c, - 0xb5, 0x80, 0x4f, 0x0b, 0x22, 0x00, 0x20, 0x00, - 0x69, 0xf9, 0xf7, 0xfe, 0xfc, 0x2b, 0x21, 0x00, - 0x20, 0x0d, 0xf0, 0x0b, 0xfa, 0x3f, 0x21, 0x01, - 0x1f, 0xf8, 0x38, 0x79, 0x61, 0xc1, 0x6b, 0x00, - 0xf7, 0xfe, 0xfc, 0x54, 0x20, 0x00, 0x61, 0xb8, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x05, 0x4c, 0xb5, 0x80, 0x4f, 0x06, - 0x68, 0x38, 0x1d, 0xc1, 0x31, 0xb5, 0x20, 0x2f, - 0x02, 0x80, 0xf0, 0x12, 0xff, 0xe3, 0x60, 0x39, + 0x2e, 0x08, 0x04, 0x44, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2, + 0x1c, 0x0d, 0x21, 0x00, 0x1c, 0x1c, 0x42, 0xba, + 0xda, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x42, 0xa0, 0xd3, 0x01, 0x42, 0xb0, + 0xd9, 0x03, 0x1c, 0x08, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x19, 0xc1, 0x42, 0xb1, 0xd9, 0x0c, + 0x1a, 0x32, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x29, + 0xf7, 0xfa, 0xff, 0xc2, 0x6c, 0x30, 0x1a, 0x3a, + 0x18, 0x29, 0x1c, 0x20, 0xf7, 0xfa, 0xff, 0xbc, + 0xe0, 0x03, 0x1c, 0x29, 0x1c, 0x3a, 0xf7, 0xfa, + 0xff, 0xb7, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, + 0xb5, 0xf0, 0x1c, 0x17, 0x9e, 0x05, 0x1a, 0xf2, + 0x1c, 0x05, 0x20, 0x00, 0x1c, 0x1c, 0x42, 0xba, + 0xdb, 0x18, 0x42, 0xa1, 0xd3, 0x16, 0x42, 0xb1, + 0xd2, 0x14, 0x19, 0xc8, 0x42, 0xb0, 0xd9, 0x0c, + 0x1a, 0x72, 0x4e, 0x0a, 0x64, 0x32, 0x1c, 0x28, + 0xf7, 0xfa, 0xff, 0x9a, 0x6c, 0x30, 0x1a, 0x3a, + 0x18, 0x28, 0x1c, 0x21, 0xf7, 0xfa, 0xff, 0x94, + 0xe0, 0x03, 0x1c, 0x28, 0x1c, 0x3a, 0xf7, 0xfa, + 0xff, 0x8f, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x04, 0xc4, + 0x47, 0x70, 0xb5, 0x00, 0xb0, 0x82, 0x46, 0x6a, + 0x49, 0x06, 0xa8, 0x01, 0xf7, 0xfe, 0xfc, 0x4e, + 0x21, 0x00, 0x20, 0x0b, 0xf0, 0x0b, 0xfd, 0x6c, + 0x20, 0x03, 0x49, 0x03, 0x61, 0x08, 0xb0, 0x02, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0x58, + 0x2e, 0x08, 0x05, 0x44, 0xb5, 0x80, 0x4f, 0x0b, + 0x22, 0x00, 0x20, 0x00, 0x69, 0x79, 0xf7, 0xfe, + 0xfc, 0x23, 0x21, 0x00, 0x20, 0x0d, 0xf0, 0x0b, + 0xfd, 0x57, 0x21, 0x01, 0x1f, 0xf8, 0x38, 0x79, + 0x61, 0xc1, 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x4c, + 0x20, 0x00, 0x61, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x44, + 0xb5, 0x80, 0x4f, 0x06, 0x68, 0x38, 0x1d, 0xc1, + 0x31, 0xb5, 0x20, 0x2f, 0x02, 0x80, 0xf0, 0x13, + 0xfa, 0xfb, 0x60, 0x39, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5c, 0x9c, + 0x48, 0x05, 0x8f, 0xc1, 0x29, 0x00, 0xd0, 0x05, + 0x21, 0x00, 0x87, 0xc1, 0x48, 0x03, 0x69, 0x01, + 0x31, 0x01, 0x61, 0x01, 0x47, 0x70, 0x00, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x05, 0x5c, + 0x20, 0x00, 0x49, 0x03, 0x60, 0x08, 0x48, 0x03, + 0x69, 0x41, 0x31, 0x01, 0x61, 0x41, 0x47, 0x70, + 0x2e, 0x08, 0x47, 0x50, 0x2e, 0x08, 0x05, 0x5c, + 0xb5, 0x00, 0xb0, 0x88, 0x46, 0x68, 0xf0, 0x0e, + 0xf8, 0xfd, 0x48, 0x07, 0x69, 0x81, 0x31, 0x01, + 0x23, 0x01, 0x22, 0x06, 0x61, 0x81, 0x21, 0x47, + 0x02, 0x49, 0x05, 0x48, 0xf0, 0x0d, 0xff, 0xea, + 0xb0, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0x5c, 0xb5, 0x80, 0x1c, 0x07, + 0x20, 0xff, 0x30, 0xcd, 0xb0, 0x85, 0x90, 0x00, + 0x20, 0x01, 0x02, 0x40, 0x90, 0x02, 0x48, 0x0e, + 0x90, 0x04, 0x20, 0x0e, 0xab, 0x03, 0x80, 0x18, + 0x46, 0x68, 0xf0, 0x0e, 0xf9, 0x0f, 0x2f, 0x00, + 0xd0, 0x0d, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc7, 0x98, 0x02, + 0x1e, 0x79, 0xf0, 0x00, 0xfb, 0x21, 0x98, 0x02, + 0x1a, 0x38, 0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x02, 0x55, 0x3c, 0x48, 0x05, 0x8f, 0xc1, - 0x29, 0x00, 0xd0, 0x05, 0x21, 0x00, 0x87, 0xc1, - 0x48, 0x03, 0x69, 0x01, 0x31, 0x01, 0x61, 0x01, - 0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, - 0x2e, 0x08, 0x05, 0x6c, 0x48, 0x03, 0x21, 0x00, - 0x60, 0x01, 0x48, 0x03, 0x69, 0x41, 0x31, 0x01, - 0x61, 0x41, 0x47, 0x70, 0x2e, 0x08, 0x47, 0x58, - 0x2e, 0x08, 0x05, 0x6c, 0xb5, 0x00, 0xb0, 0x88, - 0x46, 0x68, 0xf0, 0x0d, 0xfd, 0xe5, 0x48, 0x07, - 0x69, 0x81, 0x31, 0x01, 0x23, 0x01, 0x22, 0x06, - 0x61, 0x81, 0x21, 0x47, 0x02, 0x49, 0x05, 0x48, - 0xf0, 0x0d, 0xfc, 0xd2, 0xb0, 0x08, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x6c, - 0xb5, 0x90, 0x1c, 0x07, 0x20, 0xff, 0x30, 0xa5, - 0xb0, 0x85, 0x90, 0x00, 0x20, 0x01, 0x02, 0x40, - 0x90, 0x02, 0x48, 0x12, 0x90, 0x04, 0x20, 0x0e, - 0xab, 0x03, 0x80, 0x18, 0x46, 0x68, 0xf0, 0x0d, - 0xfd, 0xf7, 0x2f, 0x00, 0xd0, 0x16, 0x20, 0x33, - 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, - 0x1a, 0xc7, 0x98, 0x02, 0x1e, 0x79, 0xf0, 0x00, - 0xfb, 0x27, 0x4c, 0x09, 0x68, 0x20, 0x28, 0x00, - 0xd1, 0x04, 0x20, 0xa5, 0x01, 0xc0, 0xf0, 0x00, - 0xfb, 0x2d, 0x60, 0x20, 0x98, 0x02, 0x1a, 0x38, - 0x49, 0x04, 0x60, 0x88, 0xb0, 0x05, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x1c, 0x00, 0x00, - 0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x6c, + 0x2e, 0x1c, 0x00, 0x00, 0x2e, 0x08, 0x05, 0x5c, 0xb5, 0x00, 0x22, 0x01, 0x21, 0x01, 0x20, 0x00, - 0xf0, 0x09, 0xfa, 0x54, 0x48, 0x04, 0x68, 0x00, + 0xf0, 0x09, 0xfd, 0x76, 0x48, 0x04, 0x68, 0x00, 0x78, 0x01, 0x23, 0x06, 0x43, 0x19, 0x70, 0x01, - 0xf0, 0x00, 0xf9, 0xe0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x5e, 0x60, 0xb5, 0xf0, 0x48, 0x51, - 0x4e, 0x51, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x51, - 0x86, 0xe7, 0x86, 0xa7, 0x48, 0x50, 0x60, 0x07, - 0xf0, 0x05, 0xf9, 0x54, 0x48, 0x4f, 0xf0, 0x0e, - 0xfa, 0x01, 0xf7, 0xfa, 0xfe, 0xdd, 0x21, 0xff, - 0x48, 0x4d, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, + 0xf0, 0x00, 0xf9, 0xe4, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x5e, 0x58, 0xb5, 0xf0, 0x48, 0x53, + 0x4e, 0x53, 0x80, 0x30, 0x27, 0x00, 0x4c, 0x53, + 0x86, 0xe7, 0x86, 0xa7, 0x48, 0x52, 0x60, 0x07, + 0xf0, 0x05, 0xfc, 0x76, 0x48, 0x51, 0xf0, 0x0e, + 0xfd, 0x23, 0xf7, 0xfa, 0xfe, 0x71, 0x21, 0xff, + 0x48, 0x4f, 0x60, 0x01, 0x68, 0x01, 0x29, 0x00, 0xd0, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, - 0x4a, 0x4a, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, - 0xfb, 0x17, 0x20, 0x01, 0xf7, 0xff, 0xff, 0x98, - 0x21, 0x00, 0x20, 0x00, 0xf0, 0x08, 0xfd, 0x92, - 0xf0, 0x01, 0xfa, 0xa6, 0x48, 0x44, 0x60, 0x07, - 0x25, 0x02, 0x48, 0x44, 0x60, 0x05, 0x20, 0x03, - 0x49, 0x43, 0x60, 0x08, 0x49, 0x43, 0x60, 0x08, - 0x49, 0x43, 0x60, 0x0d, 0x49, 0x43, 0x60, 0x08, - 0x48, 0x43, 0x60, 0x07, 0x48, 0x43, 0x65, 0x87, - 0xf0, 0x00, 0xf9, 0x80, 0xf0, 0x0e, 0xfa, 0x6e, - 0x20, 0x00, 0xf0, 0x0b, 0xff, 0xab, 0x28, 0x00, - 0xd1, 0x5d, 0x48, 0x3f, 0xf0, 0x08, 0xfb, 0xe4, - 0x20, 0x00, 0xf0, 0x08, 0xfc, 0x55, 0x87, 0xe7, + 0x4a, 0x4c, 0x60, 0xd1, 0x60, 0x07, 0xf7, 0xfc, + 0xfa, 0xf7, 0x20, 0x01, 0xf7, 0xff, 0xff, 0xa2, + 0x21, 0x00, 0x20, 0x00, 0xf0, 0x09, 0xf8, 0xb4, + 0xf0, 0x01, 0xfa, 0xac, 0x48, 0x46, 0x60, 0x07, + 0x25, 0x02, 0x48, 0x46, 0x60, 0x05, 0x20, 0x03, + 0x49, 0x45, 0x60, 0x08, 0x49, 0x45, 0x60, 0x08, + 0x49, 0x45, 0x60, 0x0d, 0x49, 0x45, 0x60, 0x08, + 0x48, 0x45, 0x60, 0x07, 0x48, 0x45, 0x65, 0x87, + 0xf0, 0x00, 0xf9, 0x84, 0xf0, 0x0e, 0xfd, 0x90, + 0x20, 0x00, 0xf0, 0x0c, 0xfa, 0xcd, 0x28, 0x00, + 0xd1, 0x60, 0x48, 0x41, 0xf0, 0x08, 0xff, 0x06, + 0x20, 0x00, 0xf0, 0x08, 0xff, 0x77, 0x87, 0xe7, 0x87, 0xa7, 0x22, 0x01, 0xb4, 0x04, 0x22, 0x03, 0x21, 0x01, 0x20, 0x00, 0x1c, 0x2b, 0xf0, 0x0b, - 0xfc, 0x51, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, - 0xfc, 0x73, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, - 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xc7, 0x20, 0x7d, - 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xdb, 0xf0, 0x04, - 0xf8, 0x4b, 0xf0, 0x04, 0xf8, 0x89, 0xf7, 0xfb, - 0xf9, 0x11, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfd, - 0xf8, 0x11, 0xf7, 0xfd, 0xfb, 0xbf, 0xf7, 0xfb, - 0xfc, 0x3d, 0x05, 0xa8, 0xf0, 0x16, 0xfe, 0x49, - 0x49, 0x28, 0x20, 0x17, 0xf0, 0x16, 0xfe, 0x52, - 0x49, 0x27, 0x20, 0x08, 0xf0, 0x16, 0xfe, 0x4e, - 0xf0, 0x16, 0xfe, 0x44, 0x4b, 0x25, 0x40, 0x18, - 0xf0, 0x16, 0xfe, 0x44, 0x01, 0xe8, 0xf0, 0x16, - 0xfe, 0x38, 0x48, 0x23, 0x23, 0x01, 0x22, 0x08, - 0x21, 0x81, 0x01, 0x09, 0x60, 0x07, 0xf0, 0x0b, - 0xfb, 0x65, 0xf0, 0x01, 0xfa, 0xc7, 0x49, 0x1f, - 0x20, 0x04, 0xf0, 0x16, 0xfe, 0x37, 0xf0, 0x16, - 0xfe, 0x2d, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, - 0xf0, 0x16, 0xfe, 0x2c, 0x20, 0x10, 0xf0, 0x16, - 0xfe, 0x20, 0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, - 0xf7, 0xfd, 0xfd, 0xb0, 0x1c, 0x38, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x73, 0x20, 0x02, 0xb0, 0x01, 0xf7, 0xfc, + 0xfc, 0x53, 0xf7, 0xff, 0xff, 0x95, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xab, 0x20, 0x7d, + 0x00, 0xc0, 0xf7, 0xfd, 0xfd, 0xbf, 0xf0, 0x04, + 0xfb, 0x8d, 0xf0, 0x04, 0xfb, 0xcb, 0xf7, 0xfb, + 0xf8, 0xe5, 0x21, 0x18, 0x20, 0x14, 0xf7, 0xfc, + 0xff, 0xf5, 0xf7, 0xfd, 0xfb, 0xa3, 0xf7, 0xfb, + 0xfc, 0x11, 0x20, 0xff, 0xf7, 0xfa, 0xff, 0x2c, + 0x05, 0xa8, 0xf0, 0x17, 0xf9, 0x8a, 0x49, 0x29, + 0x20, 0x17, 0xf0, 0x17, 0xf9, 0x93, 0x49, 0x28, + 0x20, 0x08, 0xf0, 0x17, 0xf9, 0x8f, 0xf0, 0x17, + 0xf9, 0x85, 0x4b, 0x26, 0x40, 0x18, 0xf0, 0x17, + 0xf9, 0x85, 0x01, 0xe8, 0xf0, 0x17, 0xf9, 0x79, + 0x48, 0x23, 0x23, 0x01, 0x22, 0x08, 0x21, 0x81, + 0x01, 0x09, 0x60, 0x07, 0xf0, 0x0b, 0xfe, 0x84, + 0xf0, 0x01, 0xfa, 0xd2, 0x49, 0x1f, 0x20, 0x04, + 0xf0, 0x17, 0xf9, 0x78, 0xf0, 0x17, 0xf9, 0x6e, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, + 0xf9, 0x6d, 0x20, 0x10, 0xf0, 0x17, 0xf9, 0x61, + 0x87, 0x67, 0x21, 0x00, 0x1c, 0x30, 0xf7, 0xfd, + 0xfd, 0x91, 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2c, 0x00, 0x00, 0xfc, 0x2c, 0x00, 0x1f, 0xc0, - 0x2e, 0x08, 0x04, 0x9c, 0x07, 0x77, 0x77, 0x20, - 0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x6c, + 0x2e, 0x08, 0x04, 0x94, 0x07, 0x77, 0x77, 0x20, + 0x72, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x05, 0x5c, 0x6e, 0x00, 0x10, 0x00, 0x6e, 0x00, 0x11, 0x00, 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x15, 0x00, 0x6e, 0x00, 0x16, 0x00, 0x6e, 0x00, 0x17, 0x00, 0x6e, 0x00, 0x18, 0x00, 0xcc, 0x00, 0x0f, 0x80, - 0x00, 0x80, 0x10, 0x80, 0x2e, 0x00, 0x55, 0x39, - 0x2e, 0x00, 0x55, 0x59, 0xff, 0xff, 0xfe, 0xff, - 0x2e, 0x08, 0x47, 0x58, 0x2e, 0x00, 0x55, 0x19, - 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, - 0xfe, 0x29, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, + 0x00, 0x80, 0x10, 0x80, 0x2e, 0x00, 0x56, 0x25, + 0x2e, 0x00, 0x56, 0x45, 0xff, 0xff, 0xfe, 0xff, + 0x2e, 0x08, 0x47, 0x50, 0x2e, 0x00, 0x56, 0x05, + 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, + 0xf9, 0x69, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, - 0xf0, 0x16, 0xfd, 0xe0, 0xf0, 0x16, 0xfd, 0xd6, - 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, - 0xfd, 0xd5, 0xf0, 0x16, 0xfe, 0x41, 0xbc, 0x90, + 0xf0, 0x17, 0xf9, 0x20, 0xf0, 0x17, 0xf9, 0x16, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, + 0xf9, 0x15, 0xf0, 0x17, 0xf9, 0x81, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x03, 0x00, - 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, - 0xfd, 0xfd, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, + 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, + 0xf9, 0x3d, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, 0x20, 0x01, 0x1c, 0x21, - 0xf0, 0x16, 0xfd, 0xb4, 0xf0, 0x16, 0xfd, 0xaa, - 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, - 0xfd, 0xa9, 0xf0, 0x16, 0xfe, 0x15, 0xbc, 0x90, + 0xf0, 0x17, 0xf8, 0xf4, 0xf0, 0x17, 0xf8, 0xea, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, + 0xf8, 0xe9, 0xf0, 0x17, 0xf9, 0x55, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, - 0x6e, 0x00, 0x03, 0x00, 0xb5, 0x00, 0xf0, 0x16, - 0xfd, 0xd5, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, - 0xf0, 0x16, 0xfd, 0x94, 0x23, 0x02, 0x43, 0x18, - 0xf0, 0x16, 0xfd, 0x94, 0xf0, 0x16, 0xfe, 0x00, + 0x6e, 0x00, 0x03, 0x00, 0xb5, 0x00, 0xf0, 0x17, + 0xf9, 0x15, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, + 0xf0, 0x17, 0xf8, 0xd4, 0x23, 0x02, 0x43, 0x18, + 0xf0, 0x17, 0xf8, 0xd4, 0xf0, 0x17, 0xf9, 0x40, 0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x03, 0x00, - 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, - 0xfd, 0xc1, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, + 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, + 0xf9, 0x01, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, 0x4b, 0x0c, 0x18, 0xff, 0x21, 0x03, 0x48, 0x0c, 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, - 0xf0, 0x16, 0xfd, 0x78, 0xf0, 0x16, 0xfd, 0x6e, - 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, - 0xfd, 0x6d, 0xf0, 0x16, 0xfd, 0xd9, 0xbc, 0x90, + 0xf0, 0x17, 0xf8, 0xb8, 0xf0, 0x17, 0xf8, 0xae, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, + 0xf8, 0xad, 0xf0, 0x17, 0xf9, 0x19, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0x9e, 0x34, 0x6e, 0x00, 0x04, 0x00, - 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x16, - 0xfd, 0x95, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, + 0xb5, 0x90, 0x1c, 0x0c, 0x1c, 0x07, 0xf0, 0x17, + 0xf8, 0xd5, 0x2f, 0x01, 0xda, 0x00, 0x27, 0x01, 0x4b, 0x0e, 0x42, 0x9f, 0xdd, 0x00, 0x1c, 0x1f, 0x3f, 0x01, 0x04, 0x3f, 0x21, 0x03, 0x37, 0xff, 0x37, 0x96, 0x48, 0x0b, 0x60, 0x01, 0x60, 0x47, 0x21, 0x01, 0x60, 0x01, 0x20, 0x05, 0x1c, 0x21, - 0xf0, 0x16, 0xfd, 0x4c, 0xf0, 0x16, 0xfd, 0x42, - 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, - 0xfd, 0x41, 0xf0, 0x16, 0xfd, 0xad, 0xbc, 0x90, + 0xf0, 0x17, 0xf8, 0x8c, 0xf0, 0x17, 0xf8, 0x82, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, + 0xf8, 0x81, 0xf0, 0x17, 0xf8, 0xed, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xfd, 0xe8, - 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0xf0, 0x16, - 0xfd, 0x6d, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, - 0xf0, 0x16, 0xfd, 0x2c, 0x23, 0x20, 0x43, 0x18, - 0xf0, 0x16, 0xfd, 0x2c, 0xf0, 0x16, 0xfd, 0x98, + 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0xf0, 0x17, + 0xf8, 0xad, 0x20, 0x03, 0x49, 0x05, 0x60, 0x08, + 0xf0, 0x17, 0xf8, 0x6c, 0x23, 0x20, 0x43, 0x18, + 0xf0, 0x17, 0xf8, 0x6c, 0xf0, 0x17, 0xf8, 0xd8, 0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x04, 0x00, 0xb5, 0x00, 0x48, 0x0b, 0x68, 0x41, 0x31, 0x14, 0x60, 0x41, 0x68, 0x81, 0x31, 0x01, 0x60, 0x81, 0x48, 0x08, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, - 0x28, 0x01, 0xd1, 0x01, 0xf7, 0xfe, 0xfa, 0x5a, + 0x28, 0x01, 0xd1, 0x01, 0xf7, 0xfe, 0xfa, 0x58, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x04, 0x21, 0x10, - 0xf0, 0x09, 0xf9, 0x64, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x08, 0x05, 0x00, - 0x2e, 0x08, 0x05, 0xb8, 0xb5, 0x00, 0xf0, 0x16, - 0xfd, 0x3d, 0x21, 0x00, 0x48, 0x08, 0x60, 0x41, - 0x60, 0x81, 0x49, 0x08, 0x20, 0x07, 0xf0, 0x16, - 0xfd, 0x01, 0xf0, 0x16, 0xfc, 0xf7, 0x23, 0x80, - 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x16, 0xfc, 0xf6, - 0xf0, 0x16, 0xfd, 0x62, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x00, 0x59, 0x65, + 0xf0, 0x09, 0xfc, 0x82, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x04, 0xf8, + 0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x00, 0xf0, 0x17, + 0xf8, 0x7d, 0x21, 0x00, 0x48, 0x08, 0x60, 0x41, + 0x60, 0x81, 0x49, 0x08, 0x20, 0x07, 0xf0, 0x17, + 0xf8, 0x41, 0xf0, 0x17, 0xf8, 0x37, 0x23, 0x80, + 0x43, 0xdb, 0x40, 0x18, 0xf0, 0x17, 0xf8, 0x36, + 0xf0, 0x17, 0xf8, 0xa2, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5a, 0x45, 0x48, 0x01, 0x68, 0x40, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x05, 0xb8, 0xb5, 0x90, 0x49, 0x0d, + 0x2e, 0x08, 0x05, 0xa8, 0xb5, 0x90, 0x49, 0x0d, 0x1c, 0x0f, 0x48, 0x0d, 0x24, 0x1e, 0x22, 0x10, - 0x1c, 0x23, 0xf0, 0x09, 0xfa, 0x65, 0x22, 0x02, + 0x1c, 0x23, 0xf0, 0x09, 0xfd, 0x83, 0x22, 0x02, 0x21, 0x10, 0x1c, 0x38, 0x1c, 0x23, 0xf0, 0x05, - 0xfc, 0xcd, 0x49, 0x08, 0x20, 0x10, 0xf0, 0x16, - 0xfc, 0xd9, 0xf0, 0x16, 0xfc, 0xcf, 0x4b, 0x06, - 0x40, 0x18, 0xf0, 0x16, 0xfc, 0xcf, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x68, - 0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x00, 0x5a, 0x29, + 0xff, 0xeb, 0x49, 0x08, 0x20, 0x10, 0xf0, 0x17, + 0xf8, 0x19, 0xf0, 0x17, 0xf8, 0x0f, 0x4b, 0x06, + 0x40, 0x18, 0xf0, 0x17, 0xf8, 0x0f, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60, + 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x00, 0x5b, 0x09, 0xff, 0xfe, 0xff, 0xff, 0xb5, 0x00, 0xb0, 0x86, 0x46, 0x68, 0x49, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 0xc9, 0x0c, 0xc0, 0x0c, 0x48, 0x09, 0xab, 0x00, 0xcb, 0x0e, 0xb0, 0x03, - 0xf0, 0x09, 0xfa, 0x6a, 0xb0, 0x03, 0x48, 0x07, + 0xf0, 0x09, 0xfd, 0x88, 0xb0, 0x03, 0x48, 0x07, 0x68, 0x01, 0x08, 0x4a, 0xd3, 0x04, 0x08, 0x49, 0x00, 0x49, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x68, - 0x2e, 0x08, 0x05, 0xb8, 0x2e, 0x08, 0x00, 0x04, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x60, + 0x2e, 0x08, 0x05, 0xa8, 0x2e, 0x08, 0x00, 0x04, 0xb5, 0x80, 0x29, 0x0c, 0xd2, 0x00, 0x21, 0x0c, 0x31, 0x07, 0x08, 0xc9, 0x00, 0xc9, 0x27, 0x00, 0x68, 0x02, 0x42, 0x82, 0xd0, 0x03, 0x68, 0x93, @@ -2847,589 +2875,591 @@ 0xc8, 0x03, 0x60, 0x41, 0x47, 0x70, 0xb5, 0x00, 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 0xff, 0xde, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x05, 0xdc, 0xb5, 0x90, 0x1c, 0x07, - 0xf0, 0x16, 0xfb, 0xf8, 0x23, 0x11, 0x05, 0x1b, - 0x1c, 0x04, 0x43, 0x18, 0xf0, 0x16, 0xfb, 0xf6, + 0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x90, 0x1c, 0x07, + 0xf0, 0x16, 0xff, 0x38, 0x23, 0x11, 0x05, 0x1b, + 0x1c, 0x04, 0x43, 0x18, 0xf0, 0x16, 0xff, 0x36, 0x1c, 0x39, 0x48, 0x05, 0xf7, 0xff, 0xff, 0x50, - 0x1c, 0x07, 0x1c, 0x20, 0xf0, 0x16, 0xfb, 0xee, + 0x1c, 0x07, 0x1c, 0x20, 0xf0, 0x16, 0xff, 0x2e, 0x1c, 0x38, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x05, 0xdc, 0xb5, 0x00, 0x1c, 0x01, + 0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 0xff, 0x41, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xdc, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x90, 0x1c, 0x07, 0xd0, 0x0e, 0xf0, 0x16, - 0xfb, 0xd5, 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, - 0x43, 0x18, 0xf0, 0x16, 0xfb, 0xd3, 0x1c, 0x39, + 0xff, 0x15, 0x23, 0x11, 0x05, 0x1b, 0x1c, 0x04, + 0x43, 0x18, 0xf0, 0x16, 0xff, 0x13, 0x1c, 0x39, 0x48, 0x04, 0xf7, 0xff, 0xff, 0x61, 0x1c, 0x20, - 0xf0, 0x16, 0xfb, 0xcc, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xdc, + 0xf0, 0x16, 0xff, 0x0c, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xcc, 0xb5, 0x00, 0x4a, 0x04, 0xc2, 0x03, 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x97, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc4, - 0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x1c, 0x01, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 0xff, 0x11, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd4, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x49, 0x08, 0x68, 0x0a, 0x42, 0x90, 0xd3, 0x02, 0x68, 0x49, 0x42, 0x88, 0xd9, 0x03, 0xf7, 0xff, 0xff, 0xc6, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x30, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc4, - 0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x4a, 0x05, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x05, 0xc4, 0xb5, 0x00, 0x4a, 0x05, 0x60, 0x90, 0x60, 0xd1, 0x1c, 0x0a, 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x68, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4, - 0x2e, 0x08, 0x05, 0xe4, 0xb5, 0x00, 0x1c, 0x01, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x1c, 0x01, 0x48, 0x02, 0xf7, 0xff, 0xfe, 0xe1, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xe4, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd4, 0xb5, 0x00, 0x49, 0x08, 0x68, 0x8a, 0x42, 0x90, 0xd3, 0x02, 0x68, 0xc9, 0x42, 0x88, 0xd9, 0x03, 0xf7, 0xff, 0xff, 0x96, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x01, 0x48, 0x03, 0xf7, 0xff, 0xff, 0x00, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc4, - 0x2e, 0x08, 0x05, 0xe4, 0xb5, 0xf0, 0x06, 0x07, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb4, + 0x2e, 0x08, 0x05, 0xd4, 0xb5, 0xf0, 0x06, 0x07, 0x0e, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x81, 0x91, 0x00, 0x06, 0x16, 0x0e, 0x36, 0x00, 0xbd, 0x4c, 0x15, 0x59, 0x60, 0x28, 0x00, 0xd1, 0x15, - 0xf7, 0xfb, 0xf9, 0x40, 0x22, 0x00, 0xb4, 0x04, + 0xf7, 0xfb, 0xf9, 0x10, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, 0x22, 0x02, 0x99, 0x01, 0x1c, 0x38, - 0xf0, 0x04, 0xfe, 0x8c, 0x23, 0x01, 0x02, 0x9b, + 0xf0, 0x05, 0xf9, 0xaa, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x01, 0x1c, 0x38, 0xb0, 0x01, - 0xf0, 0x05, 0xf8, 0x48, 0x20, 0x03, 0x00, 0x71, + 0xf0, 0x05, 0xfb, 0x66, 0x20, 0x03, 0x00, 0x71, 0x4a, 0x0a, 0x52, 0x50, 0x59, 0x60, 0x30, 0x01, 0x51, 0x60, 0x48, 0x09, 0x23, 0x14, 0x5e, 0xc1, 0x29, 0x00, 0xd1, 0x02, 0x49, 0x07, 0x4a, 0x08, 0x65, 0xd1, 0x8a, 0x81, 0x31, 0x01, 0x82, 0x81, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x02, 0x54, 0xb0, 0x2e, 0x08, 0x49, 0x78, - 0x2e, 0x08, 0x07, 0x6c, 0x2e, 0x02, 0x52, 0xc0, + 0x2e, 0x02, 0x5c, 0x10, 0x2e, 0x08, 0x49, 0x70, + 0x2e, 0x08, 0x07, 0x5c, 0x2e, 0x02, 0x5a, 0x20, 0xa0, 0x00, 0x0d, 0x00, 0xb5, 0xb0, 0x06, 0x07, - 0x0e, 0x3f, 0x06, 0x0c, 0x0e, 0x24, 0x00, 0xb9, - 0x48, 0x1a, 0x58, 0x42, 0x3a, 0x01, 0x50, 0x42, - 0xd1, 0x20, 0x23, 0x01, 0x02, 0x9b, 0x00, 0x5a, - 0x21, 0x02, 0x1c, 0x38, 0xf0, 0x05, 0xf8, 0x16, - 0x22, 0x00, 0xb4, 0x04, 0x25, 0x00, 0x1c, 0x38, - 0x1c, 0x2b, 0x49, 0x13, 0xf0, 0x04, 0xfe, 0x4a, - 0x00, 0x61, 0xb0, 0x01, 0x48, 0x11, 0x52, 0x45, - 0x48, 0x0f, 0x4a, 0x11, 0x52, 0x50, 0x00, 0x79, - 0x4a, 0x10, 0x52, 0x50, 0x00, 0x62, 0x19, 0x12, - 0x00, 0x92, 0x49, 0x0f, 0x18, 0x53, 0x81, 0x1d, - 0x52, 0x88, 0x80, 0x58, 0x48, 0x0d, 0x8a, 0x81, - 0x39, 0x01, 0x82, 0x81, 0x23, 0x14, 0x5e, 0xc0, - 0x28, 0x00, 0xd1, 0x03, 0x20, 0xd7, 0x00, 0xc0, - 0x49, 0x09, 0x65, 0xc8, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x54, 0xb0, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x78, - 0x2e, 0x08, 0x49, 0x38, 0x2e, 0x08, 0x49, 0x00, - 0x2e, 0x08, 0x47, 0x80, 0x2e, 0x08, 0x07, 0x6c, - 0xa0, 0x00, 0x0d, 0x00, 0xb5, 0xf0, 0x04, 0x06, - 0x0c, 0x36, 0x04, 0x0c, 0x0c, 0x24, 0x1c, 0x17, - 0xb0, 0x8a, 0x46, 0x69, 0x1c, 0x30, 0x1c, 0x22, - 0xf0, 0x00, 0xf8, 0xb0, 0x23, 0x01, 0x1c, 0x05, - 0x42, 0xd8, 0xd1, 0x03, 0xb0, 0x0a, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x4e, 0x42, 0x9c, - 0xd1, 0x06, 0xa8, 0x00, 0x88, 0x00, 0x1c, 0x31, - 0x1c, 0x2a, 0xf7, 0xff, 0xff, 0x57, 0xe0, 0x7f, - 0x20, 0x20, 0x40, 0x20, 0x28, 0x20, 0xd1, 0x1f, - 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x00, 0x88, 0x00, - 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0x1c, 0x23, - 0xf7, 0xfd, 0xf8, 0x7c, 0x28, 0x00, 0xd0, 0x6f, - 0x48, 0x42, 0x00, 0x69, 0x4a, 0x42, 0x52, 0x50, - 0xa9, 0x00, 0x88, 0x09, 0x00, 0x49, 0x4a, 0x41, - 0x52, 0x50, 0xa8, 0x00, 0x88, 0x00, 0x1c, 0x29, - 0xf0, 0x00, 0xf9, 0xce, 0x20, 0x00, 0x43, 0xc0, - 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x00, 0x21, 0x00, 0xaa, 0x01, 0x88, 0x3b, - 0x0a, 0x1b, 0x70, 0x13, 0x88, 0x3b, 0x93, 0x09, - 0x32, 0x01, 0x06, 0x1b, 0xd0, 0x02, 0x1c, 0x48, - 0x06, 0x00, 0x0e, 0x00, 0x9b, 0x09, 0x70, 0x13, - 0x31, 0x01, 0x32, 0x01, 0x37, 0x02, 0x29, 0x0e, - 0xdb, 0xed, 0x21, 0x00, 0x23, 0x00, 0x70, 0x13, - 0x31, 0x01, 0x32, 0x01, 0x29, 0x04, 0xdb, 0xfa, - 0x21, 0x0c, 0x40, 0x21, 0x29, 0x0c, 0xd1, 0x03, - 0x04, 0x21, 0x0c, 0x09, 0x24, 0x01, 0x43, 0x0c, - 0x28, 0x06, 0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, - 0xb4, 0x04, 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, - 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, - 0xab, 0x02, 0xf7, 0xfc, 0xfc, 0x59, 0xb0, 0x01, - 0xe0, 0x1e, 0x28, 0x0a, 0xdc, 0x0e, 0x06, 0x22, - 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, 0x0e, 0x12, - 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, - 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, 0xfc, 0x62, - 0xb0, 0x01, 0xe0, 0x0d, 0x06, 0x22, 0x0e, 0x12, - 0xb4, 0x04, 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, - 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, - 0xab, 0x02, 0xf7, 0xfc, 0xfc, 0x6d, 0xb0, 0x01, - 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, - 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xe7, 0xff, 0xa8, 0x00, 0x88, 0x00, 0x00, 0x6a, - 0x19, 0x52, 0x00, 0x92, 0x49, 0x0a, 0x52, 0x88, - 0x18, 0x50, 0x80, 0x46, 0x80, 0x84, 0x49, 0x05, - 0x80, 0xc1, 0x21, 0x01, 0x81, 0x01, 0x1c, 0x28, + 0x0e, 0x3f, 0x06, 0x0d, 0x0e, 0x2d, 0x00, 0xb9, + 0x48, 0x1b, 0x58, 0x42, 0x3a, 0x01, 0x50, 0x42, + 0x24, 0x00, 0x2a, 0x00, 0xd1, 0x1f, 0x23, 0x01, + 0x02, 0x9b, 0x00, 0x5a, 0x21, 0x02, 0x1c, 0x38, + 0xf0, 0x05, 0xfb, 0x32, 0x22, 0x00, 0xb4, 0x04, + 0x1c, 0x38, 0x1c, 0x23, 0x49, 0x13, 0xf0, 0x05, + 0xf9, 0x67, 0x00, 0x69, 0xb0, 0x01, 0x48, 0x12, + 0x52, 0x44, 0x48, 0x10, 0x4a, 0x11, 0x52, 0x50, + 0x00, 0x79, 0x4a, 0x11, 0x52, 0x50, 0x00, 0x6a, + 0x19, 0x52, 0x00, 0x92, 0x4b, 0x0f, 0x18, 0xd1, + 0x81, 0x0c, 0x52, 0x98, 0x80, 0x48, 0x48, 0x0e, + 0x8a, 0x81, 0x39, 0x01, 0x82, 0x81, 0x23, 0x14, + 0x5e, 0xc0, 0x28, 0x00, 0xd1, 0x03, 0x20, 0xd7, + 0x00, 0xc0, 0x49, 0x0a, 0x65, 0xc8, 0x1c, 0x20, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0x5c, 0x10, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0x30, + 0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78, + 0x2e, 0x08, 0x07, 0x5c, 0xa0, 0x00, 0x0d, 0x00, + 0xb5, 0xf0, 0x04, 0x06, 0x0c, 0x36, 0x04, 0x0c, + 0x0c, 0x24, 0x1c, 0x17, 0xb0, 0x8a, 0x46, 0x69, + 0x1c, 0x30, 0x1c, 0x22, 0xf0, 0x00, 0xf8, 0xb0, + 0x23, 0x01, 0x1c, 0x05, 0x42, 0xd8, 0xd1, 0x03, 0xb0, 0x0a, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x00, 0x00, 0xb9, 0x6a, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x49, 0x38, 0x2e, 0x08, 0x49, 0x00, - 0x2e, 0x08, 0x47, 0x80, 0xb4, 0xf0, 0x04, 0x04, - 0x0c, 0x24, 0x04, 0x17, 0x0c, 0x3f, 0xb0, 0x82, - 0x48, 0x58, 0x22, 0x00, 0x4d, 0x58, 0x95, 0x01, - 0x1c, 0x06, 0x00, 0x53, 0x9d, 0x01, 0x5a, 0xed, - 0x42, 0xb5, 0xd1, 0x02, 0x04, 0x10, 0x0c, 0x00, - 0xe0, 0x02, 0x32, 0x01, 0x2a, 0x20, 0xdb, 0xf4, - 0x42, 0xb0, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, - 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x80, 0x0e, - 0x4a, 0x4e, 0x92, 0x00, 0x4d, 0x4e, 0x4a, 0x4f, - 0x4b, 0x4f, 0x42, 0x9f, 0xd1, 0x32, 0x23, 0x00, - 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, - 0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x03, 0xd1, 0x01, - 0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, - 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, - 0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x3f, - 0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b, - 0x5a, 0xd6, 0x4b, 0x3c, 0x42, 0x9e, 0xd1, 0x01, - 0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, - 0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x37, 0x42, 0x9f, - 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, - 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x03, 0x00, 0x47, - 0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f, - 0x53, 0xeb, 0xe0, 0x54, 0x23, 0x20, 0x40, 0x3b, - 0x2b, 0x20, 0xd1, 0x1e, 0x23, 0x00, 0x00, 0x5f, - 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x04, 0x20, 0x00, - 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, - 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xf3, 0x27, 0x00, - 0x00, 0x7b, 0x5a, 0xd5, 0x42, 0xb5, 0xd1, 0x01, - 0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, - 0xdb, 0xf6, 0x88, 0x0f, 0x42, 0xb7, 0xd1, 0x36, + 0x4b, 0x4e, 0x42, 0x9c, 0xd1, 0x06, 0xa8, 0x00, + 0x88, 0x00, 0x1c, 0x31, 0x1c, 0x2a, 0xf7, 0xff, + 0xff, 0x55, 0xe0, 0x7f, 0x20, 0x20, 0x40, 0x20, + 0x28, 0x20, 0xd1, 0x1f, 0x06, 0x2a, 0x0e, 0x12, + 0xa8, 0x00, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, + 0x1c, 0x31, 0x1c, 0x23, 0xf7, 0xfd, 0xf8, 0x5a, + 0x28, 0x00, 0xd0, 0x6f, 0x48, 0x42, 0x00, 0x69, + 0x4a, 0x42, 0x52, 0x50, 0xa9, 0x00, 0x88, 0x09, + 0x00, 0x49, 0x4a, 0x41, 0x52, 0x50, 0xa8, 0x00, + 0x88, 0x00, 0x1c, 0x29, 0xf0, 0x00, 0xf9, 0xce, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x21, 0x00, + 0xaa, 0x01, 0x88, 0x3b, 0x0a, 0x1b, 0x70, 0x13, + 0x88, 0x3b, 0x93, 0x09, 0x32, 0x01, 0x06, 0x1b, + 0xd0, 0x02, 0x1c, 0x48, 0x06, 0x00, 0x0e, 0x00, + 0x9b, 0x09, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, + 0x37, 0x02, 0x29, 0x0e, 0xdb, 0xed, 0x21, 0x00, + 0x23, 0x00, 0x70, 0x13, 0x31, 0x01, 0x32, 0x01, + 0x29, 0x04, 0xdb, 0xfa, 0x21, 0x0c, 0x40, 0x21, + 0x29, 0x0c, 0xd1, 0x03, 0x04, 0x21, 0x0c, 0x09, + 0x24, 0x01, 0x43, 0x0c, 0x28, 0x06, 0xdc, 0x0e, + 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, + 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, + 0xfc, 0x37, 0xb0, 0x01, 0xe0, 0x1e, 0x28, 0x0a, + 0xdc, 0x0e, 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, + 0x06, 0x2a, 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, + 0xf7, 0xfc, 0xfc, 0x40, 0xb0, 0x01, 0xe0, 0x0d, + 0x06, 0x22, 0x0e, 0x12, 0xb4, 0x04, 0x06, 0x2a, + 0x0e, 0x12, 0xa8, 0x01, 0x88, 0x00, 0x06, 0x00, + 0x0e, 0x00, 0x1c, 0x31, 0xab, 0x02, 0xf7, 0xfc, + 0xfc, 0x4b, 0xb0, 0x01, 0x28, 0x00, 0xd0, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0xa8, 0x00, + 0x88, 0x00, 0x00, 0x6a, 0x19, 0x52, 0x00, 0x92, + 0x49, 0x0a, 0x52, 0x88, 0x18, 0x50, 0x80, 0x46, + 0x80, 0x84, 0x49, 0x05, 0x80, 0xc1, 0x21, 0x01, + 0x81, 0x01, 0x1c, 0x28, 0xb0, 0x0a, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xb9, 0x6a, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, + 0x2e, 0x08, 0x48, 0xf8, 0x2e, 0x08, 0x47, 0x78, + 0xb4, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x17, + 0x0c, 0x3f, 0xb0, 0x82, 0x48, 0x58, 0x22, 0x00, + 0x4d, 0x58, 0x95, 0x01, 0x1c, 0x06, 0x00, 0x53, + 0x9d, 0x01, 0x5a, 0xed, 0x42, 0xb5, 0xd1, 0x02, + 0x04, 0x10, 0x0c, 0x00, 0xe0, 0x02, 0x32, 0x01, + 0x2a, 0x20, 0xdb, 0xf4, 0x42, 0xb0, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, - 0x47, 0x70, 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, + 0x47, 0x70, 0x80, 0x0e, 0x4a, 0x4e, 0x92, 0x00, + 0x4d, 0x4e, 0x4a, 0x4f, 0x4b, 0x4f, 0x42, 0x9f, + 0xd1, 0x32, 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, 0x00, 0x5f, 0x5b, 0xef, - 0x2f, 0x02, 0xd1, 0x01, 0x80, 0x0b, 0xe0, 0x07, + 0x2f, 0x03, 0xd1, 0x01, 0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xed, - 0x88, 0x0f, 0x4b, 0x14, 0x42, 0x9f, 0xd1, 0x0a, - 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd6, 0x4b, 0x11, + 0x88, 0x0f, 0x4b, 0x3f, 0x42, 0x9f, 0xd1, 0x0a, + 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd6, 0x4b, 0x3c, 0x42, 0x9e, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf5, 0x88, 0x0f, - 0x4b, 0x0c, 0x42, 0x9f, 0xd1, 0x04, 0x20, 0x00, + 0x4b, 0x37, 0x42, 0x9f, 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, - 0x23, 0x02, 0x00, 0x47, 0x9e, 0x00, 0x53, 0xf3, - 0x88, 0x0f, 0x00, 0x7f, 0x53, 0xeb, 0x00, 0x43, - 0x9d, 0x01, 0x52, 0xec, 0x88, 0x09, 0x00, 0x49, - 0x52, 0x54, 0x04, 0x00, 0x14, 0x00, 0xb0, 0x02, - 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x49, 0x38, 0x2e, 0x08, 0x49, 0x78, - 0x2e, 0x08, 0x49, 0xb8, 0x2e, 0x08, 0x49, 0x00, - 0x00, 0x00, 0xb9, 0x6a, 0xb5, 0xf0, 0x04, 0x07, - 0x0c, 0x3f, 0xb0, 0x81, 0x4a, 0x34, 0x92, 0x00, - 0x1c, 0x11, 0x42, 0x97, 0xd0, 0x01, 0x2f, 0x20, - 0xdb, 0x05, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x7c, - 0x4a, 0x2e, 0x5b, 0x10, 0x42, 0x88, 0xd1, 0x05, - 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x49, 0x28, 0x53, 0x11, - 0x23, 0x00, 0x49, 0x29, 0x00, 0x5e, 0x5b, 0x8e, - 0x42, 0x86, 0xd1, 0x02, 0x04, 0x1d, 0x0c, 0x2d, - 0xe0, 0x02, 0x33, 0x01, 0x2b, 0x1c, 0xdb, 0xf5, - 0x23, 0x00, 0x00, 0x5e, 0x5b, 0x96, 0x42, 0x86, - 0xd1, 0x03, 0x04, 0x1a, 0x0c, 0x12, 0x92, 0x00, - 0xe0, 0x02, 0x33, 0x01, 0x2b, 0x20, 0xdb, 0xf4, - 0x9a, 0x00, 0x4e, 0x1b, 0x42, 0xb2, 0xd1, 0x0d, - 0x22, 0x00, 0x00, 0x53, 0x5a, 0xcb, 0x42, 0x83, - 0xd1, 0x05, 0x23, 0x00, 0x00, 0x50, 0x4a, 0x19, - 0x52, 0x13, 0x52, 0x0e, 0xe0, 0x02, 0x32, 0x01, - 0x2a, 0x1c, 0xdb, 0xf2, 0x4e, 0x16, 0x5b, 0x30, - 0x28, 0x02, 0xd1, 0x05, 0x23, 0x00, 0x53, 0x33, - 0x1c, 0x28, 0x1c, 0x39, 0xf0, 0x00, 0xf8, 0x38, - 0x5b, 0x30, 0x28, 0x01, 0xd1, 0x0a, 0x1c, 0x38, - 0xf7, 0xfc, 0xff, 0xf0, 0x28, 0x00, 0xd0, 0x05, - 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x5b, 0x30, 0x28, 0x03, - 0xd1, 0x03, 0x1c, 0x28, 0x1c, 0x39, 0xf7, 0xff, - 0xfd, 0xcd, 0x04, 0x38, 0x14, 0x00, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x38, - 0x2e, 0x08, 0x49, 0x00, 0x2e, 0x08, 0x49, 0xb8, - 0x2e, 0x08, 0x49, 0x78, 0x04, 0x01, 0x0c, 0x09, - 0x20, 0x02, 0x00, 0x4b, 0x18, 0x5b, 0x00, 0x9b, - 0x4a, 0x03, 0x18, 0x99, 0x81, 0x08, 0x48, 0x03, - 0x52, 0xd0, 0x80, 0x48, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x47, 0x80, 0x00, 0x00, 0xff, 0xff, - 0xb5, 0x80, 0x04, 0x0f, 0x0c, 0x3f, 0x06, 0x39, - 0x0e, 0x09, 0x06, 0x00, 0x0e, 0x00, 0xf7, 0xfc, - 0xfc, 0x25, 0x20, 0x00, 0x00, 0x7b, 0x19, 0xdb, - 0x00, 0x9b, 0x4a, 0x04, 0x18, 0x99, 0x81, 0x08, - 0x48, 0x03, 0x52, 0xd0, 0x80, 0x48, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x47, 0x80, - 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x09, - 0x0c, 0x09, 0x78, 0x42, 0x02, 0x12, 0x78, 0x83, - 0x43, 0x1a, 0x05, 0x12, 0x0d, 0x12, 0x27, 0x00, - 0x43, 0xff, 0x32, 0x03, 0x42, 0x8a, 0xd0, 0x03, - 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0xf0, 0x05, 0xfa, 0xd0, 0x28, 0x00, 0xd0, 0x03, - 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0xff, 0x9c, 0x09, 0x04, 0x00, 0x0c, 0x00, - 0xb0, 0x81, 0x90, 0x00, 0x06, 0x09, 0x0e, 0x09, - 0x06, 0x12, 0x0e, 0x12, 0xb0, 0x88, 0x4f, 0x16, - 0x68, 0xb8, 0x28, 0x0c, 0xdb, 0x06, 0x20, 0x00, - 0x43, 0xc0, 0xb0, 0x09, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x23, 0x00, - 0x00, 0x45, 0x46, 0x6e, 0x53, 0x73, 0x30, 0x01, - 0x04, 0x00, 0x14, 0x00, 0x28, 0x10, 0xdb, 0xf7, - 0x02, 0x08, 0x43, 0x10, 0xab, 0x00, 0x80, 0x18, - 0x46, 0x6a, 0x21, 0x04, 0x98, 0x08, 0xf7, 0xff, - 0xfd, 0x95, 0x28, 0x00, 0xda, 0x01, 0xb0, 0x09, - 0xe7, 0xe4, 0x00, 0x81, 0x4a, 0x05, 0x50, 0x54, - 0x9b, 0x0c, 0x4a, 0x05, 0x50, 0x53, 0x68, 0xb9, - 0x31, 0x01, 0x60, 0xb9, 0xb0, 0x09, 0xe7, 0xd9, - 0x2e, 0x08, 0x07, 0x84, 0x2e, 0x08, 0x4a, 0x70, - 0x2e, 0x08, 0x49, 0xf0, 0xb5, 0x80, 0x04, 0x07, - 0x14, 0x3f, 0xd5, 0x04, 0x20, 0x00, 0x43, 0xc0, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, - 0xf7, 0xff, 0xfe, 0xf4, 0x20, 0x00, 0x00, 0xb9, - 0x4a, 0x05, 0x50, 0x50, 0x4a, 0x05, 0x50, 0x50, - 0x49, 0x05, 0x68, 0x8a, 0x3a, 0x01, 0x60, 0x8a, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x49, 0xf0, 0x2e, 0x08, 0x4a, 0x70, - 0x2e, 0x08, 0x07, 0x84, 0xb5, 0x90, 0x27, 0x00, - 0x4c, 0x08, 0x00, 0xb8, 0x58, 0x20, 0x28, 0x00, - 0xd0, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xd6, - 0x37, 0x01, 0x2f, 0x20, 0xdb, 0xf5, 0x20, 0x00, - 0x49, 0x03, 0x60, 0xc8, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x49, 0xf0, - 0x2e, 0x08, 0x07, 0x84, 0xb5, 0x00, 0xf7, 0xff, - 0xff, 0xe5, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, - 0x04, 0x00, 0x14, 0x00, 0xb0, 0x83, 0x90, 0x00, - 0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09, 0x24, 0x00, - 0x1c, 0x38, 0x1c, 0x1d, 0x1c, 0x0e, 0xb0, 0x81, - 0xf7, 0xff, 0xff, 0x58, 0x1c, 0x01, 0x20, 0x00, - 0x29, 0x00, 0xd0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x78, 0xf9, 0x02, 0x09, - 0x79, 0x3a, 0x43, 0x11, 0x04, 0x09, 0x0c, 0x09, - 0x88, 0x2a, 0x42, 0x91, 0xd0, 0x03, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x7a, 0x39, - 0x02, 0x09, 0x7a, 0x7a, 0x43, 0x11, 0x04, 0xc9, - 0x0c, 0xc9, 0x91, 0x00, 0x7a, 0xb9, 0x02, 0x09, - 0x7a, 0xfa, 0x43, 0x11, 0x05, 0x0b, 0x0d, 0x1b, - 0x1d, 0xf9, 0x31, 0x05, 0x27, 0x00, 0x1d, 0xd8, - 0x30, 0x09, 0x1a, 0x32, 0x2b, 0x00, 0xdd, 0x0a, - 0x78, 0x08, 0x28, 0x09, 0xd1, 0x00, 0x37, 0x01, - 0x78, 0x48, 0x1c, 0x85, 0x1b, 0x5b, 0x18, 0x40, - 0x1c, 0x81, 0x2b, 0x00, 0xdc, 0xf4, 0x2a, 0x00, - 0xdd, 0x36, 0x48, 0x26, 0x88, 0x06, 0x96, 0x03, - 0x88, 0x85, 0x95, 0x02, 0x78, 0xc8, 0x02, 0x00, - 0x79, 0x0b, 0x43, 0x18, 0x05, 0x00, 0x0d, 0x00, - 0x78, 0x0b, 0x2b, 0x01, 0xd0, 0x01, 0x2b, 0x02, - 0xd1, 0x06, 0x78, 0x4d, 0x02, 0x2d, 0x78, 0x8e, - 0x43, 0x35, 0x04, 0xed, 0x0c, 0xed, 0x9e, 0x03, - 0x2b, 0x04, 0xd0, 0x01, 0x2b, 0x03, 0xd1, 0x09, - 0x78, 0x4b, 0x02, 0x1b, 0x78, 0x8d, 0x43, 0x2b, - 0x04, 0xdb, 0x0c, 0xdb, 0x9d, 0x02, 0x42, 0xab, - 0xd1, 0x00, 0x24, 0x01, 0x1d, 0x43, 0x1a, 0xd2, - 0x31, 0x05, 0x28, 0x00, 0xdd, 0x0a, 0x78, 0x0b, - 0x2b, 0x09, 0xd1, 0x00, 0x37, 0x01, 0x78, 0x4b, - 0x1c, 0x9d, 0x1b, 0x40, 0x18, 0x59, 0x31, 0x02, - 0x28, 0x00, 0xdc, 0xf4, 0x2a, 0x00, 0xdc, 0xcd, - 0x2c, 0x00, 0xd0, 0x09, 0xf7, 0xff, 0xff, 0x62, - 0x99, 0x00, 0x48, 0x09, 0x80, 0x01, 0x2f, 0x00, - 0xd1, 0x07, 0xf7, 0xfa, 0xf8, 0xb7, 0xe0, 0x04, - 0x98, 0x01, 0xf7, 0xff, 0xff, 0x37, 0xf0, 0x00, - 0xf8, 0x23, 0x20, 0x00, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x84, - 0x2e, 0x08, 0x00, 0x08, 0xb4, 0x90, 0x04, 0x02, - 0x0c, 0x12, 0x04, 0x0f, 0x0c, 0x3f, 0x4b, 0x07, - 0x68, 0xd8, 0x28, 0x80, 0xda, 0x08, 0x2a, 0x00, - 0xd0, 0x06, 0x00, 0x41, 0x4c, 0x04, 0x52, 0x67, - 0x4f, 0x04, 0x52, 0x7a, 0x30, 0x01, 0x60, 0xd8, - 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x07, 0x84, - 0x2e, 0x08, 0x4a, 0xf0, 0x2e, 0x08, 0x4b, 0xf0, - 0xb5, 0x90, 0x4f, 0x13, 0x24, 0x00, 0x43, 0xe4, - 0x68, 0xf8, 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x20, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x40, - 0x49, 0x0e, 0x18, 0x41, 0x1e, 0x8a, 0xb4, 0x04, - 0x49, 0x0d, 0x18, 0x40, 0x38, 0x40, 0x8f, 0xc0, - 0x4b, 0x0c, 0x22, 0xff, 0x21, 0x02, 0xf7, 0xff, - 0xfe, 0xbb, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x03, - 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, 0x20, 0x00, + 0x23, 0x03, 0x00, 0x47, 0x9e, 0x00, 0x53, 0xf3, + 0x88, 0x0f, 0x00, 0x7f, 0x53, 0xeb, 0xe0, 0x54, + 0x23, 0x20, 0x40, 0x3b, 0x2b, 0x20, 0xd1, 0x1e, + 0x23, 0x00, 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, + 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, 0x2b, 0x1c, + 0xdb, 0xf3, 0x27, 0x00, 0x00, 0x7b, 0x5a, 0xd5, + 0x42, 0xb5, 0xd1, 0x01, 0x80, 0x0f, 0xe0, 0x02, + 0x37, 0x01, 0x2f, 0x1c, 0xdb, 0xf6, 0x88, 0x0f, + 0x42, 0xb7, 0xd1, 0x36, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x00, + 0x00, 0x5f, 0x5b, 0xd7, 0x42, 0xa7, 0xd1, 0x0a, + 0x00, 0x5f, 0x5b, 0xef, 0x2f, 0x02, 0xd1, 0x01, + 0x80, 0x0b, 0xe0, 0x07, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, 0x33, 0x01, + 0x2b, 0x1c, 0xdb, 0xed, 0x88, 0x0f, 0x4b, 0x14, + 0x42, 0x9f, 0xd1, 0x0a, 0x27, 0x00, 0x00, 0x7b, + 0x5a, 0xd6, 0x4b, 0x11, 0x42, 0x9e, 0xd1, 0x01, + 0x80, 0x0f, 0xe0, 0x02, 0x37, 0x01, 0x2f, 0x1c, + 0xdb, 0xf5, 0x88, 0x0f, 0x4b, 0x0c, 0x42, 0x9f, + 0xd1, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x23, 0x02, 0x00, 0x47, + 0x9e, 0x00, 0x53, 0xf3, 0x88, 0x0f, 0x00, 0x7f, + 0x53, 0xeb, 0x00, 0x43, 0x9d, 0x01, 0x52, 0xec, + 0x88, 0x09, 0x00, 0x49, 0x52, 0x54, 0x04, 0x00, + 0x14, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x49, 0x30, + 0x2e, 0x08, 0x49, 0x70, 0x2e, 0x08, 0x49, 0xb0, + 0x2e, 0x08, 0x48, 0xf8, 0x00, 0x00, 0xb9, 0x6a, + 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0xb0, 0x81, + 0x4a, 0x34, 0x92, 0x00, 0x1c, 0x11, 0x42, 0x97, + 0xd0, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x7c, 0x4a, 0x2e, 0x5b, 0x10, + 0x42, 0x88, 0xd1, 0x05, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x28, 0x53, 0x11, 0x23, 0x00, 0x49, 0x29, + 0x00, 0x5e, 0x5b, 0x8e, 0x42, 0x86, 0xd1, 0x02, + 0x04, 0x1d, 0x0c, 0x2d, 0xe0, 0x02, 0x33, 0x01, + 0x2b, 0x1c, 0xdb, 0xf5, 0x23, 0x00, 0x00, 0x5e, + 0x5b, 0x96, 0x42, 0x86, 0xd1, 0x03, 0x04, 0x1a, + 0x0c, 0x12, 0x92, 0x00, 0xe0, 0x02, 0x33, 0x01, + 0x2b, 0x20, 0xdb, 0xf4, 0x9a, 0x00, 0x4e, 0x1b, + 0x42, 0xb2, 0xd1, 0x0d, 0x22, 0x00, 0x00, 0x53, + 0x5a, 0xcb, 0x42, 0x83, 0xd1, 0x05, 0x23, 0x00, + 0x00, 0x50, 0x4a, 0x19, 0x52, 0x13, 0x52, 0x0e, + 0xe0, 0x02, 0x32, 0x01, 0x2a, 0x1c, 0xdb, 0xf2, + 0x4e, 0x16, 0x5b, 0x30, 0x28, 0x02, 0xd1, 0x05, + 0x23, 0x00, 0x53, 0x33, 0x1c, 0x28, 0x1c, 0x39, + 0xf0, 0x00, 0xf8, 0x38, 0x5b, 0x30, 0x28, 0x01, + 0xd1, 0x0a, 0x1c, 0x38, 0xf7, 0xfc, 0xff, 0xce, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0x43, 0xc0, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x5b, 0x30, 0x28, 0x03, 0xd1, 0x03, 0x1c, 0x28, + 0x1c, 0x39, 0xf7, 0xff, 0xfd, 0xcb, 0x04, 0x38, + 0x14, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x49, 0x30, 0x2e, 0x08, 0x48, 0xf8, + 0x2e, 0x08, 0x49, 0xb0, 0x2e, 0x08, 0x49, 0x70, + 0x04, 0x01, 0x0c, 0x09, 0x20, 0x02, 0x00, 0x4b, + 0x18, 0x5b, 0x00, 0x9b, 0x4a, 0x03, 0x18, 0x99, + 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, 0x80, 0x48, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x47, 0x78, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0x80, 0x04, 0x0f, + 0x0c, 0x3f, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x00, + 0x0e, 0x00, 0xf7, 0xfc, 0xfc, 0x03, 0x20, 0x00, + 0x00, 0x7b, 0x19, 0xdb, 0x00, 0x9b, 0x4a, 0x04, + 0x18, 0x99, 0x81, 0x08, 0x48, 0x03, 0x52, 0xd0, + 0x80, 0x48, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x47, 0x78, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x80, 0x04, 0x09, 0x0c, 0x09, 0x78, 0x42, + 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, 0x05, 0x12, + 0x0d, 0x12, 0x27, 0x00, 0x43, 0xff, 0x32, 0x03, + 0x42, 0x8a, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xf0, 0x05, 0xfd, 0xec, + 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x09, + 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x81, 0x90, 0x00, + 0x06, 0x09, 0x0e, 0x09, 0x06, 0x12, 0x0e, 0x12, + 0xb0, 0x88, 0x4f, 0x16, 0x68, 0xb8, 0x28, 0x0c, + 0xdb, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x09, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x23, 0x00, 0x00, 0x45, 0x46, 0x6e, + 0x53, 0x73, 0x30, 0x01, 0x04, 0x00, 0x14, 0x00, + 0x28, 0x10, 0xdb, 0xf7, 0x02, 0x08, 0x43, 0x10, + 0xab, 0x00, 0x80, 0x18, 0x46, 0x6a, 0x21, 0x04, + 0x98, 0x08, 0xf7, 0xff, 0xfd, 0x95, 0x28, 0x00, + 0xda, 0x01, 0xb0, 0x09, 0xe7, 0xe4, 0x00, 0x81, + 0x4a, 0x05, 0x50, 0x54, 0x9b, 0x0c, 0x4a, 0x05, + 0x50, 0x53, 0x68, 0xb9, 0x31, 0x01, 0x60, 0xb9, + 0xb0, 0x09, 0xe7, 0xd9, 0x2e, 0x08, 0x07, 0x74, + 0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x49, 0xe8, + 0xb5, 0x80, 0x04, 0x07, 0x14, 0x3f, 0xd5, 0x04, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0xf4, + 0x20, 0x00, 0x00, 0xb9, 0x4a, 0x05, 0x50, 0x50, + 0x4a, 0x05, 0x50, 0x50, 0x49, 0x05, 0x68, 0x8a, + 0x3a, 0x01, 0x60, 0x8a, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x49, 0xe8, + 0x2e, 0x08, 0x4a, 0x68, 0x2e, 0x08, 0x07, 0x74, + 0xb5, 0x90, 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, + 0x58, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, + 0xf7, 0xff, 0xff, 0xd6, 0x37, 0x01, 0x2f, 0x20, + 0xdb, 0xf5, 0x20, 0x00, 0x49, 0x03, 0x60, 0xc8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x07, 0x84, 0x2e, 0x08, 0x4b, 0xf0, - 0x2e, 0x08, 0x4a, 0xf0, 0x2e, 0x00, 0x63, 0x73, - 0xb5, 0xf0, 0x04, 0x05, 0x14, 0x2d, 0x1c, 0x0f, - 0x04, 0x11, 0x0c, 0x09, 0x1c, 0x0e, 0x4c, 0x28, - 0x23, 0x02, 0x69, 0x20, 0x42, 0xd8, 0xd0, 0x04, - 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x77, 0x28, 0x00, - 0xd0, 0x06, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xce, + 0x2e, 0x08, 0x49, 0xe8, 0x2e, 0x08, 0x07, 0x74, + 0xb5, 0x00, 0xf7, 0xff, 0xff, 0xe5, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xf0, 0x04, 0x00, 0x14, 0x00, + 0xb0, 0x83, 0x90, 0x00, 0x1c, 0x0f, 0x04, 0x11, + 0x0c, 0x09, 0x24, 0x00, 0x1c, 0x38, 0x1c, 0x1d, + 0x1c, 0x0e, 0xb0, 0x81, 0xf7, 0xff, 0xff, 0x58, + 0x1c, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, 0x03, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x78, 0xf9, 0x02, 0x09, 0x79, 0x3a, 0x43, 0x11, + 0x04, 0x09, 0x0c, 0x09, 0x88, 0x2a, 0x42, 0x91, + 0xd0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x7a, 0x39, 0x02, 0x09, 0x7a, 0x7a, + 0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0x91, 0x00, + 0x7a, 0xb9, 0x02, 0x09, 0x7a, 0xfa, 0x43, 0x11, + 0x05, 0x0b, 0x0d, 0x1b, 0x1d, 0xf9, 0x31, 0x05, + 0x27, 0x00, 0x1d, 0xd8, 0x30, 0x09, 0x1a, 0x32, + 0x2b, 0x00, 0xdd, 0x0a, 0x78, 0x08, 0x28, 0x09, + 0xd1, 0x00, 0x37, 0x01, 0x78, 0x48, 0x1c, 0x85, + 0x1b, 0x5b, 0x18, 0x40, 0x1c, 0x81, 0x2b, 0x00, + 0xdc, 0xf4, 0x2a, 0x00, 0xdd, 0x36, 0x48, 0x26, + 0x88, 0x06, 0x96, 0x03, 0x88, 0x85, 0x95, 0x02, + 0x78, 0xc8, 0x02, 0x00, 0x79, 0x0b, 0x43, 0x18, + 0x05, 0x00, 0x0d, 0x00, 0x78, 0x0b, 0x2b, 0x01, + 0xd0, 0x01, 0x2b, 0x02, 0xd1, 0x06, 0x78, 0x4d, + 0x02, 0x2d, 0x78, 0x8e, 0x43, 0x35, 0x04, 0xed, + 0x0c, 0xed, 0x9e, 0x03, 0x2b, 0x04, 0xd0, 0x01, + 0x2b, 0x03, 0xd1, 0x09, 0x78, 0x4b, 0x02, 0x1b, + 0x78, 0x8d, 0x43, 0x2b, 0x04, 0xdb, 0x0c, 0xdb, + 0x9d, 0x02, 0x42, 0xab, 0xd1, 0x00, 0x24, 0x01, + 0x1d, 0x43, 0x1a, 0xd2, 0x31, 0x05, 0x28, 0x00, + 0xdd, 0x0a, 0x78, 0x0b, 0x2b, 0x09, 0xd1, 0x00, + 0x37, 0x01, 0x78, 0x4b, 0x1c, 0x9d, 0x1b, 0x40, + 0x18, 0x59, 0x31, 0x02, 0x28, 0x00, 0xdc, 0xf4, + 0x2a, 0x00, 0xdc, 0xcd, 0x2c, 0x00, 0xd0, 0x09, + 0xf7, 0xff, 0xff, 0x62, 0x99, 0x00, 0x48, 0x09, + 0x80, 0x01, 0x2f, 0x00, 0xd1, 0x07, 0xf7, 0xfa, + 0xf8, 0x45, 0xe0, 0x04, 0x98, 0x01, 0xf7, 0xff, + 0xff, 0x37, 0xf0, 0x00, 0xf8, 0x23, 0x20, 0x00, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x00, 0x08, + 0xb4, 0x90, 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0f, + 0x0c, 0x3f, 0x4b, 0x07, 0x68, 0xd8, 0x28, 0x80, + 0xda, 0x08, 0x2a, 0x00, 0xd0, 0x06, 0x00, 0x41, + 0x4c, 0x04, 0x52, 0x67, 0x4f, 0x04, 0x52, 0x7a, + 0x30, 0x01, 0x60, 0xd8, 0xbc, 0x90, 0x47, 0x70, + 0x2e, 0x08, 0x07, 0x74, 0x2e, 0x08, 0x4a, 0xe8, + 0x2e, 0x08, 0x4b, 0xe8, 0xb5, 0x90, 0x4f, 0x13, + 0x24, 0x00, 0x43, 0xe4, 0x68, 0xf8, 0x28, 0x00, + 0xd1, 0x03, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x40, 0x49, 0x0e, 0x18, 0x41, + 0x1e, 0x8a, 0xb4, 0x04, 0x49, 0x0d, 0x18, 0x40, + 0x38, 0x40, 0x8f, 0xc0, 0x4b, 0x0c, 0x22, 0xff, + 0x21, 0x02, 0xf7, 0xff, 0xfe, 0xbb, 0xb0, 0x01, + 0x28, 0x00, 0xda, 0x03, 0x1c, 0x20, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf8, 0x38, 0x01, + 0x60, 0xf8, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74, + 0x2e, 0x08, 0x4b, 0xe8, 0x2e, 0x08, 0x4a, 0xe8, + 0x2e, 0x00, 0x64, 0x57, 0xb5, 0xf0, 0x04, 0x05, + 0x14, 0x2d, 0x1c, 0x0f, 0x04, 0x11, 0x0c, 0x09, + 0x1c, 0x0e, 0x4c, 0x28, 0x23, 0x02, 0x69, 0x20, + 0x42, 0xd8, 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0x77, 0x28, 0x00, 0xd0, 0x06, 0x1c, 0x28, + 0xf7, 0xff, 0xfe, 0xce, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x79, 0xb8, 0x69, 0x21, + 0x42, 0x88, 0xd1, 0x09, 0x20, 0x01, 0x43, 0xc0, + 0x61, 0x20, 0x1c, 0x28, 0xf7, 0xff, 0xfe, 0xc0, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x79, 0xb8, 0x69, 0x21, 0x42, 0x88, 0xd1, 0x09, - 0x20, 0x01, 0x43, 0xc0, 0x61, 0x20, 0x1c, 0x28, - 0xf7, 0xff, 0xfe, 0xc0, 0x20, 0x00, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x23, 0x01, 0x42, 0xd9, - 0xd1, 0x02, 0x61, 0x20, 0x20, 0x00, 0x60, 0xe0, - 0x37, 0x08, 0x1f, 0xf4, 0x3c, 0x05, 0x2c, 0x00, - 0xdd, 0x11, 0x78, 0x38, 0x02, 0x00, 0x78, 0x79, - 0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, 0x78, 0xb9, - 0x02, 0x09, 0x78, 0xfa, 0x43, 0x11, 0x04, 0xc9, - 0x0c, 0xc9, 0xf7, 0xff, 0xff, 0x77, 0x37, 0x04, - 0x3c, 0x04, 0x2c, 0x00, 0xdc, 0xed, 0xf7, 0xff, - 0xff, 0x8b, 0xf7, 0xff, 0xff, 0x89, 0xf7, 0xff, - 0xff, 0x87, 0xf7, 0xff, 0xff, 0x85, 0xf7, 0xff, - 0xff, 0x83, 0xf7, 0xff, 0xff, 0x81, 0xf7, 0xff, - 0xff, 0x7f, 0xf7, 0xff, 0xff, 0x7d, 0x20, 0x00, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x07, 0x84, 0xb5, 0xf0, 0x04, 0x04, - 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x26, 0x00, - 0x43, 0xf6, 0x4f, 0x0f, 0x62, 0x3e, 0x61, 0xfe, - 0x61, 0xbe, 0xf7, 0xff, 0xfe, 0x9b, 0x2d, 0x00, - 0xd0, 0x13, 0x2c, 0x00, 0xd0, 0x11, 0x0c, 0xf0, - 0x42, 0x85, 0xd0, 0x0e, 0x42, 0x84, 0xd0, 0x0c, - 0x80, 0x3c, 0x80, 0xbd, 0x20, 0x00, 0x61, 0x3e, - 0x22, 0x00, 0x61, 0x78, 0xb4, 0x04, 0x4b, 0x05, - 0x22, 0xff, 0x21, 0x00, 0xf7, 0xff, 0xfe, 0x28, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x07, 0x84, 0x2e, 0x00, 0x65, 0x35, - 0x56, 0x47, 0x41, 0x38, 0x78, 0x31, 0x36, 0x00, - 0xb5, 0x00, 0xb0, 0x81, 0x48, 0x05, 0x69, 0xc0, - 0x68, 0x80, 0x46, 0x6b, 0x22, 0x00, 0x21, 0x00, - 0xf0, 0x0d, 0xfb, 0x5e, 0xb0, 0x01, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0xf0, 0x27, 0x00, 0xb0, 0x85, 0x97, 0x00, - 0x26, 0x10, 0x96, 0x01, 0x25, 0x05, 0x01, 0xed, - 0x95, 0x02, 0x20, 0xff, 0x30, 0xd1, 0x90, 0x03, - 0x97, 0x04, 0x22, 0x00, 0x21, 0x00, 0xb4, 0x06, - 0x4c, 0x0d, 0x69, 0xe0, 0x68, 0x81, 0x1c, 0x08, - 0xaa, 0x02, 0x1c, 0x3b, 0xf0, 0x0d, 0xfd, 0xc6, - 0xb0, 0x02, 0x97, 0x00, 0x20, 0xff, 0x30, 0xd1, - 0x90, 0x01, 0x95, 0x02, 0x96, 0x03, 0x97, 0x04, - 0x69, 0xe0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0d, - 0xfc, 0xf7, 0xf7, 0xff, 0xff, 0xc9, 0xb0, 0x05, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x55, 0x18, 0xb5, 0x90, 0x20, 0x07, - 0xb0, 0x85, 0xf0, 0x03, 0xf8, 0xc1, 0x24, 0xff, - 0x34, 0xe1, 0x22, 0x05, 0x01, 0xd2, 0x21, 0x00, - 0x20, 0x07, 0x1c, 0x23, 0xf0, 0x03, 0xf8, 0xd0, - 0x27, 0x00, 0x22, 0x00, 0x21, 0x02, 0x20, 0x07, - 0x1c, 0x3b, 0xf0, 0x03, 0xfc, 0x79, 0x22, 0x01, - 0x21, 0x01, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x03, - 0xfc, 0x2b, 0x22, 0x32, 0x21, 0x32, 0x20, 0x07, - 0xf0, 0x03, 0xf9, 0x86, 0x97, 0x00, 0x97, 0x01, - 0x20, 0x05, 0x01, 0xc0, 0x90, 0x02, 0x94, 0x03, - 0x97, 0x04, 0x48, 0x06, 0x69, 0xc0, 0x68, 0x80, - 0x46, 0x69, 0xf0, 0x0d, 0xfc, 0xc1, 0xf7, 0xff, - 0xff, 0x93, 0xb0, 0x05, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0xb4, 0x80, 0x01, 0x00, 0x4b, 0x2a, 0x18, 0xc0, - 0x4b, 0x2a, 0x69, 0xdb, 0x69, 0x9f, 0x00, 0x8b, - 0x18, 0x59, 0x02, 0x09, 0x18, 0x89, 0x18, 0x79, - 0x78, 0x02, 0x70, 0x0a, 0x78, 0x42, 0x1d, 0xcb, - 0x33, 0x39, 0x74, 0x1a, 0x78, 0x82, 0x1d, 0xcb, - 0x33, 0x99, 0x70, 0x1a, 0x78, 0xc2, 0x1d, 0xcb, - 0x33, 0xd9, 0x74, 0x1a, 0x79, 0x02, 0x1d, 0xcb, - 0x33, 0xff, 0x33, 0x3a, 0x70, 0x1a, 0x79, 0x42, - 0x1d, 0xcb, 0x33, 0xff, 0x33, 0x7a, 0x74, 0x1a, - 0x79, 0x82, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0xda, - 0x70, 0x1a, 0x79, 0xc2, 0x23, 0x11, 0x01, 0x5b, - 0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x02, 0x23, 0x05, - 0x01, 0xdb, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0x42, - 0x23, 0x0b, 0x01, 0x9b, 0x18, 0xcb, 0x74, 0x1a, - 0x7a, 0x82, 0x23, 0x19, 0x01, 0x5b, 0x18, 0xcb, - 0x70, 0x1a, 0x7a, 0xc2, 0x23, 0x1b, 0x01, 0x5b, - 0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x02, 0x23, 0x0f, - 0x01, 0x9b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0x42, - 0x23, 0x01, 0x02, 0x9b, 0x18, 0xcb, 0x74, 0x1a, - 0x7b, 0x82, 0x23, 0x23, 0x01, 0x5b, 0x18, 0xcb, - 0x70, 0x1a, 0x7b, 0xc0, 0x23, 0x25, 0x01, 0x5b, - 0x18, 0xc9, 0x74, 0x08, 0xbc, 0x80, 0x47, 0x70, - 0x2e, 0x08, 0x07, 0xa8, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0xb0, 0x23, 0x00, 0x1c, 0x07, 0x56, 0xc0, - 0x1c, 0x14, 0x1c, 0x0d, 0x28, 0x00, 0xd0, 0x0f, - 0x20, 0x50, 0x1c, 0x21, 0xf0, 0x11, 0xfe, 0x7a, - 0x19, 0x41, 0x23, 0x00, 0x56, 0xf8, 0x1c, 0x22, - 0xf7, 0xff, 0xff, 0x92, 0x23, 0x00, 0x37, 0x01, - 0x56, 0xf8, 0x34, 0x01, 0x28, 0x00, 0xd1, 0xef, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, - 0x06, 0x00, 0x0e, 0x00, 0x04, 0x09, 0x14, 0x09, - 0x04, 0x17, 0x14, 0x3f, 0x09, 0x03, 0xb0, 0x81, - 0x4a, 0x08, 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, - 0x07, 0x00, 0x0f, 0x00, 0x5c, 0x10, 0x70, 0x58, - 0x20, 0x00, 0x70, 0x98, 0x46, 0x68, 0x1c, 0x3a, - 0xf7, 0xff, 0xff, 0xce, 0xb0, 0x01, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xc0, - 0xb5, 0x90, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, - 0x14, 0x09, 0x04, 0x17, 0x14, 0x3f, 0x0b, 0x03, - 0xb0, 0x82, 0x4a, 0x0f, 0x5c, 0xd4, 0xab, 0x00, - 0x70, 0x1c, 0x0a, 0x03, 0x07, 0x1b, 0x0f, 0x1b, - 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x5c, 0x09, 0x03, - 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00, - 0x70, 0x9c, 0x07, 0x00, 0x0f, 0x00, 0x5c, 0x10, - 0x70, 0xd8, 0x20, 0x00, 0x71, 0x18, 0x46, 0x68, - 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xa5, 0xb0, 0x02, + 0x23, 0x01, 0x42, 0xd9, 0xd1, 0x02, 0x61, 0x20, + 0x20, 0x00, 0x60, 0xe0, 0x37, 0x08, 0x1f, 0xf4, + 0x3c, 0x05, 0x2c, 0x00, 0xdd, 0x11, 0x78, 0x38, + 0x02, 0x00, 0x78, 0x79, 0x43, 0x08, 0x04, 0x00, + 0x0c, 0x00, 0x78, 0xb9, 0x02, 0x09, 0x78, 0xfa, + 0x43, 0x11, 0x04, 0xc9, 0x0c, 0xc9, 0xf7, 0xff, + 0xff, 0x77, 0x37, 0x04, 0x3c, 0x04, 0x2c, 0x00, + 0xdc, 0xed, 0xf7, 0xff, 0xff, 0x8b, 0xf7, 0xff, + 0xff, 0x89, 0xf7, 0xff, 0xff, 0x87, 0xf7, 0xff, + 0xff, 0x85, 0xf7, 0xff, 0xff, 0x83, 0xf7, 0xff, + 0xff, 0x81, 0xf7, 0xff, 0xff, 0x7f, 0xf7, 0xff, + 0xff, 0x7d, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x07, 0x74, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x26, 0x00, 0x43, 0xf6, 0x4f, 0x0f, + 0x62, 0x3e, 0x61, 0xfe, 0x61, 0xbe, 0xf7, 0xff, + 0xfe, 0x9b, 0x2d, 0x00, 0xd0, 0x13, 0x2c, 0x00, + 0xd0, 0x11, 0x0c, 0xf0, 0x42, 0x85, 0xd0, 0x0e, + 0x42, 0x84, 0xd0, 0x0c, 0x80, 0x3c, 0x80, 0xbd, + 0x20, 0x00, 0x61, 0x3e, 0x22, 0x00, 0x61, 0x78, + 0xb4, 0x04, 0x4b, 0x05, 0x22, 0xff, 0x21, 0x00, + 0xf7, 0xff, 0xfe, 0x28, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x07, 0x74, + 0x2e, 0x00, 0x66, 0x19, 0x56, 0x47, 0x41, 0x38, + 0x78, 0x31, 0x36, 0x00, 0xb5, 0x00, 0xb0, 0x81, + 0x48, 0x05, 0x69, 0xc0, 0x68, 0x80, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x00, 0xf0, 0x0d, 0xfe, 0x7a, + 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x27, 0x00, + 0xb0, 0x85, 0x97, 0x00, 0x26, 0x10, 0x96, 0x01, + 0x25, 0x05, 0x01, 0xed, 0x95, 0x02, 0x20, 0xff, + 0x30, 0xd1, 0x90, 0x03, 0x97, 0x04, 0x22, 0x00, + 0x21, 0x00, 0xb4, 0x06, 0x4c, 0x0d, 0x69, 0xe0, + 0x68, 0x81, 0x1c, 0x08, 0xaa, 0x02, 0x1c, 0x3b, + 0xf0, 0x0e, 0xf8, 0xe2, 0xb0, 0x02, 0x97, 0x00, + 0x20, 0xff, 0x30, 0xd1, 0x90, 0x01, 0x95, 0x02, + 0x96, 0x03, 0x97, 0x04, 0x69, 0xe0, 0x68, 0x80, + 0x46, 0x69, 0xf0, 0x0e, 0xf8, 0x13, 0xf7, 0xff, + 0xff, 0xc9, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10, + 0xb5, 0x90, 0x20, 0x07, 0xb0, 0x85, 0xf0, 0x03, + 0xfb, 0xfd, 0x24, 0xff, 0x34, 0xe1, 0x22, 0x05, + 0x01, 0xd2, 0x21, 0x00, 0x20, 0x07, 0x1c, 0x23, + 0xf0, 0x03, 0xfc, 0x0c, 0x27, 0x00, 0x22, 0x00, + 0x21, 0x02, 0x20, 0x07, 0x1c, 0x3b, 0xf0, 0x03, + 0xff, 0xcf, 0x22, 0x01, 0x21, 0x01, 0x20, 0x07, + 0x1c, 0x3b, 0xf0, 0x03, 0xff, 0x67, 0x22, 0x32, + 0x21, 0x32, 0x20, 0x07, 0xf0, 0x03, 0xfc, 0xc2, + 0x97, 0x00, 0x97, 0x01, 0x20, 0x05, 0x01, 0xc0, + 0x90, 0x02, 0x94, 0x03, 0x97, 0x04, 0x48, 0x06, + 0x69, 0xc0, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0d, + 0xff, 0xdd, 0xf7, 0xff, 0xff, 0x93, 0xb0, 0x05, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x17, 0xc0, 0xb5, 0x90, 0x04, 0x0f, - 0x14, 0x3f, 0x04, 0x12, 0x14, 0x12, 0x0f, 0x03, - 0xb0, 0x83, 0x49, 0x1b, 0x5c, 0xcc, 0xab, 0x00, - 0x70, 0x1c, 0x0e, 0x03, 0x07, 0x1b, 0x0f, 0x1b, - 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x5c, 0x0d, 0x03, + 0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x01, 0x00, + 0x4b, 0x2a, 0x18, 0xc0, 0x4b, 0x2a, 0x69, 0xdb, + 0x69, 0x9f, 0x00, 0x8b, 0x18, 0x59, 0x02, 0x09, + 0x18, 0x89, 0x18, 0x79, 0x78, 0x02, 0x70, 0x0a, + 0x78, 0x42, 0x1d, 0xcb, 0x33, 0x39, 0x74, 0x1a, + 0x78, 0x82, 0x1d, 0xcb, 0x33, 0x99, 0x70, 0x1a, + 0x78, 0xc2, 0x1d, 0xcb, 0x33, 0xd9, 0x74, 0x1a, + 0x79, 0x02, 0x1d, 0xcb, 0x33, 0xff, 0x33, 0x3a, + 0x70, 0x1a, 0x79, 0x42, 0x1d, 0xcb, 0x33, 0xff, + 0x33, 0x7a, 0x74, 0x1a, 0x79, 0x82, 0x1d, 0xcb, + 0x33, 0xff, 0x33, 0xda, 0x70, 0x1a, 0x79, 0xc2, + 0x23, 0x11, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, + 0x7a, 0x02, 0x23, 0x05, 0x01, 0xdb, 0x18, 0xcb, + 0x70, 0x1a, 0x7a, 0x42, 0x23, 0x0b, 0x01, 0x9b, + 0x18, 0xcb, 0x74, 0x1a, 0x7a, 0x82, 0x23, 0x19, + 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7a, 0xc2, + 0x23, 0x1b, 0x01, 0x5b, 0x18, 0xcb, 0x74, 0x1a, + 0x7b, 0x02, 0x23, 0x0f, 0x01, 0x9b, 0x18, 0xcb, + 0x70, 0x1a, 0x7b, 0x42, 0x23, 0x01, 0x02, 0x9b, + 0x18, 0xcb, 0x74, 0x1a, 0x7b, 0x82, 0x23, 0x23, + 0x01, 0x5b, 0x18, 0xcb, 0x70, 0x1a, 0x7b, 0xc0, + 0x23, 0x25, 0x01, 0x5b, 0x18, 0xc9, 0x74, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x07, 0x98, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x23, 0x00, + 0x1c, 0x07, 0x56, 0xc0, 0x1c, 0x14, 0x1c, 0x0d, + 0x28, 0x00, 0xd0, 0x0f, 0x20, 0x50, 0x1c, 0x21, + 0xf0, 0x12, 0xf9, 0x96, 0x19, 0x41, 0x23, 0x00, + 0x56, 0xf8, 0x1c, 0x22, 0xf7, 0xff, 0xff, 0x92, + 0x23, 0x00, 0x37, 0x01, 0x56, 0xf8, 0x34, 0x01, + 0x28, 0x00, 0xd1, 0xef, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x06, 0x00, 0x0e, 0x00, + 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, 0x14, 0x3f, + 0x09, 0x03, 0xb0, 0x81, 0x4a, 0x08, 0x5c, 0xd4, + 0xab, 0x00, 0x70, 0x1c, 0x07, 0x00, 0x0f, 0x00, + 0x5c, 0x10, 0x70, 0x58, 0x20, 0x00, 0x70, 0x98, + 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xce, + 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xb0, 0xb5, 0x90, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x17, + 0x14, 0x3f, 0x0b, 0x03, 0xb0, 0x82, 0x4a, 0x0f, + 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x1c, 0x0a, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xd4, 0xab, 0x00, + 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xd4, 0xab, 0x00, 0x70, 0x9c, 0x07, 0x00, + 0x0f, 0x00, 0x5c, 0x10, 0x70, 0xd8, 0x20, 0x00, + 0x71, 0x18, 0x46, 0x68, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0xa5, 0xb0, 0x02, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0, + 0xb5, 0x90, 0x04, 0x0f, 0x14, 0x3f, 0x04, 0x12, + 0x14, 0x12, 0x0f, 0x03, 0xb0, 0x83, 0x49, 0x1b, + 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x1c, 0x0e, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, - 0x70, 0x9c, 0x0c, 0x03, 0x07, 0x1b, 0x0f, 0x1b, - 0x5c, 0xcc, 0xab, 0x00, 0x70, 0xdc, 0x0b, 0x03, - 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x01, - 0x70, 0x1c, 0x0a, 0x03, 0x07, 0x1b, 0x0f, 0x1b, - 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x5c, 0x09, 0x03, + 0x70, 0x5c, 0x0d, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x00, 0x70, 0x9c, 0x0c, 0x03, + 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x00, + 0x70, 0xdc, 0x0b, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x1c, 0x0a, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 0x5c, 0xcc, 0xab, 0x01, - 0x70, 0x9c, 0x07, 0x00, 0x0f, 0x00, 0x5c, 0x08, - 0x70, 0xd8, 0x20, 0x00, 0x71, 0x18, 0x46, 0x68, - 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x65, 0xb0, 0x03, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x17, 0xc0, 0xb5, 0xf0, 0x1c, 0x04, - 0x04, 0x10, 0x14, 0x00, 0xb0, 0x81, 0x90, 0x00, - 0x04, 0x1e, 0x14, 0x36, 0x22, 0x3c, 0x1c, 0x20, - 0x1c, 0x0f, 0xb0, 0x85, 0xf0, 0x11, 0xfe, 0x0e, - 0xa3, 0x72, 0xcb, 0x0c, 0xf0, 0x11, 0xfe, 0x1a, - 0xf0, 0x11, 0xfe, 0x1c, 0x4d, 0x71, 0x5c, 0x28, - 0xab, 0x02, 0x70, 0x18, 0x22, 0x38, 0x1c, 0x20, - 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xff, 0xa3, 0x6b, - 0xcb, 0x0c, 0xf0, 0x11, 0xfe, 0x0b, 0xf0, 0x11, - 0xfe, 0x0d, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x58, - 0x22, 0x34, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, - 0xfd, 0xf1, 0xa3, 0x64, 0xcb, 0x0c, 0xf0, 0x11, - 0xfd, 0xfd, 0xf0, 0x11, 0xfd, 0xff, 0x5c, 0x28, - 0xab, 0x02, 0x70, 0x98, 0x22, 0x30, 0x1c, 0x20, - 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xe3, 0xa3, 0x5d, - 0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0xef, 0xf0, 0x11, - 0xfd, 0xf1, 0x5c, 0x28, 0xab, 0x02, 0x70, 0xd8, - 0x22, 0x2c, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, - 0xfd, 0xd5, 0xa3, 0x56, 0xcb, 0x0c, 0xf0, 0x11, - 0xfd, 0xe1, 0xf0, 0x11, 0xfd, 0xe3, 0x5c, 0x28, - 0xab, 0x03, 0x70, 0x18, 0x22, 0x28, 0x1c, 0x20, - 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xc7, 0xa3, 0x4f, - 0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0xd3, 0xf0, 0x11, - 0xfd, 0xd5, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x58, - 0x22, 0x24, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, - 0xfd, 0xb9, 0xa3, 0x48, 0xcb, 0x0c, 0xf0, 0x11, - 0xfd, 0xc5, 0xf0, 0x11, 0xfd, 0xc7, 0x5c, 0x28, - 0xab, 0x03, 0x70, 0x98, 0x22, 0x20, 0x1c, 0x20, - 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0xab, 0xa3, 0x41, - 0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0xb7, 0xf0, 0x11, - 0xfd, 0xb9, 0x5c, 0x28, 0xab, 0x03, 0x70, 0xd8, - 0x22, 0x1c, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, - 0xfd, 0x9d, 0xa3, 0x3a, 0xcb, 0x0c, 0xf0, 0x11, - 0xfd, 0xa9, 0xf0, 0x11, 0xfd, 0xab, 0x5c, 0x28, - 0xab, 0x00, 0x70, 0x18, 0x22, 0x18, 0x1c, 0x20, - 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x8f, 0xa3, 0x33, - 0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0x9b, 0xf0, 0x11, - 0xfd, 0x9d, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x58, - 0x22, 0x14, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, - 0xfd, 0x81, 0xa3, 0x2c, 0xcb, 0x0c, 0xf0, 0x11, - 0xfd, 0x8d, 0xf0, 0x11, 0xfd, 0x8f, 0x5c, 0x28, - 0xab, 0x00, 0x70, 0x98, 0x22, 0x10, 0x1c, 0x20, - 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x73, 0xa3, 0x25, - 0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0x7f, 0xf0, 0x11, - 0xfd, 0x81, 0x5c, 0x28, 0xab, 0x00, 0x70, 0xd8, - 0x22, 0x0c, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, - 0xfd, 0x65, 0xa3, 0x1e, 0xcb, 0x0c, 0xf0, 0x11, - 0xfd, 0x71, 0xf0, 0x11, 0xfd, 0x73, 0x5c, 0x28, - 0xab, 0x01, 0x70, 0x18, 0x22, 0x08, 0x1c, 0x20, - 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x57, 0xa3, 0x17, - 0xcb, 0x0c, 0xf0, 0x11, 0xfd, 0x63, 0xf0, 0x11, - 0xfd, 0x65, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x58, - 0x22, 0x04, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, - 0xfd, 0x49, 0xa3, 0x10, 0xcb, 0x0c, 0xf0, 0x11, - 0xfd, 0x55, 0xf0, 0x11, 0xfd, 0x57, 0x5c, 0x28, - 0xab, 0x01, 0x70, 0x98, 0xa3, 0x0b, 0xcb, 0x0c, - 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x11, 0xfd, 0x4a, - 0xf0, 0x11, 0xfd, 0x4c, 0x5c, 0x28, 0xab, 0x01, - 0x70, 0xd8, 0x20, 0x00, 0x73, 0x18, 0x46, 0x68, - 0x99, 0x05, 0x1c, 0x32, 0x33, 0x0c, 0xf7, 0xff, - 0xfe, 0x6f, 0xb0, 0x06, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xc0, - 0x21, 0x00, 0xb0, 0x81, 0x91, 0x00, 0xe0, 0x02, - 0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0x99, 0x00, - 0x42, 0x81, 0xdb, 0xf9, 0xb0, 0x01, 0x47, 0x70, - 0xb5, 0xf0, 0x06, 0x06, 0x0e, 0x36, 0x25, 0x02, - 0x48, 0x0d, 0x60, 0x05, 0x27, 0x07, 0x4c, 0x0d, - 0x60, 0x25, 0x20, 0x01, 0x40, 0xb8, 0x40, 0x30, - 0xd0, 0x01, 0x20, 0x03, 0xe0, 0x00, 0x20, 0x02, - 0x49, 0x09, 0x60, 0x08, 0x20, 0x0a, 0xf7, 0xff, - 0xff, 0xdf, 0x20, 0x03, 0x60, 0x20, 0x20, 0x0c, - 0xf7, 0xff, 0xff, 0xda, 0x3f, 0x01, 0xd5, 0xeb, + 0x70, 0x5c, 0x09, 0x03, 0x07, 0x1b, 0x0f, 0x1b, + 0x5c, 0xcc, 0xab, 0x01, 0x70, 0x9c, 0x07, 0x00, + 0x0f, 0x00, 0x5c, 0x08, 0x70, 0xd8, 0x20, 0x00, + 0x71, 0x18, 0x46, 0x68, 0x1c, 0x39, 0xf7, 0xff, + 0xff, 0x65, 0xb0, 0x03, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xb0, + 0xb5, 0xf0, 0x1c, 0x04, 0x04, 0x10, 0x14, 0x00, + 0xb0, 0x81, 0x90, 0x00, 0x04, 0x1e, 0x14, 0x36, + 0x22, 0x3c, 0x1c, 0x20, 0x1c, 0x0f, 0xb0, 0x85, + 0xf0, 0x12, 0xf9, 0x2a, 0xa3, 0x72, 0xcb, 0x0c, + 0xf0, 0x12, 0xf9, 0x36, 0xf0, 0x12, 0xf9, 0x38, + 0x4d, 0x71, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x18, + 0x22, 0x38, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, + 0xf9, 0x1b, 0xa3, 0x6b, 0xcb, 0x0c, 0xf0, 0x12, + 0xf9, 0x27, 0xf0, 0x12, 0xf9, 0x29, 0x5c, 0x28, + 0xab, 0x02, 0x70, 0x58, 0x22, 0x34, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x12, 0xf9, 0x0d, 0xa3, 0x64, + 0xcb, 0x0c, 0xf0, 0x12, 0xf9, 0x19, 0xf0, 0x12, + 0xf9, 0x1b, 0x5c, 0x28, 0xab, 0x02, 0x70, 0x98, + 0x22, 0x30, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, + 0xf8, 0xff, 0xa3, 0x5d, 0xcb, 0x0c, 0xf0, 0x12, + 0xf9, 0x0b, 0xf0, 0x12, 0xf9, 0x0d, 0x5c, 0x28, + 0xab, 0x02, 0x70, 0xd8, 0x22, 0x2c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xf1, 0xa3, 0x56, + 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xfd, 0xf0, 0x12, + 0xf8, 0xff, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x18, + 0x22, 0x28, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, + 0xf8, 0xe3, 0xa3, 0x4f, 0xcb, 0x0c, 0xf0, 0x12, + 0xf8, 0xef, 0xf0, 0x12, 0xf8, 0xf1, 0x5c, 0x28, + 0xab, 0x03, 0x70, 0x58, 0x22, 0x24, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xd5, 0xa3, 0x48, + 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xe1, 0xf0, 0x12, + 0xf8, 0xe3, 0x5c, 0x28, 0xab, 0x03, 0x70, 0x98, + 0x22, 0x20, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, + 0xf8, 0xc7, 0xa3, 0x41, 0xcb, 0x0c, 0xf0, 0x12, + 0xf8, 0xd3, 0xf0, 0x12, 0xf8, 0xd5, 0x5c, 0x28, + 0xab, 0x03, 0x70, 0xd8, 0x22, 0x1c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0xb9, 0xa3, 0x3a, + 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xc5, 0xf0, 0x12, + 0xf8, 0xc7, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x18, + 0x22, 0x18, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, + 0xf8, 0xab, 0xa3, 0x33, 0xcb, 0x0c, 0xf0, 0x12, + 0xf8, 0xb7, 0xf0, 0x12, 0xf8, 0xb9, 0x5c, 0x28, + 0xab, 0x00, 0x70, 0x58, 0x22, 0x14, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x9d, 0xa3, 0x2c, + 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0xa9, 0xf0, 0x12, + 0xf8, 0xab, 0x5c, 0x28, 0xab, 0x00, 0x70, 0x98, + 0x22, 0x10, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, + 0xf8, 0x8f, 0xa3, 0x25, 0xcb, 0x0c, 0xf0, 0x12, + 0xf8, 0x9b, 0xf0, 0x12, 0xf8, 0x9d, 0x5c, 0x28, + 0xab, 0x00, 0x70, 0xd8, 0x22, 0x0c, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x81, 0xa3, 0x1e, + 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x8d, 0xf0, 0x12, + 0xf8, 0x8f, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x18, + 0x22, 0x08, 0x1c, 0x20, 0x1c, 0x39, 0xf0, 0x12, + 0xf8, 0x73, 0xa3, 0x17, 0xcb, 0x0c, 0xf0, 0x12, + 0xf8, 0x7f, 0xf0, 0x12, 0xf8, 0x81, 0x5c, 0x28, + 0xab, 0x01, 0x70, 0x58, 0x22, 0x04, 0x1c, 0x20, + 0x1c, 0x39, 0xf0, 0x12, 0xf8, 0x65, 0xa3, 0x10, + 0xcb, 0x0c, 0xf0, 0x12, 0xf8, 0x71, 0xf0, 0x12, + 0xf8, 0x73, 0x5c, 0x28, 0xab, 0x01, 0x70, 0x98, + 0xa3, 0x0b, 0xcb, 0x0c, 0x1c, 0x20, 0x1c, 0x39, + 0xf0, 0x12, 0xf8, 0x66, 0xf0, 0x12, 0xf8, 0x68, + 0x5c, 0x28, 0xab, 0x01, 0x70, 0xd8, 0x20, 0x00, + 0x73, 0x18, 0x46, 0x68, 0x99, 0x05, 0x1c, 0x32, + 0x33, 0x0c, 0xf7, 0xff, 0xfe, 0x6f, 0xb0, 0x06, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x13, 0x00, - 0x6e, 0x00, 0x12, 0x00, 0xb5, 0x80, 0x06, 0x00, - 0x0e, 0x00, 0x06, 0x0f, 0x0e, 0x3f, 0x06, 0x00, - 0x0e, 0x00, 0x23, 0x80, 0x43, 0x18, 0xf7, 0xff, - 0xff, 0xcf, 0x20, 0x14, 0xf7, 0xff, 0xff, 0xc0, - 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xc9, 0x20, 0x03, - 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0x49, 0x04, - 0x60, 0x08, 0x49, 0x04, 0x60, 0x08, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x14, 0x00, - 0x6e, 0x00, 0x12, 0x00, 0x6e, 0x00, 0x13, 0x00, - 0xb5, 0x00, 0x21, 0x01, 0x20, 0x02, 0xf7, 0xff, - 0xff, 0xd9, 0x48, 0x10, 0xf7, 0xff, 0xff, 0xa4, - 0x21, 0x00, 0x20, 0x02, 0xf7, 0xff, 0xff, 0xd2, - 0x48, 0x0d, 0xf7, 0xff, 0xff, 0x9d, 0x21, 0x44, - 0x20, 0x00, 0xf7, 0xff, 0xff, 0xcb, 0x21, 0x81, - 0x20, 0x01, 0xf7, 0xff, 0xff, 0xc7, 0x21, 0xf0, - 0x20, 0x02, 0xf7, 0xff, 0xff, 0xc3, 0x21, 0x45, - 0x20, 0x03, 0xf7, 0xff, 0xff, 0xbf, 0x21, 0x45, - 0x20, 0x04, 0xf7, 0xff, 0xff, 0xbb, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x20, - 0x00, 0x00, 0xc3, 0x50, 0xb5, 0x80, 0x06, 0x07, - 0x0e, 0x3f, 0x06, 0x08, 0x0e, 0x00, 0x28, 0x45, - 0xdd, 0x00, 0x20, 0x45, 0x1d, 0xc1, 0x31, 0x79, - 0x20, 0x03, 0xf7, 0xff, 0xff, 0xa7, 0x2f, 0x45, - 0xdd, 0x00, 0x27, 0x45, 0x20, 0x04, 0x1d, 0xf9, - 0x31, 0x79, 0xf7, 0xff, 0xff, 0x9f, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0xf0, 0x15, - 0xfb, 0xad, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, - 0xf0, 0x15, 0xfb, 0xac, 0xf0, 0x15, 0xfb, 0xa6, - 0x23, 0x01, 0x03, 0x9b, 0x43, 0x18, 0xf0, 0x15, - 0xfb, 0xa5, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, - 0xf0, 0x15, 0xfb, 0x9c, 0x4b, 0x05, 0x40, 0x18, - 0xf0, 0x15, 0xfb, 0x9c, 0xf0, 0x15, 0xfb, 0x96, - 0x4b, 0x03, 0x40, 0x18, 0xf0, 0x15, 0xfb, 0x96, - 0xbc, 0x08, 0x47, 0x18, 0xff, 0xff, 0xbf, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xb5, 0x80, 0x1c, 0x07, - 0xf7, 0xff, 0xff, 0xd8, 0x07, 0xf8, 0x0f, 0x40, - 0x49, 0x0a, 0x58, 0x08, 0x0c, 0x39, 0xd3, 0x05, - 0x23, 0x01, 0x02, 0x5b, 0x68, 0x01, 0x43, 0x19, - 0x60, 0x01, 0xe0, 0x03, 0x68, 0x01, 0x4b, 0x06, - 0x40, 0x19, 0x60, 0x01, 0xf0, 0x0e, 0xf8, 0x9a, - 0xf7, 0xff, 0xff, 0xd5, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x48, - 0xff, 0xff, 0xfd, 0xff, 0xb5, 0x00, 0x4a, 0x09, - 0x1f, 0x11, 0x20, 0x0e, 0xf0, 0x0e, 0xf8, 0x44, - 0x28, 0x00, 0xd1, 0x09, 0x48, 0x06, 0xf0, 0x0e, - 0xf8, 0x85, 0x49, 0x06, 0x20, 0x0e, 0xf0, 0x15, - 0xfb, 0x65, 0xf7, 0xff, 0xff, 0xbc, 0x20, 0x00, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xe4, - 0x2e, 0x08, 0x1a, 0x3c, 0x2e, 0x00, 0x6d, 0x17, - 0xb5, 0x00, 0xf7, 0xff, 0xff, 0x9f, 0x21, 0x00, - 0x20, 0x0e, 0xf0, 0x15, 0xfb, 0x53, 0xbc, 0x08, - 0x47, 0x18, 0xb5, 0x00, 0x48, 0x05, 0x7c, 0x01, - 0x29, 0x01, 0xd1, 0x05, 0x69, 0x41, 0x29, 0xff, - 0xd0, 0x02, 0x20, 0x01, 0xf0, 0x00, 0xf8, 0x04, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xd0, - 0xb5, 0x90, 0x06, 0x0c, 0x0e, 0x24, 0x1c, 0x07, - 0xf7, 0xff, 0xff, 0x84, 0x48, 0x11, 0x68, 0x01, - 0x00, 0x49, 0x08, 0x49, 0x07, 0xfa, 0x43, 0x11, - 0x0a, 0x09, 0x02, 0x09, 0x43, 0x21, 0x60, 0x01, - 0x68, 0xc2, 0x2a, 0x00, 0xd1, 0x11, 0x68, 0x82, - 0x1c, 0x53, 0x68, 0x82, 0x60, 0x83, 0x00, 0x92, - 0x4b, 0x09, 0x50, 0x99, 0x68, 0x81, 0x29, 0x64, - 0xd1, 0x01, 0x21, 0x00, 0x60, 0x81, 0x68, 0x81, - 0x68, 0x42, 0x42, 0x91, 0xd1, 0x01, 0x21, 0x01, - 0x60, 0xc1, 0xf7, 0xff, 0xff, 0x74, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x17, 0xd0, - 0x2e, 0x08, 0x4c, 0xf0, 0xb5, 0x90, 0x1c, 0x07, - 0xf7, 0xff, 0xff, 0x58, 0x48, 0x10, 0x68, 0xc1, - 0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x41, - 0x68, 0x82, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x41, - 0x1c, 0x4a, 0x68, 0x41, 0x60, 0x42, 0x00, 0x89, - 0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x41, - 0x29, 0x64, 0xd1, 0x00, 0x60, 0x44, 0x60, 0xc4, - 0xf7, 0xff, 0xff, 0x51, 0x20, 0x01, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x4b, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x17, 0xb0, 0x21, 0x00, 0xb0, 0x81, + 0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, + 0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xdb, 0xf9, + 0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x06, + 0x0e, 0x36, 0x25, 0x02, 0x48, 0x0d, 0x60, 0x05, + 0x27, 0x07, 0x4c, 0x0d, 0x60, 0x25, 0x20, 0x01, + 0x40, 0xb8, 0x40, 0x30, 0xd0, 0x01, 0x20, 0x03, + 0xe0, 0x00, 0x20, 0x02, 0x49, 0x09, 0x60, 0x08, + 0x20, 0x0a, 0xf7, 0xff, 0xff, 0xdf, 0x20, 0x03, + 0x60, 0x20, 0x20, 0x0c, 0xf7, 0xff, 0xff, 0xda, + 0x3f, 0x01, 0xd5, 0xeb, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x14, 0x00, + 0x6e, 0x00, 0x13, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0xb5, 0x80, 0x06, 0x00, 0x0e, 0x00, 0x06, 0x0f, + 0x0e, 0x3f, 0x06, 0x00, 0x0e, 0x00, 0x23, 0x80, + 0x43, 0x18, 0xf7, 0xff, 0xff, 0xcf, 0x20, 0x14, + 0xf7, 0xff, 0xff, 0xc0, 0x1c, 0x38, 0xf7, 0xff, + 0xff, 0xc9, 0x20, 0x03, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x04, 0x60, 0x08, 0x49, 0x04, + 0x60, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x14, 0x00, 0x6e, 0x00, 0x12, 0x00, + 0x6e, 0x00, 0x13, 0x00, 0xb5, 0x00, 0x21, 0x01, + 0x20, 0x02, 0xf7, 0xff, 0xff, 0xd9, 0x48, 0x10, + 0xf7, 0xff, 0xff, 0xa4, 0x21, 0x00, 0x20, 0x02, + 0xf7, 0xff, 0xff, 0xd2, 0x48, 0x0d, 0xf7, 0xff, + 0xff, 0x9d, 0x21, 0x44, 0x20, 0x00, 0xf7, 0xff, + 0xff, 0xcb, 0x21, 0x81, 0x20, 0x01, 0xf7, 0xff, + 0xff, 0xc7, 0x21, 0xf0, 0x20, 0x02, 0xf7, 0xff, + 0xff, 0xc3, 0x21, 0x45, 0x20, 0x03, 0xf7, 0xff, + 0xff, 0xbf, 0x21, 0x45, 0x20, 0x04, 0xf7, 0xff, + 0xff, 0xbb, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0xc3, 0x50, + 0xb5, 0x80, 0x06, 0x07, 0x0e, 0x3f, 0x06, 0x08, + 0x0e, 0x00, 0x28, 0x45, 0xdd, 0x00, 0x20, 0x45, + 0x1d, 0xc1, 0x31, 0x79, 0x20, 0x03, 0xf7, 0xff, + 0xff, 0xa7, 0x2f, 0x45, 0xdd, 0x00, 0x27, 0x45, + 0x20, 0x04, 0x1d, 0xf9, 0x31, 0x79, 0xf7, 0xff, + 0xff, 0x9f, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xeb, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0xf0, 0x15, 0xfe, 0xea, + 0xf0, 0x15, 0xfe, 0xe4, 0x23, 0x01, 0x03, 0x9b, + 0x43, 0x18, 0xf0, 0x15, 0xfe, 0xe3, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0xf0, 0x15, 0xfe, 0xda, + 0x4b, 0x05, 0x40, 0x18, 0xf0, 0x15, 0xfe, 0xda, + 0xf0, 0x15, 0xfe, 0xd4, 0x4b, 0x03, 0x40, 0x18, + 0xf0, 0x15, 0xfe, 0xd4, 0xbc, 0x08, 0x47, 0x18, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, + 0xb5, 0x80, 0x07, 0x01, 0x0f, 0x09, 0x29, 0x02, + 0xd2, 0x19, 0x00, 0x89, 0x4a, 0x0d, 0x58, 0x51, + 0x4f, 0x0d, 0x0c, 0x00, 0x60, 0x39, 0xd3, 0x05, + 0x23, 0x01, 0x02, 0x5b, 0x68, 0x08, 0x43, 0x18, + 0x60, 0x08, 0xe0, 0x03, 0x68, 0x08, 0x4b, 0x09, + 0x40, 0x18, 0x60, 0x08, 0xf7, 0xff, 0xff, 0xc4, + 0x68, 0x38, 0xf0, 0x0e, 0xfb, 0xb1, 0x20, 0x00, + 0x61, 0xb8, 0xf7, 0xff, 0xff, 0xce, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x3c, + 0x2e, 0x08, 0x17, 0xc0, 0xff, 0xff, 0xfd, 0xff, + 0xb5, 0x00, 0x4a, 0x09, 0x1f, 0x11, 0x20, 0x0e, + 0xf0, 0x0e, 0xfb, 0x58, 0x28, 0x00, 0xd1, 0x09, + 0x48, 0x06, 0xf0, 0x0e, 0xfb, 0x99, 0x49, 0x06, + 0x20, 0x0e, 0xf0, 0x15, 0xfe, 0x9b, 0xf7, 0xff, + 0xff, 0xb4, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x17, 0xd8, 0x2e, 0x08, 0x19, 0x00, + 0x2e, 0x00, 0x6e, 0x0b, 0xb5, 0x00, 0xf7, 0xff, + 0xff, 0x97, 0x21, 0x00, 0x20, 0x0e, 0xf0, 0x15, + 0xfe, 0x89, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, + 0x48, 0x04, 0x7d, 0x01, 0x29, 0x01, 0xd1, 0x02, + 0x69, 0x80, 0xf0, 0x00, 0xf8, 0x05, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x17, 0xc0, + 0xb5, 0x90, 0x1c, 0x07, 0x4c, 0x12, 0x68, 0x20, + 0x49, 0x12, 0x42, 0x88, 0xd1, 0x01, 0x0b, 0x38, + 0xd1, 0x1a, 0xf7, 0xff, 0xff, 0x79, 0x60, 0x67, + 0x69, 0x21, 0x1c, 0x38, 0x29, 0x00, 0xd1, 0x11, + 0x68, 0xe1, 0x1c, 0x4a, 0x68, 0xe1, 0x60, 0xe2, + 0x00, 0x89, 0x4a, 0x0b, 0x50, 0x50, 0x68, 0xe0, + 0x28, 0x64, 0xd1, 0x01, 0x20, 0x00, 0x60, 0xe0, + 0x68, 0xe0, 0x68, 0xa1, 0x42, 0x88, 0xd1, 0x01, + 0x20, 0x01, 0x61, 0x20, 0xf7, 0xff, 0xff, 0x71, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x19, 0x00, + 0x2e, 0x08, 0x4c, 0xe8, 0xb5, 0x90, 0x1c, 0x07, + 0xf7, 0xff, 0xff, 0x52, 0x48, 0x10, 0x69, 0x01, + 0x24, 0x00, 0x29, 0x00, 0xd1, 0x03, 0x68, 0x81, + 0x68, 0xc2, 0x42, 0x91, 0xd0, 0x12, 0x68, 0x81, + 0x1c, 0x4a, 0x68, 0x81, 0x60, 0x82, 0x00, 0x89, + 0x4a, 0x0a, 0x58, 0x51, 0x60, 0x39, 0x68, 0x81, + 0x29, 0x64, 0xd1, 0x00, 0x60, 0x84, 0x61, 0x04, + 0xf7, 0xff, 0xff, 0x4b, 0x20, 0x01, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x45, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x17, 0xd0, 0x2e, 0x08, 0x4c, 0xf0, + 0x2e, 0x08, 0x17, 0xc0, 0x2e, 0x08, 0x4c, 0xe8, 0xb5, 0x80, 0xb0, 0x81, 0x4f, 0x0e, 0x8e, 0xb8, 0x28, 0x00, 0xd1, 0x04, 0x46, 0x68, 0xf7, 0xff, 0xff, 0xcd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x00, @@ -3439,277 +3469,485 @@ 0x20, 0x0f, 0x02, 0x40, 0x86, 0xb8, 0x20, 0x01, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x00, 0x1f, 0xc0, 0x2c, 0x00, 0x1e, 0x00, - 0x21, 0x00, 0xb0, 0x81, 0x91, 0x00, 0xe0, 0x02, - 0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0x99, 0x00, - 0x42, 0x81, 0xd3, 0xf9, 0xb0, 0x01, 0x47, 0x70, - 0xb5, 0xf0, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x83, - 0x49, 0x23, 0x68, 0x09, 0x91, 0x01, 0x26, 0x09, - 0x1d, 0xc4, 0x34, 0x19, 0xab, 0x02, 0x70, 0x1d, - 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, - 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, 0xab, 0x02, - 0xf7, 0xfa, 0xfb, 0x72, 0xb0, 0x01, 0xaf, 0x01, - 0x78, 0x3f, 0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, - 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, - 0x7b, 0x20, 0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, - 0xfb, 0x63, 0xb0, 0x01, 0xa9, 0x01, 0x78, 0x09, - 0x91, 0x00, 0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, - 0x3b, 0x04, 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, - 0x7b, 0x20, 0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, - 0xfb, 0x53, 0xb0, 0x01, 0xa8, 0x01, 0x78, 0x00, - 0x99, 0x00, 0x42, 0x8f, 0xd1, 0x06, 0x42, 0x87, - 0xd1, 0x04, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x1e, 0x70, 0x06, 0x06, - 0x0e, 0x36, 0xd1, 0xc3, 0x20, 0xff, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x02, 0x56, 0xc8, 0xb5, 0xf0, 0x06, 0x0c, - 0x0e, 0x24, 0x06, 0x16, 0x0e, 0x36, 0x25, 0x0a, - 0xb0, 0x82, 0xab, 0x00, 0x70, 0x1c, 0x70, 0x5e, - 0x1c, 0x07, 0x30, 0x20, 0x90, 0x01, 0x98, 0x01, - 0x7b, 0x00, 0x46, 0x69, 0x22, 0x02, 0xf7, 0xfa, - 0xfa, 0xcc, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, - 0xff, 0x9b, 0x1c, 0x01, 0x2c, 0x00, 0xd0, 0x05, - 0x2c, 0x09, 0xd0, 0x03, 0x2c, 0x1f, 0xd1, 0x03, - 0x20, 0x7f, 0xe0, 0x02, 0x20, 0x5e, 0xe0, 0x00, - 0x20, 0xff, 0x40, 0x71, 0x40, 0x08, 0xd1, 0x03, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x1e, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xd1, 0xde, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0x90, 0x1c, 0x07, 0x2a, 0x00, 0xd0, 0x01, - 0x24, 0x09, 0xe0, 0x00, 0x24, 0x00, 0x00, 0x90, - 0x19, 0xc0, 0x6c, 0x02, 0x42, 0x8a, 0xd0, 0x15, - 0x64, 0x01, 0x20, 0x03, 0x4a, 0x19, 0x29, 0x01, - 0xd0, 0x13, 0x29, 0x02, 0xd0, 0x1f, 0x29, 0x03, - 0xd1, 0x0c, 0x60, 0x10, 0x1c, 0x38, 0x1c, 0x21, - 0xf7, 0xff, 0xff, 0x66, 0x23, 0xf3, 0x40, 0x18, - 0x22, 0x08, 0x43, 0x02, 0x1c, 0x38, 0x1c, 0x21, - 0xf7, 0xff, 0xff, 0xac, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x60, 0x10, 0x1c, 0x38, 0x1c, 0x21, - 0xf7, 0xff, 0xff, 0x56, 0x22, 0xf3, 0x40, 0x02, - 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x9e, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x1c, 0x38, - 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x49, 0x23, 0xf3, - 0x40, 0x18, 0x22, 0x04, 0x43, 0x02, 0x1c, 0x38, - 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x6e, 0x00, 0x11, 0x00, - 0xb5, 0xf0, 0x1c, 0x0c, 0x68, 0x41, 0x68, 0x09, - 0x68, 0x80, 0x1c, 0x1f, 0x28, 0x00, 0xd0, 0x01, - 0x6b, 0x8b, 0xe0, 0x00, 0x23, 0x00, 0x6b, 0x0e, - 0x43, 0x32, 0x6b, 0xcd, 0x43, 0x2a, 0x43, 0x1a, - 0x43, 0x1e, 0x1c, 0x15, 0x1c, 0x02, 0x1c, 0x08, - 0x21, 0x01, 0xf7, 0xff, 0xff, 0xa5, 0x20, 0x00, - 0x2f, 0x00, 0xdd, 0x07, 0x88, 0x29, 0x54, 0x21, - 0x88, 0x31, 0x54, 0x21, 0x30, 0x01, 0x35, 0x02, - 0x42, 0xb8, 0xdb, 0xf7, 0x1c, 0x38, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x68, 0x41, - 0x68, 0x0c, 0x68, 0x80, 0x1c, 0x1f, 0x28, 0x00, - 0xd0, 0x01, 0x6b, 0xa6, 0xe0, 0x00, 0x26, 0x00, - 0x6b, 0x21, 0x43, 0x11, 0x6b, 0xe2, 0x43, 0x11, - 0x43, 0x31, 0x1c, 0x02, 0x1c, 0x0d, 0x21, 0x01, - 0x1c, 0x20, 0xf7, 0xff, 0xff, 0x81, 0x20, 0x00, - 0x2f, 0x00, 0xdd, 0x09, 0x99, 0x01, 0x5c, 0x09, - 0x80, 0x29, 0x6b, 0x21, 0x19, 0x89, 0x88, 0x09, - 0x30, 0x01, 0x35, 0x02, 0x42, 0xb8, 0xdb, 0xf5, - 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xb5, 0xb0, 0x68, 0x42, 0x68, 0x17, - 0x68, 0x82, 0x2a, 0x00, 0xd0, 0x01, 0x6b, 0xbc, - 0xe0, 0x00, 0x24, 0x00, 0x08, 0x48, 0xd3, 0x0a, - 0x23, 0xfe, 0x40, 0x19, 0x6b, 0x38, 0x43, 0x08, - 0x6b, 0x79, 0x43, 0x08, 0x6b, 0xf9, 0x43, 0x08, - 0x43, 0x20, 0x1c, 0x05, 0xe0, 0x05, 0x6b, 0x38, - 0x43, 0x08, 0x6b, 0xf9, 0x43, 0x08, 0x43, 0x20, - 0x1c, 0x05, 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, - 0xff, 0x4f, 0x6b, 0x38, 0x43, 0x20, 0x88, 0x29, - 0x88, 0x01, 0x88, 0x00, 0x06, 0x00, 0x0e, 0x00, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, - 0x06, 0x15, 0x0e, 0x2d, 0x68, 0x42, 0x68, 0x13, - 0x68, 0x82, 0x2a, 0x00, 0xd0, 0x01, 0x6b, 0x98, - 0xe0, 0x00, 0x20, 0x00, 0x07, 0xcc, 0x0f, 0xe4, - 0xd0, 0x08, 0x6b, 0x1f, 0x43, 0x39, 0x6b, 0x5f, - 0x43, 0x39, 0x6b, 0xdf, 0x43, 0x39, 0x43, 0x01, - 0x1c, 0x0f, 0xe0, 0x05, 0x6b, 0x1f, 0x43, 0x39, - 0x6b, 0xdf, 0x43, 0x39, 0x43, 0x01, 0x1c, 0x0f, - 0x21, 0x02, 0x1c, 0x18, 0xf7, 0xff, 0xff, 0x24, - 0x80, 0x3d, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x47, 0x70, 0xb5, 0x80, 0x68, 0x41, 0x68, 0x0a, - 0x68, 0x80, 0x28, 0x00, 0xd0, 0x01, 0x21, 0x09, - 0xe0, 0x00, 0x21, 0x00, 0x27, 0x00, 0x1c, 0x10, - 0x6c, 0xd2, 0xf0, 0x11, 0xf9, 0xdb, 0x08, 0x40, - 0xd3, 0x00, 0x27, 0x01, 0x1c, 0x38, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x68, 0x42, - 0x68, 0x17, 0x68, 0x80, 0x28, 0x00, 0xd0, 0x01, - 0x24, 0x09, 0xe0, 0x00, 0x24, 0x00, 0x29, 0x00, - 0xd0, 0x16, 0x29, 0x01, 0xd0, 0x21, 0x29, 0x02, - 0xd1, 0x0e, 0x22, 0x80, 0x6c, 0xbb, 0x1c, 0x38, - 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0xc1, 0x48, 0x1e, - 0xf7, 0xff, 0xfe, 0x66, 0x22, 0x00, 0x6c, 0xbb, - 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0xb8, - 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, - 0xf9, 0xad, 0x22, 0x9f, 0x40, 0x02, 0x6c, 0xbb, - 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0xa8, - 0xe7, 0xee, 0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21, - 0xf0, 0x11, 0xf9, 0xa0, 0x22, 0x20, 0x43, 0x02, + 0x06, 0x00, 0x16, 0x00, 0x28, 0x30, 0xdb, 0x03, + 0x28, 0x39, 0xdc, 0x01, 0x20, 0x01, 0x47, 0x70, + 0x20, 0x00, 0x47, 0x70, 0xb5, 0xff, 0x26, 0x00, + 0x1c, 0x07, 0x20, 0x00, 0x1c, 0x14, 0x22, 0x30, + 0x9d, 0x09, 0x54, 0x3a, 0x30, 0x01, 0x28, 0x1f, + 0xdb, 0xfb, 0x20, 0x00, 0x77, 0xf8, 0x29, 0x00, + 0xda, 0x02, 0x2d, 0x00, 0xd1, 0x00, 0x42, 0x49, + 0x25, 0x1e, 0x29, 0x00, 0xd0, 0x14, 0x1c, 0x20, + 0xf0, 0x11, 0xfe, 0x78, 0x31, 0x30, 0x55, 0x79, + 0x57, 0x79, 0x29, 0x39, 0xdd, 0x07, 0x31, 0x07, + 0x55, 0x79, 0x9b, 0x03, 0x2b, 0x00, 0xd0, 0x02, + 0x5d, 0x79, 0x31, 0x20, 0x55, 0x79, 0x1c, 0x01, + 0x3d, 0x01, 0x36, 0x01, 0x28, 0x00, 0xd1, 0xea, + 0x2e, 0x00, 0xd1, 0x00, 0x26, 0x01, 0x1c, 0x30, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x9e, 0x09, 0x20, 0x01, 0x1c, 0x0f, + 0x21, 0x00, 0xb0, 0x94, 0x91, 0x12, 0x91, 0x11, + 0x91, 0x10, 0x91, 0x0f, 0x91, 0x0e, 0x25, 0x00, + 0x42, 0x41, 0x91, 0x0d, 0x21, 0x00, 0x91, 0x0c, + 0x1c, 0x14, 0x92, 0x00, 0x23, 0x00, 0x56, 0xe1, + 0x29, 0x2b, 0xd0, 0x10, 0xdc, 0x07, 0x29, 0x20, + 0xd0, 0x15, 0x29, 0x23, 0xd1, 0x17, 0x21, 0x01, + 0x91, 0x0f, 0x18, 0x64, 0xe0, 0x14, 0x29, 0x2d, + 0xd0, 0x09, 0x29, 0x30, 0xd1, 0x0f, 0x21, 0x01, + 0x91, 0x0e, 0x18, 0x64, 0xe0, 0x0c, 0x21, 0x01, + 0x91, 0x12, 0x18, 0x64, 0xe0, 0x08, 0x21, 0x01, + 0x91, 0x11, 0x18, 0x64, 0xe0, 0x04, 0x21, 0x01, + 0x91, 0x10, 0x18, 0x64, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd1, 0xdb, 0x23, 0x00, 0x56, 0xe0, + 0xf7, 0xff, 0xff, 0x8a, 0x28, 0x00, 0xd0, 0x15, + 0x25, 0x00, 0x23, 0x00, 0x56, 0xe0, 0xf7, 0xff, + 0xff, 0x83, 0x28, 0x00, 0xd0, 0x19, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0x40, 0x23, 0x00, 0x56, 0xe1, + 0x18, 0x08, 0x34, 0x01, 0x1f, 0xc5, 0x3d, 0x29, + 0x56, 0xe0, 0xf7, 0xff, 0xff, 0x75, 0x28, 0x00, + 0xd1, 0xf1, 0xe0, 0x0a, 0x23, 0x00, 0x56, 0xe0, + 0x28, 0x2a, 0xd1, 0x06, 0x9b, 0x17, 0xcb, 0x20, + 0x93, 0x17, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, + 0x34, 0x01, 0x23, 0x00, 0x56, 0xe0, 0x28, 0x2e, + 0xd1, 0x16, 0x20, 0x00, 0x90, 0x0d, 0x34, 0x01, + 0x56, 0xe0, 0xf7, 0xff, 0xff, 0x5d, 0x28, 0x00, + 0xd0, 0x0e, 0x98, 0x0d, 0x00, 0x83, 0x18, 0x18, + 0x00, 0x40, 0x23, 0x00, 0x56, 0xe1, 0x18, 0x08, + 0x38, 0x30, 0x90, 0x0d, 0x34, 0x01, 0x56, 0xe0, + 0xf7, 0xff, 0xff, 0x4e, 0x28, 0x00, 0xd1, 0xf0, + 0x23, 0x00, 0x56, 0xe0, 0x28, 0x68, 0xd0, 0x01, + 0x28, 0x6c, 0xd1, 0x02, 0x90, 0x0c, 0x34, 0x01, + 0xe0, 0x04, 0x28, 0x46, 0xd0, 0x01, 0x28, 0x4e, + 0xd1, 0x00, 0x34, 0x01, 0x23, 0x00, 0x56, 0xe0, + 0x21, 0x25, 0x34, 0x01, 0x28, 0x67, 0xd0, 0x12, + 0xdc, 0x1d, 0x28, 0x63, 0xd0, 0x54, 0xdc, 0x08, + 0x28, 0x25, 0xd0, 0x73, 0x28, 0x45, 0xd0, 0x0a, + 0x28, 0x47, 0xd0, 0x08, 0x28, 0x58, 0xd1, 0x6e, + 0xe0, 0x53, 0x28, 0x64, 0xd0, 0x6c, 0x28, 0x65, + 0xd0, 0x01, 0x28, 0x66, 0xd1, 0x67, 0x98, 0x0c, + 0x28, 0x6c, 0xd1, 0x66, 0x68, 0x30, 0x30, 0x03, + 0x60, 0x30, 0x22, 0x08, 0x99, 0x17, 0xa8, 0x09, + 0xf0, 0x11, 0xfd, 0xe0, 0xe0, 0xe5, 0x28, 0x70, + 0xd0, 0x3d, 0xdc, 0x36, 0x28, 0x69, 0xd0, 0x57, + 0x28, 0x6e, 0xd0, 0x57, 0x28, 0x6f, 0xd1, 0x52, + 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, 0x9b, 0x17, + 0x68, 0x19, 0x91, 0x13, 0x98, 0x0c, 0x28, 0x68, + 0xd1, 0x09, 0x99, 0x13, 0x04, 0x09, 0x0c, 0x09, + 0x91, 0x13, 0x0c, 0x08, 0xd3, 0x03, 0x99, 0x13, + 0x4b, 0xeb, 0x43, 0x19, 0x91, 0x13, 0x22, 0x01, + 0xb4, 0x04, 0x23, 0x00, 0x22, 0x08, 0x99, 0x14, + 0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xff, 0xb0, 0x01, + 0x99, 0x0f, 0x1c, 0x06, 0x29, 0x00, 0xd0, 0x03, + 0x99, 0x13, 0x29, 0x00, 0xd0, 0x00, 0x3e, 0x01, + 0x99, 0x12, 0x29, 0x00, 0xd0, 0x55, 0x20, 0x2b, + 0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, + 0x2d, 0x00, 0xd0, 0x73, 0x3d, 0x01, 0xe0, 0xe7, + 0xe0, 0x3f, 0x28, 0x73, 0xd0, 0x6f, 0x28, 0x75, + 0xd0, 0x6e, 0x28, 0x78, 0xd1, 0x1b, 0x23, 0x01, + 0x93, 0x0b, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, + 0x23, 0x1f, 0x1f, 0xe0, 0x38, 0x19, 0x56, 0xc0, + 0x28, 0x58, 0xd1, 0x01, 0x23, 0x00, 0x93, 0x0b, + 0x9b, 0x17, 0x68, 0x19, 0x98, 0x0c, 0x28, 0x68, + 0xd1, 0x05, 0x04, 0x09, 0x0c, 0x09, 0x0c, 0x08, + 0xd3, 0x01, 0x4b, 0xcd, 0x43, 0x19, 0x22, 0x01, + 0xb4, 0x04, 0xe0, 0x04, 0xe0, 0x16, 0xe1, 0x88, + 0xe0, 0x28, 0xe0, 0x7e, 0xe0, 0x91, 0x22, 0x10, + 0x9b, 0x0c, 0xa8, 0x02, 0xf7, 0xff, 0xfe, 0xbe, + 0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00, + 0xd0, 0x52, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08, + 0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x57, + 0x3d, 0x01, 0xe1, 0x0a, 0x68, 0x38, 0x70, 0x01, + 0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, + 0xe1, 0x70, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, + 0x98, 0x17, 0x68, 0x01, 0x68, 0x38, 0x70, 0x01, + 0x30, 0x01, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, + 0xe1, 0x64, 0xe0, 0x74, 0x68, 0x30, 0x30, 0x01, + 0x60, 0x30, 0x98, 0x17, 0x68, 0x01, 0x91, 0x13, + 0x98, 0x0c, 0x28, 0x68, 0xd1, 0x09, 0x99, 0x13, + 0x04, 0x09, 0x0c, 0x09, 0x91, 0x13, 0x0c, 0x08, + 0xd3, 0x03, 0x99, 0x13, 0x4b, 0xac, 0x43, 0x19, + 0x91, 0x13, 0x22, 0x00, 0xb4, 0x04, 0x23, 0x00, + 0x22, 0x0a, 0x99, 0x14, 0xa8, 0x02, 0xf7, 0xff, + 0xfe, 0x81, 0xb0, 0x01, 0x1c, 0x06, 0x20, 0x2d, + 0x99, 0x12, 0x29, 0x00, 0xd0, 0x15, 0x99, 0x13, + 0x29, 0x00, 0xe0, 0x02, 0xe0, 0x87, 0xe0, 0x5a, + 0xe0, 0x97, 0xda, 0x04, 0x68, 0x39, 0x70, 0x08, + 0x31, 0x01, 0x60, 0x39, 0xe0, 0x04, 0x20, 0x2b, + 0x68, 0x39, 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, + 0x2d, 0x00, 0xd0, 0x65, 0x3d, 0x01, 0xe0, 0x76, + 0xe0, 0xb4, 0x99, 0x10, 0x29, 0x00, 0xd0, 0x11, + 0x99, 0x13, 0x29, 0x00, 0xda, 0x05, 0x68, 0x39, + 0x70, 0x08, 0x31, 0x01, 0x60, 0x39, 0xe0, 0x05, + 0xe0, 0xb3, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, + 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x4f, + 0x3d, 0x01, 0xe0, 0x60, 0x99, 0x13, 0x29, 0x00, + 0xda, 0x5d, 0x68, 0x39, 0x70, 0x08, 0x31, 0x01, + 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x44, 0x3d, 0x01, + 0xe0, 0xab, 0x68, 0x30, 0x30, 0x02, 0x60, 0x30, + 0x22, 0x08, 0x99, 0x17, 0xa8, 0x09, 0xf0, 0x11, + 0xfc, 0xf9, 0x68, 0x38, 0xa1, 0x85, 0x22, 0x10, + 0xf0, 0x11, 0xfc, 0xf4, 0x68, 0x38, 0xf0, 0x11, + 0xfd, 0x35, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, + 0xe0, 0xf8, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, + 0x98, 0x17, 0x68, 0x00, 0x68, 0x39, 0x9a, 0x14, + 0x1a, 0x89, 0x60, 0x01, 0xe0, 0xee, 0x99, 0x10, + 0x29, 0x00, 0xd0, 0x21, 0x21, 0x20, 0x68, 0x38, + 0x70, 0x01, 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, + 0xd0, 0x1a, 0x3d, 0x01, 0xe0, 0x81, 0x68, 0x30, + 0x30, 0x01, 0x60, 0x30, 0x98, 0x17, 0xf0, 0x11, + 0xfd, 0x15, 0x1c, 0x06, 0x98, 0x0d, 0x28, 0x00, + 0xdd, 0x03, 0x98, 0x0d, 0x42, 0xb0, 0xda, 0x00, + 0x9e, 0x0d, 0x2d, 0x00, 0xd0, 0x09, 0x21, 0x20, + 0x68, 0x38, 0x1c, 0x2a, 0xf0, 0x11, 0xfd, 0x28, + 0x23, 0x00, 0x68, 0x38, 0x55, 0x43, 0xe0, 0x03, + 0xe0, 0x67, 0x23, 0x00, 0x68, 0x38, 0x55, 0x83, + 0x2d, 0x00, 0xd0, 0x0d, 0x42, 0xae, 0xda, 0x0b, + 0x99, 0x11, 0x29, 0x00, 0xd1, 0x08, 0x68, 0x38, + 0x19, 0x40, 0x1b, 0x80, 0x99, 0x17, 0x1c, 0x32, + 0xf0, 0x11, 0xfd, 0x2c, 0xe0, 0x0a, 0xe0, 0x54, + 0x2d, 0x00, 0xd0, 0x02, 0x42, 0xae, 0xdb, 0x00, + 0x36, 0x01, 0x99, 0x17, 0x68, 0x38, 0x1c, 0x32, + 0xf0, 0x11, 0xfd, 0x20, 0x68, 0x38, 0xf0, 0x11, + 0xfc, 0xe1, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, + 0xe0, 0xa4, 0x68, 0x30, 0x30, 0x01, 0x60, 0x30, + 0x98, 0x17, 0x99, 0x0c, 0x29, 0x68, 0xd1, 0x02, + 0x23, 0x01, 0x03, 0xdb, 0x40, 0x18, 0x22, 0x01, + 0xb4, 0x04, 0x98, 0x18, 0x68, 0x01, 0x23, 0x00, + 0x22, 0x0a, 0xa8, 0x02, 0xf7, 0xff, 0xfd, 0xca, + 0xb0, 0x01, 0x99, 0x12, 0x1c, 0x06, 0x29, 0x00, + 0xd0, 0x08, 0x20, 0x2b, 0x68, 0x39, 0x70, 0x08, + 0x31, 0x01, 0x60, 0x39, 0x2d, 0x00, 0xd0, 0x24, + 0x3d, 0x01, 0xe0, 0x22, 0x99, 0x10, 0x29, 0x00, + 0xd0, 0x1f, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, + 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x18, + 0x3d, 0x01, 0xe0, 0x16, 0x99, 0x10, 0x29, 0x00, + 0xd0, 0x07, 0x21, 0x20, 0x68, 0x38, 0x70, 0x01, + 0x30, 0x01, 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x00, + 0x3d, 0x01, 0x99, 0x0f, 0x29, 0x00, 0xd0, 0x08, + 0x21, 0x30, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01, + 0x21, 0x78, 0x60, 0x38, 0x70, 0x01, 0x30, 0x01, + 0x60, 0x38, 0x2d, 0x00, 0xd0, 0x48, 0x42, 0xb5, + 0xdd, 0x46, 0x99, 0x11, 0x29, 0x00, 0xd0, 0x02, + 0x99, 0x0e, 0x29, 0x00, 0xd0, 0x2a, 0x99, 0x0e, + 0x29, 0x00, 0xd0, 0x0c, 0x20, 0x00, 0x1b, 0xa9, + 0x29, 0x00, 0xdd, 0x14, 0x22, 0x30, 0x68, 0x3b, + 0x70, 0x1a, 0x33, 0x01, 0x60, 0x3b, 0x30, 0x01, + 0x42, 0x81, 0xdc, 0xf8, 0xe0, 0x0b, 0x20, 0x00, + 0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07, 0x23, 0x20, + 0x68, 0x3a, 0x70, 0x13, 0x32, 0x01, 0x60, 0x3a, + 0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8, 0x21, 0x20, + 0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08, 0x1e, 0x41, + 0x68, 0x38, 0xf0, 0x11, 0xfc, 0xd3, 0x68, 0x38, + 0xf0, 0x11, 0xfc, 0x68, 0x68, 0x39, 0x18, 0x40, + 0x60, 0x38, 0xe0, 0x2b, 0x68, 0x38, 0xf0, 0x11, + 0xfc, 0x61, 0x68, 0x39, 0x18, 0x40, 0x60, 0x38, + 0x20, 0x00, 0x1b, 0xa9, 0x29, 0x00, 0xdd, 0x07, + 0x23, 0x20, 0x68, 0x3a, 0x70, 0x13, 0x32, 0x01, + 0x60, 0x3a, 0x30, 0x01, 0x42, 0x81, 0xdc, 0xf8, + 0x23, 0x00, 0x68, 0x38, 0x70, 0x03, 0xe0, 0x15, + 0x21, 0x20, 0x1b, 0x89, 0xa8, 0x01, 0x18, 0x08, + 0x1e, 0x41, 0x68, 0x38, 0xf0, 0x11, 0xfc, 0xae, + 0x68, 0x38, 0xf0, 0x11, 0xfc, 0x43, 0x68, 0x39, + 0x18, 0x40, 0x23, 0x00, 0x60, 0x38, 0x70, 0x03, + 0xe0, 0x04, 0x68, 0x38, 0x70, 0x01, 0x30, 0x01, + 0x60, 0x38, 0x9c, 0x00, 0x1c, 0x20, 0xb0, 0x14, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xff, 0xff, 0x00, 0x00, 0x28, 0x46, 0x50, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, + 0x65, 0x64, 0x29, 0x00, 0xb5, 0x87, 0x23, 0x00, + 0x98, 0x01, 0x9f, 0x00, 0x56, 0xc0, 0x28, 0x00, + 0xd0, 0x2f, 0xe0, 0x05, 0x30, 0x01, 0x90, 0x01, + 0x98, 0x00, 0x70, 0x01, 0x30, 0x01, 0x90, 0x00, + 0x23, 0x00, 0x98, 0x01, 0x56, 0xc1, 0x29, 0x25, + 0xd0, 0x01, 0x29, 0x00, 0xd1, 0xf2, 0x23, 0x00, + 0x99, 0x01, 0x56, 0xc9, 0x29, 0x00, 0xd0, 0x17, + 0x23, 0x01, 0x56, 0xc0, 0x28, 0x00, 0xd0, 0x13, + 0x20, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x6a, + 0xb4, 0x04, 0x98, 0x03, 0x1c, 0x42, 0x9b, 0x04, + 0x1c, 0x38, 0xa9, 0x02, 0xf7, 0xff, 0xfd, 0x30, + 0xb0, 0x01, 0x90, 0x02, 0x98, 0x00, 0x00, 0x80, + 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, 0xb0, 0x01, + 0x23, 0x00, 0x98, 0x01, 0x56, 0xc0, 0x28, 0x00, + 0xd1, 0xd6, 0x20, 0x00, 0x99, 0x00, 0x70, 0x08, + 0x31, 0x01, 0x91, 0x00, 0x1c, 0x38, 0xf0, 0x11, + 0xfb, 0xe9, 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0x0f, 0xb5, 0x00, 0x98, 0x01, + 0x99, 0x02, 0xaa, 0x03, 0xf7, 0xff, 0xff, 0xb6, + 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, 0xb4, 0x0f, + 0xb5, 0x00, 0xb0, 0xb8, 0x46, 0x68, 0x99, 0x39, + 0xaa, 0x3a, 0xf7, 0xff, 0xff, 0xab, 0x46, 0x68, + 0xf0, 0x11, 0xfb, 0xd0, 0x1c, 0x01, 0x46, 0x68, + 0xf7, 0xf9, 0xfb, 0x7e, 0xb0, 0x38, 0xbc, 0x08, + 0xb0, 0x04, 0x47, 0x18, 0x21, 0x00, 0xb0, 0x81, + 0x91, 0x00, 0xe0, 0x02, 0x99, 0x00, 0x31, 0x01, + 0x91, 0x00, 0x99, 0x00, 0x42, 0x81, 0xd3, 0xf9, + 0xb0, 0x01, 0x47, 0x70, 0xb5, 0xf0, 0x06, 0x0d, + 0x0e, 0x2d, 0xb0, 0x83, 0x49, 0x23, 0x68, 0x09, + 0x91, 0x01, 0x26, 0x09, 0x1d, 0xc4, 0x34, 0x19, + 0xab, 0x02, 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, + 0x70, 0x18, 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, + 0xa9, 0x03, 0xab, 0x02, 0xf7, 0xfa, 0xf8, 0x0c, + 0xb0, 0x01, 0xaf, 0x01, 0x78, 0x3f, 0xab, 0x02, + 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, + 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, + 0xab, 0x02, 0xf7, 0xf9, 0xff, 0xfd, 0xb0, 0x01, + 0xa9, 0x01, 0x78, 0x09, 0x91, 0x00, 0xab, 0x02, + 0x70, 0x1d, 0x20, 0xff, 0x3b, 0x04, 0x70, 0x18, + 0x22, 0x01, 0xb4, 0x04, 0x7b, 0x20, 0xa9, 0x03, + 0xab, 0x02, 0xf7, 0xf9, 0xff, 0xed, 0xb0, 0x01, + 0xa8, 0x01, 0x78, 0x00, 0x99, 0x00, 0x42, 0x8f, + 0xd1, 0x06, 0x42, 0x87, 0xd1, 0x04, 0x1c, 0x38, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x1e, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xd1, 0xc3, + 0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x5e, 0x28, + 0xb5, 0xf0, 0x06, 0x0c, 0x0e, 0x24, 0x06, 0x16, + 0x0e, 0x36, 0x25, 0x0a, 0xb0, 0x82, 0xab, 0x00, + 0x70, 0x1c, 0x70, 0x5e, 0x1c, 0x07, 0x30, 0x20, + 0x90, 0x01, 0x98, 0x01, 0x7b, 0x00, 0x46, 0x69, + 0x22, 0x02, 0xf7, 0xf9, 0xff, 0x66, 0x1c, 0x38, + 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x9b, 0x1c, 0x01, + 0x2c, 0x00, 0xd0, 0x05, 0x2c, 0x09, 0xd0, 0x03, + 0x2c, 0x1f, 0xd1, 0x03, 0x20, 0x7f, 0xe0, 0x02, + 0x20, 0x5e, 0xe0, 0x00, 0x20, 0xff, 0x40, 0x71, + 0x40, 0x08, 0xd1, 0x03, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x1e, 0x68, 0x06, 0x05, + 0x0e, 0x2d, 0xd1, 0xde, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, + 0x2a, 0x00, 0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00, + 0x24, 0x00, 0x00, 0x90, 0x19, 0xc0, 0x6c, 0x02, + 0x42, 0x8a, 0xd0, 0x15, 0x64, 0x01, 0x20, 0x03, + 0x4a, 0x19, 0x29, 0x01, 0xd0, 0x13, 0x29, 0x02, + 0xd0, 0x1f, 0x29, 0x03, 0xd1, 0x0c, 0x60, 0x10, + 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x66, + 0x23, 0xf3, 0x40, 0x18, 0x22, 0x08, 0x43, 0x02, + 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0xac, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x60, 0x10, + 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0x56, + 0x22, 0xf3, 0x40, 0x02, 0x1c, 0x38, 0x1c, 0x21, + 0xf7, 0xff, 0xff, 0x9e, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, + 0xff, 0x49, 0x23, 0xf3, 0x40, 0x18, 0x22, 0x04, + 0x43, 0x02, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, + 0xff, 0x8f, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x6e, 0x00, 0x11, 0x00, 0xb5, 0xf0, 0x1c, 0x0c, + 0x68, 0x41, 0x68, 0x09, 0x68, 0x80, 0x1c, 0x1f, + 0x28, 0x00, 0xd0, 0x01, 0x6b, 0x8b, 0xe0, 0x00, + 0x23, 0x00, 0x6b, 0x0e, 0x43, 0x32, 0x6b, 0xcd, + 0x43, 0x2a, 0x43, 0x1a, 0x43, 0x1e, 0x1c, 0x15, + 0x1c, 0x02, 0x1c, 0x08, 0x21, 0x01, 0xf7, 0xff, + 0xff, 0xa5, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x07, + 0x88, 0x29, 0x54, 0x21, 0x88, 0x31, 0x54, 0x21, + 0x30, 0x01, 0x35, 0x02, 0x42, 0xb8, 0xdb, 0xf7, + 0x1c, 0x38, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xff, 0x68, 0x41, 0x68, 0x0c, 0x68, 0x80, + 0x1c, 0x1f, 0x28, 0x00, 0xd0, 0x01, 0x6b, 0xa6, + 0xe0, 0x00, 0x26, 0x00, 0x6b, 0x21, 0x43, 0x11, + 0x6b, 0xe2, 0x43, 0x11, 0x43, 0x31, 0x1c, 0x02, + 0x1c, 0x0d, 0x21, 0x01, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0x81, 0x20, 0x00, 0x2f, 0x00, 0xdd, 0x09, + 0x99, 0x01, 0x5c, 0x09, 0x80, 0x29, 0x6b, 0x21, + 0x19, 0x89, 0x88, 0x09, 0x30, 0x01, 0x35, 0x02, + 0x42, 0xb8, 0xdb, 0xf5, 0x1c, 0x38, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, + 0x68, 0x42, 0x68, 0x17, 0x68, 0x82, 0x2a, 0x00, + 0xd0, 0x01, 0x6b, 0xbc, 0xe0, 0x00, 0x24, 0x00, + 0x08, 0x48, 0xd3, 0x0a, 0x23, 0xfe, 0x40, 0x19, + 0x6b, 0x38, 0x43, 0x08, 0x6b, 0x79, 0x43, 0x08, + 0x6b, 0xf9, 0x43, 0x08, 0x43, 0x20, 0x1c, 0x05, + 0xe0, 0x05, 0x6b, 0x38, 0x43, 0x08, 0x6b, 0xf9, + 0x43, 0x08, 0x43, 0x20, 0x1c, 0x05, 0x21, 0x02, + 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x4f, 0x6b, 0x38, + 0x43, 0x20, 0x88, 0x29, 0x88, 0x01, 0x88, 0x00, + 0x06, 0x00, 0x0e, 0x00, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d, + 0x68, 0x42, 0x68, 0x13, 0x68, 0x82, 0x2a, 0x00, + 0xd0, 0x01, 0x6b, 0x98, 0xe0, 0x00, 0x20, 0x00, + 0x07, 0xcc, 0x0f, 0xe4, 0xd0, 0x08, 0x6b, 0x1f, + 0x43, 0x39, 0x6b, 0x5f, 0x43, 0x39, 0x6b, 0xdf, + 0x43, 0x39, 0x43, 0x01, 0x1c, 0x0f, 0xe0, 0x05, + 0x6b, 0x1f, 0x43, 0x39, 0x6b, 0xdf, 0x43, 0x39, + 0x43, 0x01, 0x1c, 0x0f, 0x21, 0x02, 0x1c, 0x18, + 0xf7, 0xff, 0xff, 0x24, 0x80, 0x3d, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x47, 0x70, 0xb5, 0x80, + 0x68, 0x41, 0x68, 0x0a, 0x68, 0x81, 0x29, 0x00, + 0xd0, 0x01, 0x21, 0x09, 0xe0, 0x00, 0x21, 0x00, + 0x27, 0x00, 0x69, 0x80, 0x28, 0x06, 0xd1, 0x03, + 0x20, 0x01, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x1c, 0x10, 0x6c, 0xd2, 0xf0, 0x11, 0xf9, 0xa8, + 0x08, 0x40, 0xd3, 0x00, 0x27, 0x01, 0x1c, 0x38, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0x68, 0x42, 0x68, 0x17, 0x68, 0x80, 0x28, 0x00, + 0xd0, 0x01, 0x24, 0x09, 0xe0, 0x00, 0x24, 0x00, + 0x29, 0x00, 0xd0, 0x16, 0x29, 0x01, 0xd0, 0x21, + 0x29, 0x02, 0xd1, 0x0e, 0x22, 0x80, 0x6c, 0xbb, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x8e, + 0x48, 0x1e, 0xf7, 0xff, 0xfe, 0x5f, 0x22, 0x00, 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, - 0xf9, 0x9b, 0x25, 0x00, 0x6c, 0xfa, 0x1c, 0x38, - 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x93, 0x1c, 0x06, - 0x09, 0x80, 0xd2, 0x05, 0x20, 0x14, 0xf7, 0xff, - 0xfe, 0x37, 0x35, 0x01, 0x2d, 0x0a, 0xdb, 0xf1, - 0x22, 0x40, 0x43, 0x32, 0x6c, 0xbb, 0x1c, 0x38, - 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x85, 0xe7, 0xcb, - 0x00, 0x01, 0x86, 0xa0, 0xb5, 0x80, 0x49, 0x0f, - 0x4f, 0x0f, 0x8e, 0xfa, 0x20, 0x00, 0x43, 0xc0, - 0x2a, 0x00, 0xd1, 0x13, 0x8d, 0xba, 0x06, 0x12, - 0x0e, 0x12, 0x2a, 0x0c, 0xd1, 0x0e, 0x8d, 0xf8, - 0x28, 0x00, 0xd0, 0x09, 0x8d, 0xf8, 0x1e, 0x82, - 0xb4, 0x04, 0x78, 0x4a, 0x1c, 0x8b, 0x78, 0x09, - 0x48, 0x06, 0xf0, 0x00, 0xfd, 0x69, 0xb0, 0x01, - 0x20, 0x00, 0x85, 0xb8, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2c, 0x00, 0x12, 0x00, - 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x4e, 0x80, - 0x48, 0x08, 0x8d, 0x81, 0x29, 0x00, 0xd0, 0x02, - 0x20, 0x00, 0x43, 0xc0, 0x47, 0x70, 0x21, 0x0c, - 0x85, 0x81, 0x21, 0x01, 0x02, 0xc9, 0x85, 0xc1, - 0x21, 0x09, 0x02, 0x49, 0x86, 0xc1, 0x20, 0x00, - 0x47, 0x70, 0x00, 0x00, 0x2c, 0x00, 0x1f, 0xc0, - 0xb5, 0x90, 0x4f, 0x15, 0x68, 0x38, 0x28, 0x00, - 0xd0, 0x23, 0xf7, 0xff, 0xff, 0xbf, 0x48, 0x13, - 0x68, 0x00, 0x68, 0x79, 0x1a, 0x41, 0x29, 0x02, - 0xd3, 0x1b, 0x60, 0x78, 0x4c, 0x10, 0x8e, 0xa0, - 0x4f, 0x10, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, - 0xf0, 0x00, 0xfc, 0xda, 0x8e, 0xa0, 0x28, 0x00, - 0xd1, 0x04, 0x23, 0xc9, 0x00, 0x9b, 0x18, 0xf8, - 0xf0, 0x00, 0xfc, 0xd2, 0x69, 0xb8, 0x28, 0x06, - 0xd0, 0x05, 0x23, 0x03, 0x02, 0x1b, 0x18, 0xf8, - 0x6b, 0xc0, 0x28, 0x06, 0xd1, 0x01, 0xf7, 0xff, - 0xff, 0xc3, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x1a, 0x50, 0x2e, 0x08, 0x05, 0xc0, - 0x2c, 0x00, 0x1f, 0xc0, 0x2e, 0x08, 0x4e, 0xd0, - 0xb5, 0x00, 0x1c, 0x10, 0x1c, 0x1a, 0x1c, 0x03, - 0x1c, 0x08, 0x1c, 0x19, 0xf7, 0xf9, 0xfd, 0x06, - 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, - 0x4f, 0x23, 0x24, 0x02, 0x48, 0x23, 0x60, 0x04, - 0x22, 0x50, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x11, - 0xf9, 0x57, 0x20, 0x80, 0x1d, 0xf9, 0x31, 0x19, - 0x73, 0x08, 0x20, 0x03, 0x07, 0x00, 0x63, 0x38, - 0x02, 0xe0, 0x63, 0x78, 0x03, 0x20, 0x63, 0xb8, - 0x03, 0x60, 0x63, 0xf8, 0x48, 0x1a, 0x64, 0xb8, - 0x48, 0x1a, 0x64, 0xf8, 0x60, 0x3f, 0x48, 0x1a, - 0x60, 0xf8, 0x60, 0x7c, 0x24, 0x00, 0x60, 0xbc, - 0x48, 0x18, 0x61, 0x78, 0x48, 0x18, 0x61, 0xb8, - 0x48, 0x18, 0x61, 0xf8, 0x48, 0x18, 0x62, 0x38, - 0x48, 0x18, 0x61, 0x38, 0x48, 0x18, 0x62, 0x78, - 0x48, 0x18, 0x62, 0xb8, 0x1c, 0x38, 0xf0, 0x00, - 0xf8, 0xcb, 0x4f, 0x17, 0x28, 0x00, 0xd0, 0x03, - 0x60, 0x3c, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x01, 0x06, 0x40, 0xf0, 0x15, 0xf8, 0x2d, - 0x48, 0x12, 0xf7, 0xff, 0xfd, 0x71, 0x20, 0x01, - 0x60, 0x38, 0x48, 0x11, 0x68, 0x00, 0x60, 0x78, + 0xf9, 0x85, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x6c, 0xfa, 0x1c, 0x38, 0x1c, 0x21, + 0xf0, 0x11, 0xf9, 0x7a, 0x22, 0x9f, 0x40, 0x02, + 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, + 0xf9, 0x75, 0xe7, 0xee, 0x6c, 0xfa, 0x1c, 0x38, + 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x6d, 0x22, 0x20, + 0x43, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0x1c, 0x21, + 0xf0, 0x11, 0xf9, 0x68, 0x25, 0x00, 0x6c, 0xfa, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x60, + 0x1c, 0x06, 0x09, 0x80, 0xd2, 0x05, 0x20, 0x14, + 0xf7, 0xff, 0xfe, 0x30, 0x35, 0x01, 0x2d, 0x0a, + 0xdb, 0xf1, 0x22, 0x40, 0x43, 0x32, 0x6c, 0xbb, + 0x1c, 0x38, 0x1c, 0x21, 0xf0, 0x11, 0xf9, 0x52, + 0xe7, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x86, 0xa0, + 0xb5, 0x80, 0x49, 0x0f, 0x4f, 0x0f, 0x8e, 0xfa, + 0x20, 0x00, 0x43, 0xc0, 0x2a, 0x00, 0xd1, 0x13, + 0x8d, 0xba, 0x06, 0x12, 0x0e, 0x12, 0x2a, 0x0c, + 0xd1, 0x0e, 0x8d, 0xf8, 0x28, 0x00, 0xd0, 0x09, + 0x8d, 0xf8, 0x1e, 0x82, 0xb4, 0x04, 0x78, 0x4a, + 0x1c, 0x8b, 0x78, 0x09, 0x48, 0x06, 0xf0, 0x00, + 0xfd, 0x5f, 0xb0, 0x01, 0x20, 0x00, 0x85, 0xb8, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2c, 0x00, 0x12, 0x00, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x4e, 0x78, 0x48, 0x08, 0x8d, 0x81, + 0x29, 0x00, 0xd0, 0x02, 0x20, 0x00, 0x43, 0xc0, + 0x47, 0x70, 0x21, 0x0c, 0x85, 0x81, 0x21, 0x01, + 0x02, 0xc9, 0x85, 0xc1, 0x21, 0x09, 0x02, 0x49, + 0x86, 0xc1, 0x20, 0x00, 0x47, 0x70, 0x00, 0x00, + 0x2c, 0x00, 0x1f, 0xc0, 0xb5, 0x90, 0x4f, 0x15, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x23, 0xf7, 0xff, + 0xff, 0xbf, 0x48, 0x13, 0x68, 0x00, 0x68, 0x79, + 0x1a, 0x41, 0x29, 0x02, 0xd3, 0x1b, 0x60, 0x78, + 0x4c, 0x10, 0x8e, 0xa0, 0x4f, 0x10, 0x28, 0x00, + 0xd1, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0xd0, + 0x8e, 0xa0, 0x28, 0x00, 0xd1, 0x04, 0x23, 0xc9, + 0x00, 0x9b, 0x18, 0xf8, 0xf0, 0x00, 0xfc, 0xc8, + 0x69, 0xb8, 0x28, 0x06, 0xd0, 0x05, 0x23, 0x03, + 0x02, 0x1b, 0x18, 0xf8, 0x6b, 0xc0, 0x28, 0x06, + 0xd1, 0x01, 0xf7, 0xff, 0xff, 0xc3, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x44, + 0x2e, 0x08, 0x05, 0xb0, 0x2c, 0x00, 0x1f, 0xc0, + 0x2e, 0x08, 0x4e, 0xc8, 0xb5, 0x00, 0x1c, 0x10, + 0x1c, 0x1a, 0x1c, 0x03, 0x1c, 0x08, 0x1c, 0x19, + 0xf7, 0xf9, 0xf9, 0x84, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x90, 0x4f, 0x23, 0x24, 0x02, 0x48, 0x23, + 0x60, 0x04, 0x22, 0x50, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x11, 0xf9, 0x8a, 0x20, 0x80, 0x1d, 0xf9, + 0x31, 0x19, 0x73, 0x08, 0x20, 0x03, 0x07, 0x00, + 0x63, 0x38, 0x02, 0xe0, 0x63, 0x78, 0x03, 0x20, + 0x63, 0xb8, 0x03, 0x60, 0x63, 0xf8, 0x48, 0x1a, + 0x64, 0xb8, 0x48, 0x1a, 0x64, 0xf8, 0x60, 0x3f, + 0x48, 0x19, 0x60, 0xf8, 0x60, 0x7c, 0x24, 0x00, + 0x60, 0xbc, 0x48, 0x18, 0x61, 0x78, 0x48, 0x18, + 0x61, 0xb8, 0x48, 0x18, 0x61, 0xf8, 0x48, 0x18, + 0x62, 0x38, 0x48, 0x18, 0x61, 0x38, 0x48, 0x18, + 0x62, 0x78, 0x48, 0x18, 0x62, 0xb8, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xbc, 0x4f, 0x16, 0x28, 0x00, + 0xd0, 0x03, 0x60, 0x3c, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0x06, 0x40, 0xf0, 0x15, + 0xf8, 0x1c, 0x48, 0x12, 0xf7, 0xff, 0xfd, 0x6a, + 0x20, 0x01, 0x60, 0x38, 0x48, 0x10, 0x68, 0x00, + 0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x4e, 0x78, 0x6e, 0x00, 0x11, 0x00, + 0x2e, 0x00, 0x76, 0x55, 0x2e, 0x00, 0x75, 0xb9, + 0x2e, 0x08, 0x4e, 0xc8, 0x2e, 0x00, 0x77, 0x41, + 0x2e, 0x00, 0x77, 0x8d, 0x2e, 0x00, 0x77, 0xdb, + 0x2e, 0x00, 0x78, 0x2f, 0x2e, 0x00, 0x7a, 0x39, + 0x2e, 0x00, 0x78, 0x7b, 0x2e, 0x00, 0x78, 0xb3, + 0x2e, 0x08, 0x1a, 0x44, 0x00, 0x06, 0x1a, 0x80, + 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0x80, 0x22, 0x80, + 0x21, 0x1f, 0x6c, 0x83, 0x1c, 0x07, 0xf0, 0x11, + 0xf8, 0x69, 0x48, 0x3f, 0xf7, 0xff, 0xfd, 0x3a, + 0x22, 0x55, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x60, 0x21, 0x02, 0x6c, 0xfa, + 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x59, 0x28, 0x55, + 0xd0, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x22, 0x33, 0x21, 0x05, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x4e, + 0x22, 0x33, 0x21, 0x0e, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x48, 0x22, 0x21, 0x21, 0x17, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x42, + 0x22, 0x00, 0x21, 0x01, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x3c, 0x22, 0x00, 0x21, 0x0a, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x36, + 0x22, 0x01, 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x30, 0x22, 0x01, 0x21, 0x0b, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x2a, + 0x22, 0x00, 0x21, 0x03, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x24, 0x22, 0x00, 0x21, 0x0c, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x1e, + 0x22, 0x00, 0x21, 0x04, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x18, 0x22, 0x01, 0x21, 0x0d, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x12, + 0x22, 0x02, 0x21, 0x1e, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x0c, 0x22, 0x04, 0x21, 0x1c, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x06, + 0x22, 0x03, 0x21, 0x1b, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x11, 0xf8, 0x00, 0x22, 0x01, 0x21, 0x1f, + 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0xfa, + 0x22, 0x01, 0x21, 0x18, 0x6c, 0xbb, 0x1c, 0x38, + 0xf0, 0x10, 0xff, 0xf4, 0x21, 0x1a, 0x6c, 0xfa, + 0x1c, 0x38, 0xf0, 0x10, 0xff, 0xed, 0x20, 0x00, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x00, 0x00, 0xc3, 0x50, 0xb5, 0x90, 0x1c, 0x07, + 0xf7, 0xff, 0xff, 0x74, 0x28, 0x00, 0xda, 0x04, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x24, 0x00, 0x64, 0x3c, 0x64, 0x7c, + 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x2f, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x4e, 0x80, 0x6e, 0x00, 0x11, 0x00, - 0x2e, 0x00, 0x6e, 0xe1, 0x2e, 0x00, 0x6e, 0x45, - 0x2e, 0x08, 0x4e, 0xd0, 0x2e, 0x00, 0x6f, 0xcd, - 0x2e, 0x00, 0x70, 0x19, 0x2e, 0x00, 0x70, 0x67, - 0x2e, 0x00, 0x70, 0xbb, 0x2e, 0x00, 0x72, 0xb5, - 0x2e, 0x00, 0x71, 0x07, 0x2e, 0x00, 0x71, 0x31, - 0x2e, 0x08, 0x1a, 0x50, 0x00, 0x06, 0x1a, 0x80, - 0x2e, 0x08, 0x05, 0xc0, 0xb5, 0x00, 0x23, 0xc9, - 0x00, 0x9b, 0x43, 0x4b, 0x68, 0xc2, 0x18, 0xd2, - 0x60, 0x10, 0x60, 0x91, 0x60, 0x50, 0x1c, 0x10, - 0xf0, 0x00, 0xfb, 0xc4, 0x20, 0x00, 0xbc, 0x08, - 0x47, 0x18, 0xb5, 0x80, 0x22, 0x80, 0x21, 0x1f, - 0x6c, 0x83, 0x1c, 0x07, 0xf0, 0x11, 0xf8, 0x8c, - 0x48, 0x3e, 0xf7, 0xff, 0xfd, 0x31, 0x22, 0x55, - 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x83, 0x21, 0x02, 0x6c, 0xfa, 0x1c, 0x38, - 0xf0, 0x11, 0xf8, 0x7c, 0x28, 0x55, 0xd0, 0x04, - 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x22, 0x33, 0x21, 0x05, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x71, 0x22, 0x33, - 0x21, 0x0e, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x6b, 0x22, 0x21, 0x21, 0x17, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x65, 0x22, 0x00, - 0x21, 0x01, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x5f, 0x22, 0x00, 0x21, 0x0a, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x59, 0x22, 0x01, - 0x21, 0x02, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x53, 0x22, 0x01, 0x21, 0x0b, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x4d, 0x22, 0x00, - 0x21, 0x03, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x47, 0x22, 0x00, 0x21, 0x0c, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x41, 0x22, 0x00, - 0x21, 0x04, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x3b, 0x22, 0x01, 0x21, 0x0d, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x35, 0x22, 0x02, - 0x21, 0x1e, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x2f, 0x22, 0x04, 0x21, 0x1c, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x29, 0x22, 0x03, - 0x21, 0x1b, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x23, 0x22, 0x01, 0x21, 0x1f, 0x6c, 0xbb, - 0x1c, 0x38, 0xf0, 0x11, 0xf8, 0x1d, 0x22, 0x01, - 0x21, 0x18, 0x6c, 0xbb, 0x1c, 0x38, 0xf0, 0x11, - 0xf8, 0x17, 0x21, 0x1a, 0x6c, 0xfa, 0x1c, 0x38, - 0xf0, 0x11, 0xf8, 0x10, 0x20, 0x00, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0xc3, 0x50, - 0xb5, 0x90, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0x75, - 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x24, 0x00, - 0x64, 0x3c, 0x64, 0x7c, 0x1c, 0x38, 0xf0, 0x00, - 0xfc, 0x29, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0xb5, 0x00, 0x1c, 0x13, - 0x1c, 0x0a, 0x1c, 0x01, 0x1c, 0x18, 0xf0, 0x00, - 0xf8, 0xe5, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, - 0x1c, 0x0b, 0x68, 0x54, 0x69, 0x27, 0x1c, 0x11, - 0x2f, 0x00, 0xd0, 0x04, 0x68, 0x89, 0x1c, 0x02, - 0x1c, 0x20, 0xf0, 0x10, 0xff, 0xe9, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x69, 0x82, - 0x68, 0x44, 0xb0, 0x81, 0x42, 0x8a, 0xd1, 0x03, - 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x22, 0xff, 0xab, 0x00, 0x61, 0x81, 0x70, 0x1a, - 0x22, 0x02, 0x70, 0x5a, 0x22, 0x00, 0x70, 0x9a, - 0x70, 0xd9, 0x69, 0x27, 0x2f, 0x00, 0xd0, 0x05, - 0x46, 0x6a, 0x68, 0x81, 0x23, 0x04, 0x1c, 0x20, - 0xf0, 0x10, 0xff, 0xca, 0xb0, 0x01, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x49, 0x04, - 0x68, 0x09, 0x31, 0x19, 0x61, 0x01, 0x21, 0x00, - 0xf7, 0xff, 0xff, 0xd8, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x05, 0xc0, 0xb5, 0xf0, 0x1c, 0x07, + 0xb5, 0x00, 0x1c, 0x13, 0x1c, 0x0a, 0x1c, 0x01, + 0x1c, 0x18, 0xf0, 0x00, 0xf8, 0xeb, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x0b, 0x68, 0x54, + 0x69, 0x27, 0x1c, 0x11, 0x2f, 0x00, 0xd0, 0x07, + 0x68, 0x89, 0x1c, 0x02, 0x1c, 0x20, 0xf0, 0x10, + 0xff, 0xc5, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x90, 0x69, 0x82, 0x68, 0x44, + 0xb0, 0x81, 0x42, 0x8a, 0xd1, 0x03, 0xb0, 0x01, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0xff, + 0xab, 0x00, 0x61, 0x81, 0x70, 0x1a, 0x22, 0x02, + 0x70, 0x5a, 0x22, 0x00, 0x70, 0x9a, 0x70, 0xd9, + 0x69, 0x27, 0x2f, 0x00, 0xd0, 0x05, 0x46, 0x6a, + 0x68, 0x81, 0x23, 0x04, 0x1c, 0x20, 0xf0, 0x10, + 0xff, 0xa1, 0xb0, 0x01, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0x49, 0x04, 0x68, 0x09, + 0x31, 0x19, 0x61, 0x01, 0x21, 0x00, 0xf7, 0xff, + 0xff, 0xd8, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0xf0, 0x1c, 0x07, 0x68, 0x40, 0x69, 0x40, 0x25, 0x00, 0xb0, 0x9e, 0x28, 0x00, 0xd1, 0x08, 0x21, 0x02, 0x1c, 0x38, - 0xf7, 0xff, 0xff, 0xc8, 0x1c, 0x28, 0xb0, 0x1e, + 0xf7, 0xff, 0xff, 0xc7, 0x1c, 0x28, 0xb0, 0x1e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x23, 0x11, 0x01, 0x5b, 0x18, 0xfc, 0x70, 0x25, 0x23, 0xff, 0x22, 0x00, 0x68, 0x7e, 0x69, 0x76, 0x1c, 0x38, - 0x1c, 0x21, 0x33, 0x01, 0xf0, 0x10, 0xff, 0x9a, + 0x1c, 0x21, 0x33, 0x01, 0xf0, 0x10, 0xff, 0x70, 0x46, 0x68, 0x22, 0xff, 0x1c, 0x21, 0x32, 0x01, - 0xf0, 0x01, 0xfb, 0x08, 0x28, 0x00, 0xda, 0x11, + 0xf0, 0x01, 0xfa, 0xea, 0x28, 0x00, 0xda, 0x11, 0x23, 0x03, 0x02, 0x1b, 0x18, 0xf8, 0x6a, 0x01, 0x31, 0x01, 0x62, 0x01, 0x29, 0x64, 0xdd, 0x03, - 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa2, + 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa1, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x1e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x46, 0x68, 0x1d, 0xc1, 0x31, 0x6b, 0x23, 0x01, 0x9a, 0x16, 0x68, 0x7c, - 0x69, 0xa4, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x72, - 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8e, + 0x69, 0xa4, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x48, + 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x8d, 0x21, 0x01, 0x68, 0x7a, 0x6a, 0x92, 0x1c, 0x38, - 0xf0, 0x10, 0xff, 0x64, 0x1c, 0x28, 0xb0, 0x1e, + 0xf0, 0x10, 0xff, 0x3a, 0x1c, 0x28, 0xb0, 0x1e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x21, 0x01, 0x68, 0x42, 0x69, 0xd2, 0xf0, 0x10, - 0xff, 0x59, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0xff, 0x2f, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x1d, 0xc6, 0x36, 0x19, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xf2, 0x0a, 0x00, 0xd2, 0x03, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x02, 0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, - 0xff, 0x45, 0x1c, 0x04, 0x21, 0x03, 0x68, 0x7a, - 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x3e, + 0xff, 0x1b, 0x1c, 0x04, 0x21, 0x03, 0x68, 0x7a, + 0x69, 0xd2, 0x1c, 0x38, 0xf0, 0x10, 0xff, 0x14, 0x02, 0x00, 0x43, 0x20, 0x04, 0x04, 0x0c, 0x24, 0x69, 0xf8, 0x42, 0xa0, 0xda, 0x01, 0x04, 0x04, 0x0c, 0x24, 0x25, 0x00, 0x2c, 0x00, 0xdd, 0x09, 0x21, 0x00, 0x68, 0x7a, 0x69, 0xd2, 0x1c, 0x38, - 0xf0, 0x10, 0xff, 0x2c, 0x55, 0x70, 0x35, 0x01, + 0xf0, 0x10, 0xff, 0x02, 0x55, 0x70, 0x35, 0x01, 0x42, 0xa5, 0xdb, 0xf5, 0x1c, 0x21, 0xa0, 0x07, - 0xf0, 0x10, 0xff, 0x98, 0x69, 0xb8, 0x28, 0x06, + 0xf0, 0x11, 0xf8, 0x22, 0x69, 0xb8, 0x28, 0x06, 0xd1, 0x04, 0x68, 0xf8, 0x1c, 0x31, 0x1c, 0x22, - 0xf0, 0x00, 0xff, 0x5e, 0x1c, 0x20, 0xbc, 0xf0, + 0xf0, 0x00, 0xff, 0x40, 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x64, 0x61, @@ -3717,21 +3955,21 @@ 0x64, 0x0a, 0x00, 0x00, 0xb5, 0xf0, 0x1c, 0x14, 0x1c, 0x0d, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xab, 0x22, 0x01, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, - 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xfd, 0x1c, 0x38, + 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xd3, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x99, 0x09, 0xc0, 0xd3, 0x23, 0x06, 0x22, 0x0e, 0x12, 0x21, 0x02, 0x68, 0x7b, - 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xf0, + 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xc6, 0x12, 0x22, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, - 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xe9, 0x26, 0x00, + 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xbf, 0x26, 0x00, 0x2c, 0x00, 0xdd, 0x09, 0x5d, 0xaa, 0x21, 0x00, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, - 0xfe, 0xdf, 0x36, 0x01, 0x42, 0xa6, 0xdb, 0xf5, + 0xfe, 0xb5, 0x36, 0x01, 0x42, 0xa6, 0xdb, 0xf5, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x78, 0x08, 0x80, - 0xd3, 0x02, 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0x46, + 0xd3, 0x02, 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xd0, 0x22, 0x00, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, - 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xcd, 0x1c, 0x38, + 0x1c, 0x38, 0xf0, 0x10, 0xfe, 0xa3, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x69, 0x08, 0x80, 0xd3, 0x02, - 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0x37, 0x20, 0x00, + 0xa0, 0x0b, 0xf0, 0x10, 0xff, 0xc1, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x3a, 0x20, 0x77, @@ -3744,44 +3982,44 @@ 0xb5, 0x00, 0x1c, 0x0a, 0x1d, 0xc1, 0x31, 0xff, 0x31, 0x1a, 0xf7, 0xff, 0xff, 0x8f, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x0d, - 0xf0, 0x10, 0xff, 0x04, 0x22, 0x08, 0x21, 0x01, + 0xf0, 0x10, 0xff, 0x8e, 0x22, 0x08, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, - 0xfe, 0x8b, 0x21, 0x03, 0x1c, 0x38, 0xf7, 0xff, - 0xfe, 0xa9, 0x48, 0x0a, 0x68, 0x00, 0x30, 0x05, + 0xfe, 0x61, 0x21, 0x03, 0x1c, 0x38, 0xf7, 0xff, + 0xfe, 0xa8, 0x48, 0x0a, 0x68, 0x00, 0x30, 0x05, 0x61, 0x38, 0x20, 0x00, 0x23, 0x03, 0x02, 0x1b, 0x18, 0xf9, 0x62, 0x08, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x73, - 0x65, 0x74, 0x0a, 0x00, 0x2e, 0x08, 0x05, 0xc0, + 0x65, 0x74, 0x0a, 0x00, 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0x90, 0x22, 0x00, 0x21, 0x01, 0x68, 0x43, - 0x6a, 0x1b, 0x1c, 0x07, 0xf0, 0x10, 0xfe, 0x68, + 0x6a, 0x1b, 0x1c, 0x07, 0xf0, 0x10, 0xfe, 0x3e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x04, 0x23, 0x40, 0x40, 0x18, 0x4c, 0x14, 0xd1, 0x13, 0x68, 0x20, 0x30, 0x05, 0x23, 0x03, 0x02, 0x1b, 0x61, 0x38, 0x18, 0xf8, 0x6a, 0x01, 0x31, 0x01, 0x62, 0x01, 0x29, 0x0a, 0xdd, 0x03, 0x21, 0x00, 0x1c, 0x38, - 0xf7, 0xff, 0xfe, 0x74, 0x20, 0x00, 0x43, 0xc0, + 0xf7, 0xff, 0xfe, 0x73, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x04, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, - 0xf0, 0x10, 0xfe, 0x46, 0x21, 0x04, 0x1c, 0x38, - 0xf7, 0xff, 0xfe, 0x64, 0x68, 0x20, 0x30, 0x05, + 0xf0, 0x10, 0xfe, 0x1c, 0x21, 0x04, 0x1c, 0x38, + 0xf7, 0xff, 0xfe, 0x63, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc0, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0xf0, 0x26, 0xff, 0x36, 0x01, 0x61, 0xc6, 0x1d, 0xc5, 0x35, 0x19, 0x1c, 0x07, 0xf7, 0xff, 0xfe, 0xd6, 0x4c, 0x17, 0x28, 0x00, 0xd1, 0x0d, - 0xa0, 0x16, 0xf0, 0x10, 0xfe, 0x9b, 0x21, 0xfe, - 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x47, 0x68, 0x20, + 0xa0, 0x16, 0xf0, 0x10, 0xff, 0x25, 0x21, 0xfe, + 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x46, 0x68, 0x20, 0x61, 0x78, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, 0x02, 0x00, 0x78, 0x69, 0x43, 0x01, 0x61, 0xf9, 0xa0, 0x19, - 0xf0, 0x10, 0xfe, 0x88, 0x69, 0xf8, 0x42, 0xb0, + 0xf0, 0x10, 0xff, 0x12, 0x69, 0xf8, 0x42, 0xb0, 0xdd, 0x00, 0x61, 0xfe, 0x22, 0x02, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, - 0xfe, 0x0b, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38, - 0x21, 0x05, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x26, + 0xfd, 0xe1, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38, + 0x21, 0x05, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x25, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x05, 0xc0, 0x63, 0x69, 0x5f, 0x73, + 0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, @@ -3795,37 +4033,37 @@ 0xb5, 0xb0, 0x1c, 0x07, 0xf7, 0xff, 0xfe, 0x6f, 0x23, 0x40, 0x40, 0x18, 0x25, 0x00, 0x43, 0xed, 0x4c, 0x3d, 0x28, 0x00, 0xd1, 0x0c, 0xa0, 0x3d, - 0xf0, 0x10, 0xfe, 0x38, 0x21, 0xff, 0x1c, 0x38, - 0xf7, 0xff, 0xfd, 0xe4, 0x68, 0x20, 0x61, 0x78, + 0xf0, 0x10, 0xfe, 0xc2, 0x21, 0xff, 0x1c, 0x38, + 0xf7, 0xff, 0xfd, 0xe3, 0x68, 0x20, 0x61, 0x78, 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x03, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, - 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0xb5, 0x1c, 0x38, + 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x8b, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x51, 0x09, 0xc0, 0xd2, 0x0c, - 0xa0, 0x3d, 0xf0, 0x10, 0xfe, 0x1f, 0x21, 0xff, - 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xcb, 0x68, 0x20, + 0xa0, 0x3d, 0xf0, 0x10, 0xfe, 0xa9, 0x21, 0xff, + 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xca, 0x68, 0x20, 0x61, 0x78, 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x02, 0x21, 0x02, 0x68, 0x7b, - 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x9c, + 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x72, 0x22, 0x00, 0x21, 0x03, 0x68, 0x7b, 0x6a, 0x1b, - 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x95, 0x69, 0xf8, + 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x6b, 0x69, 0xf8, 0x12, 0x02, 0x21, 0x00, 0x68, 0x7b, 0x6a, 0x1b, - 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x8d, 0x69, 0xf8, + 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x63, 0x69, 0xf8, 0x06, 0x02, 0x0e, 0x12, 0x21, 0x00, 0x68, 0x7b, - 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x84, - 0xa0, 0x34, 0xf0, 0x10, 0xfd, 0xf3, 0x1c, 0x38, + 0x6a, 0x1b, 0x1c, 0x38, 0xf0, 0x10, 0xfd, 0x5a, + 0xa0, 0x34, 0xf0, 0x10, 0xfe, 0x7d, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x1d, 0x08, 0x80, 0xd3, 0x02, - 0xa0, 0x3e, 0xf0, 0x10, 0xfd, 0xeb, 0x22, 0x00, + 0xa0, 0x3e, 0xf0, 0x10, 0xfe, 0x75, 0x22, 0x00, 0x21, 0x01, 0x68, 0x7b, 0x6a, 0x1b, 0x1c, 0x38, - 0xf0, 0x10, 0xfd, 0x72, 0x68, 0xf8, 0x69, 0xf9, + 0xf0, 0x10, 0xfd, 0x48, 0x68, 0xf8, 0x69, 0xf9, 0xf0, 0x00, 0xfa, 0x3e, 0x48, 0x42, 0x68, 0xf9, 0x4b, 0x42, 0x18, 0xc9, 0x61, 0x48, 0x68, 0xf8, 0x18, 0xc0, 0x61, 0x07, 0x48, 0x40, 0x68, 0xf9, 0x18, 0xc9, 0x61, 0x88, 0x68, 0xf8, 0x18, 0xc0, 0x60, 0xc7, 0x69, 0xf9, 0xa0, 0x3d, 0xf0, 0x10, - 0xfd, 0xcd, 0x68, 0x20, 0x61, 0x38, 0x21, 0x06, - 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x77, 0x20, 0x00, + 0xfe, 0x57, 0x68, 0x20, 0x61, 0x38, 0x21, 0x06, + 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x76, 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x05, 0xc0, 0x63, 0x69, 0x5f, 0x73, + 0x2e, 0x08, 0x05, 0xb0, 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x74, 0x6f, @@ -3851,42 +4089,42 @@ 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x00, - 0x2e, 0x00, 0x74, 0xf1, 0x00, 0x01, 0x3b, 0x80, - 0x2e, 0x00, 0x75, 0x03, 0x63, 0x69, 0x5f, 0x73, + 0x2e, 0x00, 0x7c, 0x55, 0x00, 0x01, 0x3b, 0x80, + 0x2e, 0x00, 0x7c, 0x67, 0x63, 0x69, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, 0x20, 0xff, 0x30, 0x01, 0x61, 0xf8, 0x21, 0x00, - 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xeb, 0x48, 0x05, - 0x68, 0x00, 0x61, 0x38, 0x48, 0x04, 0xf7, 0xfe, - 0xf8, 0x2d, 0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc0, + 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xea, 0x48, 0x05, + 0x68, 0x00, 0x61, 0x38, 0x48, 0x04, 0xf7, 0xfd, + 0xfc, 0xe5, 0x60, 0xf8, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 0x00, 0x01, 0x3b, 0x9c, 0xb5, 0x00, 0x68, 0xc0, - 0xf7, 0xfe, 0xf8, 0x42, 0xbc, 0x08, 0x47, 0x18, + 0xf7, 0xfd, 0xfc, 0xfa, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0x1c, 0x1f, 0x06, 0x0b, 0x0e, 0x1b, 0x69, 0x81, 0x29, 0x06, 0xd0, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x11, 0x29, 0xff, 0xd1, 0x05, 0xf7, 0xff, - 0xfc, 0xe5, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0xfc, 0xe4, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xc0, 0x1c, 0x11, 0x1c, 0x3a, 0xf0, 0x00, 0xfb, 0x9a, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x00, 0x49, 0x04, 0x68, 0x09, 0x1a, 0x40, 0x4b, 0x04, 0x42, 0x98, 0xd2, 0x01, 0x20, 0x00, 0x47, 0x70, 0x20, 0x01, 0x47, 0x70, - 0x2e, 0x08, 0x05, 0xc0, 0x80, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x05, 0xb0, 0x80, 0x00, 0x00, 0x00, 0xb5, 0x90, 0x68, 0x44, 0x6a, 0x61, 0x1c, 0x07, 0x29, 0x00, 0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x10, - 0xfc, 0x7b, 0xe0, 0x00, 0x20, 0x01, 0x08, 0x40, + 0xfc, 0x51, 0xe0, 0x00, 0x20, 0x01, 0x08, 0x40, 0xd2, 0x06, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xff, - 0xfc, 0x99, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xfc, 0x98, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x69, 0xb8, 0x28, 0x00, 0xd1, 0xf9, 0x6a, 0xa2, 0x2a, 0x00, 0xd0, 0x03, 0x21, 0x02, 0x1c, 0x38, - 0xf0, 0x10, 0xfc, 0x68, 0x21, 0x01, 0x1c, 0x38, - 0xf7, 0xff, 0xfc, 0x88, 0x20, 0x00, 0x23, 0x03, + 0xf0, 0x10, 0xfc, 0x3e, 0x21, 0x01, 0x1c, 0x38, + 0xf7, 0xff, 0xfc, 0x87, 0x20, 0x00, 0x23, 0x03, 0x02, 0x1b, 0x18, 0xf9, 0x62, 0x08, 0x48, 0x03, 0x68, 0x00, 0x30, 0x19, 0x61, 0x38, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xc0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0x90, 0x1c, 0x07, 0xf7, 0xff, 0xff, 0xcc, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xba, 0x28, 0x00, 0xd1, 0x03, 0x43, 0xc0, 0xbc, 0x90, 0xbc, 0x08, @@ -3898,17 +4136,17 @@ 0x28, 0xfe, 0xd0, 0x01, 0x28, 0xff, 0xd1, 0x0a, 0x69, 0x78, 0x68, 0x21, 0x1a, 0x08, 0x23, 0xff, 0x33, 0xf5, 0x42, 0x98, 0xd9, 0x03, 0x21, 0x00, - 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x4b, 0x20, 0x00, + 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x4a, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x68, 0x20, 0x30, 0x05, 0x61, 0x38, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x6d, 0xe7, 0xf4, 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0x84, 0xe7, 0xf0, 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xa7, 0xe7, 0xec, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x3f, 0xe7, 0xe8, 0x68, 0xf8, 0xf0, 0x00, - 0xfc, 0x71, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, + 0xfc, 0x53, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0xb1, 0x68, 0xf8, 0xf0, 0x00, - 0xfb, 0xf7, 0x68, 0x20, 0x30, 0x02, 0x61, 0x38, - 0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc0, + 0xfb, 0xd9, 0x68, 0x20, 0x30, 0x02, 0x61, 0x38, + 0xe7, 0xd9, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xb0, 0xb5, 0xb0, 0x06, 0x15, 0x0e, 0x2d, 0x9f, 0x04, 0x68, 0x42, 0x1c, 0x1c, 0x42, 0x8a, 0xdc, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, @@ -3931,7 +4169,7 @@ 0x1c, 0x0c, 0x28, 0x00, 0xdd, 0x0f, 0x26, 0x01, 0x1c, 0x30, 0x40, 0xa8, 0x40, 0x20, 0xd0, 0x06, 0x21, 0xc9, 0x00, 0x89, 0x43, 0x69, 0x68, 0xf8, - 0x18, 0x40, 0xf7, 0xff, 0xfb, 0xe7, 0x68, 0x78, + 0x18, 0x40, 0xf7, 0xff, 0xfb, 0xe6, 0x68, 0x78, 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xf0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, 0x21, 0x00, 0x78, 0x07, 0x22, 0x80, 0x43, 0xd2, 0x40, 0x3a, @@ -3955,7 +4193,7 @@ 0x40, 0xa5, 0x43, 0x2a, 0x31, 0x01, 0x37, 0x01, 0x42, 0x81, 0xdb, 0xf4, 0xe0, 0x01, 0x1c, 0x02, 0x37, 0x01, 0x78, 0x3b, 0xa1, 0x03, 0xa0, 0x04, - 0xf0, 0x10, 0xfb, 0xb8, 0x78, 0x38, 0xbc, 0xb0, + 0xf0, 0x10, 0xfc, 0x42, 0x78, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x63, 0x69, 0x3a, 0x00, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x25, 0x73, 0x2c, 0x20, 0x6c, 0x65, @@ -3964,11 +4202,11 @@ 0xb5, 0xb0, 0x25, 0x00, 0x60, 0x01, 0x1c, 0x07, 0x4b, 0x2f, 0x18, 0xc4, 0x72, 0x25, 0x72, 0x65, 0x72, 0xa5, 0x72, 0xe5, 0x1c, 0x08, 0x21, 0x01, - 0x04, 0x09, 0xf0, 0x10, 0xfb, 0x2b, 0x21, 0x01, + 0x04, 0x09, 0xf0, 0x10, 0xfb, 0x01, 0x21, 0x01, 0x02, 0x49, 0x42, 0x88, 0xdd, 0x01, 0x60, 0x79, 0xe0, 0x00, 0x60, 0x78, 0x22, 0x01, 0x04, 0x12, 0x21, 0x00, 0x1d, 0xf8, 0x30, 0x01, 0xf0, 0x10, - 0xfb, 0x6b, 0x20, 0x00, 0x43, 0xc1, 0x00, 0x82, + 0xfb, 0xa7, 0x20, 0x00, 0x43, 0xc1, 0x00, 0x82, 0x19, 0xd2, 0x4b, 0x22, 0x18, 0xd3, 0x60, 0x9d, 0x4b, 0x21, 0x18, 0xd3, 0x60, 0x9d, 0x23, 0x9d, 0x02, 0x5b, 0x18, 0xd3, 0x60, 0x9d, 0x4b, 0x1f, @@ -3982,9 +4220,9 @@ 0x76, 0x0d, 0x76, 0x4d, 0x61, 0xc8, 0x68, 0x79, 0x30, 0x01, 0x42, 0x81, 0xdc, 0xed, 0x4b, 0x10, 0x18, 0xf8, 0x22, 0x01, 0x02, 0xd2, 0x21, 0x00, - 0xf0, 0x10, 0xfb, 0x32, 0x4b, 0x0d, 0x18, 0xf8, + 0xf0, 0x10, 0xfb, 0x6e, 0x4b, 0x0d, 0x18, 0xf8, 0x22, 0xff, 0x21, 0x00, 0x32, 0x01, 0xf0, 0x10, - 0xfb, 0x2b, 0x60, 0xe5, 0x61, 0x25, 0x61, 0x65, + 0xfb, 0x67, 0x60, 0xe5, 0x61, 0x25, 0x61, 0x65, 0x61, 0xa5, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3a, 0x80, @@ -4003,7 +4241,7 @@ 0x47, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0xb5, 0xb0, 0x06, 0x1d, 0x0e, 0x2d, 0x1c, 0x14, 0x68, 0x0a, 0x21, 0x00, 0x1c, 0x07, 0xf0, 0x10, - 0xfa, 0xdf, 0x70, 0x3d, 0x2c, 0x00, 0xd0, 0x04, + 0xfb, 0x1b, 0x70, 0x3d, 0x2c, 0x00, 0xd0, 0x04, 0x20, 0x80, 0x70, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x70, 0x78, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x99, 0x01, @@ -4015,7 +4253,7 @@ 0x19, 0x01, 0x23, 0x01, 0x04, 0x1b, 0x42, 0x99, 0xdd, 0x01, 0x20, 0x00, 0xe7, 0xea, 0x18, 0x2d, 0x99, 0x01, 0x1d, 0xe8, 0x30, 0x01, 0x1c, 0x22, - 0xf0, 0x10, 0xfa, 0xf8, 0x74, 0x34, 0x7a, 0x68, + 0xf0, 0x10, 0xfa, 0x84, 0x74, 0x34, 0x7a, 0x68, 0x74, 0x70, 0x2f, 0x00, 0xd0, 0x04, 0x68, 0xb8, 0x60, 0xb0, 0x60, 0xf7, 0x60, 0xbe, 0xe0, 0x02, 0x20, 0x00, 0x60, 0xb0, 0x60, 0xf0, 0x1c, 0x30, @@ -4101,6750 +4339,6713 @@ 0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80, 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x40, 0x00, 0x01, 0x3b, 0x00, - 0xb5, 0xf0, 0x1c, 0x14, 0x06, 0x1a, 0x0e, 0x12, - 0xb0, 0x81, 0x92, 0x00, 0x1c, 0x07, 0x1c, 0x08, + 0xb5, 0xf0, 0x1c, 0x17, 0x06, 0x1a, 0x0e, 0x12, + 0xb0, 0x82, 0x92, 0x00, 0x1c, 0x04, 0x1c, 0x08, 0x1c, 0x0d, 0xb0, 0x81, 0xf7, 0xff, 0xfd, 0x8e, - 0x90, 0x00, 0x1c, 0x22, 0x1c, 0x03, 0xa1, 0x3e, - 0x48, 0x3e, 0xf0, 0x10, 0xf9, 0x5f, 0x68, 0x38, - 0x38, 0x02, 0x4b, 0x3d, 0x18, 0xfe, 0x42, 0xa0, - 0xda, 0x3a, 0x68, 0x38, 0x38, 0x02, 0x1a, 0x24, - 0x22, 0x01, 0x9b, 0x00, 0x1c, 0x30, 0x1c, 0x39, - 0xf7, 0xff, 0xfe, 0x4e, 0x9a, 0x01, 0xb4, 0x04, - 0x22, 0x00, 0x68, 0x3b, 0x1c, 0x38, 0x1c, 0x31, - 0xf7, 0xff, 0xfe, 0x8f, 0xb0, 0x01, 0x28, 0x00, - 0xda, 0x05, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x80, - 0x19, 0xc0, 0x4b, 0x2e, 0x18, 0xc0, 0x68, 0x80, - 0x69, 0x40, 0x68, 0x39, 0x43, 0x48, 0x30, 0x02, - 0x18, 0x42, 0x23, 0x01, 0x04, 0x1b, 0x3a, 0x02, - 0x42, 0x9a, 0xdd, 0x05, 0x20, 0x00, 0x43, 0xc0, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x18, 0x38, 0x1e, 0x8a, 0x30, 0x08, 0x1c, 0x29, - 0xf0, 0x10, 0xf9, 0x54, 0x68, 0x38, 0x18, 0x29, - 0x38, 0x02, 0x1e, 0x8d, 0x42, 0xa0, 0xdb, 0xc4, - 0x2c, 0x00, 0xd0, 0x30, 0x22, 0x00, 0x9b, 0x00, - 0x1c, 0x30, 0x1c, 0x39, 0xf7, 0xff, 0xfe, 0x14, - 0x9a, 0x01, 0xb4, 0x04, 0x22, 0x00, 0x1c, 0x38, - 0x1c, 0x31, 0x1c, 0xa3, 0xf7, 0xff, 0xfe, 0x55, - 0xb0, 0x01, 0x28, 0x00, 0xda, 0x05, 0x20, 0x00, - 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x80, 0x19, 0xc0, 0x4b, 0x11, - 0x18, 0xc0, 0x68, 0x80, 0x69, 0x40, 0x68, 0x39, - 0x43, 0x48, 0x30, 0x02, 0x19, 0x01, 0x23, 0x01, - 0x04, 0x1b, 0x42, 0x99, 0xdd, 0x05, 0x20, 0x00, - 0x43, 0xc0, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x18, 0x38, 0x30, 0x08, 0x1c, 0x29, - 0x1c, 0x22, 0xf0, 0x10, 0xf9, 0x1b, 0x20, 0x00, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x63, 0x69, 0x3a, 0x00, 0x2e, 0x00, 0x7e, 0x5c, - 0x00, 0x01, 0x38, 0x08, 0x00, 0x01, 0x39, 0x00, - 0xb5, 0xf3, 0xb0, 0x83, 0x1c, 0x07, 0x99, 0x04, - 0x00, 0x88, 0x19, 0xc0, 0x4b, 0x27, 0x18, 0xc0, - 0x90, 0x02, 0x68, 0x84, 0x4b, 0x26, 0x18, 0xf8, - 0x90, 0x01, 0x2c, 0x00, 0xd0, 0x37, 0x25, 0x00, - 0x7c, 0x26, 0x69, 0x60, 0x68, 0x39, 0x43, 0x48, - 0x7c, 0x61, 0x23, 0x80, 0x40, 0x19, 0x91, 0x00, - 0x30, 0x02, 0x19, 0x81, 0x02, 0x5b, 0x39, 0x02, - 0x42, 0x99, 0xdd, 0x04, 0xb0, 0x03, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x38, - 0x1d, 0xc1, 0x31, 0x01, 0x19, 0x78, 0x1e, 0xb2, - 0x4b, 0x18, 0x18, 0xc0, 0xf0, 0x10, 0xf8, 0xe2, - 0x19, 0xa8, 0x1e, 0x85, 0x22, 0x01, 0x1c, 0x38, - 0x1c, 0x21, 0xf7, 0xff, 0xfe, 0xc4, 0x98, 0x02, - 0x68, 0x84, 0x2c, 0x00, 0xd0, 0x02, 0x99, 0x00, - 0x29, 0x00, 0xd1, 0xd5, 0x23, 0x01, 0x02, 0xdb, - 0x42, 0x9d, 0xda, 0x08, 0x98, 0x01, 0x68, 0xc2, - 0x4b, 0x0c, 0x18, 0xf8, 0x9b, 0x01, 0x69, 0x9b, - 0x1c, 0x29, 0xf0, 0x10, 0xf8, 0x25, 0x99, 0x04, - 0x1c, 0x48, 0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, - 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, - 0x0e, 0xc0, 0x9b, 0x01, 0x72, 0x58, 0xb0, 0x03, - 0xe7, 0xc9, 0x00, 0x00, 0x00, 0x01, 0x3a, 0x80, - 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x30, 0x08, - 0xb5, 0xf0, 0x21, 0x00, 0x4b, 0x24, 0x18, 0xc4, - 0x7a, 0xe7, 0x7a, 0xa2, 0x25, 0x00, 0x2a, 0x00, - 0xd1, 0x03, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x22, 0x00, 0xe0, 0x1e, 0x00, 0x7b, - 0x18, 0x1e, 0x4b, 0x1e, 0x18, 0xf6, 0x23, 0x08, - 0x5e, 0xf3, 0x2b, 0x00, 0xdb, 0x0c, 0x00, 0xbb, - 0x18, 0x1e, 0x23, 0x9d, 0x02, 0x5b, 0x18, 0xf3, - 0x68, 0x9b, 0x2b, 0x00, 0xd0, 0x04, 0x7c, 0x5e, - 0x0a, 0x33, 0xd2, 0x01, 0x21, 0x01, 0xe0, 0x09, - 0x37, 0x01, 0xd5, 0x04, 0x42, 0x7f, 0x06, 0xff, - 0x0e, 0xff, 0x42, 0x7f, 0xe0, 0x01, 0x06, 0xff, - 0x0e, 0xff, 0x32, 0x01, 0x2a, 0x20, 0xda, 0x01, - 0x29, 0x00, 0xd0, 0xdc, 0x29, 0x00, 0xd1, 0x04, - 0x72, 0xe5, 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x72, 0xe7, 0x1c, 0x39, 0xf7, 0xff, - 0xff, 0x67, 0x1c, 0x78, 0xd5, 0x04, 0x42, 0x40, - 0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x01, - 0x06, 0xc0, 0x0e, 0xc0, 0x72, 0xe0, 0x20, 0x01, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x40, - 0xb5, 0xb0, 0x78, 0x0b, 0x1c, 0x14, 0x1c, 0x05, - 0x1c, 0x0f, 0xa1, 0x0c, 0x48, 0x0c, 0xf0, 0x10, - 0xf8, 0x29, 0x78, 0x3a, 0xb4, 0x04, 0x22, 0x01, - 0x1c, 0x28, 0x1c, 0x39, 0x1c, 0x23, 0xf7, 0xff, - 0xfd, 0x68, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, - 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, + 0x90, 0x00, 0x1c, 0x3a, 0x1c, 0x03, 0xa1, 0x27, + 0x48, 0x27, 0xf0, 0x10, 0xf9, 0xe9, 0x2f, 0x00, + 0xdd, 0x42, 0x4b, 0x26, 0x18, 0xe0, 0x90, 0x02, + 0x68, 0x20, 0x38, 0x02, 0x42, 0xb8, 0xda, 0x01, + 0x1c, 0x06, 0xe0, 0x00, 0x1c, 0x3e, 0x42, 0xbe, + 0xda, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, + 0x98, 0x02, 0x9b, 0x00, 0x1c, 0x21, 0xf7, 0xff, + 0xfe, 0x47, 0x9a, 0x01, 0xb4, 0x04, 0x22, 0x00, + 0x99, 0x03, 0x1c, 0x20, 0x1c, 0xb3, 0xf7, 0xff, + 0xfe, 0x88, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0x80, 0x19, 0x00, + 0x4b, 0x13, 0x18, 0xc0, 0x68, 0x80, 0x69, 0x40, + 0x68, 0x21, 0x43, 0x48, 0x30, 0x02, 0x19, 0x81, + 0x23, 0x01, 0x04, 0x1b, 0x42, 0x99, 0xdd, 0x05, + 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x18, 0x20, 0x30, 0x08, + 0x1c, 0x29, 0x1c, 0x32, 0xf0, 0x10, 0xf8, 0xda, + 0x1b, 0xbf, 0x19, 0xad, 0x2f, 0x00, 0xdc, 0xbf, + 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x63, 0x69, 0x3a, 0x00, - 0x2e, 0x00, 0x7e, 0x5c, 0xb5, 0xf0, 0x1c, 0x07, - 0x4b, 0x2a, 0x18, 0xc4, 0x7a, 0x65, 0x7a, 0x20, - 0x28, 0x00, 0xd1, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x20, 0x00, 0x43, 0xc1, 0xe0, 0x09, - 0x35, 0x01, 0xd5, 0x04, 0x42, 0x6d, 0x06, 0xed, - 0x0e, 0xed, 0x42, 0x6d, 0xe0, 0x01, 0x06, 0xed, - 0x0e, 0xed, 0x30, 0x01, 0x28, 0x20, 0xda, 0x07, - 0x00, 0x6a, 0x19, 0xd2, 0x4b, 0x1e, 0x18, 0xd2, - 0x23, 0x08, 0x5e, 0xd2, 0x42, 0x8a, 0xd0, 0xeb, - 0x00, 0xa8, 0x19, 0xc0, 0x4b, 0x1b, 0x18, 0xc1, - 0x68, 0x89, 0x29, 0x00, 0xd0, 0x10, 0x72, 0x65, - 0x4b, 0x19, 0x18, 0xc6, 0x68, 0xb1, 0x69, 0x48, - 0x68, 0x3a, 0x43, 0x50, 0x7c, 0x09, 0x18, 0x0a, - 0x23, 0x01, 0x04, 0x1b, 0x42, 0x9a, 0xdd, 0x08, - 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x00, 0x72, 0x60, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x18, 0x38, 0x69, 0x22, 0x69, 0x63, - 0x30, 0x08, 0xf0, 0x0f, 0xff, 0x59, 0x22, 0x00, - 0x68, 0xb1, 0x1c, 0x38, 0xf7, 0xff, 0xfd, 0xdf, - 0x1c, 0x68, 0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, - 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, - 0x0e, 0xc0, 0x72, 0x60, 0x20, 0x01, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x00, 0x01, 0x3b, 0x80, - 0x00, 0x01, 0x3b, 0x00, 0x00, 0x01, 0x39, 0x00, - 0x00, 0x01, 0x39, 0x80, 0xb5, 0xff, 0xb0, 0x8b, - 0x9a, 0x0d, 0x1c, 0x1c, 0x1c, 0x0f, 0x2a, 0x02, - 0xda, 0x06, 0x20, 0x00, 0x43, 0xc0, 0xb0, 0x0b, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x78, 0x79, 0x91, 0x04, 0x31, 0x02, 0x78, 0x3b, - 0x1c, 0x0d, 0x42, 0x83, 0xd0, 0x07, 0x1c, 0x19, - 0x1c, 0x02, 0xa0, 0xf9, 0xf0, 0x0f, 0xff, 0x96, - 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xec, 0x9a, 0x0d, - 0x42, 0x91, 0xdd, 0x02, 0x42, 0x68, 0xb0, 0x0b, - 0xe7, 0xe6, 0x1d, 0x39, 0x91, 0x0a, 0x1d, 0xe2, - 0x32, 0x59, 0x92, 0x09, 0x1d, 0xe6, 0x36, 0x39, - 0x28, 0x1d, 0xd0, 0x63, 0xdc, 0x08, 0x28, 0x15, - 0xd0, 0x13, 0x28, 0x1a, 0xd0, 0x5f, 0x28, 0x1b, - 0xd0, 0x5e, 0x28, 0x1c, 0xd0, 0x5a, 0xe0, 0x7a, - 0x28, 0x20, 0xd0, 0x41, 0x1c, 0xbe, 0x28, 0xc0, - 0xd0, 0x74, 0x28, 0xc1, 0xd1, 0x73, 0x98, 0x14, - 0x28, 0x1b, 0xd0, 0x71, 0x42, 0x68, 0xb0, 0x0b, - 0xe7, 0xc6, 0x78, 0xb8, 0x28, 0x05, 0xd0, 0x02, - 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xc0, 0x78, 0xf8, - 0x28, 0x00, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, - 0xe7, 0xba, 0x98, 0x04, 0x1e, 0x82, 0x2a, 0x4f, - 0xda, 0x04, 0x99, 0x0a, 0x1c, 0x20, 0xf0, 0x0f, - 0xff, 0x89, 0xe0, 0x04, 0x22, 0x4f, 0x99, 0x0a, - 0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x83, 0x78, 0xfa, - 0x78, 0xb9, 0x9c, 0x0a, 0xa0, 0xe0, 0x1c, 0x23, - 0xf0, 0x0f, 0xff, 0x4c, 0x98, 0x04, 0x18, 0x38, - 0x1c, 0x47, 0x42, 0xa7, 0xd9, 0x0c, 0x1c, 0x20, - 0xf0, 0x0f, 0xff, 0xb8, 0x19, 0x00, 0x1c, 0x44, - 0x42, 0xa7, 0xd9, 0x03, 0x1c, 0x21, 0xa0, 0xdd, - 0xf0, 0x0f, 0xff, 0x3c, 0x42, 0xa7, 0xd8, 0xf2, - 0xa0, 0xd4, 0xf0, 0x0f, 0xff, 0x37, 0xe0, 0xe3, - 0x98, 0x04, 0x28, 0x04, 0xd0, 0x02, 0x42, 0x68, - 0xb0, 0x0b, 0xe7, 0x89, 0x78, 0xf8, 0x02, 0x00, - 0x78, 0xb9, 0x43, 0x08, 0x82, 0x30, 0x79, 0x78, - 0x02, 0x00, 0x79, 0x39, 0x43, 0x08, 0x82, 0x70, - 0x8a, 0x72, 0x8a, 0x31, 0xa0, 0xd1, 0xf0, 0x0f, - 0xff, 0x21, 0xe0, 0xcd, 0xe2, 0x17, 0xe0, 0x00, - 0xe0, 0x62, 0x78, 0xb8, 0x07, 0x80, 0x0f, 0x80, - 0x30, 0x01, 0x75, 0x30, 0x78, 0xb8, 0x08, 0x80, - 0x07, 0x00, 0x0f, 0x00, 0x30, 0x01, 0x75, 0x70, - 0x78, 0xf8, 0x9a, 0x09, 0x73, 0x10, 0x20, 0x00, - 0x65, 0xa0, 0x7d, 0x31, 0x29, 0x00, 0xdd, 0x0e, - 0x18, 0x39, 0x79, 0x09, 0x00, 0xc2, 0x40, 0x91, - 0x6d, 0xa2, 0x43, 0x11, 0x65, 0xa1, 0x7d, 0x31, - 0x30, 0x01, 0xe0, 0x02, 0xe1, 0x02, 0xe1, 0xf9, - 0xe1, 0x4b, 0x42, 0x81, 0xdc, 0xf0, 0x7d, 0x30, - 0x30, 0x04, 0x90, 0x03, 0x7d, 0x72, 0x18, 0x39, - 0x1d, 0xe0, 0x30, 0x55, 0xf0, 0x0f, 0xff, 0x22, - 0x7d, 0x70, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, - 0x6d, 0xa1, 0xa0, 0xbc, 0xf0, 0x0f, 0xfe, 0xea, - 0x7d, 0x70, 0x28, 0x00, 0xd0, 0x17, 0xa0, 0xbf, - 0xf0, 0x0f, 0xfe, 0xe4, 0x21, 0x00, 0x91, 0x02, - 0x7d, 0x70, 0x28, 0x00, 0xdd, 0x0c, 0x99, 0x02, - 0x18, 0x60, 0x30, 0x40, 0x7f, 0x01, 0xa0, 0xbc, - 0xf0, 0x0f, 0xfe, 0xd8, 0x99, 0x02, 0x31, 0x01, - 0x91, 0x02, 0x7d, 0x70, 0x42, 0x88, 0xdc, 0xf2, - 0xa0, 0xb9, 0xf0, 0x0f, 0xfe, 0xcf, 0x9a, 0x09, - 0x7b, 0x11, 0xa0, 0xb8, 0xf0, 0x0f, 0xfe, 0xca, - 0x22, 0x1a, 0xb4, 0x04, 0x98, 0x04, 0x9a, 0x0e, - 0x1a, 0x12, 0x18, 0x39, 0x20, 0xc0, 0x1c, 0x23, - 0xf7, 0xff, 0xff, 0x10, 0xb0, 0x01, 0x28, 0x00, - 0xda, 0x6a, 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0x13, - 0x78, 0xb8, 0x06, 0x86, 0x0e, 0xb6, 0x1c, 0x31, - 0xa0, 0xb1, 0xf0, 0x0f, 0xfe, 0xb3, 0x9a, 0x09, - 0x7b, 0x10, 0x42, 0xb0, 0xd1, 0x01, 0x22, 0x01, - 0x67, 0x62, 0x78, 0xb8, 0x23, 0xc0, 0x40, 0x18, - 0x28, 0xc0, 0xd0, 0x02, 0x1c, 0x28, 0xb0, 0x0b, - 0xe6, 0xfe, 0x2e, 0x00, 0xd1, 0x02, 0x1c, 0x28, - 0xb0, 0x0b, 0xe6, 0xf9, 0x78, 0xf8, 0x28, 0x04, - 0xd0, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xf3, - 0x79, 0x38, 0x90, 0x08, 0x23, 0x0b, 0x40, 0x18, - 0x28, 0x09, 0xda, 0x02, 0x1c, 0x28, 0xb0, 0x0b, - 0xe6, 0xea, 0x20, 0x00, 0x21, 0x00, 0x79, 0x7a, - 0x92, 0x07, 0x9a, 0x07, 0x40, 0xca, 0x08, 0x52, - 0xd3, 0x05, 0x30, 0x01, 0x18, 0x3a, 0x79, 0x52, - 0x0a, 0x12, 0xd3, 0x00, 0x30, 0x01, 0x31, 0x01, - 0x29, 0x08, 0xdb, 0xf2, 0x1c, 0x41, 0x98, 0x08, - 0x08, 0xc0, 0xd3, 0x22, 0x20, 0x00, 0x18, 0x7a, - 0x79, 0x52, 0x92, 0x06, 0x07, 0x92, 0xd0, 0x0a, - 0x19, 0xca, 0x79, 0x92, 0x0a, 0x12, 0xd3, 0x05, - 0x30, 0x01, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92, - 0x0a, 0x12, 0xd2, 0xf9, 0x30, 0x01, 0x9a, 0x06, - 0x08, 0x92, 0x07, 0x52, 0xd0, 0x0b, 0x18, 0x0a, - 0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd3, 0x05, - 0x30, 0x01, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92, - 0x0a, 0x12, 0xd2, 0xf9, 0x30, 0x01, 0x18, 0x08, - 0x1c, 0x41, 0x18, 0x78, 0x79, 0x40, 0x28, 0x22, - 0xd0, 0x03, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xab, - 0xe1, 0x49, 0x1c, 0x48, 0x99, 0x08, 0x09, 0x49, - 0xd3, 0x05, 0x18, 0x39, 0x79, 0x49, 0x09, 0x49, - 0xd3, 0x00, 0x30, 0x02, 0x30, 0x01, 0x99, 0x08, - 0x09, 0x49, 0x07, 0x49, 0xd0, 0x1b, 0x22, 0x00, - 0x92, 0x01, 0x92, 0x00, 0x18, 0x39, 0x79, 0x49, - 0x91, 0x05, 0x08, 0xc9, 0x07, 0x89, 0x0f, 0x89, - 0xd0, 0x03, 0x22, 0x01, 0x39, 0x01, 0x40, 0x8a, - 0x92, 0x01, 0x99, 0x05, 0x09, 0x49, 0x07, 0x89, - 0x0f, 0x89, 0xd0, 0x03, 0x22, 0x01, 0x39, 0x01, - 0x40, 0x8a, 0x92, 0x00, 0x99, 0x00, 0x9a, 0x01, - 0x18, 0x51, 0x18, 0x08, 0x30, 0x01, 0x1d, 0x41, - 0x91, 0x03, 0x22, 0x1b, 0xb4, 0x04, 0x99, 0x04, - 0x9a, 0x0e, 0x1a, 0x52, 0x18, 0x79, 0x20, 0xc0, - 0x1c, 0x23, 0xf7, 0xff, 0xfe, 0x6b, 0xb0, 0x01, - 0x28, 0x00, 0xda, 0x02, 0x42, 0x68, 0xb0, 0x0b, - 0xe6, 0x6e, 0x99, 0x03, 0x18, 0x08, 0x22, 0x1b, - 0xb4, 0x04, 0x9a, 0x0e, 0x1a, 0x12, 0x18, 0x39, - 0x20, 0xc1, 0x1c, 0x23, 0xf7, 0xff, 0xfe, 0x5a, - 0xb0, 0x01, 0x28, 0x00, 0xda, 0x02, 0x42, 0x68, - 0xb0, 0x0b, 0xe6, 0x5d, 0x9a, 0x09, 0x74, 0x96, - 0x9a, 0x09, 0x7c, 0x91, 0xa0, 0x5d, 0xf0, 0x0f, - 0xfd, 0xfd, 0xe0, 0xf4, 0x98, 0x14, 0x28, 0x1a, - 0xd1, 0x2f, 0x98, 0x04, 0x28, 0x0e, 0xd0, 0x02, - 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x4c, 0x78, 0xb8, - 0x28, 0x41, 0xd1, 0x02, 0x78, 0xf8, 0x28, 0x02, - 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x43, - 0xa0, 0x5a, 0xf0, 0x0f, 0xfe, 0x5b, 0x99, 0x0a, - 0x1c, 0x02, 0xa0, 0x58, 0xf0, 0x0f, 0xfe, 0x78, - 0x28, 0x00, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, - 0xe6, 0x36, 0xa0, 0x54, 0xf0, 0x0f, 0xfe, 0x4e, - 0x19, 0xc0, 0x1d, 0x01, 0x1d, 0xe0, 0x30, 0x66, - 0x22, 0x04, 0x1c, 0x07, 0xf0, 0x0f, 0xfe, 0x92, - 0x20, 0x00, 0x9a, 0x09, 0x74, 0x50, 0x1c, 0x3a, - 0xa1, 0x4c, 0xa0, 0x4f, 0xf0, 0x0f, 0xfd, 0xca, - 0xe0, 0xc1, 0x98, 0x14, 0x28, 0x1b, 0xd1, 0x11, - 0xa0, 0x4f, 0xf0, 0x0f, 0xfe, 0x37, 0x1c, 0x31, - 0x1c, 0x02, 0xa0, 0x4d, 0xf0, 0x0f, 0xfe, 0x54, - 0x28, 0x00, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, - 0xe6, 0x12, 0xa1, 0x49, 0xa0, 0x4b, 0xf0, 0x0f, - 0xfd, 0xb5, 0xe0, 0xac, 0x42, 0x68, 0xb0, 0x0b, - 0xe6, 0x0a, 0xa0, 0x4c, 0xf0, 0x0f, 0xfe, 0x22, - 0x1c, 0x31, 0x1c, 0x02, 0xa0, 0x49, 0xf0, 0x0f, - 0xfe, 0x3f, 0x28, 0x00, 0xe0, 0x96, 0x00, 0x00, - 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x61, - 0x72, 0x73, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x3a, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, - 0x20, 0x3d, 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, - 0x78, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x30, 0x78, - 0x25, 0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 0x00, - 0x76, 0x65, 0x72, 0x73, 0x5f, 0x31, 0x3a, 0x20, - 0x25, 0x64, 0x2e, 0x25, 0x64, 0x2c, 0x20, 0x25, - 0x73, 0x00, 0x00, 0x00, 0x2c, 0x20, 0x25, 0x73, - 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x6e, 0x66, - 0x69, 0x64, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, - 0x34, 0x78, 0x20, 0x20, 0x30, 0x78, 0x25, 0x30, - 0x34, 0x78, 0x0a, 0x00, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x20, 0x62, 0x61, 0x73, 0x65, 0x3a, - 0x20, 0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x73, 0x6b, - 0x3a, 0x20, 0x30, 0x78, 0x00, 0x00, 0x00, 0x00, - 0x25, 0x30, 0x32, 0x78, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x20, - 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 0x0a, 0x00, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x20, 0x6e, 0x62, 0x3a, - 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x63, 0x66, 0x67, 0x20, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, - 0x72, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, 0x20, - 0x0a, 0x00, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f, - 0x43, 0x49, 0x5f, 0x56, 0x00, 0x00, 0x00, 0x00, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, - 0x20, 0x25, 0x73, 0x25, 0x73, 0x0a, 0x00, 0x00, - 0x44, 0x56, 0x42, 0x5f, 0x48, 0x4f, 0x53, 0x54, - 0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x63, 0x65, - 0x5f, 0x65, 0x76, 0x3a, 0x20, 0x25, 0x73, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f, - 0x43, 0x49, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, - 0x45, 0x00, 0x00, 0x00, 0xd0, 0x02, 0x42, 0x68, - 0xb0, 0x0b, 0xe5, 0x65, 0x46, 0x79, 0x39, 0x1c, - 0xa0, 0x04, 0xf0, 0x0f, 0xfd, 0x07, 0x1c, 0x28, - 0xb0, 0x0b, 0xe5, 0x5d, 0x1c, 0x28, 0xb0, 0x0b, - 0xe5, 0x5a, 0x00, 0x00, 0x73, 0x74, 0x63, 0x65, - 0x5f, 0x70, 0x64, 0x3a, 0x20, 0x25, 0x73, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x26, 0x00, - 0x1c, 0x04, 0x20, 0x00, 0x67, 0x60, 0x1c, 0x0d, - 0x1c, 0x17, 0xe0, 0x00, 0x36, 0x01, 0x42, 0xbe, - 0xda, 0x02, 0x5d, 0xa8, 0x28, 0x1d, 0xd1, 0xf9, - 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, - 0x20, 0x1d, 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x32, - 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, - 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, - 0x19, 0xa9, 0x20, 0x1c, 0x1c, 0x23, 0xf7, 0xff, - 0xfd, 0x21, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, - 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, - 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x15, 0x1c, 0x23, - 0xf7, 0xff, 0xfd, 0x10, 0xb0, 0x01, 0x28, 0x00, + 0x2e, 0x00, 0x85, 0xcc, 0x00, 0x01, 0x38, 0x08, + 0x00, 0x01, 0x39, 0x00, 0xb5, 0xf3, 0xb0, 0x83, + 0x1c, 0x07, 0x99, 0x04, 0x00, 0x88, 0x19, 0xc0, + 0x4b, 0x2f, 0x18, 0xc0, 0x90, 0x02, 0x68, 0x84, + 0x4b, 0x2e, 0x18, 0xfb, 0x93, 0x01, 0x2c, 0x00, + 0xd0, 0x46, 0x25, 0x00, 0x7c, 0x26, 0x69, 0x60, + 0x68, 0x39, 0x43, 0x48, 0x7c, 0x61, 0x23, 0x80, + 0x40, 0x19, 0x91, 0x00, 0x30, 0x02, 0x19, 0x81, + 0x02, 0x5b, 0x39, 0x02, 0x42, 0x99, 0xdd, 0x04, + 0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x18, 0x38, 0x1d, 0xc1, 0x31, 0x01, + 0x19, 0x78, 0x1e, 0xb2, 0x4b, 0x20, 0x18, 0xc0, + 0xf0, 0x10, 0xf8, 0x9c, 0x19, 0xa8, 0x1e, 0x85, + 0x68, 0xa0, 0x42, 0xa0, 0xd0, 0x04, 0x1c, 0x04, + 0xd0, 0x02, 0x99, 0x00, 0x29, 0x00, 0xd1, 0xd9, + 0x23, 0x01, 0x02, 0xdb, 0x42, 0x9d, 0xda, 0x1b, + 0x9b, 0x01, 0x68, 0xda, 0x4b, 0x16, 0x18, 0xf8, + 0x9b, 0x01, 0x69, 0x9b, 0x1c, 0x29, 0xf0, 0x10, + 0xf8, 0x2d, 0x28, 0x00, 0xd1, 0x18, 0x98, 0x02, + 0x68, 0x81, 0x29, 0x00, 0xd0, 0x0c, 0x7c, 0x48, + 0x24, 0x80, 0x40, 0x04, 0x22, 0x01, 0x1c, 0x38, + 0xf7, 0xff, 0xfe, 0xd5, 0x98, 0x02, 0x68, 0x81, + 0x29, 0x00, 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0xf2, + 0x99, 0x04, 0x1c, 0x48, 0xd5, 0x06, 0x42, 0x40, + 0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, 0xe0, 0x03, + 0xb0, 0x03, 0xe7, 0xbe, 0x06, 0xc0, 0x0e, 0xc0, + 0x9b, 0x01, 0x72, 0x58, 0xb0, 0x03, 0xe7, 0xb8, + 0x00, 0x01, 0x3a, 0x80, 0x00, 0x01, 0x3b, 0x80, + 0x00, 0x01, 0x30, 0x08, 0xb5, 0xf0, 0x21, 0x00, + 0x4b, 0x24, 0x18, 0xc4, 0x7a, 0xe7, 0x7a, 0xa2, + 0x25, 0x00, 0x2a, 0x00, 0xd1, 0x03, 0x1c, 0x28, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x22, 0x00, + 0xe0, 0x1e, 0x00, 0x7b, 0x18, 0x1e, 0x4b, 0x1e, + 0x18, 0xf6, 0x23, 0x08, 0x5e, 0xf3, 0x2b, 0x00, + 0xdb, 0x0c, 0x00, 0xbb, 0x18, 0x1e, 0x23, 0x9d, + 0x02, 0x5b, 0x18, 0xf3, 0x68, 0x9b, 0x2b, 0x00, + 0xd0, 0x04, 0x7c, 0x5e, 0x0a, 0x33, 0xd2, 0x01, + 0x21, 0x01, 0xe0, 0x09, 0x37, 0x01, 0xd5, 0x04, + 0x42, 0x7f, 0x06, 0xff, 0x0e, 0xff, 0x42, 0x7f, + 0xe0, 0x01, 0x06, 0xff, 0x0e, 0xff, 0x32, 0x01, + 0x2a, 0x20, 0xda, 0x01, 0x29, 0x00, 0xd0, 0xdc, + 0x29, 0x00, 0xd1, 0x04, 0x72, 0xe5, 0x1c, 0x28, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x72, 0xe7, + 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x57, 0x1c, 0x78, + 0xd5, 0x04, 0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0, + 0x42, 0x40, 0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0, + 0x72, 0xe0, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x00, 0x01, 0x3b, 0x80, + 0x00, 0x01, 0x3b, 0x40, 0xb5, 0xb0, 0x78, 0x0b, + 0x1c, 0x14, 0x1c, 0x05, 0x1c, 0x0f, 0xa1, 0x0c, + 0x48, 0x0c, 0xf0, 0x10, 0xf8, 0xd1, 0x78, 0x3a, + 0xb4, 0x04, 0x22, 0x01, 0x1c, 0x28, 0x1c, 0x39, + 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x86, 0xb0, 0x01, + 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x63, 0x69, 0x3a, 0x00, 0x2e, 0x00, 0x85, 0xcc, + 0xb5, 0xf0, 0x1c, 0x07, 0x4b, 0x2a, 0x18, 0xc4, + 0x7a, 0x65, 0x7a, 0x20, 0x28, 0x00, 0xd1, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x43, 0xc1, 0xe0, 0x09, 0x35, 0x01, 0xd5, 0x04, + 0x42, 0x6d, 0x06, 0xed, 0x0e, 0xed, 0x42, 0x6d, + 0xe0, 0x01, 0x06, 0xed, 0x0e, 0xed, 0x30, 0x01, + 0x28, 0x20, 0xda, 0x07, 0x00, 0x6a, 0x19, 0xd2, + 0x4b, 0x1e, 0x18, 0xd2, 0x23, 0x08, 0x5e, 0xd2, + 0x42, 0x8a, 0xd0, 0xeb, 0x00, 0xa8, 0x19, 0xc0, + 0x4b, 0x1b, 0x18, 0xc1, 0x68, 0x89, 0x29, 0x00, + 0xd0, 0x10, 0x72, 0x65, 0x4b, 0x19, 0x18, 0xc6, + 0x68, 0xb1, 0x69, 0x48, 0x68, 0x3a, 0x43, 0x50, + 0x7c, 0x09, 0x18, 0x0a, 0x23, 0x01, 0x04, 0x1b, + 0x42, 0x9a, 0xdd, 0x08, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x72, 0x60, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x38, + 0x69, 0x22, 0x69, 0x63, 0x30, 0x08, 0xf0, 0x0f, + 0xff, 0x4d, 0x22, 0x00, 0x68, 0xb1, 0x1c, 0x38, + 0xf7, 0xff, 0xfd, 0xfd, 0x1c, 0x68, 0xd5, 0x04, + 0x42, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x42, 0x40, + 0xe0, 0x01, 0x06, 0xc0, 0x0e, 0xc0, 0x72, 0x60, + 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x00, 0x01, 0x3b, 0x80, 0x00, 0x01, 0x3b, 0x00, + 0x00, 0x01, 0x39, 0x00, 0x00, 0x01, 0x39, 0x80, + 0xb5, 0xff, 0xb0, 0x8b, 0x9a, 0x0d, 0x1c, 0x1c, + 0x1c, 0x0f, 0x2a, 0x02, 0xda, 0x06, 0x20, 0x00, + 0x43, 0xc0, 0xb0, 0x0b, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x78, 0x79, 0x91, 0x04, + 0x31, 0x02, 0x78, 0x3b, 0x1c, 0x0d, 0x42, 0x83, + 0xd0, 0x07, 0x1c, 0x19, 0x1c, 0x02, 0xa0, 0xf9, + 0xf0, 0x10, 0xf8, 0x3e, 0x42, 0x68, 0xb0, 0x0b, + 0xe7, 0xec, 0x9a, 0x0d, 0x42, 0x91, 0xdd, 0x02, + 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xe6, 0x1d, 0x39, + 0x91, 0x0a, 0x1d, 0xe2, 0x32, 0x59, 0x92, 0x09, + 0x1d, 0xe6, 0x36, 0x39, 0x28, 0x1d, 0xd0, 0x63, + 0xdc, 0x08, 0x28, 0x15, 0xd0, 0x13, 0x28, 0x1a, + 0xd0, 0x5f, 0x28, 0x1b, 0xd0, 0x5e, 0x28, 0x1c, + 0xd0, 0x5a, 0xe0, 0x7a, 0x28, 0x20, 0xd0, 0x41, + 0x1c, 0xbe, 0x28, 0xc0, 0xd0, 0x74, 0x28, 0xc1, + 0xd1, 0x73, 0x98, 0x14, 0x28, 0x1b, 0xd0, 0x71, + 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xc6, 0x78, 0xb8, + 0x28, 0x05, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, + 0xe7, 0xc0, 0x78, 0xf8, 0x28, 0x00, 0xd0, 0x02, + 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0xba, 0x98, 0x04, + 0x1e, 0x82, 0x2a, 0x4f, 0xda, 0x04, 0x99, 0x0a, + 0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x33, 0xe0, 0x04, + 0x22, 0x4f, 0x99, 0x0a, 0x1c, 0x20, 0xf0, 0x0f, + 0xff, 0x2d, 0x78, 0xfa, 0x78, 0xb9, 0x9c, 0x0a, + 0xa0, 0xe0, 0x1c, 0x23, 0xf0, 0x0f, 0xff, 0xf4, + 0x98, 0x04, 0x18, 0x38, 0x1c, 0x47, 0x42, 0xa7, + 0xd9, 0x0c, 0x1c, 0x20, 0xf0, 0x0f, 0xff, 0x62, + 0x19, 0x00, 0x1c, 0x44, 0x42, 0xa7, 0xd9, 0x03, + 0x1c, 0x21, 0xa0, 0xdd, 0xf0, 0x0f, 0xff, 0xe4, + 0x42, 0xa7, 0xd8, 0xf2, 0xa0, 0xd4, 0xf0, 0x0f, + 0xff, 0xdf, 0xe0, 0xe3, 0x98, 0x04, 0x28, 0x04, + 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe7, 0x89, + 0x78, 0xf8, 0x02, 0x00, 0x78, 0xb9, 0x43, 0x08, + 0x82, 0x30, 0x79, 0x78, 0x02, 0x00, 0x79, 0x39, + 0x43, 0x08, 0x82, 0x70, 0x8a, 0x72, 0x8a, 0x31, + 0xa0, 0xd1, 0xf0, 0x0f, 0xff, 0xc9, 0xe0, 0xcd, + 0xe2, 0x17, 0xe0, 0x00, 0xe0, 0x62, 0x78, 0xb8, + 0x07, 0x80, 0x0f, 0x80, 0x30, 0x01, 0x75, 0x30, + 0x78, 0xb8, 0x08, 0x80, 0x07, 0x00, 0x0f, 0x00, + 0x30, 0x01, 0x75, 0x70, 0x78, 0xf8, 0x9a, 0x09, + 0x73, 0x10, 0x20, 0x00, 0x65, 0xa0, 0x7d, 0x31, + 0x29, 0x00, 0xdd, 0x0e, 0x18, 0x39, 0x79, 0x09, + 0x00, 0xc2, 0x40, 0x91, 0x6d, 0xa2, 0x43, 0x11, + 0x65, 0xa1, 0x7d, 0x31, 0x30, 0x01, 0xe0, 0x02, + 0xe1, 0x02, 0xe1, 0xf9, 0xe1, 0x4b, 0x42, 0x81, + 0xdc, 0xf0, 0x7d, 0x30, 0x30, 0x04, 0x90, 0x03, + 0x7d, 0x72, 0x18, 0x39, 0x1d, 0xe0, 0x30, 0x55, + 0xf0, 0x0f, 0xfe, 0xcc, 0x7d, 0x70, 0x99, 0x03, + 0x18, 0x40, 0x90, 0x03, 0x6d, 0xa1, 0xa0, 0xbc, + 0xf0, 0x0f, 0xff, 0x92, 0x7d, 0x70, 0x28, 0x00, + 0xd0, 0x17, 0xa0, 0xbf, 0xf0, 0x0f, 0xff, 0x8c, + 0x21, 0x00, 0x91, 0x02, 0x7d, 0x70, 0x28, 0x00, + 0xdd, 0x0c, 0x99, 0x02, 0x18, 0x60, 0x30, 0x40, + 0x7f, 0x01, 0xa0, 0xbc, 0xf0, 0x0f, 0xff, 0x80, + 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, 0x7d, 0x70, + 0x42, 0x88, 0xdc, 0xf2, 0xa0, 0xb9, 0xf0, 0x0f, + 0xff, 0x77, 0x9a, 0x09, 0x7b, 0x11, 0xa0, 0xb8, + 0xf0, 0x0f, 0xff, 0x72, 0x22, 0x1a, 0xb4, 0x04, + 0x98, 0x04, 0x9a, 0x0e, 0x1a, 0x12, 0x18, 0x39, + 0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff, 0xff, 0x10, + 0xb0, 0x01, 0x28, 0x00, 0xda, 0x6a, 0x42, 0x68, + 0xb0, 0x0b, 0xe7, 0x13, 0x78, 0xb8, 0x06, 0x86, + 0x0e, 0xb6, 0x1c, 0x31, 0xa0, 0xb1, 0xf0, 0x0f, + 0xff, 0x5b, 0x9a, 0x09, 0x7b, 0x10, 0x42, 0xb0, + 0xd1, 0x01, 0x22, 0x01, 0x67, 0x62, 0x78, 0xb8, + 0x23, 0xc0, 0x40, 0x18, 0x28, 0xc0, 0xd0, 0x02, + 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xfe, 0x2e, 0x00, + 0xd1, 0x02, 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xf9, + 0x78, 0xf8, 0x28, 0x04, 0xd0, 0x02, 0x1c, 0x28, + 0xb0, 0x0b, 0xe6, 0xf3, 0x79, 0x38, 0x90, 0x08, + 0x23, 0x0b, 0x40, 0x18, 0x28, 0x09, 0xda, 0x02, + 0x1c, 0x28, 0xb0, 0x0b, 0xe6, 0xea, 0x20, 0x00, + 0x21, 0x00, 0x79, 0x7a, 0x92, 0x07, 0x9a, 0x07, + 0x40, 0xca, 0x08, 0x52, 0xd3, 0x05, 0x30, 0x01, + 0x18, 0x3a, 0x79, 0x52, 0x0a, 0x12, 0xd3, 0x00, + 0x30, 0x01, 0x31, 0x01, 0x29, 0x08, 0xdb, 0xf2, + 0x1c, 0x41, 0x98, 0x08, 0x08, 0xc0, 0xd3, 0x22, + 0x20, 0x00, 0x18, 0x7a, 0x79, 0x52, 0x92, 0x06, + 0x07, 0x92, 0xd0, 0x0a, 0x19, 0xca, 0x79, 0x92, + 0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a, + 0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9, + 0x30, 0x01, 0x9a, 0x06, 0x08, 0x92, 0x07, 0x52, + 0xd0, 0x0b, 0x18, 0x0a, 0x19, 0xd2, 0x79, 0x92, + 0x0a, 0x12, 0xd3, 0x05, 0x30, 0x01, 0x18, 0x0a, + 0x19, 0xd2, 0x79, 0x92, 0x0a, 0x12, 0xd2, 0xf9, + 0x30, 0x01, 0x18, 0x08, 0x1c, 0x41, 0x18, 0x78, + 0x79, 0x40, 0x28, 0x22, 0xd0, 0x03, 0x1c, 0x28, + 0xb0, 0x0b, 0xe6, 0xab, 0xe1, 0x49, 0x1c, 0x48, + 0x99, 0x08, 0x09, 0x49, 0xd3, 0x05, 0x18, 0x39, + 0x79, 0x49, 0x09, 0x49, 0xd3, 0x00, 0x30, 0x02, + 0x30, 0x01, 0x99, 0x08, 0x09, 0x49, 0x07, 0x49, + 0xd0, 0x1b, 0x22, 0x00, 0x92, 0x01, 0x92, 0x00, + 0x18, 0x39, 0x79, 0x49, 0x91, 0x05, 0x08, 0xc9, + 0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03, 0x22, 0x01, + 0x39, 0x01, 0x40, 0x8a, 0x92, 0x01, 0x99, 0x05, + 0x09, 0x49, 0x07, 0x89, 0x0f, 0x89, 0xd0, 0x03, + 0x22, 0x01, 0x39, 0x01, 0x40, 0x8a, 0x92, 0x00, + 0x99, 0x00, 0x9a, 0x01, 0x18, 0x51, 0x18, 0x08, + 0x30, 0x01, 0x1d, 0x41, 0x91, 0x03, 0x22, 0x1b, + 0xb4, 0x04, 0x99, 0x04, 0x9a, 0x0e, 0x1a, 0x52, + 0x18, 0x79, 0x20, 0xc0, 0x1c, 0x23, 0xf7, 0xff, + 0xfe, 0x6b, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x02, + 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x6e, 0x99, 0x03, + 0x18, 0x08, 0x22, 0x1b, 0xb4, 0x04, 0x9a, 0x0e, + 0x1a, 0x12, 0x18, 0x39, 0x20, 0xc1, 0x1c, 0x23, + 0xf7, 0xff, 0xfe, 0x5a, 0xb0, 0x01, 0x28, 0x00, + 0xda, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x5d, + 0x9a, 0x09, 0x74, 0x96, 0x9a, 0x09, 0x7c, 0x91, + 0xa0, 0x5d, 0xf0, 0x0f, 0xfe, 0xa5, 0xe0, 0xf4, + 0x98, 0x14, 0x28, 0x1a, 0xd1, 0x2f, 0x98, 0x04, + 0x28, 0x0e, 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, + 0xe6, 0x4c, 0x78, 0xb8, 0x28, 0x41, 0xd1, 0x02, + 0x78, 0xf8, 0x28, 0x02, 0xd0, 0x02, 0x42, 0x68, + 0xb0, 0x0b, 0xe6, 0x43, 0xa0, 0x5a, 0xf0, 0x0f, + 0xfe, 0x05, 0x99, 0x0a, 0x1c, 0x02, 0xa0, 0x58, + 0xf0, 0x0f, 0xfe, 0xba, 0x28, 0x00, 0xd0, 0x02, + 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x36, 0xa0, 0x54, + 0xf0, 0x0f, 0xfd, 0xf8, 0x19, 0xc0, 0x1d, 0x01, + 0x1d, 0xe0, 0x30, 0x66, 0x22, 0x04, 0x1c, 0x07, + 0xf0, 0x0f, 0xfe, 0x2c, 0x20, 0x00, 0x9a, 0x09, + 0x74, 0x50, 0x1c, 0x3a, 0xa1, 0x4c, 0xa0, 0x4f, + 0xf0, 0x0f, 0xfe, 0x72, 0xe0, 0xc1, 0x98, 0x14, + 0x28, 0x1b, 0xd1, 0x11, 0xa0, 0x4f, 0xf0, 0x0f, + 0xfd, 0xe1, 0x1c, 0x31, 0x1c, 0x02, 0xa0, 0x4d, + 0xf0, 0x0f, 0xfe, 0x96, 0x28, 0x00, 0xd0, 0x02, + 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x12, 0xa1, 0x49, + 0xa0, 0x4b, 0xf0, 0x0f, 0xfe, 0x5d, 0xe0, 0xac, + 0x42, 0x68, 0xb0, 0x0b, 0xe6, 0x0a, 0xa0, 0x4c, + 0xf0, 0x0f, 0xfd, 0xcc, 0x1c, 0x31, 0x1c, 0x02, + 0xa0, 0x49, 0xf0, 0x0f, 0xfe, 0x81, 0x28, 0x00, + 0xe0, 0x96, 0x00, 0x00, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x30, + 0x78, 0x25, 0x30, 0x32, 0x78, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x30, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x0a, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73, + 0x5f, 0x31, 0x3a, 0x20, 0x25, 0x64, 0x2e, 0x25, + 0x64, 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, + 0x2c, 0x20, 0x25, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x6e, 0x66, 0x69, 0x64, 0x3a, 0x20, + 0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x20, 0x20, + 0x30, 0x78, 0x25, 0x30, 0x34, 0x78, 0x0a, 0x00, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, + 0x30, 0x34, 0x78, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x6d, 0x61, 0x73, 0x6b, 0x3a, 0x20, 0x30, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x32, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x3a, 0x20, 0x30, 0x78, 0x25, 0x30, + 0x32, 0x78, 0x0a, 0x00, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x6e, 0x62, 0x3a, 0x20, 0x30, 0x78, 0x25, + 0x30, 0x32, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x63, 0x66, 0x67, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x63, 0x6f, 0x72, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x30, 0x78, 0x25, + 0x30, 0x32, 0x78, 0x20, 0x0a, 0x00, 0x00, 0x00, + 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x56, + 0x00, 0x00, 0x00, 0x00, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x25, 0x73, 0x25, + 0x73, 0x0a, 0x00, 0x00, 0x44, 0x56, 0x42, 0x5f, + 0x48, 0x4f, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, + 0x73, 0x74, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x3a, + 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x56, 0x42, 0x5f, 0x43, 0x49, 0x5f, 0x4d, + 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x00, 0x00, 0x00, + 0xd0, 0x02, 0x42, 0x68, 0xb0, 0x0b, 0xe5, 0x65, + 0x46, 0x79, 0x39, 0x1c, 0xa0, 0x04, 0xf0, 0x0f, + 0xfd, 0xaf, 0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5d, + 0x1c, 0x28, 0xb0, 0x0b, 0xe5, 0x5a, 0x00, 0x00, + 0x73, 0x74, 0x63, 0x65, 0x5f, 0x70, 0x64, 0x3a, + 0x20, 0x25, 0x73, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0xb5, 0xf0, 0x26, 0x00, 0x1c, 0x04, 0x20, 0x00, + 0x67, 0x60, 0x1c, 0x0d, 0x1c, 0x17, 0xe0, 0x00, + 0x36, 0x01, 0x42, 0xbe, 0xda, 0x02, 0x5d, 0xa8, + 0x28, 0x1d, 0xd1, 0xf9, 0x22, 0x00, 0xb4, 0x04, + 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1d, 0x1c, 0x23, + 0xf7, 0xff, 0xfd, 0x32, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0x22, 0x00, - 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x20, - 0x1c, 0x23, 0xf7, 0xff, 0xfc, 0xff, 0xb0, 0x01, + 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1c, + 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x21, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, - 0x20, 0x1a, 0x1c, 0x23, 0xf7, 0xff, 0xfc, 0xee, + 0x20, 0x15, 0x1c, 0x23, 0xf7, 0xff, 0xfd, 0x10, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x18, 0x36, 0xe0, 0x10, 0x22, 0x00, 0xb4, 0x04, - 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1b, 0x1c, 0x23, - 0xf7, 0xff, 0xfc, 0xdc, 0xb0, 0x01, 0x28, 0x00, + 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, + 0x19, 0xa9, 0x20, 0x20, 0x1c, 0x23, 0xf7, 0xff, + 0xfc, 0xff, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, + 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x18, 0x36, 0x22, 0x00, 0xb4, 0x04, + 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x1a, 0x1c, 0x23, + 0xf7, 0xff, 0xfc, 0xee, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0x42, 0xbe, - 0xda, 0x02, 0x6f, 0x60, 0x28, 0x00, 0xd0, 0xe9, + 0xbc, 0x08, 0x47, 0x18, 0x18, 0x36, 0xe0, 0x10, 0x22, 0x00, 0xb4, 0x04, 0x1b, 0xba, 0x19, 0xa9, - 0x20, 0x14, 0x1c, 0x23, 0xf7, 0xff, 0xfc, 0xc6, + 0x20, 0x1b, 0x1c, 0x23, 0xf7, 0xff, 0xfc, 0xdc, 0xb0, 0x01, 0x28, 0x00, 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0xf7, 0x06, 0x0e, 0x0e, 0x36, 0xb0, 0x83, - 0xf0, 0x0c, 0xfc, 0x4c, 0x1c, 0x05, 0xd0, 0x05, - 0x00, 0xa8, 0x30, 0x0c, 0xf7, 0xfc, 0xff, 0x56, - 0x1c, 0x04, 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x22, - 0x95, 0x01, 0x1d, 0xe0, 0x30, 0x05, 0x90, 0x02, - 0x46, 0x6a, 0xb4, 0x04, 0x25, 0x00, 0x98, 0x04, - 0x1c, 0x31, 0xaa, 0x02, 0x1c, 0x2b, 0x1c, 0x27, - 0xf0, 0x0c, 0xf9, 0xf2, 0xb0, 0x01, 0x98, 0x00, - 0x60, 0x38, 0x28, 0x00, 0xd0, 0x0b, 0x99, 0x05, - 0xf0, 0x0c, 0xfb, 0xc8, 0x28, 0x00, 0xd1, 0x02, - 0x60, 0x7d, 0x1c, 0x38, 0xe0, 0x07, 0x68, 0x38, - 0xa9, 0x01, 0xf0, 0x0c, 0xfa, 0x11, 0x1c, 0x20, - 0xf7, 0xfc, 0xff, 0x52, 0x1c, 0x28, 0xb0, 0x03, - 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0xff, 0x9c, 0x0b, 0x9d, 0x09, 0x9e, 0x0a, - 0xb0, 0x8c, 0x4a, 0x78, 0x92, 0x0b, 0x49, 0x78, - 0x91, 0x0a, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, - 0x00, 0x81, 0x9a, 0x0b, 0x58, 0x51, 0x29, 0x00, - 0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x19, 0x30, 0x01, - 0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x15, 0x2c, 0x08, - 0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0b, - 0x58, 0x10, 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, - 0xe0, 0xcf, 0x23, 0x20, 0x99, 0x0a, 0x5e, 0xcc, - 0x1c, 0x60, 0x84, 0x08, 0x99, 0x0a, 0x5e, 0xc8, - 0x28, 0x00, 0xd1, 0x02, 0x20, 0x64, 0x99, 0x0a, - 0x84, 0x08, 0x2e, 0x00, 0xd0, 0x03, 0x2e, 0x01, - 0xd1, 0x03, 0x22, 0x01, 0xe0, 0x02, 0x22, 0x00, - 0xe0, 0x00, 0x22, 0x03, 0x92, 0x01, 0x1c, 0x28, - 0xf0, 0x08, 0xfd, 0xfd, 0x90, 0x00, 0x00, 0x80, - 0x30, 0x80, 0xf7, 0xfc, 0xfe, 0xeb, 0x1c, 0x07, - 0xd0, 0xdd, 0x98, 0x00, 0x1d, 0xc2, 0x32, 0x79, - 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0xd0, - 0x98, 0x00, 0x60, 0xf8, 0x1d, 0xf8, 0x30, 0x79, - 0x61, 0x38, 0x98, 0x0e, 0x86, 0x78, 0x98, 0x0f, - 0x86, 0xb8, 0x98, 0x0c, 0x90, 0x02, 0x99, 0x0d, - 0x91, 0x03, 0x9a, 0x0e, 0x18, 0x80, 0x38, 0x01, - 0x90, 0x04, 0x98, 0x0f, 0x18, 0x08, 0x38, 0x01, - 0x90, 0x05, 0xa8, 0x02, 0x1c, 0x29, 0xf0, 0x08, - 0xfd, 0xdd, 0x61, 0x78, 0x9a, 0x01, 0x2a, 0x00, - 0xd0, 0x0e, 0x2a, 0x01, 0xd1, 0x1e, 0x00, 0x80, - 0xf7, 0xfc, 0xfe, 0xc0, 0x61, 0xb8, 0x28, 0x00, + 0x18, 0x36, 0x42, 0xbe, 0xda, 0x02, 0x6f, 0x60, + 0x28, 0x00, 0xd0, 0xe9, 0x22, 0x00, 0xb4, 0x04, + 0x1b, 0xba, 0x19, 0xa9, 0x20, 0x14, 0x1c, 0x23, + 0xf7, 0xff, 0xfc, 0xc6, 0xb0, 0x01, 0x28, 0x00, + 0xda, 0x04, 0x20, 0x00, 0x43, 0xc0, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf7, 0x06, 0x0e, + 0x0e, 0x36, 0xb0, 0x83, 0xf0, 0x0c, 0xfc, 0x40, + 0x1c, 0x05, 0xd0, 0x05, 0x00, 0xa8, 0x30, 0x0c, + 0xf7, 0xfc, 0xfc, 0x2c, 0x1c, 0x04, 0xd1, 0x01, + 0x20, 0x00, 0xe0, 0x22, 0x95, 0x01, 0x1d, 0xe0, + 0x30, 0x05, 0x90, 0x02, 0x46, 0x6a, 0xb4, 0x04, + 0x25, 0x00, 0x98, 0x04, 0x1c, 0x31, 0xaa, 0x02, + 0x1c, 0x2b, 0x1c, 0x27, 0xf0, 0x0c, 0xf9, 0xe6, + 0xb0, 0x01, 0x98, 0x00, 0x60, 0x38, 0x28, 0x00, + 0xd0, 0x0b, 0x99, 0x05, 0xf0, 0x0c, 0xfb, 0xbc, + 0x28, 0x00, 0xd1, 0x02, 0x60, 0x7d, 0x1c, 0x38, + 0xe0, 0x07, 0x68, 0x38, 0xa9, 0x01, 0xf0, 0x0c, + 0xfa, 0x05, 0x1c, 0x20, 0xf7, 0xfc, 0xfc, 0x28, + 0x1c, 0x28, 0xb0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x9c, 0x0b, + 0x9e, 0x09, 0xb0, 0x8b, 0x4a, 0x7c, 0x92, 0x0a, + 0x4d, 0x7c, 0x2c, 0x00, 0xd1, 0x0b, 0x20, 0x00, + 0x00, 0x81, 0x9a, 0x0a, 0x58, 0x51, 0x29, 0x00, + 0xd1, 0x01, 0x1c, 0x04, 0xe0, 0x16, 0x30, 0x01, + 0x28, 0x08, 0xdb, 0xf5, 0xe0, 0x12, 0x2c, 0x08, + 0xd8, 0x07, 0x3c, 0x01, 0x00, 0xa0, 0x9a, 0x0a, + 0x58, 0x10, 0x28, 0x00, 0xd0, 0x0a, 0x20, 0x00, + 0xe0, 0xd8, 0x23, 0x20, 0x5e, 0xec, 0x1c, 0x60, + 0x84, 0x28, 0x5e, 0xe8, 0x28, 0x00, 0xd1, 0x01, + 0x20, 0x64, 0x84, 0x28, 0x98, 0x15, 0x28, 0x00, + 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x22, 0x01, + 0xe0, 0x02, 0x22, 0x00, 0xe0, 0x00, 0x22, 0x03, + 0x92, 0x01, 0x1c, 0x30, 0xf0, 0x08, 0xfd, 0xf5, + 0x90, 0x00, 0x00, 0x80, 0x30, 0x80, 0xf7, 0xfc, + 0xfb, 0xc5, 0x1c, 0x07, 0xd0, 0xdf, 0x98, 0x00, + 0x1d, 0xc2, 0x32, 0x79, 0x21, 0x00, 0x1c, 0x38, + 0xf0, 0x0f, 0xfc, 0x2e, 0x98, 0x00, 0x60, 0xf8, + 0x1d, 0xf8, 0x30, 0x79, 0x61, 0x38, 0x98, 0x0d, + 0x86, 0x78, 0x98, 0x0e, 0x86, 0xb8, 0x98, 0x0b, + 0x90, 0x02, 0x99, 0x0c, 0x91, 0x03, 0x9a, 0x0d, + 0x18, 0x80, 0x38, 0x01, 0x90, 0x04, 0x98, 0x0e, + 0x18, 0x08, 0x38, 0x01, 0x90, 0x05, 0xa8, 0x02, + 0x1c, 0x31, 0xf0, 0x08, 0xfd, 0xd5, 0x61, 0x78, + 0x9a, 0x01, 0x2a, 0x00, 0xd0, 0x0e, 0x2a, 0x01, + 0xd1, 0x27, 0x00, 0x80, 0xf7, 0xfc, 0xfb, 0x9a, + 0x61, 0xb8, 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, + 0x00, 0x8a, 0x21, 0x00, 0xf0, 0x0f, 0xfc, 0x04, + 0x20, 0x01, 0xe0, 0x14, 0x23, 0x28, 0x5e, 0xe8, + 0x1c, 0x41, 0x85, 0x29, 0x28, 0x00, 0xd1, 0x01, + 0xf7, 0xf7, 0xf8, 0x5e, 0x69, 0x78, 0x00, 0x80, + 0xf7, 0xfc, 0xfb, 0xcc, 0x61, 0xb8, 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, 0x21, 0x00, - 0xf0, 0x0f, 0xfb, 0xa6, 0x20, 0x01, 0xe0, 0x0b, - 0x00, 0x80, 0xf7, 0xfc, 0xfe, 0xfb, 0x61, 0xb8, - 0x28, 0x00, 0xd0, 0x04, 0x69, 0x79, 0x00, 0x8a, - 0x21, 0x00, 0xf0, 0x0f, 0xfb, 0x99, 0x20, 0x00, - 0x86, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, - 0x43, 0x18, 0xe0, 0x0d, 0x61, 0xbe, 0x0e, 0x36, - 0x06, 0x36, 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xde, - 0xd1, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, - 0x86, 0x38, 0x69, 0xf8, 0x4b, 0x33, 0x40, 0x18, - 0x61, 0xf8, 0x69, 0xb8, 0x28, 0x00, 0xd1, 0x06, - 0x69, 0x78, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, - 0xf7, 0xfc, 0xfe, 0xae, 0xe7, 0x7f, 0x68, 0xf8, - 0x90, 0x06, 0x69, 0x38, 0x90, 0x07, 0x69, 0x78, - 0x90, 0x08, 0x69, 0xb8, 0x90, 0x09, 0xa8, 0x02, - 0x1c, 0x21, 0x1d, 0xfa, 0x32, 0x01, 0xb4, 0x07, - 0x1c, 0x2a, 0xb4, 0x04, 0x20, 0x00, 0x9a, 0x05, - 0xa9, 0x0a, 0xab, 0x0c, 0xf0, 0x03, 0xf8, 0xb4, - 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x38, - 0xf0, 0x00, 0xf8, 0x5f, 0xe7, 0x63, 0x2d, 0x00, - 0xd0, 0x09, 0x2d, 0x01, 0xd0, 0x07, 0x2d, 0x02, - 0xd0, 0x05, 0x2d, 0x03, 0xd0, 0x03, 0x23, 0x02, - 0x69, 0xf8, 0x43, 0x18, 0x61, 0xf8, 0x85, 0xfc, - 0x2c, 0x08, 0xd2, 0x02, 0x00, 0xa0, 0x9a, 0x0b, - 0x50, 0x17, 0x20, 0x01, 0x24, 0x00, 0x63, 0xf8, - 0x63, 0xbc, 0x85, 0xbd, 0x21, 0x01, 0x1c, 0x38, - 0xf0, 0x00, 0xf9, 0x0c, 0x99, 0x0a, 0x8c, 0x88, - 0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, 0xf0, 0x00, - 0xf8, 0xbe, 0x22, 0x00, 0x21, 0x00, 0x1c, 0x38, - 0xf0, 0x00, 0xf8, 0x93, 0x98, 0x18, 0x60, 0x38, - 0x98, 0x18, 0x28, 0x00, 0xd0, 0x06, 0x22, 0x00, - 0x21, 0x03, 0x1c, 0x23, 0x9c, 0x18, 0x1c, 0x38, - 0xf0, 0x0f, 0xfa, 0xd4, 0x68, 0xb8, 0x60, 0x78, - 0x1c, 0x38, 0xb0, 0x0c, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x58, - 0x2e, 0x08, 0x1a, 0x58, 0xff, 0xff, 0x7f, 0xff, - 0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x82, 0x28, 0x00, - 0xd0, 0x13, 0x68, 0x78, 0x28, 0x00, 0xd1, 0x10, - 0x68, 0xb8, 0x90, 0x00, 0x1d, 0xf8, 0x30, 0x05, - 0x90, 0x01, 0x46, 0x69, 0x68, 0x38, 0xf0, 0x0c, - 0xf8, 0xfb, 0x22, 0x0c, 0x21, 0x00, 0x1c, 0x38, - 0xf0, 0x0f, 0xfb, 0x06, 0x1c, 0x38, 0xf7, 0xfc, - 0xfe, 0x37, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0xb0, 0x84, - 0x28, 0x00, 0xd1, 0x03, 0xb0, 0x04, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0x23, 0x00, - 0x49, 0x1d, 0x00, 0x82, 0x58, 0x8c, 0x42, 0xbc, - 0xd1, 0x00, 0x50, 0x8b, 0x30, 0x01, 0x28, 0x08, - 0xdb, 0xf7, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x00, - 0xf8, 0xbc, 0x68, 0xf8, 0x90, 0x00, 0x69, 0x38, - 0x90, 0x01, 0x69, 0x78, 0x90, 0x02, 0x69, 0xb8, - 0x90, 0x03, 0x46, 0x68, 0x1d, 0xc2, 0x32, 0x01, - 0x46, 0x69, 0x68, 0xb8, 0xf0, 0x03, 0xfb, 0x38, - 0x6a, 0x38, 0x28, 0x00, 0xd0, 0x03, 0x68, 0x41, - 0x39, 0x01, 0x60, 0x41, 0x30, 0x04, 0x69, 0xf8, - 0x0c, 0x00, 0xd3, 0x0c, 0x23, 0x30, 0x5e, 0xf8, - 0x28, 0x00, 0xd1, 0x03, 0x69, 0xb8, 0xf7, 0xfc, - 0xfe, 0x2b, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, - 0x69, 0xb8, 0xf7, 0xfc, 0xfd, 0xf5, 0x22, 0x80, - 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfa, 0xbc, - 0x1c, 0x38, 0xf7, 0xfc, 0xfd, 0xed, 0xe7, 0xbd, - 0x2e, 0x08, 0x1a, 0x58, 0x28, 0x00, 0xd0, 0x08, - 0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, - 0x28, 0x03, 0xd1, 0x08, 0x20, 0xff, 0x30, 0x01, - 0x47, 0x70, 0x20, 0x02, 0x47, 0x70, 0x20, 0x04, - 0x47, 0x70, 0x20, 0x10, 0x47, 0x70, 0x20, 0x00, - 0x47, 0x70, 0xb5, 0x90, 0x1c, 0x07, 0x06, 0x08, - 0x0e, 0x00, 0x06, 0x14, 0x0e, 0x24, 0x28, 0x00, - 0xd0, 0x0a, 0x21, 0x03, 0x68, 0xb8, 0xf0, 0x04, - 0xfc, 0x3f, 0x68, 0xb8, 0x1c, 0x21, 0xf0, 0x04, - 0xfc, 0xe7, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x34, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, - 0x06, 0x09, 0xd0, 0x02, 0x68, 0x80, 0x21, 0x02, - 0xe0, 0x01, 0x68, 0x80, 0x21, 0x00, 0xf0, 0x04, - 0xfc, 0x27, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, - 0x06, 0x09, 0x0e, 0x09, 0x28, 0x00, 0xd0, 0x02, - 0x68, 0x80, 0xf0, 0x04, 0xfe, 0x2d, 0xbc, 0x08, - 0x47, 0x18, 0xb5, 0xb0, 0x23, 0x05, 0x43, 0x18, - 0x4d, 0x08, 0x84, 0xa8, 0x27, 0x00, 0x4c, 0x08, - 0x00, 0xb8, 0x58, 0x20, 0x8c, 0xa9, 0x06, 0x09, - 0x0e, 0x09, 0xf7, 0xff, 0xff, 0xe8, 0x37, 0x01, - 0x2f, 0x08, 0xdb, 0xf5, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x58, - 0x2e, 0x08, 0x1a, 0x58, 0x48, 0x01, 0x23, 0x24, - 0x5e, 0xc0, 0x47, 0x70, 0x2e, 0x08, 0x1a, 0x58, - 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x28, 0x00, - 0xd0, 0x15, 0x6a, 0x20, 0x28, 0x00, 0xd0, 0x06, - 0x42, 0xb8, 0xd0, 0x10, 0x68, 0x41, 0x39, 0x01, - 0x60, 0x41, 0x20, 0x00, 0x62, 0x20, 0x2f, 0x00, - 0xd0, 0x09, 0x68, 0xa0, 0x68, 0x39, 0xf0, 0x0c, - 0xf8, 0x39, 0x28, 0x00, 0xd1, 0x03, 0x62, 0x27, - 0x68, 0x78, 0x30, 0x01, 0x60, 0x78, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, - 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, - 0x68, 0x80, 0xf0, 0x04, 0xfd, 0x2d, 0xbc, 0x08, - 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, - 0xd0, 0x01, 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, - 0x68, 0xb8, 0xf0, 0x04, 0xf8, 0xc5, 0x2c, 0x00, - 0xd0, 0x03, 0x23, 0x01, 0x69, 0xf8, 0x43, 0x18, - 0xe0, 0x02, 0x69, 0xf8, 0x08, 0x40, 0x00, 0x40, - 0x61, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x01, 0x21, 0x07, 0x07, 0x09, 0x63, 0x88, - 0x47, 0x70, 0x00, 0x00, 0xb5, 0x90, 0x9c, 0x03, - 0x9f, 0x04, 0xb0, 0x85, 0x91, 0x00, 0x92, 0x01, - 0x93, 0x02, 0x94, 0x03, 0x97, 0x04, 0x68, 0x80, - 0x46, 0x69, 0xf0, 0x0a, 0xff, 0x89, 0xb0, 0x05, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, - 0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, - 0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x01, 0x80, - 0x06, 0x05, 0x0e, 0x2d, 0x95, 0x00, 0x68, 0x18, - 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, - 0x08, 0xc0, 0x90, 0x04, 0x99, 0x07, 0x68, 0x48, - 0x99, 0x04, 0x43, 0x48, 0x99, 0x07, 0x68, 0x09, - 0x08, 0xc9, 0x18, 0x0f, 0x97, 0x03, 0x21, 0x00, - 0x91, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, - 0xdd, 0x5e, 0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, - 0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08, 0x18, 0x81, - 0x1c, 0x08, 0xd5, 0x00, 0x30, 0x03, 0x10, 0x80, - 0x29, 0x00, 0xda, 0x04, 0x42, 0x49, 0x07, 0x89, - 0x0f, 0x89, 0x42, 0x49, 0xe0, 0x01, 0x07, 0x89, - 0x0f, 0x89, 0x00, 0x4a, 0x9d, 0x00, 0x41, 0x15, - 0x1c, 0x2b, 0x06, 0x2d, 0x0e, 0x2d, 0x27, 0xc0, - 0x40, 0xd7, 0x06, 0x3a, 0x0e, 0x12, 0x9b, 0x06, - 0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, - 0x19, 0xdb, 0x33, 0x88, 0x78, 0x1f, 0x33, 0x01, - 0x93, 0x01, 0x24, 0x00, 0x9b, 0x07, 0x68, 0x9b, - 0x2b, 0x00, 0xd9, 0x23, 0x0a, 0x3b, 0xd3, 0x05, - 0x78, 0x03, 0x43, 0x93, 0x70, 0x03, 0x78, 0x03, - 0x43, 0x2b, 0x70, 0x03, 0x31, 0x01, 0x29, 0x03, - 0xdd, 0x04, 0x22, 0xc0, 0x21, 0x00, 0x9d, 0x00, - 0x30, 0x01, 0xe0, 0x05, 0x10, 0x92, 0x06, 0x12, - 0x0e, 0x12, 0x10, 0xab, 0x06, 0x1d, 0x0e, 0x2d, - 0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, - 0x07, 0x63, 0xd1, 0x03, 0x9b, 0x01, 0x78, 0x1f, - 0x33, 0x01, 0x93, 0x01, 0x9b, 0x07, 0x68, 0x9b, - 0x42, 0xa3, 0xd8, 0xdb, 0x98, 0x04, 0x9f, 0x03, - 0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, - 0x93, 0x09, 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, - 0x9b, 0x05, 0x68, 0x58, 0x42, 0x88, 0xdc, 0xa0, - 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0xf0, 0x0f, 0xfb, 0xee, 0x20, 0x00, 0x86, 0x38, + 0x23, 0x01, 0x03, 0xdb, 0x69, 0xf8, 0x43, 0x18, + 0xe0, 0x10, 0x98, 0x15, 0x61, 0xb8, 0x98, 0x15, + 0x0e, 0x00, 0x06, 0x00, 0x90, 0x15, 0x23, 0x0d, + 0x06, 0x9b, 0x42, 0xd8, 0xd1, 0x01, 0x20, 0x00, + 0xe0, 0x00, 0x20, 0x01, 0x86, 0x38, 0x69, 0xf8, + 0x4b, 0x33, 0x40, 0x18, 0x61, 0xf8, 0x69, 0xb8, + 0x28, 0x00, 0xd1, 0x06, 0x69, 0x78, 0x28, 0x00, + 0xd0, 0x03, 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x7c, + 0xe7, 0x75, 0x68, 0xf8, 0x90, 0x06, 0x69, 0x38, + 0x90, 0x07, 0x69, 0x78, 0x90, 0x08, 0x69, 0xb8, + 0x90, 0x09, 0xa8, 0x02, 0x1c, 0x21, 0x1d, 0xfa, + 0x32, 0x01, 0xb4, 0x07, 0x1c, 0x32, 0xb4, 0x04, + 0x20, 0x00, 0x9a, 0x05, 0xa9, 0x0a, 0xab, 0x0c, + 0xf0, 0x03, 0xf8, 0xa0, 0xb0, 0x04, 0x28, 0x00, + 0xd0, 0x03, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x5f, + 0xe7, 0x59, 0x2e, 0x00, 0xd0, 0x09, 0x2e, 0x01, + 0xd0, 0x07, 0x2e, 0x02, 0xd0, 0x05, 0x2e, 0x03, + 0xd0, 0x03, 0x23, 0x02, 0x69, 0xf8, 0x43, 0x18, + 0x61, 0xf8, 0x85, 0xfc, 0x2c, 0x08, 0xd2, 0x02, + 0x00, 0xa0, 0x9a, 0x0a, 0x50, 0x17, 0x20, 0x01, + 0x24, 0x00, 0x63, 0xf8, 0x63, 0xbc, 0x85, 0xbe, + 0x21, 0x01, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x18, + 0x8c, 0xa8, 0x06, 0x01, 0x0e, 0x09, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0xcb, 0x22, 0x00, 0x21, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xa0, 0x98, 0x17, + 0x60, 0x38, 0x98, 0x17, 0x28, 0x00, 0xd0, 0x06, + 0x22, 0x00, 0x21, 0x03, 0x1c, 0x23, 0x9c, 0x17, + 0x1c, 0x38, 0xf0, 0x0f, 0xfa, 0xc1, 0x68, 0xb8, + 0x60, 0x78, 0x1c, 0x38, 0xb0, 0x0b, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, + 0xff, 0xff, 0x7f, 0xff, 0xb5, 0x80, 0x1c, 0x07, + 0xb0, 0x82, 0x28, 0x00, 0xd0, 0x13, 0x68, 0x78, + 0x28, 0x00, 0xd1, 0x10, 0x68, 0xb8, 0x90, 0x00, + 0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x46, 0x69, + 0x68, 0x38, 0xf0, 0x0c, 0xf8, 0xe7, 0x22, 0x0c, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x58, + 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x05, 0xb0, 0x02, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, + 0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, 0xd1, 0x03, + 0xb0, 0x04, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x00, 0x23, 0x00, 0x49, 0x22, 0x00, 0x82, + 0x58, 0x8c, 0x42, 0xbc, 0xd1, 0x00, 0x50, 0x8b, + 0x30, 0x01, 0x28, 0x08, 0xdb, 0xf7, 0x21, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xc8, 0x68, 0xf8, + 0x90, 0x00, 0x69, 0x38, 0x90, 0x01, 0x69, 0x78, + 0x90, 0x02, 0x69, 0xb8, 0x90, 0x03, 0x46, 0x68, + 0x1d, 0xc2, 0x32, 0x01, 0x46, 0x69, 0x68, 0xb8, + 0xf0, 0x03, 0xfb, 0x24, 0x6a, 0x38, 0x28, 0x00, + 0xd0, 0x03, 0x68, 0x41, 0x39, 0x01, 0x60, 0x41, + 0x30, 0x04, 0x69, 0xf8, 0x0c, 0x00, 0xd3, 0x16, + 0x23, 0x30, 0x5e, 0xf8, 0x28, 0x00, 0xd1, 0x0d, + 0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xf9, 0x48, 0x0d, + 0x8d, 0x01, 0x39, 0x01, 0x04, 0x09, 0x14, 0x09, + 0x85, 0x01, 0xd1, 0x08, 0x20, 0xff, 0xf7, 0xf6, + 0xff, 0x73, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, + 0x69, 0xb8, 0xf7, 0xfc, 0xfa, 0xb9, 0x22, 0x80, + 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0f, 0xfb, 0x04, + 0x1c, 0x38, 0xf7, 0xfc, 0xfa, 0xb1, 0xe7, 0xb3, + 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, + 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08, + 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, 0xd1, 0x08, + 0x20, 0xff, 0x30, 0x01, 0x47, 0x70, 0x20, 0x02, + 0x47, 0x70, 0x20, 0x04, 0x47, 0x70, 0x20, 0x10, + 0x47, 0x70, 0x20, 0x00, 0x47, 0x70, 0xb5, 0x90, + 0x1c, 0x07, 0x06, 0x08, 0x0e, 0x00, 0x06, 0x14, + 0x0e, 0x24, 0x28, 0x00, 0xd0, 0x0a, 0x21, 0x03, + 0x68, 0xb8, 0xf0, 0x04, 0xfc, 0x1f, 0x68, 0xb8, + 0x1c, 0x21, 0xf0, 0x04, 0xfc, 0xc7, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x68, 0xb8, + 0xf0, 0x04, 0xfc, 0x14, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0xd0, 0x02, + 0x68, 0x80, 0x21, 0x02, 0xe0, 0x01, 0x68, 0x80, + 0x21, 0x00, 0xf0, 0x04, 0xfc, 0x07, 0xbc, 0x08, + 0x47, 0x18, 0xb5, 0x00, 0x06, 0x09, 0x0e, 0x09, + 0x28, 0x00, 0xd0, 0x02, 0x68, 0x80, 0xf0, 0x04, + 0xfe, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xb0, + 0x23, 0x05, 0x43, 0x18, 0x4d, 0x08, 0x84, 0xa8, + 0x27, 0x00, 0x4c, 0x08, 0x00, 0xb8, 0x58, 0x20, + 0x8c, 0xa9, 0x06, 0x09, 0x0e, 0x09, 0xf7, 0xff, + 0xff, 0xe8, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xf5, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x1a, 0x4c, 0x2e, 0x08, 0x1a, 0x4c, + 0x48, 0x01, 0x23, 0x24, 0x5e, 0xc0, 0x47, 0x70, + 0x2e, 0x08, 0x1a, 0x4c, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x28, 0x00, 0xd0, 0x15, 0x6a, 0x20, + 0x28, 0x00, 0xd0, 0x06, 0x42, 0xb8, 0xd0, 0x10, + 0x68, 0x41, 0x39, 0x01, 0x60, 0x41, 0x20, 0x00, + 0x62, 0x20, 0x2f, 0x00, 0xd0, 0x09, 0x68, 0xa0, + 0x68, 0x39, 0xf0, 0x0c, 0xf8, 0x19, 0x28, 0x00, + 0xd1, 0x03, 0x62, 0x27, 0x68, 0x78, 0x30, 0x01, + 0x60, 0x78, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0x00, 0x06, 0x09, 0xd0, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x00, 0x68, 0x80, 0xf0, 0x04, + 0xfd, 0x0d, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, + 0x1c, 0x07, 0x1c, 0x0c, 0xd0, 0x01, 0x21, 0x01, + 0xe0, 0x00, 0x21, 0x00, 0x68, 0xb8, 0xf0, 0x04, + 0xf8, 0xa5, 0x2c, 0x00, 0xd0, 0x03, 0x23, 0x01, + 0x69, 0xf8, 0x43, 0x18, 0xe0, 0x02, 0x69, 0xf8, + 0x08, 0x40, 0x00, 0x40, 0x61, 0xf8, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x21, 0x07, + 0x07, 0x09, 0x63, 0x88, 0x47, 0x70, 0x00, 0x00, + 0xb5, 0x90, 0x9c, 0x03, 0x9f, 0x04, 0xb0, 0x85, + 0x91, 0x00, 0x92, 0x01, 0x93, 0x02, 0x94, 0x03, + 0x97, 0x04, 0x68, 0x80, 0x46, 0x69, 0xf0, 0x0a, + 0xff, 0x69, 0xb0, 0x05, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, 0x93, 0x05, 0x98, 0x06, - 0x6b, 0xc0, 0x07, 0x06, 0x0f, 0x36, 0x96, 0x00, - 0x01, 0x30, 0x06, 0x06, 0x0e, 0x36, 0x96, 0x01, - 0x68, 0x18, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, - 0x01, 0x40, 0x08, 0xc0, 0x90, 0x04, 0x68, 0x48, - 0x9a, 0x04, 0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, - 0x18, 0x17, 0x97, 0x03, 0x22, 0x00, 0x92, 0x02, - 0x9b, 0x05, 0x68, 0x58, 0x28, 0x00, 0xdd, 0x48, - 0x23, 0x32, 0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, - 0x43, 0x58, 0x9a, 0x08, 0x18, 0x82, 0x1c, 0x10, - 0xd5, 0x00, 0x30, 0x01, 0x10, 0x40, 0x9b, 0x06, - 0x69, 0x9b, 0x18, 0x18, 0x9b, 0x05, 0x9f, 0x03, - 0x19, 0xdb, 0x1d, 0xdd, 0x35, 0x81, 0x78, 0x2f, - 0x24, 0x00, 0x68, 0x8b, 0x35, 0x01, 0x2b, 0x00, - 0xd9, 0x21, 0x0a, 0x3b, 0xd3, 0x10, 0x08, 0x53, - 0xd3, 0x06, 0x78, 0x06, 0x23, 0xf0, 0x40, 0x33, - 0x70, 0x03, 0x78, 0x03, 0x9e, 0x00, 0xe0, 0x05, - 0x78, 0x03, 0x07, 0x1b, 0x0f, 0x1b, 0x70, 0x03, - 0x78, 0x03, 0x9e, 0x01, 0x43, 0x33, 0x70, 0x03, - 0x32, 0x01, 0x08, 0x53, 0xd2, 0x00, 0x30, 0x01, - 0x00, 0x7b, 0x06, 0x1f, 0x0e, 0x3f, 0x34, 0x01, - 0x07, 0x63, 0xd1, 0x01, 0x78, 0x2f, 0x35, 0x01, - 0x68, 0x8b, 0x42, 0xa3, 0xd8, 0xdd, 0x98, 0x04, - 0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03, 0x9b, 0x09, - 0x33, 0x01, 0x93, 0x09, 0x9a, 0x02, 0x32, 0x01, - 0x92, 0x02, 0x9b, 0x05, 0x68, 0x58, 0x42, 0x90, - 0xdc, 0xb6, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0xb0, 0x83, - 0x98, 0x03, 0x6a, 0x40, 0x68, 0xc4, 0x98, 0x03, - 0x6b, 0xc0, 0x06, 0x03, 0x0e, 0x1b, 0x93, 0x00, - 0x68, 0x20, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, - 0x01, 0x40, 0x08, 0xc2, 0x92, 0x02, 0x68, 0x48, - 0x43, 0x50, 0x68, 0x0a, 0x08, 0xd2, 0x18, 0x10, - 0x90, 0x01, 0x25, 0x00, 0x68, 0x60, 0x28, 0x00, - 0xdd, 0x35, 0x23, 0x32, 0x98, 0x03, 0x5e, 0xc0, - 0x9b, 0x06, 0x43, 0x58, 0x9a, 0x05, 0x18, 0x80, - 0x9a, 0x03, 0x69, 0x92, 0x18, 0x17, 0x98, 0x01, - 0x18, 0x20, 0x1d, 0xc6, 0x36, 0x81, 0x78, 0x32, - 0x20, 0x00, 0x68, 0x8b, 0x36, 0x01, 0x2b, 0x00, - 0xd9, 0x16, 0x0a, 0x13, 0xd3, 0x01, 0x9b, 0x00, - 0x70, 0x3b, 0x00, 0x52, 0x06, 0x12, 0x0e, 0x12, - 0xd1, 0x09, 0x1d, 0xc2, 0x32, 0x01, 0x08, 0xd2, - 0x00, 0xd2, 0x1a, 0x10, 0x19, 0xc7, 0x1c, 0x10, - 0x78, 0x32, 0x36, 0x01, 0xe0, 0x01, 0x30, 0x01, - 0x37, 0x01, 0x68, 0x8b, 0x42, 0x83, 0xd8, 0xe8, - 0x98, 0x01, 0x9a, 0x02, 0x18, 0x80, 0x90, 0x01, - 0x9b, 0x06, 0x33, 0x01, 0x93, 0x06, 0x68, 0x60, - 0x35, 0x01, 0x42, 0xa8, 0xdc, 0xc9, 0xb0, 0x03, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0xff, 0x23, 0x2c, 0x1c, 0x07, 0x5e, 0xc0, - 0xb0, 0x85, 0x28, 0x01, 0xd0, 0x0f, 0x28, 0x02, - 0xd0, 0x07, 0x28, 0x03, 0xd1, 0x11, 0xab, 0x06, - 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x9a, - 0xe0, 0x5d, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, - 0xf7, 0xff, 0xff, 0x23, 0xe0, 0x57, 0xab, 0x06, - 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xfe, 0x97, - 0xe0, 0x51, 0x6a, 0x78, 0x68, 0xc0, 0x90, 0x04, - 0x68, 0x00, 0x01, 0x00, 0x30, 0x1f, 0x09, 0x40, - 0x01, 0x40, 0x08, 0xc0, 0x90, 0x03, 0x99, 0x06, - 0x68, 0x48, 0x99, 0x03, 0x43, 0x48, 0x99, 0x06, - 0x68, 0x09, 0x08, 0xc9, 0x18, 0x09, 0x91, 0x02, - 0x21, 0x00, 0x91, 0x01, 0x98, 0x04, 0x68, 0x40, - 0x28, 0x00, 0xdd, 0x38, 0x98, 0x04, 0x99, 0x02, - 0x9e, 0x07, 0x18, 0x40, 0x30, 0x88, 0x78, 0x05, - 0x30, 0x01, 0x90, 0x00, 0x24, 0x00, 0x99, 0x06, - 0x68, 0x88, 0x28, 0x00, 0xd9, 0x1d, 0x0a, 0x28, - 0xd3, 0x05, 0x68, 0xb8, 0x6b, 0xfb, 0x9a, 0x08, - 0x1c, 0x31, 0xf0, 0x0a, 0xfb, 0xa7, 0x00, 0x68, - 0x06, 0x05, 0x0e, 0x2d, 0xd1, 0x0b, 0x1d, 0xe0, - 0x30, 0x01, 0x08, 0xc0, 0x00, 0xc0, 0x1b, 0x01, - 0x19, 0x8e, 0x1c, 0x04, 0x98, 0x00, 0x78, 0x05, - 0x30, 0x01, 0x90, 0x00, 0xe0, 0x01, 0x34, 0x01, - 0x36, 0x01, 0x99, 0x06, 0x68, 0x88, 0x42, 0xa0, - 0xd8, 0xe1, 0x98, 0x03, 0x99, 0x02, 0x18, 0x09, - 0x91, 0x02, 0x9a, 0x08, 0x32, 0x01, 0x92, 0x08, - 0x99, 0x01, 0x31, 0x01, 0x91, 0x01, 0x98, 0x04, - 0x68, 0x40, 0x42, 0x88, 0xdc, 0xc6, 0xb0, 0x05, + 0x6b, 0xc0, 0x01, 0x80, 0x06, 0x05, 0x0e, 0x2d, + 0x95, 0x00, 0x68, 0x18, 0x01, 0x00, 0x30, 0x1f, + 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, 0x90, 0x04, + 0x99, 0x07, 0x68, 0x48, 0x99, 0x04, 0x43, 0x48, + 0x99, 0x07, 0x68, 0x09, 0x08, 0xc9, 0x18, 0x0f, + 0x97, 0x03, 0x21, 0x00, 0x91, 0x02, 0x9b, 0x05, + 0x68, 0x58, 0x28, 0x00, 0xdd, 0x5e, 0x23, 0x32, + 0x98, 0x06, 0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58, + 0x9a, 0x08, 0x18, 0x81, 0x1c, 0x08, 0xd5, 0x00, + 0x30, 0x03, 0x10, 0x80, 0x29, 0x00, 0xda, 0x04, + 0x42, 0x49, 0x07, 0x89, 0x0f, 0x89, 0x42, 0x49, + 0xe0, 0x01, 0x07, 0x89, 0x0f, 0x89, 0x00, 0x4a, + 0x9d, 0x00, 0x41, 0x15, 0x1c, 0x2b, 0x06, 0x2d, + 0x0e, 0x2d, 0x27, 0xc0, 0x40, 0xd7, 0x06, 0x3a, + 0x0e, 0x12, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18, + 0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x33, 0x88, + 0x78, 0x1f, 0x33, 0x01, 0x93, 0x01, 0x24, 0x00, + 0x9b, 0x07, 0x68, 0x9b, 0x2b, 0x00, 0xd9, 0x23, + 0x0a, 0x3b, 0xd3, 0x05, 0x78, 0x03, 0x43, 0x93, + 0x70, 0x03, 0x78, 0x03, 0x43, 0x2b, 0x70, 0x03, + 0x31, 0x01, 0x29, 0x03, 0xdd, 0x04, 0x22, 0xc0, + 0x21, 0x00, 0x9d, 0x00, 0x30, 0x01, 0xe0, 0x05, + 0x10, 0x92, 0x06, 0x12, 0x0e, 0x12, 0x10, 0xab, + 0x06, 0x1d, 0x0e, 0x2d, 0x00, 0x7b, 0x06, 0x1f, + 0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x03, + 0x9b, 0x01, 0x78, 0x1f, 0x33, 0x01, 0x93, 0x01, + 0x9b, 0x07, 0x68, 0x9b, 0x42, 0xa3, 0xd8, 0xdb, + 0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f, 0x97, 0x03, + 0x9b, 0x09, 0x33, 0x01, 0x93, 0x09, 0x99, 0x02, + 0x31, 0x01, 0x91, 0x02, 0x9b, 0x05, 0x68, 0x58, + 0x42, 0x88, 0xdc, 0xa0, 0xb0, 0x06, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, + 0xb0, 0x86, 0x98, 0x06, 0x6a, 0x40, 0x68, 0xc3, + 0x93, 0x05, 0x98, 0x06, 0x6b, 0xc0, 0x07, 0x06, + 0x0f, 0x36, 0x96, 0x00, 0x01, 0x30, 0x06, 0x06, + 0x0e, 0x36, 0x96, 0x01, 0x68, 0x18, 0x01, 0x00, + 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, + 0x90, 0x04, 0x68, 0x48, 0x9a, 0x04, 0x43, 0x50, + 0x68, 0x0a, 0x08, 0xd2, 0x18, 0x17, 0x97, 0x03, + 0x22, 0x00, 0x92, 0x02, 0x9b, 0x05, 0x68, 0x58, + 0x28, 0x00, 0xdd, 0x48, 0x23, 0x32, 0x98, 0x06, + 0x5e, 0xc0, 0x9b, 0x09, 0x43, 0x58, 0x9a, 0x08, + 0x18, 0x82, 0x1c, 0x10, 0xd5, 0x00, 0x30, 0x01, + 0x10, 0x40, 0x9b, 0x06, 0x69, 0x9b, 0x18, 0x18, + 0x9b, 0x05, 0x9f, 0x03, 0x19, 0xdb, 0x1d, 0xdd, + 0x35, 0x81, 0x78, 0x2f, 0x24, 0x00, 0x68, 0x8b, + 0x35, 0x01, 0x2b, 0x00, 0xd9, 0x21, 0x0a, 0x3b, + 0xd3, 0x10, 0x08, 0x53, 0xd3, 0x06, 0x78, 0x06, + 0x23, 0xf0, 0x40, 0x33, 0x70, 0x03, 0x78, 0x03, + 0x9e, 0x00, 0xe0, 0x05, 0x78, 0x03, 0x07, 0x1b, + 0x0f, 0x1b, 0x70, 0x03, 0x78, 0x03, 0x9e, 0x01, + 0x43, 0x33, 0x70, 0x03, 0x32, 0x01, 0x08, 0x53, + 0xd2, 0x00, 0x30, 0x01, 0x00, 0x7b, 0x06, 0x1f, + 0x0e, 0x3f, 0x34, 0x01, 0x07, 0x63, 0xd1, 0x01, + 0x78, 0x2f, 0x35, 0x01, 0x68, 0x8b, 0x42, 0xa3, + 0xd8, 0xdd, 0x98, 0x04, 0x9f, 0x03, 0x18, 0x3f, + 0x97, 0x03, 0x9b, 0x09, 0x33, 0x01, 0x93, 0x09, + 0x9a, 0x02, 0x32, 0x01, 0x92, 0x02, 0x9b, 0x05, + 0x68, 0x58, 0x42, 0x90, 0xdc, 0xb6, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0x90, 0x1c, 0x07, 0x20, 0x00, 0xb0, 0x88, - 0xf0, 0x08, 0xfa, 0x55, 0x90, 0x06, 0x00, 0x80, - 0x30, 0x10, 0x00, 0x80, 0xf7, 0xfc, 0xfb, 0x42, - 0x1c, 0x04, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x03, - 0xb0, 0x08, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x1d, 0xe1, 0x31, 0x09, 0x91, 0x07, 0x49, 0x19, - 0x68, 0x4b, 0x1c, 0x5a, 0x60, 0x4a, 0x60, 0x63, - 0x60, 0xe7, 0x68, 0x39, 0x01, 0x09, 0x31, 0x1f, - 0x09, 0x49, 0x01, 0x49, 0x90, 0x00, 0x90, 0x01, - 0x1e, 0x48, 0x90, 0x02, 0x68, 0xe0, 0x68, 0x40, - 0x00, 0xc0, 0x38, 0x01, 0x90, 0x03, 0x46, 0x68, - 0x21, 0x00, 0xf0, 0x08, 0xfa, 0x33, 0x60, 0xa0, - 0x68, 0xe0, 0x30, 0x88, 0x90, 0x05, 0x68, 0xa0, - 0x90, 0x04, 0x46, 0x68, 0x1c, 0x22, 0x68, 0x61, - 0xb4, 0x07, 0x22, 0x00, 0xb4, 0x04, 0x22, 0x01, - 0x20, 0x00, 0xa9, 0x0a, 0xab, 0x08, 0xf0, 0x02, - 0xfd, 0x4b, 0xb0, 0x04, 0x28, 0x00, 0xd0, 0x03, - 0x1c, 0x20, 0xf7, 0xfc, 0xfb, 0x29, 0x24, 0x00, - 0x1c, 0x20, 0xe7, 0xc5, 0x2e, 0x08, 0x1a, 0x80, - 0xb5, 0x80, 0x1c, 0x07, 0xb0, 0x84, 0x28, 0x00, - 0xd0, 0x1a, 0x20, 0x00, 0xf0, 0x08, 0xfa, 0x07, - 0x90, 0x00, 0x1d, 0xf8, 0x30, 0x09, 0x90, 0x01, - 0x68, 0xb8, 0x90, 0x02, 0x68, 0xf8, 0x30, 0x88, - 0x90, 0x03, 0x46, 0x68, 0x46, 0x69, 0x1d, 0xc2, - 0x32, 0x01, 0x68, 0x38, 0xf0, 0x03, 0xf8, 0x38, - 0x22, 0x10, 0x21, 0x00, 0x1c, 0x38, 0xf0, 0x0e, - 0xff, 0xd3, 0x1c, 0x38, 0xf7, 0xfc, 0xfb, 0x04, - 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0xff, 0x23, 0x32, 0x1c, 0x07, 0x5e, 0xc0, - 0x1c, 0x0c, 0x1c, 0x15, 0xb0, 0x8a, 0x42, 0x90, - 0xdd, 0x63, 0x6a, 0x78, 0x28, 0x00, 0xd1, 0x0b, - 0x4e, 0x38, 0x68, 0x30, 0x28, 0x00, 0xd1, 0x05, - 0x48, 0x37, 0xf7, 0xff, 0xff, 0x7d, 0x60, 0x30, - 0x28, 0x00, 0xd0, 0x61, 0x68, 0x30, 0x62, 0x78, - 0x23, 0x01, 0x6b, 0xb8, 0x6a, 0x79, 0x42, 0xd8, - 0xd1, 0x01, 0x22, 0x01, 0xe0, 0x00, 0x22, 0x00, - 0x92, 0x01, 0x68, 0xc8, 0x90, 0x00, 0x68, 0x00, - 0x90, 0x04, 0x98, 0x00, 0x68, 0x40, 0x90, 0x03, - 0x6b, 0xf8, 0x28, 0x01, 0xd1, 0x01, 0x90, 0x02, - 0xe0, 0x11, 0x20, 0x00, 0x90, 0x02, 0x9a, 0x01, - 0x2a, 0x00, 0xd1, 0x0c, 0x1c, 0x20, 0xf0, 0x00, - 0xf8, 0x57, 0x6b, 0xba, 0x99, 0x03, 0xb4, 0x06, - 0x1c, 0x03, 0x9a, 0x0f, 0x1c, 0x38, 0x1c, 0x29, - 0xf7, 0xff, 0xfd, 0x80, 0xb0, 0x02, 0x99, 0x03, - 0x91, 0x08, 0x20, 0x01, 0x90, 0x09, 0x78, 0x20, - 0x28, 0x00, 0xd0, 0x31, 0x23, 0x32, 0x5e, 0xf8, - 0x42, 0xa8, 0xdd, 0x22, 0x78, 0x20, 0x99, 0x00, - 0xf0, 0x00, 0xf8, 0x34, 0x90, 0x07, 0x1c, 0x06, - 0x78, 0x20, 0x07, 0x00, 0x0f, 0x00, 0x99, 0x04, - 0x43, 0x48, 0x90, 0x05, 0x78, 0x20, 0x09, 0x00, - 0x07, 0x40, 0x0f, 0x40, 0x99, 0x03, 0x43, 0x48, - 0x90, 0x06, 0x98, 0x02, 0x34, 0x01, 0x28, 0x00, - 0xd0, 0x0c, 0x99, 0x0d, 0x9a, 0x01, 0xb4, 0x06, - 0x6a, 0x78, 0x68, 0xb9, 0x68, 0x00, 0xaa, 0x07, - 0x1c, 0x2b, 0xf0, 0x0a, 0xfd, 0xab, 0xb0, 0x02, - 0xe0, 0x06, 0xe0, 0x09, 0x9b, 0x0d, 0x1c, 0x38, - 0xa9, 0x05, 0x1c, 0x2a, 0xf7, 0xff, 0xfe, 0xa8, - 0x19, 0xad, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xcd, - 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0x80, - 0x2e, 0x02, 0xcf, 0xe4, 0x29, 0x00, 0xd1, 0x00, - 0x49, 0x02, 0x06, 0x40, 0x0e, 0x40, 0x18, 0x40, - 0x7a, 0x00, 0x47, 0x70, 0x2e, 0x02, 0xcf, 0xe4, - 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0xd1, 0x08, - 0x4f, 0x0c, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, - 0x48, 0x0b, 0xf7, 0xff, 0xfe, 0xf9, 0x60, 0x38, - 0x68, 0x3f, 0x25, 0x00, 0x78, 0x20, 0x28, 0x00, - 0xd0, 0x08, 0x78, 0x20, 0x68, 0xf9, 0x34, 0x01, - 0xf7, 0xff, 0xff, 0xe0, 0x19, 0x45, 0x78, 0x20, - 0x28, 0x00, 0xd1, 0xf6, 0x1c, 0x28, 0xbc, 0xb0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x80, - 0x2e, 0x02, 0xcf, 0xe4, 0xb5, 0x80, 0x28, 0x00, - 0xd1, 0x08, 0x4f, 0x09, 0x68, 0x38, 0x28, 0x00, - 0xd1, 0x03, 0x48, 0x08, 0xf7, 0xff, 0xfe, 0xd8, - 0x60, 0x38, 0x68, 0x38, 0x28, 0x00, 0xd1, 0x02, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xc0, - 0x68, 0x40, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x1a, 0x80, 0x2e, 0x02, 0xcf, 0xe4, - 0xb5, 0xf0, 0xb0, 0x83, 0x4a, 0x18, 0x21, 0x00, - 0x20, 0xff, 0x30, 0x01, 0xf7, 0xff, 0xfa, 0xac, - 0x49, 0x16, 0x27, 0x00, 0x64, 0x08, 0x49, 0x16, - 0x91, 0x02, 0x49, 0x16, 0x91, 0x01, 0x49, 0x16, - 0x91, 0x00, 0x4c, 0x16, 0x01, 0x38, 0x06, 0x01, - 0x0e, 0x09, 0x20, 0x10, 0x1c, 0x22, 0x1c, 0x0d, - 0xf7, 0xff, 0xfa, 0x9a, 0x00, 0xbe, 0x99, 0x02, - 0x51, 0x88, 0x20, 0x04, 0x1c, 0x29, 0x1c, 0x22, - 0xf7, 0xff, 0xfa, 0x92, 0x99, 0x01, 0x51, 0x88, - 0x20, 0x02, 0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, - 0xfa, 0x8b, 0x99, 0x00, 0x51, 0x88, 0x37, 0x01, - 0x2f, 0x08, 0xdb, 0xe3, 0x20, 0x00, 0xb0, 0x03, + 0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x6a, 0x40, + 0x68, 0xc4, 0x98, 0x03, 0x6b, 0xc0, 0x06, 0x03, + 0x0e, 0x1b, 0x93, 0x00, 0x68, 0x20, 0x01, 0x00, + 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc2, + 0x92, 0x02, 0x68, 0x48, 0x43, 0x50, 0x68, 0x0a, + 0x08, 0xd2, 0x18, 0x10, 0x90, 0x01, 0x25, 0x00, + 0x68, 0x60, 0x28, 0x00, 0xdd, 0x35, 0x23, 0x32, + 0x98, 0x03, 0x5e, 0xc0, 0x9b, 0x06, 0x43, 0x58, + 0x9a, 0x05, 0x18, 0x80, 0x9a, 0x03, 0x69, 0x92, + 0x18, 0x17, 0x98, 0x01, 0x18, 0x20, 0x1d, 0xc6, + 0x36, 0x81, 0x78, 0x32, 0x20, 0x00, 0x68, 0x8b, + 0x36, 0x01, 0x2b, 0x00, 0xd9, 0x16, 0x0a, 0x13, + 0xd3, 0x01, 0x9b, 0x00, 0x70, 0x3b, 0x00, 0x52, + 0x06, 0x12, 0x0e, 0x12, 0xd1, 0x09, 0x1d, 0xc2, + 0x32, 0x01, 0x08, 0xd2, 0x00, 0xd2, 0x1a, 0x10, + 0x19, 0xc7, 0x1c, 0x10, 0x78, 0x32, 0x36, 0x01, + 0xe0, 0x01, 0x30, 0x01, 0x37, 0x01, 0x68, 0x8b, + 0x42, 0x83, 0xd8, 0xe8, 0x98, 0x01, 0x9a, 0x02, + 0x18, 0x80, 0x90, 0x01, 0x9b, 0x06, 0x33, 0x01, + 0x93, 0x06, 0x68, 0x60, 0x35, 0x01, 0x42, 0xa8, + 0xdc, 0xc9, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x2c, + 0x1c, 0x07, 0x5e, 0xc0, 0xb0, 0x85, 0x28, 0x01, + 0xd0, 0x0f, 0x28, 0x02, 0xd0, 0x07, 0x28, 0x03, + 0xd1, 0x11, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, + 0xf7, 0xff, 0xff, 0x9a, 0xe0, 0x5d, 0xab, 0x06, + 0xcb, 0x0e, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x23, + 0xe0, 0x57, 0xab, 0x06, 0xcb, 0x0e, 0x1c, 0x38, + 0xf7, 0xff, 0xfe, 0x97, 0xe0, 0x51, 0x6a, 0x78, + 0x68, 0xc0, 0x90, 0x04, 0x68, 0x00, 0x01, 0x00, + 0x30, 0x1f, 0x09, 0x40, 0x01, 0x40, 0x08, 0xc0, + 0x90, 0x03, 0x99, 0x06, 0x68, 0x48, 0x99, 0x03, + 0x43, 0x48, 0x99, 0x06, 0x68, 0x09, 0x08, 0xc9, + 0x18, 0x09, 0x91, 0x02, 0x21, 0x00, 0x91, 0x01, + 0x98, 0x04, 0x68, 0x40, 0x28, 0x00, 0xdd, 0x38, + 0x98, 0x04, 0x99, 0x02, 0x9e, 0x07, 0x18, 0x40, + 0x30, 0x88, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00, + 0x24, 0x00, 0x99, 0x06, 0x68, 0x88, 0x28, 0x00, + 0xd9, 0x1d, 0x0a, 0x28, 0xd3, 0x05, 0x68, 0xb8, + 0x6b, 0xfb, 0x9a, 0x08, 0x1c, 0x31, 0xf0, 0x0a, + 0xfb, 0x87, 0x00, 0x68, 0x06, 0x05, 0x0e, 0x2d, + 0xd1, 0x0b, 0x1d, 0xe0, 0x30, 0x01, 0x08, 0xc0, + 0x00, 0xc0, 0x1b, 0x01, 0x19, 0x8e, 0x1c, 0x04, + 0x98, 0x00, 0x78, 0x05, 0x30, 0x01, 0x90, 0x00, + 0xe0, 0x01, 0x34, 0x01, 0x36, 0x01, 0x99, 0x06, + 0x68, 0x88, 0x42, 0xa0, 0xd8, 0xe1, 0x98, 0x03, + 0x99, 0x02, 0x18, 0x09, 0x91, 0x02, 0x9a, 0x08, + 0x32, 0x01, 0x92, 0x08, 0x99, 0x01, 0x31, 0x01, + 0x91, 0x01, 0x98, 0x04, 0x68, 0x40, 0x42, 0x88, + 0xdc, 0xc6, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, + 0x20, 0x00, 0xb0, 0x88, 0xf0, 0x08, 0xfa, 0x35, + 0x90, 0x06, 0x00, 0x80, 0x30, 0x10, 0x00, 0x80, + 0xf7, 0xfc, 0xf8, 0x04, 0x1c, 0x04, 0x20, 0x00, + 0x2c, 0x00, 0xd1, 0x03, 0xb0, 0x08, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0x1d, 0xe1, 0x31, 0x09, + 0x91, 0x07, 0x49, 0x19, 0x68, 0x4b, 0x1c, 0x5a, + 0x60, 0x4a, 0x60, 0x63, 0x60, 0xe7, 0x68, 0x39, + 0x01, 0x09, 0x31, 0x1f, 0x09, 0x49, 0x01, 0x49, + 0x90, 0x00, 0x90, 0x01, 0x1e, 0x48, 0x90, 0x02, + 0x68, 0xe0, 0x68, 0x40, 0x00, 0xc0, 0x38, 0x01, + 0x90, 0x03, 0x46, 0x68, 0x21, 0x00, 0xf0, 0x08, + 0xfa, 0x13, 0x60, 0xa0, 0x68, 0xe0, 0x30, 0x88, + 0x90, 0x05, 0x68, 0xa0, 0x90, 0x04, 0x46, 0x68, + 0x1c, 0x22, 0x68, 0x61, 0xb4, 0x07, 0x22, 0x00, + 0xb4, 0x04, 0x22, 0x01, 0x20, 0x00, 0xa9, 0x0a, + 0xab, 0x08, 0xf0, 0x02, 0xfd, 0x2b, 0xb0, 0x04, + 0x28, 0x00, 0xd0, 0x03, 0x1c, 0x20, 0xf7, 0xfb, + 0xff, 0xeb, 0x24, 0x00, 0x1c, 0x20, 0xe7, 0xc5, + 0x2e, 0x08, 0x1a, 0x78, 0xb5, 0x80, 0x1c, 0x07, + 0xb0, 0x84, 0x28, 0x00, 0xd0, 0x1a, 0x20, 0x00, + 0xf0, 0x08, 0xf9, 0xe7, 0x90, 0x00, 0x1d, 0xf8, + 0x30, 0x09, 0x90, 0x01, 0x68, 0xb8, 0x90, 0x02, + 0x68, 0xf8, 0x30, 0x88, 0x90, 0x03, 0x46, 0x68, + 0x46, 0x69, 0x1d, 0xc2, 0x32, 0x01, 0x68, 0x38, + 0xf0, 0x03, 0xf8, 0x18, 0x22, 0x10, 0x21, 0x00, + 0x1c, 0x38, 0xf0, 0x0f, 0xf8, 0x19, 0x1c, 0x38, + 0xf7, 0xfb, 0xff, 0xc6, 0xb0, 0x04, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xff, 0x23, 0x32, + 0x1c, 0x07, 0x5e, 0xc0, 0x1c, 0x0c, 0x1c, 0x15, + 0xb0, 0x8a, 0x42, 0x90, 0xdd, 0x63, 0x6a, 0x78, + 0x28, 0x00, 0xd1, 0x0b, 0x4e, 0x38, 0x68, 0x30, + 0x28, 0x00, 0xd1, 0x05, 0x48, 0x37, 0xf7, 0xff, + 0xff, 0x7d, 0x60, 0x30, 0x28, 0x00, 0xd0, 0x61, + 0x68, 0x30, 0x62, 0x78, 0x23, 0x01, 0x6b, 0xb8, + 0x6a, 0x79, 0x42, 0xd8, 0xd1, 0x01, 0x22, 0x01, + 0xe0, 0x00, 0x22, 0x00, 0x92, 0x01, 0x68, 0xc8, + 0x90, 0x00, 0x68, 0x00, 0x90, 0x04, 0x98, 0x00, + 0x68, 0x40, 0x90, 0x03, 0x6b, 0xf8, 0x28, 0x01, + 0xd1, 0x01, 0x90, 0x02, 0xe0, 0x11, 0x20, 0x00, + 0x90, 0x02, 0x9a, 0x01, 0x2a, 0x00, 0xd1, 0x0c, + 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x57, 0x6b, 0xba, + 0x99, 0x03, 0xb4, 0x06, 0x1c, 0x03, 0x9a, 0x0f, + 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xfd, 0x80, + 0xb0, 0x02, 0x99, 0x03, 0x91, 0x08, 0x20, 0x01, + 0x90, 0x09, 0x78, 0x20, 0x28, 0x00, 0xd0, 0x31, + 0x23, 0x32, 0x5e, 0xf8, 0x42, 0xa8, 0xdd, 0x22, + 0x78, 0x20, 0x99, 0x00, 0xf0, 0x00, 0xf8, 0x34, + 0x90, 0x07, 0x1c, 0x06, 0x78, 0x20, 0x07, 0x00, + 0x0f, 0x00, 0x99, 0x04, 0x43, 0x48, 0x90, 0x05, + 0x78, 0x20, 0x09, 0x00, 0x07, 0x40, 0x0f, 0x40, + 0x99, 0x03, 0x43, 0x48, 0x90, 0x06, 0x98, 0x02, + 0x34, 0x01, 0x28, 0x00, 0xd0, 0x0c, 0x99, 0x0d, + 0x9a, 0x01, 0xb4, 0x06, 0x6a, 0x78, 0x68, 0xb9, + 0x68, 0x00, 0xaa, 0x07, 0x1c, 0x2b, 0xf0, 0x0a, + 0xfd, 0x8b, 0xb0, 0x02, 0xe0, 0x06, 0xe0, 0x09, + 0x9b, 0x0d, 0x1c, 0x38, 0xa9, 0x05, 0x1c, 0x2a, + 0xf7, 0xff, 0xfe, 0xa8, 0x19, 0xad, 0x78, 0x20, + 0x28, 0x00, 0xd1, 0xcd, 0xb0, 0x0a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x1a, 0xc8, 0x2e, 0x08, 0x1c, 0x88, - 0x2e, 0x08, 0x55, 0x58, 0x2e, 0x08, 0x55, 0x78, - 0x2e, 0x08, 0x55, 0x98, 0x2e, 0x08, 0x1a, 0x88, - 0xb5, 0x80, 0x48, 0x0c, 0xf7, 0xff, 0xfe, 0x84, - 0x4f, 0x0b, 0x64, 0x78, 0x48, 0x0b, 0xf7, 0xff, - 0xfe, 0x7f, 0x64, 0xb8, 0x48, 0x0a, 0xf7, 0xff, - 0xfe, 0x7b, 0x64, 0xf8, 0x20, 0x00, 0x22, 0x00, - 0x49, 0x08, 0x00, 0x83, 0x50, 0xca, 0x30, 0x01, - 0x28, 0x10, 0xdb, 0xfa, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x02, 0x56, 0xcc, - 0x2e, 0x08, 0x1c, 0x88, 0x2e, 0x02, 0x8d, 0x58, - 0x2e, 0x02, 0xcf, 0xe4, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0x90, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, - 0x29, 0x00, 0xd0, 0x0b, 0x29, 0x0f, 0xdc, 0x09, - 0x00, 0x8c, 0x4f, 0x06, 0x59, 0x39, 0x29, 0x00, - 0xd0, 0x04, 0x1c, 0x08, 0xf7, 0xff, 0xfb, 0x91, - 0x20, 0x00, 0x51, 0x38, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0xff, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x10, - 0x0c, 0x00, 0xb0, 0x82, 0x90, 0x00, 0x04, 0x18, - 0x0c, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xd0, 0x01, - 0x2d, 0x0f, 0xdd, 0x01, 0x20, 0xff, 0xe0, 0x53, - 0x00, 0xaf, 0x4c, 0x2c, 0x59, 0xe0, 0x28, 0x00, - 0xd0, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd0, - 0x98, 0x00, 0x4a, 0x29, 0x40, 0x02, 0x92, 0x00, - 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9a, 0xdd, 0x01, - 0x1c, 0x1a, 0x93, 0x00, 0x23, 0x09, 0x01, 0x9b, - 0x98, 0x01, 0x42, 0x98, 0xdd, 0x01, 0x1c, 0x1a, - 0x93, 0x00, 0x2d, 0x08, 0xda, 0x01, 0x20, 0x00, - 0xe0, 0x00, 0x20, 0x01, 0x22, 0x00, 0x21, 0x00, - 0xb4, 0x07, 0x9a, 0x06, 0xb4, 0x04, 0x20, 0x00, - 0x9a, 0x04, 0x9b, 0x05, 0xf7, 0xff, 0xfa, 0x38, - 0x51, 0xe0, 0xb0, 0x04, 0x1c, 0x01, 0xd0, 0xd1, - 0x48, 0x18, 0x6c, 0x82, 0x62, 0x4a, 0x21, 0x01, - 0x59, 0xe2, 0x63, 0xd1, 0x21, 0x00, 0x43, 0xc9, - 0x59, 0xe2, 0x63, 0x91, 0x99, 0x03, 0x29, 0x08, - 0xd2, 0x10, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x06, 0x08, 0x0b, - 0x04, 0x06, 0x08, 0x0b, 0x48, 0x0e, 0xe0, 0x02, - 0x48, 0x0e, 0xe0, 0x00, 0x48, 0x0e, 0x59, 0xc6, - 0xe0, 0x00, 0x6c, 0x06, 0x59, 0xe0, 0x1c, 0x31, - 0xf7, 0xff, 0xfb, 0xd6, 0x59, 0xe0, 0x68, 0x80, - 0x21, 0x07, 0xf0, 0x04, 0xf9, 0xdd, 0x20, 0x00, - 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0x00, 0x00, 0xff, 0xfe, 0x2e, 0x08, 0x1c, 0x88, - 0x2e, 0x08, 0x55, 0x98, 0x2e, 0x08, 0x55, 0x78, - 0x2e, 0x08, 0x55, 0x58, 0xb5, 0xf0, 0x04, 0x00, - 0x0c, 0x00, 0x04, 0x09, 0x14, 0x09, 0x04, 0x16, - 0x14, 0x36, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x29, - 0x00, 0x84, 0x4f, 0x21, 0x59, 0x38, 0x28, 0x00, - 0xd0, 0x24, 0x08, 0x49, 0x00, 0x49, 0x04, 0x0d, - 0x14, 0x2d, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x04, - 0xfa, 0x8b, 0x98, 0x01, 0x19, 0x40, 0x90, 0x01, - 0x98, 0x03, 0x19, 0x40, 0x90, 0x03, 0x98, 0x02, - 0x19, 0x80, 0x90, 0x02, 0x98, 0x04, 0x19, 0x80, - 0x90, 0x04, 0x98, 0x01, 0x49, 0x15, 0x42, 0x88, - 0xd8, 0x0c, 0x98, 0x02, 0x42, 0x88, 0xd8, 0x09, - 0x23, 0x2d, 0x01, 0x1b, 0x98, 0x01, 0x42, 0x98, - 0xda, 0x04, 0x23, 0x09, 0x01, 0x9b, 0x98, 0x02, - 0x42, 0x98, 0xdb, 0x01, 0x20, 0xff, 0xe0, 0x12, - 0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x02, - 0xf8, 0x5b, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, - 0xf0, 0x03, 0xff, 0x2a, 0x98, 0x00, 0x28, 0x00, - 0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, - 0xf0, 0x03, 0xfc, 0x6e, 0x20, 0x00, 0xb0, 0x05, + 0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44, + 0x29, 0x00, 0xd1, 0x00, 0x49, 0x02, 0x06, 0x40, + 0x0e, 0x40, 0x18, 0x40, 0x7a, 0x00, 0x47, 0x70, + 0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xb0, 0x1c, 0x04, + 0x1c, 0x0f, 0xd1, 0x08, 0x4f, 0x0c, 0x68, 0x38, + 0x28, 0x00, 0xd1, 0x03, 0x48, 0x0b, 0xf7, 0xff, + 0xfe, 0xf9, 0x60, 0x38, 0x68, 0x3f, 0x25, 0x00, + 0x78, 0x20, 0x28, 0x00, 0xd0, 0x08, 0x78, 0x20, + 0x68, 0xf9, 0x34, 0x01, 0xf7, 0xff, 0xff, 0xe0, + 0x19, 0x45, 0x78, 0x20, 0x28, 0x00, 0xd1, 0xf6, + 0x1c, 0x28, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1a, 0x78, 0x2e, 0x02, 0xd7, 0x44, + 0xb5, 0x80, 0x28, 0x00, 0xd1, 0x08, 0x4f, 0x09, + 0x68, 0x38, 0x28, 0x00, 0xd1, 0x03, 0x48, 0x08, + 0xf7, 0xff, 0xfe, 0xd8, 0x60, 0x38, 0x68, 0x38, + 0x28, 0x00, 0xd1, 0x02, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xc0, 0x68, 0x40, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1a, 0x78, + 0x2e, 0x02, 0xd7, 0x44, 0xb5, 0xf0, 0xb0, 0x83, + 0x4a, 0x18, 0x21, 0x00, 0x20, 0xff, 0x30, 0x01, + 0xf7, 0xff, 0xfa, 0x98, 0x49, 0x16, 0x27, 0x00, + 0x64, 0x08, 0x49, 0x16, 0x91, 0x02, 0x49, 0x16, + 0x91, 0x01, 0x49, 0x16, 0x91, 0x00, 0x4c, 0x16, + 0x01, 0x38, 0x06, 0x01, 0x0e, 0x09, 0x20, 0x10, + 0x1c, 0x22, 0x1c, 0x0d, 0xf7, 0xff, 0xfa, 0x86, + 0x00, 0xbe, 0x99, 0x02, 0x51, 0x88, 0x20, 0x04, + 0x1c, 0x29, 0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x7e, + 0x99, 0x01, 0x51, 0x88, 0x20, 0x02, 0x1c, 0x29, + 0x1c, 0x22, 0xf7, 0xff, 0xfa, 0x77, 0x99, 0x00, + 0x51, 0x88, 0x37, 0x01, 0x2f, 0x08, 0xdb, 0xe3, + 0x20, 0x00, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1a, 0xc0, + 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, + 0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x90, + 0x2e, 0x08, 0x1a, 0x80, 0xb5, 0x80, 0x48, 0x0c, + 0xf7, 0xff, 0xfe, 0x84, 0x4f, 0x0b, 0x64, 0x78, + 0x48, 0x0b, 0xf7, 0xff, 0xfe, 0x7f, 0x64, 0xb8, + 0x48, 0x0a, 0xf7, 0xff, 0xfe, 0x7b, 0x64, 0xf8, + 0x20, 0x00, 0x22, 0x00, 0x49, 0x08, 0x00, 0x83, + 0x50, 0xca, 0x30, 0x01, 0x28, 0x10, 0xdb, 0xfa, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x02, 0x5e, 0x2c, 0x2e, 0x08, 0x1c, 0x80, + 0x2e, 0x02, 0x94, 0xb8, 0x2e, 0x02, 0xd7, 0x44, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0x90, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x0b, + 0x29, 0x0f, 0xdc, 0x09, 0x00, 0x8c, 0x4f, 0x06, + 0x59, 0x39, 0x29, 0x00, 0xd0, 0x04, 0x1c, 0x08, + 0xf7, 0xff, 0xfb, 0x85, 0x20, 0x00, 0x51, 0x38, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xff, 0x04, 0x05, + 0x0c, 0x2d, 0x04, 0x10, 0x0c, 0x00, 0xb0, 0x82, + 0x90, 0x00, 0x04, 0x18, 0x0c, 0x00, 0x90, 0x01, + 0x2d, 0x00, 0xd0, 0x01, 0x2d, 0x0f, 0xdd, 0x01, + 0x20, 0xff, 0xe0, 0x53, 0x00, 0xaf, 0x4c, 0x2c, + 0x59, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x28, + 0xf7, 0xff, 0xff, 0xd0, 0x98, 0x00, 0x4a, 0x29, + 0x40, 0x02, 0x92, 0x00, 0x23, 0x2d, 0x01, 0x1b, + 0x42, 0x9a, 0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00, + 0x23, 0x09, 0x01, 0x9b, 0x98, 0x01, 0x42, 0x98, + 0xdd, 0x01, 0x1c, 0x1a, 0x93, 0x00, 0x2d, 0x08, + 0xda, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x01, + 0x22, 0x00, 0x21, 0x00, 0xb4, 0x07, 0x9a, 0x06, + 0xb4, 0x04, 0x20, 0x00, 0x9a, 0x04, 0x9b, 0x05, + 0xf7, 0xff, 0xfa, 0x24, 0x51, 0xe0, 0xb0, 0x04, + 0x1c, 0x01, 0xd0, 0xd1, 0x48, 0x18, 0x6c, 0x82, + 0x62, 0x4a, 0x21, 0x01, 0x59, 0xe2, 0x63, 0xd1, + 0x21, 0x00, 0x43, 0xc9, 0x59, 0xe2, 0x63, 0x91, + 0x99, 0x03, 0x29, 0x08, 0xd2, 0x10, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x04, 0x06, 0x08, 0x0b, 0x04, 0x06, 0x08, 0x0b, + 0x48, 0x0e, 0xe0, 0x02, 0x48, 0x0e, 0xe0, 0x00, + 0x48, 0x0e, 0x59, 0xc6, 0xe0, 0x00, 0x6c, 0x06, + 0x59, 0xe0, 0x1c, 0x31, 0xf7, 0xff, 0xfb, 0xd6, + 0x59, 0xe0, 0x68, 0x80, 0x21, 0x07, 0xf0, 0x04, + 0xf9, 0xbd, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x55, 0x18, 0x80, 0x00, 0x00, 0x00, - 0xb5, 0xf0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x0b, - 0x0c, 0x1b, 0x04, 0x16, 0x0c, 0x36, 0x20, 0xff, - 0xb0, 0x85, 0x2f, 0x07, 0xdc, 0x10, 0x00, 0xbc, - 0x4f, 0x1c, 0x59, 0x39, 0x29, 0x00, 0xd0, 0x0b, - 0x08, 0x5a, 0x00, 0x52, 0x04, 0x15, 0x0c, 0x2d, - 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xda, 0x03, - 0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdb, 0x03, - 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x68, 0x88, 0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x2c, - 0x98, 0x03, 0x99, 0x01, 0x1a, 0x40, 0x90, 0x03, - 0x19, 0x40, 0x90, 0x03, 0x98, 0x04, 0x99, 0x02, - 0x1a, 0x40, 0x90, 0x04, 0x19, 0x80, 0x90, 0x04, - 0x95, 0x01, 0x96, 0x02, 0x59, 0x38, 0x68, 0x80, - 0xa9, 0x01, 0xf0, 0x02, 0xf8, 0x0d, 0x59, 0x38, - 0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xfe, 0xdc, + 0x2e, 0x08, 0x55, 0x10, 0x00, 0x00, 0xff, 0xfe, + 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x90, + 0x2e, 0x08, 0x55, 0x70, 0x2e, 0x08, 0x55, 0x50, + 0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, + 0x14, 0x09, 0x04, 0x16, 0x14, 0x36, 0xb0, 0x85, + 0x28, 0x07, 0xdc, 0x29, 0x00, 0x84, 0x4f, 0x21, + 0x59, 0x38, 0x28, 0x00, 0xd0, 0x24, 0x08, 0x49, + 0x00, 0x49, 0x04, 0x0d, 0x14, 0x2d, 0x68, 0x80, + 0xa9, 0x01, 0xf0, 0x04, 0xfa, 0x6b, 0x98, 0x01, + 0x19, 0x40, 0x90, 0x01, 0x98, 0x03, 0x19, 0x40, + 0x90, 0x03, 0x98, 0x02, 0x19, 0x80, 0x90, 0x02, + 0x98, 0x04, 0x19, 0x80, 0x90, 0x04, 0x98, 0x01, + 0x49, 0x15, 0x42, 0x88, 0xd8, 0x0c, 0x98, 0x02, + 0x42, 0x88, 0xd8, 0x09, 0x23, 0x2d, 0x01, 0x1b, + 0x98, 0x01, 0x42, 0x98, 0xda, 0x04, 0x23, 0x09, + 0x01, 0x9b, 0x98, 0x02, 0x42, 0x98, 0xdb, 0x01, + 0x20, 0xff, 0xe0, 0x12, 0x59, 0x38, 0x68, 0x80, + 0xa9, 0x01, 0xf0, 0x02, 0xf8, 0x3b, 0x59, 0x38, + 0x68, 0x80, 0x46, 0x69, 0xf0, 0x03, 0xff, 0x0a, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x59, 0x38, - 0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfc, 0x20, - 0x20, 0x00, 0xe7, 0xd5, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x80, - 0x49, 0x04, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x03, - 0x68, 0x80, 0x21, 0x00, 0xf0, 0x03, 0xfc, 0x10, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0x80, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, - 0x29, 0x07, 0xdc, 0x0c, 0x29, 0x01, 0xdb, 0x0a, - 0x00, 0x88, 0x49, 0x06, 0x58, 0x08, 0x27, 0x00, - 0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x01, - 0xf0, 0x03, 0xfa, 0x56, 0x1c, 0x38, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x18, - 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, - 0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, - 0x29, 0x00, 0xd0, 0x01, 0x23, 0x32, 0x5e, 0xc8, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0x04, 0x01, 0x0c, 0x09, 0x20, 0x00, 0x29, 0x0f, - 0xdc, 0x06, 0x00, 0x89, 0x4a, 0x03, 0x58, 0x51, - 0x29, 0x00, 0xd0, 0x01, 0x23, 0x34, 0x5e, 0xc8, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0xb0, 0x04, 0x03, 0x0c, 0x1b, 0x04, 0x0a, - 0x0c, 0x12, 0x20, 0xff, 0x2b, 0x07, 0xdc, 0x10, - 0x00, 0x9d, 0x4f, 0x09, 0x59, 0x79, 0x29, 0x00, - 0xd0, 0x0b, 0x07, 0x14, 0x0f, 0x24, 0x68, 0x88, - 0x21, 0x03, 0xf0, 0x03, 0xfe, 0xc5, 0x59, 0x78, - 0x68, 0x80, 0x1c, 0x21, 0xf0, 0x03, 0xff, 0x6c, - 0x20, 0x00, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x55, 0x18, 0xb5, 0x00, 0x04, 0x01, - 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, - 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, - 0xd0, 0x04, 0x68, 0x88, 0x21, 0x02, 0xf0, 0x03, - 0xfe, 0xab, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x55, 0x18, 0xb5, 0x00, 0x04, 0x01, - 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, - 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, - 0xd0, 0x04, 0x68, 0x88, 0x21, 0x00, 0xf0, 0x03, - 0xfe, 0x97, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x55, 0x18, 0xb5, 0xf0, 0x04, 0x05, - 0x0c, 0x2d, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x12, - 0x0c, 0x12, 0x04, 0x1e, 0x0c, 0x36, 0x9c, 0x05, - 0x9f, 0x06, 0x04, 0x24, 0x0c, 0x24, 0x04, 0x3f, - 0x0c, 0x3f, 0x20, 0xff, 0xb0, 0x85, 0x2d, 0x0f, - 0xdc, 0x04, 0x00, 0xab, 0x4d, 0x10, 0x58, 0xed, - 0x2d, 0x00, 0xd1, 0x03, 0xb0, 0x05, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x19, 0x88, 0x23, 0x32, - 0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x58, - 0x04, 0x06, 0x0c, 0x36, 0x19, 0x10, 0x23, 0x34, - 0x5e, 0xeb, 0x42, 0x98, 0xdd, 0x02, 0x1a, 0x98, - 0x04, 0x04, 0x0c, 0x24, 0x91, 0x00, 0x92, 0x01, - 0x96, 0x02, 0x94, 0x03, 0x97, 0x04, 0x46, 0x69, - 0x68, 0xa8, 0xf0, 0x0a, 0xfa, 0x3d, 0xe7, 0xe1, - 0x2e, 0x08, 0x55, 0x18, 0xb4, 0x80, 0x04, 0x03, - 0x0c, 0x1b, 0x20, 0x00, 0x29, 0x00, 0xdb, 0x0f, - 0x2a, 0x00, 0xdb, 0x0d, 0x00, 0x9b, 0x4f, 0x07, - 0x58, 0xff, 0x2f, 0x00, 0xd0, 0x08, 0x23, 0x32, - 0x5e, 0xfb, 0x42, 0x8b, 0xdd, 0x04, 0x23, 0x34, - 0x5e, 0xf9, 0x42, 0x91, 0xdd, 0x00, 0x20, 0x01, - 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0xf0, 0x9c, 0x06, 0x9e, 0x05, 0x04, 0x00, - 0x0c, 0x00, 0xb0, 0x85, 0x90, 0x00, 0x04, 0x08, - 0x14, 0x00, 0x04, 0x17, 0x14, 0x3f, 0x04, 0x1d, - 0x14, 0x2d, 0x04, 0x31, 0x14, 0x09, 0x91, 0x01, - 0x04, 0x23, 0x0c, 0x1b, 0x93, 0x02, 0xb0, 0x82, - 0x99, 0x02, 0x00, 0x89, 0x91, 0x06, 0x4a, 0x71, - 0x92, 0x05, 0x58, 0x51, 0x29, 0x00, 0xd1, 0x01, - 0x20, 0xff, 0xe0, 0xd6, 0x2d, 0x00, 0xda, 0x0e, - 0x19, 0x40, 0x04, 0x00, 0x14, 0x00, 0x42, 0x69, - 0x04, 0x0d, 0x14, 0x2d, 0x99, 0x03, 0x18, 0x79, - 0x04, 0x0f, 0x14, 0x3f, 0x99, 0x03, 0x42, 0x49, - 0x04, 0x09, 0x14, 0x09, 0x91, 0x03, 0x1c, 0x01, - 0x1c, 0x04, 0x98, 0x02, 0x1c, 0x3a, 0xf7, 0xff, - 0xff, 0xb1, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, - 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, - 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x9a, - 0x98, 0x03, 0x10, 0x40, 0x90, 0x00, 0x10, 0x6e, - 0x1c, 0x28, 0xb0, 0x82, 0xf0, 0x0e, 0xfd, 0x56, - 0xf0, 0x0e, 0xfd, 0x92, 0x90, 0x00, 0x91, 0x01, - 0x98, 0x05, 0xf0, 0x0e, 0xfd, 0x4f, 0xf0, 0x0e, - 0xfd, 0x8b, 0x9a, 0x00, 0x9b, 0x01, 0xb0, 0x02, - 0xf0, 0x0e, 0xfd, 0x8a, 0x28, 0x00, 0xd0, 0x4c, - 0x98, 0x03, 0x28, 0x00, 0xdd, 0x21, 0x26, 0x00, - 0x2d, 0x00, 0xdd, 0x6d, 0x98, 0x00, 0x99, 0x03, - 0x18, 0x40, 0x90, 0x00, 0x34, 0x01, 0x42, 0xa8, - 0xdb, 0x03, 0x98, 0x00, 0x1b, 0x40, 0x90, 0x00, - 0x37, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, - 0xf7, 0xff, 0xff, 0x78, 0x28, 0x00, 0xd0, 0x08, - 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, - 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, - 0xff, 0x61, 0x36, 0x01, 0x42, 0xae, 0xdb, 0xe1, - 0xe0, 0x76, 0x98, 0x03, 0x42, 0x40, 0x04, 0x00, - 0x14, 0x00, 0x90, 0x03, 0x98, 0x00, 0x42, 0x46, - 0x20, 0x00, 0x90, 0x01, 0x2d, 0x00, 0xdd, 0x43, - 0x98, 0x03, 0x18, 0x36, 0x34, 0x01, 0x42, 0xae, - 0xdb, 0x01, 0x1b, 0x76, 0x3f, 0x01, 0x98, 0x02, - 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x52, + 0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfc, 0x4e, + 0x20, 0x00, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x10, + 0x80, 0x00, 0x00, 0x00, 0xb5, 0xf0, 0x04, 0x07, + 0x0c, 0x3f, 0x04, 0x0b, 0x0c, 0x1b, 0x04, 0x16, + 0x0c, 0x36, 0x20, 0xff, 0xb0, 0x85, 0x2f, 0x07, + 0xdc, 0x10, 0x00, 0xbc, 0x4f, 0x1c, 0x59, 0x39, + 0x29, 0x00, 0xd0, 0x0b, 0x08, 0x5a, 0x00, 0x52, + 0x04, 0x15, 0x0c, 0x2d, 0x23, 0x2d, 0x01, 0x1b, + 0x42, 0x9d, 0xda, 0x03, 0x23, 0x09, 0x01, 0x9b, + 0x42, 0x9e, 0xdb, 0x03, 0xb0, 0x05, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0x88, 0xa9, 0x01, + 0xf0, 0x04, 0xfa, 0x0c, 0x98, 0x03, 0x99, 0x01, + 0x1a, 0x40, 0x90, 0x03, 0x19, 0x40, 0x90, 0x03, + 0x98, 0x04, 0x99, 0x02, 0x1a, 0x40, 0x90, 0x04, + 0x19, 0x80, 0x90, 0x04, 0x95, 0x01, 0x96, 0x02, + 0x59, 0x38, 0x68, 0x80, 0xa9, 0x01, 0xf0, 0x01, + 0xff, 0xed, 0x59, 0x38, 0x68, 0x80, 0x46, 0x69, + 0xf0, 0x03, 0xfe, 0xbc, 0x98, 0x00, 0x28, 0x00, + 0xd1, 0x04, 0x59, 0x38, 0x68, 0x80, 0x21, 0x01, + 0xf0, 0x03, 0xfc, 0x00, 0x20, 0x00, 0xe7, 0xd5, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x00, 0x80, 0x49, 0x04, 0x58, 0x08, + 0x28, 0x00, 0xd0, 0x03, 0x68, 0x80, 0x21, 0x00, + 0xf0, 0x03, 0xfb, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0x80, 0x04, 0x01, + 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x0c, + 0x29, 0x01, 0xdb, 0x0a, 0x00, 0x88, 0x49, 0x06, + 0x58, 0x08, 0x27, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0x68, 0x80, 0x21, 0x01, 0xf0, 0x03, 0xfa, 0x36, + 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09, + 0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89, + 0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01, + 0x23, 0x32, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0x04, 0x01, 0x0c, 0x09, + 0x20, 0x00, 0x29, 0x0f, 0xdc, 0x06, 0x00, 0x89, + 0x4a, 0x03, 0x58, 0x51, 0x29, 0x00, 0xd0, 0x01, + 0x23, 0x34, 0x5e, 0xc8, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xb0, 0x04, 0x03, + 0x0c, 0x1b, 0x04, 0x0a, 0x0c, 0x12, 0x20, 0xff, + 0x2b, 0x07, 0xdc, 0x10, 0x00, 0x9d, 0x4f, 0x09, + 0x59, 0x79, 0x29, 0x00, 0xd0, 0x0b, 0x07, 0x14, + 0x0f, 0x24, 0x68, 0x88, 0x21, 0x03, 0xf0, 0x03, + 0xfe, 0xa5, 0x59, 0x78, 0x68, 0x80, 0x1c, 0x21, + 0xf0, 0x03, 0xff, 0x4c, 0x20, 0x00, 0xbc, 0xb0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x02, 0xf0, 0x03, 0xfe, 0x8b, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x00, 0xf0, 0x03, 0xfe, 0x77, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, + 0xb5, 0xf0, 0x04, 0x05, 0x0c, 0x2d, 0x04, 0x09, + 0x0c, 0x09, 0x04, 0x12, 0x0c, 0x12, 0x04, 0x1e, + 0x0c, 0x36, 0x9c, 0x05, 0x9f, 0x06, 0x04, 0x24, + 0x0c, 0x24, 0x04, 0x3f, 0x0c, 0x3f, 0x20, 0xff, + 0xb0, 0x85, 0x2d, 0x0f, 0xdc, 0x04, 0x00, 0xab, + 0x4d, 0x10, 0x58, 0xed, 0x2d, 0x00, 0xd1, 0x03, + 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x19, 0x88, 0x23, 0x32, 0x5e, 0xeb, 0x42, 0x98, + 0xdd, 0x02, 0x1a, 0x58, 0x04, 0x06, 0x0c, 0x36, + 0x19, 0x10, 0x23, 0x34, 0x5e, 0xeb, 0x42, 0x98, + 0xdd, 0x02, 0x1a, 0x98, 0x04, 0x04, 0x0c, 0x24, + 0x91, 0x00, 0x92, 0x01, 0x96, 0x02, 0x94, 0x03, + 0x97, 0x04, 0x46, 0x69, 0x68, 0xa8, 0xf0, 0x0a, + 0xfa, 0x1d, 0xe7, 0xe1, 0x2e, 0x08, 0x55, 0x10, + 0xb4, 0x80, 0x04, 0x03, 0x0c, 0x1b, 0x20, 0x00, + 0x29, 0x00, 0xdb, 0x0f, 0x2a, 0x00, 0xdb, 0x0d, + 0x00, 0x9b, 0x4f, 0x07, 0x58, 0xff, 0x2f, 0x00, + 0xd0, 0x08, 0x23, 0x32, 0x5e, 0xfb, 0x42, 0x8b, + 0xdd, 0x04, 0x23, 0x34, 0x5e, 0xf9, 0x42, 0x91, + 0xdd, 0x00, 0x20, 0x01, 0xbc, 0x80, 0x47, 0x70, + 0x2e, 0x08, 0x55, 0x10, 0xb5, 0xf0, 0x9c, 0x06, + 0x9e, 0x05, 0x04, 0x00, 0x0c, 0x00, 0xb0, 0x85, + 0x90, 0x00, 0x04, 0x08, 0x14, 0x00, 0x04, 0x17, + 0x14, 0x3f, 0x04, 0x1d, 0x14, 0x2d, 0x04, 0x31, + 0x14, 0x09, 0x91, 0x01, 0x04, 0x23, 0x0c, 0x1b, + 0x93, 0x02, 0xb0, 0x82, 0x99, 0x02, 0x00, 0x89, + 0x91, 0x06, 0x4a, 0x71, 0x92, 0x05, 0x58, 0x51, + 0x29, 0x00, 0xd1, 0x01, 0x20, 0xff, 0xe0, 0xd6, + 0x2d, 0x00, 0xda, 0x0e, 0x19, 0x40, 0x04, 0x00, + 0x14, 0x00, 0x42, 0x69, 0x04, 0x0d, 0x14, 0x2d, + 0x99, 0x03, 0x18, 0x79, 0x04, 0x0f, 0x14, 0x3f, + 0x99, 0x03, 0x42, 0x49, 0x04, 0x09, 0x14, 0x09, + 0x91, 0x03, 0x1c, 0x01, 0x1c, 0x04, 0x98, 0x02, + 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0xb1, 0x28, 0x00, + 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, + 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, + 0xf0, 0x09, 0xff, 0x7a, 0x98, 0x03, 0x10, 0x40, + 0x90, 0x00, 0x10, 0x6e, 0x1c, 0x28, 0xb0, 0x82, + 0xf0, 0x0e, 0xfd, 0x58, 0xf0, 0x0e, 0xfd, 0x94, + 0x90, 0x00, 0x91, 0x01, 0x98, 0x05, 0xf0, 0x0e, + 0xfd, 0x51, 0xf0, 0x0e, 0xfd, 0x8d, 0x9a, 0x00, + 0x9b, 0x01, 0xb0, 0x02, 0xf0, 0x0e, 0xfd, 0x8c, + 0x28, 0x00, 0xd0, 0x4c, 0x98, 0x03, 0x28, 0x00, + 0xdd, 0x21, 0x26, 0x00, 0x2d, 0x00, 0xdd, 0x6d, + 0x98, 0x00, 0x99, 0x03, 0x18, 0x40, 0x90, 0x00, + 0x34, 0x01, 0x42, 0xa8, 0xdb, 0x03, 0x98, 0x00, + 0x1b, 0x40, 0x90, 0x00, 0x37, 0x01, 0x98, 0x02, + 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x78, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, - 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x3b, 0x98, 0x01, - 0x30, 0x01, 0x90, 0x01, 0x42, 0xa8, 0xdb, 0xe3, - 0xe0, 0x4e, 0x98, 0x03, 0x28, 0x00, 0xdd, 0x24, - 0x20, 0x00, 0x90, 0x01, 0x98, 0x03, 0x28, 0x00, - 0xdd, 0x1e, 0x19, 0x76, 0x99, 0x03, 0x37, 0x01, - 0x42, 0x8e, 0xdb, 0x02, 0x98, 0x03, 0x1a, 0x36, - 0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, - 0xf7, 0xff, 0xff, 0x2c, 0x28, 0x00, 0xd0, 0x08, + 0x1c, 0x3a, 0xf0, 0x09, 0xff, 0x41, 0x36, 0x01, + 0x42, 0xae, 0xdb, 0xe1, 0xe0, 0x76, 0x98, 0x03, + 0x42, 0x40, 0x04, 0x00, 0x14, 0x00, 0x90, 0x03, + 0x98, 0x00, 0x42, 0x46, 0x20, 0x00, 0x90, 0x01, + 0x2d, 0x00, 0xdd, 0x43, 0x98, 0x03, 0x18, 0x36, + 0x34, 0x01, 0x42, 0xae, 0xdb, 0x01, 0x1b, 0x76, + 0x3f, 0x01, 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, + 0xf7, 0xff, 0xff, 0x52, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, - 0xff, 0x15, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, - 0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, 0xe0, 0x27, - 0xe0, 0x26, 0x98, 0x03, 0x42, 0x40, 0x04, 0x01, - 0x14, 0x09, 0x91, 0x03, 0x20, 0x00, 0x90, 0x01, - 0x29, 0x00, 0xdd, 0x1d, 0x19, 0x76, 0x99, 0x03, - 0x3f, 0x01, 0x42, 0x8e, 0xdb, 0x02, 0x99, 0x03, - 0x1a, 0x76, 0x34, 0x01, 0x98, 0x02, 0x1c, 0x21, - 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x03, 0x28, 0x00, - 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, 0x58, 0x08, - 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, 0x1c, 0x3a, - 0xf0, 0x09, 0xfe, 0xec, 0x98, 0x01, 0x30, 0x01, - 0x90, 0x01, 0x99, 0x03, 0x42, 0x88, 0xdb, 0xe1, - 0x20, 0x00, 0xb0, 0x07, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0xb4, 0x80, 0x23, 0x00, 0x88, 0x01, 0x0a, 0x0a, - 0x06, 0x12, 0x0e, 0x12, 0x06, 0x09, 0x0e, 0x09, - 0x2a, 0xdf, 0xd0, 0x1a, 0xdc, 0x07, 0x2a, 0xc4, - 0xd0, 0x19, 0x2a, 0xd6, 0xd0, 0x1b, 0x2a, 0xdc, - 0xd1, 0x08, 0x22, 0x1e, 0xe0, 0x06, 0x2a, 0xe4, - 0xd0, 0x13, 0x2a, 0xf6, 0xd0, 0x15, 0x2a, 0xfc, - 0xd1, 0x00, 0x22, 0x1f, 0x29, 0xdf, 0xd0, 0x26, - 0xdc, 0x11, 0x29, 0xc4, 0xd0, 0x25, 0x29, 0xd6, - 0xd0, 0x27, 0x29, 0xdc, 0xd1, 0x12, 0x21, 0x1e, - 0xe0, 0x10, 0x22, 0x19, 0xe7, 0xf2, 0x22, 0x1a, - 0xe7, 0xf0, 0x22, 0x1b, 0xe7, 0xee, 0x22, 0x1c, - 0xe7, 0xec, 0x22, 0x1d, 0xe7, 0xea, 0x29, 0xe4, - 0xd0, 0x15, 0x29, 0xf6, 0xd0, 0x17, 0x29, 0xfc, - 0xd1, 0x00, 0x21, 0x1f, 0x02, 0x17, 0x18, 0x7f, - 0x80, 0x07, 0x30, 0x02, 0x2a, 0x00, 0xd0, 0x04, - 0x29, 0x00, 0xd0, 0x02, 0x33, 0x01, 0x2b, 0x70, - 0xdb, 0xc0, 0xbc, 0x80, 0x47, 0x70, 0x21, 0x19, - 0xe7, 0xf0, 0x21, 0x1a, 0xe7, 0xee, 0x21, 0x1b, - 0xe7, 0xec, 0x21, 0x1c, 0xe7, 0xea, 0x21, 0x1d, - 0xe7, 0xe8, 0xb5, 0xf0, 0x1c, 0x0f, 0x1c, 0x11, - 0x04, 0x02, 0x0c, 0x12, 0x04, 0x0c, 0x0c, 0x24, - 0x04, 0x1d, 0x0c, 0x2d, 0x00, 0x96, 0xb0, 0x81, - 0x48, 0x10, 0x90, 0x00, 0x59, 0x81, 0x20, 0xff, - 0x29, 0x00, 0xd0, 0x16, 0x2a, 0x00, 0xd0, 0x14, - 0x2a, 0x0f, 0xdc, 0x12, 0x23, 0x32, 0x5e, 0xca, - 0x42, 0xa2, 0xdb, 0x0e, 0x23, 0x34, 0x5e, 0xc9, - 0x42, 0xa9, 0xdb, 0x0a, 0x1c, 0x38, 0xf7, 0xff, - 0xff, 0x93, 0x98, 0x00, 0x59, 0x80, 0x1c, 0x39, - 0x1c, 0x22, 0x1c, 0x2b, 0xf7, 0xff, 0xfb, 0x5c, - 0x20, 0x00, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0xb4, 0xb0, 0x04, 0x07, 0x0c, 0x3f, 0x04, 0x09, - 0x0c, 0x09, 0x04, 0x14, 0x14, 0x24, 0x04, 0x1a, - 0x14, 0x12, 0x20, 0xff, 0x2f, 0x0f, 0xdc, 0x1d, - 0x00, 0xbd, 0x4f, 0x0f, 0x59, 0x7b, 0x2b, 0x00, - 0xd0, 0x18, 0x48, 0x0e, 0x29, 0x01, 0xd0, 0x05, - 0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0x03, - 0x6c, 0x80, 0xe0, 0x02, 0x6c, 0x40, 0xe0, 0x00, - 0x6c, 0xc0, 0x62, 0x58, 0x59, 0x78, 0x63, 0xc4, - 0x20, 0x00, 0x43, 0xc0, 0x42, 0x82, 0xd1, 0x02, - 0x59, 0x79, 0x63, 0x88, 0xe0, 0x01, 0x59, 0x78, - 0x63, 0x82, 0x20, 0x00, 0xbc, 0xb0, 0x47, 0x70, - 0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1c, 0x88, - 0xb5, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, - 0x0c, 0x09, 0x00, 0x80, 0x4a, 0x07, 0x58, 0x10, - 0x28, 0x00, 0xd1, 0x02, 0x20, 0xff, 0xbc, 0x08, - 0x47, 0x18, 0x07, 0x89, 0x0f, 0x89, 0x68, 0x80, - 0xf0, 0x03, 0xfe, 0x96, 0x20, 0x00, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x55, 0x18, - 0xb5, 0x80, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x12, - 0x0c, 0x12, 0x1c, 0x1f, 0x28, 0x07, 0xdc, 0x1f, - 0x28, 0x01, 0xdb, 0x1d, 0x00, 0x80, 0x4b, 0x10, - 0x58, 0x1b, 0x2b, 0x00, 0xd0, 0x18, 0x29, 0x02, - 0xd0, 0x0e, 0x29, 0x04, 0xd0, 0x0c, 0x29, 0x10, - 0xd0, 0x0a, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, - 0xd1, 0x0e, 0x06, 0x12, 0x0e, 0x12, 0x1c, 0x39, - 0x48, 0x08, 0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, - 0x07, 0x12, 0x0f, 0x12, 0x49, 0x06, 0x58, 0x08, - 0x68, 0x00, 0x1c, 0x39, 0xf0, 0x0b, 0xfb, 0x1c, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1c, 0x88, - 0x2e, 0x08, 0x55, 0x58, 0xb5, 0xf0, 0x04, 0x07, - 0x0c, 0x3f, 0x04, 0x10, 0x0c, 0x00, 0x22, 0x00, - 0xb0, 0x85, 0x92, 0x00, 0x2f, 0x07, 0xdc, 0x74, - 0x2f, 0x01, 0xdb, 0x73, 0x00, 0xbe, 0x4a, 0x3e, - 0x59, 0x92, 0x2a, 0x00, 0xd0, 0x6f, 0x04, 0x1a, - 0x0c, 0x12, 0x07, 0xd5, 0x0f, 0xed, 0x24, 0x02, - 0x40, 0x14, 0x27, 0x04, 0x40, 0x17, 0x23, 0x08, - 0x40, 0x1a, 0x92, 0x04, 0x29, 0x02, 0xd0, 0x34, - 0x29, 0x04, 0xd0, 0x32, 0x29, 0x10, 0xd0, 0x30, - 0x01, 0x5b, 0x42, 0x99, 0xd1, 0x60, 0x06, 0x02, - 0x0e, 0x12, 0x46, 0x69, 0x1c, 0x16, 0x48, 0x31, - 0x90, 0x01, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, - 0xfb, 0x13, 0x98, 0x00, 0x4b, 0x2e, 0x40, 0x18, - 0x90, 0x00, 0x2d, 0x00, 0xd0, 0x02, 0x23, 0x02, - 0x43, 0x18, 0x90, 0x00, 0x2c, 0x00, 0xd0, 0x04, - 0x23, 0x01, 0x04, 0x5b, 0x98, 0x00, 0x43, 0x18, - 0x90, 0x00, 0x2f, 0x00, 0xd0, 0x03, 0x23, 0x01, - 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x9a, 0x04, - 0x2a, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x1b, - 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x98, 0x01, - 0x99, 0x00, 0x6c, 0x00, 0x68, 0x00, 0x1c, 0x32, - 0xe0, 0x30, 0x07, 0x02, 0x0f, 0x12, 0x92, 0x03, - 0x48, 0x1c, 0x90, 0x02, 0x59, 0x80, 0x68, 0x00, - 0x46, 0x69, 0xf0, 0x0b, 0xfa, 0xe5, 0x98, 0x00, - 0x4b, 0x17, 0x40, 0x18, 0x90, 0x00, 0x2d, 0x00, - 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, 0x90, 0x00, - 0x2c, 0x00, 0xd0, 0x04, 0x23, 0x01, 0x04, 0x5b, - 0x98, 0x00, 0x43, 0x18, 0x90, 0x00, 0x2f, 0x00, - 0xd0, 0x03, 0x23, 0x01, 0x98, 0x00, 0x43, 0x18, - 0x90, 0x00, 0x9a, 0x04, 0x2a, 0x00, 0xd0, 0x04, - 0x23, 0x01, 0x04, 0x1b, 0x98, 0x00, 0x43, 0x18, - 0x90, 0x00, 0x98, 0x02, 0x9a, 0x03, 0x59, 0x80, - 0xe0, 0x02, 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x03, - 0x68, 0x00, 0x99, 0x00, 0xf0, 0x0b, 0xfa, 0x8c, + 0xff, 0x1b, 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, + 0x42, 0xa8, 0xdb, 0xe3, 0xe0, 0x4e, 0x98, 0x03, + 0x28, 0x00, 0xdd, 0x24, 0x20, 0x00, 0x90, 0x01, + 0x98, 0x03, 0x28, 0x00, 0xdd, 0x1e, 0x19, 0x76, + 0x99, 0x03, 0x37, 0x01, 0x42, 0x8e, 0xdb, 0x02, + 0x98, 0x03, 0x1a, 0x36, 0x34, 0x01, 0x98, 0x02, + 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, 0xff, 0x2c, + 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, 0x99, 0x05, + 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, 0x1c, 0x21, + 0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xf5, 0x98, 0x01, + 0x30, 0x01, 0x90, 0x01, 0x99, 0x03, 0x42, 0x88, + 0xdb, 0xe1, 0xe0, 0x27, 0xe0, 0x26, 0x98, 0x03, + 0x42, 0x40, 0x04, 0x01, 0x14, 0x09, 0x91, 0x03, + 0x20, 0x00, 0x90, 0x01, 0x29, 0x00, 0xdd, 0x1d, + 0x19, 0x76, 0x99, 0x03, 0x3f, 0x01, 0x42, 0x8e, + 0xdb, 0x02, 0x99, 0x03, 0x1a, 0x76, 0x34, 0x01, + 0x98, 0x02, 0x1c, 0x21, 0x1c, 0x3a, 0xf7, 0xff, + 0xff, 0x03, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x06, + 0x99, 0x05, 0x58, 0x08, 0x68, 0x80, 0x9b, 0x04, + 0x1c, 0x21, 0x1c, 0x3a, 0xf0, 0x09, 0xfe, 0xcc, + 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x99, 0x03, + 0x42, 0x88, 0xdb, 0xe1, 0x20, 0x00, 0xb0, 0x07, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0xb4, 0x80, 0x23, 0x00, + 0x88, 0x01, 0x0a, 0x0a, 0x06, 0x12, 0x0e, 0x12, + 0x06, 0x09, 0x0e, 0x09, 0x2a, 0xdf, 0xd0, 0x1a, + 0xdc, 0x07, 0x2a, 0xc4, 0xd0, 0x19, 0x2a, 0xd6, + 0xd0, 0x1b, 0x2a, 0xdc, 0xd1, 0x08, 0x22, 0x1e, + 0xe0, 0x06, 0x2a, 0xe4, 0xd0, 0x13, 0x2a, 0xf6, + 0xd0, 0x15, 0x2a, 0xfc, 0xd1, 0x00, 0x22, 0x1f, + 0x29, 0xdf, 0xd0, 0x26, 0xdc, 0x11, 0x29, 0xc4, + 0xd0, 0x25, 0x29, 0xd6, 0xd0, 0x27, 0x29, 0xdc, + 0xd1, 0x12, 0x21, 0x1e, 0xe0, 0x10, 0x22, 0x19, + 0xe7, 0xf2, 0x22, 0x1a, 0xe7, 0xf0, 0x22, 0x1b, + 0xe7, 0xee, 0x22, 0x1c, 0xe7, 0xec, 0x22, 0x1d, + 0xe7, 0xea, 0x29, 0xe4, 0xd0, 0x15, 0x29, 0xf6, + 0xd0, 0x17, 0x29, 0xfc, 0xd1, 0x00, 0x21, 0x1f, + 0x02, 0x17, 0x18, 0x7f, 0x80, 0x07, 0x30, 0x02, + 0x2a, 0x00, 0xd0, 0x04, 0x29, 0x00, 0xd0, 0x02, + 0x33, 0x01, 0x2b, 0x70, 0xdb, 0xc0, 0xbc, 0x80, + 0x47, 0x70, 0x21, 0x19, 0xe7, 0xf0, 0x21, 0x1a, + 0xe7, 0xee, 0x21, 0x1b, 0xe7, 0xec, 0x21, 0x1c, + 0xe7, 0xea, 0x21, 0x1d, 0xe7, 0xe8, 0xb5, 0xf0, + 0x1c, 0x0f, 0x1c, 0x11, 0x04, 0x02, 0x0c, 0x12, + 0x04, 0x0c, 0x0c, 0x24, 0x04, 0x1d, 0x0c, 0x2d, + 0x00, 0x96, 0xb0, 0x81, 0x48, 0x10, 0x90, 0x00, + 0x59, 0x81, 0x20, 0xff, 0x29, 0x00, 0xd0, 0x16, + 0x2a, 0x00, 0xd0, 0x14, 0x2a, 0x0f, 0xdc, 0x12, + 0x23, 0x32, 0x5e, 0xca, 0x42, 0xa2, 0xdb, 0x0e, + 0x23, 0x34, 0x5e, 0xc9, 0x42, 0xa9, 0xdb, 0x0a, + 0x1c, 0x38, 0xf7, 0xff, 0xff, 0x93, 0x98, 0x00, + 0x59, 0x80, 0x1c, 0x39, 0x1c, 0x22, 0x1c, 0x2b, + 0xf7, 0xff, 0xfb, 0x5c, 0x20, 0x00, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0xb4, 0xb0, 0x04, 0x07, + 0x0c, 0x3f, 0x04, 0x09, 0x0c, 0x09, 0x04, 0x14, + 0x14, 0x24, 0x04, 0x1a, 0x14, 0x12, 0x20, 0xff, + 0x2f, 0x0f, 0xdc, 0x1d, 0x00, 0xbd, 0x4f, 0x0f, + 0x59, 0x7b, 0x2b, 0x00, 0xd0, 0x18, 0x48, 0x0e, + 0x29, 0x01, 0xd0, 0x05, 0x29, 0x02, 0xd0, 0x01, + 0x29, 0x03, 0xd0, 0x03, 0x6c, 0x80, 0xe0, 0x02, + 0x6c, 0x40, 0xe0, 0x00, 0x6c, 0xc0, 0x62, 0x58, + 0x59, 0x78, 0x63, 0xc4, 0x20, 0x00, 0x43, 0xc0, + 0x42, 0x82, 0xd1, 0x02, 0x59, 0x79, 0x63, 0x88, + 0xe0, 0x01, 0x59, 0x78, 0x63, 0x82, 0x20, 0x00, + 0xbc, 0xb0, 0x47, 0x70, 0x2e, 0x08, 0x55, 0x10, + 0x2e, 0x08, 0x1c, 0x80, 0xb5, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0x00, 0x80, + 0x4a, 0x07, 0x58, 0x10, 0x28, 0x00, 0xd1, 0x02, + 0x20, 0xff, 0xbc, 0x08, 0x47, 0x18, 0x07, 0x89, + 0x0f, 0x89, 0x68, 0x80, 0xf0, 0x03, 0xfe, 0x76, + 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0x04, 0x09, 0x0c, 0x09, + 0x4b, 0x0a, 0x40, 0x18, 0x08, 0x4a, 0xd3, 0x01, + 0x23, 0x02, 0x43, 0x18, 0x08, 0x8a, 0xd3, 0x02, + 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, 0x08, 0xca, + 0xd3, 0x01, 0x23, 0x01, 0x43, 0x18, 0x09, 0x09, + 0xd3, 0x02, 0x23, 0x01, 0x04, 0x1b, 0x43, 0x18, + 0x47, 0x70, 0x00, 0x00, 0xff, 0xfc, 0xff, 0xfc, + 0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x14, + 0x0c, 0x24, 0x1c, 0x1e, 0x1c, 0x0f, 0x28, 0x07, + 0xdc, 0x25, 0x28, 0x01, 0xdb, 0x23, 0x00, 0x85, + 0x48, 0x12, 0x59, 0x40, 0x28, 0x00, 0xd0, 0x1e, + 0x0e, 0x31, 0x02, 0x30, 0x0a, 0x00, 0xf7, 0xff, + 0xff, 0xd1, 0x1c, 0x06, 0x2f, 0x02, 0xd0, 0x0e, + 0x2f, 0x04, 0xd0, 0x0c, 0x2f, 0x10, 0xd0, 0x0a, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x0e, + 0x06, 0x22, 0x0e, 0x12, 0x1c, 0x31, 0x48, 0x08, + 0x6c, 0x00, 0x68, 0x00, 0xe0, 0x05, 0x07, 0x22, + 0x0f, 0x12, 0x48, 0x06, 0x59, 0x40, 0x68, 0x00, + 0x1c, 0x31, 0xf0, 0x0b, 0xfa, 0xdb, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, + 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x10, + 0x0c, 0x00, 0x04, 0x1f, 0x0c, 0x3f, 0x22, 0x00, + 0xb0, 0x81, 0x92, 0x00, 0x2c, 0x07, 0xdc, 0x3a, + 0x2c, 0x01, 0xdb, 0x38, 0x00, 0xa4, 0x4a, 0x1e, + 0x59, 0x12, 0x2a, 0x00, 0xd0, 0x33, 0x29, 0x02, + 0xd0, 0x1b, 0x29, 0x04, 0xd0, 0x19, 0x29, 0x10, + 0xd0, 0x17, 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, + 0xd1, 0x29, 0x06, 0x02, 0x0e, 0x12, 0x46, 0x69, + 0x1c, 0x15, 0x4c, 0x16, 0x6c, 0x20, 0x68, 0x00, + 0xf0, 0x0b, 0xfa, 0xdc, 0x98, 0x00, 0x02, 0x00, + 0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x82, + 0x90, 0x00, 0x1c, 0x01, 0x6c, 0x20, 0x1c, 0x2a, + 0xe0, 0x12, 0x07, 0x02, 0x0f, 0x12, 0x1c, 0x15, + 0x4e, 0x0d, 0x59, 0x30, 0x68, 0x00, 0x46, 0x69, + 0xf0, 0x0b, 0xfa, 0xc8, 0x98, 0x00, 0x02, 0x00, + 0x0a, 0x00, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0x6e, + 0x90, 0x00, 0x1c, 0x01, 0x59, 0x30, 0x1c, 0x2a, + 0x68, 0x00, 0xf0, 0x0b, 0xfa, 0x8b, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x55, 0x10, 0x2e, 0x08, 0x1c, 0x80, + 0x2e, 0x08, 0x55, 0x50, 0xb5, 0xf0, 0x4f, 0x28, + 0x25, 0x00, 0x24, 0xff, 0x69, 0x38, 0x28, 0x00, + 0xd1, 0x01, 0x60, 0xbd, 0xe0, 0x0c, 0x26, 0x05, + 0x68, 0xb9, 0x29, 0x07, 0xd2, 0xf9, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x04, 0x08, 0x10, 0x1a, 0x21, 0x30, 0x38, 0x00, + 0x1c, 0x20, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x01, 0x02, 0x80, 0xf7, 0xf6, 0xfa, 0x86, + 0x28, 0x00, 0xdb, 0x2d, 0x20, 0x02, 0xe0, 0x25, + 0x48, 0x18, 0xf7, 0xf6, 0xfa, 0xa1, 0x28, 0x00, + 0xdb, 0x26, 0x89, 0xb8, 0x28, 0x00, 0xdd, 0x15, + 0x20, 0x03, 0xe0, 0x1b, 0x89, 0xb8, 0xf7, 0xf6, + 0xfa, 0x75, 0x28, 0x00, 0xdb, 0x1c, 0x20, 0x04, + 0xe0, 0x14, 0xf7, 0xf6, 0xfa, 0x91, 0x28, 0x00, + 0xdb, 0x16, 0x69, 0x39, 0x18, 0x09, 0x61, 0x39, + 0x89, 0xb9, 0x1a, 0x08, 0x81, 0xb8, 0x89, 0xb8, + 0x28, 0x00, 0xdc, 0xe9, 0x60, 0xbe, 0xe0, 0x0b, + 0x20, 0x00, 0xf7, 0xf6, 0xfa, 0x5f, 0x28, 0x00, + 0xd1, 0x06, 0x20, 0x06, 0x60, 0xb8, 0xe0, 0x03, + 0xf7, 0xf6, 0xfa, 0x7a, 0x28, 0x00, 0xda, 0xb8, + 0x1c, 0x28, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0, + 0xb5, 0xf0, 0x04, 0x04, 0x0c, 0x24, 0x04, 0x0d, + 0x0c, 0x2d, 0x04, 0x16, 0x0c, 0x36, 0xb0, 0x85, + 0xa8, 0x01, 0x49, 0x2e, 0xc9, 0x8e, 0xc0, 0x8e, + 0x2c, 0x00, 0xd0, 0x07, 0x2c, 0x01, 0xd0, 0x07, + 0x2c, 0x02, 0xd0, 0x07, 0x2c, 0x03, 0xd1, 0x3f, + 0x21, 0x08, 0xe0, 0x04, 0x21, 0x01, 0xe0, 0x02, + 0x21, 0x02, 0xe0, 0x00, 0x21, 0x04, 0x91, 0x00, + 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x9d, 0xdc, 0x33, + 0x23, 0x09, 0x01, 0x9b, 0x42, 0x9e, 0xdc, 0x2f, + 0x1e, 0x68, 0x90, 0x03, 0x1e, 0x70, 0x90, 0x04, + 0xa8, 0x01, 0x1c, 0x21, 0xf0, 0x07, 0xfb, 0xb8, + 0x4f, 0x1d, 0x60, 0x78, 0x00, 0x80, 0x23, 0x01, + 0x04, 0x1b, 0x42, 0x98, 0xdc, 0x20, 0x1f, 0xf8, + 0x38, 0x79, 0x67, 0xc4, 0x68, 0x38, 0x28, 0x00, + 0xd0, 0x0a, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfd, 0x42, + 0x68, 0x38, 0xf7, 0xfe, 0xfe, 0x90, 0xb0, 0x01, + 0x22, 0x00, 0x21, 0x0a, 0x20, 0x01, 0xb4, 0x07, + 0x1c, 0x22, 0xb4, 0x04, 0x21, 0x00, 0x20, 0x00, + 0x1c, 0x2a, 0x1c, 0x33, 0xf7, 0xfe, 0xfd, 0x62, + 0xb0, 0x04, 0x60, 0x38, 0x1c, 0x01, 0xd1, 0x03, 0xb0, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1c, 0x88, - 0xff, 0xfc, 0xff, 0xfc, 0x2e, 0x08, 0x55, 0x58, - 0xb5, 0xf0, 0x4f, 0x28, 0x25, 0x00, 0x24, 0xff, - 0x69, 0x38, 0x28, 0x00, 0xd1, 0x01, 0x60, 0xbd, - 0xe0, 0x0c, 0x26, 0x05, 0x68, 0xb9, 0x29, 0x07, - 0xd2, 0xf9, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x08, 0x10, 0x1a, - 0x21, 0x30, 0x38, 0x00, 0x1c, 0x20, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, 0x02, 0x80, - 0xf7, 0xf6, 0xfd, 0xd4, 0x28, 0x00, 0xdb, 0x2d, - 0x20, 0x02, 0xe0, 0x25, 0x48, 0x18, 0xf7, 0xf6, - 0xfd, 0xef, 0x28, 0x00, 0xdb, 0x26, 0x89, 0xb8, - 0x28, 0x00, 0xdd, 0x15, 0x20, 0x03, 0xe0, 0x1b, - 0x89, 0xb8, 0xf7, 0xf6, 0xfd, 0xc3, 0x28, 0x00, - 0xdb, 0x1c, 0x20, 0x04, 0xe0, 0x14, 0xf7, 0xf6, - 0xfd, 0xdf, 0x28, 0x00, 0xdb, 0x16, 0x69, 0x39, - 0x18, 0x09, 0x61, 0x39, 0x89, 0xb9, 0x1a, 0x08, - 0x81, 0xb8, 0x89, 0xb8, 0x28, 0x00, 0xdc, 0xe9, - 0x60, 0xbe, 0xe0, 0x0b, 0x20, 0x00, 0xf7, 0xf6, - 0xfd, 0xad, 0x28, 0x00, 0xd1, 0x06, 0x20, 0x06, - 0x60, 0xb8, 0xe0, 0x03, 0xf7, 0xf6, 0xfd, 0xc8, - 0x28, 0x00, 0xda, 0xb8, 0x1c, 0x28, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x1d, 0x08, - 0x2e, 0x08, 0x55, 0xb8, 0xb5, 0xf0, 0x04, 0x04, - 0x0c, 0x24, 0x04, 0x0d, 0x0c, 0x2d, 0x04, 0x16, - 0x0c, 0x36, 0xb0, 0x85, 0xa8, 0x01, 0x49, 0x2e, - 0xc9, 0x8e, 0xc0, 0x8e, 0x2c, 0x00, 0xd0, 0x07, - 0x2c, 0x01, 0xd0, 0x07, 0x2c, 0x02, 0xd0, 0x07, - 0x2c, 0x03, 0xd1, 0x3f, 0x21, 0x08, 0xe0, 0x04, - 0x21, 0x01, 0xe0, 0x02, 0x21, 0x02, 0xe0, 0x00, - 0x21, 0x04, 0x91, 0x00, 0x23, 0x2d, 0x01, 0x1b, - 0x42, 0x9d, 0xdc, 0x33, 0x23, 0x09, 0x01, 0x9b, - 0x42, 0x9e, 0xdc, 0x2f, 0x1e, 0x68, 0x90, 0x03, - 0x1e, 0x70, 0x90, 0x04, 0xa8, 0x01, 0x1c, 0x21, - 0xf0, 0x07, 0xfb, 0xb8, 0x4f, 0x1d, 0x60, 0x78, - 0x00, 0x80, 0x23, 0x01, 0x04, 0x1b, 0x42, 0x98, - 0xdc, 0x20, 0x1f, 0xf8, 0x38, 0x79, 0x67, 0xc4, - 0x68, 0x38, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0x80, - 0xb0, 0x81, 0x46, 0x6b, 0x22, 0x00, 0x21, 0x00, - 0xf0, 0x09, 0xfd, 0x42, 0x68, 0x38, 0xf7, 0xfe, - 0xfe, 0x7c, 0xb0, 0x01, 0x22, 0x00, 0x21, 0x0a, - 0x20, 0x01, 0xb4, 0x07, 0x1c, 0x22, 0xb4, 0x04, - 0x21, 0x00, 0x20, 0x00, 0x1c, 0x2a, 0x1c, 0x33, - 0xf7, 0xfe, 0xfd, 0x56, 0xb0, 0x04, 0x60, 0x38, - 0x1c, 0x01, 0xd1, 0x03, 0xb0, 0x05, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x69, 0x88, 0x99, 0x00, - 0x43, 0x4d, 0x1d, 0xe9, 0xd5, 0x00, 0x31, 0x07, - 0x10, 0xc9, 0x43, 0x71, 0x61, 0x38, 0x60, 0x79, - 0x81, 0xb9, 0x20, 0x01, 0x60, 0xb8, 0xe7, 0xed, - 0x2e, 0x03, 0x31, 0xf0, 0x2e, 0x08, 0x1d, 0x08, - 0xb5, 0xf0, 0x04, 0x00, 0x0c, 0x00, 0x04, 0x09, - 0x0c, 0x09, 0xb0, 0x87, 0x91, 0x00, 0x04, 0x11, - 0x0c, 0x09, 0x91, 0x01, 0x04, 0x19, 0x0c, 0x09, - 0x91, 0x02, 0xb0, 0x85, 0x28, 0x07, 0xdc, 0x43, - 0x28, 0x01, 0xdb, 0x41, 0x00, 0x85, 0x48, 0x3e, - 0x90, 0x0b, 0x59, 0x41, 0x29, 0x00, 0xd0, 0x3b, - 0x48, 0x3c, 0x90, 0x0a, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x36, 0x23, 0x2c, 0x5e, 0xca, 0x2a, 0x0b, - 0xd2, 0x32, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - 0x22, 0x00, 0x92, 0x00, 0x92, 0x01, 0x23, 0x32, - 0x5e, 0xc3, 0x93, 0x02, 0x23, 0x34, 0x5e, 0xc0, - 0x90, 0x03, 0x92, 0x04, 0x98, 0x07, 0x08, 0x80, - 0xd3, 0x40, 0x23, 0x2c, 0x5e, 0xc8, 0x28, 0x00, - 0xd0, 0x08, 0x28, 0x01, 0xd0, 0x08, 0x28, 0x02, - 0xd0, 0x08, 0x28, 0x03, 0xd1, 0x10, 0x27, 0xff, - 0x37, 0x01, 0xe0, 0x04, 0x27, 0x02, 0xe0, 0x02, - 0x27, 0x04, 0xe0, 0x00, 0x27, 0x10, 0x4e, 0x24, - 0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, 0xd1, 0x16, - 0x24, 0x00, 0x48, 0x22, 0x90, 0x09, 0xe0, 0x03, - 0xb0, 0x0c, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, - 0x06, 0x22, 0x0e, 0x12, 0x98, 0x09, 0x6c, 0x00, - 0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x5d, 0x34, 0x01, - 0x42, 0xbc, 0xdb, 0xf1, 0xe0, 0x12, 0x24, 0x00, - 0x2f, 0x00, 0xdd, 0x0f, 0x48, 0x16, 0x90, 0x08, - 0x00, 0xa0, 0x58, 0x31, 0x29, 0x00, 0xd0, 0x06, - 0x07, 0x22, 0x0f, 0x12, 0x98, 0x08, 0x59, 0x40, - 0x68, 0x00, 0xf0, 0x0b, 0xf9, 0x49, 0x34, 0x01, - 0x42, 0xbc, 0xdb, 0xf1, 0x98, 0x07, 0x08, 0x40, - 0xd3, 0x01, 0x22, 0xff, 0xe0, 0x00, 0x22, 0x00, - 0x99, 0x06, 0xb4, 0x06, 0x98, 0x0d, 0x59, 0x40, - 0x68, 0x81, 0x98, 0x0c, 0x68, 0x00, 0x68, 0x80, - 0x9b, 0x07, 0xaa, 0x02, 0xf0, 0x09, 0xff, 0x12, - 0xb0, 0x0e, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x55, 0x18, 0x2e, 0x08, 0x1d, 0x08, - 0x2e, 0x08, 0x55, 0xb8, 0x2e, 0x08, 0x1c, 0x88, - 0x2e, 0x08, 0x55, 0x58, 0xb5, 0x80, 0x4f, 0x0a, - 0x68, 0x38, 0x28, 0x00, 0xd0, 0x0c, 0x68, 0x80, - 0xb0, 0x81, 0x46, 0x6b, 0x22, 0x00, 0x21, 0x00, - 0xf0, 0x09, 0xfc, 0x72, 0x68, 0x38, 0xf7, 0xfe, - 0xfd, 0xac, 0x20, 0x00, 0x60, 0x38, 0xb0, 0x01, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x1d, 0x08, 0xb5, 0x00, 0x04, 0x01, - 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, - 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, - 0xd0, 0x04, 0x68, 0x88, 0x21, 0x01, 0xf0, 0x03, - 0xfb, 0x93, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x55, 0x18, 0xb5, 0x00, 0x04, 0x01, - 0x0c, 0x09, 0x20, 0xff, 0x29, 0x07, 0xdc, 0x09, - 0x00, 0x89, 0x4a, 0x05, 0x58, 0x51, 0x29, 0x00, - 0xd0, 0x04, 0x68, 0x88, 0x21, 0x00, 0xf0, 0x03, - 0xfb, 0x7f, 0x20, 0x00, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x55, 0x18, 0xb5, 0xf7, 0xb0, 0x86, - 0x9c, 0x07, 0x20, 0x00, 0x6e, 0x40, 0x90, 0x05, - 0x98, 0x05, 0x30, 0x0c, 0x90, 0x05, 0x48, 0x7f, - 0x90, 0x04, 0x98, 0x04, 0x30, 0x0c, 0x90, 0x04, - 0xf0, 0x11, 0xff, 0xce, 0x90, 0x01, 0xf0, 0x11, - 0xff, 0xb1, 0x90, 0x00, 0x20, 0x00, 0x43, 0xc0, - 0x49, 0x79, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, - 0x49, 0x77, 0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, - 0x49, 0x75, 0x61, 0x08, 0x98, 0x06, 0x28, 0x00, - 0xd0, 0x73, 0x20, 0x00, 0x6a, 0x40, 0x90, 0x03, - 0x68, 0x20, 0x30, 0x05, 0x99, 0x06, 0x1a, 0x08, - 0x90, 0x06, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x08, - 0x68, 0x60, 0x99, 0x03, 0x68, 0x09, 0x42, 0x88, - 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0xe0, 0x06, 0x68, 0x60, 0x9a, 0x08, 0x42, 0x90, - 0xd1, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0x28, 0x00, 0xd0, 0x73, 0x68, 0x27, 0x68, 0xe0, - 0x28, 0x00, 0xd0, 0x01, 0x98, 0x05, 0xe0, 0x00, - 0x98, 0x04, 0x1c, 0x06, 0x68, 0xe0, 0x28, 0x00, - 0xd0, 0x02, 0x20, 0x00, 0x6e, 0x40, 0xe0, 0x00, - 0x48, 0x5c, 0x90, 0x02, 0x1d, 0xe5, 0x35, 0x0d, - 0x68, 0xa0, 0x28, 0x08, 0xd2, 0x5f, 0xa3, 0x02, - 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, - 0x04, 0x16, 0x28, 0x3a, 0x49, 0x55, 0x65, 0x71, - 0x69, 0x20, 0x49, 0x55, 0x60, 0x08, 0xcd, 0x02, - 0x48, 0x53, 0x60, 0x41, 0xcd, 0x02, 0x98, 0x02, - 0x60, 0x01, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, - 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, - 0xe7, 0xf8, 0xe0, 0x67, 0x69, 0x20, 0x49, 0x4c, - 0x60, 0x88, 0xcd, 0x02, 0x48, 0x4a, 0x60, 0xc1, - 0xcd, 0x02, 0x98, 0x02, 0x60, 0x41, 0x3f, 0x01, + 0x69, 0x88, 0x99, 0x00, 0x43, 0x4d, 0x1d, 0xe9, + 0xd5, 0x00, 0x31, 0x07, 0x10, 0xc9, 0x43, 0x71, + 0x61, 0x38, 0x60, 0x79, 0x81, 0xb9, 0x20, 0x01, + 0x60, 0xb8, 0xe7, 0xed, 0x2e, 0x03, 0x39, 0x50, + 0x2e, 0x08, 0x1d, 0x00, 0xb5, 0xf0, 0x04, 0x00, + 0x0c, 0x00, 0x04, 0x09, 0x0c, 0x09, 0xb0, 0x87, + 0x91, 0x00, 0x04, 0x11, 0x0c, 0x09, 0x91, 0x01, + 0x04, 0x19, 0x0c, 0x09, 0x91, 0x02, 0xb0, 0x85, + 0x28, 0x07, 0xdc, 0x43, 0x28, 0x01, 0xdb, 0x41, + 0x00, 0x85, 0x48, 0x3e, 0x90, 0x0b, 0x59, 0x41, + 0x29, 0x00, 0xd0, 0x3b, 0x48, 0x3c, 0x90, 0x0a, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x36, 0x23, 0x2c, + 0x5e, 0xca, 0x2a, 0x0b, 0xd2, 0x32, 0xa3, 0x02, + 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x22, 0x00, 0x92, 0x00, + 0x92, 0x01, 0x23, 0x32, 0x5e, 0xc3, 0x93, 0x02, + 0x23, 0x34, 0x5e, 0xc0, 0x90, 0x03, 0x92, 0x04, + 0x98, 0x07, 0x08, 0x80, 0xd3, 0x40, 0x23, 0x2c, + 0x5e, 0xc8, 0x28, 0x00, 0xd0, 0x08, 0x28, 0x01, + 0xd0, 0x08, 0x28, 0x02, 0xd0, 0x08, 0x28, 0x03, + 0xd1, 0x10, 0x27, 0xff, 0x37, 0x01, 0xe0, 0x04, + 0x27, 0x02, 0xe0, 0x02, 0x27, 0x04, 0xe0, 0x00, + 0x27, 0x10, 0x4e, 0x24, 0x23, 0xff, 0x33, 0x01, + 0x42, 0x9f, 0xd1, 0x16, 0x24, 0x00, 0x48, 0x22, + 0x90, 0x09, 0xe0, 0x03, 0xb0, 0x0c, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x58, 0x31, + 0x29, 0x00, 0xd0, 0x06, 0x06, 0x22, 0x0e, 0x12, + 0x98, 0x09, 0x6c, 0x00, 0x68, 0x00, 0xf0, 0x0b, + 0xf9, 0x5d, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1, + 0xe0, 0x12, 0x24, 0x00, 0x2f, 0x00, 0xdd, 0x0f, + 0x48, 0x16, 0x90, 0x08, 0x00, 0xa0, 0x58, 0x31, + 0x29, 0x00, 0xd0, 0x06, 0x07, 0x22, 0x0f, 0x12, + 0x98, 0x08, 0x59, 0x40, 0x68, 0x00, 0xf0, 0x0b, + 0xf9, 0x49, 0x34, 0x01, 0x42, 0xbc, 0xdb, 0xf1, + 0x98, 0x07, 0x08, 0x40, 0xd3, 0x01, 0x22, 0xff, + 0xe0, 0x00, 0x22, 0x00, 0x99, 0x06, 0xb4, 0x06, + 0x98, 0x0d, 0x59, 0x40, 0x68, 0x81, 0x98, 0x0c, + 0x68, 0x00, 0x68, 0x80, 0x9b, 0x07, 0xaa, 0x02, + 0xf0, 0x09, 0xff, 0x12, 0xb0, 0x0e, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, + 0x2e, 0x08, 0x1d, 0x00, 0x2e, 0x08, 0x55, 0xb0, + 0x2e, 0x08, 0x1c, 0x80, 0x2e, 0x08, 0x55, 0x50, + 0xb5, 0x80, 0x4f, 0x0a, 0x68, 0x38, 0x28, 0x00, + 0xd0, 0x0c, 0x68, 0x80, 0xb0, 0x81, 0x46, 0x6b, + 0x22, 0x00, 0x21, 0x00, 0xf0, 0x09, 0xfc, 0x72, + 0x68, 0x38, 0xf7, 0xfe, 0xfd, 0xc0, 0x20, 0x00, + 0x60, 0x38, 0xb0, 0x01, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x1d, 0x00, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x01, 0xf0, 0x03, 0xfb, 0x93, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, + 0xb5, 0x00, 0x04, 0x01, 0x0c, 0x09, 0x20, 0xff, + 0x29, 0x07, 0xdc, 0x09, 0x00, 0x89, 0x4a, 0x05, + 0x58, 0x51, 0x29, 0x00, 0xd0, 0x04, 0x68, 0x88, + 0x21, 0x00, 0xf0, 0x03, 0xfb, 0x7f, 0x20, 0x00, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x55, 0x10, + 0xb5, 0xf7, 0xb0, 0x86, 0x9c, 0x07, 0x20, 0x00, + 0x6e, 0x40, 0x90, 0x05, 0x98, 0x05, 0x30, 0x0c, + 0x90, 0x05, 0x48, 0x7f, 0x90, 0x04, 0x98, 0x04, + 0x30, 0x0c, 0x90, 0x04, 0xf0, 0x11, 0xff, 0xf0, + 0x90, 0x01, 0xf0, 0x11, 0xff, 0xd3, 0x90, 0x00, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x79, 0x60, 0x08, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, 0x60, 0x88, + 0x20, 0x00, 0x43, 0xc0, 0x49, 0x75, 0x61, 0x08, + 0x98, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x20, 0x00, + 0x6a, 0x40, 0x90, 0x03, 0x68, 0x20, 0x30, 0x05, + 0x99, 0x06, 0x1a, 0x08, 0x90, 0x06, 0x68, 0xe0, + 0x28, 0x00, 0xd0, 0x08, 0x68, 0x60, 0x99, 0x03, + 0x68, 0x09, 0x42, 0x88, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x06, 0x68, 0x60, + 0x9a, 0x08, 0x42, 0x90, 0xd1, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x73, + 0x68, 0x27, 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x01, + 0x98, 0x05, 0xe0, 0x00, 0x98, 0x04, 0x1c, 0x06, + 0x68, 0xe0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, + 0x6e, 0x40, 0xe0, 0x00, 0x48, 0x5c, 0x90, 0x02, + 0x1d, 0xe5, 0x35, 0x0d, 0x68, 0xa0, 0x28, 0x08, + 0xd2, 0x5f, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x16, 0x28, 0x3a, + 0x49, 0x55, 0x65, 0x71, 0x69, 0x20, 0x49, 0x55, + 0x60, 0x08, 0xcd, 0x02, 0x48, 0x53, 0x60, 0x41, + 0xcd, 0x02, 0x98, 0x02, 0x60, 0x01, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, - 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x55, - 0x69, 0x20, 0x49, 0x43, 0x61, 0x08, 0xcd, 0x02, - 0x48, 0x41, 0x61, 0x41, 0xcd, 0x02, 0x98, 0x02, - 0x60, 0x81, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, + 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x67, + 0x69, 0x20, 0x49, 0x4c, 0x60, 0x88, 0xcd, 0x02, + 0x48, 0x4a, 0x60, 0xc1, 0xcd, 0x02, 0x98, 0x02, + 0x60, 0x41, 0x3f, 0x01, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, - 0xe7, 0xf8, 0xe0, 0x43, 0x69, 0x20, 0x00, 0x80, - 0xe0, 0x00, 0xe0, 0x4b, 0x21, 0x00, 0x6a, 0x89, - 0x50, 0x0e, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, - 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, - 0xe0, 0x34, 0x69, 0x20, 0x00, 0x80, 0x49, 0x33, - 0x50, 0x0e, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, - 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, - 0xe0, 0x28, 0x69, 0x20, 0x00, 0x80, 0x21, 0x00, - 0x6e, 0x09, 0xe0, 0x01, 0xe0, 0x28, 0xe0, 0x20, - 0x50, 0x0e, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, - 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, - 0xe0, 0x18, 0x69, 0x20, 0x00, 0x80, 0x49, 0x26, - 0x50, 0x0e, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, - 0xd0, 0x02, 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, - 0xe0, 0x0c, 0x69, 0x20, 0x90, 0x03, 0x1c, 0x38, - 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x04, 0xcd, 0x02, - 0x98, 0x03, 0xc0, 0x02, 0x90, 0x03, 0xe7, 0xf6, - 0xe0, 0x00, 0xe7, 0xff, 0x68, 0xe0, 0x28, 0xff, - 0xd1, 0x01, 0x96, 0x05, 0xe0, 0x00, 0x96, 0x04, - 0x68, 0x20, 0x00, 0x80, 0x19, 0x00, 0x1d, 0xc4, - 0x34, 0x0d, 0xe7, 0x3b, 0x98, 0x01, 0x28, 0x00, - 0xd1, 0x01, 0xf0, 0x11, 0xff, 0x2d, 0x98, 0x00, - 0x28, 0x00, 0xd1, 0x01, 0xf0, 0x11, 0xff, 0x0c, - 0x20, 0x00, 0x6e, 0x80, 0x68, 0x00, 0x4b, 0x0f, - 0x42, 0x98, 0xd0, 0x06, 0x48, 0x0d, 0x21, 0x00, - 0x6e, 0x89, 0x60, 0x08, 0x20, 0x01, 0x49, 0x08, - 0x62, 0x08, 0x20, 0x00, 0x21, 0x00, 0x6e, 0x89, - 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, - 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x59, 0xb8, - 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x3a, 0xfc, - 0x2e, 0x08, 0x1d, 0x1c, 0xda, 0xa5, 0xaa, 0x57, - 0xb5, 0x80, 0xb0, 0xa7, 0x46, 0x68, 0x4f, 0x08, - 0x23, 0x13, 0xcf, 0x06, 0xc0, 0x06, 0x3b, 0x01, - 0xd1, 0xfb, 0xcf, 0x04, 0xc0, 0x04, 0x46, 0x69, - 0x4a, 0x04, 0x20, 0x27, 0xf7, 0xff, 0xfe, 0xde, - 0xb0, 0x27, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x03, 0x32, 0x00, 0xf0, 0x24, 0x00, 0x09, - 0xb5, 0xff, 0xb0, 0x83, 0x99, 0x04, 0x04, 0x09, - 0x0c, 0x09, 0x91, 0x00, 0x9a, 0x05, 0x06, 0x16, - 0x0e, 0x36, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, - 0x90, 0x01, 0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, - 0x90, 0x02, 0xb0, 0x84, 0x25, 0x00, 0x98, 0x07, - 0x1d, 0xc2, 0x32, 0x21, 0x92, 0x00, 0x20, 0xff, - 0x30, 0x01, 0x68, 0x00, 0x49, 0x6b, 0x60, 0x08, - 0x98, 0x12, 0x28, 0x01, 0xd1, 0x73, 0x98, 0x07, - 0x28, 0x00, 0xd1, 0x05, 0x20, 0x63, 0xb0, 0x07, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x21, 0x00, 0x91, 0x01, 0x99, 0x01, 0x23, 0xff, - 0x33, 0xe1, 0x42, 0x99, 0xd3, 0x04, 0xe0, 0x0a, - 0x99, 0x01, 0x31, 0x01, 0x91, 0x01, 0xe7, 0xf5, - 0x20, 0x00, 0x99, 0x01, 0x23, 0x2c, 0x43, 0x59, - 0x9a, 0x00, 0x50, 0x50, 0xe7, 0xf4, 0x98, 0x07, - 0x49, 0x5b, 0x68, 0x09, 0x60, 0x08, 0x98, 0x05, - 0x28, 0x10, 0xdb, 0x01, 0x20, 0x01, 0xe0, 0x00, - 0x20, 0x00, 0x99, 0x05, 0x29, 0x1f, 0xdc, 0x01, - 0x21, 0x01, 0xe0, 0x00, 0x21, 0x00, 0x40, 0x08, - 0xd0, 0x04, 0x98, 0x05, 0x49, 0x53, 0x68, 0x09, - 0x60, 0x08, 0xe0, 0x02, 0x20, 0x62, 0xb0, 0x07, - 0xe7, 0xce, 0x20, 0x00, 0x49, 0x4d, 0x68, 0x09, - 0x70, 0x08, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, - 0x22, 0x01, 0x02, 0xd2, 0x21, 0x01, 0xf0, 0x00, - 0xfb, 0x01, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, - 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xbc, 0x22, 0x00, - 0xb4, 0x04, 0x99, 0x05, 0x1c, 0x30, 0x23, 0x04, - 0x22, 0x00, 0xf0, 0x00, 0xf9, 0x2f, 0xb0, 0x01, - 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, - 0xb0, 0x07, 0xe7, 0xad, 0x98, 0x06, 0x28, 0x00, - 0xdb, 0x04, 0x98, 0x06, 0x28, 0x3f, 0xdc, 0x01, - 0x9d, 0x06, 0xe0, 0x00, 0x25, 0x1b, 0x98, 0x11, - 0x01, 0x80, 0x43, 0x05, 0x23, 0x80, 0x43, 0x1d, - 0x48, 0x39, 0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, - 0x60, 0x01, 0x48, 0x37, 0x68, 0x01, 0x43, 0x29, - 0x60, 0x01, 0xf0, 0x11, 0xfe, 0x0b, 0x90, 0x03, - 0xf0, 0x11, 0xfe, 0x22, 0xe0, 0x00, 0xe0, 0x13, - 0x90, 0x02, 0xf0, 0x11, 0xfe, 0x81, 0x1c, 0x04, - 0x4b, 0x30, 0x40, 0x1c, 0x1c, 0x20, 0xf0, 0x11, - 0xfe, 0x7f, 0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, - 0xf0, 0x11, 0xfe, 0x4a, 0x98, 0x03, 0x28, 0x80, - 0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x29, 0xe0, 0x43, - 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x04, - 0x22, 0x00, 0x49, 0x27, 0xf0, 0x00, 0xf8, 0xee, - 0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, - 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x6c, 0x1c, 0x30, + 0xe7, 0xf8, 0xe0, 0x55, 0x69, 0x20, 0x49, 0x43, + 0x61, 0x08, 0xcd, 0x02, 0x48, 0x41, 0x61, 0x41, + 0xcd, 0x02, 0x98, 0x02, 0x60, 0x81, 0x3f, 0x01, + 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, + 0xcd, 0x02, 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x43, + 0x69, 0x20, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x4b, + 0x21, 0x00, 0x6a, 0x89, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x34, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x33, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x28, 0x69, 0x20, + 0x00, 0x80, 0x21, 0x00, 0x6e, 0x09, 0xe0, 0x01, + 0xe0, 0x28, 0xe0, 0x20, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x18, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x26, 0x50, 0x0e, 0x1c, 0x38, + 0x3f, 0x01, 0x28, 0x00, 0xd0, 0x02, 0xcd, 0x02, + 0xc6, 0x02, 0xe7, 0xf8, 0xe0, 0x0c, 0x69, 0x20, + 0x90, 0x03, 0x1c, 0x38, 0x3f, 0x01, 0x28, 0x00, + 0xd0, 0x04, 0xcd, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0xe7, 0xf6, 0xe0, 0x00, 0xe7, 0xff, + 0x68, 0xe0, 0x28, 0xff, 0xd1, 0x01, 0x96, 0x05, + 0xe0, 0x00, 0x96, 0x04, 0x68, 0x20, 0x00, 0x80, + 0x19, 0x00, 0x1d, 0xc4, 0x34, 0x0d, 0xe7, 0x3b, + 0x98, 0x01, 0x28, 0x00, 0xd1, 0x01, 0xf0, 0x11, + 0xff, 0x4f, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x01, + 0xf0, 0x11, 0xff, 0x2e, 0x20, 0x00, 0x6e, 0x80, + 0x68, 0x00, 0x4b, 0x0f, 0x42, 0x98, 0xd0, 0x06, + 0x48, 0x0d, 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x08, 0x62, 0x08, 0x20, 0x00, + 0x21, 0x00, 0x6e, 0x89, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x08, 0x59, 0xb0, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x3a, 0xf4, 0x2e, 0x08, 0x1d, 0x14, + 0xda, 0xa5, 0xaa, 0x57, 0xb5, 0x80, 0xb0, 0xa7, + 0x46, 0x68, 0x4f, 0x08, 0x23, 0x13, 0xcf, 0x06, + 0xc0, 0x06, 0x3b, 0x01, 0xd1, 0xfb, 0xcf, 0x04, + 0xc0, 0x04, 0x46, 0x69, 0x4a, 0x04, 0x20, 0x27, + 0xf7, 0xff, 0xfe, 0xde, 0xb0, 0x27, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x03, 0x39, 0x60, + 0xf0, 0x24, 0x00, 0x09, 0xb5, 0xff, 0xb0, 0x83, + 0x99, 0x04, 0x04, 0x09, 0x0c, 0x09, 0x91, 0x00, + 0x9a, 0x05, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x06, + 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x84, + 0x25, 0x00, 0x98, 0x07, 0x1d, 0xc2, 0x32, 0x21, + 0x92, 0x00, 0x20, 0xff, 0x30, 0x01, 0x68, 0x00, + 0x49, 0x6b, 0x60, 0x08, 0x98, 0x12, 0x28, 0x01, + 0xd1, 0x73, 0x98, 0x07, 0x28, 0x00, 0xd1, 0x05, + 0x20, 0x63, 0xb0, 0x07, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x21, 0x00, 0x91, 0x01, + 0x99, 0x01, 0x23, 0xff, 0x33, 0xe1, 0x42, 0x99, + 0xd3, 0x04, 0xe0, 0x0a, 0x99, 0x01, 0x31, 0x01, + 0x91, 0x01, 0xe7, 0xf5, 0x20, 0x00, 0x99, 0x01, + 0x23, 0x2c, 0x43, 0x59, 0x9a, 0x00, 0x50, 0x50, + 0xe7, 0xf4, 0x98, 0x07, 0x49, 0x5b, 0x68, 0x09, + 0x60, 0x08, 0x98, 0x05, 0x28, 0x10, 0xdb, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x99, 0x05, + 0x29, 0x1f, 0xdc, 0x01, 0x21, 0x01, 0xe0, 0x00, + 0x21, 0x00, 0x40, 0x08, 0xd0, 0x04, 0x98, 0x05, + 0x49, 0x53, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x02, + 0x20, 0x62, 0xb0, 0x07, 0xe7, 0xce, 0x20, 0x00, + 0x49, 0x4d, 0x68, 0x09, 0x70, 0x08, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, 0x22, 0x01, 0x02, 0xd2, - 0x21, 0x02, 0xf0, 0x00, 0xfa, 0xa3, 0x1c, 0x07, + 0x21, 0x01, 0xf0, 0x00, 0xfb, 0x01, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, - 0xe7, 0x5e, 0x48, 0x19, 0x68, 0x01, 0x0a, 0x09, - 0x02, 0x09, 0x60, 0x01, 0x48, 0x16, 0x68, 0x01, - 0x23, 0x1b, 0x43, 0x19, 0x60, 0x01, 0x48, 0x12, - 0x68, 0x00, 0x68, 0x00, 0x90, 0x07, 0xf0, 0x11, - 0xfd, 0xc5, 0x90, 0x03, 0xf0, 0x11, 0xfd, 0xdc, - 0x90, 0x02, 0xf0, 0x11, 0xfe, 0x3d, 0x1c, 0x04, - 0x23, 0x01, 0x04, 0x5b, 0x43, 0x1c, 0x1c, 0x20, - 0xf0, 0x11, 0xfe, 0x3a, 0x98, 0x02, 0x28, 0x40, - 0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x05, 0x98, 0x03, - 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x11, 0xfd, 0xe4, - 0x1c, 0x38, 0xb0, 0x07, 0xe7, 0x34, 0xb0, 0x04, - 0xb0, 0x03, 0xe7, 0x31, 0x2e, 0x08, 0x5d, 0xc0, - 0x2e, 0x08, 0x5d, 0xb8, 0x2e, 0x08, 0x5d, 0xbc, - 0x68, 0x00, 0x00, 0x38, 0xff, 0xfd, 0xff, 0xff, - 0x00, 0x00, 0xff, 0xff, 0xb5, 0x00, 0xf7, 0xff, - 0xfe, 0xe7, 0xf0, 0x00, 0xf8, 0x02, 0xbc, 0x08, - 0x47, 0x18, 0xb5, 0xf0, 0xf0, 0x0b, 0xf9, 0x48, - 0x26, 0x00, 0x2e, 0x04, 0xd3, 0x02, 0xe0, 0x12, - 0x36, 0x01, 0xe7, 0xfa, 0x01, 0x30, 0x4b, 0x3c, - 0x18, 0xc7, 0x25, 0x00, 0x2d, 0x04, 0xd3, 0x02, - 0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x00, - 0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8, 0x37, 0xff, - 0x37, 0x01, 0xe7, 0xf6, 0xe7, 0xec, 0x4f, 0x35, - 0x25, 0x00, 0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x07, - 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, - 0x20, 0x00, 0x60, 0xf8, 0x37, 0x10, 0xe7, 0xf7, - 0x20, 0x00, 0x49, 0x2f, 0x68, 0x09, 0x70, 0x08, - 0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02, 0xe0, 0x1f, - 0x34, 0x01, 0xe7, 0xfa, 0x21, 0x00, 0x00, 0xe0, - 0x4a, 0x2a, 0x68, 0x12, 0x50, 0x11, 0x20, 0x00, - 0x00, 0xe1, 0x4a, 0x28, 0x68, 0x12, 0x18, 0x89, - 0x60, 0x48, 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x26, - 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x00, - 0x00, 0xa1, 0x4a, 0x24, 0x68, 0x12, 0x50, 0x50, - 0x20, 0x00, 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, - 0x4a, 0x21, 0x68, 0x12, 0x52, 0x50, 0xe7, 0xdf, - 0x20, 0x00, 0x21, 0x19, 0x06, 0x89, 0x62, 0x48, - 0x48, 0x1e, 0x21, 0x19, 0x06, 0x89, 0x62, 0x48, - 0x20, 0x00, 0x49, 0x1d, 0x68, 0x09, 0x60, 0x08, - 0x20, 0x00, 0x49, 0x1b, 0x68, 0x09, 0x60, 0x48, - 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 0x60, 0xc8, - 0x20, 0x00, 0x49, 0x17, 0x68, 0x09, 0x61, 0x08, - 0x20, 0x00, 0x49, 0x15, 0x68, 0x09, 0x61, 0x48, - 0x20, 0x00, 0x49, 0x13, 0x68, 0x09, 0x61, 0x88, - 0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x08, - 0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x60, 0x48, - 0x20, 0x00, 0x49, 0x0e, 0x68, 0x09, 0x60, 0x88, - 0x48, 0x0d, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, - 0x60, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x9e, 0x00, 0x00, 0xc0, 0x9e, 0x00, 0x09, 0x80, - 0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5d, 0xd8, - 0x2e, 0x08, 0x5d, 0xdc, 0x2e, 0x08, 0x5d, 0xd4, - 0x2e, 0x08, 0x5d, 0xcc, 0x00, 0x40, 0x00, 0x03, - 0x2e, 0x08, 0x5e, 0x14, 0x2e, 0x08, 0x5e, 0x18, - 0x6a, 0x00, 0x00, 0x10, 0xb5, 0xff, 0xb0, 0x83, - 0x98, 0x03, 0x06, 0x04, 0x0e, 0x24, 0x99, 0x04, - 0x04, 0x08, 0x0c, 0x00, 0x90, 0x00, 0x9a, 0x05, - 0x06, 0x10, 0x0e, 0x00, 0x90, 0x01, 0x9b, 0x06, - 0x06, 0x18, 0x0e, 0x00, 0x90, 0x02, 0xb0, 0x81, - 0x00, 0xe0, 0x49, 0xc1, 0x68, 0x09, 0x18, 0x47, - 0x00, 0xa0, 0x49, 0xc0, 0x68, 0x09, 0x18, 0x45, - 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0xbe, - 0x68, 0x09, 0x18, 0x46, 0x2c, 0x20, 0xdb, 0x05, - 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x68, 0x28, 0x4b, 0xb9, - 0x40, 0x18, 0x60, 0x28, 0x68, 0x38, 0x4b, 0xb8, - 0x40, 0x18, 0x60, 0x38, 0x68, 0x38, 0x23, 0x40, - 0x40, 0x18, 0xd0, 0x17, 0x68, 0x38, 0x23, 0x40, - 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, 0x48, 0xb3, - 0x68, 0x01, 0x08, 0x49, 0x00, 0x49, 0x60, 0x01, - 0x48, 0xb1, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, - 0x43, 0x19, 0x60, 0x01, 0x98, 0x01, 0x4b, 0xaf, - 0x42, 0x98, 0xd1, 0x03, 0x20, 0x00, 0x49, 0xae, - 0x68, 0x09, 0x60, 0x08, 0x98, 0x01, 0x4b, 0xab, - 0x42, 0x98, 0xd0, 0x73, 0x68, 0x38, 0x23, 0x21, - 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, 0x68, 0x28, - 0x23, 0x07, 0x03, 0x5b, 0x40, 0x18, 0x60, 0x28, - 0x98, 0x01, 0x4b, 0xa6, 0x40, 0x18, 0x68, 0x29, - 0x43, 0x08, 0x60, 0x28, 0x20, 0x00, 0x75, 0x30, - 0x98, 0x02, 0x07, 0x80, 0x0f, 0x80, 0x28, 0x01, - 0xd1, 0x04, 0x88, 0x30, 0x23, 0x10, 0x43, 0x18, - 0x80, 0x30, 0xe0, 0x04, 0x88, 0x30, 0x23, 0x10, - 0x43, 0xdb, 0x40, 0x18, 0x80, 0x30, 0x98, 0x02, - 0x23, 0x80, 0x40, 0x18, 0x28, 0x80, 0xd1, 0x08, - 0x68, 0x38, 0x23, 0x40, 0x43, 0x18, 0x60, 0x38, - 0x20, 0xff, 0x49, 0x97, 0x68, 0x09, 0x70, 0x08, - 0xe0, 0x04, 0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, - 0x40, 0x18, 0x60, 0x38, 0x98, 0x03, 0x28, 0x01, - 0xd1, 0x36, 0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, - 0x40, 0x18, 0x80, 0x30, 0x20, 0x33, 0x06, 0x40, - 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, - 0x00, 0xe0, 0x4a, 0x8c, 0x68, 0x12, 0x18, 0x80, - 0x60, 0x41, 0x20, 0x01, 0x70, 0xb0, 0x68, 0x38, - 0x23, 0x01, 0x03, 0x9b, 0x43, 0x18, 0x60, 0x38, - 0x68, 0x38, 0x4b, 0x87, 0x43, 0x18, 0x60, 0x38, - 0x48, 0x86, 0x70, 0x44, 0x20, 0x00, 0x49, 0x86, - 0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x02, 0xc0, - 0x49, 0x84, 0x61, 0x48, 0x49, 0x83, 0x61, 0x08, - 0x20, 0x01, 0x49, 0x83, 0x64, 0x48, 0x20, 0x00, - 0x49, 0x81, 0x64, 0x48, 0x68, 0x28, 0x23, 0x01, - 0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0x20, 0x00, - 0x49, 0x7e, 0x68, 0x09, 0x60, 0x08, 0xe0, 0x9a, - 0x98, 0x03, 0x28, 0x02, 0xd1, 0x30, 0x20, 0x33, - 0x06, 0x40, 0xe0, 0x00, 0xe0, 0x94, 0x6d, 0xc0, - 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x00, 0xe1, - 0x4a, 0x70, 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, - 0x20, 0x02, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, - 0x03, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, - 0x4b, 0x6b, 0x43, 0x18, 0x60, 0x38, 0x48, 0x6b, - 0x70, 0x84, 0x20, 0x00, 0x49, 0x6e, 0x60, 0x08, - 0x00, 0xe0, 0x49, 0x5b, 0x68, 0x09, 0x58, 0x08, - 0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xe1, - 0x4a, 0x57, 0x68, 0x12, 0x50, 0x50, 0x20, 0x4b, - 0x49, 0x67, 0x60, 0x08, 0x68, 0x28, 0x23, 0x01, - 0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0xe0, 0x66, - 0x98, 0x03, 0x28, 0x04, 0xd1, 0x15, 0x20, 0x00, - 0x00, 0xe1, 0x4a, 0x5a, 0x68, 0x12, 0x18, 0x89, - 0x60, 0x48, 0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, - 0x23, 0x20, 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, - 0x60, 0x38, 0x48, 0x56, 0x70, 0x04, 0x68, 0x28, - 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, - 0xe0, 0x4d, 0x98, 0x03, 0x23, 0x10, 0x40, 0x18, - 0xd0, 0x0f, 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x4d, - 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x68, 0x38, - 0x4b, 0x52, 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, - 0x60, 0x38, 0x37, 0x04, 0x20, 0x0e, 0x60, 0x38, - 0xe0, 0x39, 0x98, 0x03, 0x28, 0x08, 0xd1, 0x23, - 0x48, 0x4d, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, - 0x28, 0x00, 0xd0, 0x03, 0x20, 0x4f, 0xb0, 0x04, - 0xe6, 0xf8, 0xe0, 0x67, 0x20, 0x01, 0x49, 0x48, - 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x46, - 0x68, 0x00, 0x30, 0x60, 0x76, 0x04, 0x20, 0x01, - 0x49, 0x43, 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, - 0x49, 0x42, 0x00, 0xe0, 0x4a, 0x37, 0x68, 0x12, - 0x18, 0x80, 0x60, 0x41, 0x68, 0x28, 0x23, 0x01, - 0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0xe0, 0x12, - 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x31, 0x68, 0x12, - 0x18, 0x80, 0x60, 0x41, 0x98, 0x03, 0x70, 0xb0, - 0x68, 0x38, 0x23, 0x20, 0x43, 0x18, 0x60, 0x38, - 0x68, 0x38, 0x60, 0x38, 0x68, 0x28, 0x23, 0x01, - 0x03, 0x5b, 0x43, 0x18, 0x60, 0x28, 0xe0, 0x33, - 0x98, 0x03, 0x23, 0x10, 0x40, 0x18, 0xd0, 0x09, - 0x1c, 0x20, 0xf0, 0x05, 0xf8, 0x0f, 0x90, 0x00, - 0x28, 0x00, 0xd0, 0x02, 0x98, 0x00, 0xb0, 0x04, - 0xe6, 0xbc, 0xe0, 0x1a, 0x98, 0x03, 0x28, 0x01, - 0xd1, 0x03, 0x20, 0xff, 0x49, 0x21, 0x70, 0x48, - 0xe0, 0x13, 0x98, 0x03, 0x28, 0x02, 0xd1, 0x03, - 0x20, 0xff, 0x49, 0x1e, 0x70, 0x88, 0xe0, 0x0c, - 0x98, 0x03, 0x28, 0x08, 0xd1, 0x09, 0x20, 0x00, - 0x49, 0x21, 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, - 0x20, 0x00, 0x49, 0x1f, 0x68, 0x09, 0x31, 0x60, - 0x76, 0x88, 0x7d, 0x30, 0x07, 0xc0, 0x0f, 0xc0, - 0x28, 0x01, 0xd1, 0x03, 0x1c, 0x20, 0x49, 0x1c, - 0xf0, 0x00, 0xf9, 0x16, 0x20, 0x00, 0x70, 0xb0, - 0x20, 0x00, 0xb0, 0x04, 0xe6, 0x92, 0xb0, 0x01, - 0xb0, 0x03, 0xe6, 0x8f, 0xe6, 0x8e, 0x00, 0x00, - 0x2e, 0x08, 0x5d, 0xd8, 0x2e, 0x08, 0x5d, 0xd4, - 0x2e, 0x08, 0x5d, 0xcc, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0x3f, 0xff, 0x6a, 0x00, 0x00, 0x18, - 0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x5d, 0xe0, 0xff, 0xff, 0x1f, 0xff, - 0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x5d, 0xdc, - 0x00, 0x00, 0x20, 0x01, 0x2e, 0x08, 0x5e, 0x38, - 0x2e, 0x08, 0x5e, 0x04, 0xcc, 0x00, 0x0f, 0x00, - 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5e, 0x48, - 0x2e, 0x08, 0x5e, 0x4c, 0x00, 0x00, 0x20, 0xa0, - 0x2e, 0x08, 0x7c, 0x4c, 0x66, 0x00, 0x01, 0xf0, - 0xff, 0xff, 0x00, 0x00, 0xb5, 0xff, 0x98, 0x00, - 0x06, 0x01, 0x0e, 0x09, 0x98, 0x01, 0x06, 0x02, - 0x0e, 0x12, 0x98, 0x02, 0x04, 0x07, 0x0c, 0x3f, - 0x9b, 0x03, 0x04, 0x1c, 0x0c, 0x24, 0x29, 0x20, - 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2a, 0x02, 0xd1, 0x0a, - 0x00, 0xc8, 0x4b, 0x1f, 0x68, 0x1b, 0x58, 0x18, - 0x4b, 0x1e, 0x40, 0x18, 0x00, 0xcb, 0x4d, 0x1c, - 0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x30, 0x2a, 0x01, - 0xd1, 0x0b, 0x00, 0xc8, 0x4b, 0x18, 0x68, 0x1b, - 0x58, 0x18, 0x43, 0x27, 0x1c, 0x3b, 0x43, 0x18, - 0x00, 0xcb, 0x4d, 0x15, 0x68, 0x2d, 0x50, 0xe8, - 0xe0, 0x22, 0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, - 0xe0, 0x1e, 0x1c, 0x43, 0x06, 0x1b, 0x16, 0x18, - 0xe7, 0xf8, 0x2a, 0x03, 0xd1, 0x0b, 0x00, 0xc3, - 0x4d, 0x0d, 0x68, 0x2d, 0x58, 0xeb, 0x1c, 0x3d, - 0x43, 0x25, 0x43, 0x1d, 0x00, 0xc3, 0x4e, 0x0a, - 0x68, 0x36, 0x50, 0xf5, 0xe0, 0x0b, 0x2a, 0x04, - 0xd1, 0x09, 0x00, 0xc3, 0x4d, 0x06, 0x68, 0x2d, - 0x58, 0xed, 0x4b, 0x06, 0x40, 0x2b, 0x00, 0xc5, - 0x4e, 0x03, 0x68, 0x36, 0x51, 0x73, 0xe7, 0xe0, - 0x20, 0x00, 0xe7, 0xbb, 0xe7, 0xba, 0x00, 0x00, - 0x2e, 0x08, 0x5d, 0xd8, 0xff, 0xff, 0xe1, 0xff, - 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38, - 0x0e, 0x00, 0x06, 0x11, 0x0e, 0x09, 0x4c, 0x14, - 0x68, 0x25, 0x4b, 0x14, 0x40, 0x2b, 0x60, 0x23, - 0x28, 0x01, 0xd1, 0x06, 0x4c, 0x10, 0x68, 0x25, - 0x23, 0x01, 0x04, 0x1b, 0x43, 0x2b, 0x60, 0x23, - 0xe0, 0x07, 0x28, 0x00, 0xd1, 0x05, 0x4c, 0x0c, - 0x68, 0x25, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x2b, - 0x60, 0x23, 0x29, 0x01, 0xd1, 0x06, 0x4c, 0x08, - 0x68, 0x25, 0x23, 0x01, 0x03, 0x9b, 0x43, 0x2b, - 0x60, 0x23, 0xe0, 0x07, 0x29, 0x02, 0xd1, 0x05, - 0x4c, 0x03, 0x68, 0x25, 0x23, 0x01, 0x03, 0xdb, - 0x43, 0x2b, 0x60, 0x23, 0xbc, 0xb0, 0x47, 0x70, - 0x64, 0x00, 0x00, 0x24, 0xff, 0xbe, 0x3f, 0xff, - 0xb5, 0xff, 0x1c, 0x1f, 0x9c, 0x09, 0xb0, 0x82, - 0x98, 0x02, 0x04, 0x00, 0x0c, 0x00, 0x90, 0x00, - 0x99, 0x03, 0x06, 0x0a, 0x0e, 0x12, 0x98, 0x04, - 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x0c, 0x06, 0x00, - 0x0e, 0x00, 0x90, 0x01, 0x00, 0xd0, 0x1a, 0x80, - 0x00, 0x80, 0x4b, 0x1b, 0x68, 0x1b, 0x18, 0xc1, - 0x2a, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, + 0xe7, 0xbc, 0x22, 0x00, 0xb4, 0x04, 0x99, 0x05, + 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0xf0, 0x00, + 0xf9, 0x2f, 0xb0, 0x01, 0x1c, 0x07, 0x2f, 0x00, + 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0xad, + 0x98, 0x06, 0x28, 0x00, 0xdb, 0x04, 0x98, 0x06, + 0x28, 0x3f, 0xdc, 0x01, 0x9d, 0x06, 0xe0, 0x00, + 0x25, 0x1b, 0x98, 0x11, 0x01, 0x80, 0x43, 0x05, + 0x23, 0x80, 0x43, 0x1d, 0x48, 0x39, 0x68, 0x01, + 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, 0x48, 0x37, + 0x68, 0x01, 0x43, 0x29, 0x60, 0x01, 0xf0, 0x11, + 0xfe, 0x2d, 0x90, 0x03, 0xf0, 0x11, 0xfe, 0x44, + 0xe0, 0x00, 0xe0, 0x13, 0x90, 0x02, 0xf0, 0x11, + 0xfe, 0xa3, 0x1c, 0x04, 0x4b, 0x30, 0x40, 0x1c, + 0x1c, 0x20, 0xf0, 0x11, 0xfe, 0xa1, 0x98, 0x02, + 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11, 0xfe, 0x6c, + 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, 0xf0, 0x11, + 0xfe, 0x4b, 0xe0, 0x43, 0x22, 0x00, 0xb4, 0x04, + 0x1c, 0x30, 0x23, 0x04, 0x22, 0x00, 0x49, 0x27, + 0xf0, 0x00, 0xf8, 0xee, 0xb0, 0x01, 0x1c, 0x07, + 0x2f, 0x00, 0xd0, 0x02, 0x20, 0xa2, 0xb0, 0x07, + 0xe7, 0x6c, 0x1c, 0x30, 0x23, 0x03, 0x02, 0x5b, + 0x22, 0x01, 0x02, 0xd2, 0x21, 0x02, 0xf0, 0x00, + 0xfa, 0xa3, 0x1c, 0x07, 0x2f, 0x00, 0xd0, 0x02, + 0x20, 0xa2, 0xb0, 0x07, 0xe7, 0x5e, 0x48, 0x19, + 0x68, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x60, 0x01, + 0x48, 0x16, 0x68, 0x01, 0x23, 0x1b, 0x43, 0x19, + 0x60, 0x01, 0x48, 0x12, 0x68, 0x00, 0x68, 0x00, + 0x90, 0x07, 0xf0, 0x11, 0xfd, 0xe7, 0x90, 0x03, + 0xf0, 0x11, 0xfd, 0xfe, 0x90, 0x02, 0xf0, 0x11, + 0xfe, 0x5f, 0x1c, 0x04, 0x23, 0x01, 0x04, 0x5b, + 0x43, 0x1c, 0x1c, 0x20, 0xf0, 0x11, 0xfe, 0x5c, + 0x98, 0x02, 0x28, 0x40, 0xd0, 0x01, 0xf0, 0x11, + 0xfe, 0x27, 0x98, 0x03, 0x28, 0x80, 0xd0, 0x01, + 0xf0, 0x11, 0xfe, 0x06, 0x1c, 0x38, 0xb0, 0x07, + 0xe7, 0x34, 0xb0, 0x04, 0xb0, 0x03, 0xe7, 0x31, + 0x2e, 0x08, 0x5d, 0xb8, 0x2e, 0x08, 0x5d, 0xb0, + 0x2e, 0x08, 0x5d, 0xb4, 0x68, 0x00, 0x00, 0x38, + 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0xb5, 0x00, 0xf7, 0xff, 0xfe, 0xe7, 0xf0, 0x00, + 0xf8, 0x02, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, + 0xf0, 0x0b, 0xf9, 0x48, 0x26, 0x00, 0x2e, 0x04, + 0xd3, 0x02, 0xe0, 0x12, 0x36, 0x01, 0xe7, 0xfa, + 0x01, 0x30, 0x4b, 0x3c, 0x18, 0xc7, 0x25, 0x00, + 0x2d, 0x04, 0xd3, 0x02, 0xe0, 0x08, 0x35, 0x01, + 0xe7, 0xfa, 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, + 0x60, 0xf8, 0x37, 0xff, 0x37, 0x01, 0xe7, 0xf6, + 0xe7, 0xec, 0x4f, 0x35, 0x25, 0x00, 0x2d, 0x04, + 0xd3, 0x02, 0xe0, 0x07, 0x35, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x60, 0xb8, 0x20, 0x00, 0x60, 0xf8, + 0x37, 0x10, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x2f, + 0x68, 0x09, 0x70, 0x08, 0x24, 0x00, 0x2c, 0x20, + 0xd3, 0x02, 0xe0, 0x1f, 0x34, 0x01, 0xe7, 0xfa, + 0x21, 0x00, 0x00, 0xe0, 0x4a, 0x2a, 0x68, 0x12, + 0x50, 0x11, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x28, + 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x21, 0x00, + 0x00, 0xe0, 0x4a, 0x26, 0x68, 0x12, 0x18, 0x80, + 0x60, 0x41, 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x24, + 0x68, 0x12, 0x50, 0x50, 0x20, 0x00, 0x00, 0xe1, + 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x21, 0x68, 0x12, + 0x52, 0x50, 0xe7, 0xdf, 0x20, 0x00, 0x21, 0x19, + 0x06, 0x89, 0x62, 0x48, 0x48, 0x1e, 0x21, 0x19, + 0x06, 0x89, 0x62, 0x48, 0x20, 0x00, 0x49, 0x1d, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x1b, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x60, 0xc8, 0x20, 0x00, 0x49, 0x17, + 0x68, 0x09, 0x61, 0x08, 0x20, 0x00, 0x49, 0x15, + 0x68, 0x09, 0x61, 0x48, 0x20, 0x00, 0x49, 0x13, + 0x68, 0x09, 0x61, 0x88, 0x20, 0x00, 0x49, 0x12, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0x10, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x00, 0x49, 0x0e, + 0x68, 0x09, 0x60, 0x88, 0x48, 0x0d, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x9e, 0x00, 0x00, 0xc0, + 0x9e, 0x00, 0x09, 0x80, 0x2e, 0x08, 0x5d, 0xbc, + 0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xd4, + 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4, + 0x00, 0x40, 0x00, 0x03, 0x2e, 0x08, 0x5e, 0x0c, + 0x2e, 0x08, 0x5e, 0x10, 0x6a, 0x00, 0x00, 0x10, + 0xb5, 0xff, 0xb0, 0x83, 0x98, 0x03, 0x06, 0x04, + 0x0e, 0x24, 0x99, 0x04, 0x04, 0x08, 0x0c, 0x00, + 0x90, 0x00, 0x9a, 0x05, 0x06, 0x10, 0x0e, 0x00, + 0x90, 0x01, 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x02, 0xb0, 0x81, 0x00, 0xe0, 0x49, 0xc1, + 0x68, 0x09, 0x18, 0x47, 0x00, 0xa0, 0x49, 0xc0, + 0x68, 0x09, 0x18, 0x45, 0x00, 0xe0, 0x1b, 0x00, + 0x00, 0x80, 0x49, 0xbe, 0x68, 0x09, 0x18, 0x46, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2d, 0x1f, 0xdb, 0x02, 0x20, 0xaf, 0xb0, 0x02, - 0xe7, 0xf6, 0x71, 0x8d, 0x68, 0x3b, 0x00, 0xd0, - 0x4e, 0x12, 0x68, 0x36, 0x19, 0x80, 0x60, 0x43, - 0x1c, 0x20, 0x71, 0xc8, 0x20, 0x00, 0x80, 0x88, - 0x20, 0x00, 0x60, 0xc8, 0x98, 0x00, 0x23, 0x01, - 0x43, 0x18, 0x75, 0x08, 0x98, 0x01, 0x74, 0x88, - 0x60, 0x8f, 0x88, 0xb8, 0x82, 0x08, 0x20, 0x00, - 0x74, 0xc8, 0x88, 0xb8, 0x61, 0x38, 0x20, 0x00, - 0x73, 0x38, 0x20, 0x00, 0x73, 0x78, 0x20, 0x00, - 0x73, 0xb8, 0x20, 0x00, 0x73, 0xf8, 0x20, 0x00, - 0xb0, 0x02, 0xe7, 0xd1, 0xb0, 0x02, 0xe7, 0xcf, - 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xdc, - 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, - 0x99, 0x01, 0x04, 0x0d, 0x0c, 0x2d, 0x00, 0xe0, - 0x1b, 0x00, 0x00, 0x80, 0x49, 0x25, 0x68, 0x09, - 0x18, 0x47, 0x2c, 0x20, 0xdb, 0x04, 0x20, 0xa2, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x4b, 0x21, 0x42, 0x9d, 0xd1, 0x27, 0x00, 0xe1, - 0x4b, 0x20, 0x68, 0x1b, 0x18, 0xc8, 0x00, 0xa1, - 0x4b, 0x1f, 0x68, 0x1b, 0x18, 0xca, 0x68, 0x11, - 0x4b, 0x1e, 0x40, 0x19, 0x60, 0x11, 0x68, 0x01, - 0x23, 0x40, 0x40, 0x19, 0xd0, 0x13, 0x68, 0x01, - 0x23, 0x40, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, - 0x21, 0x00, 0x4b, 0x19, 0x68, 0x1b, 0x70, 0x19, - 0x49, 0x18, 0x68, 0x0b, 0x08, 0x5b, 0x00, 0x5b, - 0x60, 0x0b, 0x49, 0x17, 0x68, 0x0e, 0x23, 0x01, - 0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b, 0x68, 0x01, - 0x4b, 0x14, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, - 0x75, 0x38, 0x20, 0x00, 0x80, 0x38, 0x20, 0x00, - 0x80, 0xb8, 0x68, 0xb8, 0x72, 0x44, 0x20, 0xa0, - 0x68, 0xb9, 0x72, 0x08, 0x20, 0x00, 0x60, 0xb8, - 0x79, 0xb9, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x11, - 0xf9, 0xc3, 0x20, 0x00, 0x71, 0xb8, 0x20, 0x00, - 0xe7, 0xba, 0xe7, 0xb9, 0x2e, 0x08, 0x5d, 0xcc, + 0x68, 0x28, 0x4b, 0xb9, 0x40, 0x18, 0x60, 0x28, + 0x68, 0x38, 0x4b, 0xb8, 0x40, 0x18, 0x60, 0x38, + 0x68, 0x38, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x17, + 0x68, 0x38, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x38, 0x48, 0xb3, 0x68, 0x01, 0x08, 0x49, + 0x00, 0x49, 0x60, 0x01, 0x48, 0xb1, 0x68, 0x01, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, + 0x98, 0x01, 0x4b, 0xaf, 0x42, 0x98, 0xd1, 0x03, + 0x20, 0x00, 0x49, 0xae, 0x68, 0x09, 0x60, 0x08, + 0x98, 0x01, 0x4b, 0xab, 0x42, 0x98, 0xd0, 0x73, + 0x68, 0x38, 0x23, 0x21, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x38, 0x68, 0x28, 0x23, 0x07, 0x03, 0x5b, + 0x40, 0x18, 0x60, 0x28, 0x98, 0x01, 0x4b, 0xa6, + 0x40, 0x18, 0x68, 0x29, 0x43, 0x08, 0x60, 0x28, + 0x20, 0x00, 0x75, 0x30, 0x98, 0x02, 0x07, 0x80, + 0x0f, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x88, 0x30, + 0x23, 0x10, 0x43, 0x18, 0x80, 0x30, 0xe0, 0x04, + 0x88, 0x30, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, + 0x80, 0x30, 0x98, 0x02, 0x23, 0x80, 0x40, 0x18, + 0x28, 0x80, 0xd1, 0x08, 0x68, 0x38, 0x23, 0x40, + 0x43, 0x18, 0x60, 0x38, 0x20, 0xff, 0x49, 0x97, + 0x68, 0x09, 0x70, 0x08, 0xe0, 0x04, 0x68, 0x38, + 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, 0x60, 0x38, + 0x98, 0x03, 0x28, 0x01, 0xd1, 0x36, 0x88, 0x30, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, 0x80, 0x30, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc1, 0x00, 0xe0, 0x4a, 0x8c, + 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, 0x20, 0x01, + 0x70, 0xb0, 0x68, 0x38, 0x23, 0x01, 0x03, 0x9b, + 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x4b, 0x87, + 0x43, 0x18, 0x60, 0x38, 0x48, 0x86, 0x70, 0x44, + 0x20, 0x00, 0x49, 0x86, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x02, 0xc0, 0x49, 0x84, 0x61, 0x48, + 0x49, 0x83, 0x61, 0x08, 0x20, 0x01, 0x49, 0x83, + 0x64, 0x48, 0x20, 0x00, 0x49, 0x81, 0x64, 0x48, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0x20, 0x00, 0x49, 0x7e, 0x68, 0x09, + 0x60, 0x08, 0xe0, 0x9a, 0x98, 0x03, 0x28, 0x02, + 0xd1, 0x30, 0x20, 0x33, 0x06, 0x40, 0xe0, 0x00, + 0xe0, 0x94, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc0, 0x00, 0xe1, 0x4a, 0x70, 0x68, 0x12, + 0x18, 0x89, 0x60, 0x48, 0x20, 0x02, 0x70, 0xb0, + 0x68, 0x38, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x4b, 0x6b, 0x43, 0x18, + 0x60, 0x38, 0x48, 0x6b, 0x70, 0x84, 0x20, 0x00, + 0x49, 0x6e, 0x60, 0x08, 0x00, 0xe0, 0x49, 0x5b, + 0x68, 0x09, 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x18, 0x00, 0xe1, 0x4a, 0x57, 0x68, 0x12, + 0x50, 0x50, 0x20, 0x4b, 0x49, 0x67, 0x60, 0x08, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x66, 0x98, 0x03, 0x28, 0x04, + 0xd1, 0x15, 0x20, 0x00, 0x00, 0xe1, 0x4a, 0x5a, + 0x68, 0x12, 0x18, 0x89, 0x60, 0x48, 0x98, 0x03, + 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x48, 0x56, + 0x70, 0x04, 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x18, 0x60, 0x28, 0xe0, 0x4d, 0x98, 0x03, + 0x23, 0x10, 0x40, 0x18, 0xd0, 0x0f, 0x21, 0x00, + 0x00, 0xe0, 0x4a, 0x4d, 0x68, 0x12, 0x18, 0x80, + 0x60, 0x41, 0x68, 0x38, 0x4b, 0x52, 0x43, 0x18, + 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, 0x37, 0x04, + 0x20, 0x0e, 0x60, 0x38, 0xe0, 0x39, 0x98, 0x03, + 0x28, 0x08, 0xd1, 0x23, 0x48, 0x4d, 0x68, 0x00, + 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x03, + 0x20, 0x4f, 0xb0, 0x04, 0xe6, 0xf8, 0xe0, 0x67, + 0x20, 0x01, 0x49, 0x48, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x48, 0x46, 0x68, 0x00, 0x30, 0x60, + 0x76, 0x04, 0x20, 0x01, 0x49, 0x43, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x49, 0x42, 0x00, 0xe0, + 0x4a, 0x37, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x12, 0x21, 0x00, 0x00, 0xe0, + 0x4a, 0x31, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, + 0x98, 0x03, 0x70, 0xb0, 0x68, 0x38, 0x23, 0x20, + 0x43, 0x18, 0x60, 0x38, 0x68, 0x38, 0x60, 0x38, + 0x68, 0x28, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x60, 0x28, 0xe0, 0x33, 0x98, 0x03, 0x23, 0x10, + 0x40, 0x18, 0xd0, 0x09, 0x1c, 0x20, 0xf0, 0x05, + 0xf8, 0x0f, 0x90, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x98, 0x00, 0xb0, 0x04, 0xe6, 0xbc, 0xe0, 0x1a, + 0x98, 0x03, 0x28, 0x01, 0xd1, 0x03, 0x20, 0xff, + 0x49, 0x21, 0x70, 0x48, 0xe0, 0x13, 0x98, 0x03, + 0x28, 0x02, 0xd1, 0x03, 0x20, 0xff, 0x49, 0x1e, + 0x70, 0x88, 0xe0, 0x0c, 0x98, 0x03, 0x28, 0x08, + 0xd1, 0x09, 0x20, 0x00, 0x49, 0x21, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0x49, 0x1f, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x7d, 0x30, + 0x07, 0xc0, 0x0f, 0xc0, 0x28, 0x01, 0xd1, 0x03, + 0x1c, 0x20, 0x49, 0x1c, 0xf0, 0x00, 0xf9, 0x16, + 0x20, 0x00, 0x70, 0xb0, 0x20, 0x00, 0xb0, 0x04, + 0xe6, 0x92, 0xb0, 0x01, 0xb0, 0x03, 0xe6, 0x8f, + 0xe6, 0x8e, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, + 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5d, 0xc4, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0xff, + 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5d, 0xd8, - 0x2e, 0x08, 0x5d, 0xd4, 0xff, 0xff, 0xdf, 0xff, - 0x2e, 0x08, 0x5d, 0xc8, 0x6a, 0x00, 0x00, 0x18, - 0x6c, 0x00, 0x00, 0x20, 0xff, 0xff, 0x3f, 0xde, - 0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, - 0x06, 0x28, 0x0e, 0x00, 0x06, 0x23, 0x0e, 0x1b, - 0x06, 0x39, 0x0e, 0x09, 0x9e, 0x03, 0x06, 0x36, - 0x16, 0x32, 0x28, 0x20, 0xda, 0x02, 0x4e, 0x08, - 0x68, 0x36, 0x60, 0x30, 0x4e, 0x07, 0x68, 0x36, - 0x60, 0x33, 0x4e, 0x07, 0x68, 0x36, 0x60, 0x31, - 0x4e, 0x06, 0x68, 0x36, 0x60, 0x32, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x5d, 0xf4, 0x2e, 0x08, 0x5d, 0xf8, - 0x2e, 0x08, 0x5d, 0xfc, 0x2e, 0x08, 0x5e, 0x00, - 0x1c, 0x01, 0x06, 0x08, 0x0e, 0x00, 0x28, 0x01, - 0xd1, 0x04, 0x22, 0x01, 0x4b, 0x04, 0x68, 0x1b, - 0x60, 0x1a, 0xe0, 0x03, 0x22, 0x02, 0x4b, 0x02, - 0x68, 0x1b, 0x60, 0x1a, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x3c, 0xb5, 0xf1, 0x98, 0x00, - 0x06, 0x04, 0x0e, 0x24, 0xb0, 0x81, 0x27, 0x00, - 0x26, 0x00, 0x4a, 0x55, 0x92, 0x00, 0x00, 0xe0, - 0x49, 0x54, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, - 0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0x9b, - 0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x00, 0xe0, 0x49, 0x4c, 0x68, 0x09, 0x58, 0x08, - 0x21, 0x20, 0x43, 0x01, 0x00, 0xe0, 0x4a, 0x49, - 0x68, 0x12, 0x50, 0x11, 0x21, 0x00, 0x48, 0x48, - 0xf0, 0x05, 0xfc, 0x3c, 0x48, 0x47, 0x68, 0x00, - 0x28, 0x00, 0xd1, 0x01, 0xe0, 0x08, 0xe0, 0x82, - 0x20, 0x02, 0xf0, 0x0c, 0xf8, 0x75, 0x1c, 0x38, - 0x37, 0x01, 0x4b, 0x43, 0x42, 0x98, 0xd3, 0xf1, - 0x4b, 0x41, 0x42, 0x9f, 0xd3, 0x00, 0x26, 0xa1, - 0x48, 0x40, 0x68, 0x01, 0x4b, 0x40, 0x40, 0x19, - 0x60, 0x01, 0x20, 0x00, 0x00, 0xe1, 0x1b, 0x09, - 0x00, 0x89, 0x4a, 0x3e, 0x68, 0x12, 0x18, 0x89, - 0x70, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x3c, - 0x67, 0x48, 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x20, - 0x23, 0x00, 0x22, 0x00, 0x49, 0x39, 0xf7, 0xff, - 0xfc, 0x69, 0xb0, 0x01, 0x27, 0x00, 0x25, 0x00, - 0x2d, 0x04, 0xdb, 0x02, 0xe0, 0x1e, 0x35, 0x01, - 0xe7, 0xfa, 0x00, 0xa9, 0x22, 0x0f, 0x1c, 0x10, - 0x40, 0x88, 0x01, 0x29, 0x9a, 0x00, 0x18, 0x89, - 0x68, 0x49, 0x42, 0xa1, 0xd1, 0x11, 0x21, 0x33, - 0x06, 0x49, 0x6b, 0xc9, 0x40, 0x01, 0xd0, 0x01, - 0x37, 0x01, 0xe0, 0x00, 0xe0, 0x02, 0x4b, 0x26, - 0x42, 0x9f, 0xd3, 0xf4, 0x4b, 0x24, 0x42, 0x9f, - 0xd3, 0x02, 0x26, 0xa1, 0xe0, 0x02, 0xe0, 0x3a, - 0x27, 0x00, 0xe7, 0xe0, 0x48, 0x26, 0x68, 0x01, - 0x23, 0xff, 0x33, 0x01, 0x43, 0x19, 0x60, 0x01, - 0x48, 0x21, 0x6d, 0x80, 0x49, 0x20, 0x65, 0x88, - 0x48, 0x1f, 0x6b, 0xc0, 0x23, 0x01, 0x07, 0x9b, - 0x40, 0x18, 0xd0, 0x00, 0xe7, 0xf8, 0x20, 0x33, - 0x06, 0x40, 0x6d, 0x40, 0x21, 0x33, 0x06, 0x49, - 0x66, 0x48, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, - 0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x20, 0x03, - 0x02, 0x00, 0x49, 0x15, 0x67, 0x48, 0x48, 0x11, - 0x68, 0x01, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x19, - 0x60, 0x01, 0x20, 0x00, 0x49, 0x13, 0x65, 0x88, - 0x20, 0x00, 0x49, 0x12, 0x65, 0xc8, 0x20, 0x00, - 0x49, 0x10, 0x66, 0x08, 0x21, 0x00, 0x20, 0xff, - 0xf0, 0x05, 0xfb, 0xb8, 0x1c, 0x30, 0xb0, 0x01, - 0xe7, 0x66, 0xb0, 0x01, 0xe7, 0x64, 0xe7, 0x63, - 0x9e, 0x00, 0x00, 0xc0, 0x2e, 0x08, 0x5d, 0xd8, - 0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, - 0x00, 0x1e, 0x84, 0x80, 0x66, 0x00, 0x00, 0x4c, - 0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0x5d, 0xcc, - 0x66, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, 0xff, - 0x66, 0x00, 0x00, 0xe0, 0xcc, 0x00, 0x00, 0x00, - 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, - 0xb0, 0x81, 0x25, 0x00, 0x26, 0x00, 0x4a, 0x2e, - 0x92, 0x00, 0x00, 0xf8, 0x49, 0x2d, 0x68, 0x09, + 0xff, 0xff, 0x1f, 0xff, 0x2e, 0x08, 0x5e, 0x2c, + 0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x20, 0x01, + 0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xfc, + 0xcc, 0x00, 0x0f, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x5e, 0x44, + 0x00, 0x00, 0x20, 0xa0, 0x2e, 0x08, 0x7c, 0x44, + 0x66, 0x00, 0x01, 0xf0, 0xff, 0xff, 0x00, 0x00, + 0xb5, 0xff, 0x98, 0x00, 0x06, 0x01, 0x0e, 0x09, + 0x98, 0x01, 0x06, 0x02, 0x0e, 0x12, 0x98, 0x02, + 0x04, 0x07, 0x0c, 0x3f, 0x9b, 0x03, 0x04, 0x1c, + 0x0c, 0x24, 0x29, 0x20, 0xdb, 0x04, 0x20, 0xa2, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2a, 0x02, 0xd1, 0x0a, 0x00, 0xc8, 0x4b, 0x1f, + 0x68, 0x1b, 0x58, 0x18, 0x4b, 0x1e, 0x40, 0x18, + 0x00, 0xcb, 0x4d, 0x1c, 0x68, 0x2d, 0x50, 0xe8, + 0xe0, 0x30, 0x2a, 0x01, 0xd1, 0x0b, 0x00, 0xc8, + 0x4b, 0x18, 0x68, 0x1b, 0x58, 0x18, 0x43, 0x27, + 0x1c, 0x3b, 0x43, 0x18, 0x00, 0xcb, 0x4d, 0x15, + 0x68, 0x2d, 0x50, 0xe8, 0xe0, 0x22, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x1e, 0x1c, 0x43, + 0x06, 0x1b, 0x16, 0x18, 0xe7, 0xf8, 0x2a, 0x03, + 0xd1, 0x0b, 0x00, 0xc3, 0x4d, 0x0d, 0x68, 0x2d, + 0x58, 0xeb, 0x1c, 0x3d, 0x43, 0x25, 0x43, 0x1d, + 0x00, 0xc3, 0x4e, 0x0a, 0x68, 0x36, 0x50, 0xf5, + 0xe0, 0x0b, 0x2a, 0x04, 0xd1, 0x09, 0x00, 0xc3, + 0x4d, 0x06, 0x68, 0x2d, 0x58, 0xed, 0x4b, 0x06, + 0x40, 0x2b, 0x00, 0xc5, 0x4e, 0x03, 0x68, 0x36, + 0x51, 0x73, 0xe7, 0xe0, 0x20, 0x00, 0xe7, 0xbb, + 0xe7, 0xba, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, + 0xff, 0xff, 0xe1, 0xff, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x38, 0x0e, 0x00, 0x06, 0x11, + 0x0e, 0x09, 0x4c, 0x14, 0x68, 0x25, 0x4b, 0x14, + 0x40, 0x2b, 0x60, 0x23, 0x28, 0x01, 0xd1, 0x06, + 0x4c, 0x10, 0x68, 0x25, 0x23, 0x01, 0x04, 0x1b, + 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, 0x28, 0x00, + 0xd1, 0x05, 0x4c, 0x0c, 0x68, 0x25, 0x23, 0x01, + 0x05, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0x29, 0x01, + 0xd1, 0x06, 0x4c, 0x08, 0x68, 0x25, 0x23, 0x01, + 0x03, 0x9b, 0x43, 0x2b, 0x60, 0x23, 0xe0, 0x07, + 0x29, 0x02, 0xd1, 0x05, 0x4c, 0x03, 0x68, 0x25, + 0x23, 0x01, 0x03, 0xdb, 0x43, 0x2b, 0x60, 0x23, + 0xbc, 0xb0, 0x47, 0x70, 0x64, 0x00, 0x00, 0x24, + 0xff, 0xbe, 0x3f, 0xff, 0xb5, 0xff, 0x1c, 0x1f, + 0x9c, 0x09, 0xb0, 0x82, 0x98, 0x02, 0x04, 0x00, + 0x0c, 0x00, 0x90, 0x00, 0x99, 0x03, 0x06, 0x0a, + 0x0e, 0x12, 0x98, 0x04, 0x06, 0x05, 0x0e, 0x2d, + 0x98, 0x0c, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x01, + 0x00, 0xd0, 0x1a, 0x80, 0x00, 0x80, 0x4b, 0x1b, + 0x68, 0x1b, 0x18, 0xc1, 0x2a, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x02, + 0x20, 0xaf, 0xb0, 0x02, 0xe7, 0xf6, 0x71, 0x8d, + 0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x12, 0x68, 0x36, + 0x19, 0x80, 0x60, 0x43, 0x1c, 0x20, 0x71, 0xc8, + 0x20, 0x00, 0x80, 0x88, 0x20, 0x00, 0x60, 0xc8, + 0x98, 0x00, 0x23, 0x01, 0x43, 0x18, 0x75, 0x08, + 0x98, 0x01, 0x74, 0x88, 0x60, 0x8f, 0x88, 0xb8, + 0x82, 0x08, 0x20, 0x00, 0x74, 0xc8, 0x88, 0xb8, + 0x61, 0x38, 0x20, 0x00, 0x73, 0x38, 0x20, 0x00, + 0x73, 0x78, 0x20, 0x00, 0x73, 0xb8, 0x20, 0x00, + 0x73, 0xf8, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd1, + 0xb0, 0x02, 0xe7, 0xcf, 0x2e, 0x08, 0x5d, 0xc4, + 0x2e, 0x08, 0x5d, 0xd4, 0xb5, 0xf3, 0x98, 0x00, + 0x06, 0x04, 0x0e, 0x24, 0x99, 0x01, 0x04, 0x0d, + 0x0c, 0x2d, 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, + 0x49, 0x25, 0x68, 0x09, 0x18, 0x47, 0x2c, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x4b, 0x21, 0x42, 0x9d, + 0xd1, 0x27, 0x00, 0xe1, 0x4b, 0x20, 0x68, 0x1b, + 0x18, 0xc8, 0x00, 0xa1, 0x4b, 0x1f, 0x68, 0x1b, + 0x18, 0xca, 0x68, 0x11, 0x4b, 0x1e, 0x40, 0x19, + 0x60, 0x11, 0x68, 0x01, 0x23, 0x40, 0x40, 0x19, + 0xd0, 0x13, 0x68, 0x01, 0x23, 0x40, 0x43, 0xdb, + 0x40, 0x19, 0x60, 0x01, 0x21, 0x00, 0x4b, 0x19, + 0x68, 0x1b, 0x70, 0x19, 0x49, 0x18, 0x68, 0x0b, + 0x08, 0x5b, 0x00, 0x5b, 0x60, 0x0b, 0x49, 0x17, + 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, + 0x60, 0x0b, 0x68, 0x01, 0x4b, 0x14, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x00, 0x75, 0x38, 0x20, 0x00, + 0x80, 0x38, 0x20, 0x00, 0x80, 0xb8, 0x68, 0xb8, + 0x72, 0x44, 0x20, 0xa0, 0x68, 0xb9, 0x72, 0x08, + 0x20, 0x00, 0x60, 0xb8, 0x79, 0xb9, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x11, 0xf9, 0xe5, 0x20, 0x00, + 0x71, 0xb8, 0x20, 0x00, 0xe7, 0xba, 0xe7, 0xb9, + 0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x5d, 0xd0, 0x2e, 0x08, 0x5d, 0xcc, + 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5d, 0xc0, + 0x6a, 0x00, 0x00, 0x18, 0x6c, 0x00, 0x00, 0x20, + 0xff, 0xff, 0x3f, 0xde, 0xb5, 0xff, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x28, 0x0e, 0x00, + 0x06, 0x23, 0x0e, 0x1b, 0x06, 0x39, 0x0e, 0x09, + 0x9e, 0x03, 0x06, 0x36, 0x16, 0x32, 0x28, 0x20, + 0xda, 0x02, 0x4e, 0x08, 0x68, 0x36, 0x60, 0x30, + 0x4e, 0x07, 0x68, 0x36, 0x60, 0x33, 0x4e, 0x07, + 0x68, 0x36, 0x60, 0x31, 0x4e, 0x06, 0x68, 0x36, + 0x60, 0x32, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xec, + 0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4, + 0x2e, 0x08, 0x5d, 0xf8, 0x1c, 0x01, 0x06, 0x08, + 0x0e, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x22, 0x01, + 0x4b, 0x04, 0x68, 0x1b, 0x60, 0x1a, 0xe0, 0x03, + 0x22, 0x02, 0x4b, 0x02, 0x68, 0x1b, 0x60, 0x1a, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x34, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, + 0xb0, 0x81, 0x27, 0x00, 0x26, 0x00, 0x4a, 0x55, + 0x92, 0x00, 0x00, 0xe0, 0x49, 0x54, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, 0x03, 0x9b, 0x40, 0x18, - 0x23, 0x01, 0x03, 0xdb, 0x42, 0x98, 0xd0, 0x05, + 0x23, 0x01, 0x03, 0x9b, 0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x22, 0x00, 0xb4, 0x04, - 0x1c, 0x38, 0x23, 0x00, 0x22, 0x00, 0x49, 0x24, - 0xf7, 0xff, 0xfb, 0xd0, 0xb0, 0x01, 0x24, 0x00, - 0x2c, 0x04, 0xdb, 0x02, 0xe0, 0x1e, 0x34, 0x01, - 0xe7, 0xfa, 0x00, 0xa1, 0x22, 0x0f, 0x1c, 0x10, - 0x40, 0x88, 0x01, 0x21, 0x9a, 0x00, 0x18, 0x89, - 0x68, 0x49, 0x42, 0xb9, 0xd1, 0x11, 0x21, 0x33, - 0x06, 0x49, 0x6b, 0xc9, 0x40, 0x01, 0xd0, 0x01, - 0x35, 0x01, 0xe0, 0x00, 0xe0, 0x02, 0x4b, 0x17, - 0x42, 0x9d, 0xd3, 0xf4, 0x4b, 0x15, 0x42, 0x9d, - 0xd9, 0x02, 0x26, 0xa1, 0xe0, 0x02, 0xe0, 0x1d, - 0x25, 0x00, 0xe7, 0xe0, 0x20, 0x04, 0xf0, 0x02, - 0xff, 0xb7, 0x20, 0x01, 0x21, 0x33, 0x06, 0x49, - 0x66, 0xc8, 0x21, 0x00, 0x00, 0xf8, 0x4a, 0x0b, - 0x68, 0x12, 0x50, 0x11, 0x21, 0x00, 0x00, 0xf8, - 0x4a, 0x08, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, - 0x21, 0x00, 0x00, 0xb8, 0x4a, 0x08, 0x68, 0x12, - 0x50, 0x11, 0x1c, 0x30, 0xb0, 0x01, 0xe7, 0xb5, - 0xb0, 0x01, 0xe7, 0xb3, 0xe7, 0xb2, 0x00, 0x00, - 0x9e, 0x00, 0x00, 0xc0, 0x2e, 0x08, 0x5d, 0xd8, - 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0xd4, 0xc0, - 0x2e, 0x08, 0x5d, 0xd4, 0xb5, 0xff, 0x99, 0x01, - 0x06, 0x0f, 0x0e, 0x3f, 0x9a, 0x02, 0x06, 0x15, - 0x0e, 0x2d, 0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, - 0x2d, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2f, 0x20, - 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x2e, 0x80, - 0xd0, 0x13, 0xf0, 0x11, 0xf8, 0x67, 0x1c, 0x04, - 0x1c, 0x39, 0x22, 0x80, 0x20, 0x01, 0xf0, 0x00, - 0xfb, 0x6d, 0x2c, 0x80, 0xd0, 0x01, 0xf0, 0x11, - 0xf8, 0x93, 0x98, 0x00, 0x21, 0x80, 0x68, 0x49, - 0x60, 0x08, 0x48, 0x09, 0x68, 0x00, 0x70, 0x05, - 0xe0, 0x0b, 0xf0, 0x11, 0xf8, 0x53, 0x1c, 0x04, - 0x1c, 0x39, 0x22, 0x80, 0x20, 0x02, 0xf0, 0x00, - 0xfb, 0x59, 0x2c, 0x80, 0xd0, 0x01, 0xf0, 0x11, - 0xf8, 0x7f, 0x20, 0x00, 0xe7, 0xd3, 0xe7, 0xd2, - 0x2e, 0x08, 0x5e, 0x24, 0xb5, 0xff, 0x99, 0x01, - 0x06, 0x0e, 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x17, - 0x0e, 0x3f, 0x9b, 0x03, 0x06, 0x1c, 0x0e, 0x24, - 0xb0, 0x82, 0x20, 0x80, 0x40, 0x38, 0x90, 0x00, - 0x06, 0x7f, 0x0e, 0x7f, 0x2e, 0x1f, 0xdb, 0x05, - 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, 0xdb, 0x02, - 0x20, 0xa2, 0xb0, 0x02, 0xe7, 0xf6, 0x2f, 0x04, - 0xd1, 0x00, 0x27, 0x00, 0x00, 0xe0, 0x1b, 0x00, - 0x00, 0x80, 0x49, 0x17, 0x68, 0x09, 0x18, 0x40, - 0x90, 0x01, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x0d, - 0xf0, 0x11, 0xf8, 0x18, 0x1c, 0x05, 0x1c, 0x21, - 0x22, 0x01, 0x02, 0x92, 0x20, 0x02, 0xf0, 0x00, - 0xfb, 0x1d, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x11, - 0xf8, 0x43, 0xe0, 0x13, 0xf0, 0x11, 0xf8, 0x0a, - 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, - 0x20, 0x01, 0xf0, 0x00, 0xfb, 0x0f, 0x2d, 0x80, - 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x35, 0x98, 0x02, - 0x21, 0x80, 0x68, 0x89, 0x60, 0x08, 0x20, 0x80, - 0x6a, 0x00, 0x55, 0xc6, 0x20, 0x00, 0xb0, 0x02, - 0xe7, 0xc4, 0xb0, 0x02, 0xe7, 0xc2, 0x00, 0x00, - 0x2e, 0x08, 0x5d, 0xcc, 0xb5, 0xff, 0xb0, 0x82, - 0x99, 0x03, 0x04, 0x0d, 0x0c, 0x2d, 0x9a, 0x04, - 0x06, 0x10, 0x0e, 0x00, 0x90, 0x00, 0x9b, 0x05, - 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, 0x98, 0x00, - 0x28, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xe0, 0x49, 0x4c, + 0x68, 0x09, 0x58, 0x08, 0x21, 0x20, 0x43, 0x01, + 0x00, 0xe0, 0x4a, 0x49, 0x68, 0x12, 0x50, 0x11, + 0x21, 0x00, 0x48, 0x48, 0xf0, 0x05, 0xfc, 0x3c, + 0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x01, + 0xe0, 0x08, 0xe0, 0x82, 0x20, 0x02, 0xf0, 0x0c, + 0xf8, 0x75, 0x1c, 0x38, 0x37, 0x01, 0x4b, 0x43, + 0x42, 0x98, 0xd3, 0xf1, 0x4b, 0x41, 0x42, 0x9f, + 0xd3, 0x00, 0x26, 0xa1, 0x48, 0x40, 0x68, 0x01, + 0x4b, 0x40, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, + 0x00, 0xe1, 0x1b, 0x09, 0x00, 0x89, 0x4a, 0x3e, + 0x68, 0x12, 0x18, 0x89, 0x70, 0x88, 0x20, 0x00, + 0x43, 0xc0, 0x49, 0x3c, 0x67, 0x48, 0x22, 0x00, + 0xb4, 0x04, 0x1c, 0x20, 0x23, 0x00, 0x22, 0x00, + 0x49, 0x39, 0xf7, 0xff, 0xfc, 0x69, 0xb0, 0x01, + 0x27, 0x00, 0x25, 0x00, 0x2d, 0x04, 0xdb, 0x02, + 0xe0, 0x1e, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa9, + 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x29, + 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xa1, + 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, + 0x40, 0x01, 0xd0, 0x01, 0x37, 0x01, 0xe0, 0x00, + 0xe0, 0x02, 0x4b, 0x26, 0x42, 0x9f, 0xd3, 0xf4, + 0x4b, 0x24, 0x42, 0x9f, 0xd3, 0x02, 0x26, 0xa1, + 0xe0, 0x02, 0xe0, 0x3a, 0x27, 0x00, 0xe7, 0xe0, + 0x48, 0x26, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x21, 0x6d, 0x80, + 0x49, 0x20, 0x65, 0x88, 0x48, 0x1f, 0x6b, 0xc0, + 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, + 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, + 0x66, 0x88, 0x20, 0x03, 0x02, 0x00, 0x49, 0x15, + 0x67, 0x48, 0x48, 0x11, 0x68, 0x01, 0x23, 0x01, + 0x02, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, + 0x49, 0x13, 0x65, 0x88, 0x20, 0x00, 0x49, 0x12, + 0x65, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x66, 0x08, + 0x21, 0x00, 0x20, 0xff, 0xf0, 0x05, 0xfb, 0xb8, + 0x1c, 0x30, 0xb0, 0x01, 0xe7, 0x66, 0xb0, 0x01, + 0xe7, 0x64, 0xe7, 0x63, 0x9e, 0x00, 0x00, 0xc0, + 0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0x80, 0x0f, + 0xcc, 0x00, 0x05, 0x00, 0x00, 0x1e, 0x84, 0x80, + 0x66, 0x00, 0x00, 0x4c, 0xff, 0xff, 0xfd, 0xff, + 0x2e, 0x08, 0x5d, 0xc4, 0x66, 0x00, 0x00, 0x80, + 0x00, 0x00, 0xff, 0xff, 0x66, 0x00, 0x00, 0xe0, + 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf1, 0x98, 0x00, + 0x06, 0x07, 0x0e, 0x3f, 0xb0, 0x81, 0x25, 0x00, + 0x26, 0x00, 0x4a, 0x2e, 0x92, 0x00, 0x00, 0xf8, + 0x49, 0x2d, 0x68, 0x09, 0x58, 0x08, 0x23, 0x03, + 0x03, 0x9b, 0x40, 0x18, 0x23, 0x01, 0x03, 0xdb, + 0x42, 0x98, 0xd0, 0x05, 0x20, 0xa0, 0xb0, 0x01, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x38, 0x23, 0x00, + 0x22, 0x00, 0x49, 0x24, 0xf7, 0xff, 0xfb, 0xd0, + 0xb0, 0x01, 0x24, 0x00, 0x2c, 0x04, 0xdb, 0x02, + 0xe0, 0x1e, 0x34, 0x01, 0xe7, 0xfa, 0x00, 0xa1, + 0x22, 0x0f, 0x1c, 0x10, 0x40, 0x88, 0x01, 0x21, + 0x9a, 0x00, 0x18, 0x89, 0x68, 0x49, 0x42, 0xb9, + 0xd1, 0x11, 0x21, 0x33, 0x06, 0x49, 0x6b, 0xc9, + 0x40, 0x01, 0xd0, 0x01, 0x35, 0x01, 0xe0, 0x00, + 0xe0, 0x02, 0x4b, 0x17, 0x42, 0x9d, 0xd3, 0xf4, + 0x4b, 0x15, 0x42, 0x9d, 0xd9, 0x02, 0x26, 0xa1, + 0xe0, 0x02, 0xe0, 0x1d, 0x25, 0x00, 0xe7, 0xe0, + 0x20, 0x04, 0xf0, 0x02, 0xff, 0xb7, 0x20, 0x01, + 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, 0x21, 0x00, + 0x00, 0xf8, 0x4a, 0x0b, 0x68, 0x12, 0x50, 0x11, + 0x21, 0x00, 0x00, 0xf8, 0x4a, 0x08, 0x68, 0x12, + 0x18, 0x80, 0x60, 0x41, 0x21, 0x00, 0x00, 0xb8, + 0x4a, 0x08, 0x68, 0x12, 0x50, 0x11, 0x1c, 0x30, + 0xb0, 0x01, 0xe7, 0xb5, 0xb0, 0x01, 0xe7, 0xb3, + 0xe7, 0xb2, 0x00, 0x00, 0x9e, 0x00, 0x00, 0xc0, + 0x2e, 0x08, 0x5d, 0xd0, 0x00, 0x00, 0xff, 0xff, + 0x00, 0x01, 0xd4, 0xc0, 0x2e, 0x08, 0x5d, 0xcc, + 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, + 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03, + 0x06, 0x1e, 0x0e, 0x36, 0x2d, 0x1f, 0xdb, 0x04, + 0x20, 0xaf, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2f, 0x20, 0xdb, 0x01, 0x20, 0xa2, + 0xe7, 0xf7, 0x2e, 0x80, 0xd0, 0x13, 0xf0, 0x11, + 0xf8, 0x89, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, + 0x20, 0x01, 0xf0, 0x00, 0xfb, 0x6d, 0x2c, 0x80, + 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xb5, 0x98, 0x00, + 0x21, 0x80, 0x68, 0x49, 0x60, 0x08, 0x48, 0x09, + 0x68, 0x00, 0x70, 0x05, 0xe0, 0x0b, 0xf0, 0x11, + 0xf8, 0x75, 0x1c, 0x04, 0x1c, 0x39, 0x22, 0x80, + 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x59, 0x2c, 0x80, + 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0xa1, 0x20, 0x00, + 0xe7, 0xd3, 0xe7, 0xd2, 0x2e, 0x08, 0x5e, 0x1c, + 0xb5, 0xff, 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, + 0x9a, 0x02, 0x06, 0x17, 0x0e, 0x3f, 0x9b, 0x03, + 0x06, 0x1c, 0x0e, 0x24, 0xb0, 0x82, 0x20, 0x80, + 0x40, 0x38, 0x90, 0x00, 0x06, 0x7f, 0x0e, 0x7f, + 0x2e, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x2f, - 0x98, 0x00, 0x49, 0x2c, 0x68, 0x09, 0x73, 0x08, - 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x26, - 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, - 0x20, 0x01, 0x40, 0xb8, 0x99, 0x02, 0x40, 0x08, - 0xd0, 0x1c, 0x24, 0x00, 0x20, 0x40, 0x40, 0x28, - 0xd0, 0x04, 0x04, 0x20, 0x0c, 0x00, 0x24, 0x01, - 0x03, 0xa4, 0x43, 0x04, 0x20, 0x80, 0x40, 0x28, - 0xd0, 0x04, 0x04, 0x20, 0x0c, 0x00, 0x24, 0x01, - 0x03, 0xe4, 0x43, 0x04, 0xf0, 0x10, 0xff, 0xb2, - 0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x01, - 0xf0, 0x00, 0xfa, 0xb8, 0x2e, 0x80, 0xd0, 0x01, - 0xf0, 0x10, 0xff, 0xde, 0xe7, 0xd8, 0xe0, 0x24, - 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x20, - 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, - 0x20, 0x01, 0x40, 0xb8, 0x99, 0x02, 0x40, 0x08, - 0xd0, 0x16, 0x24, 0x00, 0x20, 0x40, 0x40, 0x28, - 0xd0, 0x01, 0x4b, 0x0d, 0x40, 0x1c, 0x20, 0x80, - 0x40, 0x28, 0xd0, 0x01, 0x04, 0x64, 0x0c, 0x64, - 0xf0, 0x10, 0xff, 0x8c, 0x1c, 0x06, 0x1c, 0x22, - 0x1c, 0x39, 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x92, - 0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x10, 0xff, 0xb8, - 0xe7, 0xde, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x9f, - 0xb0, 0x02, 0xe7, 0x9d, 0x2e, 0x08, 0x5e, 0x18, - 0x00, 0x00, 0xbf, 0xff, 0xb5, 0x80, 0x1c, 0x07, - 0x48, 0x07, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x19, - 0xfe, 0x51, 0x60, 0x38, 0x48, 0x04, 0x68, 0x00, - 0x1d, 0x01, 0x20, 0x00, 0xf0, 0x19, 0xfe, 0x4a, - 0x60, 0x78, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x5e, 0x18, 0xb5, 0xf7, 0x1c, 0x07, - 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x9a, 0x02, - 0x06, 0x14, 0x0e, 0x24, 0x2e, 0x1f, 0xdb, 0x04, - 0x20, 0xaf, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x2c, 0x20, 0xdb, 0x01, 0x20, 0xa2, - 0xe7, 0xf7, 0x20, 0x80, 0x40, 0x20, 0xd0, 0x0d, - 0xf0, 0x10, 0xff, 0x4c, 0x1c, 0x05, 0x1c, 0x21, - 0x22, 0x01, 0x02, 0xd2, 0x20, 0x02, 0xf0, 0x00, - 0xfa, 0x51, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, - 0xff, 0x77, 0xe0, 0x16, 0x48, 0x0c, 0x68, 0x00, - 0x60, 0x07, 0x48, 0x0b, 0x68, 0x00, 0x71, 0x46, - 0x20, 0xff, 0x49, 0x09, 0x68, 0x09, 0x71, 0x08, - 0xf0, 0x10, 0xff, 0x34, 0x1c, 0x05, 0x1c, 0x21, - 0x22, 0x01, 0x02, 0xd2, 0x20, 0x01, 0xf0, 0x00, - 0xfa, 0x39, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, - 0xff, 0x5f, 0x20, 0x00, 0xe7, 0xcd, 0xe7, 0xcc, - 0x2e, 0x08, 0x5e, 0x1c, 0xb5, 0xf7, 0x1c, 0x07, - 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x9a, 0x02, - 0x06, 0x14, 0x0e, 0x24, 0x2e, 0x1f, 0xdb, 0x04, - 0x20, 0xaf, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x2c, 0x20, 0xdb, 0x01, 0x20, 0xa2, - 0xe7, 0xf7, 0x20, 0x80, 0x40, 0x20, 0xd0, 0x0d, - 0xf0, 0x10, 0xff, 0x0c, 0x1c, 0x05, 0x1c, 0x21, - 0x22, 0x01, 0x03, 0x12, 0x20, 0x02, 0xf0, 0x00, - 0xfa, 0x11, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, - 0xff, 0x37, 0xe0, 0x16, 0x48, 0x0c, 0x68, 0x00, - 0x60, 0x07, 0x48, 0x0b, 0x68, 0x00, 0x71, 0x46, - 0x20, 0xff, 0x49, 0x09, 0x68, 0x09, 0x71, 0x08, - 0xf0, 0x10, 0xfe, 0xf4, 0x1c, 0x05, 0x1c, 0x21, - 0x22, 0x01, 0x03, 0x12, 0x20, 0x01, 0xf0, 0x00, - 0xf9, 0xf9, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x10, - 0xff, 0x1f, 0x20, 0x00, 0xe7, 0xcd, 0xe7, 0xcc, - 0x2e, 0x08, 0x5e, 0x20, 0xb5, 0xff, 0xb0, 0x81, - 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, - 0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0x9a, 0x03, - 0x06, 0x16, 0x0e, 0x36, 0x9f, 0x04, 0x1c, 0x29, - 0x98, 0x00, 0xf0, 0x00, 0xf8, 0x91, 0x28, 0x00, - 0xd0, 0x05, 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x79, 0x38, - 0x79, 0x79, 0x18, 0x40, 0x79, 0xb9, 0x18, 0x40, - 0x06, 0x04, 0x0e, 0x24, 0x79, 0xb8, 0x02, 0x00, - 0x43, 0x04, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, - 0x49, 0x15, 0x68, 0x09, 0x50, 0x0c, 0x9b, 0x04, - 0x88, 0x99, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, - 0x4a, 0x11, 0x68, 0x12, 0x18, 0x80, 0x60, 0x41, - 0x78, 0x78, 0x78, 0x39, 0x18, 0x40, 0x78, 0xb9, - 0x18, 0x40, 0x06, 0x04, 0x0e, 0x24, 0x78, 0xb8, - 0x02, 0x00, 0x43, 0x04, 0x00, 0x68, 0x19, 0x80, - 0x01, 0x00, 0x49, 0x09, 0x68, 0x09, 0x18, 0x40, - 0x60, 0x84, 0x9b, 0x04, 0x88, 0x19, 0x00, 0x68, - 0x19, 0x80, 0x01, 0x00, 0x4a, 0x04, 0x68, 0x12, - 0x18, 0x80, 0x60, 0xc1, 0x20, 0x00, 0xb0, 0x01, - 0xe7, 0xc5, 0xb0, 0x01, 0xe7, 0xc3, 0x00, 0x00, - 0x2e, 0x08, 0x5d, 0xd0, 0xb5, 0xff, 0x1c, 0x07, - 0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x01, 0x06, 0x0c, - 0x0e, 0x24, 0x9a, 0x02, 0x06, 0x16, 0x0e, 0x36, - 0x1c, 0x21, 0x1c, 0x28, 0xf0, 0x00, 0xf8, 0x40, - 0x28, 0x00, 0xd0, 0x04, 0x20, 0xa2, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x9a, 0x03, - 0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x02, - 0xe7, 0xf5, 0xe7, 0xf4, 0xb4, 0xf0, 0x1c, 0x04, - 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x21, 0x0e, 0x09, - 0x06, 0x3a, 0x0e, 0x12, 0x29, 0x10, 0xdb, 0x02, - 0x20, 0xa2, 0xbc, 0xf0, 0x47, 0x70, 0x88, 0xdd, - 0x00, 0x48, 0x18, 0x80, 0x01, 0x00, 0x4e, 0x0f, - 0x68, 0x36, 0x50, 0x35, 0x88, 0x98, 0x00, 0x4d, - 0x18, 0xad, 0x01, 0x2d, 0x4e, 0x0b, 0x68, 0x36, - 0x19, 0xad, 0x60, 0x68, 0x88, 0x58, 0x00, 0x4d, - 0x18, 0xad, 0x01, 0x2d, 0x4e, 0x07, 0x68, 0x36, - 0x19, 0xad, 0x60, 0xa8, 0x88, 0x18, 0x00, 0x4d, - 0x18, 0xad, 0x01, 0x2d, 0x4e, 0x03, 0x68, 0x36, - 0x19, 0xad, 0x60, 0xe8, 0x20, 0x00, 0xe7, 0xdc, - 0xe7, 0xdb, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xd0, - 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, - 0x0e, 0x09, 0x06, 0x15, 0x0e, 0x2d, 0xb0, 0x81, - 0x29, 0x20, 0xdb, 0x03, 0x20, 0xa2, 0xb0, 0x01, - 0xbc, 0xb0, 0x47, 0x70, 0x2d, 0x10, 0xdb, 0x02, - 0x20, 0xa2, 0xb0, 0x01, 0xe7, 0xf8, 0x00, 0xc8, - 0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc4, 0x68, 0x20, - 0x90, 0x00, 0x98, 0x00, 0x4b, 0x08, 0x40, 0x18, - 0x90, 0x00, 0x00, 0x68, 0x23, 0x1e, 0x40, 0x18, - 0x9b, 0x00, 0x43, 0x18, 0x90, 0x00, 0x98, 0x00, - 0x60, 0x20, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xe3, - 0xb0, 0x01, 0xe7, 0xe1, 0x2e, 0x08, 0x5d, 0xd8, - 0xff, 0xff, 0xdf, 0xe1, 0x20, 0xff, 0x49, 0x02, - 0x68, 0x09, 0x70, 0x08, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x34, 0xb4, 0xb0, 0x1c, 0x07, - 0x1c, 0x0a, 0xb0, 0x83, 0x20, 0x00, 0x43, 0xc0, - 0x23, 0x19, 0x06, 0x9b, 0x67, 0x58, 0x08, 0xb9, - 0x00, 0x89, 0x1a, 0x78, 0x90, 0x02, 0x98, 0x02, - 0x18, 0x10, 0x07, 0x80, 0x0f, 0x80, 0x90, 0x01, - 0x98, 0x02, 0x18, 0x10, 0x08, 0x80, 0x90, 0x00, - 0x9b, 0x02, 0x20, 0x03, 0x1a, 0xc0, 0x23, 0x19, - 0x06, 0x9b, 0x67, 0xd8, 0x24, 0x00, 0x98, 0x00, - 0x42, 0x84, 0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, - 0xe7, 0xf9, 0xc9, 0x08, 0x20, 0x19, 0x06, 0x80, - 0x67, 0x03, 0xe7, 0xf8, 0x98, 0x01, 0x28, 0x00, - 0xd0, 0x0b, 0x9b, 0x01, 0x00, 0xd8, 0x25, 0x00, - 0x43, 0xed, 0x40, 0xc5, 0x1c, 0x2b, 0x43, 0xdb, - 0x68, 0x0d, 0x40, 0x2b, 0x25, 0x19, 0x06, 0xad, - 0x67, 0x2b, 0x20, 0x19, 0x06, 0x80, 0x6f, 0x40, - 0xb0, 0x03, 0xbc, 0xb0, 0x47, 0x70, 0xb0, 0x03, - 0xe7, 0xfb, 0x1c, 0x01, 0x06, 0x08, 0x0e, 0x00, - 0x22, 0x19, 0x06, 0x92, 0x63, 0x90, 0x47, 0x70, - 0xb4, 0xf0, 0x48, 0x4d, 0x6a, 0x80, 0x07, 0xc0, - 0x0f, 0xc0, 0xd0, 0x74, 0x22, 0x00, 0x27, 0x00, - 0x49, 0x4a, 0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, - 0xe0, 0x16, 0x1c, 0x43, 0x06, 0x18, 0x0e, 0x00, - 0xe7, 0xf8, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, - 0x03, 0x5b, 0x40, 0x23, 0xd0, 0x0b, 0x24, 0x01, - 0x40, 0x84, 0x1c, 0x23, 0x43, 0x1f, 0x00, 0x83, - 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x9c, - 0x1c, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xe8, - 0x20, 0x00, 0x28, 0x04, 0xdb, 0x04, 0xe0, 0x1a, - 0x1c, 0x43, 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, - 0x01, 0x05, 0x4b, 0x39, 0x18, 0xec, 0x22, 0x00, - 0x2a, 0x04, 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x53, - 0x06, 0x1a, 0x0e, 0x12, 0xe7, 0xf8, 0x4b, 0x35, - 0x60, 0x23, 0x4b, 0x35, 0x60, 0x63, 0x23, 0x00, - 0x60, 0xa3, 0x23, 0x00, 0x60, 0xe3, 0x34, 0xff, - 0x34, 0x01, 0xe7, 0xf0, 0xe7, 0xe4, 0xb0, 0x82, - 0x4b, 0x2b, 0x69, 0xdc, 0x23, 0x0c, 0x40, 0x23, - 0x08, 0x9c, 0xab, 0x01, 0x70, 0x1c, 0x4b, 0x28, - 0x69, 0xdc, 0x23, 0x30, 0x40, 0x23, 0x09, 0x1c, - 0xab, 0x00, 0x70, 0x1c, 0xab, 0x01, 0x78, 0x1b, - 0xac, 0x00, 0x78, 0x24, 0x42, 0xa3, 0xd1, 0x09, - 0x23, 0x33, 0x06, 0x5b, 0x6b, 0xdb, 0x2b, 0x00, - 0xd1, 0x04, 0x4b, 0x1f, 0x6a, 0x9b, 0x07, 0xdb, - 0x0f, 0xdb, 0xd0, 0x21, 0x4b, 0x1c, 0x69, 0xdd, - 0x23, 0x0c, 0x40, 0x2b, 0x08, 0x9c, 0x00, 0xa5, - 0x26, 0x01, 0x40, 0xae, 0x1c, 0x33, 0x25, 0x33, - 0x06, 0x6d, 0x64, 0x2b, 0x25, 0x01, 0x40, 0xa5, - 0x1c, 0x2b, 0x4d, 0x1a, 0x63, 0xab, 0x4b, 0x14, - 0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b, 0x08, 0x9d, - 0xab, 0x01, 0x70, 0x1d, 0xe0, 0x00, 0xe0, 0x1d, - 0x4b, 0x0f, 0x69, 0xdd, 0x23, 0x30, 0x40, 0x2b, - 0x09, 0x1d, 0xab, 0x00, 0x70, 0x1d, 0xe7, 0xcd, - 0xb0, 0x02, 0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, - 0xe0, 0x10, 0x1c, 0x43, 0x06, 0x18, 0x0e, 0x00, - 0xe7, 0xf8, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, - 0x40, 0x3b, 0xd0, 0x06, 0x00, 0x83, 0x58, 0xcc, - 0x23, 0x01, 0x03, 0x5b, 0x43, 0x23, 0x00, 0x84, - 0x51, 0x0b, 0xe7, 0xee, 0xbc, 0xf0, 0x47, 0x70, - 0x66, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x80, - 0x9e, 0x00, 0x00, 0xc0, 0x9e, 0x00, 0x00, 0x00, - 0x2e, 0x0f, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, - 0xb4, 0x80, 0x1c, 0x03, 0x1c, 0x0a, 0x48, 0x0a, - 0x68, 0x00, 0x68, 0x01, 0x20, 0x19, 0x06, 0x80, - 0x6a, 0x80, 0x0a, 0x40, 0x00, 0x4f, 0x43, 0x38, - 0x60, 0x18, 0x0f, 0xc8, 0x07, 0xc0, 0x60, 0x10, - 0x68, 0x10, 0x0f, 0xc0, 0x60, 0x10, 0x20, 0x00, - 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x40, 0xb5, 0x80, 0x1c, 0x07, - 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, 0x31, 0x01, - 0x20, 0x00, 0xf0, 0x19, 0xfb, 0xdb, 0x60, 0x38, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x18, 0xb4, 0xf0, 0x1c, 0x04, - 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x20, 0x0e, 0x00, - 0x06, 0x39, 0x0e, 0x09, 0x04, 0x1a, 0x0c, 0x12, - 0x4d, 0x07, 0x68, 0x2d, 0x70, 0xe8, 0x4d, 0x06, - 0x68, 0x2d, 0x70, 0xa9, 0x4d, 0x04, 0x68, 0x2d, - 0x80, 0x2a, 0x25, 0x01, 0x04, 0x2d, 0x26, 0x33, - 0x06, 0x76, 0x60, 0x35, 0xbc, 0xf0, 0x47, 0x70, - 0x2e, 0x08, 0x5e, 0x44, 0x20, 0x0d, 0x06, 0xc0, - 0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, - 0x31, 0x01, 0x23, 0x2d, 0x01, 0x1b, 0x42, 0x99, - 0xd9, 0x03, 0x20, 0x2d, 0x01, 0x00, 0x47, 0x70, - 0xe0, 0x01, 0x1c, 0x08, 0xe7, 0xfb, 0xe7, 0xfa, - 0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x03, - 0x20, 0x00, 0x90, 0x02, 0x9f, 0x05, 0x69, 0x3d, - 0x69, 0x38, 0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, - 0xb0, 0x05, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x99, 0x06, 0x68, 0x88, 0x68, 0x09, - 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04, 0x69, 0x78, - 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, - 0x08, 0x49, 0x91, 0x04, 0x00, 0xa8, 0x49, 0xf8, - 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 0x61, 0xf8, - 0x99, 0x06, 0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, - 0x30, 0x01, 0x63, 0xb8, 0x68, 0xf8, 0x90, 0x01, - 0x48, 0xf2, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, - 0x98, 0x01, 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x98, 0x01, - 0x28, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, - 0x20, 0x00, 0x28, 0x00, 0xd0, 0x07, 0x1d, 0xf8, - 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xea, - 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xc5, 0x49, 0xe6, - 0x20, 0x91, 0xf0, 0x19, 0xfb, 0x5b, 0x28, 0x92, - 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0b, 0xfb, 0x64, - 0xe7, 0xf5, 0x98, 0x01, 0x00, 0x80, 0x49, 0xe1, - 0x58, 0x08, 0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, - 0x20, 0x92, 0x49, 0xdd, 0x60, 0x08, 0x20, 0xff, - 0xb0, 0x05, 0xe7, 0xae, 0x48, 0xd9, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x03, 0x2d, 0x0b, 0xdb, 0x26, - 0x2d, 0x12, 0xdc, 0x24, 0x2d, 0x0b, 0xdb, 0x0b, - 0x2d, 0x12, 0xdc, 0x09, 0x48, 0xd6, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x05, 0x1d, 0xf8, 0x30, 0x21, - 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xbb, 0xe0, 0x16, - 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x7c, 0x90, 0x00, - 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xcf, 0xf0, 0x0c, - 0xfb, 0x4b, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, - 0xf0, 0x02, 0xf9, 0xac, 0x6b, 0x38, 0xf7, 0xff, - 0xff, 0x6e, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, - 0x48, 0xc8, 0xf0, 0x0c, 0xfb, 0x6b, 0x48, 0xc8, - 0x68, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x30, - 0x48, 0xc0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2c, - 0x48, 0xc1, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0a, - 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x90, 0x02, - 0x98, 0x02, 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, - 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0xba, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d, 0x6a, 0xb8, + 0x2c, 0x20, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x02, + 0xe7, 0xf6, 0x2f, 0x04, 0xd1, 0x00, 0x27, 0x00, + 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x49, 0x17, + 0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x00, + 0x28, 0x00, 0xd0, 0x0d, 0xf0, 0x11, 0xf8, 0x3a, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0x92, + 0x20, 0x02, 0xf0, 0x00, 0xfb, 0x1d, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x65, 0xe0, 0x13, + 0xf0, 0x11, 0xf8, 0x2c, 0x1c, 0x05, 0x1c, 0x21, + 0x22, 0x01, 0x02, 0x92, 0x20, 0x01, 0xf0, 0x00, + 0xfb, 0x0f, 0x2d, 0x80, 0xd0, 0x01, 0xf0, 0x11, + 0xf8, 0x57, 0x98, 0x02, 0x21, 0x80, 0x68, 0x89, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x55, 0xc6, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xc4, 0xb0, 0x02, + 0xe7, 0xc2, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc4, + 0xb5, 0xff, 0xb0, 0x82, 0x99, 0x03, 0x04, 0x0d, + 0x0c, 0x2d, 0x9a, 0x04, 0x06, 0x10, 0x0e, 0x00, + 0x90, 0x00, 0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x01, 0x98, 0x00, 0x28, 0x1f, 0xdb, 0x05, + 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x23, 0x80, + 0x40, 0x18, 0xd1, 0x2f, 0x98, 0x00, 0x49, 0x2c, + 0x68, 0x09, 0x73, 0x08, 0x27, 0x00, 0x2f, 0x20, + 0xdb, 0x04, 0xe0, 0x26, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x1c, 0x24, 0x00, + 0x20, 0x40, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, + 0x0c, 0x00, 0x24, 0x01, 0x03, 0xa4, 0x43, 0x04, + 0x20, 0x80, 0x40, 0x28, 0xd0, 0x04, 0x04, 0x20, + 0x0c, 0x00, 0x24, 0x01, 0x03, 0xe4, 0x43, 0x04, + 0xf0, 0x10, 0xff, 0xd4, 0x1c, 0x06, 0x1c, 0x22, + 0x1c, 0x39, 0x20, 0x01, 0xf0, 0x00, 0xfa, 0xb8, + 0x2e, 0x80, 0xd0, 0x01, 0xf0, 0x11, 0xf8, 0x00, + 0xe7, 0xd8, 0xe0, 0x24, 0x27, 0x00, 0x2f, 0x20, + 0xdb, 0x04, 0xe0, 0x20, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x20, 0x01, 0x40, 0xb8, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x16, 0x24, 0x00, + 0x20, 0x40, 0x40, 0x28, 0xd0, 0x01, 0x4b, 0x0d, + 0x40, 0x1c, 0x20, 0x80, 0x40, 0x28, 0xd0, 0x01, + 0x04, 0x64, 0x0c, 0x64, 0xf0, 0x10, 0xff, 0xae, + 0x1c, 0x06, 0x1c, 0x22, 0x1c, 0x39, 0x20, 0x02, + 0xf0, 0x00, 0xfa, 0x92, 0x2e, 0x80, 0xd0, 0x01, + 0xf0, 0x10, 0xff, 0xda, 0xe7, 0xde, 0x20, 0x00, + 0xb0, 0x02, 0xe7, 0x9f, 0xb0, 0x02, 0xe7, 0x9d, + 0x2e, 0x08, 0x5e, 0x10, 0x00, 0x00, 0xbf, 0xff, + 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x07, 0x68, 0x01, + 0x20, 0x00, 0xf0, 0x19, 0xfe, 0x73, 0x60, 0x38, + 0x48, 0x04, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, + 0xf0, 0x19, 0xfe, 0x6c, 0x60, 0x78, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x10, + 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, + 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, + 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, + 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, + 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x6e, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, + 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x51, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x99, 0xe0, 0x16, + 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, + 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, + 0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x56, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x02, 0xd2, + 0x20, 0x01, 0xf0, 0x00, 0xfa, 0x39, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x81, 0x20, 0x00, + 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x14, + 0xb5, 0xf7, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0e, + 0x0e, 0x36, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, + 0x2e, 0x1f, 0xdb, 0x04, 0x20, 0xaf, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x20, + 0xdb, 0x01, 0x20, 0xa2, 0xe7, 0xf7, 0x20, 0x80, + 0x40, 0x20, 0xd0, 0x0d, 0xf0, 0x10, 0xff, 0x2e, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, + 0x20, 0x02, 0xf0, 0x00, 0xfa, 0x11, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x59, 0xe0, 0x16, + 0x48, 0x0c, 0x68, 0x00, 0x60, 0x07, 0x48, 0x0b, + 0x68, 0x00, 0x71, 0x46, 0x20, 0xff, 0x49, 0x09, + 0x68, 0x09, 0x71, 0x08, 0xf0, 0x10, 0xff, 0x16, + 0x1c, 0x05, 0x1c, 0x21, 0x22, 0x01, 0x03, 0x12, + 0x20, 0x01, 0xf0, 0x00, 0xf9, 0xf9, 0x2d, 0x80, + 0xd0, 0x01, 0xf0, 0x10, 0xff, 0x41, 0x20, 0x00, + 0xe7, 0xcd, 0xe7, 0xcc, 0x2e, 0x08, 0x5e, 0x18, + 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d, + 0x0e, 0x2d, 0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36, + 0x9f, 0x04, 0x1c, 0x29, 0x98, 0x00, 0xf0, 0x00, + 0xf8, 0x91, 0x28, 0x00, 0xd0, 0x05, 0x20, 0xa2, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x79, 0x38, 0x79, 0x79, 0x18, 0x40, + 0x79, 0xb9, 0x18, 0x40, 0x06, 0x04, 0x0e, 0x24, + 0x79, 0xb8, 0x02, 0x00, 0x43, 0x04, 0x00, 0x68, + 0x19, 0x80, 0x01, 0x00, 0x49, 0x15, 0x68, 0x09, + 0x50, 0x0c, 0x9b, 0x04, 0x88, 0x99, 0x00, 0x68, + 0x19, 0x80, 0x01, 0x00, 0x4a, 0x11, 0x68, 0x12, + 0x18, 0x80, 0x60, 0x41, 0x78, 0x78, 0x78, 0x39, + 0x18, 0x40, 0x78, 0xb9, 0x18, 0x40, 0x06, 0x04, + 0x0e, 0x24, 0x78, 0xb8, 0x02, 0x00, 0x43, 0x04, + 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, 0x49, 0x09, + 0x68, 0x09, 0x18, 0x40, 0x60, 0x84, 0x9b, 0x04, + 0x88, 0x19, 0x00, 0x68, 0x19, 0x80, 0x01, 0x00, + 0x4a, 0x04, 0x68, 0x12, 0x18, 0x80, 0x60, 0xc1, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, + 0xe7, 0xc3, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xc8, + 0xb5, 0xff, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x9a, 0x02, + 0x06, 0x16, 0x0e, 0x36, 0x1c, 0x21, 0x1c, 0x28, + 0xf0, 0x00, 0xf8, 0x40, 0x28, 0x00, 0xd0, 0x04, + 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x02, 0xe7, 0xf5, 0xe7, 0xf4, + 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, + 0x06, 0x21, 0x0e, 0x09, 0x06, 0x3a, 0x0e, 0x12, + 0x29, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xf0, + 0x47, 0x70, 0x88, 0xdd, 0x00, 0x48, 0x18, 0x80, + 0x01, 0x00, 0x4e, 0x0f, 0x68, 0x36, 0x50, 0x35, + 0x88, 0x98, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x0b, 0x68, 0x36, 0x19, 0xad, 0x60, 0x68, + 0x88, 0x58, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x07, 0x68, 0x36, 0x19, 0xad, 0x60, 0xa8, + 0x88, 0x18, 0x00, 0x4d, 0x18, 0xad, 0x01, 0x2d, + 0x4e, 0x03, 0x68, 0x36, 0x19, 0xad, 0x60, 0xe8, + 0x20, 0x00, 0xe7, 0xdc, 0xe7, 0xdb, 0x00, 0x00, + 0x2e, 0x08, 0x5d, 0xc8, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x06, 0x15, + 0x0e, 0x2d, 0xb0, 0x81, 0x29, 0x20, 0xdb, 0x03, + 0x20, 0xa2, 0xb0, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2d, 0x10, 0xdb, 0x02, 0x20, 0xa2, 0xb0, 0x01, + 0xe7, 0xf8, 0x00, 0xc8, 0x4b, 0x0a, 0x68, 0x1b, + 0x18, 0xc4, 0x68, 0x20, 0x90, 0x00, 0x98, 0x00, + 0x4b, 0x08, 0x40, 0x18, 0x90, 0x00, 0x00, 0x68, + 0x23, 0x1e, 0x40, 0x18, 0x9b, 0x00, 0x43, 0x18, + 0x90, 0x00, 0x98, 0x00, 0x60, 0x20, 0x20, 0x00, + 0xb0, 0x01, 0xe7, 0xe3, 0xb0, 0x01, 0xe7, 0xe1, + 0x2e, 0x08, 0x5d, 0xd0, 0xff, 0xff, 0xdf, 0xe1, + 0x20, 0xff, 0x49, 0x02, 0x68, 0x09, 0x70, 0x08, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x2c, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x83, + 0x20, 0x00, 0x43, 0xc0, 0x23, 0x19, 0x06, 0x9b, + 0x67, 0x58, 0x08, 0xb9, 0x00, 0x89, 0x1a, 0x78, + 0x90, 0x02, 0x98, 0x02, 0x18, 0x10, 0x07, 0x80, + 0x0f, 0x80, 0x90, 0x01, 0x98, 0x02, 0x18, 0x10, + 0x08, 0x80, 0x90, 0x00, 0x9b, 0x02, 0x20, 0x03, + 0x1a, 0xc0, 0x23, 0x19, 0x06, 0x9b, 0x67, 0xd8, + 0x24, 0x00, 0x98, 0x00, 0x42, 0x84, 0xd3, 0x02, + 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xf9, 0xc9, 0x08, + 0x20, 0x19, 0x06, 0x80, 0x67, 0x03, 0xe7, 0xf8, + 0x98, 0x01, 0x28, 0x00, 0xd0, 0x0b, 0x9b, 0x01, + 0x00, 0xd8, 0x25, 0x00, 0x43, 0xed, 0x40, 0xc5, + 0x1c, 0x2b, 0x43, 0xdb, 0x68, 0x0d, 0x40, 0x2b, + 0x25, 0x19, 0x06, 0xad, 0x67, 0x2b, 0x20, 0x19, + 0x06, 0x80, 0x6f, 0x40, 0xb0, 0x03, 0xbc, 0xb0, + 0x47, 0x70, 0xb0, 0x03, 0xe7, 0xfb, 0x1c, 0x01, + 0x06, 0x08, 0x0e, 0x00, 0x22, 0x19, 0x06, 0x92, + 0x63, 0x90, 0x47, 0x70, 0xb4, 0xf0, 0x48, 0x4d, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x74, + 0x22, 0x00, 0x27, 0x00, 0x49, 0x4a, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x16, 0x1c, 0x43, + 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x00, 0x83, + 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x23, + 0xd0, 0x0b, 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, + 0x43, 0x1f, 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x9c, 0x1c, 0x23, 0x00, 0x84, + 0x51, 0x0b, 0xe7, 0xe8, 0x20, 0x00, 0x28, 0x04, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x43, 0x06, 0x18, + 0x0e, 0x00, 0xe7, 0xf8, 0x01, 0x05, 0x4b, 0x39, + 0x18, 0xec, 0x22, 0x00, 0x2a, 0x04, 0xdb, 0x04, + 0xe0, 0x0e, 0x1c, 0x53, 0x06, 0x1a, 0x0e, 0x12, + 0xe7, 0xf8, 0x4b, 0x35, 0x60, 0x23, 0x4b, 0x35, + 0x60, 0x63, 0x23, 0x00, 0x60, 0xa3, 0x23, 0x00, + 0x60, 0xe3, 0x34, 0xff, 0x34, 0x01, 0xe7, 0xf0, + 0xe7, 0xe4, 0xb0, 0x82, 0x4b, 0x2b, 0x69, 0xdc, + 0x23, 0x0c, 0x40, 0x23, 0x08, 0x9c, 0xab, 0x01, + 0x70, 0x1c, 0x4b, 0x28, 0x69, 0xdc, 0x23, 0x30, + 0x40, 0x23, 0x09, 0x1c, 0xab, 0x00, 0x70, 0x1c, + 0xab, 0x01, 0x78, 0x1b, 0xac, 0x00, 0x78, 0x24, + 0x42, 0xa3, 0xd1, 0x09, 0x23, 0x33, 0x06, 0x5b, + 0x6b, 0xdb, 0x2b, 0x00, 0xd1, 0x04, 0x4b, 0x1f, + 0x6a, 0x9b, 0x07, 0xdb, 0x0f, 0xdb, 0xd0, 0x21, + 0x4b, 0x1c, 0x69, 0xdd, 0x23, 0x0c, 0x40, 0x2b, + 0x08, 0x9c, 0x00, 0xa5, 0x26, 0x01, 0x40, 0xae, + 0x1c, 0x33, 0x25, 0x33, 0x06, 0x6d, 0x64, 0x2b, + 0x25, 0x01, 0x40, 0xa5, 0x1c, 0x2b, 0x4d, 0x1a, + 0x63, 0xab, 0x4b, 0x14, 0x69, 0xdd, 0x23, 0x0c, + 0x40, 0x2b, 0x08, 0x9d, 0xab, 0x01, 0x70, 0x1d, + 0xe0, 0x00, 0xe0, 0x1d, 0x4b, 0x0f, 0x69, 0xdd, + 0x23, 0x30, 0x40, 0x2b, 0x09, 0x1d, 0xab, 0x00, + 0x70, 0x1d, 0xe7, 0xcd, 0xb0, 0x02, 0x20, 0x00, + 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x43, + 0x06, 0x18, 0x0e, 0x00, 0xe7, 0xf8, 0x24, 0x01, + 0x40, 0x84, 0x1c, 0x23, 0x40, 0x3b, 0xd0, 0x06, + 0x00, 0x83, 0x58, 0xcc, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x23, 0x00, 0x84, 0x51, 0x0b, 0xe7, 0xee, + 0xbc, 0xf0, 0x47, 0x70, 0x66, 0x00, 0x01, 0x00, + 0x64, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x00, 0xc0, + 0x9e, 0x00, 0x00, 0x00, 0x2e, 0x0f, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x03, + 0x1c, 0x0a, 0x48, 0x0a, 0x68, 0x00, 0x68, 0x01, + 0x20, 0x19, 0x06, 0x80, 0x6a, 0x80, 0x0a, 0x40, + 0x00, 0x4f, 0x43, 0x38, 0x60, 0x18, 0x0f, 0xc8, + 0x07, 0xc0, 0x60, 0x10, 0x68, 0x10, 0x0f, 0xc0, + 0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x38, + 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x05, 0x68, 0x00, + 0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, 0xf0, 0x19, + 0xfb, 0xfd, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x10, + 0xb4, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, + 0x06, 0x20, 0x0e, 0x00, 0x06, 0x39, 0x0e, 0x09, + 0x04, 0x1a, 0x0c, 0x12, 0x4d, 0x07, 0x68, 0x2d, + 0x70, 0xe8, 0x4d, 0x06, 0x68, 0x2d, 0x70, 0xa9, + 0x4d, 0x04, 0x68, 0x2d, 0x80, 0x2a, 0x25, 0x01, + 0x04, 0x2d, 0x26, 0x33, 0x06, 0x76, 0x60, 0x35, + 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x3c, + 0x20, 0x0d, 0x06, 0xc0, 0x69, 0xc0, 0x47, 0x70, + 0xe7, 0xfd, 0x1c, 0x01, 0x31, 0x01, 0x23, 0x2d, + 0x01, 0x1b, 0x42, 0x99, 0xd9, 0x03, 0x20, 0x2d, + 0x01, 0x00, 0x47, 0x70, 0xe0, 0x01, 0x1c, 0x08, + 0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, 0xb0, 0x85, + 0x20, 0x00, 0x90, 0x03, 0x20, 0x00, 0x90, 0x02, + 0x9f, 0x05, 0x69, 0x3d, 0x69, 0x38, 0x28, 0x13, + 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x05, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x06, + 0x68, 0x88, 0x68, 0x09, 0x1a, 0x40, 0x1c, 0x41, + 0x91, 0x04, 0x69, 0x78, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, + 0x00, 0xa8, 0x49, 0xf8, 0x58, 0x08, 0x99, 0x04, + 0x43, 0x48, 0x61, 0xf8, 0x99, 0x06, 0x68, 0x88, + 0x68, 0x09, 0x1a, 0x40, 0x30, 0x01, 0x63, 0xb8, + 0x68, 0xf8, 0x90, 0x01, 0x48, 0xf2, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x06, 0x98, 0x01, 0x28, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x05, 0x98, 0x01, 0x28, 0x08, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, + 0xd0, 0x07, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, + 0xf0, 0x02, 0xf9, 0xea, 0x20, 0x00, 0xb0, 0x05, + 0xe7, 0xc5, 0x49, 0xe6, 0x20, 0x91, 0xf0, 0x19, + 0xfb, 0x7d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0b, 0xfb, 0x64, 0xe7, 0xf5, 0x98, 0x01, + 0x00, 0x80, 0x49, 0xe1, 0x58, 0x08, 0x99, 0x05, + 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0xdd, + 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, 0xe7, 0xae, + 0x48, 0xd9, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0x2d, 0x0b, 0xdb, 0x26, 0x2d, 0x12, 0xdc, 0x24, + 0x2d, 0x0b, 0xdb, 0x0b, 0x2d, 0x12, 0xdc, 0x09, + 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, + 0xf9, 0xbb, 0xe0, 0x16, 0x6b, 0x38, 0xf7, 0xff, + 0xff, 0x7c, 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, + 0x48, 0xcf, 0xf0, 0x0c, 0xfb, 0x4b, 0x1d, 0xf8, + 0x30, 0x21, 0x99, 0x06, 0xf0, 0x02, 0xf9, 0xac, + 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x6e, 0x90, 0x00, + 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0xc8, 0xf0, 0x0c, + 0xfb, 0x6b, 0x48, 0xc8, 0x68, 0x00, 0x99, 0x05, + 0x42, 0x88, 0xd1, 0x30, 0x48, 0xc0, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x2c, 0x48, 0xc1, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x01, + 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x48, 0xba, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x0d, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, + 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, + 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x0b, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, + 0x43, 0x08, 0x49, 0xaf, 0x60, 0x08, 0x2d, 0x0b, + 0xdb, 0x15, 0x2d, 0x12, 0xdc, 0x13, 0x48, 0xa9, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0f, 0x48, 0xa4, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0b, 0x20, 0x00, + 0x62, 0xb8, 0x20, 0x00, 0x62, 0xf8, 0x48, 0xa7, + 0x63, 0x38, 0x48, 0xa7, 0x63, 0x78, 0x6b, 0x38, + 0xf7, 0xff, 0xff, 0x1b, 0x90, 0x00, 0x48, 0x9c, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0x80, 0x90, 0x03, 0x20, 0x00, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x01, + 0xfb, 0x07, 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x09, + 0x90, 0x00, 0x9a, 0x00, 0x99, 0x01, 0x1c, 0x38, + 0xf0, 0x01, 0xfa, 0x8c, 0x98, 0x03, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x48, 0x93, 0x68, 0x00, + 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0b, 0x48, 0x8c, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x07, 0x48, 0x8d, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x98, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x48, 0x86, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0x48, 0x87, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0xb0, 0x84, + 0x98, 0x05, 0xf0, 0x0c, 0xf9, 0xe1, 0x28, 0x00, + 0xd1, 0x0e, 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, + 0xdd, 0x0a, 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x0a, + 0xf0, 0x02, 0xf9, 0x12, 0x20, 0x92, 0x49, 0x7b, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe6, 0xea, + 0x49, 0x80, 0x20, 0x91, 0xf0, 0x19, 0xfa, 0xa2, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0c, + 0xfa, 0x22, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x7b, 0x68, 0x09, 0x60, 0x08, + 0x2d, 0x0b, 0xdb, 0x39, 0x2d, 0x12, 0xdc, 0x37, + 0xb0, 0x81, 0x24, 0x00, 0x20, 0x00, 0x90, 0x03, + 0x20, 0x01, 0x49, 0x75, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x6a, 0xb8, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, + 0x43, 0x08, 0x90, 0x00, 0x20, 0x00, 0x62, 0xb8, + 0x20, 0x00, 0x62, 0xf8, 0x48, 0x67, 0x63, 0x38, + 0x48, 0x67, 0x63, 0x78, 0x6b, 0x38, 0xf7, 0xff, + 0xfe, 0x9c, 0x90, 0x02, 0x48, 0x66, 0x68, 0x00, + 0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, + 0x1c, 0x39, 0xf0, 0x0b, 0xfe, 0x05, 0x98, 0x00, + 0x49, 0x61, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x5e, 0x68, 0x00, + 0xf0, 0x0c, 0xf9, 0xf8, 0xb0, 0x01, 0xe1, 0x2b, + 0x24, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x16, + 0x2c, 0x07, 0xd2, 0x14, 0x6a, 0xf8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0xe0, 0x00, 0xe1, 0x3c, + 0x4a, 0x53, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, + 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe6, 0x2e, 0x00, + 0xd1, 0x13, 0x2c, 0x18, 0xd2, 0x11, 0x6a, 0xf8, + 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, + 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x48, 0x68, 0x12, + 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, + 0xe7, 0xe9, 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, + 0xfe, 0x50, 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x05, + 0x48, 0x3f, 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b, + 0xfc, 0xcb, 0xe0, 0x06, 0x2c, 0x18, 0xd2, 0x04, + 0x1f, 0xe0, 0x49, 0x3b, 0x68, 0x09, 0xf0, 0x0b, + 0xfd, 0x01, 0x48, 0x3a, 0x49, 0x38, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x66, 0xc8, + 0x48, 0x36, 0x49, 0x35, 0x68, 0x09, 0x23, 0x09, + 0x01, 0xdb, 0x18, 0xc9, 0x67, 0x08, 0x48, 0x33, + 0x49, 0x31, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, + 0x18, 0xc9, 0x66, 0x88, 0x48, 0x2f, 0x49, 0x2e, + 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, + 0x66, 0x48, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x6b, 0x79, 0x48, 0x27, 0x68, 0x00, 0xf0, 0x0b, + 0xfd, 0x4b, 0x94, 0x02, 0x1d, 0xf8, 0x30, 0x21, + 0x99, 0x0a, 0xf0, 0x02, 0xf8, 0x4d, 0x24, 0x00, + 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, 0x2c, 0x07, + 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x1b, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xda, 0x00, 0x26, 0x01, 0xe7, 0xe8, + 0x2e, 0x00, 0xd1, 0x2f, 0x2c, 0x18, 0xd2, 0x2d, + 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, + 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x10, + 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xda, 0x1c, + 0xe0, 0x1a, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, + 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x7c, 0xbc, + 0x2e, 0x08, 0x5e, 0x4c, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x94, 0x88, + 0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0xff, 0xff, + 0x26, 0x01, 0xe7, 0xcd, 0x3c, 0x01, 0x6b, 0x38, + 0xf7, 0xff, 0xfd, 0xc3, 0x90, 0x01, 0x2c, 0x07, + 0xd2, 0x12, 0x48, 0x48, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0b, 0xfb, 0xcc, 0x00, 0xa0, 0x19, 0x00, + 0x00, 0xc0, 0x49, 0x44, 0x68, 0x09, 0x18, 0x40, + 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x01, + 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x21, 0xe0, 0x4a, + 0x2c, 0x18, 0xd2, 0x48, 0x1f, 0xe0, 0x49, 0x3d, + 0x68, 0x09, 0xf0, 0x0b, 0xfc, 0x0b, 0x20, 0x4c, + 0x43, 0x60, 0x49, 0x3a, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x01, + 0x1c, 0x39, 0xf0, 0x0b, 0xfd, 0x0d, 0x20, 0x4c, + 0x43, 0x60, 0x49, 0x34, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, + 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x60, + 0x49, 0x2e, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, + 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x60, + 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, + 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, + 0x43, 0x61, 0x4a, 0x22, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, + 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x61, + 0x4a, 0x1c, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, + 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x19, + 0x68, 0x00, 0xf0, 0x0c, 0xf8, 0xcf, 0x6b, 0x79, + 0x48, 0x16, 0x68, 0x00, 0xf0, 0x0b, 0xfc, 0x36, + 0x98, 0x02, 0x42, 0x84, 0xda, 0x01, 0x1c, 0x21, + 0xe0, 0x00, 0x99, 0x02, 0x91, 0x00, 0x99, 0x00, + 0x48, 0x10, 0x68, 0x00, 0xf0, 0x0b, 0xfd, 0x46, + 0x49, 0x0f, 0x20, 0x91, 0xf0, 0x19, 0xf9, 0x1e, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, + 0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, + 0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, + 0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe5, 0x4b, 0xb0, 0x05, + 0xe5, 0x49, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8, + 0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xff, 0x1c, 0x07, + 0x9d, 0x09, 0xb0, 0x89, 0x26, 0x00, 0x20, 0x00, + 0x90, 0x03, 0x99, 0x0a, 0x68, 0x4c, 0x2d, 0x13, + 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x09, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x15, + 0x60, 0x04, 0x20, 0x00, 0x60, 0xe0, 0x20, 0x00, + 0x61, 0x20, 0x69, 0x60, 0x4b, 0xf9, 0x40, 0x18, + 0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xf8, + 0x40, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, + 0x4b, 0xf6, 0x40, 0x18, 0x61, 0x60, 0x05, 0x80, + 0x69, 0x60, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, + 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x4b, 0xf2, + 0x40, 0x18, 0x61, 0x60, 0x04, 0x40, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, + 0x06, 0x80, 0x69, 0x60, 0x09, 0x40, 0x01, 0x40, + 0x61, 0x60, 0x06, 0xc0, 0x20, 0x00, 0x61, 0xa0, + 0x20, 0x00, 0x61, 0xe0, 0x20, 0x00, 0x62, 0x20, + 0x20, 0x00, 0x62, 0x60, 0x20, 0x00, 0x63, 0xa0, + 0x20, 0x00, 0x63, 0xe0, 0x20, 0x00, 0x64, 0x60, + 0x20, 0x00, 0x64, 0x20, 0x20, 0x00, 0x60, 0x20, + 0x20, 0x00, 0x71, 0x20, 0x99, 0x0a, 0x68, 0x48, + 0x64, 0xe0, 0x99, 0x0a, 0x68, 0x08, 0x64, 0xa0, + 0x1d, 0xe0, 0x30, 0x21, 0x99, 0x13, 0xf0, 0x01, + 0xff, 0x07, 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, + 0xdc, 0x04, 0x1d, 0xe0, 0x30, 0x49, 0x99, 0x13, + 0xf0, 0x01, 0xfe, 0xfe, 0x6b, 0x20, 0x6a, 0xa1, + 0x1a, 0x40, 0x30, 0x01, 0x63, 0xa0, 0x00, 0xa8, + 0x49, 0xd4, 0x58, 0x08, 0x69, 0x61, 0x09, 0x49, + 0x01, 0x49, 0x06, 0xc0, 0x0e, 0xc0, 0x43, 0x08, + 0x61, 0x60, 0x06, 0xc0, 0x0e, 0xc0, 0x6b, 0x20, + 0x6a, 0xa1, 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x04, + 0x69, 0x60, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, + 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x00, 0xa8, + 0x49, 0xc9, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, + 0x61, 0xe0, 0x2d, 0x13, 0xd1, 0x04, 0x20, 0x00, + 0x90, 0x14, 0x20, 0x00, 0x61, 0xa0, 0xe0, 0x13, + 0x9b, 0x0c, 0x68, 0x58, 0x90, 0x01, 0x98, 0x01, + 0x08, 0x80, 0x61, 0xa0, 0x98, 0x01, 0x64, 0x60, + 0x9b, 0x0c, 0x68, 0x18, 0x64, 0x20, 0x20, 0x00, + 0x62, 0x60, 0x9a, 0x0b, 0x63, 0xe2, 0x69, 0x60, + 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00, + 0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, 0x61, 0x60, + 0x05, 0x80, 0x69, 0x60, 0x23, 0x0f, 0x02, 0x9b, + 0x43, 0x18, 0x61, 0x60, 0x04, 0x80, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, + 0x06, 0x80, 0x69, 0x60, 0x23, 0xc0, 0x43, 0x18, + 0x61, 0x60, 0x06, 0x00, 0x69, 0x60, 0x23, 0x01, + 0x03, 0x9b, 0x43, 0x18, 0x61, 0x60, 0x04, 0x40, + 0x98, 0x14, 0x60, 0xe0, 0x61, 0x25, 0x48, 0xab, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x14, + 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x05, 0x98, 0x14, 0x28, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x09, + 0xe7, 0x35, 0x49, 0xa1, 0x20, 0x91, 0xf0, 0x19, + 0xf8, 0x21, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0b, 0xf8, 0x08, 0xe7, 0xf5, 0x48, 0x9d, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x53, 0x68, 0x38, + 0x01, 0x80, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x9a, + 0x40, 0x19, 0x07, 0xc0, 0x09, 0x80, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0x80, 0x0f, 0xc0, 0x68, 0x38, + 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0xa1, 0x4b, 0x95, + 0x40, 0x19, 0x07, 0xc0, 0x09, 0xc0, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0xc0, 0x0f, 0xc0, 0x68, 0x38, + 0x02, 0x00, 0x0e, 0x00, 0x68, 0xa1, 0x4b, 0x85, + 0x40, 0x19, 0x06, 0x00, 0x0e, 0x00, 0x04, 0x00, + 0x43, 0x08, 0x60, 0xa0, 0x02, 0x00, 0x0e, 0x00, + 0x48, 0x86, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2a, + 0x2f, 0x00, 0xd0, 0x28, 0x20, 0x0d, 0x06, 0xc0, + 0x6a, 0x00, 0x1c, 0x06, 0x68, 0x38, 0x4b, 0x85, + 0x43, 0x98, 0xd0, 0x06, 0x68, 0x38, 0x02, 0x00, + 0x0e, 0x01, 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, + 0xe0, 0x05, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, + 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x68, 0x38, + 0x4b, 0x7b, 0x43, 0x98, 0xd0, 0x08, 0x68, 0x38, + 0x02, 0x00, 0x0e, 0x00, 0x1d, 0xc1, 0x31, 0x01, + 0x20, 0x01, 0x40, 0x88, 0x43, 0x06, 0xe0, 0x06, + 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, 0x30, 0x08, + 0x21, 0x01, 0x40, 0x81, 0x43, 0x8e, 0x2d, 0x0b, + 0xdb, 0x0a, 0x2d, 0x12, 0xdc, 0x08, 0x48, 0x6f, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x20, 0x51, + 0x01, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, + 0x98, 0x14, 0x00, 0x80, 0x49, 0x6c, 0x58, 0x08, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x83, 0x90, 0x03, + 0x2d, 0x0b, 0xdb, 0x08, 0x2d, 0x12, 0xdc, 0x06, + 0x48, 0x68, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x84, 0x90, 0x03, 0xe0, 0x06, 0x9a, 0x0b, + 0x2a, 0x01, 0xd1, 0x03, 0x2d, 0x13, 0xd0, 0x01, + 0x20, 0x82, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00, + 0xd0, 0x07, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x20, 0x08, 0x60, 0xe0, 0x98, 0x03, 0xb0, 0x09, + 0xe6, 0xa1, 0x98, 0x15, 0x68, 0x01, 0x98, 0x14, + 0x00, 0x80, 0x4a, 0x59, 0x50, 0x11, 0x6a, 0xa0, + 0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xa0, + 0x6b, 0x20, 0x28, 0x00, 0xdc, 0x01, 0x20, 0x01, + 0x63, 0x20, 0x6a, 0xe0, 0x28, 0x00, 0xda, 0x01, + 0x20, 0x00, 0x62, 0xe0, 0x6b, 0x60, 0x4b, 0x52, + 0x42, 0x98, 0xdd, 0x01, 0x48, 0x50, 0x63, 0x60, + 0x6b, 0x20, 0xf7, 0xff, 0xfb, 0x9e, 0x90, 0x00, + 0x2d, 0x13, 0xd1, 0x05, 0x6a, 0xa1, 0x9a, 0x00, + 0x48, 0x4c, 0xf0, 0x0b, 0xff, 0x99, 0xe0, 0x15, + 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x03, + 0x48, 0x40, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x0d, + 0x2d, 0x0b, 0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04, + 0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x00, + 0xe0, 0x04, 0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x41, + 0xf0, 0x0b, 0xff, 0x82, 0x2d, 0x0b, 0xdb, 0x5f, + 0x2d, 0x12, 0xdc, 0x5e, 0x98, 0x15, 0x68, 0x00, + 0x49, 0x3a, 0x60, 0x08, 0x99, 0x13, 0xa8, 0x05, + 0xf0, 0x01, 0xfd, 0xae, 0xa9, 0x05, 0x98, 0x15, + 0x68, 0x00, 0xf0, 0x05, 0xfc, 0x5f, 0x1d, 0xe0, + 0x30, 0x21, 0xa9, 0x05, 0xf0, 0x01, 0xfd, 0xa4, + 0x20, 0x01, 0x49, 0x35, 0x65, 0x08, 0x20, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, + 0x20, 0x02, 0xf0, 0x04, 0xfa, 0xdd, 0x2d, 0x0b, + 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x12, 0xf0, 0x04, 0xfa, 0xd1, 0x2d, 0x0c, + 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x04, 0xf0, 0x04, 0xfa, 0xc9, 0x2d, 0x0d, + 0xd0, 0x01, 0x2d, 0x10, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x08, 0xf0, 0x04, 0xfa, 0xc1, 0x2d, 0x0e, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x03, 0x21, 0x00, + 0x20, 0x01, 0xf0, 0x04, 0xfa, 0xb9, 0x48, 0x15, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, 0xb0, 0x82, + 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x18, 0xff, 0x06, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfe, 0x86, 0x20, 0x92, 0x49, 0x17, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x15, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x25, + 0xe0, 0xae, 0xe0, 0xad, 0xff, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x03, 0x3a, 0x04, + 0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x60, 0x84, + 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x7c, 0xbc, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x7d, 0x94, + 0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x88, + 0x2e, 0x08, 0x7d, 0xb4, 0x6a, 0xa0, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, + 0x90, 0x00, 0x20, 0x00, 0x62, 0xa0, 0x20, 0x00, + 0x62, 0xe0, 0x48, 0x5f, 0x63, 0x20, 0x48, 0x5f, + 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0xe1, + 0x90, 0x02, 0x48, 0x5d, 0x68, 0x00, 0x23, 0x77, + 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x21, + 0xf0, 0x0b, 0xfa, 0x4a, 0x98, 0x00, 0x49, 0x58, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0xc8, 0x48, 0x55, 0x68, 0x00, 0x21, 0x00, + 0xf0, 0x0b, 0xfa, 0xc4, 0x48, 0x52, 0x68, 0x00, + 0xf0, 0x0b, 0xfe, 0x38, 0x49, 0x51, 0x20, 0x91, + 0xf0, 0x18, 0xfe, 0x98, 0xe0, 0x00, 0xe0, 0x11, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf6, 0x48, 0x4c, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x4c, 0x68, 0x00, + 0x49, 0x49, 0x60, 0x08, 0x98, 0x01, 0x49, 0x4a, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x47, 0x60, 0x08, + 0xb0, 0x02, 0xe0, 0x40, 0x48, 0x47, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x0c, 0x6a, 0xa0, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, + 0x49, 0x41, 0x60, 0x08, 0xe0, 0x0c, 0x6a, 0xa0, + 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, 0x31, 0x01, + 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, - 0xe0, 0x0b, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, - 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, - 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x49, 0xaf, - 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x15, 0x2d, 0x12, - 0xdc, 0x13, 0x48, 0xa9, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x0f, 0x48, 0xa4, 0x68, 0x00, 0x28, 0x00, - 0xd1, 0x0b, 0x20, 0x00, 0x62, 0xb8, 0x20, 0x00, - 0x62, 0xf8, 0x48, 0xa7, 0x63, 0x38, 0x48, 0xa7, - 0x63, 0x78, 0x6b, 0x38, 0xf7, 0xff, 0xff, 0x1b, - 0x90, 0x00, 0x48, 0x9c, 0x68, 0x00, 0x28, 0x00, - 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, - 0x90, 0x03, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, - 0x60, 0x88, 0xf0, 0x01, 0xfb, 0x07, 0x6b, 0x38, - 0xf7, 0xff, 0xff, 0x09, 0x90, 0x00, 0x9a, 0x00, - 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x01, 0xfa, 0x8c, - 0x98, 0x03, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, - 0x48, 0x93, 0x68, 0x00, 0x99, 0x05, 0x42, 0x88, - 0xd1, 0x0b, 0x48, 0x8c, 0x68, 0x00, 0x28, 0x00, - 0xd1, 0x07, 0x48, 0x8d, 0x68, 0x00, 0x28, 0x00, - 0xd1, 0x03, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, - 0x60, 0xc8, 0x48, 0x86, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x73, 0x48, 0x87, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x6f, 0xb0, 0x84, 0x98, 0x05, 0xf0, 0x0c, - 0xf9, 0xe1, 0x28, 0x00, 0xd1, 0x0e, 0x2d, 0x0b, - 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x0a, 0x1d, 0xf8, - 0x30, 0x21, 0x99, 0x0a, 0xf0, 0x02, 0xf9, 0x12, - 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, 0x20, 0x00, - 0xb0, 0x09, 0xe6, 0xea, 0x49, 0x80, 0x20, 0x91, - 0xf0, 0x19, 0xfa, 0x80, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0xf0, 0x0c, 0xfa, 0x22, 0x20, 0x92, - 0x49, 0x7b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x7b, - 0x68, 0x09, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x39, - 0x2d, 0x12, 0xdc, 0x37, 0xb0, 0x81, 0x24, 0x00, - 0x20, 0x00, 0x90, 0x03, 0x20, 0x01, 0x49, 0x75, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, + 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0xf0, 0x00, 0xfe, 0x82, 0x48, 0x33, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x07, 0x20, 0x00, 0x62, 0xa0, + 0x20, 0x00, 0x62, 0xe0, 0x48, 0x2a, 0x63, 0x20, + 0x48, 0x2a, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, + 0xfa, 0x78, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14, + 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xfb, 0x98, 0x02, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x05, + 0x2d, 0x13, 0xd1, 0x03, 0x20, 0x1f, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x08, 0x2d, 0x0b, 0xdb, 0x01, + 0x2d, 0x12, 0xdd, 0x1a, 0x48, 0x23, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x50, + 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x52, 0x90, 0x00, + 0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00, + 0xfd, 0xd5, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0x88, 0x48, 0x14, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x06, 0x48, 0x14, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x62, 0x06, + 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, + 0x48, 0x0e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x03, + 0x98, 0x14, 0x21, 0x00, 0xf0, 0x0b, 0xfd, 0x0a, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x09, 0xe5, 0x10, 0xb0, 0x09, 0xe5, 0x0e, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88, + 0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x5e, 0x4c, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf7, 0xb0, 0x83, + 0x9f, 0x03, 0x69, 0x38, 0x90, 0x00, 0x98, 0x00, + 0x28, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x03, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x6c, 0x78, 0x99, 0x04, 0x60, 0x48, 0x6c, 0x38, + 0x99, 0x04, 0x60, 0x08, 0x6c, 0xf8, 0x9a, 0x05, + 0x60, 0x50, 0x6c, 0xb8, 0x9a, 0x05, 0x60, 0x10, + 0x68, 0xfd, 0x48, 0xf9, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xda, 0x49, 0xf0, 0x20, 0x91, 0xf0, 0x18, + 0xfd, 0xb9, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x0a, 0xfd, 0xa0, 0xe7, 0xf5, 0x00, 0xa8, + 0x49, 0xeb, 0x58, 0x08, 0x99, 0x03, 0x42, 0x88, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0xe7, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xc4, 0x21, 0x00, + 0x00, 0xa8, 0x4a, 0xe5, 0x50, 0x11, 0x48, 0xe2, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x38, + 0x28, 0x0b, 0xdb, 0x16, 0x69, 0x38, 0x28, 0x12, + 0xdc, 0x13, 0x48, 0xe0, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x06, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x03, + 0x69, 0x38, 0x28, 0x12, 0xdc, 0x00, 0xe0, 0x08, + 0x6b, 0x38, 0xf7, 0xff, 0xf9, 0xb6, 0x90, 0x01, + 0x6a, 0xb9, 0x9a, 0x01, 0x48, 0xd8, 0xf0, 0x0b, + 0xfd, 0x85, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x2e, + 0x69, 0x38, 0x28, 0x12, 0xdc, 0x2b, 0x48, 0xd0, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x20, 0x00, + 0x49, 0xd2, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00, + 0x49, 0xd0, 0x65, 0x48, 0x20, 0x00, 0x49, 0xcf, + 0x65, 0x88, 0x20, 0x00, 0x49, 0xcd, 0x65, 0xc8, + 0x20, 0x00, 0x49, 0xcc, 0x66, 0x08, 0x20, 0x00, + 0x49, 0xcb, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, + 0xf0, 0x04, 0xf9, 0x0a, 0x48, 0xc3, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x04, 0x48, 0xc5, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0xe0, 0x02, 0x48, 0xc3, + 0x49, 0xc3, 0x60, 0x08, 0xe0, 0x06, 0x69, 0x38, + 0x28, 0x13, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x08, 0x48, 0xb6, 0x68, 0x00, + 0x28, 0x00, 0xd1, 0x2c, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfd, 0x64, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb7, + 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, + 0x00, 0xe9, 0x4b, 0xb4, 0x18, 0xc9, 0x60, 0x48, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb1, + 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, 0x43, 0xc0, + 0x00, 0xe9, 0x4b, 0xae, 0x18, 0xc9, 0x64, 0x48, + 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, 0x99, 0x02, + 0x40, 0x08, 0x90, 0x02, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x9c, 0x69, 0x38, + 0x28, 0x0b, 0xdb, 0x74, 0x69, 0x38, 0x28, 0x12, + 0xdc, 0x72, 0x48, 0x9b, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x6f, 0x20, 0x00, 0x49, 0x9d, 0x65, 0x08, + 0x20, 0x01, 0x03, 0x00, 0x49, 0x9b, 0x65, 0x48, + 0x20, 0x00, 0x49, 0x9a, 0x65, 0x88, 0x20, 0x00, + 0x49, 0x98, 0x65, 0xc8, 0x20, 0x00, 0x49, 0x97, + 0x66, 0x08, 0x20, 0x00, 0x49, 0x96, 0x60, 0x08, + 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, + 0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf8, 0xa0, + 0x49, 0x95, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0xf2, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfc, 0x72, 0x20, 0x92, 0x49, 0x90, 0x60, 0x08, + 0x48, 0x90, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, 0x00, 0x40, + 0x49, 0x8c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0x88, 0x20, 0x01, 0x49, 0x89, + 0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x87, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, - 0x66, 0x88, 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, - 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, - 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, 0x90, 0x00, - 0x20, 0x00, 0x62, 0xb8, 0x20, 0x00, 0x62, 0xf8, - 0x48, 0x67, 0x63, 0x38, 0x48, 0x67, 0x63, 0x78, - 0x6b, 0x38, 0xf7, 0xff, 0xfe, 0x9c, 0x90, 0x02, - 0x48, 0x66, 0x68, 0x00, 0x23, 0x77, 0x01, 0x1b, - 0x18, 0xc0, 0x9a, 0x02, 0x1c, 0x39, 0xf0, 0x0b, - 0xfe, 0x05, 0x98, 0x00, 0x49, 0x61, 0x68, 0x09, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, - 0x48, 0x5e, 0x68, 0x00, 0xf0, 0x0c, 0xf9, 0xf8, - 0xb0, 0x01, 0xe1, 0x2b, 0x24, 0x00, 0x26, 0x00, - 0x2e, 0x00, 0xd1, 0x16, 0x2c, 0x07, 0xd2, 0x14, + 0x66, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x83, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7f, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x61, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x7b, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x60, 0xc8, 0x20, 0x00, 0x43, 0xc0, 0x49, 0x77, + 0x68, 0x09, 0x23, 0x0f, 0x01, 0xdb, 0x18, 0xc9, + 0x60, 0x88, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0xd9, + 0x90, 0x01, 0x48, 0x72, 0x68, 0x00, 0x23, 0x77, + 0x01, 0x1b, 0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39, + 0xf0, 0x0b, 0xf8, 0x42, 0xe0, 0x02, 0xe0, 0x23, + 0xe0, 0x22, 0xe0, 0x21, 0x48, 0x67, 0x49, 0x6b, + 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, + 0x66, 0xc8, 0x48, 0x68, 0x68, 0x00, 0x21, 0x00, + 0xf0, 0x0b, 0xf8, 0xb8, 0x48, 0x65, 0x68, 0x00, + 0xf0, 0x0b, 0xfc, 0x2c, 0x49, 0x62, 0x20, 0x91, + 0xf0, 0x18, 0xfc, 0x8c, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x60, 0x68, 0x04, 0x48, 0x60, + 0x68, 0x00, 0x49, 0x5e, 0x60, 0x08, 0x48, 0x5e, + 0x60, 0x04, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x48, 0x52, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, + 0x48, 0x4d, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, + 0x1c, 0x28, 0xf0, 0x0b, 0xfb, 0x9d, 0x28, 0x01, + 0xd1, 0x6a, 0x98, 0x00, 0x28, 0x0b, 0xdb, 0x02, + 0x98, 0x00, 0x28, 0x12, 0xdd, 0x65, 0xb0, 0x84, + 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0x66, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0b, + 0xfb, 0xe6, 0x48, 0x4c, 0x68, 0x00, 0x68, 0x40, + 0x28, 0x00, 0xd0, 0x06, 0x48, 0x49, 0x68, 0x00, + 0x68, 0x40, 0x38, 0x01, 0x49, 0x47, 0x68, 0x09, + 0x60, 0x48, 0x20, 0x92, 0x49, 0x44, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x44, 0x68, 0x09, 0x60, 0x08, + 0x24, 0x00, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, + 0x28, 0x00, 0xd1, 0x15, 0x2c, 0x07, 0xd2, 0x13, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, - 0xe0, 0x00, 0xe1, 0x3c, 0x4a, 0x53, 0x68, 0x12, - 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, - 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, - 0xe7, 0xe6, 0x2e, 0x00, 0xd1, 0x13, 0x2c, 0x18, - 0xd2, 0x11, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, + 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe6, + 0x98, 0x02, 0x28, 0x00, 0xd1, 0x14, 0x2c, 0x18, + 0xd2, 0x12, 0x6a, 0xf8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x23, 0x4c, 0x43, 0x58, - 0x4a, 0x48, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, + 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, - 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe9, 0x3c, 0x01, - 0x6b, 0x38, 0xf7, 0xff, 0xfe, 0x50, 0x90, 0x01, - 0x2c, 0x07, 0xd2, 0x05, 0x48, 0x3f, 0x68, 0x01, - 0x1c, 0x20, 0xf0, 0x0b, 0xfc, 0xcb, 0xe0, 0x06, - 0x2c, 0x18, 0xd2, 0x04, 0x1f, 0xe0, 0x49, 0x3b, - 0x68, 0x09, 0xf0, 0x0b, 0xfd, 0x01, 0x48, 0x3a, - 0x49, 0x38, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, - 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x36, 0x49, 0x35, - 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, - 0x67, 0x08, 0x48, 0x33, 0x49, 0x31, 0x68, 0x09, - 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x66, 0x88, - 0x48, 0x2f, 0x49, 0x2e, 0x68, 0x09, 0x23, 0x09, - 0x01, 0xdb, 0x18, 0xc9, 0x66, 0x48, 0x20, 0x00, - 0x49, 0x2a, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, - 0x18, 0xc9, 0x64, 0x88, 0x6b, 0x79, 0x48, 0x27, - 0x68, 0x00, 0xf0, 0x0b, 0xfd, 0x4b, 0x94, 0x02, - 0x1d, 0xf8, 0x30, 0x21, 0x99, 0x0a, 0xf0, 0x02, - 0xf8, 0x4d, 0x24, 0x00, 0x26, 0x00, 0x2e, 0x00, - 0xd1, 0x14, 0x2c, 0x07, 0xd2, 0x12, 0x6a, 0xf8, - 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, - 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x1b, - 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, - 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 0xda, 0x00, - 0x26, 0x01, 0xe7, 0xe8, 0x2e, 0x00, 0xd1, 0x2f, - 0x2c, 0x18, 0xd2, 0x2d, 0x6a, 0xf8, 0x05, 0x81, - 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x23, 0x4c, - 0x43, 0x58, 0x4a, 0x10, 0x68, 0x12, 0x18, 0x80, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, - 0x42, 0x81, 0xda, 0x1c, 0xe0, 0x1a, 0x00, 0x00, - 0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x7d, 0x9c, - 0x2e, 0x08, 0x7c, 0xc4, 0x2e, 0x08, 0x5e, 0x54, - 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, - 0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xbc, - 0x00, 0x00, 0xff, 0xff, 0x26, 0x01, 0xe7, 0xcd, - 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xfd, 0xc3, - 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x12, 0x48, 0x48, - 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0b, 0xfb, 0xcc, - 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x49, 0x44, - 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, - 0x18, 0xc0, 0x9a, 0x01, 0x1c, 0x39, 0xf0, 0x0b, - 0xfd, 0x21, 0xe0, 0x4a, 0x2c, 0x18, 0xd2, 0x48, - 0x1f, 0xe0, 0x49, 0x3d, 0x68, 0x09, 0xf0, 0x0b, - 0xfc, 0x0b, 0x20, 0x4c, 0x43, 0x60, 0x49, 0x3a, - 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x0a, 0x9a, 0x01, 0x1c, 0x39, 0xf0, 0x0b, - 0xfd, 0x0d, 0x20, 0x4c, 0x43, 0x60, 0x49, 0x34, - 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, - 0x20, 0x4c, 0x43, 0x60, 0x49, 0x2e, 0x68, 0x09, - 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, - 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, - 0x20, 0x4c, 0x43, 0x60, 0x49, 0x28, 0x68, 0x09, - 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, - 0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, - 0x20, 0x02, 0x21, 0x4c, 0x43, 0x61, 0x4a, 0x22, - 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, - 0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, - 0x21, 0x4c, 0x43, 0x61, 0x4a, 0x1c, 0x68, 0x12, - 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, - 0x67, 0x48, 0x48, 0x19, 0x68, 0x00, 0xf0, 0x0c, - 0xf8, 0xcf, 0x6b, 0x79, 0x48, 0x16, 0x68, 0x00, - 0xf0, 0x0b, 0xfc, 0x36, 0x98, 0x02, 0x42, 0x84, - 0xda, 0x01, 0x1c, 0x21, 0xe0, 0x00, 0x99, 0x02, - 0x91, 0x00, 0x99, 0x00, 0x48, 0x10, 0x68, 0x00, - 0xf0, 0x0b, 0xfd, 0x46, 0x49, 0x0f, 0x20, 0x91, - 0xf0, 0x19, 0xf8, 0xfc, 0x28, 0x92, 0xd0, 0x00, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x02, 0xe7, 0xe7, + 0x3c, 0x01, 0x6b, 0x38, 0xf7, 0xff, 0xf8, 0x41, + 0x90, 0x01, 0x2c, 0x07, 0xd2, 0x09, 0x48, 0x25, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfe, 0xbc, + 0x48, 0x22, 0x68, 0x00, 0xf0, 0x0b, 0xfb, 0xa6, + 0xe0, 0x09, 0x2c, 0x18, 0xd2, 0x07, 0xe0, 0x01, + 0xe0, 0x95, 0xe0, 0x94, 0x1f, 0xe0, 0x49, 0x1d, + 0x68, 0x09, 0xf0, 0x0a, 0xfe, 0xeb, 0x48, 0x1b, + 0x68, 0x00, 0x4b, 0x1c, 0x18, 0xc0, 0xf0, 0x0b, + 0xf8, 0x0b, 0x20, 0x00, 0x49, 0x17, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x48, 0x14, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, + 0xd3, 0x2c, 0x48, 0x12, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, + 0x43, 0x18, 0x49, 0x0e, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0xe0, 0x1c, 0x00, 0x00, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, + 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x7d, 0x94, 0xcc, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0xbc, 0x3f, 0xff, 0xff, 0xff, + 0x2e, 0x08, 0x5e, 0x4c, 0x68, 0x00, 0x04, 0x00, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x7d, 0xb8, 0x00, 0x00, 0x04, 0xcc, + 0x61, 0x88, 0xe0, 0x2d, 0x26, 0x01, 0x21, 0x00, + 0x91, 0x00, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, + 0x99, 0x00, 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x06, + 0x99, 0x00, 0x31, 0x01, 0x91, 0x00, 0xe7, 0xf4, + 0x00, 0x70, 0x1c, 0x46, 0xe7, 0xf8, 0x08, 0x76, + 0x00, 0x76, 0x48, 0x23, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0x49, 0x1f, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1c, + 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, + 0x69, 0x80, 0x43, 0x30, 0x49, 0x18, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x1c, 0x21, 0x48, 0x15, 0x68, 0x00, 0xf0, 0x0a, + 0xff, 0xb1, 0x6b, 0x79, 0x48, 0x12, 0x68, 0x00, + 0xf0, 0x0a, 0xfe, 0xe6, 0x1c, 0x28, 0x21, 0x00, + 0xf0, 0x0b, 0xfa, 0x88, 0x49, 0x0f, 0x20, 0x91, + 0xf0, 0x18, 0xfb, 0x80, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, 0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, 0xb0, 0x04, 0x20, 0x92, - 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, - 0xe5, 0x4b, 0xb0, 0x05, 0xe5, 0x49, 0x00, 0x00, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x7c, 0xc8, - 0xb5, 0xff, 0x1c, 0x07, 0x9d, 0x09, 0xb0, 0x89, - 0x26, 0x00, 0x20, 0x00, 0x90, 0x03, 0x99, 0x0a, - 0x68, 0x4c, 0x2d, 0x13, 0xd1, 0x05, 0x20, 0x75, - 0xb0, 0x09, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x98, 0x15, 0x60, 0x04, 0x20, 0x00, - 0x60, 0xe0, 0x20, 0x00, 0x61, 0x20, 0x69, 0x60, - 0x4b, 0xf9, 0x40, 0x18, 0x61, 0x60, 0x02, 0x00, - 0x69, 0x60, 0x4b, 0xf8, 0x40, 0x18, 0x61, 0x60, - 0x04, 0x80, 0x69, 0x60, 0x4b, 0xf6, 0x40, 0x18, - 0x61, 0x60, 0x05, 0x80, 0x69, 0x60, 0x23, 0xc0, - 0x43, 0xdb, 0x40, 0x18, 0x61, 0x60, 0x06, 0x00, - 0x69, 0x60, 0x4b, 0xf2, 0x40, 0x18, 0x61, 0x60, - 0x04, 0x40, 0x69, 0x60, 0x23, 0x20, 0x43, 0xdb, - 0x40, 0x18, 0x61, 0x60, 0x06, 0x80, 0x69, 0x60, - 0x09, 0x40, 0x01, 0x40, 0x61, 0x60, 0x06, 0xc0, - 0x20, 0x00, 0x61, 0xa0, 0x20, 0x00, 0x61, 0xe0, - 0x20, 0x00, 0x62, 0x20, 0x20, 0x00, 0x62, 0x60, - 0x20, 0x00, 0x63, 0xa0, 0x20, 0x00, 0x63, 0xe0, - 0x20, 0x00, 0x64, 0x60, 0x20, 0x00, 0x64, 0x20, - 0x20, 0x00, 0x60, 0x20, 0x20, 0x00, 0x71, 0x20, - 0x99, 0x0a, 0x68, 0x48, 0x64, 0xe0, 0x99, 0x0a, - 0x68, 0x08, 0x64, 0xa0, 0x1d, 0xe0, 0x30, 0x21, - 0x99, 0x13, 0xf0, 0x01, 0xff, 0x07, 0x2d, 0x0b, - 0xdb, 0x06, 0x2d, 0x12, 0xdc, 0x04, 0x1d, 0xe0, - 0x30, 0x49, 0x99, 0x13, 0xf0, 0x01, 0xfe, 0xfe, - 0x6b, 0x20, 0x6a, 0xa1, 0x1a, 0x40, 0x30, 0x01, - 0x63, 0xa0, 0x00, 0xa8, 0x49, 0xd4, 0x58, 0x08, - 0x69, 0x61, 0x09, 0x49, 0x01, 0x49, 0x06, 0xc0, - 0x0e, 0xc0, 0x43, 0x08, 0x61, 0x60, 0x06, 0xc0, - 0x0e, 0xc0, 0x6b, 0x20, 0x6a, 0xa1, 0x1a, 0x40, - 0x1c, 0x41, 0x91, 0x04, 0x69, 0x60, 0x23, 0x04, - 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, - 0x91, 0x04, 0x00, 0xa8, 0x49, 0xc9, 0x58, 0x08, - 0x99, 0x04, 0x43, 0x48, 0x61, 0xe0, 0x2d, 0x13, - 0xd1, 0x04, 0x20, 0x00, 0x90, 0x14, 0x20, 0x00, - 0x61, 0xa0, 0xe0, 0x13, 0x9b, 0x0c, 0x68, 0x58, - 0x90, 0x01, 0x98, 0x01, 0x08, 0x80, 0x61, 0xa0, - 0x98, 0x01, 0x64, 0x60, 0x9b, 0x0c, 0x68, 0x18, - 0x64, 0x20, 0x20, 0x00, 0x62, 0x60, 0x9a, 0x0b, - 0x63, 0xe2, 0x69, 0x60, 0x4b, 0xb6, 0x40, 0x18, - 0x61, 0x60, 0x02, 0x00, 0x69, 0x60, 0x4b, 0xb6, - 0x40, 0x18, 0x61, 0x60, 0x05, 0x80, 0x69, 0x60, - 0x23, 0x0f, 0x02, 0x9b, 0x43, 0x18, 0x61, 0x60, - 0x04, 0x80, 0x69, 0x60, 0x23, 0x20, 0x43, 0xdb, - 0x40, 0x18, 0x61, 0x60, 0x06, 0x80, 0x69, 0x60, - 0x23, 0xc0, 0x43, 0x18, 0x61, 0x60, 0x06, 0x00, - 0x69, 0x60, 0x23, 0x01, 0x03, 0x9b, 0x43, 0x18, - 0x61, 0x60, 0x04, 0x40, 0x98, 0x14, 0x60, 0xe0, - 0x61, 0x25, 0x48, 0xab, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x06, 0x98, 0x14, 0x28, 0x19, 0xd3, 0x01, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe5, 0x86, 0xb0, 0x03, 0xe5, 0x84, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x94, 0x88, + 0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x7c, 0xc0, + 0xb5, 0xf3, 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, + 0x9d, 0x05, 0x9f, 0x06, 0x69, 0x28, 0x90, 0x04, + 0x69, 0x3c, 0x98, 0x04, 0x28, 0x13, 0xd0, 0x01, + 0x2c, 0x13, 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x05, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x68, 0xee, 0x68, 0xf9, 0x91, 0x03, 0x48, 0xdf, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x20, + 0x48, 0xd6, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, + 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, 0x99, 0x03, + 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, + 0x60, 0xe9, 0x60, 0xfe, 0x20, 0x00, 0xb0, 0x05, + 0xe7, 0xce, 0xe1, 0x92, 0x1c, 0x3d, 0x9f, 0x05, + 0x9e, 0x03, 0x68, 0xf9, 0x91, 0x03, 0x9c, 0x04, + 0xe0, 0xaa, 0x48, 0xc6, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, - 0x98, 0x14, 0x28, 0x08, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, - 0x20, 0x00, 0xb0, 0x09, 0xe7, 0x35, 0x49, 0xa1, - 0x20, 0x91, 0xf0, 0x18, 0xff, 0xff, 0x28, 0x92, - 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0b, 0xf8, 0x08, - 0xe7, 0xf5, 0x48, 0x9d, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x53, 0x68, 0x38, 0x01, 0x80, 0x0f, 0xc0, - 0x68, 0xa1, 0x4b, 0x9a, 0x40, 0x19, 0x07, 0xc0, - 0x09, 0x80, 0x43, 0x08, 0x60, 0xa0, 0x01, 0x80, - 0x0f, 0xc0, 0x68, 0x38, 0x01, 0xc0, 0x0f, 0xc0, - 0x68, 0xa1, 0x4b, 0x95, 0x40, 0x19, 0x07, 0xc0, - 0x09, 0xc0, 0x43, 0x08, 0x60, 0xa0, 0x01, 0xc0, - 0x0f, 0xc0, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, - 0x68, 0xa1, 0x4b, 0x85, 0x40, 0x19, 0x06, 0x00, - 0x0e, 0x00, 0x04, 0x00, 0x43, 0x08, 0x60, 0xa0, - 0x02, 0x00, 0x0e, 0x00, 0x48, 0x86, 0x68, 0x00, - 0x28, 0x00, 0xd1, 0x2a, 0x2f, 0x00, 0xd0, 0x28, - 0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00, 0x1c, 0x06, - 0x68, 0x38, 0x4b, 0x85, 0x43, 0x98, 0xd0, 0x06, - 0x68, 0x38, 0x02, 0x00, 0x0e, 0x01, 0x20, 0x01, - 0x40, 0x88, 0x43, 0x06, 0xe0, 0x05, 0x68, 0x38, - 0x02, 0x00, 0x0e, 0x00, 0x21, 0x01, 0x40, 0x81, - 0x43, 0x8e, 0x68, 0x38, 0x4b, 0x7b, 0x43, 0x98, - 0xd0, 0x08, 0x68, 0x38, 0x02, 0x00, 0x0e, 0x00, - 0x1d, 0xc1, 0x31, 0x01, 0x20, 0x01, 0x40, 0x88, - 0x43, 0x06, 0xe0, 0x06, 0x68, 0x38, 0x02, 0x00, - 0x0e, 0x00, 0x30, 0x08, 0x21, 0x01, 0x40, 0x81, - 0x43, 0x8e, 0x2d, 0x0b, 0xdb, 0x0a, 0x2d, 0x12, - 0xdc, 0x08, 0x48, 0x6f, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x04, 0x20, 0x51, 0x01, 0x00, 0x21, 0x0d, - 0x06, 0xc9, 0x60, 0x08, 0x98, 0x14, 0x00, 0x80, - 0x49, 0x6c, 0x58, 0x08, 0x28, 0x00, 0xd0, 0x01, - 0x20, 0x83, 0x90, 0x03, 0x2d, 0x0b, 0xdb, 0x08, - 0x2d, 0x12, 0xdc, 0x06, 0x48, 0x68, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x01, 0x20, 0x84, 0x90, 0x03, - 0xe0, 0x06, 0x9a, 0x0b, 0x2a, 0x01, 0xd1, 0x03, - 0x2d, 0x13, 0xd0, 0x01, 0x20, 0x82, 0x90, 0x03, - 0x98, 0x03, 0x28, 0x00, 0xd0, 0x07, 0x20, 0x92, - 0x49, 0x5a, 0x60, 0x08, 0x20, 0x08, 0x60, 0xe0, - 0x98, 0x03, 0xb0, 0x09, 0xe6, 0xa1, 0x98, 0x15, - 0x68, 0x01, 0x98, 0x14, 0x00, 0x80, 0x4a, 0x59, - 0x50, 0x11, 0x6a, 0xa0, 0x28, 0x00, 0xda, 0x01, - 0x20, 0x00, 0x62, 0xa0, 0x6b, 0x20, 0x28, 0x00, - 0xdc, 0x01, 0x20, 0x01, 0x63, 0x20, 0x6a, 0xe0, - 0x28, 0x00, 0xda, 0x01, 0x20, 0x00, 0x62, 0xe0, - 0x6b, 0x60, 0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, - 0x48, 0x50, 0x63, 0x60, 0x6b, 0x20, 0xf7, 0xff, - 0xfb, 0x9e, 0x90, 0x00, 0x2d, 0x13, 0xd1, 0x05, - 0x6a, 0xa1, 0x9a, 0x00, 0x48, 0x4c, 0xf0, 0x0b, - 0xff, 0x99, 0xe0, 0x15, 0x2d, 0x0b, 0xdb, 0x01, - 0x2d, 0x12, 0xdd, 0x03, 0x48, 0x40, 0x68, 0x00, - 0x28, 0x00, 0xd1, 0x0d, 0x2d, 0x0b, 0xdb, 0x06, - 0x2d, 0x12, 0xdc, 0x04, 0x48, 0x3e, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x00, 0xe0, 0x04, 0x6a, 0xa1, - 0x9a, 0x00, 0x48, 0x41, 0xf0, 0x0b, 0xff, 0x82, - 0x2d, 0x0b, 0xdb, 0x5f, 0x2d, 0x12, 0xdc, 0x5e, - 0x98, 0x15, 0x68, 0x00, 0x49, 0x3a, 0x60, 0x08, - 0x99, 0x13, 0xa8, 0x05, 0xf0, 0x01, 0xfd, 0xae, - 0xa9, 0x05, 0x98, 0x15, 0x68, 0x00, 0xf0, 0x05, - 0xfc, 0x5f, 0x1d, 0xe0, 0x30, 0x21, 0xa9, 0x05, - 0xf0, 0x01, 0xfd, 0xa4, 0x20, 0x01, 0x49, 0x35, - 0x65, 0x08, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, - 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, - 0xfa, 0xdd, 0x2d, 0x0b, 0xd0, 0x05, 0x2d, 0x0f, - 0xd0, 0x03, 0x2d, 0x10, 0xd0, 0x01, 0x2d, 0x11, - 0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x04, - 0xfa, 0xd1, 0x2d, 0x0c, 0xd0, 0x01, 0x2d, 0x0f, - 0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x04, - 0xfa, 0xc9, 0x2d, 0x0d, 0xd0, 0x01, 0x2d, 0x10, - 0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x04, - 0xfa, 0xc1, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, - 0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x04, - 0xfa, 0xb9, 0x48, 0x15, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x73, 0xb0, 0x82, 0x49, 0x1c, 0x20, 0x91, - 0xf0, 0x18, 0xfe, 0xe4, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0xf0, 0x0b, 0xfe, 0x86, 0x20, 0x92, - 0x49, 0x17, 0x60, 0x08, 0x20, 0x01, 0x49, 0x17, - 0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x15, - 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, - 0x66, 0x88, 0xe0, 0x25, 0xe0, 0xae, 0xe0, 0xad, - 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xbf, 0xff, - 0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x03, 0x32, 0xf4, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x60, 0x8c, 0xfd, 0xff, 0xff, 0xff, - 0xfe, 0xff, 0xff, 0xff, 0x2e, 0x08, 0x7c, 0x60, - 0x2e, 0x08, 0x7c, 0xc4, 0x00, 0x00, 0x02, 0x3f, - 0x2e, 0x08, 0x7d, 0x9c, 0xcc, 0x00, 0x00, 0x00, - 0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xbc, - 0x6a, 0xa0, 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, - 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, - 0x31, 0x02, 0x43, 0x08, 0x90, 0x00, 0x20, 0x00, - 0x62, 0xa0, 0x20, 0x00, 0x62, 0xe0, 0x48, 0x5f, - 0x63, 0x20, 0x48, 0x5f, 0x63, 0x60, 0x6b, 0x20, - 0xf7, 0xff, 0xfa, 0xe1, 0x90, 0x02, 0x48, 0x5d, - 0x68, 0x00, 0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, - 0x9a, 0x02, 0x1c, 0x21, 0xf0, 0x0b, 0xfa, 0x4a, - 0x98, 0x00, 0x49, 0x58, 0x68, 0x09, 0x23, 0x07, - 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x55, - 0x68, 0x00, 0x21, 0x00, 0xf0, 0x0b, 0xfa, 0xc4, - 0x48, 0x52, 0x68, 0x00, 0xf0, 0x0b, 0xfe, 0x38, - 0x49, 0x51, 0x20, 0x91, 0xf0, 0x18, 0xfe, 0x76, - 0xe0, 0x00, 0xe0, 0x11, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf6, 0x48, 0x4c, 0x68, 0x00, 0x90, 0x01, - 0x48, 0x4c, 0x68, 0x00, 0x49, 0x49, 0x60, 0x08, - 0x98, 0x01, 0x49, 0x4a, 0x60, 0x08, 0x20, 0x92, - 0x49, 0x47, 0x60, 0x08, 0xb0, 0x02, 0xe0, 0x40, - 0x48, 0x47, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0c, - 0x6a, 0xa0, 0x30, 0x01, 0x05, 0x00, 0x6a, 0xe1, - 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 0x6b, 0x61, - 0x31, 0x02, 0x43, 0x08, 0x49, 0x41, 0x60, 0x08, - 0xe0, 0x0c, 0x6a, 0xa0, 0x30, 0x01, 0x05, 0x00, - 0x6a, 0xe1, 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, - 0x6b, 0x61, 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, - 0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d, 0x06, 0xc0, - 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, - 0x06, 0xc9, 0x60, 0x88, 0xf0, 0x00, 0xfe, 0x82, - 0x48, 0x33, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x07, - 0x20, 0x00, 0x62, 0xa0, 0x20, 0x00, 0x62, 0xe0, - 0x48, 0x2a, 0x63, 0x20, 0x48, 0x2a, 0x63, 0x60, - 0x6b, 0x20, 0xf7, 0xff, 0xfa, 0x78, 0x90, 0x00, - 0x9a, 0x00, 0x99, 0x14, 0x1c, 0x20, 0xf0, 0x00, - 0xfd, 0xfb, 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, - 0x60, 0x88, 0xe0, 0x05, 0x2d, 0x13, 0xd1, 0x03, - 0x20, 0x1f, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, - 0x2d, 0x0b, 0xdb, 0x01, 0x2d, 0x12, 0xdd, 0x1a, - 0x48, 0x23, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, + 0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x73, + 0x49, 0xbd, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0xfe, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, + 0xfa, 0xe5, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xb9, + 0x58, 0x08, 0x42, 0xa8, 0xd1, 0x05, 0x99, 0x03, + 0x00, 0x88, 0x49, 0xb6, 0x58, 0x08, 0x42, 0xb8, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0xb2, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe7, 0x98, 0x48, 0xb2, + 0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, 0x48, 0xb0, + 0x68, 0x00, 0x42, 0xb8, 0xd1, 0x0a, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0xc0, 0x90, 0x01, 0x98, 0x01, + 0x28, 0x01, 0xd1, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x99, 0x03, 0x60, 0xe9, + 0x60, 0xfe, 0x00, 0xb0, 0x49, 0xa5, 0x50, 0x0f, + 0x99, 0x03, 0x00, 0x88, 0x49, 0xa3, 0x50, 0x0d, + 0x48, 0xa0, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x55, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, - 0xf0, 0x00, 0xfe, 0x50, 0x6b, 0x20, 0xf7, 0xff, - 0xfa, 0x52, 0x90, 0x00, 0x9a, 0x00, 0x99, 0x14, - 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xd5, 0x98, 0x02, - 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0x48, 0x14, - 0x68, 0x00, 0x28, 0x01, 0xd1, 0x06, 0x48, 0x14, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x0d, - 0x06, 0xc0, 0x62, 0x06, 0x48, 0x0e, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x07, 0x48, 0x0e, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x03, 0x98, 0x14, 0x21, 0x00, - 0xf0, 0x0b, 0xfd, 0x0a, 0x20, 0x92, 0x49, 0x0b, - 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, 0xe5, 0x10, - 0xb0, 0x09, 0xe5, 0x0e, 0x00, 0x00, 0x02, 0xcf, - 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x7d, 0xbc, - 0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xc0, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x5e, 0x54, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0xb5, 0xf7, 0xb0, 0x83, 0x9f, 0x03, 0x69, 0x38, - 0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x05, - 0x20, 0x75, 0xb0, 0x03, 0xb0, 0x03, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x6c, 0x78, 0x99, 0x04, - 0x60, 0x48, 0x6c, 0x38, 0x99, 0x04, 0x60, 0x08, - 0x6c, 0xf8, 0x9a, 0x05, 0x60, 0x50, 0x6c, 0xb8, - 0x9a, 0x05, 0x60, 0x10, 0x68, 0xfd, 0x48, 0xf9, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, + 0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x40, 0x08, + 0xd1, 0x12, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0b, 0x99, 0x03, + 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x99, 0x02, + 0x40, 0x08, 0x90, 0x02, 0x20, 0x01, 0x40, 0xb0, + 0x99, 0x02, 0x43, 0x08, 0x90, 0x02, 0xe0, 0x11, + 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, + 0x40, 0x08, 0xd1, 0x0b, 0x20, 0x01, 0x40, 0xb0, + 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, + 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, + 0x43, 0x08, 0x90, 0x02, 0x6b, 0x28, 0xf7, 0xfe, + 0xfe, 0xbc, 0x90, 0x00, 0x9a, 0x00, 0xe0, 0x00, + 0xe0, 0x22, 0x99, 0x03, 0x1c, 0x28, 0xf0, 0x00, + 0xfa, 0x3d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0xb1, + 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, + 0xf0, 0x00, 0xfa, 0x34, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x48, 0x7c, 0x68, 0x00, + 0x42, 0xa8, 0xd0, 0x03, 0x48, 0x7a, 0x68, 0x00, + 0x42, 0xb8, 0xd1, 0x03, 0x98, 0x01, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, 0x49, 0x74, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x1b, + 0x49, 0x71, 0x20, 0x91, 0xf0, 0x18, 0xfa, 0x66, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, + 0xfa, 0x4d, 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x6d, + 0x58, 0x08, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x69, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, + 0xe7, 0x06, 0x2c, 0x0b, 0xdb, 0x12, 0x2c, 0x12, + 0xdc, 0x10, 0x48, 0x67, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x09, 0x48, 0x65, 0x68, 0x00, 0x42, 0xa8, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xf4, 0x48, 0x60, + 0x60, 0x07, 0xe0, 0x08, 0x6b, 0xf8, 0x28, 0x01, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x5a, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x05, 0xe6, 0xe8, 0x48, 0x5a, + 0x68, 0x00, 0x42, 0xa8, 0xd1, 0x02, 0x20, 0x00, + 0x49, 0x57, 0x60, 0x08, 0x00, 0xb0, 0x49, 0x55, + 0x50, 0x0f, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, + 0x48, 0x50, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x73, + 0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0x4e, 0x90, 0x00, + 0x6a, 0xa9, 0x9a, 0x00, 0x48, 0x4f, 0xf0, 0x0b, + 0xfa, 0x1d, 0x6b, 0x38, 0xf7, 0xfe, 0xfe, 0x45, + 0x90, 0x00, 0x6a, 0xb9, 0x9a, 0x00, 0x48, 0x4b, + 0xf0, 0x0b, 0xfa, 0x42, 0x48, 0x48, 0x68, 0x00, + 0x42, 0xa8, 0xd1, 0x0f, 0x20, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x2c, 0x0b, 0xdb, 0x01, + 0x2c, 0x12, 0xdd, 0x07, 0x21, 0x00, 0x20, 0x02, + 0xf0, 0x03, 0xfd, 0xae, 0x48, 0x42, 0x21, 0x0d, + 0x06, 0xc9, 0x61, 0x88, 0x2c, 0x0b, 0xdb, 0x42, + 0x2c, 0x12, 0xdc, 0x40, 0x98, 0x04, 0x42, 0xa0, + 0xd0, 0x2c, 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, 0xf0, 0x03, + 0xfd, 0x9b, 0x2c, 0x0f, 0xd0, 0x05, 0x2c, 0x10, + 0xd0, 0x03, 0x2c, 0x11, 0xd0, 0x01, 0x2c, 0x0b, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x12, 0xf0, 0x03, + 0xfd, 0x8f, 0x2c, 0x0c, 0xd0, 0x01, 0x2c, 0x0f, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x04, 0xf0, 0x03, + 0xfd, 0x87, 0x2c, 0x0d, 0xd0, 0x01, 0x2c, 0x10, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x08, 0xf0, 0x03, + 0xfd, 0x7f, 0x2c, 0x0e, 0xd0, 0x01, 0x2c, 0x11, + 0xd1, 0x03, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x03, + 0xfd, 0x77, 0xe0, 0x03, 0x20, 0x00, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0xc8, 0x6a, 0xb8, 0x30, 0x01, + 0x05, 0x00, 0x6a, 0xf9, 0x31, 0x01, 0x02, 0x89, + 0x43, 0x08, 0x6b, 0x79, 0x31, 0x02, 0x43, 0x08, + 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, 0x20, 0x0d, + 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, + 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0xe0, 0x00, + 0xe0, 0x1f, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, + 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, 0xf0, 0x00, + 0xf9, 0xcf, 0x6b, 0x38, 0xf7, 0xfe, 0xfd, 0xd1, + 0x90, 0x00, 0x9a, 0x00, 0x1c, 0x31, 0x1c, 0x38, + 0xf0, 0x00, 0xf9, 0x54, 0x98, 0x02, 0x21, 0x0d, + 0x06, 0xc9, 0x60, 0x88, 0x2c, 0x0b, 0xdb, 0x08, + 0x2c, 0x12, 0xdc, 0x06, 0x98, 0x04, 0x42, 0xa0, + 0xd1, 0x03, 0x20, 0x01, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0xc8, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe6, 0x3c, 0xb0, 0x05, + 0xe6, 0x3a, 0xe6, 0x39, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, + 0x2e, 0x08, 0x7c, 0xbc, 0x2e, 0x08, 0x7d, 0x94, + 0x3f, 0xff, 0xff, 0xff, 0xb5, 0xf0, 0x1c, 0x07, + 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1c, 0x7d, + 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, + 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x9a, 0x1c, 0x06, + 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x1d, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf0, 0x1c, 0x07, + 0x00, 0xb8, 0x49, 0x09, 0x58, 0x0c, 0x1e, 0x7d, + 0x60, 0xe5, 0x00, 0xa8, 0x49, 0x06, 0x50, 0x0c, + 0x6b, 0x20, 0xf7, 0xfe, 0xfd, 0x82, 0x1c, 0x06, + 0x1c, 0x32, 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x05, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x86, 0x98, 0x06, 0x90, 0x05, 0x98, 0x05, + 0x68, 0xc5, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0xff, 0xb0, 0x06, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x05, 0x69, 0x00, 0x28, 0x13, 0xd1, 0x02, + 0x20, 0xff, 0xb0, 0x06, 0xe7, 0xf4, 0x49, 0x69, + 0x20, 0x91, 0xf0, 0x18, 0xf9, 0x23, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xf9, 0x0a, + 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x64, 0x58, 0x08, + 0x99, 0x05, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x06, + 0xe7, 0xde, 0x42, 0xbd, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x5c, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, + 0xe7, 0xd6, 0x20, 0x00, 0x00, 0xa9, 0x4a, 0x5a, + 0x50, 0x50, 0x98, 0x05, 0x60, 0xc7, 0x48, 0x59, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x0d, 0x48, 0x54, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x09, 0x99, 0x05, + 0x00, 0xb8, 0x4a, 0x53, 0x50, 0x11, 0x20, 0x92, + 0x49, 0x50, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, + 0xe7, 0xbe, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x1c, 0x04, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, + 0x60, 0x88, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, + 0x4b, 0x4b, 0x18, 0xc9, 0x60, 0x08, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x48, 0x18, 0xc9, + 0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, + 0x4b, 0x45, 0x18, 0xc9, 0x64, 0x08, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x42, 0x18, 0xc9, + 0x64, 0x48, 0x20, 0x01, 0x90, 0x01, 0x20, 0x01, + 0x40, 0xa8, 0x40, 0x20, 0xd1, 0x01, 0x20, 0x00, + 0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x43, 0xc0, + 0x40, 0x04, 0x1c, 0x3e, 0x42, 0xbd, 0xd9, 0x23, + 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x01, 0x36, 0x01, 0xe7, 0xf8, 0x1e, 0x70, + 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xda, 0x04, + 0xe0, 0x07, 0x98, 0x04, 0x38, 0x01, 0x90, 0x04, + 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x32, + 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb8, 0x90, 0x03, + 0x20, 0xff, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x03, + 0x40, 0x08, 0x90, 0x03, 0x98, 0x03, 0x00, 0x40, + 0x90, 0x03, 0x00, 0x60, 0x90, 0x00, 0xe0, 0x1f, + 0x00, 0xb0, 0x49, 0x25, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x01, 0x3e, 0x01, 0xe7, 0xf8, 0x1c, 0x70, + 0x90, 0x04, 0x98, 0x04, 0x42, 0xb8, 0xd9, 0x04, + 0xe0, 0x07, 0x98, 0x04, 0x30, 0x01, 0x90, 0x04, + 0xe7, 0xf7, 0x98, 0x04, 0xf7, 0xff, 0xff, 0x26, + 0xe7, 0xf7, 0x20, 0xff, 0x40, 0xb0, 0x90, 0x03, + 0x20, 0xff, 0x40, 0xb8, 0x43, 0xc0, 0x99, 0x03, + 0x40, 0x08, 0x90, 0x03, 0x08, 0x60, 0x90, 0x00, + 0x98, 0x00, 0x99, 0x03, 0x40, 0x08, 0x90, 0x00, + 0x98, 0x03, 0x43, 0x84, 0x98, 0x00, 0x43, 0x04, + 0x20, 0x01, 0x40, 0xb8, 0x43, 0xc0, 0x40, 0x04, + 0x98, 0x01, 0x40, 0xb8, 0x43, 0x04, 0x99, 0x05, + 0x00, 0xb8, 0x4a, 0x0d, 0x50, 0x11, 0x98, 0x05, + 0x6b, 0x00, 0xf7, 0xfe, 0xfc, 0x92, 0x90, 0x02, + 0x9a, 0x02, 0x1c, 0x39, 0x98, 0x05, 0xf0, 0x00, + 0xf8, 0x15, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x84, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x06, 0xe7, 0x25, 0xb0, 0x06, 0xe7, 0x23, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, + 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, + 0x68, 0x00, 0x04, 0x00, 0xb5, 0xf7, 0x1c, 0x04, + 0x1c, 0x0f, 0x01, 0x3d, 0x4b, 0x2f, 0x18, 0xe9, + 0x1d, 0xe2, 0x32, 0x0d, 0x20, 0x00, 0x28, 0x03, + 0xd3, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xca, 0x20, 0xc1, 0x20, 0xe7, 0xfa, 0x6a, 0xe3, + 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x28, + 0x18, 0xf3, 0x60, 0x1d, 0x6b, 0x63, 0x33, 0x01, + 0x05, 0x9d, 0x0d, 0xad, 0x00, 0xfe, 0x4b, 0x24, + 0x18, 0xf3, 0x60, 0x5d, 0x6a, 0xa5, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x20, + 0x18, 0xf3, 0x64, 0x1d, 0x9d, 0x02, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x1d, 0x00, 0xfe, 0x4b, 0x1c, + 0x18, 0xf3, 0x64, 0x5d, 0x4b, 0x1b, 0x68, 0x1b, + 0x2b, 0x01, 0xd1, 0x2a, 0x2f, 0x00, 0xd1, 0x28, + 0x4b, 0x17, 0x68, 0x5d, 0x23, 0x8f, 0x00, 0x9b, + 0x42, 0x9d, 0xd3, 0x03, 0x23, 0x8f, 0x00, 0x9b, + 0x4d, 0x13, 0x60, 0x6b, 0x4b, 0x12, 0x68, 0x1d, + 0x4b, 0x13, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x12, + 0x4d, 0x0f, 0x60, 0x2b, 0x4b, 0x0e, 0x6c, 0x5d, + 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x23, 0xb3, + 0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x0d, + 0x4d, 0x09, 0x64, 0x6b, 0x4b, 0x08, 0x6c, 0x1d, + 0x23, 0x01, 0x02, 0x9b, 0x1a, 0xed, 0x4b, 0x0a, + 0x42, 0x9d, 0xd3, 0x02, 0x4b, 0x09, 0x4d, 0x04, + 0x64, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x68, 0x00, 0x0c, 0x00, + 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x60, 0x84, + 0x00, 0x00, 0x02, 0x3a, 0x00, 0x00, 0x06, 0xcc, + 0x00, 0x00, 0x02, 0xca, 0x00, 0x00, 0x06, 0xca, + 0xb4, 0xf0, 0x4f, 0x15, 0x4c, 0x15, 0x20, 0x00, + 0x21, 0x00, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x14, + 0x68, 0x6d, 0x42, 0x85, 0xdd, 0x1b, 0x1c, 0x05, + 0x30, 0x01, 0x00, 0xad, 0x59, 0x7b, 0x42, 0x93, + 0xd0, 0xf9, 0x4d, 0x0f, 0x68, 0x6d, 0x42, 0x85, + 0xda, 0x00, 0xe0, 0x10, 0x31, 0x01, 0x1c, 0x05, + 0x30, 0x01, 0x00, 0xad, 0x59, 0x7a, 0x42, 0x93, + 0xd0, 0xf9, 0x02, 0x95, 0x43, 0x1d, 0x1c, 0x2e, + 0xc4, 0x40, 0x4d, 0x07, 0x68, 0x6d, 0x42, 0x85, + 0xdb, 0x00, 0x31, 0x01, 0xe7, 0xdf, 0x25, 0x0d, + 0x06, 0xed, 0x61, 0x29, 0xbc, 0xf0, 0x47, 0x70, + 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x40, + 0x2e, 0x08, 0x7d, 0x94, 0xb5, 0xf3, 0xb0, 0x82, + 0x9d, 0x02, 0x69, 0x2c, 0x2c, 0x13, 0xd1, 0x05, + 0x20, 0x75, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x48, 0xf8, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, - 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xda, 0x49, 0xf0, - 0x20, 0x91, 0xf0, 0x18, 0xfd, 0x97, 0x28, 0x92, - 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x0a, 0xfd, 0xa0, - 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0xeb, 0x58, 0x08, - 0x99, 0x03, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, - 0x49, 0xe7, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, - 0xe7, 0xc4, 0x21, 0x00, 0x00, 0xa8, 0x4a, 0xe5, - 0x50, 0x11, 0x48, 0xe2, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x05, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x16, - 0x69, 0x38, 0x28, 0x12, 0xdc, 0x13, 0x48, 0xe0, - 0x68, 0x00, 0x28, 0x01, 0xd1, 0x06, 0x69, 0x38, - 0x28, 0x0b, 0xdb, 0x03, 0x69, 0x38, 0x28, 0x12, - 0xdc, 0x00, 0xe0, 0x08, 0x6b, 0x38, 0xf7, 0xff, - 0xf9, 0xb6, 0x90, 0x01, 0x6a, 0xb9, 0x9a, 0x01, - 0x48, 0xd8, 0xf0, 0x0b, 0xfd, 0x85, 0x69, 0x38, - 0x28, 0x0b, 0xdb, 0x2e, 0x69, 0x38, 0x28, 0x12, - 0xdc, 0x2b, 0x48, 0xd0, 0x68, 0x00, 0x28, 0x00, - 0xd1, 0x27, 0x20, 0x00, 0x49, 0xd2, 0x65, 0x08, - 0x20, 0x01, 0x03, 0x00, 0x49, 0xd0, 0x65, 0x48, - 0x20, 0x00, 0x49, 0xcf, 0x65, 0x88, 0x20, 0x00, - 0x49, 0xcd, 0x65, 0xc8, 0x20, 0x00, 0x49, 0xcc, - 0x66, 0x08, 0x20, 0x00, 0x49, 0xcb, 0x60, 0x08, - 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, - 0x21, 0x00, 0x20, 0x02, 0xf0, 0x04, 0xf9, 0x0a, - 0x48, 0xc3, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, - 0x48, 0xc5, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, - 0xe0, 0x02, 0x48, 0xc3, 0x49, 0xc3, 0x60, 0x08, - 0xe0, 0x06, 0x69, 0x38, 0x28, 0x13, 0xd1, 0x03, - 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x08, - 0x48, 0xb6, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x2c, - 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, 0x90, 0x02, - 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, - 0xf0, 0x00, 0xfd, 0x64, 0x20, 0x00, 0x43, 0xc0, - 0x00, 0xe9, 0x4b, 0xb7, 0x18, 0xc9, 0x60, 0x08, - 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xb4, - 0x18, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x43, 0xc0, - 0x00, 0xe9, 0x4b, 0xb1, 0x18, 0xc9, 0x64, 0x08, - 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0xae, - 0x18, 0xc9, 0x64, 0x48, 0x20, 0x01, 0x40, 0xa8, - 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, - 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, - 0xe0, 0x9c, 0x69, 0x38, 0x28, 0x0b, 0xdb, 0x74, - 0x69, 0x38, 0x28, 0x12, 0xdc, 0x72, 0x48, 0x9b, - 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, 0x20, 0x00, - 0x49, 0x9d, 0x65, 0x08, 0x20, 0x01, 0x03, 0x00, - 0x49, 0x9b, 0x65, 0x48, 0x20, 0x00, 0x49, 0x9a, - 0x65, 0x88, 0x20, 0x00, 0x49, 0x98, 0x65, 0xc8, - 0x20, 0x00, 0x49, 0x97, 0x66, 0x08, 0x20, 0x00, - 0x49, 0x96, 0x60, 0x08, 0x20, 0x02, 0x21, 0x0d, - 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, 0x20, 0x02, - 0xf0, 0x04, 0xf8, 0xa0, 0x49, 0x95, 0x20, 0x91, - 0xf0, 0x18, 0xfc, 0xd0, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0xf0, 0x0b, 0xfc, 0x72, 0x20, 0x92, - 0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x00, + 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0xef, + 0x20, 0x91, 0xf0, 0x17, 0xff, 0x83, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xff, 0x6a, + 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0xea, 0x58, 0x08, + 0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0xe6, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, + 0xe7, 0xd0, 0x48, 0xe3, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x16, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x90, 0x01, 0x99, 0x03, 0x29, 0x01, 0xd1, 0x05, + 0x20, 0x01, 0x40, 0xb0, 0x99, 0x01, 0x43, 0x08, + 0x90, 0x01, 0xe0, 0x05, 0x20, 0x01, 0x40, 0xb0, + 0x43, 0xc0, 0x99, 0x01, 0x40, 0x08, 0x90, 0x01, + 0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, + 0x48, 0xd8, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x73, + 0x48, 0xd3, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x6f, + 0x99, 0x03, 0x29, 0x01, 0xd1, 0x6c, 0xb0, 0x83, + 0x1c, 0x30, 0xf0, 0x0a, 0xfe, 0x71, 0x28, 0x01, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0xcd, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x9e, 0x49, 0xce, + 0x20, 0x91, 0xf0, 0x17, 0xff, 0x3b, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfe, 0xbb, + 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x06, + 0x48, 0xc8, 0x68, 0x00, 0x68, 0x40, 0x30, 0x01, + 0x49, 0xc6, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, + 0x49, 0xc3, 0x60, 0x08, 0x20, 0x01, 0x49, 0xc3, + 0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, + 0x2c, 0x12, 0xdc, 0x0f, 0x48, 0xbf, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, - 0x08, 0x40, 0x00, 0x40, 0x49, 0x8c, 0x68, 0x09, + 0x23, 0x01, 0x43, 0x18, 0x49, 0xbb, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, - 0x20, 0x01, 0x49, 0x89, 0x68, 0x09, 0x60, 0x08, - 0x20, 0x01, 0x49, 0x87, 0x68, 0x09, 0x23, 0x07, - 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x20, 0x00, - 0x43, 0xc0, 0x49, 0x83, 0x68, 0x09, 0x23, 0x0f, - 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x08, 0x20, 0x00, - 0x43, 0xc0, 0x49, 0x7f, 0x68, 0x09, 0x23, 0x0f, - 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x48, 0x20, 0x00, - 0x43, 0xc0, 0x49, 0x7b, 0x68, 0x09, 0x23, 0x0f, - 0x01, 0xdb, 0x18, 0xc9, 0x60, 0xc8, 0x20, 0x00, - 0x43, 0xc0, 0x49, 0x77, 0x68, 0x09, 0x23, 0x0f, - 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x88, 0x6b, 0x38, - 0xf7, 0xff, 0xf8, 0xd9, 0x90, 0x01, 0x48, 0x72, - 0x68, 0x00, 0x23, 0x77, 0x01, 0x1b, 0x18, 0xc0, - 0x9a, 0x01, 0x1c, 0x39, 0xf0, 0x0b, 0xf8, 0x42, - 0xe0, 0x02, 0xe0, 0x23, 0xe0, 0x22, 0xe0, 0x21, - 0x48, 0x67, 0x49, 0x6b, 0x68, 0x09, 0x23, 0x07, - 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, 0x48, 0x68, - 0x68, 0x00, 0x21, 0x00, 0xf0, 0x0b, 0xf8, 0xb8, - 0x48, 0x65, 0x68, 0x00, 0xf0, 0x0b, 0xfc, 0x2c, - 0x49, 0x62, 0x20, 0x91, 0xf0, 0x18, 0xfc, 0x6a, - 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x60, - 0x68, 0x04, 0x48, 0x60, 0x68, 0x00, 0x49, 0x5e, - 0x60, 0x08, 0x48, 0x5e, 0x60, 0x04, 0x20, 0x92, - 0x49, 0x5a, 0x60, 0x08, 0x48, 0x52, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x73, 0x48, 0x4d, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x6f, 0x1c, 0x28, 0xf0, 0x0b, - 0xfb, 0x9d, 0x28, 0x01, 0xd1, 0x6a, 0x98, 0x00, - 0x28, 0x0b, 0xdb, 0x02, 0x98, 0x00, 0x28, 0x12, - 0xdd, 0x65, 0xb0, 0x84, 0x49, 0x4f, 0x20, 0x91, - 0xf0, 0x18, 0xfc, 0x44, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0xf0, 0x0b, 0xfb, 0xe6, 0x48, 0x4c, - 0x68, 0x00, 0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, - 0x48, 0x49, 0x68, 0x00, 0x68, 0x40, 0x38, 0x01, - 0x49, 0x47, 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, - 0x49, 0x44, 0x60, 0x08, 0x20, 0x01, 0x49, 0x44, - 0x68, 0x09, 0x60, 0x08, 0x24, 0x00, 0x20, 0x00, - 0x90, 0x02, 0x98, 0x02, 0x28, 0x00, 0xd1, 0x15, - 0x2c, 0x07, 0xd2, 0x13, 0x6a, 0xf8, 0x05, 0x81, - 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, 0x00, 0x83, - 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x3a, 0x68, 0x12, + 0x27, 0x00, 0xe0, 0xbc, 0x27, 0x00, 0x20, 0x00, + 0x90, 0x01, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x15, + 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0x4a, 0xaf, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, - 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, - 0x90, 0x02, 0xe7, 0xe6, 0x98, 0x02, 0x28, 0x00, - 0xd1, 0x14, 0x2c, 0x18, 0xd2, 0x12, 0x6a, 0xf8, - 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x20, 0x34, 0x01, - 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x2e, 0x68, 0x12, + 0x6f, 0xc0, 0x42, 0x81, 0xda, 0x01, 0x20, 0x01, + 0x90, 0x01, 0xe7, 0xe6, 0x98, 0x01, 0x28, 0x00, + 0xd1, 0x16, 0x2f, 0x18, 0xd2, 0x14, 0x6a, 0xe8, + 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, + 0x23, 0x4c, 0x43, 0x58, 0x4a, 0xa3, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, - 0x69, 0x40, 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, - 0x90, 0x02, 0xe7, 0xe7, 0x3c, 0x01, 0x6b, 0x38, - 0xf7, 0xff, 0xf8, 0x41, 0x90, 0x01, 0x2c, 0x07, - 0xd2, 0x09, 0x48, 0x25, 0x68, 0x01, 0x1c, 0x20, - 0xf0, 0x0a, 0xfe, 0xbc, 0x48, 0x22, 0x68, 0x00, - 0xf0, 0x0b, 0xfb, 0xa6, 0xe0, 0x09, 0x2c, 0x18, - 0xd2, 0x07, 0xe0, 0x01, 0xe0, 0x95, 0xe0, 0x94, - 0x1f, 0xe0, 0x49, 0x1d, 0x68, 0x09, 0xf0, 0x0a, - 0xfe, 0xeb, 0x48, 0x1b, 0x68, 0x00, 0x4b, 0x1c, - 0x18, 0xc0, 0xf0, 0x0b, 0xf8, 0x0b, 0x20, 0x00, - 0x49, 0x17, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, - 0x18, 0xc9, 0x64, 0x88, 0x48, 0x14, 0x68, 0x00, - 0x68, 0x40, 0x28, 0x07, 0xd3, 0x2c, 0x48, 0x12, - 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, - 0x69, 0x80, 0x23, 0xfe, 0x43, 0x18, 0x49, 0x0e, - 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0xe0, 0x1c, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x7d, 0x9c, - 0xcc, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, - 0x3f, 0xff, 0xff, 0xff, 0x2e, 0x08, 0x5e, 0x54, - 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, - 0x00, 0x00, 0x04, 0xcc, 0x61, 0x88, 0xe0, 0x2d, - 0x26, 0x01, 0x21, 0x00, 0x91, 0x00, 0x48, 0x2b, - 0x68, 0x00, 0x68, 0x40, 0x99, 0x00, 0x42, 0x88, - 0xd8, 0x04, 0xe0, 0x06, 0x99, 0x00, 0x31, 0x01, - 0x91, 0x00, 0xe7, 0xf4, 0x00, 0x70, 0x1c, 0x46, - 0xe7, 0xf8, 0x08, 0x76, 0x00, 0x76, 0x48, 0x23, - 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, - 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0x49, 0x1f, - 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0x61, 0x88, 0x48, 0x1c, 0x68, 0x00, 0x23, 0x0d, - 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x43, 0x30, - 0x49, 0x18, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x21, 0x48, 0x15, - 0x68, 0x00, 0xf0, 0x0a, 0xff, 0xb1, 0x6b, 0x79, - 0x48, 0x12, 0x68, 0x00, 0xf0, 0x0a, 0xfe, 0xe6, - 0x1c, 0x28, 0x21, 0x00, 0xf0, 0x0b, 0xfa, 0x88, - 0x49, 0x0f, 0x20, 0x91, 0xf0, 0x18, 0xfb, 0x5e, - 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, - 0x68, 0x00, 0x90, 0x03, 0x48, 0x0b, 0x68, 0x00, - 0x49, 0x08, 0x60, 0x08, 0x98, 0x03, 0x49, 0x09, - 0x60, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, - 0xb0, 0x04, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x03, 0xe5, 0x86, 0xb0, 0x03, - 0xe5, 0x84, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xbc, - 0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xc0, - 0x2e, 0x08, 0x7c, 0xc8, 0xb5, 0xf3, 0xb0, 0x85, - 0x20, 0x00, 0x90, 0x01, 0x9d, 0x05, 0x9f, 0x06, - 0x69, 0x28, 0x90, 0x04, 0x69, 0x3c, 0x98, 0x04, - 0x28, 0x13, 0xd0, 0x01, 0x2c, 0x13, 0xd1, 0x05, - 0x20, 0xff, 0xb0, 0x05, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, 0x68, 0xf9, - 0x91, 0x03, 0x48, 0xdf, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2e, 0x08, - 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0x28, 0x00, 0xd0, 0x20, 0x48, 0xd6, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, 0x29, 0x19, - 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0xe0, 0x05, 0x99, 0x03, 0x29, 0x08, 0xd3, 0x01, - 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, - 0xd0, 0x06, 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, - 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xce, 0xe1, 0x92, - 0x1c, 0x3d, 0x9f, 0x05, 0x9e, 0x03, 0x68, 0xf9, - 0x91, 0x03, 0x9c, 0x04, 0xe0, 0xaa, 0x48, 0xc6, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x99, 0x03, - 0x29, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, - 0x20, 0x00, 0xe0, 0x05, 0x99, 0x03, 0x29, 0x08, + 0x69, 0x40, 0x42, 0x81, 0xda, 0x03, 0xe0, 0x00, + 0xe0, 0xb0, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe5, + 0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, 0xfb, 0x01, + 0x90, 0x00, 0x2f, 0x07, 0xd2, 0x16, 0x48, 0x99, + 0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, 0xf9, 0x0a, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x95, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc0, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, + 0xfa, 0x5f, 0x48, 0x90, 0x68, 0x00, 0xf0, 0x0a, + 0xfe, 0x59, 0xe0, 0x4a, 0x2f, 0x18, 0xd2, 0x48, + 0x1f, 0xf8, 0x49, 0x8c, 0x68, 0x09, 0xf0, 0x0a, + 0xf9, 0x45, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x89, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x0a, 0x9a, 0x00, 0x1c, 0x29, 0xf0, 0x0a, + 0xfa, 0x47, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x83, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x7d, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x77, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, + 0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x71, + 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, + 0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x6b, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0x48, 0x48, 0x68, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x00, 0x40, + 0x90, 0x03, 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, + 0x90, 0x03, 0x48, 0x62, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0x99, 0x03, 0x18, 0x40, 0x90, 0x03, + 0x98, 0x03, 0x49, 0x5c, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39, + 0x48, 0x58, 0x68, 0x00, 0xf0, 0x0a, 0xfa, 0x72, + 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04, + 0x6b, 0x69, 0x48, 0x54, 0x68, 0x00, 0xf0, 0x0a, + 0xf9, 0x4d, 0x1c, 0x30, 0x21, 0x01, 0xf0, 0x0a, + 0xfd, 0x45, 0x49, 0x4f, 0x20, 0x91, 0xf0, 0x17, + 0xfe, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0x48, 0x4c, 0x68, 0x00, 0x90, 0x02, 0x48, 0x4c, + 0x68, 0x00, 0x49, 0x4a, 0x60, 0x08, 0x98, 0x02, + 0x49, 0x49, 0x60, 0x08, 0x20, 0x92, 0x49, 0x46, + 0x60, 0x08, 0xb0, 0x03, 0x48, 0x43, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x75, 0x48, 0x3e, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x71, 0x99, 0x03, 0x29, 0x00, + 0xd1, 0x6e, 0xb0, 0x85, 0x1c, 0x30, 0xf0, 0x0a, + 0xfd, 0x47, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0x74, 0x49, 0x39, 0x20, 0x91, 0xf0, 0x17, + 0xfe, 0x11, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfd, 0x91, 0x2c, 0x0b, 0xdb, 0x01, + 0x2c, 0x12, 0xdd, 0x0b, 0x48, 0x33, 0x68, 0x00, + 0x68, 0x40, 0x28, 0x00, 0xd0, 0x06, 0x48, 0x31, + 0x68, 0x00, 0x68, 0x40, 0x38, 0x01, 0x49, 0x2f, + 0x68, 0x09, 0x60, 0x48, 0x20, 0x92, 0x49, 0x2c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x2b, 0x68, 0x09, + 0x60, 0x08, 0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12, + 0xdc, 0x0f, 0x48, 0x28, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x08, 0x40, + 0x00, 0x40, 0x49, 0x24, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x27, 0x00, + 0xe0, 0xb2, 0x27, 0x00, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, + 0xd2, 0x13, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x18, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x03, + 0xe7, 0xe6, 0x98, 0x03, 0x28, 0x00, 0xd1, 0x26, + 0x2f, 0x18, 0xd2, 0x24, 0x6a, 0xe8, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, + 0x43, 0x58, 0x4a, 0x0c, 0x68, 0x12, 0x18, 0x80, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0xe0, 0x00, + 0xe0, 0xa9, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x11, + 0x20, 0x01, 0x90, 0x03, 0xe0, 0x0e, 0x00, 0x00, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, + 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x7d, 0xb8, 0xe7, 0xd5, 0x3f, 0x01, + 0x6b, 0x28, 0xf7, 0xfe, 0xf9, 0xc2, 0x90, 0x01, + 0x2f, 0x07, 0xd2, 0x09, 0x48, 0x4a, 0x68, 0x01, + 0x1c, 0x38, 0xf0, 0x0a, 0xf8, 0x3d, 0x48, 0x48, + 0x68, 0x00, 0xf0, 0x0a, 0xfd, 0x27, 0xe0, 0x06, + 0x2f, 0x18, 0xd2, 0x04, 0x1f, 0xf8, 0x49, 0x44, + 0x68, 0x09, 0xf0, 0x0a, 0xf8, 0x6f, 0x48, 0x42, + 0x68, 0x00, 0x4b, 0x42, 0x18, 0xc0, 0xf0, 0x0a, + 0xf9, 0x8f, 0x20, 0x00, 0x49, 0x3e, 0x68, 0x09, + 0x23, 0x09, 0x01, 0xdb, 0x18, 0xc9, 0x64, 0x88, + 0x48, 0x3b, 0x68, 0x00, 0x68, 0x40, 0x28, 0x07, + 0xd3, 0x0e, 0x48, 0x39, 0x68, 0x00, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, 0x23, 0xfe, + 0x43, 0x18, 0x49, 0x35, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0xe0, 0x33, + 0x20, 0x01, 0x90, 0x00, 0x21, 0x00, 0x91, 0x02, + 0x48, 0x2f, 0x68, 0x00, 0x68, 0x40, 0x99, 0x02, + 0x42, 0x88, 0xd8, 0x04, 0xe0, 0x08, 0x99, 0x02, + 0x31, 0x01, 0x91, 0x02, 0xe7, 0xf4, 0x98, 0x00, + 0x00, 0x40, 0x30, 0x01, 0x90, 0x00, 0xe7, 0xf6, + 0x98, 0x00, 0x08, 0x40, 0x00, 0x40, 0x90, 0x00, + 0x48, 0x25, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc0, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0x49, 0x21, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0x88, 0x48, 0x1e, 0x68, 0x00, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, + 0x99, 0x00, 0x43, 0x08, 0x49, 0x1a, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, + 0x1c, 0x39, 0x48, 0x17, 0x68, 0x00, 0xf0, 0x0a, + 0xf9, 0x4d, 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, + 0xdd, 0x04, 0x6b, 0x69, 0x48, 0x12, 0x68, 0x00, + 0xf0, 0x0a, 0xf8, 0x7e, 0x1c, 0x30, 0x21, 0x00, + 0xf0, 0x0a, 0xfc, 0x20, 0x49, 0x10, 0x20, 0x91, + 0xf0, 0x17, 0xfd, 0x18, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x0b, 0x68, 0x00, 0x90, 0x04, + 0x48, 0x0c, 0x68, 0x00, 0x49, 0x08, 0x60, 0x08, + 0x98, 0x04, 0x49, 0x0a, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x07, 0x60, 0x08, 0xb0, 0x05, 0x20, 0x92, + 0x49, 0x07, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, + 0xe5, 0x60, 0xb0, 0x02, 0xe5, 0x5e, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0xb4, 0x00, 0x00, 0x04, 0xcc, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb8, + 0x2e, 0x08, 0x7c, 0xc0, 0xb5, 0xf3, 0x1c, 0x07, + 0x1c, 0x3e, 0x69, 0x30, 0x28, 0x13, 0xd1, 0x04, + 0x20, 0x75, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf4, 0x48, 0x1e, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x2c, 0x19, 0xd3, 0x01, + 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, + 0x2c, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, + 0xe7, 0xe7, 0x49, 0x16, 0x20, 0x91, 0xf0, 0x17, + 0xfc, 0xd1, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x09, 0xfc, 0xb8, 0xe7, 0xf5, 0x00, 0xa0, + 0x49, 0x11, 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x04, + 0x20, 0x92, 0x49, 0x0e, 0x60, 0x08, 0x20, 0xff, + 0xe7, 0xd3, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, + 0x1c, 0x05, 0x20, 0x01, 0x40, 0xa0, 0x40, 0x05, + 0x2d, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x99, 0x01, + 0x60, 0x08, 0xe0, 0x02, 0x20, 0x01, 0x99, 0x01, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x03, 0x60, 0x08, + 0x20, 0x00, 0xe7, 0xbe, 0xe7, 0xbd, 0x00, 0x00, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc0, + 0x2e, 0x08, 0x7c, 0x58, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, + 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x89, + 0x0f, 0x89, 0x02, 0x09, 0x43, 0x08, 0x61, 0x60, + 0x05, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0x28, 0x00, 0xd1, 0x73, 0x49, 0xbd, 0x20, 0x91, - 0xf0, 0x18, 0xfa, 0xdc, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x0a, 0xfa, 0xe5, 0xe7, 0xf5, - 0x00, 0xb0, 0x49, 0xb9, 0x58, 0x08, 0x42, 0xa8, - 0xd1, 0x05, 0x99, 0x03, 0x00, 0x88, 0x49, 0xb6, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0x7a, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfc, 0x61, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, - 0x49, 0xb2, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, - 0xe7, 0x98, 0x48, 0xb2, 0x68, 0x00, 0x42, 0xa8, - 0xd0, 0x03, 0x48, 0xb0, 0x68, 0x00, 0x42, 0xb8, - 0xd1, 0x0a, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, - 0x90, 0x01, 0x98, 0x01, 0x28, 0x01, 0xd1, 0x03, - 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, - 0x99, 0x03, 0x60, 0xe9, 0x60, 0xfe, 0x00, 0xb0, - 0x49, 0xa5, 0x50, 0x0f, 0x99, 0x03, 0x00, 0x88, - 0x49, 0xa3, 0x50, 0x0d, 0x48, 0xa0, 0x68, 0x00, - 0x28, 0x00, 0xd1, 0x55, 0x20, 0x0d, 0x06, 0xc0, - 0x68, 0x80, 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, - 0x06, 0xc9, 0x60, 0x88, 0x20, 0x01, 0x40, 0xb0, - 0x99, 0x02, 0x40, 0x08, 0xd1, 0x12, 0x99, 0x03, - 0x20, 0x01, 0x40, 0x88, 0x99, 0x02, 0x40, 0x08, - 0xd0, 0x0b, 0x99, 0x03, 0x20, 0x01, 0x40, 0x88, - 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, 0x90, 0x02, - 0x20, 0x01, 0x40, 0xb0, 0x99, 0x02, 0x43, 0x08, - 0x90, 0x02, 0xe0, 0x11, 0x99, 0x03, 0x20, 0x01, - 0x40, 0x88, 0x99, 0x02, 0x40, 0x08, 0xd1, 0x0b, - 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x02, - 0x40, 0x08, 0x90, 0x02, 0x99, 0x03, 0x20, 0x01, - 0x40, 0x88, 0x99, 0x02, 0x43, 0x08, 0x90, 0x02, - 0x6b, 0x28, 0xf7, 0xfe, 0xfe, 0xbc, 0x90, 0x00, - 0x9a, 0x00, 0xe0, 0x00, 0xe0, 0x22, 0x99, 0x03, - 0x1c, 0x28, 0xf0, 0x00, 0xfa, 0x3d, 0x6b, 0x38, - 0xf7, 0xfe, 0xfe, 0xb1, 0x90, 0x00, 0x9a, 0x00, - 0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xfa, 0x34, - 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, - 0x48, 0x7c, 0x68, 0x00, 0x42, 0xa8, 0xd0, 0x03, - 0x48, 0x7a, 0x68, 0x00, 0x42, 0xb8, 0xd1, 0x03, - 0x98, 0x01, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, - 0x20, 0x92, 0x49, 0x74, 0x60, 0x08, 0x20, 0x00, - 0xb0, 0x05, 0xe7, 0x1b, 0x49, 0x71, 0x20, 0x91, - 0xf0, 0x18, 0xfa, 0x44, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x0a, 0xfa, 0x4d, 0xe7, 0xf5, - 0x00, 0xb0, 0x49, 0x6d, 0x58, 0x08, 0x42, 0xa8, - 0xd0, 0x05, 0x20, 0x92, 0x49, 0x69, 0x60, 0x08, - 0x20, 0xff, 0xb0, 0x05, 0xe7, 0x06, 0x2c, 0x0b, - 0xdb, 0x12, 0x2c, 0x12, 0xdc, 0x10, 0x48, 0x67, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x09, 0x48, 0x65, - 0x68, 0x00, 0x42, 0xa8, 0xd0, 0x05, 0x20, 0x92, - 0x49, 0x60, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, - 0xe6, 0xf4, 0x48, 0x60, 0x60, 0x07, 0xe0, 0x08, - 0x6b, 0xf8, 0x28, 0x01, 0xd1, 0x05, 0x20, 0x92, - 0x49, 0x5a, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x05, - 0xe6, 0xe8, 0x48, 0x5a, 0x68, 0x00, 0x42, 0xa8, - 0xd1, 0x02, 0x20, 0x00, 0x49, 0x57, 0x60, 0x08, - 0x00, 0xb0, 0x49, 0x55, 0x50, 0x0f, 0x99, 0x03, - 0x60, 0xe9, 0x60, 0xfe, 0x48, 0x50, 0x68, 0x00, - 0x28, 0x00, 0xd1, 0x73, 0x6b, 0x28, 0xf7, 0xfe, - 0xfe, 0x4e, 0x90, 0x00, 0x6a, 0xa9, 0x9a, 0x00, - 0x48, 0x4f, 0xf0, 0x0b, 0xfa, 0x1d, 0x6b, 0x38, - 0xf7, 0xfe, 0xfe, 0x45, 0x90, 0x00, 0x6a, 0xb9, - 0x9a, 0x00, 0x48, 0x4b, 0xf0, 0x0b, 0xfa, 0x42, - 0x48, 0x48, 0x68, 0x00, 0x42, 0xa8, 0xd1, 0x0f, - 0x20, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, - 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x07, - 0x21, 0x00, 0x20, 0x02, 0xf0, 0x03, 0xfd, 0xae, - 0x48, 0x42, 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x88, - 0x2c, 0x0b, 0xdb, 0x42, 0x2c, 0x12, 0xdc, 0x40, - 0x98, 0x04, 0x42, 0xa0, 0xd0, 0x2c, 0x20, 0x02, - 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x21, 0x00, - 0x20, 0x02, 0xf0, 0x03, 0xfd, 0x9b, 0x2c, 0x0f, - 0xd0, 0x05, 0x2c, 0x10, 0xd0, 0x03, 0x2c, 0x11, - 0xd0, 0x01, 0x2c, 0x0b, 0xd1, 0x03, 0x21, 0x00, - 0x20, 0x12, 0xf0, 0x03, 0xfd, 0x8f, 0x2c, 0x0c, - 0xd0, 0x01, 0x2c, 0x0f, 0xd1, 0x03, 0x21, 0x00, - 0x20, 0x04, 0xf0, 0x03, 0xfd, 0x87, 0x2c, 0x0d, - 0xd0, 0x01, 0x2c, 0x10, 0xd1, 0x03, 0x21, 0x00, - 0x20, 0x08, 0xf0, 0x03, 0xfd, 0x7f, 0x2c, 0x0e, - 0xd0, 0x01, 0x2c, 0x11, 0xd1, 0x03, 0x21, 0x00, - 0x20, 0x01, 0xf0, 0x03, 0xfd, 0x77, 0xe0, 0x03, - 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, - 0x6a, 0xb8, 0x30, 0x01, 0x05, 0x00, 0x6a, 0xf9, - 0x31, 0x01, 0x02, 0x89, 0x43, 0x08, 0x6b, 0x79, - 0x31, 0x02, 0x43, 0x08, 0x21, 0x0d, 0x06, 0xc9, - 0x61, 0x88, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x80, - 0x90, 0x02, 0x20, 0x00, 0x21, 0x0d, 0x06, 0xc9, - 0x60, 0x88, 0xe0, 0x00, 0xe0, 0x1f, 0x20, 0x01, - 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x02, 0x40, 0x08, - 0x90, 0x02, 0xf0, 0x00, 0xf9, 0xcf, 0x6b, 0x38, - 0xf7, 0xfe, 0xfd, 0xd1, 0x90, 0x00, 0x9a, 0x00, - 0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x54, - 0x98, 0x02, 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, - 0x2c, 0x0b, 0xdb, 0x08, 0x2c, 0x12, 0xdc, 0x06, - 0x98, 0x04, 0x42, 0xa0, 0xd1, 0x03, 0x20, 0x01, - 0x21, 0x0d, 0x06, 0xc9, 0x60, 0xc8, 0x20, 0x92, - 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, - 0xe6, 0x3c, 0xb0, 0x05, 0xe6, 0x3a, 0xe6, 0x39, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7c, 0x60, 0x2e, 0x08, 0x7c, 0xc4, - 0x2e, 0x08, 0x7d, 0x9c, 0x3f, 0xff, 0xff, 0xff, - 0xb5, 0xf0, 0x1c, 0x07, 0x00, 0xb8, 0x49, 0x09, - 0x58, 0x0c, 0x1c, 0x7d, 0x60, 0xe5, 0x00, 0xa8, - 0x49, 0x06, 0x50, 0x0c, 0x6b, 0x20, 0xf7, 0xfe, - 0xfd, 0x9a, 0x1c, 0x06, 0x1c, 0x32, 0x1c, 0x29, - 0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x1d, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0x60, - 0xb5, 0xf0, 0x1c, 0x07, 0x00, 0xb8, 0x49, 0x09, - 0x58, 0x0c, 0x1e, 0x7d, 0x60, 0xe5, 0x00, 0xa8, - 0x49, 0x06, 0x50, 0x0c, 0x6b, 0x20, 0xf7, 0xfe, - 0xfd, 0x82, 0x1c, 0x06, 0x1c, 0x32, 0x1c, 0x29, - 0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x05, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0x60, - 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x86, 0x98, 0x06, - 0x90, 0x05, 0x98, 0x05, 0x68, 0xc5, 0x48, 0x77, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, + 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x00, 0x1d, 0xe6, + 0x36, 0x0d, 0x68, 0x30, 0x99, 0x00, 0x60, 0x08, + 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, + 0xfb, 0x73, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17, + 0xfc, 0x3d, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfb, 0xbd, 0x20, 0x92, 0x49, 0x1c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, + 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0a, 0xfb, 0x6e, 0x90, 0x00, 0x69, 0x60, + 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, + 0xf0, 0x17, 0xfc, 0x24, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, + 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, + 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, + 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, + 0xff, 0xff, 0xfc, 0xff, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x1c, 0x3c, 0x68, 0xe5, 0x69, 0x60, + 0x4b, 0x49, 0x40, 0x18, 0x99, 0x02, 0x07, 0x09, + 0x0f, 0x09, 0x02, 0x89, 0x43, 0x08, 0x61, 0x60, + 0x04, 0x80, 0x48, 0x46, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x05, - 0x20, 0xff, 0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x98, 0x05, 0x69, 0x00, - 0x28, 0x13, 0xd1, 0x02, 0x20, 0xff, 0xb0, 0x06, - 0xe7, 0xf4, 0x49, 0x69, 0x20, 0x91, 0xf0, 0x18, - 0xf9, 0x01, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, - 0xf0, 0x0a, 0xf9, 0x0a, 0xe7, 0xf5, 0x00, 0xa8, - 0x49, 0x64, 0x58, 0x08, 0x99, 0x05, 0x42, 0x88, - 0xd0, 0x05, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, - 0x20, 0xff, 0xb0, 0x06, 0xe7, 0xde, 0x42, 0xbd, - 0xd1, 0x05, 0x20, 0x92, 0x49, 0x5c, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x06, 0xe7, 0xd6, 0x20, 0x00, - 0x00, 0xa9, 0x4a, 0x5a, 0x50, 0x50, 0x98, 0x05, - 0x60, 0xc7, 0x48, 0x59, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x0d, 0x48, 0x54, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x09, 0x99, 0x05, 0x00, 0xb8, 0x4a, 0x53, - 0x50, 0x11, 0x20, 0x92, 0x49, 0x50, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x06, 0xe7, 0xbe, 0x20, 0x0d, - 0x06, 0xc0, 0x68, 0x80, 0x1c, 0x04, 0x20, 0x00, - 0x21, 0x0d, 0x06, 0xc9, 0x60, 0x88, 0x20, 0x00, - 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x4b, 0x18, 0xc9, - 0x60, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, - 0x4b, 0x48, 0x18, 0xc9, 0x60, 0x48, 0x20, 0x00, - 0x43, 0xc0, 0x00, 0xe9, 0x4b, 0x45, 0x18, 0xc9, - 0x64, 0x08, 0x20, 0x00, 0x43, 0xc0, 0x00, 0xe9, - 0x4b, 0x42, 0x18, 0xc9, 0x64, 0x48, 0x20, 0x01, - 0x90, 0x01, 0x20, 0x01, 0x40, 0xa8, 0x40, 0x20, - 0xd1, 0x01, 0x20, 0x00, 0x90, 0x01, 0x20, 0x01, - 0x40, 0xa8, 0x43, 0xc0, 0x40, 0x04, 0x1c, 0x3e, - 0x42, 0xbd, 0xd9, 0x23, 0x00, 0xb0, 0x49, 0x37, - 0x58, 0x08, 0x28, 0x00, 0xd0, 0x01, 0x36, 0x01, - 0xe7, 0xf8, 0x1e, 0x70, 0x90, 0x04, 0x98, 0x04, - 0x42, 0xb8, 0xda, 0x04, 0xe0, 0x07, 0x98, 0x04, - 0x38, 0x01, 0x90, 0x04, 0xe7, 0xf7, 0x98, 0x04, - 0xf7, 0xff, 0xff, 0x32, 0xe7, 0xf7, 0x20, 0xff, - 0x40, 0xb8, 0x90, 0x03, 0x20, 0xff, 0x40, 0xb0, - 0x43, 0xc0, 0x99, 0x03, 0x40, 0x08, 0x90, 0x03, - 0x98, 0x03, 0x00, 0x40, 0x90, 0x03, 0x00, 0x60, - 0x90, 0x00, 0xe0, 0x1f, 0x00, 0xb0, 0x49, 0x25, - 0x58, 0x08, 0x28, 0x00, 0xd0, 0x01, 0x3e, 0x01, - 0xe7, 0xf8, 0x1c, 0x70, 0x90, 0x04, 0x98, 0x04, - 0x42, 0xb8, 0xd9, 0x04, 0xe0, 0x07, 0x98, 0x04, - 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf7, 0x98, 0x04, - 0xf7, 0xff, 0xff, 0x26, 0xe7, 0xf7, 0x20, 0xff, - 0x40, 0xb0, 0x90, 0x03, 0x20, 0xff, 0x40, 0xb8, - 0x43, 0xc0, 0x99, 0x03, 0x40, 0x08, 0x90, 0x03, - 0x08, 0x60, 0x90, 0x00, 0x98, 0x00, 0x99, 0x03, - 0x40, 0x08, 0x90, 0x00, 0x98, 0x03, 0x43, 0x84, - 0x98, 0x00, 0x43, 0x04, 0x20, 0x01, 0x40, 0xb8, - 0x43, 0xc0, 0x40, 0x04, 0x98, 0x01, 0x40, 0xb8, - 0x43, 0x04, 0x99, 0x05, 0x00, 0xb8, 0x4a, 0x0d, - 0x50, 0x11, 0x98, 0x05, 0x6b, 0x00, 0xf7, 0xfe, - 0xfc, 0x92, 0x90, 0x02, 0x9a, 0x02, 0x1c, 0x39, - 0x98, 0x05, 0xf0, 0x00, 0xf8, 0x15, 0x20, 0x0d, - 0x06, 0xc0, 0x60, 0x84, 0x20, 0x92, 0x49, 0x04, - 0x60, 0x08, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x25, - 0xb0, 0x06, 0xe7, 0x23, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, - 0x2e, 0x08, 0x60, 0x8c, 0x68, 0x00, 0x04, 0x00, - 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x01, 0x3d, - 0x4b, 0x2f, 0x18, 0xe9, 0x1d, 0xe2, 0x32, 0x0d, - 0x20, 0x00, 0x28, 0x03, 0xd3, 0x02, 0xe0, 0x04, - 0x30, 0x01, 0xe7, 0xfa, 0xca, 0x20, 0xc1, 0x20, - 0xe7, 0xfa, 0x6a, 0xe3, 0x05, 0x9d, 0x0d, 0xad, - 0x00, 0xfe, 0x4b, 0x28, 0x18, 0xf3, 0x60, 0x1d, - 0x6b, 0x63, 0x33, 0x01, 0x05, 0x9d, 0x0d, 0xad, - 0x00, 0xfe, 0x4b, 0x24, 0x18, 0xf3, 0x60, 0x5d, - 0x6a, 0xa5, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x1d, - 0x00, 0xfe, 0x4b, 0x20, 0x18, 0xf3, 0x64, 0x1d, - 0x9d, 0x02, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x1d, - 0x00, 0xfe, 0x4b, 0x1c, 0x18, 0xf3, 0x64, 0x5d, - 0x4b, 0x1b, 0x68, 0x1b, 0x2b, 0x01, 0xd1, 0x2a, - 0x2f, 0x00, 0xd1, 0x28, 0x4b, 0x17, 0x68, 0x5d, - 0x23, 0x8f, 0x00, 0x9b, 0x42, 0x9d, 0xd3, 0x03, - 0x23, 0x8f, 0x00, 0x9b, 0x4d, 0x13, 0x60, 0x6b, - 0x4b, 0x12, 0x68, 0x1d, 0x4b, 0x13, 0x42, 0x9d, - 0xd3, 0x02, 0x4b, 0x12, 0x4d, 0x0f, 0x60, 0x2b, - 0x4b, 0x0e, 0x6c, 0x5d, 0x23, 0x01, 0x02, 0x9b, - 0x1a, 0xed, 0x23, 0xb3, 0x00, 0x9b, 0x42, 0x9d, - 0xd3, 0x02, 0x4b, 0x0d, 0x4d, 0x09, 0x64, 0x6b, - 0x4b, 0x08, 0x6c, 0x1d, 0x23, 0x01, 0x02, 0x9b, - 0x1a, 0xed, 0x4b, 0x0a, 0x42, 0x9d, 0xd3, 0x02, - 0x4b, 0x09, 0x4d, 0x04, 0x64, 0x2b, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x04, 0x00, - 0x2e, 0x08, 0x60, 0x8c, 0x00, 0x00, 0x02, 0x3a, - 0x00, 0x00, 0x06, 0xcc, 0x00, 0x00, 0x02, 0xca, - 0x00, 0x00, 0x06, 0xca, 0xb4, 0xf0, 0x4f, 0x15, - 0x4c, 0x15, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, - 0x43, 0xd2, 0x4d, 0x14, 0x68, 0x6d, 0x42, 0x85, - 0xdd, 0x1b, 0x1c, 0x05, 0x30, 0x01, 0x00, 0xad, - 0x59, 0x7b, 0x42, 0x93, 0xd0, 0xf9, 0x4d, 0x0f, - 0x68, 0x6d, 0x42, 0x85, 0xda, 0x00, 0xe0, 0x10, - 0x31, 0x01, 0x1c, 0x05, 0x30, 0x01, 0x00, 0xad, - 0x59, 0x7a, 0x42, 0x93, 0xd0, 0xf9, 0x02, 0x95, - 0x43, 0x1d, 0x1c, 0x2e, 0xc4, 0x40, 0x4d, 0x07, - 0x68, 0x6d, 0x42, 0x85, 0xdb, 0x00, 0x31, 0x01, - 0xe7, 0xdf, 0x25, 0x0d, 0x06, 0xed, 0x61, 0x29, - 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x7c, 0xd4, - 0x68, 0x00, 0x0d, 0x40, 0x2e, 0x08, 0x7d, 0x9c, - 0xb5, 0xf3, 0xb0, 0x82, 0x9d, 0x02, 0x69, 0x2c, - 0x2c, 0x13, 0xd1, 0x05, 0x20, 0x75, 0xb0, 0x02, + 0x28, 0x00, 0xd0, 0x05, 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x68, 0xee, 0x48, 0xf8, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2e, 0x08, - 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0x28, 0x00, 0xd0, 0x02, 0x20, 0xff, 0xb0, 0x02, - 0xe7, 0xe6, 0x49, 0xef, 0x20, 0x91, 0xf0, 0x17, - 0xff, 0x61, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, - 0xf0, 0x09, 0xff, 0x6a, 0xe7, 0xf5, 0x00, 0xb0, - 0x49, 0xea, 0x58, 0x08, 0x99, 0x02, 0x42, 0x88, - 0xd0, 0x05, 0x20, 0x92, 0x49, 0xe6, 0x60, 0x08, - 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xd0, 0x48, 0xe3, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x16, 0x20, 0x0d, - 0x06, 0xc0, 0x68, 0x80, 0x90, 0x01, 0x99, 0x03, - 0x29, 0x01, 0xd1, 0x05, 0x20, 0x01, 0x40, 0xb0, - 0x99, 0x01, 0x43, 0x08, 0x90, 0x01, 0xe0, 0x05, - 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x99, 0x01, - 0x40, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x0d, - 0x06, 0xc9, 0x60, 0x88, 0x48, 0xd8, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x73, 0x48, 0xd3, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x6f, 0x99, 0x03, 0x29, 0x01, - 0xd1, 0x6c, 0xb0, 0x83, 0x1c, 0x30, 0xf0, 0x0a, - 0xfe, 0x71, 0x28, 0x01, 0xd1, 0x05, 0x20, 0x92, - 0x49, 0xcd, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, - 0xe7, 0x9e, 0x49, 0xce, 0x20, 0x91, 0xf0, 0x17, - 0xff, 0x19, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, - 0xf0, 0x0a, 0xfe, 0xbb, 0x2c, 0x0b, 0xdb, 0x01, - 0x2c, 0x12, 0xdd, 0x06, 0x48, 0xc8, 0x68, 0x00, - 0x68, 0x40, 0x30, 0x01, 0x49, 0xc6, 0x68, 0x09, - 0x60, 0x48, 0x20, 0x92, 0x49, 0xc3, 0x60, 0x08, - 0x20, 0x01, 0x49, 0xc3, 0x68, 0x09, 0x60, 0x08, - 0x2c, 0x0b, 0xdb, 0x11, 0x2c, 0x12, 0xdc, 0x0f, - 0x48, 0xbf, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xc0, 0x69, 0x80, 0x23, 0x01, 0x43, 0x18, - 0x49, 0xbb, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xc9, 0x61, 0x88, 0x27, 0x00, 0xe0, 0xbc, - 0x27, 0x00, 0x20, 0x00, 0x90, 0x01, 0x98, 0x01, - 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, 0xd2, 0x13, - 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, - 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, - 0x4a, 0xaf, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, - 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, - 0xda, 0x01, 0x20, 0x01, 0x90, 0x01, 0xe7, 0xe6, - 0x98, 0x01, 0x28, 0x00, 0xd1, 0x16, 0x2f, 0x18, - 0xd2, 0x14, 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, - 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, - 0x4a, 0xa3, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, - 0xda, 0x03, 0xe0, 0x00, 0xe0, 0xb0, 0x20, 0x01, - 0x90, 0x01, 0xe7, 0xe5, 0x3f, 0x01, 0x6b, 0x28, - 0xf7, 0xfe, 0xfb, 0x01, 0x90, 0x00, 0x2f, 0x07, - 0xd2, 0x16, 0x48, 0x99, 0x68, 0x01, 0x1c, 0x38, - 0xf0, 0x0a, 0xf9, 0x0a, 0x00, 0xb8, 0x19, 0xc0, - 0x00, 0xc0, 0x49, 0x95, 0x68, 0x09, 0x18, 0x40, - 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x9a, 0x00, - 0x1c, 0x29, 0xf0, 0x0a, 0xfa, 0x5f, 0x48, 0x90, - 0x68, 0x00, 0xf0, 0x0a, 0xfe, 0x59, 0xe0, 0x4a, - 0x2f, 0x18, 0xd2, 0x48, 0x1f, 0xf8, 0x49, 0x8c, - 0x68, 0x09, 0xf0, 0x0a, 0xf9, 0x45, 0x20, 0x4c, - 0x43, 0x78, 0x49, 0x89, 0x68, 0x09, 0x18, 0x40, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x9a, 0x00, - 0x1c, 0x29, 0xf0, 0x0a, 0xfa, 0x47, 0x20, 0x4c, - 0x43, 0x78, 0x49, 0x83, 0x68, 0x09, 0x18, 0x40, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, - 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x78, - 0x49, 0x7d, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, - 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x78, - 0x49, 0x77, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, - 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, - 0x43, 0x79, 0x4a, 0x71, 0x68, 0x12, 0x18, 0x89, - 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, - 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, 0x43, 0x79, - 0x4a, 0x6b, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, - 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0x48, 0x68, - 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, - 0x69, 0x80, 0x00, 0x40, 0x90, 0x03, 0x98, 0x03, - 0x23, 0x02, 0x43, 0x18, 0x90, 0x03, 0x48, 0x62, - 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, - 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0x99, 0x03, - 0x18, 0x40, 0x90, 0x03, 0x98, 0x03, 0x49, 0x5c, - 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0x61, 0x88, 0x1c, 0x39, 0x48, 0x58, 0x68, 0x00, - 0xf0, 0x0a, 0xfa, 0x72, 0x2c, 0x0b, 0xdb, 0x01, - 0x2c, 0x12, 0xdd, 0x04, 0x6b, 0x69, 0x48, 0x54, - 0x68, 0x00, 0xf0, 0x0a, 0xf9, 0x4d, 0x1c, 0x30, - 0x21, 0x01, 0xf0, 0x0a, 0xfd, 0x45, 0x49, 0x4f, - 0x20, 0x91, 0xf0, 0x17, 0xfe, 0x1b, 0x28, 0x92, - 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x4c, 0x68, 0x00, - 0x90, 0x02, 0x48, 0x4c, 0x68, 0x00, 0x49, 0x4a, - 0x60, 0x08, 0x98, 0x02, 0x49, 0x49, 0x60, 0x08, - 0x20, 0x92, 0x49, 0x46, 0x60, 0x08, 0xb0, 0x03, - 0x48, 0x43, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x75, - 0x48, 0x3e, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x71, - 0x99, 0x03, 0x29, 0x00, 0xd1, 0x6e, 0xb0, 0x85, - 0x1c, 0x30, 0xf0, 0x0a, 0xfd, 0x47, 0x28, 0x00, - 0xd1, 0x05, 0x20, 0x92, 0x49, 0x38, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x07, 0xe6, 0x74, 0x49, 0x39, - 0x20, 0x91, 0xf0, 0x17, 0xfd, 0xef, 0x28, 0x92, - 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfd, 0x91, - 0x2c, 0x0b, 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x0b, - 0x48, 0x33, 0x68, 0x00, 0x68, 0x40, 0x28, 0x00, - 0xd0, 0x06, 0x48, 0x31, 0x68, 0x00, 0x68, 0x40, - 0x38, 0x01, 0x49, 0x2f, 0x68, 0x09, 0x60, 0x48, - 0x20, 0x92, 0x49, 0x2c, 0x60, 0x08, 0x20, 0x01, - 0x49, 0x2b, 0x68, 0x09, 0x60, 0x08, 0x2c, 0x0b, - 0xdb, 0x11, 0x2c, 0x12, 0xdc, 0x0f, 0x48, 0x28, - 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, - 0x69, 0x80, 0x08, 0x40, 0x00, 0x40, 0x49, 0x24, - 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0x61, 0x88, 0x27, 0x00, 0xe0, 0xb2, 0x27, 0x00, - 0x20, 0x00, 0x90, 0x03, 0x98, 0x03, 0x28, 0x00, - 0xd1, 0x15, 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe8, - 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, - 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x18, - 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, - 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x01, - 0x20, 0x01, 0x90, 0x03, 0xe7, 0xe6, 0x98, 0x03, - 0x28, 0x00, 0xd1, 0x26, 0x2f, 0x18, 0xd2, 0x24, - 0x6a, 0xe8, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, - 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x0c, - 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x02, 0xe0, 0x00, 0xe0, 0xa9, 0x69, 0x40, - 0x42, 0x81, 0xd1, 0x11, 0x20, 0x01, 0x90, 0x03, - 0xe0, 0x0e, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, - 0xe7, 0xd5, 0x3f, 0x01, 0x6b, 0x28, 0xf7, 0xfe, - 0xf9, 0xc2, 0x90, 0x01, 0x2f, 0x07, 0xd2, 0x09, - 0x48, 0x4a, 0x68, 0x01, 0x1c, 0x38, 0xf0, 0x0a, - 0xf8, 0x3d, 0x48, 0x48, 0x68, 0x00, 0xf0, 0x0a, - 0xfd, 0x27, 0xe0, 0x06, 0x2f, 0x18, 0xd2, 0x04, - 0x1f, 0xf8, 0x49, 0x44, 0x68, 0x09, 0xf0, 0x0a, - 0xf8, 0x6f, 0x48, 0x42, 0x68, 0x00, 0x4b, 0x42, - 0x18, 0xc0, 0xf0, 0x0a, 0xf9, 0x8f, 0x20, 0x00, - 0x49, 0x3e, 0x68, 0x09, 0x23, 0x09, 0x01, 0xdb, - 0x18, 0xc9, 0x64, 0x88, 0x48, 0x3b, 0x68, 0x00, - 0x68, 0x40, 0x28, 0x07, 0xd3, 0x0e, 0x48, 0x39, - 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, - 0x69, 0x80, 0x23, 0xfe, 0x43, 0x18, 0x49, 0x35, - 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0x61, 0x88, 0xe0, 0x33, 0x20, 0x01, 0x90, 0x00, - 0x21, 0x00, 0x91, 0x02, 0x48, 0x2f, 0x68, 0x00, - 0x68, 0x40, 0x99, 0x02, 0x42, 0x88, 0xd8, 0x04, - 0xe0, 0x08, 0x99, 0x02, 0x31, 0x01, 0x91, 0x02, - 0xe7, 0xf4, 0x98, 0x00, 0x00, 0x40, 0x30, 0x01, - 0x90, 0x00, 0xe7, 0xf6, 0x98, 0x00, 0x08, 0x40, - 0x00, 0x40, 0x90, 0x00, 0x48, 0x25, 0x68, 0x00, - 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc0, 0x69, 0x80, - 0x07, 0xc0, 0x0f, 0xc0, 0x49, 0x21, 0x68, 0x09, - 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, - 0x48, 0x1e, 0x68, 0x00, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xc0, 0x69, 0x80, 0x99, 0x00, 0x43, 0x08, - 0x49, 0x1a, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xc9, 0x61, 0x88, 0x1c, 0x39, 0x48, 0x17, - 0x68, 0x00, 0xf0, 0x0a, 0xf9, 0x4d, 0x2c, 0x0b, - 0xdb, 0x01, 0x2c, 0x12, 0xdd, 0x04, 0x6b, 0x69, - 0x48, 0x12, 0x68, 0x00, 0xf0, 0x0a, 0xf8, 0x7e, - 0x1c, 0x30, 0x21, 0x00, 0xf0, 0x0a, 0xfc, 0x20, - 0x49, 0x10, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0xf6, - 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x0b, - 0x68, 0x00, 0x90, 0x04, 0x48, 0x0c, 0x68, 0x00, - 0x49, 0x08, 0x60, 0x08, 0x98, 0x04, 0x49, 0x0a, - 0x60, 0x08, 0x20, 0x92, 0x49, 0x07, 0x60, 0x08, - 0xb0, 0x05, 0x20, 0x92, 0x49, 0x07, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x02, 0xe5, 0x60, 0xb0, 0x02, - 0xe5, 0x5e, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xbc, - 0x00, 0x00, 0x04, 0xcc, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x7c, 0xc8, - 0xb5, 0xf3, 0x1c, 0x07, 0x1c, 0x3e, 0x69, 0x30, - 0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf4, - 0x48, 0x1e, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, - 0x2c, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, - 0x20, 0x00, 0xe0, 0x04, 0x2c, 0x08, 0xd3, 0x01, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0xce, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfb, 0xb5, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, + 0xe7, 0xe6, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0c, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x09, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc6, 0x1d, 0xe0, 0x30, 0x0d, + 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x60, 0x30, + 0xe0, 0x41, 0x48, 0x26, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x3d, 0x48, 0x28, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, + 0xfa, 0xc7, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, + 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, + 0xe7, 0xbe, 0x49, 0x21, 0x20, 0x91, 0xf0, 0x17, + 0xfb, 0x91, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x0a, 0xfb, 0x11, 0x20, 0x92, 0x49, 0x1c, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, + 0x60, 0x08, 0x48, 0x1a, 0x68, 0x01, 0x1c, 0x20, + 0xf0, 0x0a, 0xfa, 0xc2, 0x90, 0x00, 0x69, 0x60, + 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, + 0xf0, 0x17, 0xfb, 0x78, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0x48, 0x12, 0x68, 0x00, 0x90, 0x01, + 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, + 0x98, 0x01, 0x49, 0x0f, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, + 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0x8a, 0xb0, 0x01, 0xe7, 0x88, 0x00, 0x00, + 0xff, 0xff, 0xc3, 0xff, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x82, 0x1c, 0x3c, 0x68, 0xe5, 0x26, 0x00, + 0x99, 0x03, 0x29, 0x01, 0xd1, 0x00, 0x26, 0x01, + 0x69, 0x60, 0x06, 0x80, 0x0f, 0xc0, 0x42, 0xb0, + 0xd1, 0x05, 0x20, 0x00, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x69, 0x60, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, 0x07, 0xf1, + 0x0e, 0x89, 0x43, 0x08, 0x61, 0x60, 0x06, 0x80, + 0x48, 0x44, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, - 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe7, 0x49, 0x16, - 0x20, 0x91, 0xf0, 0x17, 0xfc, 0xaf, 0x28, 0x92, - 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfc, 0xb8, - 0xe7, 0xf5, 0x00, 0xa0, 0x49, 0x11, 0x58, 0x08, - 0x42, 0xb8, 0xd0, 0x04, 0x20, 0x92, 0x49, 0x0e, - 0x60, 0x08, 0x20, 0xff, 0xe7, 0xd3, 0x20, 0x0d, - 0x06, 0xc0, 0x68, 0x80, 0x1c, 0x05, 0x20, 0x01, - 0x40, 0xa0, 0x40, 0x05, 0x2d, 0x00, 0xd1, 0x03, - 0x20, 0x00, 0x99, 0x01, 0x60, 0x08, 0xe0, 0x02, - 0x20, 0x01, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92, - 0x49, 0x03, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xbe, - 0xe7, 0xbd, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, - 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x1c, 0x3c, - 0x68, 0xe5, 0x69, 0x60, 0x4b, 0x49, 0x40, 0x18, - 0x99, 0x02, 0x07, 0x89, 0x0f, 0x89, 0x02, 0x09, - 0x43, 0x08, 0x61, 0x60, 0x05, 0x80, 0x48, 0x46, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, - 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x05, - 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x49, 0x3b, 0x20, 0x91, - 0xf0, 0x17, 0xfc, 0x58, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x09, 0xfc, 0x61, 0xe7, 0xf5, - 0x00, 0xa8, 0x49, 0x37, 0x58, 0x08, 0x42, 0xb8, - 0xd0, 0x05, 0x20, 0x92, 0x49, 0x33, 0x60, 0x08, - 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xe6, 0x48, 0x30, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x20, - 0x28, 0x0b, 0xdb, 0x0c, 0x69, 0x20, 0x28, 0x12, - 0xdc, 0x09, 0x01, 0x28, 0x4b, 0x2d, 0x18, 0xc1, - 0x91, 0x00, 0x1d, 0xe6, 0x36, 0x0d, 0x68, 0x30, - 0x99, 0x00, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x26, - 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x28, + 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xde, + 0x49, 0x3b, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0x16, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, + 0xfa, 0xfd, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x37, + 0x58, 0x08, 0x42, 0xb8, 0xd0, 0x05, 0x20, 0x92, + 0x49, 0x33, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x02, + 0xe7, 0xc9, 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x0e, + 0x69, 0x20, 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x28, + 0x4b, 0x2d, 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, + 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, + 0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, - 0x1c, 0x28, 0xf0, 0x0a, 0xfb, 0x73, 0x28, 0x00, - 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xbe, 0x49, 0x21, - 0x20, 0x91, 0xf0, 0x17, 0xfc, 0x1b, 0x28, 0x92, - 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfb, 0xbd, - 0x20, 0x92, 0x49, 0x1c, 0x60, 0x08, 0x20, 0x01, - 0x49, 0x1b, 0x68, 0x09, 0x60, 0x08, 0x48, 0x1a, - 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfb, 0x6e, + 0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0x0d, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x9f, 0x49, 0x20, + 0x20, 0x91, 0xf0, 0x17, 0xfa, 0xd7, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfa, 0x57, + 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0x08, 0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, - 0x49, 0x14, 0x20, 0x91, 0xf0, 0x17, 0xfc, 0x02, - 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x12, - 0x68, 0x00, 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, - 0x49, 0x0f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0f, - 0x60, 0x08, 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, - 0xb0, 0x02, 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x8a, 0xb0, 0x01, - 0xe7, 0x88, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xff, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, - 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x1c, 0x3c, - 0x68, 0xe5, 0x69, 0x60, 0x4b, 0x49, 0x40, 0x18, - 0x99, 0x02, 0x07, 0x09, 0x0f, 0x09, 0x02, 0x89, - 0x43, 0x08, 0x61, 0x60, 0x04, 0x80, 0x48, 0x46, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, + 0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xfa, 0xbe, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, + 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x6b, 0xb0, 0x02, + 0xe7, 0x69, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x7d, 0xb8, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0xb0, 0x83, 0x1c, 0x25, 0x69, 0x28, + 0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xee, + 0x20, 0x04, 0x40, 0x38, 0x08, 0x81, 0x91, 0x02, + 0x69, 0x68, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x18, + 0x07, 0xb9, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, + 0x61, 0x68, 0x06, 0x00, 0x69, 0x68, 0x4b, 0x48, + 0x40, 0x18, 0x99, 0x02, 0x07, 0xc9, 0x0c, 0x49, + 0x43, 0x08, 0x61, 0x68, 0x04, 0x40, 0x48, 0x45, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x05, - 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x49, 0x3b, 0x20, 0x91, - 0xf0, 0x17, 0xfb, 0xac, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x09, 0xfb, 0xb5, 0xe7, 0xf5, - 0x00, 0xa8, 0x49, 0x37, 0x58, 0x08, 0x42, 0xb8, - 0xd0, 0x05, 0x20, 0x92, 0x49, 0x33, 0x60, 0x08, - 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xe6, 0x48, 0x30, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x20, - 0x28, 0x0b, 0xdb, 0x0c, 0x69, 0x20, 0x28, 0x12, - 0xdc, 0x09, 0x01, 0x28, 0x4b, 0x2d, 0x18, 0xc6, - 0x1d, 0xe0, 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, - 0x68, 0x00, 0x60, 0x30, 0xe0, 0x41, 0x48, 0x26, - 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x28, - 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, - 0x1c, 0x28, 0xf0, 0x0a, 0xfa, 0xc7, 0x28, 0x00, - 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xbe, 0x49, 0x21, - 0x20, 0x91, 0xf0, 0x17, 0xfb, 0x6f, 0x28, 0x92, - 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xfb, 0x11, - 0x20, 0x92, 0x49, 0x1c, 0x60, 0x08, 0x20, 0x01, - 0x49, 0x1b, 0x68, 0x09, 0x60, 0x08, 0x48, 0x1a, - 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x0a, 0xfa, 0xc2, - 0x90, 0x00, 0x69, 0x60, 0x99, 0x00, 0x60, 0xc8, - 0x49, 0x14, 0x20, 0x91, 0xf0, 0x17, 0xfb, 0x56, - 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x12, - 0x68, 0x00, 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, - 0x49, 0x0f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0f, - 0x60, 0x08, 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, - 0xb0, 0x02, 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x8a, 0xb0, 0x01, - 0xe7, 0x88, 0x00, 0x00, 0xff, 0xff, 0xc3, 0xff, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, - 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x82, 0x1c, 0x3c, - 0x68, 0xe5, 0x26, 0x00, 0x99, 0x03, 0x29, 0x01, - 0xd1, 0x00, 0x26, 0x01, 0x69, 0x60, 0x06, 0x80, - 0x0f, 0xc0, 0x42, 0xb0, 0xd1, 0x05, 0x20, 0x00, - 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x69, 0x60, 0x23, 0x20, 0x43, 0xdb, - 0x40, 0x18, 0x07, 0xf1, 0x0e, 0x89, 0x43, 0x08, - 0x61, 0x60, 0x06, 0x80, 0x48, 0x44, 0x68, 0x00, + 0xe0, 0x04, 0x2e, 0x08, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xd0, 0x49, 0x3c, + 0x20, 0x91, 0xf0, 0x17, 0xfa, 0x57, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, 0xfa, 0x3e, + 0xe7, 0xf5, 0x00, 0xb0, 0x49, 0x37, 0x58, 0x08, + 0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x34, + 0x60, 0x08, 0x20, 0xff, 0xb0, 0x03, 0xe7, 0xbb, + 0x48, 0x30, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, + 0x69, 0x28, 0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x28, + 0x28, 0x12, 0xdc, 0x0b, 0x01, 0x30, 0x4b, 0x2e, + 0x18, 0xc0, 0x90, 0x01, 0x1d, 0xe8, 0x30, 0x0d, + 0x90, 0x00, 0x98, 0x00, 0x68, 0x00, 0x99, 0x01, + 0x60, 0x08, 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, + 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x30, + 0xf0, 0x0a, 0xf9, 0x4e, 0x28, 0x00, 0xd1, 0x05, + 0x20, 0x92, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x05, 0xe7, 0x91, 0x49, 0x20, 0x20, 0x91, + 0xf0, 0x17, 0xfa, 0x18, 0x28, 0x92, 0xd0, 0x00, + 0xe7, 0xf8, 0xf0, 0x0a, 0xf9, 0x98, 0x20, 0x92, + 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, 0x49, 0x1b, + 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, 0x68, 0x01, + 0x1c, 0x28, 0xf0, 0x0a, 0xf9, 0x49, 0x90, 0x00, + 0x69, 0x68, 0x99, 0x00, 0x60, 0xc8, 0x49, 0x14, + 0x20, 0x91, 0xf0, 0x17, 0xf9, 0xff, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, + 0x90, 0x01, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0f, + 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0xb0, 0x02, + 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, + 0xb0, 0x03, 0xe7, 0x5d, 0xb0, 0x03, 0xe7, 0x5b, + 0xff, 0xff, 0xbf, 0xff, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, + 0x68, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x7d, 0xb8, 0x1c, 0x01, 0x20, 0x0d, + 0x06, 0xc0, 0x60, 0x41, 0x48, 0x02, 0x63, 0x81, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0x68, 0x00, 0x0d, 0x00, 0x20, 0x0d, 0x06, 0xc0, + 0x68, 0x40, 0x02, 0x00, 0x0a, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x68, 0xd0, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x03, 0x1c, 0x0a, + 0x1c, 0x19, 0x69, 0x08, 0x28, 0x13, 0xd1, 0x01, + 0x20, 0x75, 0x47, 0x70, 0x69, 0x08, 0x28, 0x0b, + 0xdb, 0x0b, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x08, + 0x6d, 0x08, 0x60, 0x10, 0x6d, 0x88, 0x60, 0x90, + 0x6d, 0x48, 0x60, 0x50, 0x6d, 0xc8, 0x60, 0xd0, + 0xe0, 0x07, 0x6a, 0x88, 0x60, 0x10, 0x6b, 0x08, + 0x60, 0x90, 0x6a, 0xc8, 0x60, 0x50, 0x6b, 0x48, + 0x60, 0xd0, 0x20, 0x00, 0xe7, 0xe5, 0xe7, 0xe4, + 0x1c, 0x03, 0x1c, 0x0a, 0x68, 0x10, 0x60, 0x18, + 0x68, 0x90, 0x60, 0x98, 0x68, 0x50, 0x60, 0x58, + 0x68, 0xd0, 0x60, 0xd8, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, 0x05, 0x80, + 0x0f, 0x80, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, + 0x1c, 0x0a, 0x69, 0x50, 0x12, 0x80, 0x07, 0x00, + 0x0f, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, + 0x1c, 0x01, 0x1c, 0x0f, 0x22, 0x01, 0x69, 0x78, + 0x23, 0x20, 0x40, 0x18, 0xd1, 0x00, 0x22, 0x00, + 0x1c, 0x10, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, + 0x1c, 0x01, 0x1c, 0x0b, 0x69, 0x18, 0x28, 0x13, + 0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, 0x69, 0x58, + 0x06, 0x00, 0x0f, 0x82, 0x69, 0x58, 0x04, 0x40, + 0x0f, 0xc0, 0x00, 0x80, 0x43, 0x02, 0x1c, 0x10, + 0xe7, 0xf4, 0xe7, 0xf3, 0x1c, 0x01, 0x20, 0x0d, + 0x06, 0xc0, 0x61, 0x41, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x20, 0x0d, 0x06, 0xc0, 0x69, 0x40, + 0x1c, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x22, 0x00, 0x29, 0x01, 0xd1, 0x00, + 0x22, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, + 0x1c, 0x03, 0x2b, 0x02, 0xd1, 0x01, 0x29, 0x00, + 0xd1, 0x02, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0xc2, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x21, 0x01, + 0x20, 0x0d, 0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x02, + 0x2a, 0x00, 0xd1, 0x00, 0x21, 0x00, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, + 0x69, 0x10, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x90, + 0x1c, 0x07, 0x1c, 0x0a, 0x1c, 0x39, 0x69, 0x08, + 0x28, 0x13, 0xd0, 0x05, 0x69, 0x08, 0x28, 0x0b, + 0xdb, 0x05, 0x69, 0x08, 0x28, 0x12, 0xdc, 0x02, + 0x20, 0x86, 0xbc, 0x90, 0x47, 0x70, 0x6b, 0x8c, + 0x69, 0x48, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, + 0x08, 0x64, 0x69, 0x08, 0x00, 0x80, 0x4b, 0x03, + 0x58, 0x18, 0x43, 0x60, 0x60, 0x10, 0x20, 0x00, + 0xe7, 0xef, 0xe7, 0xee, 0x2e, 0x03, 0x3a, 0x54, + 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x9c, 0x02, + 0x69, 0x20, 0x28, 0x13, 0xd0, 0x05, 0x69, 0x20, + 0x28, 0x0b, 0xdb, 0x08, 0x69, 0x20, 0x28, 0x12, + 0xdc, 0x05, 0x20, 0x86, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xe5, + 0x68, 0x38, 0x64, 0x20, 0x68, 0x7e, 0x64, 0x66, + 0x08, 0xb6, 0x61, 0xa6, 0x48, 0x3f, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, - 0xb0, 0x02, 0xe7, 0xde, 0x49, 0x3b, 0x20, 0x91, - 0xf0, 0x17, 0xfa, 0xf4, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x09, 0xfa, 0xfd, 0xe7, 0xf5, - 0x00, 0xa8, 0x49, 0x37, 0x58, 0x08, 0x42, 0xb8, - 0xd0, 0x05, 0x20, 0x92, 0x49, 0x33, 0x60, 0x08, - 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xc9, 0x48, 0x30, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x69, 0x20, - 0x28, 0x0b, 0xdb, 0x0e, 0x69, 0x20, 0x28, 0x12, - 0xdc, 0x0b, 0x01, 0x28, 0x4b, 0x2d, 0x18, 0xc1, - 0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d, 0x90, 0x00, - 0x98, 0x00, 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, - 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x0a, - 0xfa, 0x0d, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, - 0x49, 0x1e, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x04, - 0xe7, 0x9f, 0x49, 0x20, 0x20, 0x91, 0xf0, 0x17, - 0xfa, 0xb5, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, - 0xf0, 0x0a, 0xfa, 0x57, 0x20, 0x92, 0x49, 0x1b, - 0x60, 0x08, 0x20, 0x01, 0x49, 0x1a, 0x68, 0x09, - 0x60, 0x08, 0x48, 0x19, 0x68, 0x01, 0x1c, 0x20, - 0xf0, 0x0a, 0xfa, 0x08, 0x90, 0x00, 0x69, 0x60, - 0x99, 0x00, 0x60, 0xc8, 0x49, 0x13, 0x20, 0x91, - 0xf0, 0x17, 0xfa, 0x9c, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, 0x90, 0x01, - 0x48, 0x10, 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, - 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, - 0x49, 0x0a, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, - 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, - 0xe7, 0x6b, 0xb0, 0x02, 0xe7, 0x69, 0x00, 0x00, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, - 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0xb0, 0x83, - 0x1c, 0x25, 0x69, 0x28, 0x28, 0x13, 0xd1, 0x04, - 0x20, 0x75, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x68, 0xee, 0x20, 0x04, 0x40, 0x38, - 0x08, 0x81, 0x91, 0x02, 0x69, 0x68, 0x23, 0xc0, - 0x43, 0xdb, 0x40, 0x18, 0x07, 0xb9, 0x0f, 0x89, - 0x01, 0x89, 0x43, 0x08, 0x61, 0x68, 0x06, 0x00, - 0x69, 0x68, 0x4b, 0x48, 0x40, 0x18, 0x99, 0x02, - 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x61, 0x68, - 0x04, 0x40, 0x48, 0x45, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x05, 0x2e, 0x19, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2e, 0x08, - 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x03, - 0xe7, 0xd0, 0x49, 0x3c, 0x20, 0x91, 0xf0, 0x17, - 0xfa, 0x35, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, - 0xf0, 0x09, 0xfa, 0x3e, 0xe7, 0xf5, 0x00, 0xb0, - 0x49, 0x37, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05, - 0x20, 0x92, 0x49, 0x34, 0x60, 0x08, 0x20, 0xff, - 0xb0, 0x03, 0xe7, 0xbb, 0x48, 0x30, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x05, 0x69, 0x28, 0x28, 0x0b, - 0xdb, 0x0e, 0x69, 0x28, 0x28, 0x12, 0xdc, 0x0b, - 0x01, 0x30, 0x4b, 0x2e, 0x18, 0xc0, 0x90, 0x01, - 0x1d, 0xe8, 0x30, 0x0d, 0x90, 0x00, 0x98, 0x00, - 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0xe0, 0x41, - 0x48, 0x25, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, - 0x48, 0x27, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, - 0xb0, 0x82, 0x1c, 0x30, 0xf0, 0x0a, 0xf9, 0x4e, - 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1f, - 0x60, 0x08, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x91, - 0x49, 0x20, 0x20, 0x91, 0xf0, 0x17, 0xf9, 0xf6, - 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, - 0xf9, 0x98, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, - 0x20, 0x01, 0x49, 0x1b, 0x68, 0x09, 0x60, 0x08, - 0x48, 0x19, 0x68, 0x01, 0x1c, 0x28, 0xf0, 0x0a, - 0xf9, 0x49, 0x90, 0x00, 0x69, 0x68, 0x99, 0x00, - 0x60, 0xc8, 0x49, 0x14, 0x20, 0x91, 0xf0, 0x17, - 0xf9, 0xdd, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, - 0x48, 0x11, 0x68, 0x00, 0x90, 0x01, 0x48, 0x11, - 0x68, 0x00, 0x49, 0x0f, 0x60, 0x08, 0x98, 0x01, - 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0b, - 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, 0x49, 0x05, - 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x5d, - 0xb0, 0x03, 0xe7, 0x5b, 0xff, 0xff, 0xbf, 0xff, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x00, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, - 0x1c, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x60, 0x41, - 0x48, 0x02, 0x63, 0x81, 0x20, 0x00, 0x47, 0x70, - 0xe7, 0xfd, 0x00, 0x00, 0x68, 0x00, 0x0d, 0x00, - 0x20, 0x0d, 0x06, 0xc0, 0x68, 0x40, 0x02, 0x00, - 0x0a, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, - 0x1c, 0x0a, 0x68, 0xd0, 0x47, 0x70, 0xe7, 0xfd, - 0x1c, 0x03, 0x1c, 0x0a, 0x1c, 0x19, 0x69, 0x08, - 0x28, 0x13, 0xd1, 0x01, 0x20, 0x75, 0x47, 0x70, - 0x69, 0x08, 0x28, 0x0b, 0xdb, 0x0b, 0x69, 0x08, - 0x28, 0x12, 0xdc, 0x08, 0x6d, 0x08, 0x60, 0x10, - 0x6d, 0x88, 0x60, 0x90, 0x6d, 0x48, 0x60, 0x50, - 0x6d, 0xc8, 0x60, 0xd0, 0xe0, 0x07, 0x6a, 0x88, - 0x60, 0x10, 0x6b, 0x08, 0x60, 0x90, 0x6a, 0xc8, - 0x60, 0x50, 0x6b, 0x48, 0x60, 0xd0, 0x20, 0x00, - 0xe7, 0xe5, 0xe7, 0xe4, 0x1c, 0x03, 0x1c, 0x0a, - 0x68, 0x10, 0x60, 0x18, 0x68, 0x90, 0x60, 0x98, - 0x68, 0x50, 0x60, 0x58, 0x68, 0xd0, 0x60, 0xd8, - 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, - 0x69, 0x50, 0x05, 0x80, 0x0f, 0x80, 0x47, 0x70, - 0xe7, 0xfd, 0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x50, - 0x12, 0x80, 0x07, 0x00, 0x0f, 0x00, 0x47, 0x70, - 0xe7, 0xfd, 0xb4, 0x80, 0x1c, 0x01, 0x1c, 0x0f, - 0x22, 0x01, 0x69, 0x78, 0x23, 0x20, 0x40, 0x18, - 0xd1, 0x00, 0x22, 0x00, 0x1c, 0x10, 0xbc, 0x80, - 0x47, 0x70, 0xe7, 0xfc, 0x1c, 0x01, 0x1c, 0x0b, - 0x69, 0x18, 0x28, 0x13, 0xd1, 0x01, 0x20, 0x75, - 0x47, 0x70, 0x69, 0x58, 0x06, 0x00, 0x0f, 0x82, - 0x69, 0x58, 0x04, 0x40, 0x0f, 0xc0, 0x00, 0x80, - 0x43, 0x02, 0x1c, 0x10, 0xe7, 0xf4, 0xe7, 0xf3, - 0x1c, 0x01, 0x20, 0x0d, 0x06, 0xc0, 0x61, 0x41, - 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x20, 0x0d, - 0x06, 0xc0, 0x69, 0x40, 0x1c, 0x01, 0x1c, 0x08, - 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x22, 0x00, - 0x29, 0x01, 0xd1, 0x00, 0x22, 0x01, 0x20, 0x0d, - 0x06, 0xc0, 0x68, 0xc0, 0x1c, 0x03, 0x2b, 0x02, - 0xd1, 0x01, 0x29, 0x00, 0xd1, 0x02, 0x20, 0x0d, - 0x06, 0xc0, 0x60, 0xc2, 0x20, 0x00, 0x47, 0x70, - 0xe7, 0xfd, 0x21, 0x01, 0x20, 0x0d, 0x06, 0xc0, - 0x68, 0xc0, 0x1c, 0x02, 0x2a, 0x00, 0xd1, 0x00, - 0x21, 0x00, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, - 0x1c, 0x01, 0x1c, 0x0a, 0x69, 0x10, 0x47, 0x70, - 0xe7, 0xfd, 0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, - 0x1c, 0x39, 0x69, 0x08, 0x28, 0x13, 0xd0, 0x05, - 0x69, 0x08, 0x28, 0x0b, 0xdb, 0x05, 0x69, 0x08, - 0x28, 0x12, 0xdc, 0x02, 0x20, 0x86, 0xbc, 0x90, - 0x47, 0x70, 0x6b, 0x8c, 0x69, 0x48, 0x23, 0x04, - 0x40, 0x18, 0xd0, 0x00, 0x08, 0x64, 0x69, 0x08, - 0x00, 0x80, 0x4b, 0x03, 0x58, 0x18, 0x43, 0x60, - 0x60, 0x10, 0x20, 0x00, 0xe7, 0xef, 0xe7, 0xee, - 0x2e, 0x03, 0x32, 0xf4, 0xb5, 0xf3, 0x1c, 0x07, - 0xb0, 0x81, 0x9c, 0x02, 0x69, 0x20, 0x28, 0x13, - 0xd0, 0x05, 0x69, 0x20, 0x28, 0x0b, 0xdb, 0x08, - 0x69, 0x20, 0x28, 0x12, 0xdc, 0x05, 0x20, 0x86, - 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x68, 0xe5, 0x68, 0x38, 0x64, 0x20, - 0x68, 0x7e, 0x64, 0x66, 0x08, 0xb6, 0x61, 0xa6, - 0x48, 0x3f, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, - 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, - 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, - 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, - 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xe0, - 0x49, 0x36, 0x20, 0x91, 0xf0, 0x17, 0xf8, 0xba, - 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x09, - 0xf8, 0xc3, 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x32, - 0x58, 0x08, 0x99, 0x02, 0x42, 0x88, 0xd0, 0x05, - 0x20, 0x92, 0x49, 0x2e, 0x60, 0x08, 0x20, 0x86, - 0xb0, 0x01, 0xe7, 0xca, 0x48, 0x2a, 0x68, 0x00, - 0x28, 0x00, 0xd1, 0x06, 0x01, 0x28, 0x4b, 0x2b, - 0x18, 0xc0, 0x90, 0x00, 0x98, 0x00, 0x60, 0x06, - 0xe0, 0x41, 0x48, 0x25, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x3d, 0x48, 0x27, 0x68, 0x00, 0x28, 0x01, - 0xd1, 0x39, 0xb0, 0x82, 0x1c, 0x28, 0xf0, 0x09, - 0xff, 0xdd, 0x28, 0x00, 0xd1, 0x05, 0x20, 0x92, - 0x49, 0x1e, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x03, - 0xe7, 0xab, 0x49, 0x20, 0x20, 0x91, 0xf0, 0x17, - 0xf8, 0x85, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, - 0xf0, 0x0a, 0xf8, 0x27, 0x20, 0x92, 0x49, 0x1b, - 0x60, 0x08, 0x20, 0x01, 0x49, 0x1a, 0x68, 0x09, - 0x60, 0x08, 0x48, 0x19, 0x68, 0x01, 0x1c, 0x20, - 0xf0, 0x09, 0xff, 0xd8, 0x90, 0x00, 0x69, 0xa0, - 0x99, 0x00, 0x61, 0x08, 0x49, 0x13, 0x20, 0x91, - 0xf0, 0x17, 0xf8, 0x6c, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0x48, 0x11, 0x68, 0x00, 0x90, 0x01, - 0x48, 0x10, 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, - 0x98, 0x01, 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, - 0x49, 0x0a, 0x60, 0x08, 0xb0, 0x02, 0x20, 0x92, - 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, - 0xe7, 0x77, 0xb0, 0x01, 0xe7, 0x75, 0x00, 0x00, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7c, 0x60, 0x68, 0x00, 0x0c, 0x04, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xc0, - 0xb4, 0x80, 0x1c, 0x01, 0x06, 0x0b, 0x0e, 0x1b, - 0x22, 0x01, 0x2a, 0x19, 0xd3, 0x02, 0xe0, 0x0f, - 0x32, 0x01, 0xe7, 0xfa, 0x00, 0x90, 0x4f, 0x08, - 0x58, 0x38, 0x68, 0x80, 0x02, 0x00, 0x0e, 0x00, - 0x42, 0x98, 0xd1, 0x04, 0x00, 0x90, 0x4f, 0x04, - 0x58, 0x38, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xef, - 0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0x60, 0xb4, 0x90, 0x1c, 0x07, - 0x1c, 0x0a, 0x06, 0x38, 0x16, 0x01, 0x48, 0x20, - 0x60, 0x02, 0x48, 0x20, 0x68, 0x80, 0x23, 0x33, - 0x06, 0x5b, 0x65, 0xd8, 0x48, 0x1d, 0x68, 0xc0, - 0x23, 0x33, 0x06, 0x5b, 0x66, 0x18, 0x48, 0x1c, - 0x4b, 0x1a, 0x60, 0x98, 0x48, 0x1b, 0x4b, 0x19, - 0x60, 0xd8, 0x20, 0x01, 0x23, 0x33, 0x06, 0x5b, - 0x66, 0xd8, 0x48, 0x19, 0x68, 0x04, 0x23, 0x01, - 0x04, 0xdb, 0x43, 0x23, 0x60, 0x03, 0x48, 0x16, - 0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x9c, - 0x1c, 0x23, 0x60, 0x03, 0x29, 0x00, 0xd1, 0x10, - 0x20, 0xff, 0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, - 0x62, 0x18, 0x48, 0x10, 0x68, 0x04, 0x23, 0xff, - 0x33, 0x01, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03, - 0x48, 0x0d, 0x23, 0x1b, 0x06, 0x9b, 0x64, 0x18, - 0xe0, 0x08, 0x20, 0xff, 0x30, 0x14, 0x23, 0x1b, - 0x06, 0x9b, 0x62, 0x18, 0x48, 0x02, 0x68, 0x00, - 0x4b, 0x08, 0x60, 0x18, 0xbc, 0x90, 0x47, 0x70, - 0x2e, 0x08, 0x5e, 0x58, 0x2e, 0x08, 0x7c, 0x24, - 0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00, - 0x6c, 0x00, 0x00, 0x40, 0x6c, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x82, 0x18, 0x6c, 0x00, 0x00, 0x80, - 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82, 0x23, 0x1b, - 0x06, 0x9b, 0x6a, 0x1b, 0x1c, 0x18, 0x27, 0x00, - 0x22, 0x00, 0x08, 0x40, 0x00, 0x40, 0x4b, 0xaf, - 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, 0x60, 0x1c, - 0x4b, 0xad, 0x68, 0x1b, 0x1c, 0x1d, 0x23, 0x1b, - 0x06, 0x9b, 0x6c, 0x1b, 0x93, 0x01, 0x23, 0xff, - 0x33, 0x01, 0x40, 0x03, 0xd0, 0x00, 0x22, 0xff, - 0x23, 0x01, 0x04, 0x9b, 0x40, 0x03, 0xd0, 0x1b, - 0x4c, 0xa4, 0x68, 0x26, 0x23, 0x01, 0x04, 0x9b, - 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0x4c, 0xa1, - 0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23, - 0x23, 0x00, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x0a, - 0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00, 0x33, 0x01, - 0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0x4b, 0x99, - 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, 0x60, 0x1c, - 0x23, 0x01, 0x02, 0x9b, 0x40, 0x0b, 0xd0, 0x29, - 0x23, 0x01, 0x02, 0xdb, 0x40, 0x0b, 0xd0, 0x01, - 0x4b, 0x94, 0x40, 0x18, 0x23, 0x01, 0x03, 0x1b, - 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x01, 0x05, 0x9b, - 0x43, 0x18, 0x4b, 0x91, 0x40, 0x18, 0x02, 0x4c, - 0x23, 0x7f, 0x02, 0x5b, 0x40, 0x23, 0x43, 0x18, - 0x23, 0x40, 0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, - 0x04, 0x5b, 0x43, 0x18, 0xe0, 0x0a, 0x4b, 0x8b, - 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x03, - 0x23, 0x01, 0x04, 0x1b, 0x43, 0x18, 0xe0, 0x01, - 0x4b, 0x87, 0x40, 0x18, 0x23, 0x1b, 0x06, 0x9b, - 0x62, 0x18, 0xe0, 0xfc, 0x23, 0x04, 0x40, 0x0b, - 0xd0, 0x0f, 0x4c, 0x7e, 0x68, 0x26, 0x23, 0x01, - 0x43, 0x33, 0x60, 0x23, 0x4b, 0x81, 0x68, 0x9b, - 0x24, 0x33, 0x06, 0x64, 0x65, 0xe3, 0x4b, 0x7f, - 0x68, 0xdb, 0x24, 0x33, 0x06, 0x64, 0x66, 0x23, - 0xe0, 0xe9, 0x23, 0x01, 0x03, 0x5b, 0x40, 0x0b, - 0xd0, 0x13, 0x4b, 0x7a, 0x68, 0x9b, 0x24, 0x33, - 0x06, 0x64, 0x65, 0xe3, 0x4b, 0x77, 0x68, 0xdb, - 0x24, 0x33, 0x06, 0x64, 0x66, 0x23, 0x23, 0x01, - 0x24, 0x33, 0x06, 0x64, 0x66, 0xe3, 0x4c, 0x6d, + 0xb0, 0x01, 0xe7, 0xe0, 0x49, 0x36, 0x20, 0x91, + 0xf0, 0x17, 0xf8, 0xdc, 0x28, 0x92, 0xd0, 0x03, + 0x20, 0x01, 0xf0, 0x09, 0xf8, 0xc3, 0xe7, 0xf5, + 0x00, 0xa8, 0x49, 0x32, 0x58, 0x08, 0x99, 0x02, + 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x2e, + 0x60, 0x08, 0x20, 0x86, 0xb0, 0x01, 0xe7, 0xca, + 0x48, 0x2a, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x06, + 0x01, 0x28, 0x4b, 0x2b, 0x18, 0xc0, 0x90, 0x00, + 0x98, 0x00, 0x60, 0x06, 0xe0, 0x41, 0x48, 0x25, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x3d, 0x48, 0x27, + 0x68, 0x00, 0x28, 0x01, 0xd1, 0x39, 0xb0, 0x82, + 0x1c, 0x28, 0xf0, 0x09, 0xff, 0xdd, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0x92, 0x49, 0x1e, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x03, 0xe7, 0xab, 0x49, 0x20, + 0x20, 0x91, 0xf0, 0x17, 0xf8, 0xa7, 0x28, 0x92, + 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x0a, 0xf8, 0x27, + 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x1a, 0x68, 0x09, 0x60, 0x08, 0x48, 0x19, + 0x68, 0x01, 0x1c, 0x20, 0xf0, 0x09, 0xff, 0xd8, + 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x61, 0x08, + 0x49, 0x13, 0x20, 0x91, 0xf0, 0x17, 0xf8, 0x8e, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x11, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x10, 0x68, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x98, 0x01, 0x49, 0x0e, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, + 0xb0, 0x02, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x77, 0xb0, 0x01, + 0xe7, 0x75, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, + 0x68, 0x00, 0x0c, 0x04, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x7d, 0xb8, 0xb4, 0x80, 0x1c, 0x01, + 0x06, 0x0b, 0x0e, 0x1b, 0x22, 0x01, 0x2a, 0x19, + 0xd3, 0x02, 0xe0, 0x0f, 0x32, 0x01, 0xe7, 0xfa, + 0x00, 0x90, 0x4f, 0x08, 0x58, 0x38, 0x68, 0x80, + 0x02, 0x00, 0x0e, 0x00, 0x42, 0x98, 0xd1, 0x04, + 0x00, 0x90, 0x4f, 0x04, 0x58, 0x38, 0xbc, 0x80, + 0x47, 0x70, 0xe7, 0xef, 0x20, 0x00, 0xe7, 0xfa, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58, + 0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x38, + 0x16, 0x01, 0x48, 0x20, 0x60, 0x02, 0x48, 0x20, + 0x68, 0x80, 0x23, 0x33, 0x06, 0x5b, 0x65, 0xd8, + 0x48, 0x1d, 0x68, 0xc0, 0x23, 0x33, 0x06, 0x5b, + 0x66, 0x18, 0x48, 0x1c, 0x4b, 0x1a, 0x60, 0x98, + 0x48, 0x1b, 0x4b, 0x19, 0x60, 0xd8, 0x20, 0x01, + 0x23, 0x33, 0x06, 0x5b, 0x66, 0xd8, 0x48, 0x19, + 0x68, 0x04, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x23, + 0x60, 0x03, 0x48, 0x16, 0x68, 0x04, 0x23, 0x01, + 0x04, 0xdb, 0x43, 0x9c, 0x1c, 0x23, 0x60, 0x03, + 0x29, 0x00, 0xd1, 0x10, 0x20, 0xff, 0x30, 0x14, + 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0x48, 0x10, + 0x68, 0x04, 0x23, 0xff, 0x33, 0x01, 0x43, 0x9c, + 0x1c, 0x23, 0x60, 0x03, 0x48, 0x0d, 0x23, 0x1b, + 0x06, 0x9b, 0x64, 0x18, 0xe0, 0x08, 0x20, 0xff, + 0x30, 0x14, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x48, 0x02, 0x68, 0x00, 0x4b, 0x08, 0x60, 0x18, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x5e, 0x50, + 0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x6c, 0x00, 0x00, 0x40, + 0x6c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x82, 0x18, + 0x6c, 0x00, 0x00, 0x80, 0xb4, 0xf0, 0x1c, 0x01, + 0xb0, 0x82, 0x23, 0x1b, 0x06, 0x9b, 0x6a, 0x1b, + 0x1c, 0x18, 0x27, 0x00, 0x22, 0x00, 0x08, 0x40, + 0x00, 0x40, 0x4b, 0xaf, 0x68, 0x1c, 0x08, 0x64, + 0x00, 0x64, 0x60, 0x1c, 0x4b, 0xad, 0x68, 0x1b, + 0x1c, 0x1d, 0x23, 0x1b, 0x06, 0x9b, 0x6c, 0x1b, + 0x93, 0x01, 0x23, 0xff, 0x33, 0x01, 0x40, 0x03, + 0xd0, 0x00, 0x22, 0xff, 0x23, 0x01, 0x04, 0x9b, + 0x40, 0x03, 0xd0, 0x1b, 0x4c, 0xa4, 0x68, 0x26, + 0x23, 0x01, 0x04, 0x9b, 0x43, 0x9e, 0x1c, 0x33, + 0x60, 0x23, 0x4c, 0xa1, 0x68, 0x26, 0x23, 0x01, + 0x43, 0x33, 0x60, 0x23, 0x23, 0x00, 0x93, 0x00, + 0x9b, 0x00, 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, + 0x9b, 0x00, 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, + 0xe7, 0xfa, 0x4b, 0x99, 0x68, 0x1c, 0x08, 0x64, + 0x00, 0x64, 0x60, 0x1c, 0x23, 0x01, 0x02, 0x9b, + 0x40, 0x0b, 0xd0, 0x29, 0x23, 0x01, 0x02, 0xdb, + 0x40, 0x0b, 0xd0, 0x01, 0x4b, 0x94, 0x40, 0x18, + 0x23, 0x01, 0x03, 0x1b, 0x40, 0x0b, 0xd0, 0x02, + 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x4b, 0x91, + 0x40, 0x18, 0x02, 0x4c, 0x23, 0x7f, 0x02, 0x5b, + 0x40, 0x23, 0x43, 0x18, 0x23, 0x40, 0x40, 0x0b, + 0xd0, 0x03, 0x23, 0x01, 0x04, 0x5b, 0x43, 0x18, + 0xe0, 0x0a, 0x4b, 0x8b, 0x40, 0x18, 0x23, 0x20, + 0x40, 0x0b, 0xd0, 0x03, 0x23, 0x01, 0x04, 0x1b, + 0x43, 0x18, 0xe0, 0x01, 0x4b, 0x87, 0x40, 0x18, + 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0xe0, 0xfc, + 0x23, 0x04, 0x40, 0x0b, 0xd0, 0x0f, 0x4c, 0x7e, 0x68, 0x26, 0x23, 0x01, 0x43, 0x33, 0x60, 0x23, - 0xe0, 0xd1, 0x07, 0xcb, 0x0f, 0xdb, 0xd0, 0x02, - 0x23, 0x02, 0x43, 0x18, 0xe0, 0x05, 0x23, 0x02, - 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x02, 0x43, 0xdb, - 0x40, 0x18, 0x23, 0x07, 0x01, 0xdb, 0x40, 0x0b, - 0xd0, 0x0f, 0x23, 0x0c, 0x43, 0xdb, 0x40, 0x18, - 0x23, 0xff, 0x33, 0x01, 0x40, 0x0b, 0xd0, 0x02, - 0x23, 0x04, 0x43, 0x18, 0xe0, 0x05, 0x23, 0x01, - 0x02, 0x5b, 0x40, 0x0b, 0xd0, 0x01, 0x23, 0x08, - 0x43, 0x18, 0x23, 0x01, 0x04, 0x1b, 0x40, 0x0b, - 0xd0, 0x08, 0x23, 0x01, 0x04, 0x9b, 0x43, 0x98, - 0x1c, 0x04, 0x20, 0x01, 0x04, 0xc0, 0x43, 0x20, - 0x23, 0x01, 0x43, 0x18, 0x23, 0x78, 0x40, 0x0b, - 0xd0, 0x73, 0x23, 0x30, 0x40, 0x03, 0xd0, 0x06, - 0x2b, 0x10, 0xd0, 0x04, 0x2b, 0x20, 0xd0, 0x42, - 0x2b, 0x30, 0xd0, 0x40, 0xe0, 0x81, 0x23, 0x10, - 0x40, 0x0b, 0xd1, 0x02, 0x23, 0x08, 0x40, 0x0b, - 0xd0, 0x08, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, - 0x23, 0x10, 0x40, 0x0b, 0xd0, 0x01, 0x23, 0x10, - 0x43, 0x18, 0xe0, 0x2f, 0x23, 0x30, 0x43, 0xdb, - 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x02, - 0x23, 0x20, 0x43, 0x18, 0xe0, 0x01, 0x23, 0x30, - 0x43, 0x18, 0x23, 0x01, 0x43, 0x18, 0x23, 0x1b, - 0x06, 0x9b, 0x62, 0x18, 0x27, 0xff, 0x2a, 0x00, - 0xd0, 0x04, 0x4b, 0x43, 0x68, 0x1b, 0x4c, 0x43, - 0x60, 0x23, 0xe0, 0x17, 0x07, 0xab, 0x0f, 0x9b, - 0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, - 0xd0, 0x0a, 0xe0, 0x0e, 0x4b, 0x3e, 0x24, 0x1b, - 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x0a, 0x4b, 0x3d, - 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x05, - 0x4b, 0x3b, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, - 0xe0, 0x00, 0xe7, 0xff, 0xe0, 0x42, 0x23, 0x40, - 0x40, 0x0b, 0xd1, 0x02, 0x23, 0x20, 0x40, 0x0b, - 0xd0, 0x0b, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, - 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x20, - 0x43, 0x18, 0xe0, 0x01, 0x23, 0x30, 0x43, 0x18, - 0xe0, 0x2e, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, - 0x23, 0x10, 0x40, 0x0b, 0xd0, 0x01, 0x23, 0x10, - 0x43, 0x18, 0x23, 0x01, 0x43, 0x18, 0x23, 0x1b, - 0x06, 0x9b, 0x62, 0x18, 0x27, 0xff, 0x2a, 0x00, - 0xd0, 0x04, 0x4b, 0x23, 0x68, 0x1b, 0x4c, 0x23, - 0x60, 0x23, 0xe0, 0x19, 0x07, 0xab, 0x0f, 0x9b, - 0xe0, 0x00, 0xe0, 0x17, 0xd0, 0x09, 0x2b, 0x01, + 0x4b, 0x81, 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, + 0x65, 0xe3, 0x4b, 0x7f, 0x68, 0xdb, 0x24, 0x33, + 0x06, 0x64, 0x66, 0x23, 0xe0, 0xe9, 0x23, 0x01, + 0x03, 0x5b, 0x40, 0x0b, 0xd0, 0x13, 0x4b, 0x7a, + 0x68, 0x9b, 0x24, 0x33, 0x06, 0x64, 0x65, 0xe3, + 0x4b, 0x77, 0x68, 0xdb, 0x24, 0x33, 0x06, 0x64, + 0x66, 0x23, 0x23, 0x01, 0x24, 0x33, 0x06, 0x64, + 0x66, 0xe3, 0x4c, 0x6d, 0x68, 0x26, 0x23, 0x01, + 0x43, 0x33, 0x60, 0x23, 0xe0, 0xd1, 0x07, 0xcb, + 0x0f, 0xdb, 0xd0, 0x02, 0x23, 0x02, 0x43, 0x18, + 0xe0, 0x05, 0x23, 0x02, 0x40, 0x0b, 0xd0, 0x02, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x07, + 0x01, 0xdb, 0x40, 0x0b, 0xd0, 0x0f, 0x23, 0x0c, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0xff, 0x33, 0x01, + 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x04, 0x43, 0x18, + 0xe0, 0x05, 0x23, 0x01, 0x02, 0x5b, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x08, 0x43, 0x18, 0x23, 0x01, + 0x04, 0x1b, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x01, + 0x04, 0x9b, 0x43, 0x98, 0x1c, 0x04, 0x20, 0x01, + 0x04, 0xc0, 0x43, 0x20, 0x23, 0x01, 0x43, 0x18, + 0x23, 0x78, 0x40, 0x0b, 0xd0, 0x73, 0x23, 0x30, + 0x40, 0x03, 0xd0, 0x06, 0x2b, 0x10, 0xd0, 0x04, + 0x2b, 0x20, 0xd0, 0x42, 0x2b, 0x30, 0xd0, 0x40, + 0xe0, 0x81, 0x23, 0x10, 0x40, 0x0b, 0xd1, 0x02, + 0x23, 0x08, 0x40, 0x0b, 0xd0, 0x08, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0xe0, 0x2f, + 0x23, 0x30, 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, + 0x40, 0x0b, 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, + 0xe0, 0x01, 0x23, 0x30, 0x43, 0x18, 0x23, 0x01, + 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x43, + 0x68, 0x1b, 0x4c, 0x43, 0x60, 0x23, 0xe0, 0x17, + 0x07, 0xab, 0x0f, 0x9b, 0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, 0xd0, 0x0a, 0xe0, 0x0e, - 0x4b, 0x20, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, - 0xe0, 0x0a, 0x4b, 0x1f, 0x24, 0x1b, 0x06, 0xa4, - 0x64, 0x23, 0xe0, 0x05, 0x4b, 0x1d, 0x24, 0x1b, + 0x4b, 0x3e, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, + 0xe0, 0x0a, 0x4b, 0x3d, 0x24, 0x1b, 0x06, 0xa4, + 0x64, 0x23, 0xe0, 0x05, 0x4b, 0x3b, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x00, 0xe7, 0xff, - 0xe0, 0x00, 0xe7, 0xff, 0x2f, 0x00, 0xd1, 0x12, - 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, 0x23, 0x00, - 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x0a, 0xdb, 0x04, - 0xe0, 0x04, 0x9b, 0x00, 0x33, 0x01, 0x93, 0x00, - 0xe7, 0xf7, 0xe7, 0xfa, 0x4b, 0x03, 0x68, 0x1c, - 0x08, 0x64, 0x00, 0x64, 0x60, 0x1c, 0xb0, 0x02, - 0xbc, 0xf0, 0x47, 0x70, 0x6c, 0x00, 0x00, 0x20, - 0x6c, 0x00, 0x68, 0x00, 0xff, 0xbf, 0xff, 0xff, - 0xff, 0xfe, 0x01, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0xff, 0x2e, 0x08, 0x7c, 0x24, - 0x2e, 0x08, 0x5e, 0x58, 0x6c, 0x00, 0x00, 0x80, - 0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60, - 0x00, 0x02, 0x54, 0x28, 0x00, 0x00, 0x82, 0x18, + 0xe0, 0x42, 0x23, 0x40, 0x40, 0x0b, 0xd1, 0x02, + 0x23, 0x20, 0x40, 0x0b, 0xd0, 0x0b, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x20, 0x40, 0x0b, + 0xd0, 0x02, 0x23, 0x20, 0x43, 0x18, 0xe0, 0x01, + 0x23, 0x30, 0x43, 0x18, 0xe0, 0x2e, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x18, 0x23, 0x10, 0x40, 0x0b, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x23, 0x01, + 0x43, 0x18, 0x23, 0x1b, 0x06, 0x9b, 0x62, 0x18, + 0x27, 0xff, 0x2a, 0x00, 0xd0, 0x04, 0x4b, 0x23, + 0x68, 0x1b, 0x4c, 0x23, 0x60, 0x23, 0xe0, 0x19, + 0x07, 0xab, 0x0f, 0x9b, 0xe0, 0x00, 0xe0, 0x17, + 0xd0, 0x09, 0x2b, 0x01, 0xd0, 0x02, 0x2b, 0x02, + 0xd0, 0x0a, 0xe0, 0x0e, 0x4b, 0x20, 0x24, 0x1b, + 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x0a, 0x4b, 0x1f, + 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, 0xe0, 0x05, + 0x4b, 0x1d, 0x24, 0x1b, 0x06, 0xa4, 0x64, 0x23, + 0xe0, 0x00, 0xe7, 0xff, 0xe0, 0x00, 0xe7, 0xff, + 0x2f, 0x00, 0xd1, 0x12, 0x23, 0x1b, 0x06, 0x9b, + 0x62, 0x18, 0x23, 0x00, 0x93, 0x00, 0x9b, 0x00, + 0x2b, 0x0a, 0xdb, 0x04, 0xe0, 0x04, 0x9b, 0x00, + 0x33, 0x01, 0x93, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, + 0x4b, 0x03, 0x68, 0x1c, 0x08, 0x64, 0x00, 0x64, + 0x60, 0x1c, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x6c, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x68, 0x00, + 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0x01, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0x2e, 0x08, 0x7c, 0x1c, 0x2e, 0x08, 0x5e, 0x50, + 0x6c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x98, 0x60, + 0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28, + 0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, + 0x00, 0x02, 0x42, 0x18, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, 0x6d, 0xc9, + 0x1a, 0x46, 0x48, 0x12, 0x6c, 0x80, 0x1c, 0x04, + 0x48, 0x10, 0x6c, 0xc0, 0x1c, 0x05, 0x42, 0xac, + 0xd9, 0x09, 0x1b, 0x60, 0x21, 0x64, 0x43, 0x41, + 0x1c, 0x30, 0xf0, 0x09, 0xff, 0xcb, 0x21, 0x64, + 0x1a, 0x08, 0x60, 0x38, 0xe0, 0x06, 0x1b, 0x28, + 0x21, 0x64, 0x43, 0x41, 0x1c, 0x30, 0xf0, 0x09, + 0xff, 0xc1, 0x60, 0x38, 0x42, 0xac, 0xd1, 0x03, + 0x20, 0x31, 0xb0, 0x01, 0xe7, 0xd6, 0xe0, 0x02, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd2, 0xb0, 0x01, + 0xe7, 0xd0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, + 0xb5, 0xff, 0x1c, 0x14, 0x1c, 0x1f, 0xb0, 0x82, + 0x98, 0x02, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x00, + 0x98, 0x0b, 0x06, 0x03, 0x16, 0x1b, 0x93, 0x01, + 0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x9b, 0x05, 0x2b, 0x1f, + 0xdd, 0x02, 0x20, 0xaf, 0xb0, 0x06, 0xe7, 0xf5, + 0x98, 0x07, 0x90, 0x01, 0x2f, 0x00, 0xd0, 0x47, + 0xb0, 0x81, 0x98, 0x08, 0x22, 0x00, 0x92, 0x00, + 0x22, 0x1b, 0x06, 0x92, 0x6a, 0x12, 0x23, 0x01, + 0x05, 0x1b, 0x40, 0x1a, 0xd0, 0x01, 0x22, 0xff, + 0x92, 0x00, 0x25, 0x00, 0x08, 0x62, 0x42, 0xaa, + 0xd8, 0x02, 0xe0, 0x34, 0x35, 0x01, 0xe7, 0xf9, + 0x9a, 0x00, 0x2a, 0x00, 0xd0, 0x1e, 0x88, 0x02, + 0x23, 0xff, 0x02, 0x1b, 0x40, 0x1a, 0x12, 0x12, + 0x88, 0x03, 0x02, 0x1b, 0x43, 0x1a, 0x04, 0x11, + 0x0c, 0x09, 0x2f, 0x00, 0xda, 0x05, 0x42, 0x7a, + 0x41, 0x11, 0x1c, 0x0b, 0x04, 0x19, 0x0c, 0x09, + 0xe0, 0x03, 0x40, 0xb9, 0x1c, 0x0a, 0x04, 0x11, + 0x0c, 0x09, 0x22, 0xff, 0x02, 0x12, 0x40, 0x0a, + 0x12, 0x12, 0x02, 0x0b, 0x43, 0x13, 0x80, 0x03, + 0x30, 0x02, 0xe0, 0x0f, 0x2f, 0x00, 0xda, 0x07, + 0x88, 0x02, 0x42, 0x7e, 0x41, 0x32, 0x04, 0x12, + 0x0c, 0x12, 0x80, 0x02, 0x30, 0x02, 0xe0, 0x05, + 0x88, 0x02, 0x40, 0xba, 0x04, 0x12, 0x0c, 0x12, + 0x80, 0x02, 0x30, 0x02, 0xe7, 0xca, 0xb0, 0x01, + 0x49, 0x23, 0x91, 0x03, 0x20, 0x01, 0x06, 0x00, + 0x99, 0x03, 0x60, 0x08, 0x48, 0x21, 0x6c, 0x80, + 0x49, 0x20, 0x6c, 0xc9, 0x1a, 0x40, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xdc, 0x09, 0x20, 0x33, + 0x06, 0x40, 0x6e, 0x00, 0x21, 0x33, 0x06, 0x49, + 0x6d, 0xc9, 0x1a, 0x40, 0x99, 0x00, 0x18, 0x40, + 0x90, 0x00, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, + 0x42, 0x98, 0xda, 0x02, 0x20, 0x06, 0xf0, 0x08, + 0xfd, 0x8d, 0x98, 0x00, 0x23, 0x3b, 0x01, 0xdb, + 0x42, 0x98, 0xdb, 0xdf, 0x98, 0x00, 0x42, 0x84, + 0xd9, 0x02, 0x98, 0x00, 0x90, 0x02, 0xe0, 0x00, + 0x94, 0x02, 0x22, 0x04, 0x99, 0x03, 0xb4, 0x06, + 0x9b, 0x07, 0x9a, 0x04, 0x99, 0x06, 0x98, 0x03, + 0xf0, 0x04, 0xfb, 0x8c, 0xb0, 0x02, 0x98, 0x02, + 0x1a, 0x24, 0x98, 0x01, 0x99, 0x02, 0x18, 0x40, + 0x90, 0x01, 0x20, 0x00, 0x90, 0x00, 0x2c, 0x00, + 0xd1, 0xc4, 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x65, + 0xb0, 0x04, 0xb0, 0x02, 0xe7, 0x62, 0x00, 0x00, + 0x9e, 0x00, 0x08, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x07, 0xc0, + 0x0f, 0xc0, 0x4a, 0x03, 0x68, 0x12, 0x1c, 0x01, + 0x43, 0x11, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0x6c, 0x00, 0x08, 0x00, 0xb4, 0x90, 0x1c, 0x01, + 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x04, + 0x48, 0x1b, 0x68, 0x00, 0x1c, 0x07, 0x20, 0x30, + 0x40, 0x20, 0xd0, 0x06, 0x28, 0x10, 0xd0, 0x06, + 0x28, 0x20, 0xd0, 0x06, 0x28, 0x30, 0xd0, 0x06, + 0xe0, 0x07, 0x22, 0x01, 0xe0, 0x08, 0x22, 0x02, + 0xe0, 0x06, 0x22, 0x04, 0xe0, 0x04, 0x22, 0x08, + 0xe0, 0x02, 0x20, 0x30, 0xbc, 0x90, 0x47, 0x70, + 0x20, 0x03, 0x07, 0x40, 0x40, 0x38, 0x0f, 0x40, + 0xd0, 0x04, 0x28, 0x01, 0xd0, 0x05, 0x28, 0x02, + 0xd0, 0x06, 0xe0, 0x08, 0x23, 0x10, 0x43, 0x1a, + 0xe0, 0x07, 0x23, 0x20, 0x43, 0x1a, 0xe0, 0x04, + 0x23, 0x40, 0x43, 0x1a, 0xe0, 0x01, 0x20, 0x30, + 0xe7, 0xe8, 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, + 0xd1, 0x01, 0x23, 0x80, 0x43, 0x1a, 0x60, 0x0a, + 0x20, 0x00, 0xe7, 0xdf, 0xe7, 0xde, 0x00, 0x00, + 0x6c, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x48, 0x01, + 0x60, 0x01, 0x47, 0x70, 0x6c, 0x00, 0x00, 0x80, + 0x1c, 0x01, 0x29, 0x1f, 0xdd, 0x01, 0x20, 0xaf, + 0x47, 0x70, 0x20, 0x80, 0x6c, 0x00, 0x60, 0x01, + 0x20, 0x00, 0xe7, 0xf9, 0xe7, 0xf8, 0xb5, 0xf3, + 0x1c, 0x0a, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x03, + 0x0e, 0x1b, 0x93, 0x00, 0xb0, 0x81, 0x20, 0x1b, + 0x06, 0x80, 0x6a, 0x00, 0x1c, 0x01, 0x25, 0x00, + 0x20, 0x00, 0x90, 0x00, 0x20, 0x1b, 0x06, 0x80, + 0x6c, 0x00, 0x1c, 0x04, 0x27, 0x00, 0x9b, 0x01, + 0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc0, 0x9b, 0x01, 0x00, 0xdb, + 0x4e, 0x5f, 0x68, 0x36, 0x19, 0x9b, 0x60, 0x58, + 0x20, 0xff, 0x30, 0x01, 0x40, 0x08, 0xd0, 0x01, + 0x20, 0xff, 0x90, 0x00, 0x23, 0x01, 0x04, 0xdb, + 0x43, 0x99, 0x1c, 0x08, 0x21, 0x01, 0x04, 0x89, + 0x43, 0x01, 0x20, 0x01, 0x03, 0x00, 0x40, 0x10, + 0xd0, 0x05, 0x06, 0x90, 0x0e, 0x80, 0xd0, 0x02, + 0x23, 0x01, 0x05, 0x1b, 0x43, 0x19, 0x23, 0x30, + 0x43, 0xdb, 0x40, 0x19, 0x05, 0x10, 0x0d, 0x00, + 0x28, 0x40, 0xd0, 0x48, 0xdc, 0x0e, 0x28, 0x08, + 0xd0, 0x32, 0xdc, 0x06, 0x28, 0x01, 0xd0, 0x1e, + 0x28, 0x02, 0xd0, 0x21, 0x28, 0x04, 0xd0, 0x26, + 0xe0, 0x67, 0x28, 0x10, 0xd0, 0x2f, 0x28, 0x20, + 0xd0, 0x32, 0xe0, 0x62, 0x23, 0x01, 0x02, 0x5b, + 0x42, 0x98, 0xd0, 0x49, 0xdc, 0x06, 0x28, 0x80, + 0xd0, 0x38, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x3b, 0xe0, 0x56, 0x23, 0x01, 0x02, 0x9b, + 0x42, 0x98, 0xd0, 0x44, 0x23, 0x01, 0x02, 0xdb, + 0x42, 0x98, 0xd0, 0x47, 0xe0, 0x4d, 0x4b, 0x3d, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x3b, 0xe0, 0x49, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x39, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x38, 0xe0, 0x42, 0x4b, 0x38, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x36, 0xe0, 0x3d, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x34, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x33, 0xe0, 0x36, 0x4b, 0x33, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x31, 0xe0, 0x31, + 0x23, 0x10, 0x43, 0x19, 0x4b, 0x2f, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x2e, 0xe0, 0x2a, 0x23, 0x20, + 0x43, 0x19, 0x4b, 0x2d, 0x42, 0x9c, 0xd0, 0x00, + 0x4f, 0x2b, 0xe0, 0x23, 0x23, 0x30, 0x43, 0x19, + 0x4b, 0x29, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x28, + 0xe0, 0x1c, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x27, + 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x25, 0xe0, 0x15, + 0x23, 0x30, 0x43, 0x19, 0x4b, 0x23, 0x42, 0x9c, + 0xd0, 0x00, 0x4f, 0x22, 0xe0, 0x0e, 0x23, 0x20, + 0x43, 0x19, 0x4b, 0x21, 0x42, 0x9c, 0xd0, 0x00, + 0x4f, 0x1f, 0xe0, 0x07, 0x23, 0x30, 0x43, 0x19, + 0x4b, 0x1d, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x1c, + 0xe0, 0x00, 0xe7, 0xff, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x0a, 0x23, 0x01, 0x43, 0x19, 0x20, 0x1b, + 0x06, 0x80, 0x62, 0x01, 0x48, 0x17, 0x68, 0x00, + 0x4b, 0x17, 0x60, 0x18, 0x25, 0xff, 0xe0, 0x0e, + 0x23, 0x01, 0x43, 0x19, 0x2f, 0x00, 0xd0, 0x07, + 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x20, 0x1b, + 0x06, 0x80, 0x64, 0x07, 0x25, 0xff, 0xe0, 0x02, + 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, 0x2d, 0x00, + 0xd1, 0x04, 0x48, 0x0e, 0x68, 0x03, 0x08, 0x5b, + 0x00, 0x5b, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0x36, 0xb0, 0x01, 0xb0, 0x01, 0xe7, 0x33, + 0x2e, 0x08, 0x5d, 0xd4, 0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, 0x00, 0x02, 0x42, 0x18, - 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x98, 0x01, - 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, - 0x28, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x01, + 0x00, 0x00, 0x98, 0x60, 0x00, 0x01, 0x58, 0x60, + 0x00, 0x02, 0x54, 0x28, 0x2e, 0x08, 0x5e, 0x50, + 0x6c, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x49, 0x2c, + 0x46, 0x68, 0x22, 0x08, 0xf0, 0x09, 0xfd, 0xca, + 0x20, 0x04, 0xf7, 0xff, 0xfc, 0x23, 0x48, 0x29, + 0x68, 0x80, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8, + 0x48, 0x26, 0x68, 0xc0, 0x21, 0x33, 0x06, 0x49, + 0x66, 0x08, 0x48, 0x25, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x33, + 0x06, 0x49, 0x67, 0xc8, 0x48, 0x21, 0x68, 0x01, + 0x31, 0xff, 0x31, 0xff, 0x31, 0x02, 0x60, 0x01, + 0x1c, 0x78, 0x12, 0x00, 0xab, 0x01, 0x70, 0x18, + 0x1c, 0x78, 0xab, 0x01, 0x70, 0x58, 0x20, 0x33, + 0x06, 0x40, 0x6d, 0xc5, 0x4b, 0x1a, 0x43, 0x1d, + 0x26, 0x00, 0x2e, 0x10, 0xdb, 0x02, 0xe0, 0x18, + 0x36, 0x01, 0xe7, 0xfa, 0x24, 0x00, 0x2c, 0x07, + 0xd3, 0x02, 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, + 0x46, 0x68, 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, + 0xe7, 0xf8, 0x24, 0x00, 0x42, 0xbc, 0xdb, 0x02, + 0xe0, 0x06, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x02, + 0x5d, 0x01, 0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8, + 0xe7, 0xe6, 0x20, 0x33, 0x06, 0x40, 0x66, 0x05, + 0x48, 0x0a, 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, + 0x43, 0x19, 0x60, 0x01, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x03, 0x39, 0xfc, 0x2e, 0x08, 0x7c, 0x1c, + 0x66, 0x00, 0x00, 0x70, 0x66, 0x00, 0x00, 0x5c, + 0xcc, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x20, + 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x20, + 0x0e, 0x00, 0x06, 0x3d, 0x0e, 0x2d, 0x99, 0x02, + 0x06, 0x0a, 0x0e, 0x12, 0x21, 0x02, 0x40, 0x01, + 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x2f, 0x68, 0x1b, + 0x72, 0x19, 0xe0, 0x0c, 0x49, 0x2d, 0x68, 0x09, + 0x7a, 0x09, 0x29, 0xff, 0xd1, 0x03, 0x21, 0x00, + 0x4b, 0x2a, 0x68, 0x1b, 0x60, 0x19, 0x21, 0x00, + 0x4b, 0x28, 0x68, 0x1b, 0x72, 0x19, 0x07, 0xc1, + 0x0f, 0xc9, 0xd0, 0x04, 0x21, 0xff, 0x4b, 0x25, + 0x68, 0x1b, 0x72, 0x59, 0xe0, 0x0c, 0x49, 0x23, + 0x68, 0x09, 0x7a, 0x49, 0x29, 0xff, 0xd1, 0x03, + 0x21, 0x00, 0x4b, 0x20, 0x68, 0x1b, 0x60, 0x59, + 0x21, 0x00, 0x4b, 0x1e, 0x68, 0x1b, 0x72, 0x59, + 0x2d, 0x01, 0xd1, 0x0f, 0x49, 0x1c, 0x68, 0x0e, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x9e, 0x1c, 0x33, + 0x60, 0x0b, 0x49, 0x1a, 0x68, 0x09, 0x78, 0x09, + 0x23, 0x02, 0x43, 0x19, 0x4b, 0x17, 0x68, 0x1b, + 0x70, 0x19, 0xe0, 0x0e, 0x49, 0x14, 0x68, 0x0e, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x33, 0x60, 0x0b, + 0x49, 0x12, 0x68, 0x09, 0x78, 0x09, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x4b, 0x0f, 0x68, 0x1b, + 0x70, 0x19, 0x49, 0x0f, 0x62, 0x4a, 0x2a, 0x01, + 0xd1, 0x08, 0x49, 0x0c, 0x68, 0x09, 0x78, 0x09, + 0x23, 0x01, 0x43, 0x19, 0x4b, 0x09, 0x68, 0x1b, + 0x70, 0x19, 0xe0, 0x07, 0x49, 0x07, 0x68, 0x09, + 0x78, 0x09, 0x08, 0x49, 0x00, 0x49, 0x4b, 0x05, + 0x68, 0x1b, 0x70, 0x19, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x54, + 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x58, + 0xcc, 0x00, 0x0f, 0x80, 0xb4, 0x80, 0x1c, 0x07, + 0x1c, 0x0a, 0x68, 0x38, 0x49, 0x23, 0x68, 0x09, + 0x60, 0xc8, 0x68, 0x78, 0x49, 0x21, 0x68, 0x09, + 0x61, 0x08, 0x68, 0xb8, 0x49, 0x1f, 0x68, 0x09, + 0x61, 0x48, 0x68, 0xf8, 0x49, 0x1d, 0x68, 0x09, + 0x61, 0x88, 0x7d, 0x38, 0x49, 0x1b, 0x68, 0x09, + 0x31, 0x20, 0x70, 0x08, 0x7d, 0x78, 0x49, 0x19, + 0x68, 0x09, 0x31, 0x20, 0x70, 0x48, 0x69, 0x38, + 0x49, 0x16, 0x68, 0x09, 0x61, 0xc8, 0x7d, 0xb8, + 0x49, 0x14, 0x68, 0x09, 0x31, 0x20, 0x70, 0x88, + 0x68, 0x10, 0x49, 0x12, 0x68, 0x09, 0x62, 0x48, + 0x68, 0x50, 0x49, 0x10, 0x68, 0x09, 0x62, 0x88, + 0x68, 0x90, 0x49, 0x0e, 0x68, 0x09, 0x62, 0xc8, + 0x68, 0xd0, 0x49, 0x0c, 0x68, 0x09, 0x63, 0x08, + 0x7d, 0x10, 0x49, 0x0a, 0x68, 0x09, 0x31, 0x20, + 0x76, 0x08, 0x7d, 0x50, 0x49, 0x07, 0x68, 0x09, + 0x31, 0x20, 0x76, 0x48, 0x69, 0x10, 0x49, 0x05, + 0x68, 0x09, 0x63, 0x48, 0x7d, 0x90, 0x49, 0x03, + 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 0xbc, 0x80, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54, + 0x1c, 0x02, 0x1c, 0x0b, 0x48, 0x03, 0x68, 0x00, + 0x60, 0x02, 0x48, 0x02, 0x68, 0x00, 0x60, 0x43, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x54, + 0xb5, 0xf3, 0xb0, 0x88, 0x98, 0x08, 0x68, 0x04, + 0x20, 0x01, 0x90, 0x06, 0x20, 0x01, 0x90, 0x05, + 0x48, 0x8c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x19, + 0x48, 0x8a, 0x68, 0x00, 0x38, 0x01, 0x49, 0x89, + 0x60, 0x08, 0x48, 0x88, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x10, 0x48, 0x87, 0x78, 0x80, 0x90, 0x00, + 0x98, 0x00, 0x00, 0xc0, 0x49, 0x85, 0x68, 0x09, + 0x58, 0x08, 0x23, 0xff, 0x33, 0x01, 0x43, 0x98, + 0x1c, 0x01, 0x98, 0x00, 0x00, 0xc0, 0x4a, 0x81, + 0x68, 0x12, 0x50, 0x11, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x00, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc1, + 0x91, 0x02, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x90, 0x01, + 0x48, 0x79, 0x68, 0x00, 0x42, 0x84, 0xd1, 0x73, + 0x98, 0x01, 0x1d, 0xc7, 0x37, 0x01, 0x78, 0x38, + 0x18, 0x38, 0x1c, 0x47, 0x48, 0x75, 0x6c, 0xc0, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x42, 0xb8, + 0xd9, 0x19, 0x78, 0x38, 0x28, 0xff, 0xd1, 0x12, + 0x78, 0x78, 0x23, 0xf0, 0x40, 0x18, 0x28, 0xf0, + 0xd1, 0x0d, 0x78, 0xb8, 0x10, 0x80, 0x07, 0x80, + 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x06, + 0x78, 0x78, 0x10, 0xc0, 0x07, 0xc0, 0x09, 0xc0, + 0x16, 0x00, 0x90, 0x05, 0xe0, 0x03, 0x21, 0x01, + 0x70, 0x39, 0x18, 0x7f, 0xe7, 0xde, 0x21, 0x40, + 0x91, 0x03, 0x25, 0x20, 0x21, 0x14, 0x91, 0x07, + 0x98, 0x06, 0x28, 0x00, 0xd1, 0x02, 0x25, 0x23, + 0x21, 0x12, 0x91, 0x07, 0x98, 0x06, 0x28, 0x02, + 0xd1, 0x02, 0x25, 0x30, 0x21, 0x18, 0x91, 0x07, + 0x98, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x00, 0x6d, + 0x21, 0x70, 0x91, 0x03, 0x99, 0x03, 0x00, 0x48, + 0x99, 0x02, 0x1a, 0x08, 0x90, 0x04, 0x98, 0x04, + 0x99, 0x02, 0x42, 0x88, 0xd3, 0x05, 0xe0, 0x4e, + 0x98, 0x04, 0x99, 0x03, 0x18, 0x40, 0x90, 0x04, + 0xe7, 0xf5, 0x9f, 0x04, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, + 0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, 0x21, 0xc0, + 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0x21, 0x3a, 0x70, 0x39, 0x37, 0x01, + 0x21, 0x80, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, + 0x70, 0x39, 0x37, 0x01, 0x99, 0x03, 0x1f, 0xc8, + 0x38, 0x02, 0x1b, 0x41, 0x70, 0x39, 0x37, 0x01, + 0x26, 0x00, 0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02, + 0x1b, 0x40, 0x42, 0xb0, 0xdc, 0x04, 0xe0, 0x00, + 0xe0, 0x34, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf4, + 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9, + 0x21, 0xff, 0x70, 0x39, 0x37, 0x01, 0x98, 0x05, + 0x00, 0xc0, 0x21, 0xf7, 0x43, 0x01, 0x70, 0x39, + 0x37, 0x01, 0x99, 0x07, 0x70, 0x39, 0x37, 0x01, + 0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, 0x26, 0x00, + 0x1f, 0x28, 0x42, 0xb0, 0xdc, 0x02, 0xe0, 0x05, + 0x36, 0x01, 0xe7, 0xf9, 0x21, 0x00, 0x70, 0x39, + 0x37, 0x01, 0xe7, 0xf9, 0xe7, 0xb0, 0x99, 0x03, + 0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, 0x23, 0x0d, + 0x06, 0x9b, 0x18, 0xc0, 0x49, 0x29, 0x64, 0x88, + 0x99, 0x09, 0x20, 0x78, 0x40, 0x08, 0x23, 0x02, + 0x43, 0x18, 0xf7, 0xff, 0xfa, 0x17, 0x20, 0x01, + 0xf7, 0xff, 0xfa, 0x14, 0x48, 0x22, 0x68, 0x00, + 0x38, 0x02, 0x42, 0xa0, 0xd1, 0x09, 0x48, 0x22, + 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, + 0x60, 0x01, 0x20, 0xff, 0x49, 0x1f, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x38, 0x02, + 0x42, 0xa0, 0xd3, 0x0f, 0x48, 0x1c, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x05, 0x48, 0x1a, 0x68, 0x00, + 0x23, 0x01, 0x06, 0x9b, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0x32, 0x49, 0x13, 0x60, 0x08, 0x48, 0x12, + 0x68, 0x00, 0x1e, 0x84, 0x2c, 0x01, 0xd1, 0x02, + 0x20, 0x02, 0xf7, 0xff, 0xf9, 0xeb, 0x2c, 0xff, + 0xd1, 0x08, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, + 0x30, 0xbc, 0x49, 0x0c, 0x6c, 0xc9, 0x42, 0x88, + 0xd2, 0x00, 0x24, 0x18, 0x2c, 0x00, 0xd0, 0x02, + 0x2c, 0xff, 0xd0, 0x00, 0x3c, 0x01, 0x98, 0x08, + 0x60, 0x04, 0xb0, 0x08, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x44, + 0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xd0, + 0x2e, 0x08, 0x1f, 0x18, 0x66, 0x00, 0x00, 0x80, + 0x6c, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x5e, 0x2c, + 0x6c, 0x00, 0x08, 0x00, 0xb5, 0xff, 0x1c, 0x04, + 0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, + 0x9b, 0x03, 0x06, 0x1e, 0x0e, 0x36, 0x2e, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x1f, 0xdb, 0x01, + 0x20, 0xaf, 0xe7, 0xf7, 0x20, 0x01, 0x03, 0x40, + 0xf7, 0xff, 0xf9, 0xac, 0x20, 0x14, 0x49, 0x09, + 0x60, 0x08, 0x20, 0xff, 0x60, 0x20, 0x1c, 0x33, + 0x1c, 0x29, 0x1c, 0x38, 0x22, 0x02, 0xf7, 0xfc, + 0xfa, 0x4b, 0x48, 0x05, 0x68, 0x01, 0x23, 0x01, + 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, + 0xe7, 0xe0, 0xe7, 0xdf, 0x2e, 0x08, 0x1f, 0x18, + 0x6c, 0x00, 0x00, 0x20, 0xb4, 0x0f, 0xb5, 0xf0, + 0x1c, 0x07, 0xb0, 0x82, 0x20, 0x00, 0x49, 0x16, + 0x60, 0x08, 0x48, 0x16, 0x6f, 0x80, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xe1, + 0x00, 0xc0, 0xe0, 0x00, 0x48, 0x12, 0x1c, 0x05, + 0x68, 0x38, 0x28, 0xff, 0xd1, 0x17, 0x98, 0x0d, + 0x90, 0x00, 0x98, 0x0c, 0x90, 0x01, 0x98, 0x01, + 0x99, 0x00, 0x1a, 0x46, 0x08, 0x68, 0x19, 0x81, + 0x1c, 0x28, 0xf0, 0x09, 0xfa, 0xeb, 0x1c, 0x04, + 0x34, 0x01, 0x0f, 0xf0, 0x07, 0xc0, 0xd0, 0x00, + 0x24, 0x04, 0x2c, 0x32, 0xd9, 0x00, 0x24, 0x04, + 0x1d, 0xe0, 0x30, 0x0d, 0x60, 0x38, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0xb0, 0x04, 0x47, 0x18, + 0x2e, 0x08, 0x5e, 0x44, 0xcc, 0x00, 0x0f, 0x80, + 0x00, 0x00, 0x05, 0xdd, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x99, 0x02, 0x06, 0x09, 0x0e, 0x09, + 0x91, 0x00, 0xb0, 0x82, 0x99, 0x02, 0x29, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x99, 0x02, + 0x00, 0x88, 0x49, 0x2f, 0x58, 0x08, 0x90, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03, + 0xe7, 0xf1, 0x20, 0x00, 0x70, 0x78, 0x78, 0xb8, + 0x07, 0x00, 0x0f, 0x00, 0x90, 0x00, 0x98, 0x00, + 0x28, 0x04, 0xd1, 0x1f, 0x6a, 0xfe, 0x24, 0x00, + 0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0, + 0x19, 0x80, 0x68, 0x40, 0x00, 0xa1, 0x19, 0x89, + 0x64, 0x48, 0x21, 0x00, 0x00, 0xa0, 0x19, 0x80, + 0x62, 0x41, 0x00, 0xa0, 0x19, 0x80, 0x6c, 0x40, + 0x28, 0x00, 0xd0, 0x04, 0x20, 0x80, 0x41, 0x20, + 0x88, 0x31, 0x43, 0x08, 0x80, 0x30, 0xe7, 0xe6, + 0x88, 0x30, 0x80, 0x70, 0x78, 0xb8, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x1f, 0x6b, 0x3d, 0x20, 0x00, + 0x60, 0x28, 0x20, 0x00, 0x60, 0x68, 0x20, 0x00, + 0x60, 0xa8, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, + 0xe7, 0xf8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, + 0x60, 0xc8, 0x20, 0x00, 0x00, 0xa1, 0x19, 0x49, + 0x63, 0x88, 0xe7, 0xf2, 0x20, 0x00, 0x62, 0xe8, + 0x20, 0x00, 0x63, 0x28, 0x20, 0x00, 0x63, 0x68, + 0x20, 0x00, 0x65, 0xa8, 0x99, 0x02, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x3e, 0xb0, 0x03, 0xe7, 0x9e, + 0xb0, 0x02, 0xb0, 0x01, 0xe7, 0x9b, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x82, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x20, 0x33, 0x06, 0x40, 0x6e, 0x00, 0x21, 0x33, - 0x06, 0x49, 0x6d, 0xc9, 0x1a, 0x46, 0x48, 0x12, - 0x6c, 0x80, 0x1c, 0x04, 0x48, 0x10, 0x6c, 0xc0, - 0x1c, 0x05, 0x42, 0xac, 0xd9, 0x09, 0x1b, 0x60, - 0x21, 0x64, 0x43, 0x41, 0x1c, 0x30, 0xf0, 0x09, - 0xff, 0xcb, 0x21, 0x64, 0x1a, 0x08, 0x60, 0x38, - 0xe0, 0x06, 0x1b, 0x28, 0x21, 0x64, 0x43, 0x41, - 0x1c, 0x30, 0xf0, 0x09, 0xff, 0xc1, 0x60, 0x38, - 0x42, 0xac, 0xd1, 0x03, 0x20, 0x31, 0xb0, 0x01, - 0xe7, 0xd6, 0xe0, 0x02, 0x20, 0x00, 0xb0, 0x01, - 0xe7, 0xd2, 0xb0, 0x01, 0xe7, 0xd0, 0x00, 0x00, - 0x66, 0x00, 0x00, 0x80, 0xb5, 0xff, 0x1c, 0x14, - 0x1c, 0x1f, 0xb0, 0x82, 0x98, 0x02, 0x06, 0x01, - 0x0e, 0x09, 0x91, 0x00, 0x98, 0x0b, 0x06, 0x03, - 0x16, 0x1b, 0x93, 0x01, 0xb0, 0x84, 0x99, 0x04, - 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x9b, 0x05, 0x2b, 0x1f, 0xdd, 0x02, 0x20, 0xaf, - 0xb0, 0x06, 0xe7, 0xf5, 0x98, 0x07, 0x90, 0x01, - 0x2f, 0x00, 0xd0, 0x47, 0xb0, 0x81, 0x98, 0x08, - 0x22, 0x00, 0x92, 0x00, 0x22, 0x1b, 0x06, 0x92, - 0x6a, 0x12, 0x23, 0x01, 0x05, 0x1b, 0x40, 0x1a, - 0xd0, 0x01, 0x22, 0xff, 0x92, 0x00, 0x25, 0x00, - 0x08, 0x62, 0x42, 0xaa, 0xd8, 0x02, 0xe0, 0x34, - 0x35, 0x01, 0xe7, 0xf9, 0x9a, 0x00, 0x2a, 0x00, - 0xd0, 0x1e, 0x88, 0x02, 0x23, 0xff, 0x02, 0x1b, - 0x40, 0x1a, 0x12, 0x12, 0x88, 0x03, 0x02, 0x1b, - 0x43, 0x1a, 0x04, 0x11, 0x0c, 0x09, 0x2f, 0x00, - 0xda, 0x05, 0x42, 0x7a, 0x41, 0x11, 0x1c, 0x0b, - 0x04, 0x19, 0x0c, 0x09, 0xe0, 0x03, 0x40, 0xb9, - 0x1c, 0x0a, 0x04, 0x11, 0x0c, 0x09, 0x22, 0xff, - 0x02, 0x12, 0x40, 0x0a, 0x12, 0x12, 0x02, 0x0b, - 0x43, 0x13, 0x80, 0x03, 0x30, 0x02, 0xe0, 0x0f, - 0x2f, 0x00, 0xda, 0x07, 0x88, 0x02, 0x42, 0x7e, - 0x41, 0x32, 0x04, 0x12, 0x0c, 0x12, 0x80, 0x02, - 0x30, 0x02, 0xe0, 0x05, 0x88, 0x02, 0x40, 0xba, - 0x04, 0x12, 0x0c, 0x12, 0x80, 0x02, 0x30, 0x02, - 0xe7, 0xca, 0xb0, 0x01, 0x49, 0x23, 0x91, 0x03, - 0x20, 0x01, 0x06, 0x00, 0x99, 0x03, 0x60, 0x08, - 0x48, 0x21, 0x6c, 0x80, 0x49, 0x20, 0x6c, 0xc9, - 0x1a, 0x40, 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, - 0xdc, 0x09, 0x20, 0x33, 0x06, 0x40, 0x6e, 0x00, - 0x21, 0x33, 0x06, 0x49, 0x6d, 0xc9, 0x1a, 0x40, - 0x99, 0x00, 0x18, 0x40, 0x90, 0x00, 0x98, 0x00, - 0x23, 0x3b, 0x01, 0xdb, 0x42, 0x98, 0xda, 0x02, - 0x20, 0x06, 0xf0, 0x08, 0xfd, 0x8d, 0x98, 0x00, - 0x23, 0x3b, 0x01, 0xdb, 0x42, 0x98, 0xdb, 0xdf, - 0x98, 0x00, 0x42, 0x84, 0xd9, 0x02, 0x98, 0x00, - 0x90, 0x02, 0xe0, 0x00, 0x94, 0x02, 0x22, 0x04, - 0x99, 0x03, 0xb4, 0x06, 0x9b, 0x07, 0x9a, 0x04, - 0x99, 0x06, 0x98, 0x03, 0xf0, 0x04, 0xfb, 0x8c, - 0xb0, 0x02, 0x98, 0x02, 0x1a, 0x24, 0x98, 0x01, - 0x99, 0x02, 0x18, 0x40, 0x90, 0x01, 0x20, 0x00, - 0x90, 0x00, 0x2c, 0x00, 0xd1, 0xc4, 0x20, 0x00, - 0xb0, 0x06, 0xe7, 0x65, 0xb0, 0x04, 0xb0, 0x02, - 0xe7, 0x62, 0x00, 0x00, 0x9e, 0x00, 0x08, 0x00, - 0x66, 0x00, 0x00, 0x80, 0x20, 0x1b, 0x06, 0x80, - 0x6a, 0x00, 0x07, 0xc0, 0x0f, 0xc0, 0x4a, 0x03, - 0x68, 0x12, 0x1c, 0x01, 0x43, 0x11, 0x1c, 0x08, - 0x47, 0x70, 0xe7, 0xfd, 0x6c, 0x00, 0x08, 0x00, - 0xb4, 0x90, 0x1c, 0x01, 0x20, 0x1b, 0x06, 0x80, - 0x6a, 0x00, 0x1c, 0x04, 0x48, 0x1b, 0x68, 0x00, - 0x1c, 0x07, 0x20, 0x30, 0x40, 0x20, 0xd0, 0x06, - 0x28, 0x10, 0xd0, 0x06, 0x28, 0x20, 0xd0, 0x06, - 0x28, 0x30, 0xd0, 0x06, 0xe0, 0x07, 0x22, 0x01, - 0xe0, 0x08, 0x22, 0x02, 0xe0, 0x06, 0x22, 0x04, - 0xe0, 0x04, 0x22, 0x08, 0xe0, 0x02, 0x20, 0x30, - 0xbc, 0x90, 0x47, 0x70, 0x20, 0x03, 0x07, 0x40, - 0x40, 0x38, 0x0f, 0x40, 0xd0, 0x04, 0x28, 0x01, - 0xd0, 0x05, 0x28, 0x02, 0xd0, 0x06, 0xe0, 0x08, - 0x23, 0x10, 0x43, 0x1a, 0xe0, 0x07, 0x23, 0x20, - 0x43, 0x1a, 0xe0, 0x04, 0x23, 0x40, 0x43, 0x1a, - 0xe0, 0x01, 0x20, 0x30, 0xe7, 0xe8, 0x20, 0x01, - 0x05, 0xc0, 0x40, 0x38, 0xd1, 0x01, 0x23, 0x80, - 0x43, 0x1a, 0x60, 0x0a, 0x20, 0x00, 0xe7, 0xdf, - 0xe7, 0xde, 0x00, 0x00, 0x6c, 0x00, 0x08, 0x00, - 0x1c, 0x01, 0x48, 0x01, 0x60, 0x01, 0x47, 0x70, - 0x6c, 0x00, 0x00, 0x80, 0x1c, 0x01, 0x29, 0x1f, - 0xdd, 0x01, 0x20, 0xaf, 0x47, 0x70, 0x20, 0x80, - 0x6c, 0x00, 0x60, 0x01, 0x20, 0x00, 0xe7, 0xf9, - 0xe7, 0xf8, 0xb5, 0xf3, 0x1c, 0x0a, 0xb0, 0x81, - 0x98, 0x01, 0x06, 0x03, 0x0e, 0x1b, 0x93, 0x00, - 0xb0, 0x81, 0x20, 0x1b, 0x06, 0x80, 0x6a, 0x00, - 0x1c, 0x01, 0x25, 0x00, 0x20, 0x00, 0x90, 0x00, - 0x20, 0x1b, 0x06, 0x80, 0x6c, 0x00, 0x1c, 0x04, - 0x27, 0x00, 0x9b, 0x01, 0x2b, 0x20, 0xdb, 0x05, - 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x20, 0x33, 0x06, 0x40, - 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, - 0x9b, 0x01, 0x00, 0xdb, 0x4e, 0x5f, 0x68, 0x36, - 0x19, 0x9b, 0x60, 0x58, 0x20, 0xff, 0x30, 0x01, - 0x40, 0x08, 0xd0, 0x01, 0x20, 0xff, 0x90, 0x00, - 0x23, 0x01, 0x04, 0xdb, 0x43, 0x99, 0x1c, 0x08, - 0x21, 0x01, 0x04, 0x89, 0x43, 0x01, 0x20, 0x01, - 0x03, 0x00, 0x40, 0x10, 0xd0, 0x05, 0x06, 0x90, - 0x0e, 0x80, 0xd0, 0x02, 0x23, 0x01, 0x05, 0x1b, - 0x43, 0x19, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x19, - 0x05, 0x10, 0x0d, 0x00, 0x28, 0x40, 0xd0, 0x48, - 0xdc, 0x0e, 0x28, 0x08, 0xd0, 0x32, 0xdc, 0x06, - 0x28, 0x01, 0xd0, 0x1e, 0x28, 0x02, 0xd0, 0x21, - 0x28, 0x04, 0xd0, 0x26, 0xe0, 0x67, 0x28, 0x10, - 0xd0, 0x2f, 0x28, 0x20, 0xd0, 0x32, 0xe0, 0x62, - 0x23, 0x01, 0x02, 0x5b, 0x42, 0x98, 0xd0, 0x49, - 0xdc, 0x06, 0x28, 0x80, 0xd0, 0x38, 0x23, 0xff, - 0x33, 0x01, 0x42, 0x98, 0xd0, 0x3b, 0xe0, 0x56, - 0x23, 0x01, 0x02, 0x9b, 0x42, 0x98, 0xd0, 0x44, - 0x23, 0x01, 0x02, 0xdb, 0x42, 0x98, 0xd0, 0x47, - 0xe0, 0x4d, 0x4b, 0x3d, 0x42, 0x9c, 0xd0, 0x00, - 0x4f, 0x3b, 0xe0, 0x49, 0x23, 0x10, 0x43, 0x19, - 0x4b, 0x39, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x38, - 0xe0, 0x42, 0x4b, 0x38, 0x42, 0x9c, 0xd0, 0x00, - 0x4f, 0x36, 0xe0, 0x3d, 0x23, 0x10, 0x43, 0x19, - 0x4b, 0x34, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x33, - 0xe0, 0x36, 0x4b, 0x33, 0x42, 0x9c, 0xd0, 0x00, - 0x4f, 0x31, 0xe0, 0x31, 0x23, 0x10, 0x43, 0x19, - 0x4b, 0x2f, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x2e, - 0xe0, 0x2a, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x2d, - 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x2b, 0xe0, 0x23, - 0x23, 0x30, 0x43, 0x19, 0x4b, 0x29, 0x42, 0x9c, - 0xd0, 0x00, 0x4f, 0x28, 0xe0, 0x1c, 0x23, 0x20, - 0x43, 0x19, 0x4b, 0x27, 0x42, 0x9c, 0xd0, 0x00, - 0x4f, 0x25, 0xe0, 0x15, 0x23, 0x30, 0x43, 0x19, - 0x4b, 0x23, 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x22, - 0xe0, 0x0e, 0x23, 0x20, 0x43, 0x19, 0x4b, 0x21, - 0x42, 0x9c, 0xd0, 0x00, 0x4f, 0x1f, 0xe0, 0x07, - 0x23, 0x30, 0x43, 0x19, 0x4b, 0x1d, 0x42, 0x9c, - 0xd0, 0x00, 0x4f, 0x1c, 0xe0, 0x00, 0xe7, 0xff, - 0x98, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x23, 0x01, - 0x43, 0x19, 0x20, 0x1b, 0x06, 0x80, 0x62, 0x01, - 0x48, 0x17, 0x68, 0x00, 0x4b, 0x17, 0x60, 0x18, - 0x25, 0xff, 0xe0, 0x0e, 0x23, 0x01, 0x43, 0x19, - 0x2f, 0x00, 0xd0, 0x07, 0x20, 0x1b, 0x06, 0x80, - 0x62, 0x01, 0x20, 0x1b, 0x06, 0x80, 0x64, 0x07, - 0x25, 0xff, 0xe0, 0x02, 0x20, 0x1b, 0x06, 0x80, - 0x62, 0x01, 0x2d, 0x00, 0xd1, 0x04, 0x48, 0x0e, - 0x68, 0x03, 0x08, 0x5b, 0x00, 0x5b, 0x60, 0x03, - 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x36, 0xb0, 0x01, - 0xb0, 0x01, 0xe7, 0x33, 0x2e, 0x08, 0x5d, 0xdc, - 0x00, 0x00, 0x82, 0x18, 0x00, 0x01, 0x42, 0x18, - 0x00, 0x02, 0x42, 0x18, 0x00, 0x00, 0x98, 0x60, - 0x00, 0x01, 0x58, 0x60, 0x00, 0x02, 0x54, 0x28, - 0x2e, 0x08, 0x5e, 0x58, 0x6c, 0x00, 0x00, 0x80, - 0x6c, 0x00, 0x00, 0x20, 0xb5, 0xf3, 0x1c, 0x0f, - 0xb0, 0x82, 0x49, 0x2c, 0x46, 0x68, 0x22, 0x08, - 0xf0, 0x09, 0xfe, 0x14, 0x20, 0x04, 0xf7, 0xff, - 0xfc, 0x23, 0x48, 0x29, 0x68, 0x80, 0x21, 0x33, - 0x06, 0x49, 0x65, 0xc8, 0x48, 0x26, 0x68, 0xc0, - 0x21, 0x33, 0x06, 0x49, 0x66, 0x08, 0x48, 0x25, - 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, - 0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x67, 0xc8, - 0x48, 0x21, 0x68, 0x01, 0x31, 0xff, 0x31, 0xff, - 0x31, 0x02, 0x60, 0x01, 0x1c, 0x78, 0x12, 0x00, - 0xab, 0x01, 0x70, 0x18, 0x1c, 0x78, 0xab, 0x01, - 0x70, 0x58, 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc5, - 0x4b, 0x1a, 0x43, 0x1d, 0x26, 0x00, 0x2e, 0x10, - 0xdb, 0x02, 0xe0, 0x18, 0x36, 0x01, 0xe7, 0xfa, - 0x24, 0x00, 0x2c, 0x07, 0xd3, 0x02, 0xe0, 0x06, - 0x34, 0x01, 0xe7, 0xfa, 0x46, 0x68, 0x5d, 0x01, - 0x70, 0x29, 0x35, 0x01, 0xe7, 0xf8, 0x24, 0x00, - 0x42, 0xbc, 0xdb, 0x02, 0xe0, 0x06, 0x34, 0x01, - 0xe7, 0xfa, 0x98, 0x02, 0x5d, 0x01, 0x70, 0x29, - 0x35, 0x01, 0xe7, 0xf8, 0xe7, 0xe6, 0x20, 0x33, - 0x06, 0x40, 0x66, 0x05, 0x48, 0x0a, 0x68, 0x01, - 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, - 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x03, 0x32, 0x9c, - 0x2e, 0x08, 0x7c, 0x24, 0x66, 0x00, 0x00, 0x70, - 0x66, 0x00, 0x00, 0x5c, 0xcc, 0x00, 0x00, 0x00, - 0x6c, 0x00, 0x00, 0x20, 0xb5, 0xf7, 0x1c, 0x04, - 0x1c, 0x0f, 0x06, 0x20, 0x0e, 0x00, 0x06, 0x3d, - 0x0e, 0x2d, 0x99, 0x02, 0x06, 0x0a, 0x0e, 0x12, - 0x21, 0x02, 0x40, 0x01, 0xd0, 0x04, 0x21, 0xff, - 0x4b, 0x2f, 0x68, 0x1b, 0x72, 0x19, 0xe0, 0x0c, - 0x49, 0x2d, 0x68, 0x09, 0x7a, 0x09, 0x29, 0xff, - 0xd1, 0x03, 0x21, 0x00, 0x4b, 0x2a, 0x68, 0x1b, - 0x60, 0x19, 0x21, 0x00, 0x4b, 0x28, 0x68, 0x1b, - 0x72, 0x19, 0x07, 0xc1, 0x0f, 0xc9, 0xd0, 0x04, - 0x21, 0xff, 0x4b, 0x25, 0x68, 0x1b, 0x72, 0x59, - 0xe0, 0x0c, 0x49, 0x23, 0x68, 0x09, 0x7a, 0x49, - 0x29, 0xff, 0xd1, 0x03, 0x21, 0x00, 0x4b, 0x20, - 0x68, 0x1b, 0x60, 0x59, 0x21, 0x00, 0x4b, 0x1e, - 0x68, 0x1b, 0x72, 0x59, 0x2d, 0x01, 0xd1, 0x0f, - 0x49, 0x1c, 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, - 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x0b, 0x49, 0x1a, - 0x68, 0x09, 0x78, 0x09, 0x23, 0x02, 0x43, 0x19, - 0x4b, 0x17, 0x68, 0x1b, 0x70, 0x19, 0xe0, 0x0e, - 0x49, 0x14, 0x68, 0x0e, 0x23, 0x01, 0x05, 0x5b, - 0x43, 0x33, 0x60, 0x0b, 0x49, 0x12, 0x68, 0x09, - 0x78, 0x09, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, - 0x4b, 0x0f, 0x68, 0x1b, 0x70, 0x19, 0x49, 0x0f, - 0x62, 0x4a, 0x2a, 0x01, 0xd1, 0x08, 0x49, 0x0c, - 0x68, 0x09, 0x78, 0x09, 0x23, 0x01, 0x43, 0x19, - 0x4b, 0x09, 0x68, 0x1b, 0x70, 0x19, 0xe0, 0x07, - 0x49, 0x07, 0x68, 0x09, 0x78, 0x09, 0x08, 0x49, - 0x00, 0x49, 0x4b, 0x05, 0x68, 0x1b, 0x70, 0x19, + 0x00, 0xa0, 0x49, 0x12, 0x58, 0x08, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x02, 0xe7, 0xf3, + 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf9, 0x84, + 0x1c, 0x06, 0xd0, 0x02, 0x1c, 0x30, 0xb0, 0x02, + 0xe7, 0xea, 0x78, 0x68, 0x21, 0x20, 0x40, 0x01, + 0x91, 0x00, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00, + 0xff, 0x3f, 0x68, 0xe9, 0x91, 0x01, 0x29, 0x00, + 0xd0, 0x03, 0x99, 0x01, 0x1c, 0x38, 0xf0, 0x03, + 0xfe, 0x7a, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xd7, + 0xb0, 0x02, 0xe7, 0xd5, 0x2e, 0x08, 0x5e, 0x5c, + 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, + 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0xa1, + 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x00, 0x2f, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, + 0x4b, 0x9b, 0x58, 0x18, 0x90, 0x05, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf2, + 0x78, 0x90, 0x90, 0x01, 0x71, 0xd7, 0x78, 0xd1, + 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x73, + 0x29, 0x20, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0xe5, 0x48, 0x92, 0x68, 0x00, 0x23, 0x01, + 0x42, 0xd8, 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, + 0xe7, 0xdd, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x8d, + 0x68, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0xd4, 0x00, 0x88, 0x4b, 0x8a, + 0x50, 0x1a, 0x48, 0x8a, 0x54, 0x47, 0x01, 0x08, + 0x4b, 0x89, 0x18, 0xc5, 0x7f, 0x10, 0x06, 0x00, + 0x7f, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7f, 0x93, + 0x02, 0x1b, 0x43, 0x18, 0x7f, 0xd3, 0x43, 0x03, + 0xc5, 0x08, 0x1d, 0xd0, 0x30, 0x19, 0x78, 0x00, + 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0x5b, + 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, + 0x78, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, + 0x33, 0x19, 0x78, 0xdb, 0x43, 0x03, 0xc5, 0x08, + 0x01, 0x08, 0x4b, 0x7a, 0x18, 0xc4, 0x7b, 0x10, + 0x06, 0x00, 0x7b, 0x53, 0x04, 0x1b, 0x43, 0x18, + 0x7b, 0x93, 0x02, 0x1b, 0x43, 0x18, 0x7b, 0xd3, + 0x43, 0x03, 0xc4, 0x08, 0x7c, 0x10, 0x06, 0x00, + 0x7c, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7c, 0x93, + 0x02, 0x1b, 0x43, 0x18, 0x7c, 0xd3, 0x43, 0x03, + 0xc4, 0x08, 0x98, 0x01, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x20, 0x1d, 0xd0, 0x30, 0x19, 0x79, 0x00, + 0x06, 0x00, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0x5b, + 0x04, 0x1b, 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, + 0x79, 0x9b, 0x02, 0x1b, 0x43, 0x18, 0x1d, 0xd3, + 0x33, 0x19, 0x79, 0xdb, 0x43, 0x03, 0xc5, 0x08, + 0x7d, 0x10, 0x06, 0x00, 0x7d, 0x53, 0x04, 0x1b, + 0x43, 0x18, 0x7d, 0x93, 0x02, 0x1b, 0xe0, 0x00, + 0xe0, 0x42, 0x43, 0x18, 0x7d, 0xd3, 0x43, 0x03, + 0xc4, 0x08, 0xe0, 0x03, 0x23, 0x00, 0xc5, 0x08, + 0x23, 0x00, 0xc4, 0x08, 0x23, 0xff, 0xc5, 0x08, + 0x20, 0x19, 0x06, 0x80, 0x6b, 0x00, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x06, 0x88, 0x90, 0x04, 0x00, + 0x19, 0xc3, 0x93, 0x02, 0x9b, 0x02, 0xc4, 0x08, + 0xe0, 0x00, 0xc4, 0x80, 0x98, 0x01, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x17, 0x48, 0x50, 0x5d, 0xc0, + 0x30, 0x01, 0x4b, 0x4f, 0x55, 0xd8, 0x7a, 0x10, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0x01, + 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, 0x61, 0x18, + 0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x04, + 0x20, 0x01, 0x40, 0x88, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x58, 0xe0, 0x05, 0x4e, 0x45, 0x20, 0x01, + 0x40, 0x88, 0x68, 0x33, 0x43, 0x18, 0x60, 0x30, + 0x20, 0x01, 0x40, 0x88, 0x4b, 0x3b, 0x68, 0x1b, + 0x43, 0x18, 0x4b, 0x3a, 0x60, 0x18, 0xe0, 0x4f, + 0x98, 0x01, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x48, + 0x48, 0x3d, 0x88, 0x00, 0x4b, 0x3d, 0x42, 0x98, + 0xd1, 0x02, 0x20, 0xb2, 0xb0, 0x06, 0xe7, 0x26, + 0x00, 0x88, 0x4b, 0x3b, 0x58, 0x18, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x1e, + 0x29, 0x10, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0x19, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x32, + 0x88, 0x1b, 0x40, 0x18, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0x10, 0x98, 0x05, 0x78, 0x80, + 0x28, 0x02, 0xdb, 0x02, 0x20, 0xb1, 0xb0, 0x06, + 0xe7, 0x09, 0x00, 0x88, 0x4b, 0x2c, 0x50, 0x1a, + 0x48, 0x2c, 0x54, 0x47, 0x00, 0xf8, 0x1b, 0xc0, + 0x00, 0x80, 0x4b, 0x2b, 0x68, 0x1b, 0x18, 0xc0, + 0x90, 0x04, 0x98, 0x04, 0x7e, 0x00, 0x28, 0xff, + 0xd1, 0x02, 0x98, 0x04, 0x76, 0x01, 0xe0, 0x01, + 0x98, 0x04, 0x76, 0x41, 0x4e, 0x25, 0x96, 0x03, + 0x1d, 0xd3, 0x33, 0x05, 0x00, 0x88, 0x9e, 0x03, + 0x50, 0x33, 0x20, 0x01, 0x40, 0x88, 0x4b, 0x1c, + 0x88, 0x1b, 0x43, 0x18, 0x4b, 0x1a, 0x80, 0x18, + 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe6, 0xe2, + 0x78, 0x50, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x18, + 0x70, 0x50, 0x98, 0x05, 0x78, 0x80, 0x28, 0x00, + 0xd1, 0x09, 0x98, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0x9b, 0x00, 0x60, 0x18, + 0x20, 0x02, 0x9b, 0x05, 0x70, 0xd8, 0x98, 0x05, + 0x78, 0x80, 0x30, 0x01, 0x9b, 0x05, 0x70, 0x98, + 0x20, 0x00, 0xb0, 0x06, 0xe6, 0xc7, 0xb0, 0x06, + 0xe6, 0xc5, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xdc, + 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xa4, + 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, + 0x2e, 0x08, 0x7b, 0xf4, 0x64, 0x00, 0x00, 0x18, + 0x2e, 0x08, 0x5e, 0xe0, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4, + 0x2e, 0x08, 0x5d, 0xc4, 0x9e, 0x00, 0x04, 0xb8, + 0xb5, 0xf3, 0x1c, 0x02, 0x99, 0x01, 0x06, 0x0f, + 0x0e, 0x3f, 0xb0, 0x86, 0x00, 0xb8, 0x4b, 0x65, + 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x01, 0x2f, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb8, + 0x4b, 0x5f, 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x06, 0xe7, 0xf3, 0x78, 0x90, + 0x90, 0x03, 0x78, 0xd1, 0x00, 0x88, 0x4b, 0x5b, + 0x58, 0x18, 0x42, 0x90, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0xe8, 0x98, 0x03, 0x23, 0x80, + 0x40, 0x18, 0xd1, 0x49, 0x01, 0x08, 0x4b, 0x56, + 0x18, 0xc3, 0x93, 0x00, 0x20, 0x00, 0x9b, 0x00, + 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, 0x4e, 0x51, + 0x50, 0x33, 0x23, 0xff, 0x48, 0x51, 0x54, 0x43, + 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x50, + 0x68, 0x1b, 0x40, 0x18, 0x4b, 0x4e, 0x60, 0x18, + 0x98, 0x03, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x27, + 0x20, 0x01, 0x40, 0x88, 0x90, 0x04, 0x7a, 0x10, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x0b, 0x98, 0x04, + 0x23, 0x19, 0x06, 0x9b, 0x69, 0x1b, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x18, 0xe7, 0xf4, 0xe0, 0x0e, 0x7a, 0x10, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0a, 0x98, 0x04, + 0x23, 0x19, 0x06, 0x9b, 0x69, 0x5b, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, + 0x61, 0x58, 0xe7, 0xf4, 0x48, 0x3b, 0x5d, 0xc0, + 0x38, 0x01, 0x4b, 0x3a, 0x55, 0xd8, 0xe0, 0x06, + 0x4e, 0x39, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, + 0x68, 0x33, 0x40, 0x18, 0x60, 0x30, 0xe0, 0x36, + 0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x2f, + 0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x33, + 0x68, 0x1b, 0x18, 0xc3, 0x93, 0x02, 0x9b, 0x02, + 0x7e, 0x18, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, + 0x9b, 0x02, 0x76, 0x18, 0xe0, 0x0a, 0x9b, 0x02, + 0x7e, 0x58, 0x42, 0x88, 0xd1, 0x03, 0x20, 0xff, + 0x9b, 0x02, 0x76, 0x58, 0xe0, 0x02, 0x20, 0xb1, + 0xb0, 0x06, 0xe7, 0x7c, 0x23, 0x00, 0x00, 0x88, + 0x4e, 0x27, 0x50, 0x33, 0x20, 0xff, 0x4b, 0x27, + 0x54, 0x58, 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, + 0x4b, 0x25, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x24, + 0x80, 0x18, 0x4e, 0x24, 0x96, 0x05, 0x23, 0x00, + 0x00, 0x88, 0x9e, 0x05, 0x50, 0x33, 0xe0, 0x02, + 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x63, 0x78, 0xa8, + 0x38, 0x01, 0x70, 0xa8, 0x78, 0x50, 0x23, 0x80, + 0x43, 0x18, 0x70, 0x50, 0x78, 0xa8, 0x28, 0x00, + 0xd1, 0x07, 0x98, 0x01, 0x68, 0x00, 0x4b, 0x1a, + 0x40, 0x18, 0x9b, 0x01, 0x60, 0x18, 0x20, 0x01, + 0x70, 0xe8, 0x24, 0x1f, 0x2c, 0x00, 0xd1, 0x02, + 0xe0, 0x0a, 0x3c, 0x01, 0xe7, 0xfa, 0x48, 0x0d, + 0x5d, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x19, + 0x06, 0x80, 0x64, 0xc4, 0xe0, 0x00, 0xe7, 0xf4, + 0x20, 0x00, 0xb0, 0x06, 0xe7, 0x3f, 0xb0, 0x06, + 0xe7, 0x3d, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xcc, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0xe4, + 0x64, 0x00, 0x08, 0x08, 0x2e, 0x08, 0x5f, 0xa4, + 0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x7b, 0xf4, + 0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x5d, 0xc4, + 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xc4, + 0x2e, 0x08, 0x5e, 0xe0, 0x9e, 0x00, 0x04, 0xb8, + 0xff, 0xff, 0xdf, 0xff, 0x1c, 0x03, 0x1c, 0x0a, + 0x78, 0x58, 0x70, 0x10, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81, + 0x9a, 0x03, 0x06, 0x10, 0x0e, 0x00, 0x90, 0x00, + 0xb0, 0x87, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x4c, 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x48, 0x78, 0xb8, 0x90, 0x06, 0x99, 0x09, + 0x78, 0x88, 0x90, 0x05, 0x98, 0x06, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x3f, 0x98, 0x05, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x3b, 0x6b, 0x38, 0x90, 0x01, + 0x99, 0x09, 0x6b, 0x08, 0x90, 0x00, 0x98, 0x01, + 0x28, 0x00, 0xd1, 0x02, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb6, 0xb0, 0x08, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x5e, 0x5c, 0x6c, 0x00, 0x00, 0x20, - 0x2e, 0x08, 0x5e, 0x60, 0xcc, 0x00, 0x0f, 0x80, - 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x38, - 0x49, 0x23, 0x68, 0x09, 0x60, 0xc8, 0x68, 0x78, - 0x49, 0x21, 0x68, 0x09, 0x61, 0x08, 0x68, 0xb8, - 0x49, 0x1f, 0x68, 0x09, 0x61, 0x48, 0x68, 0xf8, - 0x49, 0x1d, 0x68, 0x09, 0x61, 0x88, 0x7d, 0x38, - 0x49, 0x1b, 0x68, 0x09, 0x31, 0x20, 0x70, 0x08, - 0x7d, 0x78, 0x49, 0x19, 0x68, 0x09, 0x31, 0x20, - 0x70, 0x48, 0x69, 0x38, 0x49, 0x16, 0x68, 0x09, - 0x61, 0xc8, 0x7d, 0xb8, 0x49, 0x14, 0x68, 0x09, - 0x31, 0x20, 0x70, 0x88, 0x68, 0x10, 0x49, 0x12, - 0x68, 0x09, 0x62, 0x48, 0x68, 0x50, 0x49, 0x10, - 0x68, 0x09, 0x62, 0x88, 0x68, 0x90, 0x49, 0x0e, - 0x68, 0x09, 0x62, 0xc8, 0x68, 0xd0, 0x49, 0x0c, - 0x68, 0x09, 0x63, 0x08, 0x7d, 0x10, 0x49, 0x0a, - 0x68, 0x09, 0x31, 0x20, 0x76, 0x08, 0x7d, 0x50, - 0x49, 0x07, 0x68, 0x09, 0x31, 0x20, 0x76, 0x48, - 0x69, 0x10, 0x49, 0x05, 0x68, 0x09, 0x63, 0x48, - 0x7d, 0x90, 0x49, 0x03, 0x68, 0x09, 0x31, 0x20, - 0x76, 0x88, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x5c, 0x1c, 0x02, 0x1c, 0x0b, - 0x48, 0x03, 0x68, 0x00, 0x60, 0x02, 0x48, 0x02, - 0x68, 0x00, 0x60, 0x43, 0x47, 0x70, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0xb0, 0x88, - 0x98, 0x08, 0x68, 0x04, 0x20, 0x01, 0x90, 0x06, - 0x20, 0x01, 0x90, 0x05, 0x48, 0x8c, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x19, 0x48, 0x8a, 0x68, 0x00, - 0x38, 0x01, 0x49, 0x89, 0x60, 0x08, 0x48, 0x88, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x10, 0x48, 0x87, - 0x78, 0x80, 0x90, 0x00, 0x98, 0x00, 0x00, 0xc0, - 0x49, 0x85, 0x68, 0x09, 0x58, 0x08, 0x23, 0xff, - 0x33, 0x01, 0x43, 0x98, 0x1c, 0x01, 0x98, 0x00, - 0x00, 0xc0, 0x4a, 0x81, 0x68, 0x12, 0x50, 0x11, - 0x20, 0x33, 0x06, 0x40, 0x6e, 0x00, 0x23, 0x0d, - 0x06, 0x9b, 0x1a, 0xc1, 0x91, 0x02, 0x20, 0x33, - 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, - 0x1a, 0xc0, 0x90, 0x01, 0x48, 0x79, 0x68, 0x00, - 0x42, 0x84, 0xd1, 0x73, 0x98, 0x01, 0x1d, 0xc7, - 0x37, 0x01, 0x78, 0x38, 0x18, 0x38, 0x1c, 0x47, - 0x48, 0x75, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b, - 0x1a, 0xc0, 0x42, 0xb8, 0xd9, 0x19, 0x78, 0x38, - 0x28, 0xff, 0xd1, 0x12, 0x78, 0x78, 0x23, 0xf0, - 0x40, 0x18, 0x28, 0xf0, 0xd1, 0x0d, 0x78, 0xb8, - 0x10, 0x80, 0x07, 0x80, 0x0f, 0x80, 0x06, 0x00, - 0x16, 0x00, 0x90, 0x06, 0x78, 0x78, 0x10, 0xc0, - 0x07, 0xc0, 0x09, 0xc0, 0x16, 0x00, 0x90, 0x05, - 0xe0, 0x03, 0x21, 0x01, 0x70, 0x39, 0x18, 0x7f, - 0xe7, 0xde, 0x21, 0x40, 0x91, 0x03, 0x25, 0x20, - 0x21, 0x14, 0x91, 0x07, 0x98, 0x06, 0x28, 0x00, - 0xd1, 0x02, 0x25, 0x23, 0x21, 0x12, 0x91, 0x07, - 0x98, 0x06, 0x28, 0x02, 0xd1, 0x02, 0x25, 0x30, - 0x21, 0x18, 0x91, 0x07, 0x98, 0x05, 0x28, 0x00, - 0xd1, 0x02, 0x00, 0x6d, 0x21, 0x70, 0x91, 0x03, - 0x99, 0x03, 0x00, 0x48, 0x99, 0x02, 0x1a, 0x08, - 0x90, 0x04, 0x98, 0x04, 0x99, 0x02, 0x42, 0x88, - 0xd3, 0x05, 0xe0, 0x4e, 0x98, 0x04, 0x99, 0x03, - 0x18, 0x40, 0x90, 0x04, 0xe7, 0xf5, 0x9f, 0x04, - 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 0x21, 0x00, - 0x70, 0x39, 0x37, 0x01, 0x21, 0x01, 0x70, 0x39, - 0x18, 0x7f, 0x21, 0xc0, 0x70, 0x39, 0x37, 0x01, - 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 0x21, 0x3a, - 0x70, 0x39, 0x37, 0x01, 0x21, 0x80, 0x70, 0x39, - 0x37, 0x01, 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, - 0x99, 0x03, 0x1f, 0xc8, 0x38, 0x02, 0x1b, 0x41, - 0x70, 0x39, 0x37, 0x01, 0x26, 0x00, 0x99, 0x03, - 0x1f, 0xc8, 0x38, 0x02, 0x1b, 0x40, 0x42, 0xb0, - 0xdc, 0x04, 0xe0, 0x00, 0xe0, 0x34, 0xe0, 0x05, - 0x36, 0x01, 0xe7, 0xf4, 0x21, 0xff, 0x70, 0x39, - 0x37, 0x01, 0xe7, 0xf9, 0x21, 0xff, 0x70, 0x39, - 0x37, 0x01, 0x98, 0x05, 0x00, 0xc0, 0x21, 0xf7, - 0x43, 0x01, 0x70, 0x39, 0x37, 0x01, 0x99, 0x07, - 0x70, 0x39, 0x37, 0x01, 0x21, 0xc0, 0x70, 0x39, - 0x37, 0x01, 0x26, 0x00, 0x1f, 0x28, 0x42, 0xb0, - 0xdc, 0x02, 0xe0, 0x05, 0x36, 0x01, 0xe7, 0xf9, - 0x21, 0x00, 0x70, 0x39, 0x37, 0x01, 0xe7, 0xf9, - 0xe7, 0xb0, 0x99, 0x03, 0x00, 0x48, 0x99, 0x02, - 0x1a, 0x08, 0x23, 0x0d, 0x06, 0x9b, 0x18, 0xc0, - 0x49, 0x29, 0x64, 0x88, 0x99, 0x09, 0x20, 0x78, - 0x40, 0x08, 0x23, 0x02, 0x43, 0x18, 0xf7, 0xff, - 0xfa, 0x17, 0x20, 0x01, 0xf7, 0xff, 0xfa, 0x14, - 0x48, 0x22, 0x68, 0x00, 0x38, 0x02, 0x42, 0xa0, - 0xd1, 0x09, 0x48, 0x22, 0x68, 0x01, 0x23, 0x01, - 0x05, 0x5b, 0x43, 0x19, 0x60, 0x01, 0x20, 0xff, - 0x49, 0x1f, 0x68, 0x09, 0x70, 0x08, 0x48, 0x1b, - 0x68, 0x00, 0x38, 0x02, 0x42, 0xa0, 0xd3, 0x0f, - 0x48, 0x1c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, - 0x48, 0x1a, 0x68, 0x00, 0x23, 0x01, 0x06, 0x9b, - 0x40, 0x18, 0xd0, 0x05, 0x20, 0x32, 0x49, 0x13, - 0x60, 0x08, 0x48, 0x12, 0x68, 0x00, 0x1e, 0x84, - 0x2c, 0x01, 0xd1, 0x02, 0x20, 0x02, 0xf7, 0xff, - 0xf9, 0xeb, 0x2c, 0xff, 0xd1, 0x08, 0x20, 0x33, - 0x06, 0x40, 0x6d, 0xc0, 0x30, 0xbc, 0x49, 0x0c, - 0x6c, 0xc9, 0x42, 0x88, 0xd2, 0x00, 0x24, 0x18, - 0x2c, 0x00, 0xd0, 0x02, 0x2c, 0xff, 0xd0, 0x00, - 0x3c, 0x01, 0x98, 0x08, 0x60, 0x04, 0xb0, 0x08, + 0x98, 0x01, 0x68, 0x05, 0x98, 0x00, 0x68, 0x04, + 0x7a, 0x2e, 0x7a, 0x21, 0x91, 0x04, 0x7d, 0x6a, + 0x92, 0x03, 0x7d, 0x62, 0x92, 0x02, 0x98, 0x07, + 0x28, 0x00, 0xd0, 0x0a, 0x9a, 0x02, 0x99, 0x04, + 0x1c, 0x28, 0xf0, 0x00, 0xfc, 0xe5, 0x9a, 0x03, + 0x1c, 0x31, 0x1c, 0x20, 0xf0, 0x00, 0xfc, 0xe0, + 0xe0, 0x09, 0x99, 0x04, 0x1c, 0x28, 0x22, 0x00, + 0xf0, 0x00, 0xfc, 0xda, 0x1c, 0x31, 0x1c, 0x20, + 0x22, 0x00, 0xf0, 0x00, 0xfc, 0xd5, 0x20, 0x00, + 0xb0, 0x08, 0xe7, 0xd5, 0x20, 0xb1, 0xb0, 0x08, + 0xe7, 0xd2, 0xb0, 0x07, 0xb0, 0x01, 0xe7, 0xcf, + 0xb4, 0xf0, 0x1c, 0x02, 0x1c, 0x0b, 0x06, 0x1d, + 0x0e, 0x2d, 0xb0, 0x82, 0x2d, 0x00, 0xd1, 0x0a, + 0x48, 0x1a, 0x69, 0x00, 0x90, 0x01, 0x49, 0x1a, + 0x48, 0x18, 0x69, 0x40, 0x90, 0x00, 0x48, 0x17, + 0x6a, 0x00, 0x1e, 0x44, 0xe0, 0x10, 0x2d, 0x20, + 0xd1, 0x0a, 0x48, 0x14, 0x69, 0x80, 0x90, 0x01, + 0x49, 0x14, 0x48, 0x12, 0x69, 0xc0, 0x90, 0x00, + 0x48, 0x10, 0x6a, 0x40, 0x1e, 0x44, 0xe0, 0x03, + 0x20, 0xb3, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, + 0x20, 0x00, 0x70, 0x10, 0x78, 0x50, 0x00, 0x80, + 0x4e, 0x0d, 0x58, 0x37, 0x69, 0x38, 0x61, 0x78, + 0x98, 0x01, 0x9e, 0x00, 0x42, 0xb0, 0xd0, 0x07, + 0x98, 0x01, 0x30, 0x01, 0x90, 0x01, 0x98, 0x01, + 0x40, 0x20, 0x90, 0x01, 0x98, 0x01, 0x60, 0x08, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xe6, 0xb0, 0x02, + 0xe7, 0xe4, 0x00, 0x00, 0x9e, 0x00, 0x04, 0x80, + 0x9e, 0x00, 0x04, 0x90, 0x9e, 0x00, 0x04, 0x98, + 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0x1c, 0x07, + 0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, 0x0e, 0x00, + 0x90, 0x00, 0xb0, 0x88, 0x98, 0x08, 0x28, 0x00, + 0xd1, 0x0e, 0x49, 0x69, 0x91, 0x02, 0x48, 0x69, + 0x69, 0x00, 0x90, 0x07, 0x48, 0x68, 0x90, 0x06, + 0x48, 0x66, 0x69, 0x40, 0x90, 0x05, 0x48, 0x65, + 0x6a, 0x00, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x17, + 0x98, 0x08, 0x28, 0x20, 0xd1, 0x0e, 0x49, 0x63, + 0x91, 0x02, 0x48, 0x60, 0x69, 0x80, 0x90, 0x07, + 0x48, 0x61, 0x90, 0x06, 0x48, 0x5d, 0x69, 0xc0, + 0x90, 0x05, 0x48, 0x5c, 0x6a, 0x40, 0x1e, 0x41, + 0x91, 0x04, 0xe0, 0x05, 0x20, 0xb3, 0xb0, 0x09, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x5e, 0x4c, 0x2e, 0x08, 0x5e, 0x38, - 0x2e, 0x08, 0x5d, 0xd8, 0x2e, 0x08, 0x1f, 0x20, - 0x66, 0x00, 0x00, 0x80, 0x6c, 0x00, 0x00, 0x20, - 0x2e, 0x08, 0x5e, 0x34, 0x6c, 0x00, 0x08, 0x00, - 0xb5, 0xff, 0x1c, 0x04, 0x1c, 0x0f, 0x9a, 0x02, - 0x06, 0x15, 0x0e, 0x2d, 0x9b, 0x03, 0x06, 0x1e, - 0x0e, 0x36, 0x2e, 0x20, 0xdb, 0x04, 0x20, 0xa2, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2d, 0x1f, 0xdb, 0x01, 0x20, 0xaf, 0xe7, 0xf7, - 0x20, 0x01, 0x03, 0x40, 0xf7, 0xff, 0xf9, 0xac, - 0x20, 0x14, 0x49, 0x09, 0x60, 0x08, 0x20, 0xff, - 0x60, 0x20, 0x1c, 0x33, 0x1c, 0x29, 0x1c, 0x38, - 0x22, 0x02, 0xf7, 0xfc, 0xfa, 0x4b, 0x48, 0x05, - 0x68, 0x01, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x19, - 0x60, 0x01, 0x20, 0x00, 0xe7, 0xe0, 0xe7, 0xdf, - 0x2e, 0x08, 0x1f, 0x20, 0x6c, 0x00, 0x00, 0x20, - 0xb4, 0x0f, 0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x82, - 0x20, 0x00, 0x49, 0x16, 0x60, 0x08, 0x48, 0x16, - 0x6f, 0x80, 0x23, 0x09, 0x01, 0x9b, 0x42, 0x98, - 0xd1, 0x02, 0x20, 0xe1, 0x00, 0xc0, 0xe0, 0x00, - 0x48, 0x12, 0x1c, 0x05, 0x68, 0x38, 0x28, 0xff, - 0xd1, 0x17, 0x98, 0x0d, 0x90, 0x00, 0x98, 0x0c, - 0x90, 0x01, 0x98, 0x01, 0x99, 0x00, 0x1a, 0x46, - 0x08, 0x68, 0x19, 0x81, 0x1c, 0x28, 0xf0, 0x09, - 0xfa, 0xeb, 0x1c, 0x04, 0x34, 0x01, 0x0f, 0xf0, - 0x07, 0xc0, 0xd0, 0x00, 0x24, 0x04, 0x2c, 0x32, - 0xd9, 0x00, 0x24, 0x04, 0x1d, 0xe0, 0x30, 0x0d, - 0x60, 0x38, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0xb0, 0x04, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x4c, - 0xcc, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x05, 0xdd, - 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x99, 0x02, - 0x06, 0x09, 0x0e, 0x09, 0x91, 0x00, 0xb0, 0x82, - 0x99, 0x02, 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, - 0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x99, 0x02, 0x00, 0x88, 0x49, 0x2f, - 0x58, 0x08, 0x90, 0x01, 0x28, 0x00, 0xd1, 0x02, - 0x20, 0xb0, 0xb0, 0x03, 0xe7, 0xf1, 0x20, 0x00, - 0x70, 0x78, 0x78, 0xb8, 0x07, 0x00, 0x0f, 0x00, - 0x90, 0x00, 0x98, 0x00, 0x28, 0x04, 0xd1, 0x1f, - 0x6a, 0xfe, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, - 0xe0, 0x18, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, - 0xe7, 0xf8, 0x00, 0xa0, 0x19, 0x80, 0x68, 0x40, - 0x00, 0xa1, 0x19, 0x89, 0x64, 0x48, 0x21, 0x00, - 0x00, 0xa0, 0x19, 0x80, 0x62, 0x41, 0x00, 0xa0, - 0x19, 0x80, 0x6c, 0x40, 0x28, 0x00, 0xd0, 0x04, - 0x20, 0x80, 0x41, 0x20, 0x88, 0x31, 0x43, 0x08, - 0x80, 0x30, 0xe7, 0xe6, 0x88, 0x30, 0x80, 0x70, - 0x78, 0xb8, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x1f, - 0x6b, 0x3d, 0x20, 0x00, 0x60, 0x28, 0x20, 0x00, - 0x60, 0x68, 0x20, 0x00, 0x60, 0xa8, 0x24, 0x00, - 0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x60, - 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, - 0x00, 0xa1, 0x19, 0x49, 0x60, 0xc8, 0x20, 0x00, - 0x00, 0xa1, 0x19, 0x49, 0x63, 0x88, 0xe7, 0xf2, - 0x20, 0x00, 0x62, 0xe8, 0x20, 0x00, 0x63, 0x28, - 0x20, 0x00, 0x63, 0x68, 0x20, 0x00, 0x65, 0xa8, - 0x99, 0x02, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x3e, - 0xb0, 0x03, 0xe7, 0x9e, 0xb0, 0x02, 0xb0, 0x01, - 0xe7, 0x9b, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, - 0xb5, 0xf3, 0x1c, 0x07, 0x99, 0x01, 0x06, 0x0c, - 0x0e, 0x24, 0xb0, 0x82, 0x2c, 0x20, 0xdb, 0x05, - 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x49, 0x12, - 0x58, 0x08, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, - 0xb0, 0x02, 0xe7, 0xf3, 0x1c, 0x21, 0x1c, 0x38, - 0xf0, 0x00, 0xf9, 0x84, 0x1c, 0x06, 0xd0, 0x02, - 0x1c, 0x30, 0xb0, 0x02, 0xe7, 0xea, 0x78, 0x68, - 0x21, 0x20, 0x40, 0x01, 0x91, 0x00, 0x99, 0x00, - 0x1c, 0x38, 0xf0, 0x00, 0xff, 0x3f, 0x68, 0xe9, - 0x91, 0x01, 0x29, 0x00, 0xd0, 0x03, 0x99, 0x01, - 0x1c, 0x38, 0xf0, 0x03, 0xfe, 0x7a, 0x20, 0x00, - 0xb0, 0x02, 0xe7, 0xd7, 0xb0, 0x02, 0xe7, 0xd5, - 0x2e, 0x08, 0x5e, 0x64, 0xb5, 0xf3, 0x1c, 0x02, - 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, 0xb0, 0x86, - 0x00, 0xb8, 0x4b, 0xa1, 0x68, 0x1b, 0x18, 0xc0, - 0x90, 0x00, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0xa2, - 0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0xb8, 0x4b, 0x9b, 0x58, 0x18, - 0x90, 0x05, 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, - 0xb0, 0x06, 0xe7, 0xf2, 0x78, 0x90, 0x90, 0x01, - 0x71, 0xd7, 0x78, 0xd1, 0x98, 0x01, 0x23, 0x80, - 0x40, 0x18, 0xd1, 0x73, 0x29, 0x20, 0xdd, 0x02, - 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0xe5, 0x48, 0x92, - 0x68, 0x00, 0x23, 0x01, 0x42, 0xd8, 0xd1, 0x02, - 0x20, 0xb2, 0xb0, 0x06, 0xe7, 0xdd, 0x20, 0x01, - 0x40, 0x88, 0x4b, 0x8d, 0x68, 0x1b, 0x40, 0x18, - 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0xd4, - 0x00, 0x88, 0x4b, 0x8a, 0x50, 0x1a, 0x48, 0x8a, - 0x54, 0x47, 0x01, 0x08, 0x4b, 0x89, 0x18, 0xc5, - 0x7f, 0x10, 0x06, 0x00, 0x7f, 0x53, 0x04, 0x1b, - 0x43, 0x18, 0x7f, 0x93, 0x02, 0x1b, 0x43, 0x18, - 0x7f, 0xd3, 0x43, 0x03, 0xc5, 0x08, 0x1d, 0xd0, - 0x30, 0x19, 0x78, 0x00, 0x06, 0x00, 0x1d, 0xd3, - 0x33, 0x19, 0x78, 0x5b, 0x04, 0x1b, 0x43, 0x18, - 0x1d, 0xd3, 0x33, 0x19, 0x78, 0x9b, 0x02, 0x1b, - 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 0x78, 0xdb, - 0x43, 0x03, 0xc5, 0x08, 0x01, 0x08, 0x4b, 0x7a, - 0x18, 0xc4, 0x7b, 0x10, 0x06, 0x00, 0x7b, 0x53, - 0x04, 0x1b, 0x43, 0x18, 0x7b, 0x93, 0x02, 0x1b, - 0x43, 0x18, 0x7b, 0xd3, 0x43, 0x03, 0xc4, 0x08, - 0x7c, 0x10, 0x06, 0x00, 0x7c, 0x53, 0x04, 0x1b, - 0x43, 0x18, 0x7c, 0x93, 0x02, 0x1b, 0x43, 0x18, - 0x7c, 0xd3, 0x43, 0x03, 0xc4, 0x08, 0x98, 0x01, - 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x20, 0x1d, 0xd0, - 0x30, 0x19, 0x79, 0x00, 0x06, 0x00, 0x1d, 0xd3, - 0x33, 0x19, 0x79, 0x5b, 0x04, 0x1b, 0x43, 0x18, - 0x1d, 0xd3, 0x33, 0x19, 0x79, 0x9b, 0x02, 0x1b, - 0x43, 0x18, 0x1d, 0xd3, 0x33, 0x19, 0x79, 0xdb, - 0x43, 0x03, 0xc5, 0x08, 0x7d, 0x10, 0x06, 0x00, - 0x7d, 0x53, 0x04, 0x1b, 0x43, 0x18, 0x7d, 0x93, - 0x02, 0x1b, 0xe0, 0x00, 0xe0, 0x42, 0x43, 0x18, - 0x7d, 0xd3, 0x43, 0x03, 0xc4, 0x08, 0xe0, 0x03, - 0x23, 0x00, 0xc5, 0x08, 0x23, 0x00, 0xc4, 0x08, - 0x23, 0xff, 0xc5, 0x08, 0x20, 0x19, 0x06, 0x80, - 0x6b, 0x00, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x06, - 0x88, 0x90, 0x04, 0x00, 0x19, 0xc3, 0x93, 0x02, - 0x9b, 0x02, 0xc4, 0x08, 0xe0, 0x00, 0xc4, 0x80, - 0x98, 0x01, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x17, - 0x48, 0x50, 0x5d, 0xc0, 0x30, 0x01, 0x4b, 0x4f, - 0x55, 0xd8, 0x7a, 0x10, 0x07, 0xc0, 0x0f, 0xc0, - 0xd0, 0x04, 0x20, 0x01, 0x40, 0x88, 0x23, 0x19, - 0x06, 0x9b, 0x61, 0x18, 0x7a, 0x10, 0x23, 0x02, - 0x40, 0x18, 0xd0, 0x04, 0x20, 0x01, 0x40, 0x88, - 0x23, 0x19, 0x06, 0x9b, 0x61, 0x58, 0xe0, 0x05, - 0x4e, 0x45, 0x20, 0x01, 0x40, 0x88, 0x68, 0x33, - 0x43, 0x18, 0x60, 0x30, 0x20, 0x01, 0x40, 0x88, - 0x4b, 0x3b, 0x68, 0x1b, 0x43, 0x18, 0x4b, 0x3a, - 0x60, 0x18, 0xe0, 0x4f, 0x98, 0x01, 0x23, 0x80, - 0x40, 0x18, 0xd0, 0x48, 0x48, 0x3d, 0x88, 0x00, - 0x4b, 0x3d, 0x42, 0x98, 0xd1, 0x02, 0x20, 0xb2, - 0xb0, 0x06, 0xe7, 0x26, 0x00, 0x88, 0x4b, 0x3b, - 0x58, 0x18, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb1, - 0xb0, 0x06, 0xe7, 0x1e, 0x29, 0x10, 0xdb, 0x02, - 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x19, 0x20, 0x01, - 0x40, 0x88, 0x4b, 0x32, 0x88, 0x1b, 0x40, 0x18, - 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x10, - 0x98, 0x05, 0x78, 0x80, 0x28, 0x02, 0xdb, 0x02, - 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x09, 0x00, 0x88, - 0x4b, 0x2c, 0x50, 0x1a, 0x48, 0x2c, 0x54, 0x47, - 0x00, 0xf8, 0x1b, 0xc0, 0x00, 0x80, 0x4b, 0x2b, - 0x68, 0x1b, 0x18, 0xc0, 0x90, 0x04, 0x98, 0x04, - 0x7e, 0x00, 0x28, 0xff, 0xd1, 0x02, 0x98, 0x04, - 0x76, 0x01, 0xe0, 0x01, 0x98, 0x04, 0x76, 0x41, - 0x4e, 0x25, 0x96, 0x03, 0x1d, 0xd3, 0x33, 0x05, - 0x00, 0x88, 0x9e, 0x03, 0x50, 0x33, 0x20, 0x01, - 0x40, 0x88, 0x4b, 0x1c, 0x88, 0x1b, 0x43, 0x18, - 0x4b, 0x1a, 0x80, 0x18, 0xe0, 0x02, 0x20, 0xb1, - 0xb0, 0x06, 0xe6, 0xe2, 0x78, 0x50, 0x23, 0x80, - 0x43, 0xdb, 0x40, 0x18, 0x70, 0x50, 0x98, 0x05, - 0x78, 0x80, 0x28, 0x00, 0xd1, 0x09, 0x98, 0x00, - 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, - 0x9b, 0x00, 0x60, 0x18, 0x20, 0x02, 0x9b, 0x05, - 0x70, 0xd8, 0x98, 0x05, 0x78, 0x80, 0x30, 0x01, - 0x9b, 0x05, 0x70, 0x98, 0x20, 0x00, 0xb0, 0x06, - 0xe6, 0xc7, 0xb0, 0x06, 0xe6, 0xc5, 0x00, 0x00, - 0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xec, - 0x2e, 0x08, 0x5f, 0xac, 0x64, 0x00, 0x10, 0x00, - 0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x7b, 0xfc, - 0x64, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x5e, 0xe8, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5f, 0x6c, - 0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5d, 0xcc, - 0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf3, 0x1c, 0x02, - 0x99, 0x01, 0x06, 0x0f, 0x0e, 0x3f, 0xb0, 0x86, - 0x00, 0xb8, 0x4b, 0x65, 0x68, 0x1b, 0x18, 0xc0, - 0x90, 0x01, 0x2f, 0x20, 0xdb, 0x05, 0x20, 0xa2, - 0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0xb8, 0x4b, 0x5f, 0x58, 0x18, - 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x06, - 0xe7, 0xf3, 0x78, 0x90, 0x90, 0x03, 0x78, 0xd1, - 0x00, 0x88, 0x4b, 0x5b, 0x58, 0x18, 0x42, 0x90, - 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0xe8, - 0x98, 0x03, 0x23, 0x80, 0x40, 0x18, 0xd1, 0x49, - 0x01, 0x08, 0x4b, 0x56, 0x18, 0xc3, 0x93, 0x00, - 0x20, 0x00, 0x9b, 0x00, 0x60, 0x18, 0x23, 0x00, - 0x00, 0x88, 0x4e, 0x51, 0x50, 0x33, 0x23, 0xff, - 0x48, 0x51, 0x54, 0x43, 0x20, 0x01, 0x40, 0x88, - 0x43, 0xc0, 0x4b, 0x50, 0x68, 0x1b, 0x40, 0x18, - 0x4b, 0x4e, 0x60, 0x18, 0x98, 0x03, 0x23, 0x08, - 0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x40, 0x88, - 0x90, 0x04, 0x7a, 0x10, 0x07, 0xc0, 0x0f, 0xc0, - 0xd0, 0x0b, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, - 0x69, 0x1b, 0x40, 0x18, 0xd0, 0x04, 0x98, 0x04, - 0x23, 0x19, 0x06, 0x9b, 0x61, 0x18, 0xe7, 0xf4, - 0xe0, 0x0e, 0x7a, 0x10, 0x23, 0x02, 0x40, 0x18, - 0xd0, 0x0a, 0x98, 0x04, 0x23, 0x19, 0x06, 0x9b, - 0x69, 0x5b, 0x40, 0x18, 0xd0, 0x04, 0x98, 0x04, - 0x23, 0x19, 0x06, 0x9b, 0x61, 0x58, 0xe7, 0xf4, - 0x48, 0x3b, 0x5d, 0xc0, 0x38, 0x01, 0x4b, 0x3a, - 0x55, 0xd8, 0xe0, 0x06, 0x4e, 0x39, 0x20, 0x01, - 0x40, 0x88, 0x43, 0xc0, 0x68, 0x33, 0x40, 0x18, - 0x60, 0x30, 0xe0, 0x36, 0x98, 0x03, 0x23, 0x80, - 0x40, 0x18, 0xd0, 0x2f, 0x00, 0xf8, 0x1b, 0xc0, - 0x00, 0x80, 0x4b, 0x33, 0x68, 0x1b, 0x18, 0xc3, - 0x93, 0x02, 0x9b, 0x02, 0x7e, 0x18, 0x42, 0x88, - 0xd1, 0x03, 0x20, 0xff, 0x9b, 0x02, 0x76, 0x18, - 0xe0, 0x0a, 0x9b, 0x02, 0x7e, 0x58, 0x42, 0x88, - 0xd1, 0x03, 0x20, 0xff, 0x9b, 0x02, 0x76, 0x58, - 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, 0xe7, 0x7c, - 0x23, 0x00, 0x00, 0x88, 0x4e, 0x27, 0x50, 0x33, - 0x20, 0xff, 0x4b, 0x27, 0x54, 0x58, 0x20, 0x01, - 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x25, 0x88, 0x1b, - 0x40, 0x18, 0x4b, 0x24, 0x80, 0x18, 0x4e, 0x24, - 0x96, 0x05, 0x23, 0x00, 0x00, 0x88, 0x9e, 0x05, - 0x50, 0x33, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x06, - 0xe7, 0x63, 0x78, 0xa8, 0x38, 0x01, 0x70, 0xa8, - 0x78, 0x50, 0x23, 0x80, 0x43, 0x18, 0x70, 0x50, - 0x78, 0xa8, 0x28, 0x00, 0xd1, 0x07, 0x98, 0x01, - 0x68, 0x00, 0x4b, 0x1a, 0x40, 0x18, 0x9b, 0x01, - 0x60, 0x18, 0x20, 0x01, 0x70, 0xe8, 0x24, 0x1f, - 0x2c, 0x00, 0xd1, 0x02, 0xe0, 0x0a, 0x3c, 0x01, - 0xe7, 0xfa, 0x48, 0x0d, 0x5d, 0x00, 0x28, 0x00, - 0xd1, 0x03, 0x20, 0x19, 0x06, 0x80, 0x64, 0xc4, - 0xe0, 0x00, 0xe7, 0xf4, 0x20, 0x00, 0xb0, 0x06, - 0xe7, 0x3f, 0xb0, 0x06, 0xe7, 0x3d, 0x00, 0x00, - 0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x5e, 0xec, 0x64, 0x00, 0x08, 0x08, - 0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xe4, - 0x2e, 0x08, 0x7b, 0xfc, 0x64, 0x00, 0x00, 0x18, - 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, - 0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5e, 0xe8, - 0x9e, 0x00, 0x04, 0xb8, 0xff, 0xff, 0xdf, 0xff, - 0x1c, 0x03, 0x1c, 0x0a, 0x78, 0x58, 0x70, 0x10, - 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf7, - 0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x10, - 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x87, 0x78, 0x78, - 0x23, 0x80, 0x40, 0x18, 0xd0, 0x4c, 0x78, 0x78, - 0x23, 0x80, 0x40, 0x18, 0xd0, 0x48, 0x78, 0xb8, - 0x90, 0x06, 0x99, 0x09, 0x78, 0x88, 0x90, 0x05, - 0x98, 0x06, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x3f, - 0x98, 0x05, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x3b, - 0x6b, 0x38, 0x90, 0x01, 0x99, 0x09, 0x6b, 0x08, - 0x90, 0x00, 0x98, 0x01, 0x28, 0x00, 0xd1, 0x02, - 0x98, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd1, 0x05, - 0x20, 0xb6, 0xb0, 0x08, 0xb0, 0x03, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x68, 0x05, - 0x98, 0x00, 0x68, 0x04, 0x7a, 0x2e, 0x7a, 0x21, - 0x91, 0x04, 0x7d, 0x6a, 0x92, 0x03, 0x7d, 0x62, - 0x92, 0x02, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x0a, - 0x9a, 0x02, 0x99, 0x04, 0x1c, 0x28, 0xf0, 0x00, - 0xfc, 0xe5, 0x9a, 0x03, 0x1c, 0x31, 0x1c, 0x20, - 0xf0, 0x00, 0xfc, 0xe0, 0xe0, 0x09, 0x99, 0x04, - 0x1c, 0x28, 0x22, 0x00, 0xf0, 0x00, 0xfc, 0xda, - 0x1c, 0x31, 0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, - 0xfc, 0xd5, 0x20, 0x00, 0xb0, 0x08, 0xe7, 0xd5, - 0x20, 0xb1, 0xb0, 0x08, 0xe7, 0xd2, 0xb0, 0x07, - 0xb0, 0x01, 0xe7, 0xcf, 0xb4, 0xf0, 0x1c, 0x02, - 0x1c, 0x0b, 0x06, 0x1d, 0x0e, 0x2d, 0xb0, 0x82, - 0x2d, 0x00, 0xd1, 0x0a, 0x48, 0x1a, 0x69, 0x00, - 0x90, 0x01, 0x49, 0x1a, 0x48, 0x18, 0x69, 0x40, - 0x90, 0x00, 0x48, 0x17, 0x6a, 0x00, 0x1e, 0x44, - 0xe0, 0x10, 0x2d, 0x20, 0xd1, 0x0a, 0x48, 0x14, - 0x69, 0x80, 0x90, 0x01, 0x49, 0x14, 0x48, 0x12, - 0x69, 0xc0, 0x90, 0x00, 0x48, 0x10, 0x6a, 0x40, - 0x1e, 0x44, 0xe0, 0x03, 0x20, 0xb3, 0xb0, 0x02, - 0xbc, 0xf0, 0x47, 0x70, 0x20, 0x00, 0x70, 0x10, - 0x78, 0x50, 0x00, 0x80, 0x4e, 0x0d, 0x58, 0x37, - 0x69, 0x38, 0x61, 0x78, 0x98, 0x01, 0x9e, 0x00, - 0x42, 0xb0, 0xd0, 0x07, 0x98, 0x01, 0x30, 0x01, - 0x90, 0x01, 0x98, 0x01, 0x40, 0x20, 0x90, 0x01, - 0x98, 0x01, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, - 0xe7, 0xe6, 0xb0, 0x02, 0xe7, 0xe4, 0x00, 0x00, - 0x9e, 0x00, 0x04, 0x80, 0x9e, 0x00, 0x04, 0x90, - 0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x5e, 0x64, - 0xb5, 0xf3, 0x1c, 0x07, 0xb0, 0x81, 0x99, 0x02, - 0x06, 0x08, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x88, - 0x98, 0x08, 0x28, 0x00, 0xd1, 0x0e, 0x49, 0x69, - 0x91, 0x02, 0x48, 0x69, 0x69, 0x00, 0x90, 0x07, - 0x48, 0x68, 0x90, 0x06, 0x48, 0x66, 0x69, 0x40, - 0x90, 0x05, 0x48, 0x65, 0x6a, 0x00, 0x1e, 0x41, - 0x91, 0x04, 0xe0, 0x17, 0x98, 0x08, 0x28, 0x20, - 0xd1, 0x0e, 0x49, 0x63, 0x91, 0x02, 0x48, 0x60, - 0x69, 0x80, 0x90, 0x07, 0x48, 0x61, 0x90, 0x06, - 0x48, 0x5d, 0x69, 0xc0, 0x90, 0x05, 0x48, 0x5c, - 0x6a, 0x40, 0x1e, 0x41, 0x91, 0x04, 0xe0, 0x05, - 0x20, 0xb3, 0xb0, 0x09, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x25, 0x00, 0x98, 0x07, - 0x99, 0x05, 0x42, 0x88, 0xd0, 0x73, 0x2d, 0x00, - 0xd1, 0x72, 0x98, 0x07, 0x00, 0x80, 0x99, 0x02, - 0x18, 0x40, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xc0, - 0x68, 0x01, 0x91, 0x03, 0x98, 0x07, 0x00, 0x80, - 0x99, 0x02, 0x58, 0x08, 0x90, 0x01, 0x99, 0x02, - 0x98, 0x07, 0x18, 0x08, 0x23, 0x01, 0x02, 0xdb, - 0x18, 0xc0, 0x78, 0x00, 0x90, 0x00, 0x20, 0x00, - 0x99, 0x02, 0x9a, 0x07, 0x18, 0x89, 0x23, 0x01, - 0x02, 0xdb, 0x18, 0xc9, 0x70, 0x08, 0x98, 0x07, - 0x30, 0x01, 0x90, 0x07, 0x98, 0x07, 0x99, 0x04, - 0x40, 0x08, 0x90, 0x07, 0x99, 0x03, 0x29, 0x00, - 0xd0, 0x71, 0xb0, 0x83, 0x20, 0x00, 0x90, 0x00, - 0x99, 0x06, 0x91, 0x02, 0x20, 0x01, 0x90, 0x01, - 0x98, 0x03, 0x28, 0x80, 0xd1, 0x1f, 0x24, 0x00, - 0x2c, 0x10, 0xd3, 0x02, 0xe0, 0x1a, 0x34, 0x01, - 0xe7, 0xfa, 0x98, 0x01, 0x99, 0x02, 0x40, 0x08, - 0xd0, 0x10, 0x48, 0x39, 0x5d, 0x00, 0x28, 0xff, - 0xd0, 0x0c, 0x48, 0x37, 0x5d, 0x00, 0x90, 0x00, - 0x00, 0xa0, 0x49, 0x36, 0x58, 0x09, 0x00, 0xa8, - 0x19, 0xc0, 0x61, 0x01, 0x1c, 0x68, 0x06, 0x05, - 0x0e, 0x2d, 0xe0, 0x03, 0x98, 0x01, 0x00, 0x40, - 0x90, 0x01, 0xe7, 0xe4, 0xe0, 0x1d, 0x24, 0x00, - 0x2c, 0x20, 0xd3, 0x02, 0xe0, 0x19, 0x34, 0x01, - 0xe7, 0xfa, 0x98, 0x01, 0x99, 0x02, 0x40, 0x08, - 0xd0, 0x0f, 0x48, 0x2b, 0x5d, 0x00, 0x28, 0xff, - 0xd0, 0x0b, 0x48, 0x29, 0x5d, 0x00, 0x90, 0x00, - 0x00, 0xa0, 0x49, 0x28, 0x58, 0x09, 0x00, 0xa8, - 0x19, 0xc0, 0x61, 0x01, 0x1c, 0x68, 0x06, 0x05, - 0x0e, 0x2d, 0x98, 0x01, 0x00, 0x40, 0x90, 0x01, - 0xe7, 0xe5, 0x2d, 0x00, 0xe0, 0x01, 0xe0, 0x27, - 0xe0, 0x26, 0xd0, 0x23, 0xb0, 0x81, 0x98, 0x01, - 0x70, 0x78, 0x98, 0x05, 0x60, 0x78, 0x98, 0x01, - 0x00, 0x80, 0x49, 0x1d, 0x58, 0x08, 0x90, 0x00, - 0x98, 0x00, 0x69, 0x46, 0x98, 0x05, 0x42, 0xb0, - 0xd3, 0x04, 0x1d, 0xf0, 0x30, 0xb9, 0x99, 0x05, - 0x42, 0x88, 0xd2, 0x08, 0x68, 0x30, 0x28, 0x00, - 0xd0, 0x01, 0x68, 0x36, 0xe0, 0x02, 0x20, 0xba, - 0xb0, 0x0d, 0xe7, 0x63, 0xe7, 0xee, 0x60, 0xbe, - 0x98, 0x00, 0x61, 0x46, 0x1c, 0x38, 0xf0, 0x00, - 0xfb, 0x02, 0xb0, 0x01, 0xb0, 0x03, 0xe7, 0x5e, - 0x70, 0x3d, 0x98, 0x07, 0x99, 0x06, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x09, 0xe7, 0x52, 0xb0, 0x08, - 0xb0, 0x01, 0xe7, 0x4f, 0x2e, 0x08, 0x60, 0x98, - 0x9e, 0x00, 0x04, 0x80, 0x9e, 0x00, 0x04, 0x90, - 0x2e, 0x08, 0x69, 0x98, 0x9e, 0x00, 0x04, 0x98, - 0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, - 0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xec, - 0x2e, 0x08, 0x5e, 0x64, 0xb4, 0x90, 0x1c, 0x01, - 0x78, 0x48, 0x00, 0x80, 0x4c, 0x0d, 0x58, 0x23, - 0x69, 0x1a, 0x68, 0x8f, 0x42, 0xba, 0xd0, 0x12, - 0x68, 0x10, 0x42, 0xb8, 0xd0, 0x08, 0x68, 0x10, - 0x28, 0x00, 0xd0, 0x01, 0x68, 0x12, 0xe0, 0x02, - 0x20, 0xba, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xf3, - 0x20, 0x00, 0x60, 0x10, 0x69, 0x9c, 0x69, 0x18, - 0x60, 0x20, 0x61, 0x1f, 0x61, 0x9a, 0x20, 0x00, - 0xe7, 0xf3, 0xe7, 0xf2, 0x2e, 0x08, 0x5e, 0x64, - 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x78, 0x90, - 0x23, 0x04, 0x40, 0x18, 0xd0, 0x1c, 0x78, 0x90, - 0x23, 0x20, 0x40, 0x18, 0xd0, 0x18, 0x6b, 0x14, - 0x68, 0x20, 0x28, 0x00, 0xd0, 0x02, 0x1d, 0xe5, - 0x35, 0x05, 0xe0, 0x01, 0x1d, 0xe5, 0x35, 0x31, - 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, 0xe0, 0x08, - 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, - 0x00, 0x88, 0x58, 0x2b, 0x00, 0x88, 0x50, 0x3b, - 0xe7, 0xf6, 0x20, 0x00, 0xbc, 0xb0, 0x47, 0x70, - 0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa, 0xb5, 0xf3, - 0x1c, 0x0a, 0xb0, 0x93, 0x20, 0x00, 0x90, 0x06, - 0x98, 0x13, 0x69, 0x00, 0x90, 0x00, 0x98, 0x00, - 0x6b, 0x00, 0x90, 0x12, 0x98, 0x00, 0x78, 0x80, - 0x90, 0x05, 0x98, 0x12, 0x68, 0x00, 0x90, 0x01, - 0x28, 0x00, 0xd0, 0x03, 0x98, 0x12, 0x30, 0x0c, - 0x90, 0x09, 0xe0, 0x0e, 0x98, 0x12, 0x6a, 0xc0, - 0x90, 0x01, 0x28, 0x00, 0xd0, 0x03, 0x98, 0x12, - 0x30, 0x38, 0x90, 0x09, 0xe0, 0x05, 0x20, 0xb1, - 0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x20, 0x00, 0x90, 0x06, 0x98, 0x05, - 0x23, 0x04, 0x40, 0x18, 0xd0, 0x73, 0x21, 0x00, - 0x29, 0x08, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x48, - 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x98, 0x13, - 0x30, 0x80, 0x69, 0x00, 0x00, 0x8b, 0x58, 0xc0, - 0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe7, 0xf2, - 0x9d, 0x01, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, - 0xe0, 0xa7, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, - 0xe7, 0xf8, 0x00, 0x88, 0xab, 0x0a, 0x58, 0x18, - 0x28, 0x00, 0xd0, 0x55, 0x20, 0x00, 0x90, 0x08, - 0x48, 0x73, 0x90, 0x07, 0x20, 0x00, 0x90, 0x02, - 0x98, 0x02, 0x28, 0x20, 0xdb, 0x06, 0xe0, 0x8d, - 0x98, 0x02, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, - 0x90, 0x02, 0xe7, 0xf5, 0x00, 0x8b, 0xa8, 0x0a, - 0x58, 0xc0, 0x9b, 0x07, 0x40, 0x18, 0x90, 0x08, - 0x28, 0x00, 0xd0, 0x73, 0x00, 0x88, 0x9b, 0x09, - 0x58, 0x18, 0x9b, 0x08, 0x40, 0x18, 0xd0, 0x6e, - 0x1d, 0xec, 0x34, 0x01, 0x27, 0x00, 0x79, 0xa0, - 0x9b, 0x06, 0x42, 0x98, 0xd0, 0x08, 0x68, 0x68, - 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xba, 0xb0, 0x13, - 0xe7, 0xab, 0x1d, 0xec, 0x34, 0x01, 0xe7, 0xf2, - 0x78, 0x60, 0x07, 0x00, 0x0f, 0x00, 0x02, 0x00, - 0x04, 0x07, 0x0c, 0x3f, 0x78, 0xa0, 0x19, 0xc0, - 0x30, 0x03, 0x04, 0x07, 0x0c, 0x3f, 0x2a, 0x00, - 0xd0, 0x42, 0x98, 0x13, 0x88, 0x40, 0x42, 0xb8, - 0xdb, 0x3a, 0x98, 0x13, 0x88, 0x40, 0x1b, 0xc0, - 0x9b, 0x13, 0x80, 0x58, 0x20, 0xbc, 0x90, 0x04, - 0x2f, 0x00, 0xdd, 0x30, 0x2f, 0xbc, 0xdd, 0x1b, - 0x20, 0x00, 0x90, 0x03, 0x98, 0x03, 0x28, 0xbc, - 0xdb, 0x09, 0xe0, 0x0d, 0x98, 0x03, 0x30, 0x01, - 0x06, 0x00, 0x0e, 0x00, 0xe0, 0x01, 0xe0, 0x4c, - 0xe0, 0x41, 0x90, 0x03, 0xe7, 0xf2, 0x78, 0x23, - 0x34, 0x01, 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf1, - 0x1f, 0xf8, 0x38, 0xb5, 0x04, 0x07, 0x0c, 0x3f, - 0x68, 0x2d, 0x1d, 0xec, 0x34, 0x01, 0xe0, 0x11, - 0x20, 0x00, 0x90, 0x03, 0x98, 0x03, 0x42, 0xb8, - 0xdb, 0x06, 0xe0, 0x0a, 0x98, 0x03, 0x30, 0x01, - 0x06, 0x00, 0x0e, 0x00, 0x90, 0x03, 0xe7, 0xf5, - 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, 0x32, 0x01, - 0xe7, 0xf4, 0x27, 0x00, 0xe7, 0xcc, 0xe0, 0x02, - 0x20, 0xb7, 0xb0, 0x13, 0xe7, 0x59, 0xe0, 0x04, - 0x98, 0x13, 0x88, 0x40, 0x19, 0xc0, 0x9b, 0x13, - 0x80, 0x58, 0x00, 0x88, 0xab, 0x0a, 0x58, 0x18, - 0x9b, 0x07, 0x43, 0x98, 0x00, 0x8e, 0xab, 0x0a, - 0x51, 0x98, 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x00, - 0x9d, 0x01, 0x98, 0x06, 0x30, 0x01, 0x06, 0x00, - 0x0e, 0x00, 0x90, 0x06, 0x98, 0x07, 0x08, 0x40, - 0x90, 0x07, 0xe7, 0x71, 0xe0, 0x04, 0x98, 0x06, - 0x30, 0x20, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06, - 0xe7, 0x57, 0x20, 0x00, 0xb0, 0x13, 0xe7, 0x34, - 0xe0, 0x44, 0x98, 0x05, 0x23, 0x02, 0x40, 0x18, - 0xd0, 0x3b, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01, - 0x78, 0x60, 0x07, 0x00, 0x0f, 0x00, 0x02, 0x00, - 0x04, 0x07, 0x0c, 0x3f, 0x78, 0xa0, 0x19, 0xc0, - 0x30, 0x03, 0x04, 0x07, 0x0c, 0x3f, 0x2f, 0x00, - 0xdd, 0x28, 0x2f, 0xbc, 0xdd, 0x17, 0x21, 0x00, - 0x29, 0xbc, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, - 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x23, - 0x34, 0x01, 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf6, - 0x1f, 0xf8, 0x38, 0xb5, 0x04, 0x07, 0x0c, 0x3f, - 0x98, 0x01, 0x68, 0x00, 0x90, 0x01, 0x98, 0x01, - 0x1d, 0xc4, 0x34, 0x01, 0xe0, 0x0d, 0x21, 0x00, - 0x42, 0xb9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, - 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x23, - 0x34, 0x01, 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf6, - 0x27, 0x00, 0xe7, 0xd4, 0x20, 0x00, 0xb0, 0x13, - 0xe6, 0xf3, 0x20, 0xb1, 0xb0, 0x13, 0xe6, 0xf0, - 0xb0, 0x13, 0xe6, 0xee, 0xe6, 0xed, 0x00, 0x00, - 0x80, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0xb0, 0x84, - 0x98, 0x04, 0x78, 0x40, 0x00, 0x80, 0x49, 0x4b, - 0x58, 0x08, 0x90, 0x03, 0x28, 0x00, 0xd1, 0x05, - 0x20, 0xb0, 0xb0, 0x04, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x98, 0x04, 0x68, 0x86, - 0x98, 0x04, 0x88, 0x47, 0x98, 0x04, 0x68, 0x44, - 0x1d, 0xf0, 0x30, 0xb9, 0x99, 0x04, 0x68, 0x49, - 0x1a, 0x45, 0x42, 0xbd, 0xdb, 0x0c, 0x2f, 0x00, - 0xdb, 0x01, 0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, - 0xb0, 0x04, 0xe7, 0xe7, 0x1c, 0x3a, 0x99, 0x05, - 0x1c, 0x20, 0xf0, 0x00, 0xf9, 0x29, 0xe0, 0x6b, - 0x20, 0x00, 0x90, 0x00, 0x98, 0x04, 0x78, 0x40, - 0x00, 0xc3, 0x1a, 0x18, 0x00, 0x80, 0x49, 0x36, - 0x68, 0x09, 0x18, 0x40, 0x90, 0x01, 0x98, 0x01, - 0x78, 0x80, 0x90, 0x02, 0x98, 0x02, 0x06, 0xc0, - 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x12, - 0xd1, 0x03, 0x2d, 0x0e, 0xda, 0x01, 0x20, 0x01, - 0x90, 0x00, 0x2f, 0x00, 0xdd, 0x50, 0xb0, 0x81, - 0x42, 0xaf, 0xdd, 0x0d, 0x2d, 0x00, 0xdb, 0x01, - 0x2d, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05, - 0xe7, 0xbc, 0x1c, 0x2a, 0x99, 0x06, 0x1c, 0x20, - 0xf0, 0x00, 0xf8, 0xfe, 0x68, 0x36, 0xe0, 0x0b, - 0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc, 0xdd, 0x02, - 0x20, 0xba, 0xb0, 0x05, 0xe7, 0xae, 0x1c, 0x3a, - 0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xf0, - 0x99, 0x06, 0x19, 0x49, 0x91, 0x06, 0x1b, 0x7f, - 0x1d, 0x31, 0x91, 0x00, 0x99, 0x00, 0x78, 0x88, - 0x19, 0x84, 0x98, 0x01, 0x28, 0x00, 0xd0, 0x20, - 0x99, 0x00, 0x78, 0xc8, 0x23, 0x80, 0x40, 0x18, - 0xd1, 0x1b, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05, - 0x42, 0xbd, 0xdb, 0x01, 0x3c, 0x01, 0xe0, 0x14, - 0x1c, 0x68, 0x42, 0xb8, 0xd1, 0x11, 0x99, 0x00, - 0x78, 0x88, 0x28, 0x09, 0xdd, 0x08, 0x99, 0x00, - 0x79, 0x08, 0x30, 0x09, 0x99, 0x00, 0x78, 0x89, - 0x42, 0x88, 0xd0, 0x00, 0x3c, 0x01, 0xe0, 0x04, - 0x99, 0x00, 0x78, 0x88, 0x28, 0x09, 0xd1, 0x00, - 0x3c, 0x01, 0x20, 0x00, 0x90, 0x01, 0x1d, 0xf0, - 0x30, 0xb9, 0x1b, 0x05, 0xb0, 0x01, 0xe7, 0xac, - 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x72, 0xb0, 0x04, - 0xe7, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x5d, 0xcc, 0xb5, 0xf1, 0x98, 0x00, - 0x06, 0x04, 0x0e, 0x24, 0xb0, 0x83, 0x00, 0xa0, - 0x4b, 0x4c, 0x58, 0x1d, 0x78, 0x28, 0x90, 0x02, - 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x00, 0xa0, 0x4b, 0x46, 0x58, 0x18, 0x1c, 0x05, - 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x03, 0xe7, 0xf3, - 0x00, 0xe0, 0x1b, 0x00, 0x00, 0x80, 0x4b, 0x42, - 0x68, 0x1b, 0x18, 0xc7, 0x78, 0xa8, 0x28, 0x00, - 0xd0, 0x63, 0x20, 0x00, 0x42, 0x80, 0xd0, 0x20, - 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x1b, - 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, - 0x00, 0x88, 0x4b, 0x3a, 0x58, 0x18, 0x90, 0x01, - 0x98, 0x01, 0x79, 0xc0, 0x42, 0xa0, 0xd1, 0x0e, - 0x20, 0x01, 0x40, 0x88, 0x43, 0xc0, 0x4b, 0x36, - 0x68, 0x1b, 0x40, 0x18, 0x4b, 0x34, 0x60, 0x18, - 0x23, 0x00, 0x00, 0x88, 0x4e, 0x31, 0x50, 0x33, - 0x23, 0xff, 0x48, 0x32, 0x54, 0x43, 0xe7, 0xe3, - 0xe0, 0x3f, 0x7e, 0x38, 0x1c, 0x02, 0x28, 0xff, - 0xd0, 0x10, 0x20, 0xff, 0x4b, 0x2e, 0x54, 0x98, - 0x23, 0x00, 0x00, 0x90, 0x4e, 0x2d, 0x50, 0x33, - 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, 0x4b, 0x2c, - 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x2a, 0x80, 0x18, - 0x20, 0xff, 0x76, 0x38, 0x7e, 0x78, 0x1c, 0x02, - 0x28, 0xff, 0xd0, 0x11, 0x20, 0xff, 0x4b, 0x24, - 0x54, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x23, + 0x25, 0x00, 0x98, 0x07, 0x99, 0x05, 0x42, 0x88, + 0xd0, 0x73, 0x2d, 0x00, 0xd1, 0x72, 0x98, 0x07, + 0x00, 0x80, 0x99, 0x02, 0x18, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xc0, 0x68, 0x01, 0x91, 0x03, + 0x98, 0x07, 0x00, 0x80, 0x99, 0x02, 0x58, 0x08, + 0x90, 0x01, 0x99, 0x02, 0x98, 0x07, 0x18, 0x08, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc0, 0x78, 0x00, + 0x90, 0x00, 0x20, 0x00, 0x99, 0x02, 0x9a, 0x07, + 0x18, 0x89, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xc9, + 0x70, 0x08, 0x98, 0x07, 0x30, 0x01, 0x90, 0x07, + 0x98, 0x07, 0x99, 0x04, 0x40, 0x08, 0x90, 0x07, + 0x99, 0x03, 0x29, 0x00, 0xd0, 0x71, 0xb0, 0x83, + 0x20, 0x00, 0x90, 0x00, 0x99, 0x06, 0x91, 0x02, + 0x20, 0x01, 0x90, 0x01, 0x98, 0x03, 0x28, 0x80, + 0xd1, 0x1f, 0x24, 0x00, 0x2c, 0x10, 0xd3, 0x02, + 0xe0, 0x1a, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x10, 0x48, 0x39, + 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0c, 0x48, 0x37, + 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x36, + 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0xe0, 0x03, + 0x98, 0x01, 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe4, + 0xe0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xd3, 0x02, + 0xe0, 0x19, 0x34, 0x01, 0xe7, 0xfa, 0x98, 0x01, + 0x99, 0x02, 0x40, 0x08, 0xd0, 0x0f, 0x48, 0x2b, + 0x5d, 0x00, 0x28, 0xff, 0xd0, 0x0b, 0x48, 0x29, + 0x5d, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x49, 0x28, + 0x58, 0x09, 0x00, 0xa8, 0x19, 0xc0, 0x61, 0x01, + 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, 0x98, 0x01, + 0x00, 0x40, 0x90, 0x01, 0xe7, 0xe5, 0x2d, 0x00, + 0xe0, 0x01, 0xe0, 0x27, 0xe0, 0x26, 0xd0, 0x23, + 0xb0, 0x81, 0x98, 0x01, 0x70, 0x78, 0x98, 0x05, + 0x60, 0x78, 0x98, 0x01, 0x00, 0x80, 0x49, 0x1d, + 0x58, 0x08, 0x90, 0x00, 0x98, 0x00, 0x69, 0x46, + 0x98, 0x05, 0x42, 0xb0, 0xd3, 0x04, 0x1d, 0xf0, + 0x30, 0xb9, 0x99, 0x05, 0x42, 0x88, 0xd2, 0x08, + 0x68, 0x30, 0x28, 0x00, 0xd0, 0x01, 0x68, 0x36, + 0xe0, 0x02, 0x20, 0xba, 0xb0, 0x0d, 0xe7, 0x63, + 0xe7, 0xee, 0x60, 0xbe, 0x98, 0x00, 0x61, 0x46, + 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0x02, 0xb0, 0x01, + 0xb0, 0x03, 0xe7, 0x5e, 0x70, 0x3d, 0x98, 0x07, + 0x99, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x09, + 0xe7, 0x52, 0xb0, 0x08, 0xb0, 0x01, 0xe7, 0x4f, + 0x2e, 0x08, 0x60, 0x90, 0x9e, 0x00, 0x04, 0x80, + 0x9e, 0x00, 0x04, 0x90, 0x2e, 0x08, 0x69, 0x90, + 0x9e, 0x00, 0x04, 0x98, 0x2e, 0x08, 0x5f, 0xc4, + 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5f, 0xa4, + 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0x5c, + 0xb4, 0x90, 0x1c, 0x01, 0x78, 0x48, 0x00, 0x80, + 0x4c, 0x0d, 0x58, 0x23, 0x69, 0x1a, 0x68, 0x8f, + 0x42, 0xba, 0xd0, 0x12, 0x68, 0x10, 0x42, 0xb8, + 0xd0, 0x08, 0x68, 0x10, 0x28, 0x00, 0xd0, 0x01, + 0x68, 0x12, 0xe0, 0x02, 0x20, 0xba, 0xbc, 0x90, + 0x47, 0x70, 0xe7, 0xf3, 0x20, 0x00, 0x60, 0x10, + 0x69, 0x9c, 0x69, 0x18, 0x60, 0x20, 0x61, 0x1f, + 0x61, 0x9a, 0x20, 0x00, 0xe7, 0xf3, 0xe7, 0xf2, + 0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0xb0, 0x1c, 0x02, + 0x1c, 0x0f, 0x78, 0x90, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x1c, 0x78, 0x90, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x18, 0x6b, 0x14, 0x68, 0x20, 0x28, 0x00, + 0xd0, 0x02, 0x1d, 0xe5, 0x35, 0x05, 0xe0, 0x01, + 0x1d, 0xe5, 0x35, 0x31, 0x21, 0x00, 0x29, 0x08, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, + 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x58, 0x2b, + 0x00, 0x88, 0x50, 0x3b, 0xe7, 0xf6, 0x20, 0x00, + 0xbc, 0xb0, 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, + 0xe7, 0xfa, 0xb5, 0xf3, 0x1c, 0x0a, 0xb0, 0x93, + 0x20, 0x00, 0x90, 0x06, 0x98, 0x13, 0x69, 0x00, + 0x90, 0x00, 0x98, 0x00, 0x6b, 0x00, 0x90, 0x12, + 0x98, 0x00, 0x78, 0x80, 0x90, 0x05, 0x98, 0x12, + 0x68, 0x00, 0x90, 0x01, 0x28, 0x00, 0xd0, 0x03, + 0x98, 0x12, 0x30, 0x0c, 0x90, 0x09, 0xe0, 0x0e, + 0x98, 0x12, 0x6a, 0xc0, 0x90, 0x01, 0x28, 0x00, + 0xd0, 0x03, 0x98, 0x12, 0x30, 0x38, 0x90, 0x09, + 0xe0, 0x05, 0x20, 0xb1, 0xb0, 0x13, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, + 0x90, 0x06, 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x73, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, + 0xe0, 0x0c, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x98, 0x13, 0x30, 0x80, 0x69, 0x00, + 0x00, 0x8b, 0x58, 0xc0, 0x00, 0x8e, 0xab, 0x0a, + 0x51, 0x98, 0xe7, 0xf2, 0x9d, 0x01, 0x21, 0x00, + 0x29, 0x08, 0xdb, 0x04, 0xe0, 0xa7, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, + 0xab, 0x0a, 0x58, 0x18, 0x28, 0x00, 0xd0, 0x55, + 0x20, 0x00, 0x90, 0x08, 0x48, 0x73, 0x90, 0x07, + 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, 0x28, 0x20, + 0xdb, 0x06, 0xe0, 0x8d, 0x98, 0x02, 0x30, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x02, 0xe7, 0xf5, + 0x00, 0x8b, 0xa8, 0x0a, 0x58, 0xc0, 0x9b, 0x07, + 0x40, 0x18, 0x90, 0x08, 0x28, 0x00, 0xd0, 0x73, + 0x00, 0x88, 0x9b, 0x09, 0x58, 0x18, 0x9b, 0x08, + 0x40, 0x18, 0xd0, 0x6e, 0x1d, 0xec, 0x34, 0x01, + 0x27, 0x00, 0x79, 0xa0, 0x9b, 0x06, 0x42, 0x98, + 0xd0, 0x08, 0x68, 0x68, 0x1c, 0x05, 0xd1, 0x02, + 0x20, 0xba, 0xb0, 0x13, 0xe7, 0xab, 0x1d, 0xec, + 0x34, 0x01, 0xe7, 0xf2, 0x78, 0x60, 0x07, 0x00, + 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, + 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, + 0x0c, 0x3f, 0x2a, 0x00, 0xd0, 0x42, 0x98, 0x13, + 0x88, 0x40, 0x42, 0xb8, 0xdb, 0x3a, 0x98, 0x13, + 0x88, 0x40, 0x1b, 0xc0, 0x9b, 0x13, 0x80, 0x58, + 0x20, 0xbc, 0x90, 0x04, 0x2f, 0x00, 0xdd, 0x30, + 0x2f, 0xbc, 0xdd, 0x1b, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x28, 0xbc, 0xdb, 0x09, 0xe0, 0x0d, + 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0xe0, 0x01, 0xe0, 0x4c, 0xe0, 0x41, 0x90, 0x03, + 0xe7, 0xf2, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf1, 0x1f, 0xf8, 0x38, 0xb5, + 0x04, 0x07, 0x0c, 0x3f, 0x68, 0x2d, 0x1d, 0xec, + 0x34, 0x01, 0xe0, 0x11, 0x20, 0x00, 0x90, 0x03, + 0x98, 0x03, 0x42, 0xb8, 0xdb, 0x06, 0xe0, 0x0a, + 0x98, 0x03, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x03, 0xe7, 0xf5, 0x78, 0x23, 0x34, 0x01, + 0x70, 0x13, 0x32, 0x01, 0xe7, 0xf4, 0x27, 0x00, + 0xe7, 0xcc, 0xe0, 0x02, 0x20, 0xb7, 0xb0, 0x13, + 0xe7, 0x59, 0xe0, 0x04, 0x98, 0x13, 0x88, 0x40, + 0x19, 0xc0, 0x9b, 0x13, 0x80, 0x58, 0x00, 0x88, + 0xab, 0x0a, 0x58, 0x18, 0x9b, 0x07, 0x43, 0x98, + 0x00, 0x8e, 0xab, 0x0a, 0x51, 0x98, 0xe0, 0x01, + 0xe0, 0x01, 0xe0, 0x00, 0x9d, 0x01, 0x98, 0x06, + 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x06, + 0x98, 0x07, 0x08, 0x40, 0x90, 0x07, 0xe7, 0x71, + 0xe0, 0x04, 0x98, 0x06, 0x30, 0x20, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x06, 0xe7, 0x57, 0x20, 0x00, + 0xb0, 0x13, 0xe7, 0x34, 0xe0, 0x44, 0x98, 0x05, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3b, 0x98, 0x01, + 0x1d, 0xc4, 0x34, 0x01, 0x78, 0x60, 0x07, 0x00, + 0x0f, 0x00, 0x02, 0x00, 0x04, 0x07, 0x0c, 0x3f, + 0x78, 0xa0, 0x19, 0xc0, 0x30, 0x03, 0x04, 0x07, + 0x0c, 0x3f, 0x2f, 0x00, 0xdd, 0x28, 0x2f, 0xbc, + 0xdd, 0x17, 0x21, 0x00, 0x29, 0xbc, 0xdb, 0x04, + 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf6, 0x1f, 0xf8, 0x38, 0xb5, + 0x04, 0x07, 0x0c, 0x3f, 0x98, 0x01, 0x68, 0x00, + 0x90, 0x01, 0x98, 0x01, 0x1d, 0xc4, 0x34, 0x01, + 0xe0, 0x0d, 0x21, 0x00, 0x42, 0xb9, 0xdb, 0x04, + 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x23, 0x34, 0x01, 0x70, 0x13, + 0x32, 0x01, 0xe7, 0xf6, 0x27, 0x00, 0xe7, 0xd4, + 0x20, 0x00, 0xb0, 0x13, 0xe6, 0xf3, 0x20, 0xb1, + 0xb0, 0x13, 0xe6, 0xf0, 0xb0, 0x13, 0xe6, 0xee, + 0xe6, 0xed, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf3, 0xb0, 0x84, 0x98, 0x04, 0x78, 0x40, + 0x00, 0x80, 0x49, 0x4b, 0x58, 0x08, 0x90, 0x03, + 0x28, 0x00, 0xd1, 0x05, 0x20, 0xb0, 0xb0, 0x04, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x04, 0x68, 0x86, 0x98, 0x04, 0x88, 0x47, + 0x98, 0x04, 0x68, 0x44, 0x1d, 0xf0, 0x30, 0xb9, + 0x99, 0x04, 0x68, 0x49, 0x1a, 0x45, 0x42, 0xbd, + 0xdb, 0x0c, 0x2f, 0x00, 0xdb, 0x01, 0x2f, 0xbc, + 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x04, 0xe7, 0xe7, + 0x1c, 0x3a, 0x99, 0x05, 0x1c, 0x20, 0xf0, 0x00, + 0xf9, 0x29, 0xe0, 0x6b, 0x20, 0x00, 0x90, 0x00, + 0x98, 0x04, 0x78, 0x40, 0x00, 0xc3, 0x1a, 0x18, + 0x00, 0x80, 0x49, 0x36, 0x68, 0x09, 0x18, 0x40, + 0x90, 0x01, 0x98, 0x01, 0x78, 0x80, 0x90, 0x02, + 0x98, 0x02, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x28, 0x12, 0xd1, 0x03, 0x2d, 0x0e, + 0xda, 0x01, 0x20, 0x01, 0x90, 0x00, 0x2f, 0x00, + 0xdd, 0x50, 0xb0, 0x81, 0x42, 0xaf, 0xdd, 0x0d, + 0x2d, 0x00, 0xdb, 0x01, 0x2d, 0xbc, 0xdd, 0x02, + 0x20, 0xba, 0xb0, 0x05, 0xe7, 0xbc, 0x1c, 0x2a, + 0x99, 0x06, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0xfe, + 0x68, 0x36, 0xe0, 0x0b, 0x2f, 0x00, 0xdb, 0x01, + 0x2f, 0xbc, 0xdd, 0x02, 0x20, 0xba, 0xb0, 0x05, + 0xe7, 0xae, 0x1c, 0x3a, 0x99, 0x06, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0xf0, 0x99, 0x06, 0x19, 0x49, + 0x91, 0x06, 0x1b, 0x7f, 0x1d, 0x31, 0x91, 0x00, + 0x99, 0x00, 0x78, 0x88, 0x19, 0x84, 0x98, 0x01, + 0x28, 0x00, 0xd0, 0x20, 0x99, 0x00, 0x78, 0xc8, + 0x23, 0x80, 0x40, 0x18, 0xd1, 0x1b, 0x1d, 0xf0, + 0x30, 0xb9, 0x1b, 0x05, 0x42, 0xbd, 0xdb, 0x01, + 0x3c, 0x01, 0xe0, 0x14, 0x1c, 0x68, 0x42, 0xb8, + 0xd1, 0x11, 0x99, 0x00, 0x78, 0x88, 0x28, 0x09, + 0xdd, 0x08, 0x99, 0x00, 0x79, 0x08, 0x30, 0x09, + 0x99, 0x00, 0x78, 0x89, 0x42, 0x88, 0xd0, 0x00, + 0x3c, 0x01, 0xe0, 0x04, 0x99, 0x00, 0x78, 0x88, + 0x28, 0x09, 0xd1, 0x00, 0x3c, 0x01, 0x20, 0x00, + 0x90, 0x01, 0x1d, 0xf0, 0x30, 0xb9, 0x1b, 0x05, + 0xb0, 0x01, 0xe7, 0xac, 0x20, 0x00, 0xb0, 0x04, + 0xe7, 0x72, 0xb0, 0x04, 0xe7, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x04, 0x0e, 0x24, + 0xb0, 0x83, 0x00, 0xa0, 0x4b, 0x4c, 0x58, 0x1d, + 0x78, 0x28, 0x90, 0x02, 0x2c, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x46, + 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, + 0xb0, 0x03, 0xe7, 0xf3, 0x00, 0xe0, 0x1b, 0x00, + 0x00, 0x80, 0x4b, 0x42, 0x68, 0x1b, 0x18, 0xc7, + 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x63, 0x20, 0x00, + 0x42, 0x80, 0xd0, 0x20, 0x21, 0x00, 0x29, 0x20, + 0xdb, 0x04, 0xe0, 0x1b, 0x1c, 0x48, 0x06, 0x01, + 0x0e, 0x09, 0xe7, 0xf8, 0x00, 0x88, 0x4b, 0x3a, + 0x58, 0x18, 0x90, 0x01, 0x98, 0x01, 0x79, 0xc0, + 0x42, 0xa0, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0x88, + 0x43, 0xc0, 0x4b, 0x36, 0x68, 0x1b, 0x40, 0x18, + 0x4b, 0x34, 0x60, 0x18, 0x23, 0x00, 0x00, 0x88, + 0x4e, 0x31, 0x50, 0x33, 0x23, 0xff, 0x48, 0x32, + 0x54, 0x43, 0xe7, 0xe3, 0xe0, 0x3f, 0x7e, 0x38, + 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x10, 0x20, 0xff, + 0x4b, 0x2e, 0x54, 0x98, 0x23, 0x00, 0x00, 0x90, + 0x4e, 0x2d, 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, + 0x43, 0xc0, 0x4b, 0x2c, 0x88, 0x1b, 0x40, 0x18, + 0x4b, 0x2a, 0x80, 0x18, 0x20, 0xff, 0x76, 0x38, + 0x7e, 0x78, 0x1c, 0x02, 0x28, 0xff, 0xd0, 0x11, + 0x20, 0xff, 0x4b, 0x24, 0x54, 0x98, 0x23, 0x00, + 0x00, 0x90, 0x4e, 0x23, 0x50, 0x33, 0x20, 0x01, + 0x40, 0x90, 0x43, 0xc0, 0x4b, 0x21, 0x88, 0x1b, + 0x40, 0x18, 0x4b, 0x20, 0x80, 0x18, 0x20, 0xff, + 0x76, 0x78, 0xe0, 0x02, 0x20, 0xb1, 0xb0, 0x03, + 0xe7, 0x98, 0x23, 0x00, 0x00, 0x90, 0x4e, 0x1a, 0x50, 0x33, 0x20, 0x01, 0x40, 0x90, 0x43, 0xc0, - 0x4b, 0x21, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x20, - 0x80, 0x18, 0x20, 0xff, 0x76, 0x78, 0xe0, 0x02, - 0x20, 0xb1, 0xb0, 0x03, 0xe7, 0x98, 0x23, 0x00, - 0x00, 0x90, 0x4e, 0x1a, 0x50, 0x33, 0x20, 0x01, - 0x40, 0x90, 0x43, 0xc0, 0x4b, 0x18, 0x88, 0x1b, - 0x40, 0x18, 0x4b, 0x17, 0x80, 0x18, 0x4e, 0x17, - 0x96, 0x00, 0x20, 0x00, 0x00, 0x93, 0x9e, 0x00, - 0x50, 0xf0, 0x98, 0x02, 0x23, 0x20, 0x40, 0x18, - 0xd0, 0xff, 0x21, 0x00, 0x29, 0x0c, 0xdb, 0x04, - 0xe0, 0x07, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, - 0xe7, 0xf8, 0x20, 0x00, 0x18, 0x7b, 0x73, 0x18, - 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, 0x20, 0x00, - 0x70, 0xf8, 0x20, 0x00, 0xb0, 0x03, 0xe7, 0x6f, - 0xb0, 0x03, 0xe7, 0x6d, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x5d, 0xcc, 0x2e, 0x08, 0x5e, 0xec, - 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xac, - 0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, - 0x2e, 0x08, 0x5e, 0xe8, 0x9e, 0x00, 0x04, 0xb8, - 0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, - 0x20, 0x1d, 0x02, 0x80, 0x69, 0x86, 0x1c, 0x3a, - 0x1c, 0x29, 0x1c, 0x20, 0xf0, 0x08, 0xfb, 0x32, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb4, 0xf0, - 0x1c, 0x01, 0xb0, 0x82, 0x68, 0x48, 0x68, 0x8c, - 0x1d, 0xe2, 0x32, 0xb7, 0x42, 0x82, 0xd9, 0x09, - 0x78, 0x42, 0x07, 0x12, 0x0f, 0x12, 0x02, 0x12, - 0x78, 0x83, 0x43, 0x1a, 0x32, 0x03, 0x04, 0x17, - 0x0c, 0x3f, 0xe0, 0x41, 0xb0, 0x82, 0x68, 0x23, - 0x93, 0x01, 0x9b, 0x01, 0x33, 0x04, 0x93, 0x00, - 0x9b, 0x00, 0x78, 0x9b, 0x9e, 0x01, 0x19, 0x9a, - 0x78, 0x4e, 0x00, 0xf3, 0x1b, 0x9b, 0x00, 0x9b, - 0x4e, 0x1b, 0x68, 0x36, 0x19, 0x9b, 0x93, 0x02, - 0x9b, 0x02, 0x78, 0x9d, 0x06, 0xed, 0x0e, 0xed, - 0x2d, 0x12, 0xd1, 0x0f, 0x1d, 0xe3, 0x33, 0xb9, - 0x68, 0x4e, 0x1b, 0x9b, 0x06, 0x1b, 0x0e, 0x1b, - 0x93, 0x03, 0x9b, 0x00, 0x78, 0xde, 0x23, 0x80, - 0x40, 0x33, 0xd1, 0x03, 0x9b, 0x03, 0x2b, 0x0e, - 0xda, 0x00, 0x3a, 0x01, 0x1d, 0xe3, 0x33, 0xb8, - 0x42, 0x83, 0xd9, 0x0b, 0x78, 0x43, 0x07, 0x1b, - 0x0f, 0x1b, 0x02, 0x1b, 0x04, 0x1f, 0x0c, 0x3f, - 0x78, 0x13, 0x18, 0xfb, 0x33, 0x03, 0x04, 0x1f, - 0x0c, 0x3f, 0xe0, 0x08, 0x78, 0x13, 0x07, 0x1b, - 0x0f, 0x1b, 0x02, 0x1b, 0x78, 0x56, 0x43, 0x33, - 0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xb0, 0x02, - 0x80, 0x4f, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, - 0x2e, 0x08, 0x5d, 0xcc, 0xb5, 0xf3, 0xb0, 0x81, - 0x99, 0x02, 0x06, 0x0b, 0x0e, 0x1b, 0x93, 0x00, - 0x9b, 0x00, 0x2b, 0x00, 0xd1, 0x0a, 0x49, 0x24, - 0x4b, 0x24, 0x69, 0x1b, 0x1c, 0x18, 0x4b, 0x23, - 0x69, 0x5b, 0x1c, 0x1c, 0x4b, 0x21, 0x6a, 0x1b, - 0x1e, 0x5a, 0xe0, 0x09, 0x49, 0x20, 0x4b, 0x1f, - 0x69, 0x9b, 0x1c, 0x18, 0x4b, 0x1d, 0x69, 0xdb, - 0x1c, 0x1c, 0x4b, 0x1c, 0x6a, 0x5b, 0x1e, 0x5a, - 0x9b, 0x01, 0x78, 0xdd, 0x26, 0x01, 0x40, 0xae, - 0x1c, 0x37, 0x42, 0xa0, 0xd0, 0x26, 0x00, 0x83, + 0x4b, 0x18, 0x88, 0x1b, 0x40, 0x18, 0x4b, 0x17, + 0x80, 0x18, 0x4e, 0x17, 0x96, 0x00, 0x20, 0x00, + 0x00, 0x93, 0x9e, 0x00, 0x50, 0xf0, 0x98, 0x02, + 0x23, 0x20, 0x40, 0x18, 0xd0, 0xff, 0x21, 0x00, + 0x29, 0x0c, 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x00, + 0x18, 0x7b, 0x73, 0x18, 0xe7, 0xf7, 0x20, 0x00, + 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, 0x20, 0x00, + 0xb0, 0x03, 0xe7, 0x6f, 0xb0, 0x03, 0xe7, 0x6d, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xc4, + 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xdc, + 0x2e, 0x08, 0x5f, 0xa4, 0x2e, 0x08, 0x5f, 0xc4, + 0x2e, 0x08, 0x5f, 0x64, 0x2e, 0x08, 0x5e, 0xe0, + 0x9e, 0x00, 0x04, 0xb8, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x20, 0x1d, 0x02, 0x80, + 0x69, 0x86, 0x1c, 0x3a, 0x1c, 0x29, 0x1c, 0x20, + 0xf0, 0x08, 0xfb, 0x32, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x82, + 0x68, 0x48, 0x68, 0x8c, 0x1d, 0xe2, 0x32, 0xb7, + 0x42, 0x82, 0xd9, 0x09, 0x78, 0x42, 0x07, 0x12, + 0x0f, 0x12, 0x02, 0x12, 0x78, 0x83, 0x43, 0x1a, + 0x32, 0x03, 0x04, 0x17, 0x0c, 0x3f, 0xe0, 0x41, + 0xb0, 0x82, 0x68, 0x23, 0x93, 0x01, 0x9b, 0x01, + 0x33, 0x04, 0x93, 0x00, 0x9b, 0x00, 0x78, 0x9b, + 0x9e, 0x01, 0x19, 0x9a, 0x78, 0x4e, 0x00, 0xf3, + 0x1b, 0x9b, 0x00, 0x9b, 0x4e, 0x1b, 0x68, 0x36, + 0x19, 0x9b, 0x93, 0x02, 0x9b, 0x02, 0x78, 0x9d, + 0x06, 0xed, 0x0e, 0xed, 0x2d, 0x12, 0xd1, 0x0f, + 0x1d, 0xe3, 0x33, 0xb9, 0x68, 0x4e, 0x1b, 0x9b, + 0x06, 0x1b, 0x0e, 0x1b, 0x93, 0x03, 0x9b, 0x00, + 0x78, 0xde, 0x23, 0x80, 0x40, 0x33, 0xd1, 0x03, + 0x9b, 0x03, 0x2b, 0x0e, 0xda, 0x00, 0x3a, 0x01, + 0x1d, 0xe3, 0x33, 0xb8, 0x42, 0x83, 0xd9, 0x0b, + 0x78, 0x43, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, + 0x04, 0x1f, 0x0c, 0x3f, 0x78, 0x13, 0x18, 0xfb, + 0x33, 0x03, 0x04, 0x1f, 0x0c, 0x3f, 0xe0, 0x08, + 0x78, 0x13, 0x07, 0x1b, 0x0f, 0x1b, 0x02, 0x1b, + 0x78, 0x56, 0x43, 0x33, 0x33, 0x03, 0x04, 0x1f, + 0x0c, 0x3f, 0xb0, 0x02, 0x80, 0x4f, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x2e, 0x08, 0x5d, 0xc4, + 0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x0b, + 0x0e, 0x1b, 0x93, 0x00, 0x9b, 0x00, 0x2b, 0x00, + 0xd1, 0x0a, 0x49, 0x24, 0x4b, 0x24, 0x69, 0x1b, + 0x1c, 0x18, 0x4b, 0x23, 0x69, 0x5b, 0x1c, 0x1c, + 0x4b, 0x21, 0x6a, 0x1b, 0x1e, 0x5a, 0xe0, 0x09, + 0x49, 0x20, 0x4b, 0x1f, 0x69, 0x9b, 0x1c, 0x18, + 0x4b, 0x1d, 0x69, 0xdb, 0x1c, 0x1c, 0x4b, 0x1c, + 0x6a, 0x5b, 0x1e, 0x5a, 0x9b, 0x01, 0x78, 0xdd, + 0x26, 0x01, 0x40, 0xae, 0x1c, 0x37, 0x42, 0xa0, + 0xd0, 0x26, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x40, 0x3b, + 0xd0, 0x1b, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x43, 0xbb, + 0x1c, 0x1d, 0x00, 0x83, 0x18, 0x5e, 0x23, 0x01, + 0x02, 0x9b, 0x18, 0xf3, 0x60, 0x1d, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, - 0x68, 0x1b, 0x40, 0x3b, 0xd0, 0x1b, 0x00, 0x83, - 0x18, 0x5d, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xeb, - 0x68, 0x1b, 0x43, 0xbb, 0x1c, 0x1d, 0x00, 0x83, - 0x18, 0x5e, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xf3, - 0x60, 0x1d, 0x00, 0x83, 0x18, 0x5d, 0x23, 0x01, - 0x02, 0x9b, 0x18, 0xeb, 0x68, 0x1b, 0x2b, 0x00, - 0xd1, 0x05, 0x25, 0x00, 0x18, 0x0e, 0x23, 0x01, - 0x02, 0xdb, 0x18, 0xf3, 0x70, 0x1d, 0x30, 0x01, - 0x40, 0x10, 0xe7, 0xd6, 0xb0, 0x01, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x60, 0x98, 0x9e, 0x00, 0x04, 0x80, - 0x2e, 0x08, 0x69, 0x98, 0xb4, 0x90, 0x1c, 0x03, - 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x21, 0x0e, 0x09, - 0x06, 0x38, 0x0e, 0x00, 0x72, 0x19, 0x28, 0x00, - 0xd0, 0x00, 0x75, 0x58, 0x68, 0x5b, 0x2b, 0x00, - 0xd1, 0xf8, 0xbc, 0x90, 0x47, 0x70, 0x00, 0x00, - 0xb5, 0x80, 0x1c, 0x07, 0x68, 0xf8, 0x28, 0x1f, - 0xd9, 0x03, 0x20, 0xe1, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x48, 0x1e, 0x6d, 0x00, 0x68, 0x00, - 0x4b, 0x1d, 0x40, 0x18, 0x49, 0x1b, 0x6d, 0x09, - 0x60, 0x08, 0x05, 0x80, 0x48, 0x19, 0x6d, 0x00, - 0x68, 0x00, 0x49, 0x18, 0x6e, 0xc9, 0x60, 0x08, - 0x48, 0x16, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, - 0x02, 0x5b, 0x43, 0x18, 0x49, 0x13, 0x6d, 0x09, - 0x60, 0x08, 0x05, 0x80, 0x48, 0x11, 0x6d, 0x00, - 0x68, 0x00, 0x49, 0x10, 0x6e, 0xc9, 0x60, 0x08, - 0x48, 0x0e, 0x6f, 0xc1, 0xcf, 0x09, 0xc1, 0x09, - 0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x08, 0xc1, 0x08, - 0xf0, 0x00, 0xfc, 0x1e, 0x20, 0x00, 0x49, 0x09, - 0x60, 0x08, 0x20, 0x00, 0x49, 0x07, 0x60, 0x48, - 0x20, 0x00, 0x49, 0x06, 0x60, 0x88, 0x49, 0x07, - 0x20, 0x0b, 0xf0, 0x0c, 0xf9, 0x93, 0x20, 0xff, - 0x30, 0x01, 0x49, 0x02, 0x61, 0xc8, 0x20, 0x00, - 0xe7, 0xc0, 0xe7, 0xbf, 0x2e, 0x08, 0x1f, 0x24, - 0xff, 0xff, 0xfd, 0xff, 0x2e, 0x01, 0x01, 0xf9, - 0x1c, 0x01, 0x48, 0x0e, 0x6f, 0x00, 0x68, 0x00, - 0x60, 0x08, 0x48, 0x0c, 0x6e, 0x80, 0x68, 0x00, - 0x60, 0x48, 0x48, 0x0a, 0x6e, 0xc0, 0x68, 0x00, - 0x60, 0x88, 0x48, 0x08, 0x6f, 0x40, 0x68, 0x00, - 0x60, 0xc8, 0x48, 0x06, 0x68, 0x00, 0x61, 0x08, - 0x48, 0x04, 0x68, 0x40, 0x61, 0x48, 0x48, 0x03, - 0x68, 0x80, 0x61, 0x88, 0x20, 0x00, 0x47, 0x70, - 0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x24, - 0x48, 0x03, 0x6e, 0x80, 0x68, 0x00, 0x07, 0x40, - 0x0f, 0xc0, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, - 0x2e, 0x08, 0x1f, 0x24, 0xb4, 0x80, 0x1c, 0x07, - 0x1c, 0x0a, 0x48, 0x37, 0x69, 0xc0, 0x23, 0xff, - 0x33, 0x01, 0x42, 0x98, 0xd0, 0x02, 0x20, 0xe0, - 0xbc, 0x80, 0x47, 0x70, 0x48, 0x32, 0x62, 0x07, - 0x20, 0x00, 0x49, 0x31, 0x62, 0x48, 0x48, 0x31, - 0x60, 0x02, 0x48, 0x30, 0x68, 0x00, 0x78, 0x00, - 0x49, 0x2d, 0x61, 0x88, 0x48, 0x2d, 0x68, 0x00, - 0x7a, 0x00, 0x49, 0x2b, 0x61, 0x08, 0x48, 0x2b, - 0x68, 0x00, 0x68, 0x40, 0x49, 0x28, 0x60, 0xc8, - 0x48, 0x27, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, - 0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01, - 0x02, 0x40, 0x49, 0x23, 0x61, 0xc8, 0x48, 0x22, - 0x68, 0x40, 0x30, 0x01, 0x49, 0x20, 0x60, 0x48, - 0x48, 0x1f, 0x6d, 0x40, 0x68, 0x00, 0x0a, 0x00, - 0x02, 0x00, 0x49, 0x1d, 0x69, 0x89, 0x08, 0x49, - 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, 0x49, 0x1a, - 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, 0x48, 0x18, - 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19, 0x40, 0x18, - 0x49, 0x15, 0x69, 0x89, 0x07, 0xc9, 0x0c, 0x49, - 0x43, 0x08, 0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, - 0x04, 0x40, 0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, - 0x4b, 0x13, 0x40, 0x18, 0x49, 0x0e, 0x6d, 0x09, - 0x60, 0x08, 0x05, 0x40, 0x48, 0x0c, 0x6d, 0x00, - 0x68, 0x00, 0x23, 0x01, 0x03, 0x1b, 0x43, 0x18, - 0x49, 0x09, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, - 0x48, 0x07, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x06, - 0x6f, 0x09, 0x60, 0x08, 0x48, 0x04, 0x6d, 0x00, - 0x68, 0x00, 0x49, 0x03, 0x6e, 0xc9, 0x60, 0x08, - 0x20, 0x00, 0xe7, 0x99, 0xe7, 0x98, 0x00, 0x00, - 0x2e, 0x08, 0x1f, 0x24, 0x2e, 0x08, 0x60, 0x5c, - 0x00, 0x00, 0x02, 0x01, 0xff, 0xff, 0xbf, 0xff, - 0xff, 0xff, 0xfb, 0xff, 0xb5, 0x00, 0x48, 0xf6, - 0x6e, 0x80, 0x68, 0x00, 0x23, 0x08, 0x40, 0x18, - 0xd0, 0x74, 0x48, 0xf3, 0x6d, 0x00, 0x68, 0x00, - 0x4b, 0xf2, 0x40, 0x18, 0x49, 0xf0, 0x6d, 0x09, - 0x60, 0x08, 0x04, 0x80, 0x48, 0xee, 0x6e, 0x40, - 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0xec, - 0x6e, 0x49, 0x60, 0x08, 0x06, 0x00, 0x48, 0xea, - 0x6e, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0xdb, - 0x40, 0x18, 0xd0, 0x3e, 0x20, 0xff, 0x30, 0x01, - 0x49, 0xe5, 0x61, 0xc8, 0x48, 0xe4, 0x6d, 0x00, - 0x68, 0x00, 0x4b, 0xe5, 0x40, 0x18, 0x49, 0xe2, - 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x48, 0xe0, + 0x68, 0x1b, 0x2b, 0x00, 0xd1, 0x05, 0x25, 0x00, + 0x18, 0x0e, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xf3, + 0x70, 0x1d, 0x30, 0x01, 0x40, 0x10, 0xe7, 0xd6, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x90, + 0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0x69, 0x90, + 0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, + 0x06, 0x21, 0x0e, 0x09, 0x06, 0x38, 0x0e, 0x00, + 0x72, 0x19, 0x28, 0x00, 0xd0, 0x00, 0x75, 0x58, + 0x68, 0x5b, 0x2b, 0x00, 0xd1, 0xf8, 0xbc, 0x90, + 0x47, 0x70, 0x00, 0x00, 0xb5, 0x80, 0x1c, 0x07, + 0x68, 0xf8, 0x28, 0x1f, 0xd9, 0x03, 0x20, 0xe1, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1e, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, + 0x49, 0x1b, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x19, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x18, + 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x16, 0x6d, 0x00, + 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, + 0x49, 0x13, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x11, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x10, + 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x0e, 0x6f, 0xc1, + 0xcf, 0x09, 0xc1, 0x09, 0xcf, 0x09, 0xc1, 0x09, + 0xcf, 0x08, 0xc1, 0x08, 0xf0, 0x00, 0xfc, 0x1e, + 0x20, 0x00, 0x49, 0x09, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x07, 0x60, 0x48, 0x20, 0x00, 0x49, 0x06, + 0x60, 0x88, 0x49, 0x07, 0x20, 0x0b, 0xf0, 0x0c, + 0xf9, 0xb5, 0x20, 0xff, 0x30, 0x01, 0x49, 0x02, + 0x61, 0xc8, 0x20, 0x00, 0xe7, 0xc0, 0xe7, 0xbf, + 0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xfd, 0xff, + 0x2e, 0x01, 0x09, 0x15, 0x1c, 0x01, 0x48, 0x0e, + 0x6f, 0x00, 0x68, 0x00, 0x60, 0x08, 0x48, 0x0c, + 0x6e, 0x80, 0x68, 0x00, 0x60, 0x48, 0x48, 0x0a, + 0x6e, 0xc0, 0x68, 0x00, 0x60, 0x88, 0x48, 0x08, + 0x6f, 0x40, 0x68, 0x00, 0x60, 0xc8, 0x48, 0x06, + 0x68, 0x00, 0x61, 0x08, 0x48, 0x04, 0x68, 0x40, + 0x61, 0x48, 0x48, 0x03, 0x68, 0x80, 0x61, 0x88, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0x1c, 0x48, 0x03, 0x6e, 0x80, + 0x68, 0x00, 0x07, 0x40, 0x0f, 0xc0, 0x47, 0x70, + 0xe7, 0xfd, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x48, 0x37, + 0x69, 0xc0, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x02, 0x20, 0xe0, 0xbc, 0x80, 0x47, 0x70, + 0x48, 0x32, 0x62, 0x07, 0x20, 0x00, 0x49, 0x31, + 0x62, 0x48, 0x48, 0x31, 0x60, 0x02, 0x48, 0x30, + 0x68, 0x00, 0x78, 0x00, 0x49, 0x2d, 0x61, 0x88, + 0x48, 0x2d, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x2b, + 0x61, 0x08, 0x48, 0x2b, 0x68, 0x00, 0x68, 0x40, + 0x49, 0x28, 0x60, 0xc8, 0x48, 0x27, 0x69, 0x80, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27, + 0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x23, + 0x61, 0xc8, 0x48, 0x22, 0x68, 0x40, 0x30, 0x01, + 0x49, 0x20, 0x60, 0x48, 0x48, 0x1f, 0x6d, 0x40, + 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x1d, + 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, + 0x43, 0x08, 0x49, 0x1a, 0x6d, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0x18, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x19, 0x40, 0x18, 0x49, 0x15, 0x69, 0x89, + 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x13, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0x48, 0x11, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x13, 0x40, 0x18, + 0x49, 0x0e, 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, + 0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x1b, 0x43, 0x18, 0x49, 0x09, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0xc0, 0x48, 0x07, 0x6d, 0x40, + 0x68, 0x00, 0x49, 0x06, 0x6f, 0x09, 0x60, 0x08, + 0x48, 0x04, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x03, + 0x6e, 0xc9, 0x60, 0x08, 0x20, 0x00, 0xe7, 0x99, + 0xe7, 0x98, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x1c, + 0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x01, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xff, + 0xb5, 0x00, 0x48, 0xf6, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x08, 0x40, 0x18, 0xd0, 0x74, 0x48, 0xf3, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xf2, 0x40, 0x18, + 0x49, 0xf0, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, + 0x48, 0xee, 0x6e, 0x40, 0x68, 0x00, 0x0a, 0x00, + 0x02, 0x00, 0x49, 0xec, 0x6e, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0xea, 0x6e, 0xc0, 0x68, 0x00, + 0x23, 0x01, 0x02, 0xdb, 0x40, 0x18, 0xd0, 0x3e, + 0x20, 0xff, 0x30, 0x01, 0x49, 0xe5, 0x61, 0xc8, + 0x48, 0xe4, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xe5, + 0x40, 0x18, 0x49, 0xe2, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0x48, 0xe0, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xdd, + 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, + 0x48, 0xdd, 0x68, 0x00, 0x7a, 0x00, 0x49, 0xd9, + 0x69, 0x09, 0x1a, 0x41, 0x48, 0xd7, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x02, 0x4b, 0xd9, 0x40, 0x1a, + 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, + 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0xd1, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0x07, 0x48, 0x48, 0xcd, + 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x0c, 0xf8, 0x96, 0x48, 0xc9, 0x68, 0x00, + 0x30, 0x01, 0x49, 0xc8, 0x60, 0x08, 0x48, 0xc7, + 0x69, 0xc0, 0x4b, 0xcb, 0x42, 0x98, 0xd0, 0x73, + 0xdc, 0x08, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xd0, 0x6f, 0x23, 0x01, 0x02, 0x5b, 0x42, 0x98, + 0xd0, 0x07, 0xe2, 0xba, 0x4b, 0xc5, 0x42, 0x98, + 0xd0, 0x68, 0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x66, + 0xe2, 0xb3, 0x48, 0xbc, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xe0, 0x00, + 0xe2, 0xcd, 0xd0, 0x3f, 0x48, 0xb7, 0x68, 0x00, + 0x30, 0x01, 0x49, 0xb6, 0x60, 0x08, 0x48, 0xb5, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0xb5, 0x40, 0x18, + 0x49, 0xb2, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, + 0x20, 0xff, 0x30, 0x01, 0x49, 0xaf, 0x61, 0xc8, + 0x48, 0xae, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x02, 0x09, 0x0a, 0x09, 0x4a, 0xab, 0x6a, 0x52, + 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0xac, + 0x68, 0x00, 0x7a, 0x00, 0x49, 0xa7, 0x69, 0x09, + 0x1a, 0x41, 0x48, 0xa6, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x02, 0x4b, 0xa8, 0x40, 0x1a, 0x04, 0x09, + 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, + 0x02, 0x08, 0x0c, 0x00, 0x48, 0x9f, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, + 0x60, 0x01, 0x07, 0x88, 0x48, 0x9b, 0x6f, 0xc0, + 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0c, + 0xf8, 0x33, 0xe0, 0x5e, 0x48, 0x97, 0x69, 0x00, + 0x28, 0x00, 0xd0, 0x20, 0x48, 0x95, 0x69, 0x00, + 0x38, 0x01, 0x49, 0x94, 0x61, 0x08, 0x48, 0x93, + 0x68, 0xc0, 0x78, 0x00, 0x49, 0x91, 0x6c, 0x89, + 0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08, + 0x49, 0x8e, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00, + 0x0e, 0x00, 0x48, 0x8c, 0x68, 0xc0, 0xe0, 0x03, + 0xe1, 0x4b, 0xe2, 0x4d, 0xe0, 0x42, 0xe1, 0x93, + 0x30, 0x01, 0x49, 0x88, 0x60, 0xc8, 0x48, 0x8d, + 0x49, 0x86, 0x61, 0xc8, 0xe0, 0x39, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x84, 0x61, 0xc8, 0x48, 0x83, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x80, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x80, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x7c, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x7a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, + 0x4b, 0x7c, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, + 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, + 0x0c, 0x00, 0x48, 0x74, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, + 0x07, 0xc8, 0x48, 0x70, 0x6f, 0xc0, 0x68, 0xc1, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0xdc, + 0x48, 0x6c, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x6d, + 0x40, 0x18, 0x49, 0x6a, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0xe2, 0x08, 0x48, 0x67, 0x69, 0x00, + 0x28, 0x00, 0xd0, 0x5f, 0x48, 0x65, 0x6e, 0x80, + 0x68, 0x00, 0x23, 0xff, 0x33, 0x01, 0x40, 0x18, + 0xd0, 0x3f, 0x48, 0x62, 0x68, 0x00, 0x30, 0x01, + 0x49, 0x60, 0x60, 0x08, 0x48, 0x5f, 0x6d, 0x00, + 0x68, 0x00, 0x4b, 0x60, 0x40, 0x18, 0x49, 0x5d, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x5a, 0x61, 0xc8, 0x48, 0x59, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, - 0x0a, 0x09, 0x4a, 0xdd, 0x6a, 0x52, 0x06, 0x12, - 0x43, 0x11, 0x60, 0x01, 0x48, 0xdd, 0x68, 0x00, - 0x7a, 0x00, 0x49, 0xd9, 0x69, 0x09, 0x1a, 0x41, - 0x48, 0xd7, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, - 0x4b, 0xd9, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, + 0x0a, 0x09, 0x4a, 0x56, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x56, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x52, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x50, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, + 0x4b, 0x52, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, - 0x0c, 0x00, 0x48, 0xd1, 0x6f, 0xc0, 0x68, 0x80, - 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, - 0x07, 0x48, 0x48, 0xcd, 0x6f, 0xc0, 0x68, 0xc1, - 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0c, 0xf8, 0x74, - 0x48, 0xc9, 0x68, 0x00, 0x30, 0x01, 0x49, 0xc8, - 0x60, 0x08, 0x48, 0xc7, 0x69, 0xc0, 0x4b, 0xcb, - 0x42, 0x98, 0xd0, 0x73, 0xdc, 0x08, 0x23, 0xff, - 0x33, 0x01, 0x42, 0x98, 0xd0, 0x6f, 0x23, 0x01, - 0x02, 0x5b, 0x42, 0x98, 0xd0, 0x07, 0xe2, 0xba, - 0x4b, 0xc5, 0x42, 0x98, 0xd0, 0x68, 0x4b, 0xc5, - 0x42, 0x98, 0xd0, 0x66, 0xe2, 0xb3, 0x48, 0xbc, - 0x6e, 0x80, 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, - 0x40, 0x18, 0xe0, 0x00, 0xe2, 0xcd, 0xd0, 0x3f, - 0x48, 0xb7, 0x68, 0x00, 0x30, 0x01, 0x49, 0xb6, - 0x60, 0x08, 0x48, 0xb5, 0x6d, 0x00, 0x68, 0x00, - 0x4b, 0xb5, 0x40, 0x18, 0x49, 0xb2, 0x6d, 0x09, + 0x0c, 0x00, 0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, + 0x07, 0x88, 0x48, 0x46, 0x6f, 0xc0, 0x68, 0xc1, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xff, 0x88, + 0xe0, 0x17, 0x48, 0x42, 0x68, 0xc0, 0x78, 0x00, + 0x49, 0x40, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09, + 0x02, 0x09, 0x43, 0x08, 0x49, 0x3d, 0x6c, 0x89, + 0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x3b, + 0x68, 0xc0, 0x30, 0x01, 0x49, 0x39, 0x60, 0xc8, + 0x48, 0x38, 0x69, 0x00, 0x38, 0x01, 0x49, 0x37, + 0x61, 0x08, 0xe0, 0xa1, 0x48, 0x35, 0x6a, 0x00, + 0x38, 0x01, 0x49, 0x34, 0x62, 0x08, 0x48, 0x33, + 0x6a, 0x00, 0x28, 0x00, 0xd0, 0x4b, 0x48, 0x31, + 0x6a, 0x40, 0x30, 0x01, 0x49, 0x2f, 0x62, 0x48, + 0x48, 0x31, 0x68, 0x00, 0x30, 0x0c, 0x49, 0x30, + 0x60, 0x08, 0x48, 0x2f, 0x68, 0x00, 0x78, 0x00, + 0x49, 0x2a, 0x61, 0x88, 0x48, 0x2c, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x28, 0x61, 0x08, 0x48, 0x2a, + 0x68, 0x00, 0x68, 0x40, 0x49, 0x25, 0x60, 0xc8, + 0x48, 0x24, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x01, 0x48, 0x27, 0xe0, 0x01, 0x20, 0x01, + 0x02, 0x40, 0x49, 0x20, 0x61, 0xc8, 0x48, 0x1f, + 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, + 0x43, 0x18, 0x49, 0x1c, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0x80, 0x48, 0x1a, 0x6d, 0x40, 0x68, 0x00, + 0x0a, 0x00, 0x02, 0x00, 0x49, 0x17, 0x69, 0x89, + 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, + 0x49, 0x14, 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, + 0x48, 0x12, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x19, + 0x40, 0x18, 0x49, 0x10, 0x69, 0x89, 0x07, 0xc9, + 0x0c, 0x49, 0x43, 0x08, 0x49, 0x0d, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0x40, 0xe0, 0x4c, 0x20, 0xff, + 0x30, 0x01, 0x49, 0x0a, 0x61, 0xc8, 0x48, 0x09, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, + 0x0a, 0x09, 0x4a, 0x06, 0x6a, 0x52, 0x06, 0x12, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x06, 0x68, 0x00, + 0x7a, 0x00, 0x49, 0x02, 0x69, 0x09, 0x1a, 0x41, + 0x48, 0x00, 0xe0, 0x11, 0x2e, 0x08, 0x1f, 0x1c, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef, 0xff, + 0x2e, 0x08, 0x60, 0x54, 0xff, 0x00, 0x00, 0xff, + 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02, + 0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xbf, 0xff, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0xa5, + 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, + 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, + 0x48, 0xa1, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, + 0x48, 0x9d, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x0b, 0xfe, 0xd5, 0x48, 0x9a, + 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x99, 0x40, 0x18, + 0x49, 0x97, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, + 0xe1, 0x01, 0x48, 0x95, 0x6e, 0x80, 0x68, 0x00, + 0x23, 0x01, 0x02, 0x5b, 0x40, 0x18, 0xd0, 0x3f, + 0x48, 0x91, 0x68, 0x00, 0x30, 0x01, 0x49, 0x90, + 0x60, 0x08, 0x48, 0x8f, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x8e, 0x40, 0x18, 0x49, 0x8c, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x20, 0xff, 0x30, 0x01, - 0x49, 0xaf, 0x61, 0xc8, 0x48, 0xae, 0x6f, 0xc0, + 0x49, 0x89, 0x61, 0xc8, 0x48, 0x88, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, - 0x4a, 0xab, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, - 0x60, 0x01, 0x48, 0xac, 0x68, 0x00, 0x7a, 0x00, - 0x49, 0xa7, 0x69, 0x09, 0x1a, 0x41, 0x48, 0xa6, - 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0xa8, + 0x4a, 0x85, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, + 0x60, 0x01, 0x48, 0x85, 0x68, 0x00, 0x7a, 0x00, + 0x49, 0x81, 0x69, 0x09, 0x1a, 0x41, 0x48, 0x80, + 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, 0x4b, 0x7d, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, - 0x48, 0x9f, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, + 0x48, 0x79, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x07, 0x88, - 0x48, 0x9b, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, - 0x40, 0x88, 0xf0, 0x0c, 0xf8, 0x11, 0xe0, 0x5e, - 0x48, 0x97, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x20, - 0x48, 0x95, 0x69, 0x00, 0x38, 0x01, 0x49, 0x94, - 0x61, 0x08, 0x48, 0x93, 0x68, 0xc0, 0x78, 0x00, - 0x49, 0x91, 0x6c, 0x89, 0x68, 0x09, 0x0a, 0x09, - 0x02, 0x09, 0x43, 0x08, 0x49, 0x8e, 0x6c, 0x89, - 0x60, 0x08, 0x06, 0x00, 0x0e, 0x00, 0x48, 0x8c, - 0x68, 0xc0, 0xe0, 0x03, 0xe1, 0x4b, 0xe2, 0x4d, - 0xe0, 0x42, 0xe1, 0x93, 0x30, 0x01, 0x49, 0x88, - 0x60, 0xc8, 0x48, 0x8d, 0x49, 0x86, 0x61, 0xc8, - 0xe0, 0x39, 0x20, 0xff, 0x30, 0x01, 0x49, 0x84, - 0x61, 0xc8, 0x48, 0x83, 0x6f, 0xc0, 0x68, 0x80, - 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x80, + 0x48, 0x75, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x0b, 0xfe, 0x85, 0xe0, 0x02, + 0x48, 0x74, 0x49, 0x71, 0x61, 0xc8, 0xe0, 0xb6, + 0x48, 0x6f, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x62, + 0x48, 0x6d, 0x6e, 0x00, 0x68, 0x00, 0x49, 0x6c, + 0x68, 0xc9, 0x70, 0x08, 0x48, 0x6a, 0x68, 0xc0, + 0x30, 0x01, 0x49, 0x69, 0x60, 0xc8, 0x48, 0x68, + 0x69, 0x00, 0x38, 0x01, 0x49, 0x66, 0x61, 0x08, + 0x48, 0x65, 0x69, 0x00, 0x28, 0x00, 0xd1, 0x4d, + 0x48, 0x63, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x49, + 0x48, 0x63, 0x68, 0x00, 0x7a, 0x40, 0x49, 0x60, + 0x6d, 0x09, 0x68, 0x09, 0x4b, 0x62, 0x40, 0x19, + 0x07, 0xc0, 0x0d, 0x40, 0x43, 0x08, 0x49, 0x5c, + 0x6d, 0x09, 0x60, 0x08, 0x05, 0x40, 0x0f, 0xc0, + 0x20, 0xff, 0x30, 0x01, 0x49, 0x58, 0x61, 0xc8, + 0x48, 0x57, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x57, + 0x40, 0x18, 0x49, 0x55, 0x6d, 0x09, 0x60, 0x08, + 0x04, 0xc0, 0x48, 0x53, 0x6f, 0xc0, 0x68, 0x80, + 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x50, 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, - 0x48, 0x80, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x7c, - 0x69, 0x09, 0x1a, 0x41, 0x48, 0x7a, 0x6f, 0xc0, - 0x68, 0x80, 0x68, 0x02, 0x4b, 0x7c, 0x40, 0x1a, + 0x48, 0x4f, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x4c, + 0x69, 0x09, 0x1a, 0x41, 0x48, 0x4a, 0x6f, 0xc0, + 0x68, 0x80, 0x68, 0x02, 0x4b, 0x47, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, - 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x74, + 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x44, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x01, - 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 0x48, 0x70, - 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, - 0xf0, 0x0b, 0xff, 0xba, 0x48, 0x6c, 0x6d, 0x00, - 0x68, 0x00, 0x4b, 0x6d, 0x40, 0x18, 0x49, 0x6a, - 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0xe2, 0x08, - 0x48, 0x67, 0x69, 0x00, 0x28, 0x00, 0xd0, 0x5f, - 0x48, 0x65, 0x6e, 0x80, 0x68, 0x00, 0x23, 0xff, - 0x33, 0x01, 0x40, 0x18, 0xd0, 0x3f, 0x48, 0x62, - 0x68, 0x00, 0x30, 0x01, 0x49, 0x60, 0x60, 0x08, - 0x48, 0x5f, 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x60, - 0x40, 0x18, 0x49, 0x5d, 0x6d, 0x09, 0x60, 0x08, - 0x04, 0xc0, 0x20, 0xff, 0x30, 0x01, 0x49, 0x5a, - 0x61, 0xc8, 0x48, 0x59, 0x6f, 0xc0, 0x68, 0x80, - 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x56, - 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, - 0x48, 0x56, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x52, - 0x69, 0x09, 0x1a, 0x41, 0x48, 0x50, 0x6f, 0xc0, - 0x68, 0x80, 0x68, 0x02, 0x4b, 0x52, 0x40, 0x1a, - 0x04, 0x09, 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, - 0x60, 0x01, 0x02, 0x08, 0x0c, 0x00, 0x48, 0x4a, - 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, - 0x43, 0x19, 0x60, 0x01, 0x07, 0x88, 0x48, 0x46, + 0x43, 0x19, 0x60, 0x01, 0x07, 0xc8, 0x48, 0x40, 0x6f, 0xc0, 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, - 0xf0, 0x0b, 0xff, 0x66, 0xe0, 0x17, 0x48, 0x42, - 0x68, 0xc0, 0x78, 0x00, 0x49, 0x40, 0x6c, 0x89, - 0x68, 0x09, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x08, - 0x49, 0x3d, 0x6c, 0x89, 0x60, 0x08, 0x06, 0x00, - 0x0e, 0x00, 0x48, 0x3b, 0x68, 0xc0, 0x30, 0x01, - 0x49, 0x39, 0x60, 0xc8, 0x48, 0x38, 0x69, 0x00, - 0x38, 0x01, 0x49, 0x37, 0x61, 0x08, 0xe0, 0xa1, - 0x48, 0x35, 0x6a, 0x00, 0x38, 0x01, 0x49, 0x34, - 0x62, 0x08, 0x48, 0x33, 0x6a, 0x00, 0x28, 0x00, - 0xd0, 0x4b, 0x48, 0x31, 0x6a, 0x40, 0x30, 0x01, - 0x49, 0x2f, 0x62, 0x48, 0x48, 0x31, 0x68, 0x00, - 0x30, 0x0c, 0x49, 0x30, 0x60, 0x08, 0x48, 0x2f, - 0x68, 0x00, 0x78, 0x00, 0x49, 0x2a, 0x61, 0x88, - 0x48, 0x2c, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x28, - 0x61, 0x08, 0x48, 0x2a, 0x68, 0x00, 0x68, 0x40, - 0x49, 0x25, 0x60, 0xc8, 0x48, 0x24, 0x69, 0x80, - 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x27, - 0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, 0x49, 0x20, - 0x61, 0xc8, 0x48, 0x1f, 0x6d, 0x00, 0x68, 0x00, - 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, 0x49, 0x1c, - 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, 0x48, 0x1a, - 0x6d, 0x40, 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, - 0x49, 0x17, 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, - 0x0e, 0x09, 0x43, 0x08, 0x49, 0x14, 0x6d, 0x49, - 0x60, 0x08, 0x06, 0x00, 0x48, 0x12, 0x6d, 0x00, - 0x68, 0x00, 0x4b, 0x19, 0x40, 0x18, 0x49, 0x10, - 0x69, 0x89, 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, - 0x49, 0x0d, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, - 0xe0, 0x4c, 0x20, 0xff, 0x30, 0x01, 0x49, 0x0a, - 0x61, 0xc8, 0x48, 0x09, 0x6f, 0xc0, 0x68, 0x80, - 0x68, 0x01, 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x06, - 0x6a, 0x52, 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, - 0x48, 0x06, 0x68, 0x00, 0x7a, 0x00, 0x49, 0x02, - 0x69, 0x09, 0x1a, 0x41, 0x48, 0x00, 0xe0, 0x11, - 0x2e, 0x08, 0x1f, 0x24, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xef, 0xff, 0x2e, 0x08, 0x60, 0x5c, - 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x02, 0x01, - 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x03, - 0xff, 0xff, 0xbf, 0xff, 0x6f, 0xc0, 0x68, 0x80, - 0x68, 0x02, 0x4b, 0xa5, 0x40, 0x1a, 0x04, 0x09, - 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, - 0x02, 0x08, 0x0c, 0x00, 0x48, 0xa1, 0x6f, 0xc0, - 0x68, 0x80, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, - 0x60, 0x01, 0x07, 0xc8, 0x48, 0x9d, 0x6f, 0xc0, - 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, - 0xfe, 0xb3, 0x48, 0x9a, 0x6d, 0x00, 0x68, 0x00, - 0x4b, 0x99, 0x40, 0x18, 0x49, 0x97, 0x6d, 0x09, - 0x60, 0x08, 0x04, 0xc0, 0xe1, 0x01, 0x48, 0x95, - 0x6e, 0x80, 0x68, 0x00, 0x23, 0x01, 0x02, 0x5b, - 0x40, 0x18, 0xd0, 0x3f, 0x48, 0x91, 0x68, 0x00, - 0x30, 0x01, 0x49, 0x90, 0x60, 0x08, 0x48, 0x8f, - 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x8e, 0x40, 0x18, - 0x49, 0x8c, 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, - 0x20, 0xff, 0x30, 0x01, 0x49, 0x89, 0x61, 0xc8, - 0x48, 0x88, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, - 0x02, 0x09, 0x0a, 0x09, 0x4a, 0x85, 0x6a, 0x52, - 0x06, 0x12, 0x43, 0x11, 0x60, 0x01, 0x48, 0x85, - 0x68, 0x00, 0x7a, 0x00, 0x49, 0x81, 0x69, 0x09, - 0x1a, 0x41, 0x48, 0x80, 0x6f, 0xc0, 0x68, 0x80, - 0x68, 0x02, 0x4b, 0x7d, 0x40, 0x1a, 0x04, 0x09, - 0x0c, 0x09, 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, - 0x02, 0x08, 0x0c, 0x00, 0x48, 0x79, 0x6f, 0xc0, - 0x68, 0x80, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, - 0x60, 0x01, 0x07, 0x88, 0x48, 0x75, 0x6f, 0xc0, - 0x68, 0xc1, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, - 0xfe, 0x63, 0xe0, 0x02, 0x48, 0x74, 0x49, 0x71, - 0x61, 0xc8, 0xe0, 0xb6, 0x48, 0x6f, 0x69, 0x00, - 0x28, 0x00, 0xd0, 0x62, 0x48, 0x6d, 0x6e, 0x00, - 0x68, 0x00, 0x49, 0x6c, 0x68, 0xc9, 0x70, 0x08, - 0x48, 0x6a, 0x68, 0xc0, 0x30, 0x01, 0x49, 0x69, - 0x60, 0xc8, 0x48, 0x68, 0x69, 0x00, 0x38, 0x01, - 0x49, 0x66, 0x61, 0x08, 0x48, 0x65, 0x69, 0x00, - 0x28, 0x00, 0xd1, 0x4d, 0x48, 0x63, 0x6a, 0x00, - 0x28, 0x01, 0xd1, 0x49, 0x48, 0x63, 0x68, 0x00, - 0x7a, 0x40, 0x49, 0x60, 0x6d, 0x09, 0x68, 0x09, - 0x4b, 0x62, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0x40, - 0x43, 0x08, 0x49, 0x5c, 0x6d, 0x09, 0x60, 0x08, - 0x05, 0x40, 0x0f, 0xc0, 0x20, 0xff, 0x30, 0x01, - 0x49, 0x58, 0x61, 0xc8, 0x48, 0x57, 0x6d, 0x00, - 0x68, 0x00, 0x4b, 0x57, 0x40, 0x18, 0x49, 0x55, - 0x6d, 0x09, 0x60, 0x08, 0x04, 0xc0, 0x48, 0x53, - 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x01, 0x02, 0x09, - 0x0a, 0x09, 0x4a, 0x50, 0x6a, 0x52, 0x06, 0x12, - 0x43, 0x11, 0x60, 0x01, 0x48, 0x4f, 0x68, 0x00, - 0x7a, 0x00, 0x49, 0x4c, 0x69, 0x09, 0x1a, 0x41, - 0x48, 0x4a, 0x6f, 0xc0, 0x68, 0x80, 0x68, 0x02, - 0x4b, 0x47, 0x40, 0x1a, 0x04, 0x09, 0x0c, 0x09, - 0x02, 0x09, 0x43, 0x11, 0x60, 0x01, 0x02, 0x08, - 0x0c, 0x00, 0x48, 0x44, 0x6f, 0xc0, 0x68, 0x80, - 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, - 0x07, 0xc8, 0x48, 0x40, 0x6f, 0xc0, 0x68, 0xc1, - 0x20, 0x01, 0x40, 0x88, 0xf0, 0x0b, 0xfd, 0xf8, - 0xe0, 0x4f, 0x48, 0x3c, 0x6a, 0x00, 0x38, 0x01, - 0x49, 0x3a, 0x62, 0x08, 0x48, 0x39, 0x6a, 0x40, - 0x30, 0x01, 0x49, 0x38, 0x62, 0x48, 0x48, 0x39, - 0x68, 0x00, 0x30, 0x0c, 0x49, 0x37, 0x60, 0x08, - 0x48, 0x36, 0x68, 0x00, 0x78, 0x00, 0x49, 0x33, - 0x61, 0x88, 0x48, 0x34, 0x68, 0x00, 0x7a, 0x00, - 0x49, 0x30, 0x61, 0x08, 0x48, 0x31, 0x68, 0x00, - 0x68, 0x40, 0x49, 0x2e, 0x60, 0xc8, 0x48, 0x2d, - 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, - 0x48, 0x2f, 0xe0, 0x01, 0x20, 0x01, 0x02, 0x40, - 0x49, 0x28, 0x61, 0xc8, 0x48, 0x27, 0x6d, 0x00, - 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, - 0x49, 0x24, 0x6d, 0x09, 0x60, 0x08, 0x04, 0x80, - 0x48, 0x22, 0x6d, 0x40, 0x68, 0x00, 0x0a, 0x00, - 0x02, 0x00, 0x49, 0x20, 0x69, 0x89, 0x08, 0x49, - 0x06, 0x09, 0x0e, 0x09, 0x43, 0x08, 0x49, 0x1d, - 0x6d, 0x49, 0x60, 0x08, 0x06, 0x00, 0x48, 0x1b, - 0x6d, 0x00, 0x68, 0x00, 0x4b, 0x1f, 0x40, 0x18, - 0x49, 0x18, 0x69, 0x89, 0x07, 0xc9, 0x0c, 0x49, - 0x43, 0x08, 0x49, 0x16, 0x6d, 0x09, 0x60, 0x08, - 0x04, 0x40, 0xe0, 0x01, 0xe0, 0x00, 0xe7, 0xff, - 0x48, 0x12, 0x6c, 0x80, 0x68, 0x00, 0x49, 0x11, - 0x6e, 0x49, 0x60, 0x08, 0x48, 0x0f, 0x6d, 0x40, - 0x68, 0x00, 0x49, 0x0e, 0x6f, 0x09, 0x60, 0x08, - 0x48, 0x0c, 0x6d, 0x00, 0x68, 0x00, 0x49, 0x0b, - 0x6e, 0xc9, 0x60, 0x08, 0x48, 0x09, 0x6c, 0xc0, - 0x68, 0x00, 0x23, 0x08, 0x43, 0x18, 0x49, 0x07, - 0x6c, 0xc9, 0x60, 0x08, 0x07, 0x00, 0x48, 0x05, - 0x6c, 0xc0, 0x68, 0x00, 0x49, 0x03, 0x6e, 0x89, - 0x60, 0x08, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0xff, 0x00, 0x00, 0xff, 0x2e, 0x08, 0x1f, 0x24, - 0xff, 0xff, 0xef, 0xff, 0x2e, 0x08, 0x60, 0x5c, - 0x00, 0x00, 0x02, 0x03, 0xff, 0xff, 0xfb, 0xff, - 0x00, 0x00, 0x02, 0x01, 0xff, 0xff, 0xbf, 0xff, - 0xb4, 0x80, 0x49, 0x2e, 0x20, 0x00, 0x28, 0x08, - 0xd3, 0x04, 0xe0, 0x06, 0x1c, 0x42, 0x06, 0x10, - 0x0e, 0x00, 0xe7, 0xf8, 0x23, 0x00, 0xc1, 0x08, - 0xe7, 0xf8, 0x4a, 0x29, 0x6f, 0xd2, 0x68, 0x12, - 0x4b, 0x27, 0x6d, 0x9b, 0x68, 0x1b, 0x0a, 0x1b, - 0x02, 0x1b, 0x06, 0x12, 0x0e, 0x12, 0x43, 0x1a, - 0x4b, 0x23, 0x6d, 0x9b, 0x60, 0x1a, 0x06, 0x12, - 0x0e, 0x12, 0x4a, 0x21, 0x6f, 0xd2, 0x68, 0x52, - 0x4b, 0x1f, 0x6d, 0x1b, 0x68, 0x1f, 0x23, 0x01, - 0x03, 0xdb, 0x43, 0x9f, 0x1c, 0x3b, 0x07, 0xd2, - 0x0c, 0x12, 0x43, 0x1a, 0x4b, 0x1a, 0x6d, 0x1b, - 0x60, 0x1a, 0x04, 0x12, 0x0f, 0xd2, 0x4a, 0x18, - 0x6f, 0xd2, 0x69, 0x12, 0x4b, 0x16, 0x6d, 0xdb, - 0x68, 0x1b, 0x0c, 0x1b, 0x04, 0x1b, 0x04, 0x12, - 0x0c, 0x12, 0x43, 0x1a, 0x4b, 0x12, 0x6d, 0xdb, - 0x60, 0x1a, 0x04, 0x12, 0x0c, 0x12, 0x4a, 0x10, - 0x6d, 0x12, 0x68, 0x12, 0x23, 0x01, 0x02, 0x5b, - 0x43, 0x1a, 0x4b, 0x0d, 0x6d, 0x1b, 0x60, 0x1a, - 0x05, 0x92, 0x4a, 0x0b, 0x6d, 0x12, 0x68, 0x12, - 0x4b, 0x09, 0x6e, 0xdb, 0x60, 0x1a, 0x4a, 0x08, - 0x6d, 0x92, 0x68, 0x12, 0x4b, 0x06, 0x6f, 0x5b, - 0x60, 0x1a, 0x4a, 0x05, 0x6d, 0xd2, 0x68, 0x12, - 0x4b, 0x03, 0x6f, 0x9b, 0x60, 0x1a, 0xbc, 0x80, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x4c, - 0x2e, 0x08, 0x1f, 0x24, 0xb5, 0x90, 0x1c, 0x07, - 0x1c, 0x0c, 0x2f, 0x22, 0xd1, 0x07, 0x2c, 0x3f, - 0xd8, 0x01, 0x2c, 0x01, 0xd2, 0x03, 0x20, 0x38, - 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x01, - 0x49, 0x13, 0x70, 0x08, 0x23, 0x01, 0x03, 0xdb, - 0x42, 0x9f, 0xd0, 0x02, 0x4b, 0x11, 0x42, 0x9f, - 0xd1, 0x04, 0x48, 0x11, 0x60, 0x07, 0x20, 0x00, - 0xe7, 0xee, 0xe0, 0x18, 0x2f, 0xff, 0xd1, 0x0b, - 0x21, 0x00, 0x43, 0xc9, 0x20, 0x0d, 0xf0, 0x00, - 0xf8, 0x1d, 0x48, 0x0c, 0x68, 0x01, 0x48, 0x0c, - 0x68, 0x00, 0xf0, 0x00, 0xf8, 0x43, 0xe0, 0x07, - 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x3e, - 0x48, 0x07, 0x60, 0x07, 0x48, 0x05, 0x60, 0x04, - 0x20, 0x00, 0xe7, 0xd5, 0xe7, 0xd4, 0xe7, 0xd3, - 0x2e, 0x08, 0x60, 0x84, 0x00, 0x00, 0x80, 0x0f, - 0xcc, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x60, 0x80, - 0x2e, 0x08, 0x1f, 0xa4, 0xb4, 0xb0, 0x1c, 0x07, - 0x1c, 0x0a, 0x4b, 0x13, 0x68, 0x5b, 0x1c, 0x18, - 0x21, 0x00, 0x29, 0x02, 0xdb, 0x04, 0xe0, 0x1a, - 0x1c, 0x4b, 0x06, 0x19, 0x0e, 0x09, 0xe7, 0xf8, - 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc4, 0x29, 0x00, - 0xd1, 0x01, 0x60, 0x27, 0xe0, 0x05, 0x23, 0x01, - 0x42, 0xda, 0xd0, 0x01, 0x60, 0x22, 0xe0, 0x00, - 0xe0, 0x09, 0x1d, 0x05, 0x23, 0x05, 0x02, 0x1b, - 0x42, 0x9d, 0xdb, 0x02, 0x20, 0x01, 0x02, 0x80, - 0xe0, 0x00, 0x30, 0x04, 0xe7, 0xe4, 0x4b, 0x02, - 0x60, 0x58, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, - 0xcc, 0x00, 0x0f, 0x00, 0xb5, 0x90, 0x1c, 0x04, - 0x1c, 0x0f, 0x05, 0x20, 0x0d, 0x00, 0x23, 0xff, - 0x33, 0x04, 0x42, 0x98, 0xd0, 0x50, 0xdc, 0x18, - 0x28, 0x10, 0xd0, 0x2d, 0xdc, 0x08, 0x28, 0x01, - 0xd0, 0x23, 0x28, 0x02, 0xd0, 0x1e, 0x28, 0x04, - 0xd0, 0x1f, 0x28, 0x08, 0xd0, 0x1d, 0xe0, 0x76, - 0x28, 0x12, 0xd0, 0x1d, 0x28, 0x22, 0xd0, 0x3a, - 0x23, 0xff, 0x33, 0x02, 0x42, 0x98, 0xd0, 0x24, - 0x23, 0xff, 0x33, 0x03, 0x42, 0x98, 0xd0, 0x29, - 0xe0, 0x69, 0x38, 0xff, 0x38, 0x05, 0x28, 0x08, - 0xd2, 0x65, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x35, 0x3c, 0x41, 0x4f, - 0x56, 0x4b, 0x5d, 0x46, 0x20, 0x00, 0x49, 0x32, - 0x63, 0x48, 0x48, 0x31, 0x62, 0x04, 0xe0, 0x5c, - 0x20, 0x01, 0x49, 0x2f, 0x63, 0x48, 0xe0, 0x58, - 0x20, 0x00, 0x49, 0x2e, 0x67, 0x08, 0x21, 0x00, - 0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x92, - 0xe0, 0x4f, 0x20, 0x01, 0x49, 0x29, 0x67, 0x08, - 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, - 0xff, 0x89, 0xe0, 0x46, 0x20, 0x02, 0x49, 0x25, + 0xf0, 0x0b, 0xfe, 0x1a, 0xe0, 0x4f, 0x48, 0x3c, + 0x6a, 0x00, 0x38, 0x01, 0x49, 0x3a, 0x62, 0x08, + 0x48, 0x39, 0x6a, 0x40, 0x30, 0x01, 0x49, 0x38, + 0x62, 0x48, 0x48, 0x39, 0x68, 0x00, 0x30, 0x0c, + 0x49, 0x37, 0x60, 0x08, 0x48, 0x36, 0x68, 0x00, + 0x78, 0x00, 0x49, 0x33, 0x61, 0x88, 0x48, 0x34, + 0x68, 0x00, 0x7a, 0x00, 0x49, 0x30, 0x61, 0x08, + 0x48, 0x31, 0x68, 0x00, 0x68, 0x40, 0x49, 0x2e, + 0x60, 0xc8, 0x48, 0x2d, 0x69, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x01, 0x48, 0x2f, 0xe0, 0x01, + 0x20, 0x01, 0x02, 0x40, 0x49, 0x28, 0x61, 0xc8, + 0x48, 0x27, 0x6d, 0x00, 0x68, 0x00, 0x23, 0x01, + 0x03, 0x5b, 0x43, 0x18, 0x49, 0x24, 0x6d, 0x09, + 0x60, 0x08, 0x04, 0x80, 0x48, 0x22, 0x6d, 0x40, + 0x68, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x49, 0x20, + 0x69, 0x89, 0x08, 0x49, 0x06, 0x09, 0x0e, 0x09, + 0x43, 0x08, 0x49, 0x1d, 0x6d, 0x49, 0x60, 0x08, + 0x06, 0x00, 0x48, 0x1b, 0x6d, 0x00, 0x68, 0x00, + 0x4b, 0x1f, 0x40, 0x18, 0x49, 0x18, 0x69, 0x89, + 0x07, 0xc9, 0x0c, 0x49, 0x43, 0x08, 0x49, 0x16, + 0x6d, 0x09, 0x60, 0x08, 0x04, 0x40, 0xe0, 0x01, + 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x12, 0x6c, 0x80, + 0x68, 0x00, 0x49, 0x11, 0x6e, 0x49, 0x60, 0x08, + 0x48, 0x0f, 0x6d, 0x40, 0x68, 0x00, 0x49, 0x0e, + 0x6f, 0x09, 0x60, 0x08, 0x48, 0x0c, 0x6d, 0x00, + 0x68, 0x00, 0x49, 0x0b, 0x6e, 0xc9, 0x60, 0x08, + 0x48, 0x09, 0x6c, 0xc0, 0x68, 0x00, 0x23, 0x08, + 0x43, 0x18, 0x49, 0x07, 0x6c, 0xc9, 0x60, 0x08, + 0x07, 0x00, 0x48, 0x05, 0x6c, 0xc0, 0x68, 0x00, + 0x49, 0x03, 0x6e, 0x89, 0x60, 0x08, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, + 0x2e, 0x08, 0x1f, 0x1c, 0xff, 0xff, 0xef, 0xff, + 0x2e, 0x08, 0x60, 0x54, 0x00, 0x00, 0x02, 0x03, + 0xff, 0xff, 0xfb, 0xff, 0x00, 0x00, 0x02, 0x01, + 0xff, 0xff, 0xbf, 0xff, 0xb4, 0x80, 0x49, 0x2e, + 0x20, 0x00, 0x28, 0x08, 0xd3, 0x04, 0xe0, 0x06, + 0x1c, 0x42, 0x06, 0x10, 0x0e, 0x00, 0xe7, 0xf8, + 0x23, 0x00, 0xc1, 0x08, 0xe7, 0xf8, 0x4a, 0x29, + 0x6f, 0xd2, 0x68, 0x12, 0x4b, 0x27, 0x6d, 0x9b, + 0x68, 0x1b, 0x0a, 0x1b, 0x02, 0x1b, 0x06, 0x12, + 0x0e, 0x12, 0x43, 0x1a, 0x4b, 0x23, 0x6d, 0x9b, + 0x60, 0x1a, 0x06, 0x12, 0x0e, 0x12, 0x4a, 0x21, + 0x6f, 0xd2, 0x68, 0x52, 0x4b, 0x1f, 0x6d, 0x1b, + 0x68, 0x1f, 0x23, 0x01, 0x03, 0xdb, 0x43, 0x9f, + 0x1c, 0x3b, 0x07, 0xd2, 0x0c, 0x12, 0x43, 0x1a, + 0x4b, 0x1a, 0x6d, 0x1b, 0x60, 0x1a, 0x04, 0x12, + 0x0f, 0xd2, 0x4a, 0x18, 0x6f, 0xd2, 0x69, 0x12, + 0x4b, 0x16, 0x6d, 0xdb, 0x68, 0x1b, 0x0c, 0x1b, + 0x04, 0x1b, 0x04, 0x12, 0x0c, 0x12, 0x43, 0x1a, + 0x4b, 0x12, 0x6d, 0xdb, 0x60, 0x1a, 0x04, 0x12, + 0x0c, 0x12, 0x4a, 0x10, 0x6d, 0x12, 0x68, 0x12, + 0x23, 0x01, 0x02, 0x5b, 0x43, 0x1a, 0x4b, 0x0d, + 0x6d, 0x1b, 0x60, 0x1a, 0x05, 0x92, 0x4a, 0x0b, + 0x6d, 0x12, 0x68, 0x12, 0x4b, 0x09, 0x6e, 0xdb, + 0x60, 0x1a, 0x4a, 0x08, 0x6d, 0x92, 0x68, 0x12, + 0x4b, 0x06, 0x6f, 0x5b, 0x60, 0x1a, 0x4a, 0x05, + 0x6d, 0xd2, 0x68, 0x12, 0x4b, 0x03, 0x6f, 0x9b, + 0x60, 0x1a, 0xbc, 0x80, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0x44, 0x2e, 0x08, 0x1f, 0x1c, + 0xb5, 0x90, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x22, + 0xd1, 0x07, 0x2c, 0x3f, 0xd8, 0x01, 0x2c, 0x01, + 0xd2, 0x03, 0x20, 0x38, 0xbc, 0x90, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0x01, 0x49, 0x13, 0x70, 0x08, + 0x23, 0x01, 0x03, 0xdb, 0x42, 0x9f, 0xd0, 0x02, + 0x4b, 0x11, 0x42, 0x9f, 0xd1, 0x04, 0x48, 0x11, + 0x60, 0x07, 0x20, 0x00, 0xe7, 0xee, 0xe0, 0x18, + 0x2f, 0xff, 0xd1, 0x0b, 0x21, 0x00, 0x43, 0xc9, + 0x20, 0x0d, 0xf0, 0x00, 0xf8, 0x1d, 0x48, 0x0c, + 0x68, 0x01, 0x48, 0x0c, 0x68, 0x00, 0xf0, 0x00, + 0xf8, 0x43, 0xe0, 0x07, 0x1c, 0x21, 0x1c, 0x38, + 0xf0, 0x00, 0xf8, 0x3e, 0x48, 0x07, 0x60, 0x07, + 0x48, 0x05, 0x60, 0x04, 0x20, 0x00, 0xe7, 0xd5, + 0xe7, 0xd4, 0xe7, 0xd3, 0x2e, 0x08, 0x60, 0x7c, + 0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, + 0x2e, 0x08, 0x60, 0x78, 0x2e, 0x08, 0x1f, 0x9c, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x13, + 0x68, 0x5b, 0x1c, 0x18, 0x21, 0x00, 0x29, 0x02, + 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x4b, 0x06, 0x19, + 0x0e, 0x09, 0xe7, 0xf8, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc4, 0x29, 0x00, 0xd1, 0x01, 0x60, 0x27, + 0xe0, 0x05, 0x23, 0x01, 0x42, 0xda, 0xd0, 0x01, + 0x60, 0x22, 0xe0, 0x00, 0xe0, 0x09, 0x1d, 0x05, + 0x23, 0x05, 0x02, 0x1b, 0x42, 0x9d, 0xdb, 0x02, + 0x20, 0x01, 0x02, 0x80, 0xe0, 0x00, 0x30, 0x04, + 0xe7, 0xe4, 0x4b, 0x02, 0x60, 0x58, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x00, + 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x05, 0x20, + 0x0d, 0x00, 0x23, 0xff, 0x33, 0x04, 0x42, 0x98, + 0xd0, 0x50, 0xdc, 0x18, 0x28, 0x10, 0xd0, 0x2d, + 0xdc, 0x08, 0x28, 0x01, 0xd0, 0x23, 0x28, 0x02, + 0xd0, 0x1e, 0x28, 0x04, 0xd0, 0x1f, 0x28, 0x08, + 0xd0, 0x1d, 0xe0, 0x76, 0x28, 0x12, 0xd0, 0x1d, + 0x28, 0x22, 0xd0, 0x3a, 0x23, 0xff, 0x33, 0x02, + 0x42, 0x98, 0xd0, 0x24, 0x23, 0xff, 0x33, 0x03, + 0x42, 0x98, 0xd0, 0x29, 0xe0, 0x69, 0x38, 0xff, + 0x38, 0x05, 0x28, 0x08, 0xd2, 0x65, 0xa3, 0x02, + 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x35, 0x3c, 0x41, 0x4f, 0x56, 0x4b, 0x5d, 0x46, + 0x20, 0x00, 0x49, 0x32, 0x63, 0x48, 0x48, 0x31, + 0x62, 0x04, 0xe0, 0x5c, 0x20, 0x01, 0x49, 0x2f, + 0x63, 0x48, 0xe0, 0x58, 0x20, 0x00, 0x49, 0x2e, 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, 0x20, 0x10, - 0xf7, 0xff, 0xff, 0x80, 0xe0, 0x3d, 0x1c, 0x39, - 0x20, 0x22, 0xf7, 0xff, 0xff, 0x7b, 0xe0, 0x38, - 0x48, 0x1e, 0x65, 0xc7, 0x21, 0x01, 0x20, 0x35, - 0xf7, 0xff, 0xff, 0x74, 0xe0, 0x31, 0x48, 0x1b, - 0x65, 0xc7, 0x21, 0x02, 0x20, 0x35, 0xf7, 0xff, - 0xff, 0x6d, 0xe0, 0x2a, 0x21, 0x00, 0x20, 0x35, - 0xf7, 0xff, 0xff, 0x68, 0xe0, 0x25, 0x21, 0x03, - 0x20, 0x35, 0xf7, 0xff, 0xff, 0x63, 0xe0, 0x20, - 0x21, 0x04, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x5e, - 0xe0, 0x1b, 0x20, 0x00, 0x49, 0x0f, 0x65, 0xc8, - 0xe0, 0x17, 0x48, 0x0e, 0x66, 0x07, 0x21, 0x01, - 0x20, 0x36, 0xf7, 0xff, 0xff, 0x53, 0xe0, 0x10, - 0x48, 0x0a, 0x66, 0x07, 0x21, 0x02, 0x20, 0x36, - 0xf7, 0xff, 0xff, 0x4c, 0xe0, 0x09, 0x20, 0x00, - 0x49, 0x06, 0x66, 0x08, 0xe0, 0x05, 0x1c, 0x20, - 0x21, 0x00, 0x43, 0xc9, 0xf7, 0xff, 0xff, 0x42, - 0xe7, 0xff, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x05, 0x00, - 0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, - 0x06, 0x38, 0x0e, 0x00, 0x06, 0x19, 0x0e, 0x09, - 0x29, 0x01, 0xd0, 0x08, 0x22, 0x00, 0x4d, 0x09, - 0x60, 0x2a, 0x22, 0x00, 0x43, 0xd2, 0x4d, 0x08, - 0x68, 0x2d, 0x60, 0x2a, 0xe0, 0x08, 0x4a, 0x07, - 0x68, 0x12, 0x60, 0x14, 0x4a, 0x04, 0x68, 0x12, - 0x60, 0x10, 0x22, 0x01, 0x4d, 0x01, 0x60, 0x2a, - 0xbc, 0xb0, 0x47, 0x70, 0xcc, 0x00, 0x0d, 0x00, - 0x2e, 0x08, 0x60, 0x78, 0x2e, 0x08, 0x60, 0x74, - 0xb5, 0xf3, 0xb0, 0x81, 0x99, 0x02, 0x06, 0x08, - 0x16, 0x00, 0x90, 0x00, 0xb0, 0x85, 0x20, 0x00, - 0x90, 0x01, 0x9c, 0x06, 0x1d, 0xe6, 0x36, 0x05, - 0xcc, 0x20, 0x07, 0xa8, 0x0f, 0x80, 0x06, 0x00, - 0x16, 0x00, 0x90, 0x00, 0x08, 0xad, 0x3d, 0x03, - 0xcc, 0x80, 0x08, 0xb8, 0x00, 0x80, 0x19, 0x86, - 0xcc, 0x02, 0x91, 0x04, 0x99, 0x04, 0x08, 0x89, - 0x91, 0x04, 0x20, 0x03, 0x05, 0x80, 0x21, 0x35, - 0x06, 0x49, 0x60, 0x08, 0x48, 0x46, 0x68, 0x01, - 0x08, 0x89, 0x00, 0x89, 0x60, 0x01, 0x48, 0x45, - 0x90, 0x03, 0x20, 0x00, 0x90, 0x02, 0x98, 0x02, - 0x42, 0xa8, 0xd3, 0x04, 0xe0, 0x08, 0x98, 0x02, - 0x30, 0x01, 0x90, 0x02, 0xe7, 0xf7, 0xcc, 0x02, - 0x98, 0x03, 0xc0, 0x02, 0x90, 0x03, 0xe7, 0xf6, - 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0xcc, 0x02, - 0x98, 0x03, 0xc0, 0x02, 0x90, 0x03, 0x20, 0x00, - 0x49, 0x39, 0x65, 0x88, 0x9f, 0x04, 0x2f, 0x00, - 0xd8, 0x02, 0xe0, 0x05, 0x3f, 0x01, 0xe7, 0xfa, - 0xce, 0x02, 0x48, 0x35, 0x64, 0x81, 0xe7, 0xf9, - 0x20, 0x00, 0x49, 0x34, 0x60, 0x48, 0x20, 0x00, - 0x21, 0x35, 0x06, 0x49, 0x60, 0x08, 0x20, 0x00, - 0x49, 0x2f, 0x66, 0x88, 0x20, 0x00, 0x21, 0x35, - 0x06, 0x49, 0x61, 0x88, 0x20, 0x01, 0x49, 0x2c, - 0x64, 0xc8, 0x48, 0x2c, 0x68, 0x40, 0x28, 0x00, - 0xd1, 0x0e, 0x27, 0x00, 0x2f, 0x64, 0xd3, 0x02, - 0xe0, 0x02, 0x37, 0x01, 0xe7, 0xfa, 0xe7, 0xfc, - 0x98, 0x01, 0x1c, 0x41, 0x91, 0x01, 0x4b, 0x26, - 0x42, 0x98, 0xdb, 0x00, 0xe0, 0x00, 0xe7, 0xec, - 0x48, 0x24, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, - 0x60, 0x01, 0x48, 0x23, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x03, 0x48, 0x21, 0x68, 0x40, 0x28, 0x00, - 0xd1, 0x0b, 0x48, 0x20, 0x68, 0x40, 0x4b, 0x19, - 0x18, 0xc0, 0x49, 0x1d, 0x60, 0x08, 0x48, 0x1d, - 0x68, 0x80, 0x4b, 0x16, 0x18, 0xc0, 0x49, 0x1a, - 0x60, 0x48, 0x48, 0x19, 0x68, 0x00, 0x21, 0x33, - 0x06, 0x49, 0x65, 0x48, 0x48, 0x16, 0x68, 0x40, - 0x21, 0x33, 0x06, 0x49, 0x65, 0x88, 0x48, 0x14, - 0x68, 0x40, 0x21, 0x33, 0x06, 0x49, 0x66, 0x88, - 0x48, 0x11, 0x68, 0x00, 0x21, 0x33, 0x06, 0x49, - 0x66, 0x48, 0x20, 0x03, 0x21, 0x33, 0x06, 0x49, - 0x67, 0x08, 0x20, 0x00, 0x49, 0x0e, 0x68, 0x09, - 0x70, 0x08, 0x21, 0x00, 0x20, 0x0d, 0xf7, 0xff, - 0xfe, 0x2d, 0xb0, 0x05, 0xb0, 0x01, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x66, 0x00, 0x00, 0x70, 0xcc, 0x00, 0x00, 0x00, - 0x6a, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0f, 0x00, - 0x00, 0x00, 0x27, 0x10, 0x6a, 0x00, 0x00, 0x10, - 0x2e, 0x08, 0x7c, 0x24, 0xcc, 0x00, 0x0f, 0x80, - 0x2e, 0x08, 0x94, 0xac, 0x1c, 0x01, 0xb0, 0x81, - 0x48, 0x27, 0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, - 0x2a, 0x16, 0xdb, 0x04, 0xe0, 0x09, 0x9a, 0x00, - 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02, - 0x9b, 0x00, 0x00, 0x9b, 0x50, 0xca, 0x30, 0x04, - 0xe7, 0xf5, 0x48, 0x20, 0x22, 0x00, 0x92, 0x00, - 0x9a, 0x00, 0x2a, 0x0b, 0xdb, 0x04, 0xe0, 0x0a, + 0xf7, 0xff, 0xff, 0x92, 0xe0, 0x4f, 0x20, 0x01, + 0x49, 0x29, 0x67, 0x08, 0x21, 0x00, 0x43, 0xc9, + 0x20, 0x10, 0xf7, 0xff, 0xff, 0x89, 0xe0, 0x46, + 0x20, 0x02, 0x49, 0x25, 0x67, 0x08, 0x21, 0x00, + 0x43, 0xc9, 0x20, 0x10, 0xf7, 0xff, 0xff, 0x80, + 0xe0, 0x3d, 0x1c, 0x39, 0x20, 0x22, 0xf7, 0xff, + 0xff, 0x7b, 0xe0, 0x38, 0x48, 0x1e, 0x65, 0xc7, + 0x21, 0x01, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x74, + 0xe0, 0x31, 0x48, 0x1b, 0x65, 0xc7, 0x21, 0x02, + 0x20, 0x35, 0xf7, 0xff, 0xff, 0x6d, 0xe0, 0x2a, + 0x21, 0x00, 0x20, 0x35, 0xf7, 0xff, 0xff, 0x68, + 0xe0, 0x25, 0x21, 0x03, 0x20, 0x35, 0xf7, 0xff, + 0xff, 0x63, 0xe0, 0x20, 0x21, 0x04, 0x20, 0x35, + 0xf7, 0xff, 0xff, 0x5e, 0xe0, 0x1b, 0x20, 0x00, + 0x49, 0x0f, 0x65, 0xc8, 0xe0, 0x17, 0x48, 0x0e, + 0x66, 0x07, 0x21, 0x01, 0x20, 0x36, 0xf7, 0xff, + 0xff, 0x53, 0xe0, 0x10, 0x48, 0x0a, 0x66, 0x07, + 0x21, 0x02, 0x20, 0x36, 0xf7, 0xff, 0xff, 0x4c, + 0xe0, 0x09, 0x20, 0x00, 0x49, 0x06, 0x66, 0x08, + 0xe0, 0x05, 0x1c, 0x20, 0x21, 0x00, 0x43, 0xc9, + 0xf7, 0xff, 0xff, 0x42, 0xe7, 0xff, 0xbc, 0x90, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, + 0xcc, 0x00, 0x05, 0x00, 0xb4, 0xb0, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x38, 0x0e, 0x00, + 0x06, 0x19, 0x0e, 0x09, 0x29, 0x01, 0xd0, 0x08, + 0x22, 0x00, 0x4d, 0x09, 0x60, 0x2a, 0x22, 0x00, + 0x43, 0xd2, 0x4d, 0x08, 0x68, 0x2d, 0x60, 0x2a, + 0xe0, 0x08, 0x4a, 0x07, 0x68, 0x12, 0x60, 0x14, + 0x4a, 0x04, 0x68, 0x12, 0x60, 0x10, 0x22, 0x01, + 0x4d, 0x01, 0x60, 0x2a, 0xbc, 0xb0, 0x47, 0x70, + 0xcc, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x60, 0x70, + 0x2e, 0x08, 0x60, 0x6c, 0xb5, 0xf3, 0xb0, 0x81, + 0x99, 0x02, 0x06, 0x08, 0x16, 0x00, 0x90, 0x00, + 0xb0, 0x85, 0x20, 0x00, 0x90, 0x01, 0x9c, 0x06, + 0x1d, 0xe6, 0x36, 0x05, 0xcc, 0x20, 0x07, 0xa8, + 0x0f, 0x80, 0x06, 0x00, 0x16, 0x00, 0x90, 0x00, + 0x08, 0xad, 0x3d, 0x03, 0xcc, 0x80, 0x08, 0xb8, + 0x00, 0x80, 0x19, 0x86, 0xcc, 0x02, 0x91, 0x04, + 0x99, 0x04, 0x08, 0x89, 0x91, 0x04, 0x20, 0x03, + 0x05, 0x80, 0x21, 0x35, 0x06, 0x49, 0x60, 0x08, + 0x48, 0x46, 0x68, 0x01, 0x08, 0x89, 0x00, 0x89, + 0x60, 0x01, 0x48, 0x45, 0x90, 0x03, 0x20, 0x00, + 0x90, 0x02, 0x98, 0x02, 0x42, 0xa8, 0xd3, 0x04, + 0xe0, 0x08, 0x98, 0x02, 0x30, 0x01, 0x90, 0x02, + 0xe7, 0xf7, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0xe7, 0xf6, 0x98, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0xcc, 0x02, 0x98, 0x03, 0xc0, 0x02, + 0x90, 0x03, 0x20, 0x00, 0x49, 0x39, 0x65, 0x88, + 0x9f, 0x04, 0x2f, 0x00, 0xd8, 0x02, 0xe0, 0x05, + 0x3f, 0x01, 0xe7, 0xfa, 0xce, 0x02, 0x48, 0x35, + 0x64, 0x81, 0xe7, 0xf9, 0x20, 0x00, 0x49, 0x34, + 0x60, 0x48, 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, + 0x60, 0x08, 0x20, 0x00, 0x49, 0x2f, 0x66, 0x88, + 0x20, 0x00, 0x21, 0x35, 0x06, 0x49, 0x61, 0x88, + 0x20, 0x01, 0x49, 0x2c, 0x64, 0xc8, 0x48, 0x2c, + 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0e, 0x27, 0x00, + 0x2f, 0x64, 0xd3, 0x02, 0xe0, 0x02, 0x37, 0x01, + 0xe7, 0xfa, 0xe7, 0xfc, 0x98, 0x01, 0x1c, 0x41, + 0x91, 0x01, 0x4b, 0x26, 0x42, 0x98, 0xdb, 0x00, + 0xe0, 0x00, 0xe7, 0xec, 0x48, 0x24, 0x68, 0x01, + 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0x48, 0x23, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x21, + 0x68, 0x40, 0x28, 0x00, 0xd1, 0x0b, 0x48, 0x20, + 0x68, 0x40, 0x4b, 0x19, 0x18, 0xc0, 0x49, 0x1d, + 0x60, 0x08, 0x48, 0x1d, 0x68, 0x80, 0x4b, 0x16, + 0x18, 0xc0, 0x49, 0x1a, 0x60, 0x48, 0x48, 0x19, + 0x68, 0x00, 0x21, 0x33, 0x06, 0x49, 0x65, 0x48, + 0x48, 0x16, 0x68, 0x40, 0x21, 0x33, 0x06, 0x49, + 0x65, 0x88, 0x48, 0x14, 0x68, 0x40, 0x21, 0x33, + 0x06, 0x49, 0x66, 0x88, 0x48, 0x11, 0x68, 0x00, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x48, 0x20, 0x03, + 0x21, 0x33, 0x06, 0x49, 0x67, 0x08, 0x20, 0x00, + 0x49, 0x0e, 0x68, 0x09, 0x70, 0x08, 0x21, 0x00, + 0x20, 0x0d, 0xf7, 0xff, 0xfe, 0x2d, 0xb0, 0x05, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x70, + 0xcc, 0x00, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x27, 0x10, + 0x6a, 0x00, 0x00, 0x10, 0x2e, 0x08, 0x7c, 0x1c, + 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x94, 0xa4, + 0x1c, 0x01, 0xb0, 0x81, 0x48, 0x27, 0x22, 0x00, + 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x16, 0xdb, 0x04, + 0xe0, 0x09, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, + 0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b, + 0x50, 0xca, 0x30, 0x04, 0xe7, 0xf5, 0x48, 0x20, + 0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x0b, + 0xdb, 0x04, 0xe0, 0x0a, 0x9a, 0x00, 0x32, 0x01, + 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, + 0x00, 0x92, 0x18, 0x52, 0x65, 0x93, 0x30, 0x04, + 0xe7, 0xf4, 0x48, 0x18, 0x22, 0x00, 0x92, 0x00, + 0x9a, 0x00, 0x2a, 0x11, 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, 0x00, 0x92, 0x18, 0x52, - 0x65, 0x93, 0x30, 0x04, 0xe7, 0xf4, 0x48, 0x18, - 0x22, 0x00, 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x11, - 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, 0x32, 0x01, - 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x03, 0x9a, 0x00, - 0x00, 0x92, 0x18, 0x52, 0x32, 0x80, 0x60, 0x53, - 0x30, 0x04, 0xe7, 0xf3, 0x48, 0x0f, 0x22, 0x02, - 0x92, 0x00, 0x9a, 0x00, 0x2a, 0x05, 0xdb, 0x04, - 0xe0, 0x0b, 0x9a, 0x00, 0x32, 0x01, 0x92, 0x00, - 0xe7, 0xf7, 0x68, 0x02, 0x9b, 0x00, 0x00, 0x9b, - 0x18, 0x5b, 0x33, 0x80, 0x60, 0x5a, 0x30, 0x04, - 0xe7, 0xf3, 0x4a, 0x07, 0x6c, 0x12, 0x1d, 0xcb, - 0x33, 0x79, 0x61, 0xda, 0xb0, 0x01, 0x47, 0x70, - 0xcc, 0x00, 0x05, 0x20, 0xcc, 0x00, 0x0c, 0x00, - 0xcc, 0x00, 0x0c, 0x5c, 0xcc, 0x00, 0x0c, 0xa0, - 0xcc, 0x00, 0x0c, 0x80, 0xb4, 0xf0, 0x1c, 0x06, - 0x1c, 0x0f, 0x1c, 0x14, 0x1c, 0x1d, 0x06, 0x29, - 0x0e, 0x09, 0x2c, 0x1f, 0xdb, 0x02, 0x20, 0xaf, - 0xbc, 0xf0, 0x47, 0x70, 0x4b, 0x0b, 0x40, 0x1f, - 0x48, 0x0b, 0x68, 0x00, 0x60, 0x06, 0x29, 0x01, - 0xd1, 0x07, 0x48, 0x0a, 0x68, 0x02, 0x43, 0x3a, - 0x60, 0x02, 0x20, 0x80, 0x6e, 0x00, 0x60, 0x04, - 0xe0, 0x05, 0x29, 0x02, 0xd1, 0x03, 0x48, 0x05, - 0x68, 0x02, 0x43, 0xba, 0x60, 0x02, 0x20, 0x00, - 0xe7, 0xe6, 0xe7, 0xe5, 0xff, 0xff, 0xf8, 0xff, - 0x2e, 0x08, 0x60, 0x7c, 0xcc, 0x00, 0x02, 0x20, - 0xb5, 0xf3, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, - 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0e, - 0x0e, 0x36, 0x48, 0x1a, 0x6f, 0x00, 0x23, 0x02, - 0x40, 0x18, 0xd0, 0x0d, 0x20, 0x33, 0x06, 0x40, - 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49, - 0x1a, 0x41, 0x48, 0x14, 0x6d, 0xc0, 0x4a, 0x13, - 0x6d, 0x92, 0x1a, 0x80, 0x18, 0x0d, 0xe0, 0x06, + 0x32, 0x80, 0x60, 0x53, 0x30, 0x04, 0xe7, 0xf3, + 0x48, 0x0f, 0x22, 0x02, 0x92, 0x00, 0x9a, 0x00, + 0x2a, 0x05, 0xdb, 0x04, 0xe0, 0x0b, 0x9a, 0x00, + 0x32, 0x01, 0x92, 0x00, 0xe7, 0xf7, 0x68, 0x02, + 0x9b, 0x00, 0x00, 0x9b, 0x18, 0x5b, 0x33, 0x80, + 0x60, 0x5a, 0x30, 0x04, 0xe7, 0xf3, 0x4a, 0x07, + 0x6c, 0x12, 0x1d, 0xcb, 0x33, 0x79, 0x61, 0xda, + 0xb0, 0x01, 0x47, 0x70, 0xcc, 0x00, 0x05, 0x20, + 0xcc, 0x00, 0x0c, 0x00, 0xcc, 0x00, 0x0c, 0x5c, + 0xcc, 0x00, 0x0c, 0xa0, 0xcc, 0x00, 0x0c, 0x80, + 0xb4, 0xf0, 0x1c, 0x06, 0x1c, 0x0f, 0x1c, 0x14, + 0x1c, 0x1d, 0x06, 0x29, 0x0e, 0x09, 0x2c, 0x1f, + 0xdb, 0x02, 0x20, 0xaf, 0xbc, 0xf0, 0x47, 0x70, + 0x4b, 0x0b, 0x40, 0x1f, 0x48, 0x0b, 0x68, 0x00, + 0x60, 0x06, 0x29, 0x01, 0xd1, 0x07, 0x48, 0x0a, + 0x68, 0x02, 0x43, 0x3a, 0x60, 0x02, 0x20, 0x80, + 0x6e, 0x00, 0x60, 0x04, 0xe0, 0x05, 0x29, 0x02, + 0xd1, 0x03, 0x48, 0x05, 0x68, 0x02, 0x43, 0xba, + 0x60, 0x02, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, + 0xff, 0xff, 0xf8, 0xff, 0x2e, 0x08, 0x60, 0x74, + 0xcc, 0x00, 0x02, 0x20, 0xb5, 0xf3, 0xb0, 0x81, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x99, 0x02, 0x06, 0x0e, 0x0e, 0x36, 0x48, 0x1a, + 0x6f, 0x00, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x0d, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x80, 0x21, 0x33, - 0x06, 0x49, 0x6d, 0x49, 0x1a, 0x45, 0x98, 0x00, - 0x43, 0x68, 0x1c, 0x01, 0x20, 0x64, 0xf0, 0x07, - 0xfb, 0x43, 0x1c, 0x04, 0x43, 0x6e, 0x1c, 0x31, - 0x20, 0x64, 0xf0, 0x07, 0xfb, 0x3d, 0x1c, 0x07, - 0x08, 0xa4, 0x00, 0xa4, 0x08, 0xbf, 0x00, 0xbf, - 0x48, 0x05, 0x64, 0x84, 0x48, 0x04, 0x64, 0xc7, - 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x66, 0x00, 0x00, 0x80, - 0xcc, 0x00, 0x0c, 0x80, 0xb5, 0xf7, 0x9a, 0x02, - 0x06, 0x15, 0x0e, 0x2d, 0xb0, 0x82, 0x27, 0x00, - 0x2d, 0x1f, 0xdb, 0x05, 0x20, 0xaf, 0xb0, 0x02, - 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2f, 0x00, 0xd1, 0x0d, 0x48, 0x19, 0x69, 0x80, - 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x02, - 0x49, 0x16, 0x61, 0x88, 0x48, 0x15, 0x69, 0x80, - 0x28, 0x02, 0xd1, 0x00, 0x27, 0xff, 0xe7, 0xef, - 0x4c, 0x13, 0x94, 0x00, 0x20, 0x01, 0x02, 0x40, - 0x90, 0x01, 0x22, 0x00, 0x99, 0x03, 0xb4, 0x06, - 0x06, 0x2b, 0x16, 0x1b, 0x9a, 0x03, 0x99, 0x04, - 0x1c, 0x20, 0xf0, 0x01, 0xff, 0x75, 0xb0, 0x02, - 0x1c, 0x06, 0x2e, 0xd2, 0xd1, 0x06, 0x20, 0x00, - 0x49, 0x08, 0x61, 0x88, 0x20, 0xd2, 0xb0, 0x02, - 0xe7, 0xd2, 0xe0, 0x08, 0x20, 0x00, 0x99, 0x00, - 0x60, 0x08, 0x20, 0x00, 0x49, 0x03, 0x61, 0x88, - 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xc8, 0xb0, 0x02, - 0xe7, 0xc6, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x80, - 0xcc, 0x00, 0x06, 0x00, 0xb5, 0xff, 0x9f, 0x09, - 0xb0, 0x81, 0x9b, 0x01, 0x06, 0x18, 0x0e, 0x00, - 0x9b, 0x02, 0x06, 0x19, 0x0e, 0x09, 0x9b, 0x03, - 0x06, 0x1b, 0x0e, 0x1b, 0x93, 0x00, 0x9b, 0x04, - 0x06, 0x1a, 0x0e, 0x12, 0x06, 0x3d, 0x0e, 0x2d, - 0x2d, 0x01, 0xd1, 0x07, 0x4c, 0x1c, 0x68, 0x26, - 0x23, 0x01, 0x02, 0x9b, 0x43, 0x9e, 0x1c, 0x33, - 0x60, 0x23, 0xe0, 0x07, 0x2d, 0x02, 0xd1, 0x05, - 0x4c, 0x17, 0x68, 0x26, 0x23, 0x01, 0x02, 0x9b, - 0x43, 0x33, 0x60, 0x23, 0x28, 0x00, 0xd1, 0x03, - 0x23, 0x00, 0x4c, 0x14, 0x61, 0xe3, 0xe0, 0x04, - 0x28, 0x01, 0xd1, 0x02, 0x23, 0x01, 0x4c, 0x11, - 0x61, 0xe3, 0x29, 0x00, 0xd1, 0x03, 0x23, 0x00, - 0x4c, 0x0e, 0x65, 0xa3, 0xe0, 0x04, 0x29, 0x01, - 0xd1, 0x02, 0x23, 0x01, 0x4c, 0x0b, 0x65, 0xa3, - 0x2a, 0x00, 0xd1, 0x03, 0x23, 0x02, 0x4c, 0x09, - 0x66, 0xe3, 0xe0, 0x04, 0x2a, 0x01, 0xd1, 0x02, - 0x23, 0x03, 0x4c, 0x06, 0x66, 0xe3, 0x9b, 0x00, - 0x4c, 0x04, 0x67, 0x23, 0xb0, 0x01, 0xb0, 0x04, + 0x06, 0x49, 0x6d, 0x49, 0x1a, 0x41, 0x48, 0x14, + 0x6d, 0xc0, 0x4a, 0x13, 0x6d, 0x92, 0x1a, 0x80, + 0x18, 0x0d, 0xe0, 0x06, 0x20, 0x33, 0x06, 0x40, + 0x6d, 0x80, 0x21, 0x33, 0x06, 0x49, 0x6d, 0x49, + 0x1a, 0x45, 0x98, 0x00, 0x43, 0x68, 0x1c, 0x01, + 0x20, 0x64, 0xf0, 0x07, 0xfb, 0x43, 0x1c, 0x04, + 0x43, 0x6e, 0x1c, 0x31, 0x20, 0x64, 0xf0, 0x07, + 0xfb, 0x3d, 0x1c, 0x07, 0x08, 0xa4, 0x00, 0xa4, + 0x08, 0xbf, 0x00, 0xbf, 0x48, 0x05, 0x64, 0x84, + 0x48, 0x04, 0x64, 0xc7, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0xcc, 0x00, 0x02, 0x20, 0xcc, 0x00, 0x0f, 0x80, + 0x66, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0c, 0x80, + 0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, + 0xb0, 0x82, 0x27, 0x00, 0x2d, 0x1f, 0xdb, 0x05, + 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2f, 0x00, 0xd1, 0x0d, + 0x48, 0x19, 0x69, 0x80, 0x28, 0x00, 0xd0, 0x00, + 0xe7, 0xfa, 0x20, 0x02, 0x49, 0x16, 0x61, 0x88, + 0x48, 0x15, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x00, + 0x27, 0xff, 0xe7, 0xef, 0x4c, 0x13, 0x94, 0x00, + 0x20, 0x01, 0x02, 0x40, 0x90, 0x01, 0x22, 0x00, + 0x99, 0x03, 0xb4, 0x06, 0x06, 0x2b, 0x16, 0x1b, + 0x9a, 0x03, 0x99, 0x04, 0x1c, 0x20, 0xf0, 0x01, + 0xff, 0x75, 0xb0, 0x02, 0x1c, 0x06, 0x2e, 0xd2, + 0xd1, 0x06, 0x20, 0x00, 0x49, 0x08, 0x61, 0x88, + 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xd2, 0xe0, 0x08, + 0x20, 0x00, 0x99, 0x00, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x03, 0x61, 0x88, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0xc8, 0xb0, 0x02, 0xe7, 0xc6, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x06, 0x00, + 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x9b, 0x01, + 0x06, 0x18, 0x0e, 0x00, 0x9b, 0x02, 0x06, 0x19, + 0x0e, 0x09, 0x9b, 0x03, 0x06, 0x1b, 0x0e, 0x1b, + 0x93, 0x00, 0x9b, 0x04, 0x06, 0x1a, 0x0e, 0x12, + 0x06, 0x3d, 0x0e, 0x2d, 0x2d, 0x01, 0xd1, 0x07, + 0x4c, 0x1c, 0x68, 0x26, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x23, 0xe0, 0x07, + 0x2d, 0x02, 0xd1, 0x05, 0x4c, 0x17, 0x68, 0x26, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x33, 0x60, 0x23, + 0x28, 0x00, 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x14, + 0x61, 0xe3, 0xe0, 0x04, 0x28, 0x01, 0xd1, 0x02, + 0x23, 0x01, 0x4c, 0x11, 0x61, 0xe3, 0x29, 0x00, + 0xd1, 0x03, 0x23, 0x00, 0x4c, 0x0e, 0x65, 0xa3, + 0xe0, 0x04, 0x29, 0x01, 0xd1, 0x02, 0x23, 0x01, + 0x4c, 0x0b, 0x65, 0xa3, 0x2a, 0x00, 0xd1, 0x03, + 0x23, 0x02, 0x4c, 0x09, 0x66, 0xe3, 0xe0, 0x04, + 0x2a, 0x01, 0xd1, 0x02, 0x23, 0x03, 0x4c, 0x06, + 0x66, 0xe3, 0x9b, 0x00, 0x4c, 0x04, 0x67, 0x23, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x20, + 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, + 0xb0, 0x84, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x04, 0x20, 0x39, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x01, 0xd1, 0x0a, + 0x94, 0x00, 0x97, 0x01, 0x48, 0x0f, 0x90, 0x02, + 0x48, 0x0f, 0x90, 0x03, 0x46, 0x68, 0x21, 0x01, + 0xf0, 0x00, 0xfd, 0x1a, 0xe0, 0x0f, 0x20, 0x00, + 0x90, 0x00, 0x20, 0x00, 0x90, 0x01, 0x48, 0x09, + 0x90, 0x02, 0x48, 0x09, 0x90, 0x03, 0x46, 0x68, + 0x21, 0x01, 0xf0, 0x00, 0xfd, 0x0d, 0x21, 0x00, + 0x20, 0x02, 0xf7, 0xff, 0xfc, 0x85, 0x20, 0x00, + 0xb0, 0x04, 0xe7, 0xdc, 0xb0, 0x04, 0xe7, 0xda, + 0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0x3f, 0xb4, 0xb0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x48, 0x14, 0x6c, 0x00, + 0x1c, 0x01, 0x48, 0x13, 0x6f, 0x80, 0x23, 0x09, + 0x01, 0x9b, 0x42, 0x98, 0xd1, 0x12, 0x20, 0x02, + 0x40, 0x20, 0xd0, 0x0c, 0x2d, 0x02, 0xd1, 0x0a, + 0x2f, 0x03, 0xd1, 0x00, 0x31, 0x04, 0x2f, 0x03, + 0xd2, 0x05, 0x07, 0xe0, 0x0f, 0xc0, 0xd0, 0x01, + 0x31, 0x05, 0xe0, 0x00, 0x31, 0x08, 0x2d, 0x02, + 0xd9, 0x00, 0x21, 0x12, 0x00, 0x48, 0x18, 0x40, + 0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, + 0x43, 0x41, 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, + 0x1c, 0x08, 0xbc, 0xb0, 0x47, 0x70, 0xe7, 0xfc, + 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x6a, 0xc0, + 0x1c, 0x01, 0x00, 0x48, 0x18, 0x40, 0x30, 0x01, + 0x10, 0x40, 0x21, 0x2d, 0x02, 0x09, 0x43, 0x41, + 0x48, 0x03, 0x69, 0x40, 0x18, 0x09, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0x48, 0x07, 0x68, 0x80, + 0x28, 0x00, 0xd1, 0x03, 0x48, 0x06, 0x69, 0x00, + 0x1c, 0x01, 0xe0, 0x02, 0x48, 0x04, 0x68, 0xc0, + 0x1c, 0x01, 0x4b, 0x02, 0x18, 0xc9, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xcc, 0x00, 0x00, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x48, 0x06, 0x6c, 0x40, 0x60, 0x20, + 0x48, 0x04, 0x6c, 0x80, 0x60, 0x38, 0xf7, 0xff, + 0xff, 0xe1, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xe7, 0xfb, 0x00, 0x00, 0xcc, 0x00, 0x02, 0x00, 0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, - 0x06, 0x2e, 0x0e, 0x36, 0xb0, 0x84, 0x48, 0x15, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x04, 0x20, 0x39, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x01, 0xd1, 0x0a, 0x94, 0x00, 0x97, 0x01, - 0x48, 0x0f, 0x90, 0x02, 0x48, 0x0f, 0x90, 0x03, - 0x46, 0x68, 0x21, 0x01, 0xf0, 0x00, 0xfd, 0x1a, - 0xe0, 0x0f, 0x20, 0x00, 0x90, 0x00, 0x20, 0x00, - 0x90, 0x01, 0x48, 0x09, 0x90, 0x02, 0x48, 0x09, - 0x90, 0x03, 0x46, 0x68, 0x21, 0x01, 0xf0, 0x00, - 0xfd, 0x0d, 0x21, 0x00, 0x20, 0x02, 0xf7, 0xff, - 0xfc, 0x85, 0x20, 0x00, 0xb0, 0x04, 0xe7, 0xdc, - 0xb0, 0x04, 0xe7, 0xda, 0x2e, 0x08, 0x7c, 0xc4, - 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0x3f, - 0xb4, 0xb0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, - 0x48, 0x14, 0x6c, 0x00, 0x1c, 0x01, 0x48, 0x13, - 0x6f, 0x80, 0x23, 0x09, 0x01, 0x9b, 0x42, 0x98, - 0xd1, 0x12, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x0c, - 0x2d, 0x02, 0xd1, 0x0a, 0x2f, 0x03, 0xd1, 0x00, - 0x31, 0x04, 0x2f, 0x03, 0xd2, 0x05, 0x07, 0xe0, - 0x0f, 0xc0, 0xd0, 0x01, 0x31, 0x05, 0xe0, 0x00, - 0x31, 0x08, 0x2d, 0x02, 0xd9, 0x00, 0x21, 0x12, - 0x00, 0x48, 0x18, 0x40, 0x30, 0x01, 0x10, 0x40, - 0x21, 0x2d, 0x02, 0x09, 0x43, 0x41, 0x48, 0x03, - 0x69, 0x40, 0x18, 0x09, 0x1c, 0x08, 0xbc, 0xb0, - 0x47, 0x70, 0xe7, 0xfc, 0xcc, 0x00, 0x0f, 0x80, - 0x48, 0x07, 0x6a, 0xc0, 0x1c, 0x01, 0x00, 0x48, - 0x18, 0x40, 0x30, 0x01, 0x10, 0x40, 0x21, 0x2d, - 0x02, 0x09, 0x43, 0x41, 0x48, 0x03, 0x69, 0x40, - 0x18, 0x09, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, - 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x80, - 0x48, 0x07, 0x68, 0x80, 0x28, 0x00, 0xd1, 0x03, - 0x48, 0x06, 0x69, 0x00, 0x1c, 0x01, 0xe0, 0x02, - 0x48, 0x04, 0x68, 0xc0, 0x1c, 0x01, 0x4b, 0x02, - 0x18, 0xc9, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, - 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x80, - 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x48, 0x06, - 0x6c, 0x40, 0x60, 0x20, 0x48, 0x04, 0x6c, 0x80, - 0x60, 0x38, 0xf7, 0xff, 0xff, 0xe1, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb, 0x00, 0x00, - 0xcc, 0x00, 0x02, 0x00, 0xb5, 0xf0, 0x1c, 0x05, - 0x1c, 0x0c, 0x1c, 0x17, 0xf7, 0xff, 0xff, 0xd4, - 0x1c, 0x06, 0x2d, 0x00, 0xd0, 0x01, 0x2c, 0x00, - 0xd1, 0x03, 0x20, 0x3a, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x08, 0x78, 0x00, 0x40, 0xd0, 0x01, - 0x20, 0x3a, 0xe7, 0xf7, 0x20, 0x00, 0x49, 0x0d, - 0x66, 0x88, 0x48, 0x0d, 0x68, 0x01, 0x23, 0x12, - 0x43, 0x19, 0x60, 0x01, 0x48, 0x0b, 0x63, 0x45, - 0x48, 0x0a, 0x63, 0x84, 0x20, 0x01, 0x49, 0x09, - 0x62, 0x48, 0x48, 0x09, 0x68, 0x01, 0x23, 0x01, - 0x40, 0x59, 0x60, 0x01, 0x48, 0x05, 0x63, 0xc7, - 0x48, 0x02, 0x60, 0x46, 0x20, 0x00, 0xe7, 0xdd, - 0xe7, 0xdc, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, - 0xcc, 0x00, 0x0f, 0x48, 0xcc, 0x00, 0x00, 0x80, - 0xcc, 0x00, 0x00, 0x08, 0xb4, 0xf0, 0x1c, 0x07, - 0x1c, 0x0c, 0x1c, 0x16, 0x1c, 0x1d, 0x48, 0x10, - 0x6a, 0x00, 0x28, 0x10, 0xd0, 0x02, 0x20, 0x3b, - 0xbc, 0xf0, 0x47, 0x70, 0x48, 0x0d, 0x68, 0x00, - 0x60, 0x38, 0x68, 0x38, 0x4b, 0x0b, 0x18, 0xc0, - 0x60, 0x38, 0x48, 0x0b, 0x6b, 0x40, 0x60, 0x30, - 0x48, 0x09, 0x6b, 0x80, 0x60, 0x28, 0x48, 0x09, - 0x6c, 0x80, 0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, - 0x20, 0x02, 0x60, 0x20, 0xe0, 0x01, 0x20, 0x01, - 0x60, 0x20, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3, - 0xcc, 0x00, 0x05, 0x00, 0xcc, 0x00, 0x00, 0x00, - 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x0f, 0x00, - 0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, - 0x06, 0x2a, 0x0e, 0x12, 0x06, 0x21, 0x0e, 0x09, - 0x2f, 0x00, 0xd1, 0x30, 0xb0, 0x81, 0x46, 0x6f, - 0x2a, 0x00, 0xd0, 0x06, 0x2a, 0x08, 0xd0, 0x0d, - 0x2a, 0x10, 0xd0, 0x14, 0x2a, 0x18, 0xd0, 0x1b, - 0xe0, 0x23, 0x20, 0x00, 0x70, 0x38, 0x20, 0x00, - 0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00, - 0x70, 0xf8, 0xe0, 0x1b, 0x20, 0x00, 0x70, 0x38, - 0x20, 0x08, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, - 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x12, 0x20, 0x00, - 0x70, 0x38, 0x20, 0x10, 0x70, 0x78, 0x20, 0x0c, - 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x09, - 0x20, 0x00, 0x70, 0x38, 0x20, 0x18, 0x70, 0x78, + 0xf7, 0xff, 0xff, 0xd4, 0x1c, 0x06, 0x2d, 0x00, + 0xd0, 0x01, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x3a, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x08, 0x78, + 0x00, 0x40, 0xd0, 0x01, 0x20, 0x3a, 0xe7, 0xf7, + 0x20, 0x00, 0x49, 0x0d, 0x66, 0x88, 0x48, 0x0d, + 0x68, 0x01, 0x23, 0x12, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x0b, 0x63, 0x45, 0x48, 0x0a, 0x63, 0x84, + 0x20, 0x01, 0x49, 0x09, 0x62, 0x48, 0x48, 0x09, + 0x68, 0x01, 0x23, 0x01, 0x40, 0x59, 0x60, 0x01, + 0x48, 0x05, 0x63, 0xc7, 0x48, 0x02, 0x60, 0x46, + 0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, 0x00, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x0f, 0x48, + 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x00, 0x08, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x16, + 0x1c, 0x1d, 0x48, 0x10, 0x6a, 0x00, 0x28, 0x10, + 0xd0, 0x02, 0x20, 0x3b, 0xbc, 0xf0, 0x47, 0x70, + 0x48, 0x0d, 0x68, 0x00, 0x60, 0x38, 0x68, 0x38, + 0x4b, 0x0b, 0x18, 0xc0, 0x60, 0x38, 0x48, 0x0b, + 0x6b, 0x40, 0x60, 0x30, 0x48, 0x09, 0x6b, 0x80, + 0x60, 0x28, 0x48, 0x09, 0x6c, 0x80, 0x23, 0x10, + 0x40, 0x18, 0xd0, 0x02, 0x20, 0x02, 0x60, 0x20, + 0xe0, 0x01, 0x20, 0x01, 0x60, 0x20, 0x20, 0x00, + 0xe7, 0xe4, 0xe7, 0xe3, 0xcc, 0x00, 0x05, 0x00, + 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x80, + 0xcc, 0x00, 0x0f, 0x00, 0xb4, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2a, 0x0e, 0x12, + 0x06, 0x21, 0x0e, 0x09, 0x2f, 0x00, 0xd1, 0x30, + 0xb0, 0x81, 0x46, 0x6f, 0x2a, 0x00, 0xd0, 0x06, + 0x2a, 0x08, 0xd0, 0x0d, 0x2a, 0x10, 0xd0, 0x14, + 0x2a, 0x18, 0xd0, 0x1b, 0xe0, 0x23, 0x20, 0x00, + 0x70, 0x38, 0x20, 0x00, 0x70, 0x78, 0x20, 0x0c, + 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x1b, + 0x20, 0x00, 0x70, 0x38, 0x20, 0x08, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, 0x20, 0x00, 0x70, 0xf8, - 0xe0, 0x00, 0xe7, 0xff, 0xb0, 0x01, 0x23, 0x00, - 0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x18, - 0x23, 0x01, 0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, - 0x61, 0xd8, 0x29, 0x00, 0xd1, 0x06, 0x48, 0x0e, - 0x68, 0x06, 0x23, 0x20, 0x43, 0x9e, 0x1c, 0x33, - 0x60, 0x03, 0xe0, 0x06, 0x29, 0x20, 0xd1, 0x04, - 0x48, 0x09, 0x68, 0x06, 0x23, 0x20, 0x43, 0x33, - 0x60, 0x03, 0x23, 0x02, 0x56, 0xf8, 0x23, 0x39, - 0x06, 0x5b, 0x60, 0x58, 0x23, 0x03, 0x56, 0xf8, - 0x4b, 0x04, 0x63, 0x18, 0x20, 0x00, 0x23, 0x39, - 0x06, 0x5b, 0x64, 0x98, 0xbc, 0xf0, 0x47, 0x70, - 0x72, 0x00, 0x00, 0x1c, 0x72, 0x00, 0x01, 0x00, - 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, - 0x06, 0x29, 0x0e, 0x09, 0x06, 0x22, 0x0e, 0x12, - 0xb0, 0x84, 0x29, 0x33, 0xdc, 0x01, 0x2a, 0x0f, - 0xdd, 0x03, 0x20, 0xff, 0xb0, 0x04, 0xbc, 0xb0, - 0x47, 0x70, 0x20, 0x39, 0x06, 0x40, 0x63, 0x41, - 0x20, 0x10, 0x43, 0x10, 0x23, 0x39, 0x06, 0x5b, - 0x63, 0x98, 0x20, 0x39, 0x06, 0x40, 0x68, 0x00, - 0x90, 0x03, 0x98, 0x03, 0x23, 0x9c, 0x43, 0xdb, - 0x40, 0x18, 0x90, 0x03, 0x20, 0x39, 0x06, 0x40, - 0x68, 0x40, 0x90, 0x01, 0x98, 0x01, 0x23, 0x20, - 0x43, 0xdb, 0x40, 0x18, 0x90, 0x01, 0x06, 0x38, - 0x0e, 0x00, 0xd0, 0x29, 0x20, 0x10, 0x40, 0x38, - 0xd0, 0x03, 0x98, 0x03, 0x23, 0x80, 0x43, 0x18, - 0x90, 0x03, 0x20, 0x08, 0x40, 0x38, 0xd0, 0x03, - 0x98, 0x03, 0x23, 0x10, 0x43, 0x18, 0x90, 0x03, - 0x20, 0x04, 0x40, 0x38, 0xd0, 0x04, 0x98, 0x03, - 0x23, 0x08, 0x43, 0x18, 0x90, 0x03, 0xe0, 0x0c, - 0x20, 0x02, 0x40, 0x38, 0xd0, 0x04, 0x98, 0x03, - 0x23, 0x0c, 0x43, 0x18, 0x90, 0x03, 0xe0, 0x04, - 0x98, 0x03, 0x23, 0x0c, 0x43, 0xdb, 0x40, 0x18, - 0x90, 0x03, 0x20, 0x20, 0x40, 0x38, 0xd0, 0x03, - 0x98, 0x01, 0x23, 0x20, 0x43, 0x18, 0x90, 0x01, - 0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x18, - 0x98, 0x01, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58, - 0x20, 0x39, 0x06, 0x40, 0x6a, 0x00, 0x90, 0x00, - 0x98, 0x00, 0x23, 0xf0, 0x43, 0xdb, 0x43, 0x18, - 0x90, 0x00, 0x20, 0xff, 0x02, 0x00, 0x40, 0x38, - 0xd0, 0x27, 0x20, 0xff, 0x30, 0x01, 0x40, 0x38, - 0xd0, 0x03, 0x98, 0x00, 0x23, 0xfe, 0x40, 0x18, - 0x90, 0x00, 0x20, 0x01, 0x02, 0x40, 0x40, 0x38, - 0xd0, 0x03, 0x98, 0x00, 0x23, 0xfd, 0x40, 0x18, - 0x90, 0x00, 0x20, 0x01, 0x02, 0x80, 0x40, 0x38, - 0xd0, 0x03, 0x98, 0x00, 0x23, 0xfb, 0x40, 0x18, - 0x90, 0x00, 0x20, 0x01, 0x02, 0xc0, 0x40, 0x38, - 0xd0, 0x03, 0x98, 0x00, 0x23, 0xf7, 0x40, 0x18, - 0x90, 0x00, 0x20, 0x01, 0x03, 0x00, 0x40, 0x38, - 0xd0, 0x03, 0x98, 0x00, 0x23, 0xf0, 0x40, 0x18, - 0x90, 0x00, 0x98, 0x00, 0x23, 0x39, 0x06, 0x5b, - 0x62, 0x18, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, - 0x90, 0x02, 0x98, 0x02, 0x08, 0x40, 0x00, 0x40, - 0x90, 0x02, 0x20, 0x39, 0x06, 0x40, 0x6a, 0xc0, - 0x90, 0x00, 0x98, 0x00, 0x23, 0x1c, 0x43, 0xdb, - 0x40, 0x18, 0x90, 0x00, 0x20, 0x39, 0x06, 0x40, - 0x6b, 0x80, 0x90, 0x03, 0x98, 0x03, 0x23, 0x10, - 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x39, - 0x06, 0x40, 0x6b, 0xc0, 0x90, 0x01, 0x98, 0x01, - 0x09, 0x00, 0x01, 0x00, 0x90, 0x01, 0x48, 0x4a, - 0x40, 0x38, 0xd0, 0x45, 0x20, 0x01, 0x04, 0x00, - 0x40, 0x38, 0xd0, 0x03, 0x98, 0x02, 0x23, 0x01, - 0x43, 0x18, 0x90, 0x02, 0x20, 0x01, 0x05, 0xc0, - 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, 0x23, 0x10, - 0x43, 0x18, 0x90, 0x00, 0x20, 0x07, 0x04, 0x40, - 0x40, 0x38, 0x23, 0x01, 0x04, 0x5b, 0x42, 0x98, - 0xd0, 0x08, 0x23, 0x01, 0x04, 0x9b, 0x42, 0x98, - 0xd0, 0x07, 0x23, 0x01, 0x04, 0xdb, 0x42, 0x98, - 0xd0, 0x08, 0xe0, 0x0c, 0x98, 0x00, 0x90, 0x00, - 0xe0, 0x0a, 0x98, 0x00, 0x23, 0x04, 0x43, 0x18, - 0x90, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x23, 0x0c, - 0x43, 0x18, 0x90, 0x00, 0xe0, 0x00, 0xe7, 0xff, - 0x20, 0x01, 0x05, 0x80, 0x40, 0x38, 0xd0, 0x03, - 0x98, 0x03, 0x23, 0x10, 0x43, 0x18, 0x90, 0x03, - 0x20, 0x01, 0x05, 0x00, 0x40, 0x38, 0xd0, 0x03, - 0x98, 0x01, 0x23, 0x08, 0x43, 0x18, 0x90, 0x01, - 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x03, - 0x98, 0x01, 0x23, 0x07, 0x43, 0x18, 0x90, 0x01, - 0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, - 0x98, 0x02, 0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, - 0x98, 0x01, 0x23, 0x39, 0x06, 0x5b, 0x63, 0xd8, - 0x98, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x62, 0xd8, - 0x20, 0x39, 0x06, 0x40, 0x68, 0x80, 0x90, 0x03, - 0x98, 0x03, 0x08, 0x80, 0x00, 0x80, 0x90, 0x03, - 0x0f, 0x38, 0x07, 0x00, 0xd0, 0x26, 0x20, 0x01, - 0x07, 0x00, 0x40, 0x38, 0x23, 0x01, 0x07, 0x1b, - 0x42, 0x98, 0xd1, 0x04, 0x98, 0x03, 0x23, 0x02, - 0x43, 0x18, 0x90, 0x03, 0xe0, 0x07, 0x20, 0x00, - 0x42, 0x80, 0xd1, 0x04, 0x98, 0x03, 0x23, 0x02, - 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x01, - 0x07, 0x40, 0x40, 0x38, 0x23, 0x01, 0x07, 0x5b, - 0x42, 0x98, 0xd1, 0x04, 0x98, 0x03, 0x23, 0x01, - 0x43, 0x18, 0x90, 0x03, 0xe0, 0x06, 0x20, 0x00, - 0x42, 0x80, 0xd1, 0x03, 0x98, 0x03, 0x08, 0x40, - 0x00, 0x40, 0x90, 0x03, 0x98, 0x03, 0x23, 0x39, - 0x06, 0x5b, 0x60, 0x98, 0x20, 0x00, 0xb0, 0x04, - 0xe6, 0xc1, 0xb0, 0x04, 0xe6, 0xbf, 0x00, 0x00, - 0x0f, 0xff, 0x00, 0x00, 0x48, 0x02, 0x69, 0xc0, - 0x06, 0x00, 0x16, 0x00, 0x47, 0x70, 0xe7, 0xfd, - 0x72, 0x00, 0x01, 0x00, 0xb5, 0xf7, 0x1c, 0x04, - 0x1c, 0x0f, 0x06, 0x23, 0x16, 0x18, 0x06, 0x3b, - 0x16, 0x19, 0x9b, 0x02, 0x06, 0x1a, 0x0e, 0x12, - 0x2a, 0x00, 0xd1, 0x0b, 0x23, 0x39, 0x06, 0x5b, - 0x60, 0xd8, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x19, - 0x4d, 0x0b, 0x68, 0x2e, 0x23, 0x01, 0x43, 0x33, - 0x60, 0x2b, 0xe0, 0x0c, 0x2a, 0x01, 0xd1, 0x0a, - 0x23, 0x39, 0x06, 0x5b, 0x61, 0x58, 0x23, 0x39, - 0x06, 0x5b, 0x61, 0x99, 0x4d, 0x04, 0x68, 0x2e, - 0x23, 0x02, 0x43, 0x33, 0x60, 0x2b, 0xb0, 0x03, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x72, 0x00, 0x00, 0x08, 0xb4, 0x90, 0x1c, 0x01, - 0x20, 0x92, 0x4b, 0x4b, 0x60, 0x18, 0x20, 0x92, - 0x4b, 0x4a, 0x60, 0x18, 0x20, 0x10, 0x4b, 0x4a, - 0x60, 0x18, 0x20, 0x00, 0x4b, 0x48, 0x60, 0x58, - 0x48, 0x48, 0x4b, 0x47, 0x60, 0x98, 0x22, 0x00, - 0x2a, 0x10, 0xdb, 0x02, 0xe0, 0x07, 0x32, 0x01, - 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93, - 0x4c, 0x42, 0x50, 0xe0, 0xe7, 0xf7, 0x20, 0x00, - 0x43, 0xc0, 0x00, 0x93, 0x4c, 0x3f, 0x50, 0xe0, - 0x22, 0x00, 0x2a, 0x08, 0xdb, 0x02, 0xe0, 0x08, - 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, - 0x00, 0x94, 0x4b, 0x3b, 0x18, 0xe3, 0x64, 0x18, - 0xe7, 0xf6, 0x22, 0x00, 0x2a, 0x20, 0xdb, 0x02, - 0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, - 0x43, 0xc0, 0x00, 0x94, 0x4b, 0x35, 0x18, 0xe3, - 0x60, 0x18, 0xe7, 0xf6, 0x22, 0x00, 0x2a, 0x19, - 0xdb, 0x02, 0xe0, 0x06, 0x32, 0x01, 0xe7, 0xfa, - 0x20, 0x00, 0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, - 0xe7, 0xf8, 0x20, 0x00, 0x4b, 0x2f, 0x60, 0x18, - 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 0x27, 0x18, - 0x40, 0x07, 0x2f, 0x00, 0xd0, 0x03, 0x48, 0x2c, - 0x4b, 0x2c, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff, - 0x30, 0xe0, 0x4b, 0x2a, 0x60, 0x18, 0x20, 0x00, - 0x4b, 0x29, 0x60, 0x18, 0x20, 0x00, 0x4b, 0x28, - 0x60, 0x58, 0x48, 0x28, 0x4b, 0x26, 0x60, 0x98, - 0x48, 0x24, 0x68, 0x00, 0x4b, 0x24, 0x60, 0xd8, - 0x48, 0x25, 0x60, 0x01, 0x20, 0x0d, 0x06, 0xc0, - 0x61, 0xc1, 0x20, 0x05, 0x02, 0x00, 0x23, 0x0d, - 0x06, 0xdb, 0x60, 0x18, 0x48, 0x21, 0x23, 0x0d, - 0x06, 0xdb, 0x60, 0x58, 0x48, 0x1f, 0x4b, 0x16, - 0x63, 0x98, 0x20, 0x00, 0x23, 0x0d, 0x06, 0xdb, - 0x60, 0x98, 0x20, 0x00, 0x23, 0x0d, 0x06, 0xdb, - 0x61, 0x18, 0x48, 0x1b, 0x23, 0x0d, 0x06, 0xdb, - 0x61, 0x98, 0x20, 0x01, 0x23, 0x0d, 0x06, 0xdb, - 0x60, 0xd8, 0x48, 0x18, 0x23, 0x0d, 0x06, 0xdb, - 0x63, 0x18, 0x48, 0x17, 0x23, 0x0d, 0x06, 0xdb, - 0x63, 0x58, 0x20, 0x00, 0x4b, 0x15, 0x60, 0x18, - 0x48, 0x11, 0x4b, 0x15, 0x60, 0x18, 0x20, 0x00, - 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0xcc, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7d, 0x9c, 0x2e, 0x08, 0x7c, 0xd4, - 0x68, 0x00, 0x0d, 0x00, 0x68, 0x00, 0x04, 0x00, - 0x2e, 0x08, 0x7c, 0x60, 0x2e, 0x08, 0x7c, 0xc4, - 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x88, - 0x2e, 0x08, 0x7d, 0xa8, 0x00, 0x00, 0x02, 0xcf, - 0x2e, 0x08, 0x60, 0x8c, 0x00, 0xf0, 0x29, 0x6d, - 0x3f, 0xff, 0xff, 0xff, 0x00, 0x80, 0x10, 0x80, - 0x00, 0x80, 0xeb, 0x80, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x5e, 0x54, 0xb5, 0xff, 0xb0, 0x85, - 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, - 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, - 0xd0, 0x03, 0x48, 0x5a, 0x4b, 0x5a, 0x60, 0x18, - 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x58, - 0x60, 0x18, 0x9c, 0x06, 0x9f, 0x07, 0x22, 0x00, - 0x21, 0x00, 0x98, 0x05, 0x38, 0x0c, 0x28, 0x06, - 0xd2, 0x0c, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x03, 0x06, 0x04, - 0x03, 0x06, 0x32, 0x01, 0x32, 0x01, 0xe0, 0x02, - 0x3a, 0x01, 0xe0, 0x00, 0xe7, 0xff, 0x98, 0x05, - 0x38, 0x0b, 0x28, 0x08, 0xd2, 0x15, 0xa3, 0x02, + 0xe0, 0x12, 0x20, 0x00, 0x70, 0x38, 0x20, 0x10, + 0x70, 0x78, 0x20, 0x0c, 0x70, 0xb8, 0x20, 0x00, + 0x70, 0xf8, 0xe0, 0x09, 0x20, 0x00, 0x70, 0x38, + 0x20, 0x18, 0x70, 0x78, 0x20, 0x1c, 0x70, 0xb8, + 0x20, 0x00, 0x70, 0xf8, 0xe0, 0x00, 0xe7, 0xff, + 0xb0, 0x01, 0x23, 0x00, 0x56, 0xf8, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x18, 0x23, 0x01, 0x56, 0xf8, + 0x23, 0x39, 0x06, 0x5b, 0x61, 0xd8, 0x29, 0x00, + 0xd1, 0x06, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x20, + 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, 0xe0, 0x06, + 0x29, 0x20, 0xd1, 0x04, 0x48, 0x09, 0x68, 0x06, + 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, 0x23, 0x02, + 0x56, 0xf8, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x58, + 0x23, 0x03, 0x56, 0xf8, 0x4b, 0x04, 0x63, 0x18, + 0x20, 0x00, 0x23, 0x39, 0x06, 0x5b, 0x64, 0x98, + 0xbc, 0xf0, 0x47, 0x70, 0x72, 0x00, 0x00, 0x1c, + 0x72, 0x00, 0x01, 0x00, 0xb4, 0xb0, 0x1c, 0x07, + 0x1c, 0x0d, 0x1c, 0x14, 0x06, 0x29, 0x0e, 0x09, + 0x06, 0x22, 0x0e, 0x12, 0xb0, 0x84, 0x29, 0x33, + 0xdc, 0x01, 0x2a, 0x0f, 0xdd, 0x03, 0x20, 0xff, + 0xb0, 0x04, 0xbc, 0xb0, 0x47, 0x70, 0x20, 0x39, + 0x06, 0x40, 0x63, 0x41, 0x20, 0x10, 0x43, 0x10, + 0x23, 0x39, 0x06, 0x5b, 0x63, 0x98, 0x20, 0x39, + 0x06, 0x40, 0x68, 0x00, 0x90, 0x03, 0x98, 0x03, + 0x23, 0x9c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, + 0x20, 0x39, 0x06, 0x40, 0x68, 0x40, 0x90, 0x01, + 0x98, 0x01, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x01, 0x06, 0x38, 0x0e, 0x00, 0xd0, 0x29, + 0x20, 0x10, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, + 0x23, 0x80, 0x43, 0x18, 0x90, 0x03, 0x20, 0x08, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, + 0x43, 0x18, 0x90, 0x03, 0x20, 0x04, 0x40, 0x38, + 0xd0, 0x04, 0x98, 0x03, 0x23, 0x08, 0x43, 0x18, + 0x90, 0x03, 0xe0, 0x0c, 0x20, 0x02, 0x40, 0x38, + 0xd0, 0x04, 0x98, 0x03, 0x23, 0x0c, 0x43, 0x18, + 0x90, 0x03, 0xe0, 0x04, 0x98, 0x03, 0x23, 0x0c, + 0x43, 0xdb, 0x40, 0x18, 0x90, 0x03, 0x20, 0x20, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x20, + 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x18, 0x98, 0x01, 0x23, 0x39, + 0x06, 0x5b, 0x60, 0x58, 0x20, 0x39, 0x06, 0x40, + 0x6a, 0x00, 0x90, 0x00, 0x98, 0x00, 0x23, 0xf0, + 0x43, 0xdb, 0x43, 0x18, 0x90, 0x00, 0x20, 0xff, + 0x02, 0x00, 0x40, 0x38, 0xd0, 0x27, 0x20, 0xff, + 0x30, 0x01, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfe, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0x40, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfd, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0x80, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xfb, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x02, 0xc0, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xf7, 0x40, 0x18, 0x90, 0x00, 0x20, 0x01, + 0x03, 0x00, 0x40, 0x38, 0xd0, 0x03, 0x98, 0x00, + 0x23, 0xf0, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, + 0x23, 0x39, 0x06, 0x5b, 0x62, 0x18, 0x20, 0x39, + 0x06, 0x40, 0x69, 0xc0, 0x90, 0x02, 0x98, 0x02, + 0x08, 0x40, 0x00, 0x40, 0x90, 0x02, 0x20, 0x39, + 0x06, 0x40, 0x6a, 0xc0, 0x90, 0x00, 0x98, 0x00, + 0x23, 0x1c, 0x43, 0xdb, 0x40, 0x18, 0x90, 0x00, + 0x20, 0x39, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, + 0x98, 0x03, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x03, 0x20, 0x39, 0x06, 0x40, 0x6b, 0xc0, + 0x90, 0x01, 0x98, 0x01, 0x09, 0x00, 0x01, 0x00, + 0x90, 0x01, 0x48, 0x4a, 0x40, 0x38, 0xd0, 0x45, + 0x20, 0x01, 0x04, 0x00, 0x40, 0x38, 0xd0, 0x03, + 0x98, 0x02, 0x23, 0x01, 0x43, 0x18, 0x90, 0x02, + 0x20, 0x01, 0x05, 0xc0, 0x40, 0x38, 0xd0, 0x03, + 0x98, 0x00, 0x23, 0x10, 0x43, 0x18, 0x90, 0x00, + 0x20, 0x07, 0x04, 0x40, 0x40, 0x38, 0x23, 0x01, + 0x04, 0x5b, 0x42, 0x98, 0xd0, 0x08, 0x23, 0x01, + 0x04, 0x9b, 0x42, 0x98, 0xd0, 0x07, 0x23, 0x01, + 0x04, 0xdb, 0x42, 0x98, 0xd0, 0x08, 0xe0, 0x0c, + 0x98, 0x00, 0x90, 0x00, 0xe0, 0x0a, 0x98, 0x00, + 0x23, 0x04, 0x43, 0x18, 0x90, 0x00, 0xe0, 0x05, + 0x98, 0x00, 0x23, 0x0c, 0x43, 0x18, 0x90, 0x00, + 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x01, 0x05, 0x80, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x03, 0x23, 0x10, + 0x43, 0x18, 0x90, 0x03, 0x20, 0x01, 0x05, 0x00, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x08, + 0x43, 0x18, 0x90, 0x01, 0x20, 0x01, 0x05, 0x40, + 0x40, 0x38, 0xd0, 0x03, 0x98, 0x01, 0x23, 0x07, + 0x43, 0x18, 0x90, 0x01, 0x98, 0x03, 0x23, 0x39, + 0x06, 0x5b, 0x63, 0x98, 0x98, 0x02, 0x23, 0x39, + 0x06, 0x5b, 0x61, 0xd8, 0x98, 0x01, 0x23, 0x39, + 0x06, 0x5b, 0x63, 0xd8, 0x98, 0x00, 0x23, 0x39, + 0x06, 0x5b, 0x62, 0xd8, 0x20, 0x39, 0x06, 0x40, + 0x68, 0x80, 0x90, 0x03, 0x98, 0x03, 0x08, 0x80, + 0x00, 0x80, 0x90, 0x03, 0x0f, 0x38, 0x07, 0x00, + 0xd0, 0x26, 0x20, 0x01, 0x07, 0x00, 0x40, 0x38, + 0x23, 0x01, 0x07, 0x1b, 0x42, 0x98, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x02, 0x43, 0x18, 0x90, 0x03, + 0xe0, 0x07, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, + 0x90, 0x03, 0x20, 0x01, 0x07, 0x40, 0x40, 0x38, + 0x23, 0x01, 0x07, 0x5b, 0x42, 0x98, 0xd1, 0x04, + 0x98, 0x03, 0x23, 0x01, 0x43, 0x18, 0x90, 0x03, + 0xe0, 0x06, 0x20, 0x00, 0x42, 0x80, 0xd1, 0x03, + 0x98, 0x03, 0x08, 0x40, 0x00, 0x40, 0x90, 0x03, + 0x98, 0x03, 0x23, 0x39, 0x06, 0x5b, 0x60, 0x98, + 0x20, 0x00, 0xb0, 0x04, 0xe6, 0xc1, 0xb0, 0x04, + 0xe6, 0xbf, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x00, + 0x48, 0x02, 0x69, 0xc0, 0x06, 0x00, 0x16, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x72, 0x00, 0x01, 0x00, + 0xb5, 0xf7, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x23, + 0x16, 0x18, 0x06, 0x3b, 0x16, 0x19, 0x9b, 0x02, + 0x06, 0x1a, 0x0e, 0x12, 0x2a, 0x00, 0xd1, 0x0b, + 0x23, 0x39, 0x06, 0x5b, 0x60, 0xd8, 0x23, 0x39, + 0x06, 0x5b, 0x61, 0x19, 0x4d, 0x0b, 0x68, 0x2e, + 0x23, 0x01, 0x43, 0x33, 0x60, 0x2b, 0xe0, 0x0c, + 0x2a, 0x01, 0xd1, 0x0a, 0x23, 0x39, 0x06, 0x5b, + 0x61, 0x58, 0x23, 0x39, 0x06, 0x5b, 0x61, 0x99, + 0x4d, 0x04, 0x68, 0x2e, 0x23, 0x02, 0x43, 0x33, + 0x60, 0x2b, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x72, 0x00, 0x00, 0x08, + 0xb4, 0x90, 0x1c, 0x01, 0x20, 0x92, 0x4b, 0x4b, + 0x60, 0x18, 0x20, 0x92, 0x4b, 0x4a, 0x60, 0x18, + 0x20, 0x10, 0x4b, 0x4a, 0x60, 0x18, 0x20, 0x00, + 0x4b, 0x48, 0x60, 0x58, 0x48, 0x48, 0x4b, 0x47, + 0x60, 0x98, 0x22, 0x00, 0x2a, 0x10, 0xdb, 0x02, + 0xe0, 0x07, 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, + 0x43, 0xc0, 0x00, 0x93, 0x4c, 0x42, 0x50, 0xe0, + 0xe7, 0xf7, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x93, + 0x4c, 0x3f, 0x50, 0xe0, 0x22, 0x00, 0x2a, 0x08, + 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, 0x4b, 0x3b, + 0x18, 0xe3, 0x64, 0x18, 0xe7, 0xf6, 0x22, 0x00, + 0x2a, 0x20, 0xdb, 0x02, 0xe0, 0x08, 0x32, 0x01, + 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, 0x00, 0x94, + 0x4b, 0x35, 0x18, 0xe3, 0x60, 0x18, 0xe7, 0xf6, + 0x22, 0x00, 0x2a, 0x19, 0xdb, 0x02, 0xe0, 0x06, + 0x32, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x00, 0x93, + 0x4c, 0x30, 0x50, 0xe0, 0xe7, 0xf8, 0x20, 0x00, + 0x4b, 0x2f, 0x60, 0x18, 0x20, 0x39, 0x06, 0x40, + 0x69, 0xc0, 0x27, 0x18, 0x40, 0x07, 0x2f, 0x00, + 0xd0, 0x03, 0x48, 0x2c, 0x4b, 0x2c, 0x60, 0x18, + 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, 0x4b, 0x2a, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x29, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x28, 0x60, 0x58, 0x48, 0x28, + 0x4b, 0x26, 0x60, 0x98, 0x48, 0x24, 0x68, 0x00, + 0x4b, 0x24, 0x60, 0xd8, 0x48, 0x25, 0x60, 0x01, + 0x20, 0x0d, 0x06, 0xc0, 0x61, 0xc1, 0x20, 0x05, + 0x02, 0x00, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x18, + 0x48, 0x21, 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x58, + 0x48, 0x1f, 0x4b, 0x16, 0x63, 0x98, 0x20, 0x00, + 0x23, 0x0d, 0x06, 0xdb, 0x60, 0x98, 0x20, 0x00, + 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x18, 0x48, 0x1b, + 0x23, 0x0d, 0x06, 0xdb, 0x61, 0x98, 0x20, 0x01, + 0x23, 0x0d, 0x06, 0xdb, 0x60, 0xd8, 0x48, 0x18, + 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x18, 0x48, 0x17, + 0x23, 0x0d, 0x06, 0xdb, 0x63, 0x58, 0x20, 0x00, + 0x4b, 0x15, 0x60, 0x18, 0x48, 0x11, 0x4b, 0x15, + 0x60, 0x18, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7d, 0x94, + 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x0d, 0x00, + 0x68, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x7c, 0x58, + 0x2e, 0x08, 0x7c, 0xbc, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0, + 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x60, 0x84, + 0x00, 0xf0, 0x29, 0x6d, 0x3f, 0xff, 0xff, 0xff, + 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xeb, 0x80, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x5e, 0x4c, + 0xb5, 0xff, 0xb0, 0x85, 0x20, 0x39, 0x06, 0x40, + 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x5a, + 0x4b, 0x5a, 0x60, 0x18, 0xe0, 0x03, 0x20, 0xff, + 0x30, 0xe0, 0x4b, 0x58, 0x60, 0x18, 0x9c, 0x06, + 0x9f, 0x07, 0x22, 0x00, 0x21, 0x00, 0x98, 0x05, + 0x38, 0x0c, 0x28, 0x06, 0xd2, 0x0c, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, - 0x0a, 0x04, 0x04, 0x04, 0x0a, 0x0a, 0x0a, 0x04, - 0x25, 0x2d, 0x01, 0x2d, 0x48, 0x44, 0x68, 0x00, - 0x1c, 0x46, 0xe0, 0x0e, 0x48, 0x43, 0x6c, 0x40, - 0x1c, 0x05, 0x48, 0x43, 0x68, 0x40, 0x1c, 0x06, - 0xe0, 0x07, 0x21, 0xff, 0x1c, 0x08, 0xb0, 0x05, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xe7, 0xff, 0x2d, 0x00, 0xd0, 0x01, 0x2e, 0x00, - 0xd1, 0x04, 0x25, 0x2d, 0x01, 0x2d, 0x48, 0x38, - 0x68, 0x00, 0x1c, 0x46, 0x29, 0xff, 0xd1, 0x02, - 0x1c, 0x08, 0xb0, 0x05, 0xe7, 0xec, 0x1e, 0x68, - 0x90, 0x02, 0x1e, 0x70, 0x90, 0x01, 0x23, 0x01, - 0x42, 0xda, 0xd1, 0x08, 0x42, 0x50, 0x40, 0x85, - 0x1c, 0x2b, 0x1e, 0x5d, 0x42, 0x50, 0x40, 0x86, - 0x1c, 0x33, 0x1e, 0x5e, 0xe0, 0x05, 0x41, 0x15, - 0x1c, 0x28, 0x1e, 0x45, 0x41, 0x16, 0x1c, 0x30, - 0x1e, 0x46, 0x07, 0xe0, 0x0f, 0xc0, 0xd0, 0x02, - 0x21, 0x80, 0x08, 0x64, 0x00, 0x64, 0x07, 0xf8, - 0x0f, 0xc0, 0xd0, 0x02, 0x21, 0x80, 0x08, 0x7f, - 0x00, 0x7f, 0x19, 0x60, 0x90, 0x04, 0x19, 0xb8, - 0x90, 0x03, 0x2c, 0x00, 0xda, 0x01, 0x21, 0x80, - 0x24, 0x00, 0x98, 0x04, 0x28, 0x01, 0xda, 0x02, - 0x21, 0x80, 0x20, 0x01, 0x90, 0x04, 0x4b, 0x1f, - 0x42, 0x9c, 0xdb, 0x01, 0x21, 0x80, 0x4c, 0x1e, - 0x98, 0x04, 0x4b, 0x1c, 0x42, 0x98, 0xdd, 0x02, - 0x21, 0x80, 0x48, 0x1a, 0x90, 0x04, 0x2f, 0x00, - 0xda, 0x01, 0x21, 0x80, 0x27, 0x00, 0x98, 0x03, + 0x04, 0x03, 0x06, 0x04, 0x03, 0x06, 0x32, 0x01, + 0x32, 0x01, 0xe0, 0x02, 0x3a, 0x01, 0xe0, 0x00, + 0xe7, 0xff, 0x98, 0x05, 0x38, 0x0b, 0x28, 0x08, + 0xd2, 0x15, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x0a, 0x04, 0x04, 0x04, + 0x0a, 0x0a, 0x0a, 0x04, 0x25, 0x2d, 0x01, 0x2d, + 0x48, 0x44, 0x68, 0x00, 0x1c, 0x46, 0xe0, 0x0e, + 0x48, 0x43, 0x6c, 0x40, 0x1c, 0x05, 0x48, 0x43, + 0x68, 0x40, 0x1c, 0x06, 0xe0, 0x07, 0x21, 0xff, + 0x1c, 0x08, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xff, 0x2d, 0x00, + 0xd0, 0x01, 0x2e, 0x00, 0xd1, 0x04, 0x25, 0x2d, + 0x01, 0x2d, 0x48, 0x38, 0x68, 0x00, 0x1c, 0x46, + 0x29, 0xff, 0xd1, 0x02, 0x1c, 0x08, 0xb0, 0x05, + 0xe7, 0xec, 0x1e, 0x68, 0x90, 0x02, 0x1e, 0x70, + 0x90, 0x01, 0x23, 0x01, 0x42, 0xda, 0xd1, 0x08, + 0x42, 0x50, 0x40, 0x85, 0x1c, 0x2b, 0x1e, 0x5d, + 0x42, 0x50, 0x40, 0x86, 0x1c, 0x33, 0x1e, 0x5e, + 0xe0, 0x05, 0x41, 0x15, 0x1c, 0x28, 0x1e, 0x45, + 0x41, 0x16, 0x1c, 0x30, 0x1e, 0x46, 0x07, 0xe0, + 0x0f, 0xc0, 0xd0, 0x02, 0x21, 0x80, 0x08, 0x64, + 0x00, 0x64, 0x07, 0xf8, 0x0f, 0xc0, 0xd0, 0x02, + 0x21, 0x80, 0x08, 0x7f, 0x00, 0x7f, 0x19, 0x60, + 0x90, 0x04, 0x19, 0xb8, 0x90, 0x03, 0x2c, 0x00, + 0xda, 0x01, 0x21, 0x80, 0x24, 0x00, 0x98, 0x04, 0x28, 0x01, 0xda, 0x02, 0x21, 0x80, 0x20, 0x01, - 0x90, 0x03, 0x48, 0x11, 0x68, 0x00, 0x42, 0x87, - 0xd3, 0x03, 0x21, 0x80, 0x48, 0x0e, 0x68, 0x00, - 0x1e, 0x47, 0x98, 0x03, 0x4b, 0x0c, 0x68, 0x1b, - 0x42, 0x98, 0xd9, 0x03, 0x21, 0x80, 0x48, 0x0a, - 0x68, 0x00, 0x90, 0x03, 0x9b, 0x08, 0x60, 0x1c, - 0x9b, 0x08, 0x60, 0x5f, 0x98, 0x04, 0x9b, 0x08, - 0x60, 0x98, 0x98, 0x03, 0x9b, 0x08, 0x60, 0xd8, - 0x1c, 0x08, 0xb0, 0x05, 0xe7, 0x88, 0xb0, 0x05, - 0xe7, 0x86, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3f, - 0x2e, 0x08, 0x60, 0x88, 0xcc, 0x00, 0x02, 0x00, - 0xcc, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x02, 0xcf, - 0x00, 0x00, 0x02, 0xce, 0xb5, 0xf0, 0x1c, 0x07, - 0x1c, 0x0c, 0xb0, 0x81, 0x2c, 0x0b, 0xdb, 0x19, - 0x2c, 0x12, 0xdc, 0x17, 0x68, 0xbe, 0x68, 0xf9, - 0x91, 0x00, 0x68, 0x7a, 0x1c, 0x3b, 0x68, 0x39, - 0x1c, 0x20, 0xf7, 0xff, 0xff, 0x23, 0x1c, 0x05, - 0x68, 0xb8, 0x42, 0xb0, 0xd0, 0x00, 0x25, 0x80, - 0x68, 0xf8, 0x99, 0x00, 0x42, 0x88, 0xd0, 0x00, - 0x25, 0x80, 0x1c, 0x28, 0xb0, 0x01, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x25, 0x00, 0x68, 0x38, + 0x90, 0x04, 0x4b, 0x1f, 0x42, 0x9c, 0xdb, 0x01, + 0x21, 0x80, 0x4c, 0x1e, 0x98, 0x04, 0x4b, 0x1c, + 0x42, 0x98, 0xdd, 0x02, 0x21, 0x80, 0x48, 0x1a, + 0x90, 0x04, 0x2f, 0x00, 0xda, 0x01, 0x21, 0x80, + 0x27, 0x00, 0x98, 0x03, 0x28, 0x01, 0xda, 0x02, + 0x21, 0x80, 0x20, 0x01, 0x90, 0x03, 0x48, 0x11, + 0x68, 0x00, 0x42, 0x87, 0xd3, 0x03, 0x21, 0x80, + 0x48, 0x0e, 0x68, 0x00, 0x1e, 0x47, 0x98, 0x03, + 0x4b, 0x0c, 0x68, 0x1b, 0x42, 0x98, 0xd9, 0x03, + 0x21, 0x80, 0x48, 0x0a, 0x68, 0x00, 0x90, 0x03, + 0x9b, 0x08, 0x60, 0x1c, 0x9b, 0x08, 0x60, 0x5f, + 0x98, 0x04, 0x9b, 0x08, 0x60, 0x98, 0x98, 0x03, + 0x9b, 0x08, 0x60, 0xd8, 0x1c, 0x08, 0xb0, 0x05, + 0xe7, 0x88, 0xb0, 0x05, 0xe7, 0x86, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80, + 0xcc, 0x00, 0x02, 0x00, 0xcc, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce, + 0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0xb0, 0x81, + 0x2c, 0x0b, 0xdb, 0x19, 0x2c, 0x12, 0xdc, 0x17, + 0x68, 0xbe, 0x68, 0xf9, 0x91, 0x00, 0x68, 0x7a, + 0x1c, 0x3b, 0x68, 0x39, 0x1c, 0x20, 0xf7, 0xff, + 0xff, 0x23, 0x1c, 0x05, 0x68, 0xb8, 0x42, 0xb0, + 0xd0, 0x00, 0x25, 0x80, 0x68, 0xf8, 0x99, 0x00, + 0x42, 0x88, 0xd0, 0x00, 0x25, 0x80, 0x1c, 0x28, + 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x25, 0x00, 0x68, 0x38, 0x28, 0x00, 0xda, 0x02, + 0x25, 0x80, 0x20, 0x00, 0x60, 0x38, 0x68, 0x78, 0x28, 0x00, 0xda, 0x02, 0x25, 0x80, 0x20, 0x00, - 0x60, 0x38, 0x68, 0x78, 0x28, 0x00, 0xda, 0x02, - 0x25, 0x80, 0x20, 0x00, 0x60, 0x78, 0x68, 0x38, - 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, 0x25, 0x80, - 0x68, 0x38, 0x08, 0x40, 0x00, 0x40, 0x60, 0x38, - 0x68, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x09, - 0x25, 0x80, 0x68, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, - 0xd0, 0x01, 0x68, 0xb8, 0xe0, 0x01, 0x68, 0xb8, - 0x38, 0x01, 0x60, 0xb8, 0x68, 0xb8, 0x68, 0x39, - 0x42, 0x88, 0xdc, 0x03, 0x25, 0x80, 0x68, 0x38, - 0x30, 0x01, 0x60, 0xb8, 0x68, 0x78, 0x68, 0xf9, - 0x42, 0x88, 0xdb, 0x03, 0x25, 0x80, 0x68, 0x78, - 0x30, 0x01, 0x60, 0xf8, 0x1c, 0x28, 0xb0, 0x01, - 0xe7, 0xc5, 0xb0, 0x01, 0xe7, 0xc3, 0x1c, 0x02, - 0x21, 0x18, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08, - 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0xf0, 0x1c, 0x07, - 0x1c, 0x0a, 0xb0, 0x81, 0x68, 0xb8, 0x68, 0x3b, - 0x1a, 0xc0, 0x1c, 0x46, 0x68, 0xf8, 0x68, 0x7b, - 0x1a, 0xc0, 0x30, 0x01, 0x90, 0x00, 0x00, 0x90, - 0x4b, 0x15, 0x58, 0x1c, 0x98, 0x00, 0x43, 0x46, - 0x1c, 0x35, 0x07, 0xa0, 0x0f, 0x80, 0x1c, 0x29, - 0x40, 0x81, 0x2a, 0x0b, 0xdb, 0x01, 0x2a, 0x12, - 0xdd, 0x01, 0x2a, 0x13, 0xd1, 0x01, 0x21, 0x00, - 0xe0, 0x0a, 0x2a, 0x09, 0xd0, 0x01, 0x2a, 0x0a, - 0xd1, 0x03, 0x00, 0x69, 0x19, 0x49, 0x00, 0xc9, - 0xe0, 0x02, 0x2a, 0x08, 0xd1, 0x00, 0x01, 0x29, - 0x20, 0x04, 0x40, 0x20, 0xd0, 0x00, 0x08, 0x49, - 0x09, 0x4c, 0x06, 0xc8, 0x0e, 0xc0, 0xd0, 0x00, - 0x34, 0x01, 0x1c, 0x20, 0xb0, 0x01, 0xbc, 0xf0, - 0x47, 0x70, 0xb0, 0x01, 0xe7, 0xfb, 0x00, 0x00, - 0x2e, 0x03, 0x32, 0xa4, 0xb4, 0x80, 0x23, 0x00, - 0x22, 0x01, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x02, - 0xe0, 0x09, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88, - 0x4f, 0x05, 0x58, 0x38, 0x28, 0x00, 0xd0, 0x00, - 0x43, 0x13, 0x00, 0x52, 0xe7, 0xf5, 0x1c, 0x18, - 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0x60, 0xb5, 0xf3, 0x1c, 0x0f, - 0xb0, 0x81, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, - 0x23, 0x18, 0x40, 0x18, 0x90, 0x00, 0x98, 0x00, - 0x28, 0x00, 0xd0, 0x03, 0x48, 0x32, 0x49, 0x33, - 0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, - 0x49, 0x30, 0x60, 0x08, 0x24, 0x00, 0x99, 0x01, - 0x48, 0x2f, 0xf7, 0xfc, 0xfa, 0x1f, 0x48, 0x2e, - 0x68, 0x00, 0x28, 0x00, 0xda, 0x03, 0x20, 0x00, - 0x49, 0x2b, 0x60, 0x08, 0x24, 0x80, 0x48, 0x2a, - 0x68, 0x40, 0x28, 0x00, 0xda, 0x03, 0x20, 0x00, - 0x49, 0x27, 0x60, 0x48, 0x24, 0x80, 0x48, 0x26, - 0x68, 0x80, 0x4b, 0x26, 0x42, 0x98, 0xdd, 0x03, - 0x48, 0x24, 0x49, 0x23, 0x60, 0x88, 0x24, 0x80, - 0x48, 0x21, 0x68, 0xc0, 0x49, 0x1f, 0x68, 0x09, - 0x42, 0x88, 0xd9, 0x04, 0x48, 0x1d, 0x68, 0x00, - 0x49, 0x1d, 0x60, 0xc8, 0x24, 0x80, 0x48, 0x1e, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x27, 0x2f, 0x01, - 0xd1, 0x25, 0x48, 0x19, 0x68, 0x06, 0x48, 0x18, - 0x68, 0x45, 0x23, 0xff, 0x33, 0x68, 0x42, 0x9e, - 0xdd, 0x01, 0x26, 0xff, 0x36, 0x68, 0x48, 0x13, - 0x68, 0x00, 0x08, 0x40, 0x42, 0xa8, 0xd2, 0x02, - 0x48, 0x10, 0x68, 0x00, 0x08, 0x45, 0x48, 0x13, - 0x49, 0x13, 0x65, 0x48, 0x48, 0x13, 0x43, 0x70, - 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, - 0x49, 0x0f, 0x65, 0x88, 0x20, 0x00, 0x49, 0x0e, - 0x65, 0xc8, 0x48, 0x0d, 0x66, 0x05, 0x1c, 0x38, - 0x21, 0x00, 0xf7, 0xfe, 0xff, 0x13, 0x1c, 0x20, - 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x88, - 0x2e, 0x08, 0x7d, 0xa8, 0x00, 0x00, 0x02, 0xcf, - 0x2e, 0x08, 0x7c, 0xc4, 0x00, 0x00, 0x07, 0xfa, - 0xcc, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x60, 0xb6, - 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0xb0, 0x81, - 0x1c, 0x26, 0x69, 0x30, 0x90, 0x00, 0x98, 0x00, - 0x28, 0x13, 0xd1, 0x04, 0x20, 0x75, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x68, 0xf5, - 0x68, 0x38, 0x08, 0x40, 0x00, 0x40, 0x60, 0x38, - 0x68, 0x78, 0x08, 0x40, 0x00, 0x40, 0x60, 0x78, - 0x68, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x02, - 0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8, 0x68, 0xf8, - 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xf8, - 0x38, 0x01, 0x60, 0xf8, 0x1d, 0xf0, 0x30, 0x49, - 0x1c, 0x39, 0xf7, 0xfc, 0xf9, 0x8b, 0x48, 0x1c, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x2d, 0x19, - 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, - 0xe0, 0x04, 0x2d, 0x08, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, - 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xcc, 0x49, 0x13, - 0x20, 0x91, 0xf0, 0x13, 0xfa, 0xeb, 0x28, 0x92, - 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x05, 0xfa, 0xf4, - 0xe7, 0xf5, 0x00, 0xa8, 0x49, 0x0e, 0x58, 0x08, - 0x42, 0xa0, 0xd0, 0x05, 0x20, 0x92, 0x49, 0x0b, - 0x60, 0x08, 0x20, 0xff, 0xb0, 0x01, 0xe7, 0xb7, - 0x48, 0x0a, 0x68, 0x00, 0x42, 0xa0, 0xd1, 0x03, - 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x10, - 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, - 0xb0, 0x01, 0xe7, 0xa9, 0xb0, 0x01, 0xe7, 0xa7, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xc8, - 0x2e, 0x08, 0x7c, 0x60, 0x2e, 0x08, 0x7c, 0xc4, - 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x9b, 0x20, 0x39, + 0x60, 0x78, 0x68, 0x38, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x04, 0x25, 0x80, 0x68, 0x38, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x38, 0x68, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd1, 0x09, 0x25, 0x80, 0x68, 0xb8, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x68, 0xb8, + 0xe0, 0x01, 0x68, 0xb8, 0x38, 0x01, 0x60, 0xb8, + 0x68, 0xb8, 0x68, 0x39, 0x42, 0x88, 0xdc, 0x03, + 0x25, 0x80, 0x68, 0x38, 0x30, 0x01, 0x60, 0xb8, + 0x68, 0x78, 0x68, 0xf9, 0x42, 0x88, 0xdb, 0x03, + 0x25, 0x80, 0x68, 0x78, 0x30, 0x01, 0x60, 0xf8, + 0x1c, 0x28, 0xb0, 0x01, 0xe7, 0xc5, 0xb0, 0x01, + 0xe7, 0xc3, 0x1c, 0x02, 0x21, 0x18, 0xe0, 0x00, + 0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0xb0, 0x81, + 0x68, 0xb8, 0x68, 0x3b, 0x1a, 0xc0, 0x1c, 0x46, + 0x68, 0xf8, 0x68, 0x7b, 0x1a, 0xc0, 0x30, 0x01, + 0x90, 0x00, 0x00, 0x90, 0x4b, 0x15, 0x58, 0x1c, + 0x98, 0x00, 0x43, 0x46, 0x1c, 0x35, 0x07, 0xa0, + 0x0f, 0x80, 0x1c, 0x29, 0x40, 0x81, 0x2a, 0x0b, + 0xdb, 0x01, 0x2a, 0x12, 0xdd, 0x01, 0x2a, 0x13, + 0xd1, 0x01, 0x21, 0x00, 0xe0, 0x0a, 0x2a, 0x09, + 0xd0, 0x01, 0x2a, 0x0a, 0xd1, 0x03, 0x00, 0x69, + 0x19, 0x49, 0x00, 0xc9, 0xe0, 0x02, 0x2a, 0x08, + 0xd1, 0x00, 0x01, 0x29, 0x20, 0x04, 0x40, 0x20, + 0xd0, 0x00, 0x08, 0x49, 0x09, 0x4c, 0x06, 0xc8, + 0x0e, 0xc0, 0xd0, 0x00, 0x34, 0x01, 0x1c, 0x20, + 0xb0, 0x01, 0xbc, 0xf0, 0x47, 0x70, 0xb0, 0x01, + 0xe7, 0xfb, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04, + 0xb4, 0x80, 0x23, 0x00, 0x22, 0x01, 0x21, 0x00, + 0x29, 0x08, 0xdb, 0x02, 0xe0, 0x09, 0x31, 0x01, + 0xe7, 0xfa, 0x00, 0x88, 0x4f, 0x05, 0x58, 0x38, + 0x28, 0x00, 0xd0, 0x00, 0x43, 0x13, 0x00, 0x52, + 0xe7, 0xf5, 0x1c, 0x18, 0xbc, 0x80, 0x47, 0x70, + 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x58, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, 0x23, 0x18, 0x40, 0x18, - 0x90, 0x01, 0x98, 0x01, 0x28, 0x00, 0xd0, 0x03, - 0x48, 0xf8, 0x49, 0xf9, 0x60, 0x08, 0xe0, 0x03, - 0x20, 0xff, 0x30, 0xe0, 0x49, 0xf6, 0x60, 0x08, - 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 0x98, 0x1b, - 0x90, 0x1a, 0x98, 0x1a, 0x69, 0x05, 0x98, 0x1a, - 0x68, 0xc0, 0x90, 0x19, 0x48, 0xf1, 0x68, 0x00, - 0x99, 0x1b, 0x42, 0x88, 0xd1, 0x73, 0x20, 0x02, - 0x90, 0x08, 0x2d, 0x0c, 0xd0, 0x01, 0x2d, 0x0f, - 0xd1, 0x02, 0x20, 0x04, 0x90, 0x08, 0xe0, 0x0c, - 0x2d, 0x0d, 0xd0, 0x01, 0x2d, 0x10, 0xd1, 0x02, - 0x20, 0x08, 0x90, 0x08, 0xe0, 0x05, 0x2d, 0x0e, - 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x01, 0x20, 0x01, - 0x90, 0x08, 0x68, 0xf8, 0x68, 0x79, 0x1a, 0x40, - 0x1c, 0x44, 0x2d, 0x0b, 0xd0, 0x05, 0x2d, 0x0f, - 0xd0, 0x03, 0x2d, 0x10, 0xd0, 0x01, 0x2d, 0x11, - 0xd1, 0x11, 0x48, 0xdf, 0x6c, 0x40, 0x1c, 0x06, - 0x48, 0xdd, 0x6c, 0x81, 0x91, 0x07, 0x2e, 0x00, - 0xd0, 0x02, 0x99, 0x07, 0x29, 0x00, 0xd1, 0x05, - 0x26, 0x2d, 0x01, 0x36, 0x48, 0xd6, 0x68, 0x00, - 0x1c, 0x41, 0x91, 0x07, 0xe0, 0x05, 0x26, 0x2d, - 0x01, 0x36, 0x48, 0xd3, 0x68, 0x00, 0x1c, 0x41, - 0x91, 0x07, 0x49, 0xd4, 0xa8, 0x15, 0xf7, 0xfc, - 0xf8, 0xe9, 0x98, 0x17, 0x1e, 0x71, 0x42, 0x88, - 0xdd, 0x01, 0x1e, 0x70, 0x90, 0x17, 0x98, 0x18, - 0x99, 0x07, 0x39, 0x01, 0x42, 0x88, 0xdd, 0x02, - 0x99, 0x07, 0x1e, 0x48, 0x90, 0x18, 0x98, 0x18, - 0x99, 0x16, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81, - 0x98, 0x08, 0xf0, 0x06, 0xfb, 0xd3, 0x90, 0x0a, - 0x98, 0x0a, 0x42, 0x84, 0xdd, 0x00, 0x9c, 0x0a, - 0x48, 0xc5, 0x6f, 0x00, 0x90, 0x02, 0x20, 0x00, - 0x90, 0x05, 0x98, 0x02, 0x28, 0x02, 0xd0, 0x02, - 0x98, 0x02, 0x28, 0x03, 0xd1, 0x3a, 0x48, 0xc1, - 0x6b, 0x00, 0x90, 0x04, 0x48, 0xbe, 0x6e, 0xc1, - 0x91, 0x03, 0x98, 0x04, 0x99, 0x03, 0x42, 0x88, - 0xdd, 0x21, 0x20, 0xc0, 0x90, 0x06, 0x1d, 0x20, - 0x28, 0x00, 0xda, 0x02, 0xe0, 0x00, 0xe1, 0x8e, - 0x30, 0x07, 0x10, 0xc0, 0x90, 0x05, 0x98, 0x04, - 0x28, 0x03, 0xd0, 0x14, 0x99, 0x03, 0x29, 0x03, - 0xd1, 0x07, 0x20, 0xcd, 0x90, 0x06, 0x1d, 0x61, - 0x20, 0x0a, 0xf0, 0x06, 0xfb, 0xa3, 0x90, 0x05, - 0xe0, 0x09, 0x98, 0x02, 0x28, 0x02, 0xd1, 0x06, - 0x20, 0x9a, 0x90, 0x06, 0x1c, 0xa1, 0x20, 0x05, - 0xf0, 0x06, 0xfb, 0x98, 0x90, 0x05, 0x98, 0x06, - 0x28, 0x9a, 0xd0, 0x02, 0x98, 0x06, 0x28, 0xcd, - 0xd1, 0x08, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, - 0xd1, 0x04, 0x20, 0x00, 0x90, 0x05, 0x20, 0xff, - 0x30, 0x01, 0x90, 0x06, 0x2d, 0x12, 0xd1, 0x0b, - 0x48, 0x9d, 0x68, 0x00, 0x30, 0x01, 0x42, 0xa0, - 0xd1, 0x06, 0x68, 0x78, 0x28, 0x00, 0xd1, 0x03, - 0x20, 0x01, 0x49, 0x9f, 0x63, 0x48, 0xe0, 0x02, - 0x20, 0x00, 0x49, 0x9d, 0x63, 0x48, 0x98, 0x0a, - 0x99, 0x06, 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, - 0x30, 0xff, 0x12, 0x00, 0x42, 0xa0, 0xdd, 0x04, - 0x20, 0x00, 0x90, 0x05, 0x20, 0xff, 0x30, 0x01, - 0x90, 0x06, 0x68, 0x78, 0x99, 0x05, 0x18, 0x40, - 0x60, 0x78, 0x1c, 0x39, 0xa8, 0x11, 0xf7, 0xfc, - 0xf8, 0x61, 0x1c, 0x29, 0xa8, 0x11, 0xf7, 0xff, - 0xfd, 0x71, 0x98, 0x12, 0x49, 0x88, 0x68, 0x09, - 0x39, 0x01, 0x42, 0x88, 0xd1, 0x00, 0x24, 0x00, - 0x99, 0x15, 0x91, 0x0d, 0x98, 0x16, 0x90, 0x0f, - 0x21, 0x00, 0x91, 0x10, 0x68, 0x38, 0x28, 0x00, - 0xda, 0x08, 0x68, 0x38, 0x99, 0x08, 0x43, 0x48, - 0x42, 0x41, 0x29, 0x00, 0xda, 0x00, 0x31, 0x01, - 0x10, 0x49, 0x91, 0x10, 0x68, 0x78, 0x28, 0x00, - 0xda, 0x0d, 0x68, 0x78, 0x99, 0x08, 0x43, 0x48, - 0x28, 0x00, 0xda, 0x00, 0x30, 0x01, 0x10, 0x40, - 0x02, 0x01, 0x98, 0x06, 0xf0, 0x06, 0xfb, 0x36, - 0x99, 0x0f, 0x1a, 0x08, 0x90, 0x0f, 0x98, 0x18, - 0x99, 0x0f, 0x42, 0x88, 0xdc, 0x02, 0x98, 0x18, - 0x30, 0x01, 0x90, 0x0f, 0x98, 0x17, 0x99, 0x0d, - 0x1a, 0x40, 0x30, 0x01, 0x90, 0x0e, 0x98, 0x18, - 0x99, 0x0f, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x09, - 0x98, 0x09, 0x00, 0x41, 0x98, 0x08, 0xf0, 0x06, - 0xfb, 0x1d, 0x99, 0x06, 0x43, 0x48, 0x28, 0x00, - 0xda, 0x00, 0x30, 0xff, 0x12, 0x00, 0x90, 0x09, - 0x68, 0xb8, 0x68, 0x39, 0x1a, 0x40, 0x1c, 0x41, - 0x91, 0x0c, 0x98, 0x17, 0x99, 0x15, 0x1a, 0x40, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x03, + 0x48, 0x32, 0x49, 0x33, 0x60, 0x08, 0xe0, 0x03, + 0x20, 0xff, 0x30, 0xe0, 0x49, 0x30, 0x60, 0x08, + 0x24, 0x00, 0x99, 0x01, 0x48, 0x2f, 0xf7, 0xfc, + 0xfa, 0x1f, 0x48, 0x2e, 0x68, 0x00, 0x28, 0x00, + 0xda, 0x03, 0x20, 0x00, 0x49, 0x2b, 0x60, 0x08, + 0x24, 0x80, 0x48, 0x2a, 0x68, 0x40, 0x28, 0x00, + 0xda, 0x03, 0x20, 0x00, 0x49, 0x27, 0x60, 0x48, + 0x24, 0x80, 0x48, 0x26, 0x68, 0x80, 0x4b, 0x26, + 0x42, 0x98, 0xdd, 0x03, 0x48, 0x24, 0x49, 0x23, + 0x60, 0x88, 0x24, 0x80, 0x48, 0x21, 0x68, 0xc0, + 0x49, 0x1f, 0x68, 0x09, 0x42, 0x88, 0xd9, 0x04, + 0x48, 0x1d, 0x68, 0x00, 0x49, 0x1d, 0x60, 0xc8, + 0x24, 0x80, 0x48, 0x1e, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x27, 0x2f, 0x01, 0xd1, 0x25, 0x48, 0x19, + 0x68, 0x06, 0x48, 0x18, 0x68, 0x45, 0x23, 0xff, + 0x33, 0x68, 0x42, 0x9e, 0xdd, 0x01, 0x26, 0xff, + 0x36, 0x68, 0x48, 0x13, 0x68, 0x00, 0x08, 0x40, + 0x42, 0xa8, 0xd2, 0x02, 0x48, 0x10, 0x68, 0x00, + 0x08, 0x45, 0x48, 0x13, 0x49, 0x13, 0x65, 0x48, + 0x48, 0x13, 0x43, 0x70, 0x23, 0x01, 0x04, 0x1b, + 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x88, + 0x20, 0x00, 0x49, 0x0e, 0x65, 0xc8, 0x48, 0x0d, + 0x66, 0x05, 0x1c, 0x38, 0x21, 0x00, 0xf7, 0xfe, + 0xff, 0x13, 0x1c, 0x20, 0xb0, 0x01, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, + 0xe7, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3f, + 0x2e, 0x08, 0x60, 0x80, 0x2e, 0x08, 0x7d, 0xa0, + 0x00, 0x00, 0x02, 0xcf, 0x2e, 0x08, 0x7c, 0xbc, + 0x00, 0x00, 0x07, 0xfa, 0xcc, 0x00, 0x00, 0x00, + 0x00, 0x0b, 0x60, 0xb6, 0xb5, 0xf0, 0x1c, 0x04, + 0x1c, 0x0f, 0xb0, 0x81, 0x1c, 0x26, 0x69, 0x30, + 0x90, 0x00, 0x98, 0x00, 0x28, 0x13, 0xd1, 0x04, + 0x20, 0x75, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x68, 0xf5, 0x68, 0x38, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x38, 0x68, 0x78, 0x08, 0x40, + 0x00, 0x40, 0x60, 0x78, 0x68, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd1, 0x02, 0x68, 0xb8, 0x38, 0x01, + 0x60, 0xb8, 0x68, 0xf8, 0x07, 0xc0, 0x0f, 0xc0, + 0xd1, 0x02, 0x68, 0xf8, 0x38, 0x01, 0x60, 0xf8, + 0x1d, 0xf0, 0x30, 0x49, 0x1c, 0x39, 0xf7, 0xfc, + 0xf9, 0x8b, 0x48, 0x1c, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x2d, 0x19, 0xd3, 0x01, 0x20, 0x01, + 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x04, 0x2d, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x01, + 0xe7, 0xcc, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x13, + 0xfb, 0x0d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x05, 0xfa, 0xf4, 0xe7, 0xf5, 0x00, 0xa8, + 0x49, 0x0e, 0x58, 0x08, 0x42, 0xa0, 0xd0, 0x05, + 0x20, 0x92, 0x49, 0x0b, 0x60, 0x08, 0x20, 0xff, + 0xb0, 0x01, 0xe7, 0xb7, 0x48, 0x0a, 0x68, 0x00, + 0x42, 0xa0, 0xd1, 0x03, 0x1c, 0x39, 0x1c, 0x20, + 0xf0, 0x00, 0xf8, 0x10, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xa9, + 0xb0, 0x01, 0xe7, 0xa7, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc0, 0x2e, 0x08, 0x7c, 0x58, + 0x2e, 0x08, 0x7c, 0xbc, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x9b, 0x20, 0x39, 0x06, 0x40, 0x69, 0xc0, + 0x23, 0x18, 0x40, 0x18, 0x90, 0x01, 0x98, 0x01, + 0x28, 0x00, 0xd0, 0x03, 0x48, 0xf8, 0x49, 0xf9, + 0x60, 0x08, 0xe0, 0x03, 0x20, 0xff, 0x30, 0xe0, + 0x49, 0xf6, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x90, 0x06, 0x98, 0x1b, 0x90, 0x1a, 0x98, 0x1a, + 0x69, 0x05, 0x98, 0x1a, 0x68, 0xc0, 0x90, 0x19, + 0x48, 0xf1, 0x68, 0x00, 0x99, 0x1b, 0x42, 0x88, + 0xd1, 0x73, 0x20, 0x02, 0x90, 0x08, 0x2d, 0x0c, + 0xd0, 0x01, 0x2d, 0x0f, 0xd1, 0x02, 0x20, 0x04, + 0x90, 0x08, 0xe0, 0x0c, 0x2d, 0x0d, 0xd0, 0x01, + 0x2d, 0x10, 0xd1, 0x02, 0x20, 0x08, 0x90, 0x08, + 0xe0, 0x05, 0x2d, 0x0e, 0xd0, 0x01, 0x2d, 0x11, + 0xd1, 0x01, 0x20, 0x01, 0x90, 0x08, 0x68, 0xf8, + 0x68, 0x79, 0x1a, 0x40, 0x1c, 0x44, 0x2d, 0x0b, + 0xd0, 0x05, 0x2d, 0x0f, 0xd0, 0x03, 0x2d, 0x10, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x11, 0x48, 0xdf, + 0x6c, 0x40, 0x1c, 0x06, 0x48, 0xdd, 0x6c, 0x81, + 0x91, 0x07, 0x2e, 0x00, 0xd0, 0x02, 0x99, 0x07, + 0x29, 0x00, 0xd1, 0x05, 0x26, 0x2d, 0x01, 0x36, + 0x48, 0xd6, 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, + 0xe0, 0x05, 0x26, 0x2d, 0x01, 0x36, 0x48, 0xd3, + 0x68, 0x00, 0x1c, 0x41, 0x91, 0x07, 0x49, 0xd4, + 0xa8, 0x15, 0xf7, 0xfc, 0xf8, 0xe9, 0x98, 0x17, + 0x1e, 0x71, 0x42, 0x88, 0xdd, 0x01, 0x1e, 0x70, + 0x90, 0x17, 0x98, 0x18, 0x99, 0x07, 0x39, 0x01, + 0x42, 0x88, 0xdd, 0x02, 0x99, 0x07, 0x1e, 0x48, + 0x90, 0x18, 0x98, 0x18, 0x99, 0x16, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81, 0x98, 0x08, 0xf0, 0x06, - 0xfb, 0x09, 0x90, 0x0b, 0x98, 0x0b, 0x4b, 0x65, - 0x40, 0x18, 0x90, 0x0b, 0x98, 0x0b, 0x99, 0x08, - 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 0x30, 0x01, - 0x10, 0x40, 0x90, 0x0e, 0x99, 0x0c, 0x98, 0x0b, - 0x42, 0x81, 0xdd, 0x01, 0x98, 0x0b, 0x90, 0x0c, - 0x99, 0x0c, 0x4b, 0x5c, 0x40, 0x19, 0x91, 0x0c, - 0x98, 0x0c, 0x28, 0x00, 0xdd, 0x05, 0x68, 0x38, - 0x99, 0x0c, 0x18, 0x40, 0x38, 0x01, 0x90, 0x13, - 0xe0, 0x02, 0x68, 0x38, 0x30, 0x01, 0x90, 0x13, - 0x98, 0x13, 0x28, 0x01, 0xda, 0x01, 0x20, 0x01, - 0x90, 0x13, 0x98, 0x13, 0x4b, 0x52, 0x42, 0x98, - 0xdd, 0x01, 0x48, 0x51, 0x90, 0x13, 0x99, 0x06, - 0x43, 0x4c, 0x1c, 0x20, 0x28, 0x00, 0xda, 0x00, - 0x30, 0xff, 0x12, 0x04, 0x98, 0x0a, 0x42, 0x84, - 0xdd, 0x00, 0x9c, 0x0a, 0x2c, 0x02, 0xda, 0x00, - 0x24, 0x02, 0x68, 0x78, 0x19, 0x00, 0x38, 0x01, - 0x90, 0x14, 0x98, 0x14, 0x28, 0x01, 0xda, 0x01, - 0x20, 0x01, 0x90, 0x14, 0x98, 0x14, 0x49, 0x3c, - 0x68, 0x09, 0x42, 0x88, 0xd9, 0x02, 0x48, 0x3a, - 0x68, 0x00, 0x90, 0x14, 0x98, 0x12, 0x49, 0x38, - 0x68, 0x09, 0x39, 0x01, 0x42, 0x88, 0xd9, 0x03, - 0x48, 0x35, 0x68, 0x00, 0x38, 0x01, 0x90, 0x12, - 0x98, 0x09, 0x28, 0x04, 0xdb, 0x01, 0x2c, 0x04, - 0xda, 0x01, 0x20, 0x00, 0x90, 0x0e, 0x98, 0x0e, - 0x28, 0x03, 0xdb, 0x02, 0x98, 0x0c, 0x28, 0x04, - 0xda, 0x09, 0x20, 0x00, 0x90, 0x0e, 0x48, 0x35, - 0x90, 0x11, 0x48, 0x33, 0x90, 0x13, 0x20, 0x00, - 0x90, 0x12, 0x20, 0x01, 0x90, 0x14, 0x21, 0x00, - 0x91, 0x00, 0x98, 0x08, 0x28, 0x01, 0xd1, 0x16, - 0x98, 0x0e, 0x99, 0x10, 0x1a, 0x40, 0x00, 0x40, - 0x4b, 0x2b, 0x42, 0x98, 0xdd, 0x0b, 0x98, 0x0e, - 0x99, 0x10, 0x1a, 0x40, 0x00, 0x40, 0x23, 0x2d, - 0x01, 0x1b, 0x1a, 0xc1, 0x29, 0x00, 0xda, 0x00, - 0x31, 0x01, 0x10, 0x49, 0x91, 0x00, 0x98, 0x0e, - 0x42, 0xb0, 0xdd, 0x00, 0x96, 0x0e, 0x99, 0x10, - 0x42, 0xb1, 0xdd, 0x00, 0x96, 0x10, 0x1c, 0x30, - 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x76, - 0x99, 0x0d, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, - 0x18, 0xc0, 0x14, 0x40, 0x49, 0x1c, 0x65, 0x88, - 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, - 0xfa, 0x69, 0x99, 0x10, 0x43, 0x48, 0x23, 0x01, - 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 0x49, 0x16, - 0x65, 0xc8, 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, - 0xf0, 0x06, 0xfa, 0x5c, 0x99, 0x0e, 0x43, 0x48, + 0xfb, 0xd3, 0x90, 0x0a, 0x98, 0x0a, 0x42, 0x84, + 0xdd, 0x00, 0x9c, 0x0a, 0x48, 0xc5, 0x6f, 0x00, + 0x90, 0x02, 0x20, 0x00, 0x90, 0x05, 0x98, 0x02, + 0x28, 0x02, 0xd0, 0x02, 0x98, 0x02, 0x28, 0x03, + 0xd1, 0x3a, 0x48, 0xc1, 0x6b, 0x00, 0x90, 0x04, + 0x48, 0xbe, 0x6e, 0xc1, 0x91, 0x03, 0x98, 0x04, + 0x99, 0x03, 0x42, 0x88, 0xdd, 0x21, 0x20, 0xc0, + 0x90, 0x06, 0x1d, 0x20, 0x28, 0x00, 0xda, 0x02, + 0xe0, 0x00, 0xe1, 0x8e, 0x30, 0x07, 0x10, 0xc0, + 0x90, 0x05, 0x98, 0x04, 0x28, 0x03, 0xd0, 0x14, + 0x99, 0x03, 0x29, 0x03, 0xd1, 0x07, 0x20, 0xcd, + 0x90, 0x06, 0x1d, 0x61, 0x20, 0x0a, 0xf0, 0x06, + 0xfb, 0xa3, 0x90, 0x05, 0xe0, 0x09, 0x98, 0x02, + 0x28, 0x02, 0xd1, 0x06, 0x20, 0x9a, 0x90, 0x06, + 0x1c, 0xa1, 0x20, 0x05, 0xf0, 0x06, 0xfb, 0x98, + 0x90, 0x05, 0x98, 0x06, 0x28, 0x9a, 0xd0, 0x02, + 0x98, 0x06, 0x28, 0xcd, 0xd1, 0x08, 0x2d, 0x0e, + 0xd0, 0x01, 0x2d, 0x11, 0xd1, 0x04, 0x20, 0x00, + 0x90, 0x05, 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, + 0x2d, 0x12, 0xd1, 0x0b, 0x48, 0x9d, 0x68, 0x00, + 0x30, 0x01, 0x42, 0xa0, 0xd1, 0x06, 0x68, 0x78, + 0x28, 0x00, 0xd1, 0x03, 0x20, 0x01, 0x49, 0x9f, + 0x63, 0x48, 0xe0, 0x02, 0x20, 0x00, 0x49, 0x9d, + 0x63, 0x48, 0x98, 0x0a, 0x99, 0x06, 0x43, 0x48, + 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x00, + 0x42, 0xa0, 0xdd, 0x04, 0x20, 0x00, 0x90, 0x05, + 0x20, 0xff, 0x30, 0x01, 0x90, 0x06, 0x68, 0x78, + 0x99, 0x05, 0x18, 0x40, 0x60, 0x78, 0x1c, 0x39, + 0xa8, 0x11, 0xf7, 0xfc, 0xf8, 0x61, 0x1c, 0x29, + 0xa8, 0x11, 0xf7, 0xff, 0xfd, 0x71, 0x98, 0x12, + 0x49, 0x88, 0x68, 0x09, 0x39, 0x01, 0x42, 0x88, + 0xd1, 0x00, 0x24, 0x00, 0x99, 0x15, 0x91, 0x0d, + 0x98, 0x16, 0x90, 0x0f, 0x21, 0x00, 0x91, 0x10, + 0x68, 0x38, 0x28, 0x00, 0xda, 0x08, 0x68, 0x38, + 0x99, 0x08, 0x43, 0x48, 0x42, 0x41, 0x29, 0x00, + 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, 0x91, 0x10, + 0x68, 0x78, 0x28, 0x00, 0xda, 0x0d, 0x68, 0x78, + 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, + 0x30, 0x01, 0x10, 0x40, 0x02, 0x01, 0x98, 0x06, + 0xf0, 0x06, 0xfb, 0x36, 0x99, 0x0f, 0x1a, 0x08, + 0x90, 0x0f, 0x98, 0x18, 0x99, 0x0f, 0x42, 0x88, + 0xdc, 0x02, 0x98, 0x18, 0x30, 0x01, 0x90, 0x0f, + 0x98, 0x17, 0x99, 0x0d, 0x1a, 0x40, 0x30, 0x01, + 0x90, 0x0e, 0x98, 0x18, 0x99, 0x0f, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x09, 0x98, 0x09, 0x00, 0x41, + 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x1d, 0x99, 0x06, + 0x43, 0x48, 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, + 0x12, 0x00, 0x90, 0x09, 0x68, 0xb8, 0x68, 0x39, + 0x1a, 0x40, 0x1c, 0x41, 0x91, 0x0c, 0x98, 0x17, + 0x99, 0x15, 0x1a, 0x40, 0x00, 0x40, 0x1c, 0x81, + 0x98, 0x08, 0xf0, 0x06, 0xfb, 0x09, 0x90, 0x0b, + 0x98, 0x0b, 0x4b, 0x65, 0x40, 0x18, 0x90, 0x0b, + 0x98, 0x0b, 0x99, 0x08, 0x43, 0x48, 0x28, 0x00, + 0xda, 0x00, 0x30, 0x01, 0x10, 0x40, 0x90, 0x0e, + 0x99, 0x0c, 0x98, 0x0b, 0x42, 0x81, 0xdd, 0x01, + 0x98, 0x0b, 0x90, 0x0c, 0x99, 0x0c, 0x4b, 0x5c, + 0x40, 0x19, 0x91, 0x0c, 0x98, 0x0c, 0x28, 0x00, + 0xdd, 0x05, 0x68, 0x38, 0x99, 0x0c, 0x18, 0x40, + 0x38, 0x01, 0x90, 0x13, 0xe0, 0x02, 0x68, 0x38, + 0x30, 0x01, 0x90, 0x13, 0x98, 0x13, 0x28, 0x01, + 0xda, 0x01, 0x20, 0x01, 0x90, 0x13, 0x98, 0x13, + 0x4b, 0x52, 0x42, 0x98, 0xdd, 0x01, 0x48, 0x51, + 0x90, 0x13, 0x99, 0x06, 0x43, 0x4c, 0x1c, 0x20, + 0x28, 0x00, 0xda, 0x00, 0x30, 0xff, 0x12, 0x04, + 0x98, 0x0a, 0x42, 0x84, 0xdd, 0x00, 0x9c, 0x0a, + 0x2c, 0x02, 0xda, 0x00, 0x24, 0x02, 0x68, 0x78, + 0x19, 0x00, 0x38, 0x01, 0x90, 0x14, 0x98, 0x14, + 0x28, 0x01, 0xda, 0x01, 0x20, 0x01, 0x90, 0x14, + 0x98, 0x14, 0x49, 0x3c, 0x68, 0x09, 0x42, 0x88, + 0xd9, 0x02, 0x48, 0x3a, 0x68, 0x00, 0x90, 0x14, + 0x98, 0x12, 0x49, 0x38, 0x68, 0x09, 0x39, 0x01, + 0x42, 0x88, 0xd9, 0x03, 0x48, 0x35, 0x68, 0x00, + 0x38, 0x01, 0x90, 0x12, 0x98, 0x09, 0x28, 0x04, + 0xdb, 0x01, 0x2c, 0x04, 0xda, 0x01, 0x20, 0x00, + 0x90, 0x0e, 0x98, 0x0e, 0x28, 0x03, 0xdb, 0x02, + 0x98, 0x0c, 0x28, 0x04, 0xda, 0x09, 0x20, 0x00, + 0x90, 0x0e, 0x48, 0x35, 0x90, 0x11, 0x48, 0x33, + 0x90, 0x13, 0x20, 0x00, 0x90, 0x12, 0x20, 0x01, + 0x90, 0x14, 0x21, 0x00, 0x91, 0x00, 0x98, 0x08, + 0x28, 0x01, 0xd1, 0x16, 0x98, 0x0e, 0x99, 0x10, + 0x1a, 0x40, 0x00, 0x40, 0x4b, 0x2b, 0x42, 0x98, + 0xdd, 0x0b, 0x98, 0x0e, 0x99, 0x10, 0x1a, 0x40, + 0x00, 0x40, 0x23, 0x2d, 0x01, 0x1b, 0x1a, 0xc1, + 0x29, 0x00, 0xda, 0x00, 0x31, 0x01, 0x10, 0x49, + 0x91, 0x00, 0x98, 0x0e, 0x42, 0xb0, 0xdd, 0x00, + 0x96, 0x0e, 0x99, 0x10, 0x42, 0xb1, 0xdd, 0x00, + 0x96, 0x10, 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, + 0xf0, 0x06, 0xfa, 0x76, 0x99, 0x0d, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, - 0x49, 0x0f, 0x65, 0x48, 0x99, 0x07, 0x1f, 0x08, - 0x99, 0x0f, 0x42, 0x88, 0xdc, 0x1b, 0x99, 0x07, - 0x1f, 0x08, 0xe0, 0x17, 0x00, 0x00, 0x02, 0x3f, - 0x2e, 0x08, 0x60, 0x88, 0x2e, 0x08, 0x7c, 0xc4, - 0xcc, 0x00, 0x02, 0x00, 0x2e, 0x08, 0x7d, 0xa8, - 0xcc, 0x00, 0x0f, 0x80, 0xcc, 0x00, 0x00, 0x80, - 0xcc, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff, 0xfe, - 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 0xce, - 0xcc, 0x00, 0x00, 0x00, 0x90, 0x0f, 0x98, 0x0f, - 0x49, 0x0d, 0x66, 0x08, 0x1c, 0x30, 0x21, 0x01, - 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x2b, 0x99, 0x00, + 0x49, 0x1c, 0x65, 0x88, 0x1c, 0x30, 0x21, 0x01, + 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x69, 0x99, 0x10, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, 0x18, 0xc0, - 0x14, 0x40, 0x49, 0x07, 0x66, 0x48, 0xa9, 0x11, - 0x1c, 0x38, 0xf7, 0xfb, 0xff, 0x1f, 0x20, 0x00, - 0xb0, 0x1b, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xb0, 0x1b, 0xe7, 0xf9, 0x00, 0x00, - 0xcc, 0x00, 0x00, 0x00, 0xb4, 0xb0, 0x1c, 0x02, - 0x1c, 0x0f, 0x2a, 0x00, 0xd1, 0x02, 0x20, 0x01, - 0xbc, 0xb0, 0x47, 0x70, 0x2f, 0x01, 0xd1, 0x20, - 0x20, 0x00, 0x23, 0x00, 0x4d, 0x13, 0x62, 0x2b, - 0x23, 0x00, 0x4d, 0x12, 0x62, 0xab, 0x4b, 0x12, - 0x68, 0x9b, 0x1c, 0x1c, 0x4b, 0x11, 0x6e, 0xdb, - 0x1c, 0x19, 0x2c, 0x02, 0xd0, 0x01, 0x29, 0x02, - 0xd1, 0x01, 0x20, 0x08, 0xe0, 0x00, 0x20, 0x07, - 0x79, 0x13, 0x2b, 0x00, 0xd0, 0x01, 0x23, 0x10, - 0x43, 0x18, 0x4b, 0x08, 0x62, 0x58, 0x79, 0x55, - 0x23, 0x80, 0x43, 0x2b, 0x4d, 0x05, 0x62, 0xab, - 0xe0, 0x05, 0x48, 0x07, 0x68, 0x05, 0x23, 0x80, - 0x43, 0x9d, 0x1c, 0x2b, 0x60, 0x03, 0x20, 0x00, - 0xe7, 0xd2, 0xe7, 0xd1, 0x72, 0x00, 0x01, 0x00, - 0xcc, 0x00, 0x0c, 0x00, 0xcc, 0x00, 0x0f, 0x80, - 0x72, 0x00, 0x01, 0x28, 0xb5, 0xff, 0x9f, 0x09, - 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, - 0x90, 0x00, 0x99, 0x02, 0x06, 0x0c, 0x0e, 0x24, - 0x98, 0x03, 0x06, 0x02, 0x0e, 0x12, 0x9b, 0x04, - 0x06, 0x1d, 0x0e, 0x2d, 0x2f, 0x01, 0xd1, 0x1b, - 0x20, 0x00, 0x4b, 0x14, 0x62, 0x18, 0x20, 0x00, - 0x4b, 0x12, 0x62, 0x98, 0x98, 0x00, 0x07, 0x00, - 0x0f, 0x00, 0x01, 0x23, 0x43, 0x18, 0x06, 0x01, - 0x0e, 0x09, 0x48, 0x0e, 0x62, 0x41, 0x07, 0x50, - 0x0f, 0x40, 0x07, 0x6b, 0x0f, 0x5b, 0x00, 0xdb, - 0x43, 0x18, 0x06, 0x01, 0x0e, 0x09, 0x20, 0x80, - 0x43, 0x08, 0x4b, 0x08, 0x62, 0x98, 0xe0, 0x05, - 0x48, 0x07, 0x68, 0x06, 0x23, 0x80, 0x43, 0x9e, - 0x1c, 0x33, 0x60, 0x03, 0x20, 0x00, 0xb0, 0x01, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb0, 0x01, 0xe7, 0xf9, 0x72, 0x00, 0x01, 0x00, - 0x72, 0x00, 0x01, 0x28, 0xb5, 0xf1, 0x98, 0x00, - 0x06, 0x07, 0x0e, 0x3f, 0xb0, 0x81, 0x2f, 0x1f, - 0xdb, 0x05, 0x20, 0xb3, 0xb0, 0x01, 0xb0, 0x01, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x62, - 0x23, 0x80, 0x68, 0x1b, 0x60, 0x18, 0x48, 0x61, - 0x23, 0x80, 0x6b, 0x1b, 0x60, 0x18, 0x48, 0x60, - 0x23, 0x80, 0x6b, 0x5b, 0x60, 0x18, 0x48, 0x5f, - 0x23, 0x80, 0x6b, 0x9b, 0x60, 0x18, 0x20, 0x01, - 0x40, 0xb8, 0x4b, 0x59, 0x60, 0x18, 0x20, 0x00, - 0x4b, 0x57, 0x71, 0x18, 0x20, 0x00, 0x4b, 0x56, - 0x71, 0x58, 0x48, 0x55, 0x68, 0x00, 0x4b, 0x58, - 0x60, 0x58, 0x48, 0x58, 0x4b, 0x56, 0x60, 0x98, - 0x48, 0x57, 0x4b, 0x55, 0x60, 0xd8, 0x20, 0xff, - 0x30, 0x01, 0x4b, 0x53, 0x62, 0x18, 0x20, 0xff, - 0x30, 0x01, 0x4b, 0x51, 0x62, 0x58, 0x20, 0x03, - 0x4b, 0x52, 0x75, 0x18, 0x20, 0x0e, 0x4b, 0x51, - 0x75, 0x58, 0x20, 0x04, 0x4b, 0x4f, 0x75, 0x98, - 0x20, 0x03, 0x4b, 0x4e, 0x75, 0xd8, 0x20, 0x00, - 0x4b, 0x4d, 0x60, 0x18, 0x20, 0x00, 0x4b, 0x4d, - 0x60, 0x18, 0x20, 0x0d, 0x23, 0x19, 0x06, 0x9b, - 0x63, 0x18, 0x22, 0x00, 0x2a, 0x20, 0xdb, 0x04, - 0xe0, 0x21, 0x1c, 0x50, 0x06, 0x02, 0x0e, 0x12, - 0xe7, 0xf8, 0x25, 0x00, 0x00, 0x93, 0x4e, 0x46, - 0x50, 0xf5, 0x25, 0xff, 0x4b, 0x45, 0x54, 0x9d, - 0x01, 0x15, 0x4b, 0x45, 0x18, 0xec, 0x01, 0x15, - 0x4b, 0x44, 0x18, 0xe8, 0x25, 0x00, 0xc4, 0x20, + 0x14, 0x40, 0x49, 0x16, 0x65, 0xc8, 0x1c, 0x30, + 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, 0xfa, 0x5c, + 0x99, 0x0e, 0x43, 0x48, 0x23, 0x01, 0x04, 0x1b, + 0x18, 0xc0, 0x14, 0x40, 0x49, 0x0f, 0x65, 0x48, + 0x99, 0x07, 0x1f, 0x08, 0x99, 0x0f, 0x42, 0x88, + 0xdc, 0x1b, 0x99, 0x07, 0x1f, 0x08, 0xe0, 0x17, + 0x00, 0x00, 0x02, 0x3f, 0x2e, 0x08, 0x60, 0x80, + 0x2e, 0x08, 0x7c, 0xbc, 0xcc, 0x00, 0x02, 0x00, + 0x2e, 0x08, 0x7d, 0xa0, 0xcc, 0x00, 0x0f, 0x80, + 0xcc, 0x00, 0x00, 0x80, 0xcc, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x02, 0xcf, + 0x00, 0x00, 0x02, 0xce, 0xcc, 0x00, 0x00, 0x00, + 0x90, 0x0f, 0x98, 0x0f, 0x49, 0x0d, 0x66, 0x08, + 0x1c, 0x30, 0x21, 0x01, 0x07, 0x49, 0xf0, 0x06, + 0xfa, 0x2b, 0x99, 0x00, 0x43, 0x48, 0x23, 0x01, + 0x04, 0x1b, 0x18, 0xc0, 0x14, 0x40, 0x49, 0x07, + 0x66, 0x48, 0xa9, 0x11, 0x1c, 0x38, 0xf7, 0xfb, + 0xff, 0x1f, 0x20, 0x00, 0xb0, 0x1b, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x1b, + 0xe7, 0xf9, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, + 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x2a, 0x00, + 0xd1, 0x02, 0x20, 0x01, 0xbc, 0xb0, 0x47, 0x70, + 0x2f, 0x01, 0xd1, 0x20, 0x20, 0x00, 0x23, 0x00, + 0x4d, 0x13, 0x62, 0x2b, 0x23, 0x00, 0x4d, 0x12, + 0x62, 0xab, 0x4b, 0x12, 0x68, 0x9b, 0x1c, 0x1c, + 0x4b, 0x11, 0x6e, 0xdb, 0x1c, 0x19, 0x2c, 0x02, + 0xd0, 0x01, 0x29, 0x02, 0xd1, 0x01, 0x20, 0x08, + 0xe0, 0x00, 0x20, 0x07, 0x79, 0x13, 0x2b, 0x00, + 0xd0, 0x01, 0x23, 0x10, 0x43, 0x18, 0x4b, 0x08, + 0x62, 0x58, 0x79, 0x55, 0x23, 0x80, 0x43, 0x2b, + 0x4d, 0x05, 0x62, 0xab, 0xe0, 0x05, 0x48, 0x07, + 0x68, 0x05, 0x23, 0x80, 0x43, 0x9d, 0x1c, 0x2b, + 0x60, 0x03, 0x20, 0x00, 0xe7, 0xd2, 0xe7, 0xd1, + 0x72, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x0c, 0x00, + 0xcc, 0x00, 0x0f, 0x80, 0x72, 0x00, 0x01, 0x28, + 0xb5, 0xff, 0x9f, 0x09, 0xb0, 0x81, 0x98, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, + 0x06, 0x0c, 0x0e, 0x24, 0x98, 0x03, 0x06, 0x02, + 0x0e, 0x12, 0x9b, 0x04, 0x06, 0x1d, 0x0e, 0x2d, + 0x2f, 0x01, 0xd1, 0x1b, 0x20, 0x00, 0x4b, 0x14, + 0x62, 0x18, 0x20, 0x00, 0x4b, 0x12, 0x62, 0x98, + 0x98, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x01, 0x23, + 0x43, 0x18, 0x06, 0x01, 0x0e, 0x09, 0x48, 0x0e, + 0x62, 0x41, 0x07, 0x50, 0x0f, 0x40, 0x07, 0x6b, + 0x0f, 0x5b, 0x00, 0xdb, 0x43, 0x18, 0x06, 0x01, + 0x0e, 0x09, 0x20, 0x80, 0x43, 0x08, 0x4b, 0x08, + 0x62, 0x98, 0xe0, 0x05, 0x48, 0x07, 0x68, 0x06, + 0x23, 0x80, 0x43, 0x9e, 0x1c, 0x33, 0x60, 0x03, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x72, 0x00, 0x01, 0x00, 0x72, 0x00, 0x01, 0x28, + 0xb5, 0xf1, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, + 0xb0, 0x81, 0x2f, 0x1f, 0xdb, 0x05, 0x20, 0xb3, + 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x62, 0x23, 0x80, 0x68, 0x1b, + 0x60, 0x18, 0x48, 0x61, 0x23, 0x80, 0x6b, 0x1b, + 0x60, 0x18, 0x48, 0x60, 0x23, 0x80, 0x6b, 0x5b, + 0x60, 0x18, 0x48, 0x5f, 0x23, 0x80, 0x6b, 0x9b, + 0x60, 0x18, 0x20, 0x01, 0x40, 0xb8, 0x4b, 0x59, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x57, 0x71, 0x18, + 0x20, 0x00, 0x4b, 0x56, 0x71, 0x58, 0x48, 0x55, + 0x68, 0x00, 0x4b, 0x58, 0x60, 0x58, 0x48, 0x58, + 0x4b, 0x56, 0x60, 0x98, 0x48, 0x57, 0x4b, 0x55, + 0x60, 0xd8, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x53, + 0x62, 0x18, 0x20, 0xff, 0x30, 0x01, 0x4b, 0x51, + 0x62, 0x58, 0x20, 0x03, 0x4b, 0x52, 0x75, 0x18, + 0x20, 0x0e, 0x4b, 0x51, 0x75, 0x58, 0x20, 0x04, + 0x4b, 0x4f, 0x75, 0x98, 0x20, 0x03, 0x4b, 0x4e, + 0x75, 0xd8, 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x4d, 0x60, 0x18, 0x20, 0x0d, + 0x23, 0x19, 0x06, 0x9b, 0x63, 0x18, 0x22, 0x00, + 0x2a, 0x20, 0xdb, 0x04, 0xe0, 0x21, 0x1c, 0x50, + 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x25, 0x00, + 0x00, 0x93, 0x4e, 0x46, 0x50, 0xf5, 0x25, 0xff, + 0x4b, 0x45, 0x54, 0x9d, 0x01, 0x15, 0x4b, 0x45, + 0x18, 0xec, 0x01, 0x15, 0x4b, 0x44, 0x18, 0xe8, + 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc4, 0x20, - 0x25, 0x00, 0xc4, 0x20, 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, - 0x25, 0x00, 0xc0, 0x20, 0xe7, 0xdd, 0x21, 0x00, - 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x0b, 0x1c, 0x48, - 0x04, 0x01, 0x0c, 0x09, 0xe7, 0xf8, 0x23, 0x00, - 0x00, 0x88, 0x4c, 0x2a, 0x50, 0x23, 0x23, 0x00, - 0x48, 0x35, 0x54, 0x43, 0xe7, 0xf3, 0x4c, 0x35, - 0x94, 0x00, 0x22, 0x00, 0x2a, 0x10, 0xdb, 0x04, - 0xe0, 0x0f, 0x1c, 0x50, 0x06, 0x02, 0x0e, 0x12, - 0xe7, 0xf8, 0x20, 0x00, 0x00, 0x93, 0x4c, 0x30, - 0x50, 0xe0, 0x23, 0xff, 0x48, 0x2f, 0x54, 0x83, - 0x20, 0x00, 0x00, 0x93, 0x9c, 0x00, 0x50, 0xe0, - 0xe7, 0xef, 0x21, 0x00, 0x23, 0xff, 0x33, 0x01, - 0x42, 0x99, 0xdb, 0x04, 0xe0, 0x2a, 0x1c, 0x48, - 0x04, 0x01, 0x0c, 0x09, 0xe7, 0xf6, 0x23, 0x00, - 0x00, 0x88, 0x4c, 0x1a, 0x50, 0x23, 0x20, 0x00, - 0x00, 0x8b, 0x4c, 0x18, 0x19, 0x1c, 0x23, 0x01, - 0x02, 0x9b, 0x18, 0xe3, 0x60, 0x18, 0x20, 0x00, - 0x4b, 0x14, 0x18, 0x5c, 0x23, 0x01, 0x02, 0xdb, - 0x18, 0xe3, 0x70, 0x18, 0x20, 0x00, 0x00, 0x8b, - 0x4c, 0x11, 0x50, 0xe0, 0x20, 0x00, 0x00, 0x8b, - 0x4c, 0x0f, 0x19, 0x1c, 0x23, 0x01, 0x02, 0x9b, - 0x18, 0xe3, 0x60, 0x18, 0x20, 0x00, 0x4b, 0x0c, - 0x18, 0x5c, 0x23, 0x01, 0x02, 0xdb, 0x18, 0xe3, - 0x70, 0x18, 0xe7, 0xd4, 0x20, 0x00, 0xb0, 0x01, - 0xe7, 0x39, 0xb0, 0x01, 0xe7, 0x37, 0x00, 0x00, - 0x2e, 0x08, 0x72, 0xf4, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x72, 0x98, 0x2e, 0x08, 0x72, 0xa4, - 0x9e, 0x00, 0x04, 0x80, 0x2e, 0x08, 0x60, 0x98, - 0x2e, 0x08, 0x69, 0x98, 0x9e, 0x00, 0x04, 0xa0, - 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5e, 0xe8, - 0x2e, 0x08, 0x5e, 0xec, 0x2e, 0x08, 0x5f, 0xac, - 0x64, 0x00, 0x08, 0x00, 0x64, 0x00, 0x10, 0x00, - 0x2e, 0x08, 0x7b, 0xfc, 0x9e, 0x00, 0x04, 0xb8, - 0x2e, 0x08, 0x5f, 0x6c, 0x2e, 0x08, 0x5f, 0xcc, - 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x11, - 0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, - 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4b, 0x0a, - 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x01, 0x20, 0xb0, - 0xe7, 0xf6, 0x68, 0xe8, 0x1c, 0x04, 0xd1, 0x01, - 0x20, 0xb6, 0xe7, 0xf1, 0x68, 0x60, 0x00, 0x43, - 0x18, 0x18, 0x01, 0x80, 0x08, 0x80, 0x60, 0x38, - 0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x64, 0xb5, 0xff, 0xb0, 0x82, - 0x9a, 0x04, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, - 0x9b, 0x05, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, - 0xb0, 0x83, 0x99, 0x03, 0x29, 0x20, 0xdb, 0x05, - 0x20, 0xa2, 0xb0, 0x05, 0xb0, 0x04, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x98, 0x05, 0x28, 0x00, - 0xd0, 0x64, 0x98, 0x05, 0x23, 0x0d, 0x06, 0x9b, - 0x42, 0xd8, 0xd3, 0x02, 0x20, 0xb4, 0xb0, 0x05, - 0xe7, 0xf0, 0x99, 0x06, 0x23, 0xff, 0x33, 0x81, - 0x42, 0x99, 0xd2, 0x02, 0x20, 0xb5, 0xb0, 0x05, - 0xe7, 0xe8, 0x99, 0x03, 0x00, 0x88, 0x49, 0x2c, - 0x58, 0x08, 0x90, 0x02, 0x28, 0x00, 0xd1, 0x02, - 0x20, 0xb0, 0xb0, 0x05, 0xe7, 0xde, 0x99, 0x06, - 0x00, 0x88, 0x1f, 0xc1, 0x39, 0x05, 0x91, 0x00, - 0x9e, 0x05, 0x98, 0x05, 0x1d, 0xc5, 0x35, 0x05, - 0x60, 0x35, 0x99, 0x06, 0x60, 0x71, 0x20, 0x00, - 0x60, 0xb0, 0x98, 0x04, 0x28, 0x10, 0xd1, 0x0a, - 0x98, 0x02, 0x68, 0x84, 0x98, 0x02, 0x30, 0x18, - 0x90, 0x01, 0x1c, 0x2a, 0x99, 0x00, 0x98, 0x01, - 0xf0, 0x00, 0xfc, 0x86, 0xe0, 0x25, 0x98, 0x04, - 0x28, 0x20, 0xd1, 0x1f, 0x98, 0x02, 0x68, 0xc0, - 0x1c, 0x07, 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x05, - 0xe7, 0xb8, 0x78, 0xb8, 0x08, 0x40, 0x00, 0x40, - 0x70, 0xb8, 0x69, 0x3c, 0x1d, 0xf8, 0x30, 0x05, - 0x90, 0x01, 0x68, 0xb8, 0x28, 0x00, 0xd1, 0x00, - 0x60, 0xbd, 0x1c, 0x2a, 0x99, 0x00, 0x98, 0x01, - 0xf0, 0x00, 0xfc, 0x6a, 0x68, 0x79, 0x18, 0x40, - 0x60, 0x78, 0x78, 0x78, 0x99, 0x03, 0xf0, 0x00, - 0xf8, 0xb9, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x05, - 0xe7, 0x9c, 0x68, 0xa0, 0x28, 0x00, 0xd0, 0x01, - 0x68, 0xa4, 0xe7, 0xfa, 0x60, 0xa6, 0x20, 0x00, - 0xb0, 0x05, 0xe7, 0x93, 0x20, 0xb4, 0xb0, 0x05, - 0xe7, 0x90, 0xb0, 0x03, 0xb0, 0x02, 0xe7, 0x8d, - 0x2e, 0x08, 0x5e, 0x64, 0xb5, 0xff, 0xb0, 0x81, - 0x9a, 0x03, 0x06, 0x16, 0x0e, 0x36, 0x9b, 0x04, - 0x06, 0x18, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x83, - 0x27, 0x00, 0x2e, 0x20, 0xdb, 0x05, 0x20, 0xa2, - 0xb0, 0x04, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0xb0, 0x49, 0x45, 0x58, 0x08, - 0x1c, 0x04, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x04, - 0xe7, 0xf3, 0x78, 0xe0, 0x28, 0x00, 0xd1, 0x73, - 0x98, 0x03, 0x28, 0x20, 0xd1, 0x19, 0x68, 0xe0, - 0x1c, 0x07, 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x04, - 0xe7, 0xe7, 0x69, 0x38, 0x49, 0x3c, 0x60, 0x48, - 0x48, 0x3b, 0x68, 0x40, 0x68, 0x00, 0x60, 0xb8, - 0x1d, 0xf8, 0x30, 0x05, 0x90, 0x02, 0x20, 0x01, - 0x90, 0x00, 0x48, 0x37, 0x68, 0x40, 0x68, 0x40, - 0x00, 0x80, 0x1f, 0xc1, 0x39, 0x19, 0x91, 0x01, - 0xe0, 0x1d, 0x98, 0x03, 0x28, 0x10, 0xd1, 0x17, - 0x68, 0xa0, 0x49, 0x31, 0x60, 0x48, 0x48, 0x30, - 0x68, 0x40, 0x68, 0x00, 0x61, 0x20, 0x48, 0x2e, - 0x68, 0x40, 0x68, 0x00, 0x61, 0x60, 0x1d, 0xe0, - 0x30, 0x11, 0x90, 0x02, 0x48, 0x2a, 0x68, 0x40, - 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, 0x39, 0x21, - 0x91, 0x01, 0x20, 0x00, 0x90, 0x00, 0xe0, 0x02, - 0x20, 0xbc, 0xb0, 0x04, 0xe7, 0xb5, 0x48, 0x24, - 0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd0, 0x37, - 0x25, 0x00, 0x48, 0x21, 0x68, 0x40, 0x68, 0x02, - 0x99, 0x01, 0x98, 0x02, 0xf0, 0x00, 0xfb, 0xe8, - 0x19, 0x45, 0x48, 0x1d, 0x68, 0x40, 0x49, 0x1c, - 0x60, 0x08, 0x48, 0x1b, 0x68, 0x00, 0x68, 0x80, - 0x49, 0x19, 0x60, 0x48, 0x48, 0x18, 0x68, 0x40, - 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, 0x39, 0x05, - 0x91, 0x01, 0x48, 0x15, 0x68, 0x40, 0x68, 0x80, - 0x28, 0x00, 0xd1, 0xe2, 0x20, 0x00, 0x49, 0x12, - 0x68, 0x09, 0x60, 0x88, 0x48, 0x10, 0x68, 0x40, - 0x99, 0x04, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x40, - 0x68, 0x40, 0x99, 0x05, 0x60, 0x08, 0x98, 0x00, - 0x28, 0x00, 0xd0, 0x06, 0x60, 0x7d, 0x78, 0x78, - 0x1c, 0x31, 0xf0, 0x00, 0xf8, 0x13, 0xe0, 0x00, - 0xe0, 0x05, 0x20, 0x00, 0xb0, 0x04, 0xe7, 0x78, - 0x20, 0xb4, 0xb0, 0x04, 0xe7, 0x75, 0x20, 0xbc, - 0xb0, 0x04, 0xe7, 0x72, 0xb0, 0x03, 0xb0, 0x01, - 0xe7, 0x6f, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x60, 0x90, 0xb5, 0xf3, 0x98, 0x00, - 0x06, 0x02, 0x0e, 0x12, 0x99, 0x01, 0x06, 0x0c, - 0x0e, 0x24, 0xb0, 0x81, 0x2c, 0x20, 0xdb, 0x05, - 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa0, 0x4b, 0x14, - 0x58, 0x18, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, - 0xb0, 0x01, 0xe7, 0xf3, 0x68, 0xe8, 0x1c, 0x01, - 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x01, 0xe7, 0xed, - 0x11, 0x10, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, - 0x28, 0x00, 0xd1, 0x04, 0x68, 0x48, 0x40, 0xd0, - 0x06, 0x07, 0x0e, 0x3f, 0xe0, 0x09, 0x68, 0x48, - 0x07, 0x16, 0x0f, 0x36, 0x40, 0xf0, 0x68, 0x4e, - 0x40, 0xd6, 0x1c, 0x33, 0x18, 0xc0, 0x06, 0x07, - 0x0e, 0x3f, 0x70, 0x0f, 0x70, 0x4a, 0x20, 0x00, - 0xb0, 0x01, 0xe7, 0xd3, 0xb0, 0x01, 0xe7, 0xd1, - 0x2e, 0x08, 0x5e, 0x64, 0xb4, 0xb0, 0x1c, 0x03, + 0x25, 0x00, 0xc0, 0x20, 0x25, 0x00, 0xc0, 0x20, + 0xe7, 0xdd, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, + 0xe0, 0x0b, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, + 0xe7, 0xf8, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x2a, + 0x50, 0x23, 0x23, 0x00, 0x48, 0x35, 0x54, 0x43, + 0xe7, 0xf3, 0x4c, 0x35, 0x94, 0x00, 0x22, 0x00, + 0x2a, 0x10, 0xdb, 0x04, 0xe0, 0x0f, 0x1c, 0x50, + 0x06, 0x02, 0x0e, 0x12, 0xe7, 0xf8, 0x20, 0x00, + 0x00, 0x93, 0x4c, 0x30, 0x50, 0xe0, 0x23, 0xff, + 0x48, 0x2f, 0x54, 0x83, 0x20, 0x00, 0x00, 0x93, + 0x9c, 0x00, 0x50, 0xe0, 0xe7, 0xef, 0x21, 0x00, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdb, 0x04, + 0xe0, 0x2a, 0x1c, 0x48, 0x04, 0x01, 0x0c, 0x09, + 0xe7, 0xf6, 0x23, 0x00, 0x00, 0x88, 0x4c, 0x1a, + 0x50, 0x23, 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x18, + 0x19, 0x1c, 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x14, 0x18, 0x5c, + 0x23, 0x01, 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, + 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x11, 0x50, 0xe0, + 0x20, 0x00, 0x00, 0x8b, 0x4c, 0x0f, 0x19, 0x1c, + 0x23, 0x01, 0x02, 0x9b, 0x18, 0xe3, 0x60, 0x18, + 0x20, 0x00, 0x4b, 0x0c, 0x18, 0x5c, 0x23, 0x01, + 0x02, 0xdb, 0x18, 0xe3, 0x70, 0x18, 0xe7, 0xd4, + 0x20, 0x00, 0xb0, 0x01, 0xe7, 0x39, 0xb0, 0x01, + 0xe7, 0x37, 0x00, 0x00, 0x2e, 0x08, 0x72, 0xec, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x72, 0x90, + 0x2e, 0x08, 0x72, 0x9c, 0x9e, 0x00, 0x04, 0x80, + 0x2e, 0x08, 0x60, 0x90, 0x2e, 0x08, 0x69, 0x90, + 0x9e, 0x00, 0x04, 0xa0, 0x2e, 0x08, 0x5e, 0xdc, + 0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5e, 0xe4, + 0x2e, 0x08, 0x5f, 0xa4, 0x64, 0x00, 0x08, 0x00, + 0x64, 0x00, 0x10, 0x00, 0x2e, 0x08, 0x7b, 0xf4, + 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64, + 0x2e, 0x08, 0x5f, 0xc4, 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, 0xbc, 0xb0, 0x47, 0x70, - 0x00, 0x88, 0x4d, 0x08, 0x58, 0x28, 0x1c, 0x04, - 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe0, - 0x1c, 0x07, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1, - 0x78, 0x78, 0x70, 0x18, 0x20, 0x00, 0xe7, 0xed, - 0xe7, 0xec, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x64, - 0xb5, 0xf3, 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, - 0x0e, 0x00, 0x90, 0x00, 0x99, 0x02, 0x06, 0x0d, - 0x0e, 0x2d, 0xb0, 0x86, 0x20, 0x00, 0x90, 0x00, - 0x2d, 0x20, 0xdd, 0x05, 0x20, 0xa2, 0xb0, 0x07, + 0x00, 0x88, 0x4b, 0x0a, 0x58, 0x18, 0x1c, 0x05, + 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x68, 0xe8, + 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb6, 0xe7, 0xf1, + 0x68, 0x60, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x08, 0x80, 0x60, 0x38, 0x20, 0x00, 0xe7, 0xe9, + 0xe7, 0xe8, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c, + 0xb5, 0xff, 0xb0, 0x82, 0x9a, 0x04, 0x06, 0x11, + 0x0e, 0x09, 0x91, 0x00, 0x9b, 0x05, 0x06, 0x18, + 0x0e, 0x00, 0x90, 0x01, 0xb0, 0x83, 0x99, 0x03, + 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, + 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x98, 0x05, 0x28, 0x00, 0xd0, 0x64, 0x98, 0x05, + 0x23, 0x0d, 0x06, 0x9b, 0x42, 0xd8, 0xd3, 0x02, + 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xf0, 0x99, 0x06, + 0x23, 0xff, 0x33, 0x81, 0x42, 0x99, 0xd2, 0x02, + 0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xe8, 0x99, 0x03, + 0x00, 0x88, 0x49, 0x2c, 0x58, 0x08, 0x90, 0x02, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, + 0xe7, 0xde, 0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1, + 0x39, 0x05, 0x91, 0x00, 0x9e, 0x05, 0x98, 0x05, + 0x1d, 0xc5, 0x35, 0x05, 0x60, 0x35, 0x99, 0x06, + 0x60, 0x71, 0x20, 0x00, 0x60, 0xb0, 0x98, 0x04, + 0x28, 0x10, 0xd1, 0x0a, 0x98, 0x02, 0x68, 0x84, + 0x98, 0x02, 0x30, 0x18, 0x90, 0x01, 0x1c, 0x2a, + 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x86, + 0xe0, 0x25, 0x98, 0x04, 0x28, 0x20, 0xd1, 0x1f, + 0x98, 0x02, 0x68, 0xc0, 0x1c, 0x07, 0xd1, 0x02, + 0x20, 0xb6, 0xb0, 0x05, 0xe7, 0xb8, 0x78, 0xb8, + 0x08, 0x40, 0x00, 0x40, 0x70, 0xb8, 0x69, 0x3c, + 0x1d, 0xf8, 0x30, 0x05, 0x90, 0x01, 0x68, 0xb8, + 0x28, 0x00, 0xd1, 0x00, 0x60, 0xbd, 0x1c, 0x2a, + 0x99, 0x00, 0x98, 0x01, 0xf0, 0x00, 0xfc, 0x6a, + 0x68, 0x79, 0x18, 0x40, 0x60, 0x78, 0x78, 0x78, + 0x99, 0x03, 0xf0, 0x00, 0xf8, 0xb9, 0xe0, 0x02, + 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0x9c, 0x68, 0xa0, + 0x28, 0x00, 0xd0, 0x01, 0x68, 0xa4, 0xe7, 0xfa, + 0x60, 0xa6, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0x93, + 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0x90, 0xb0, 0x03, + 0xb0, 0x02, 0xe7, 0x8d, 0x2e, 0x08, 0x5e, 0x5c, + 0xb5, 0xff, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x16, + 0x0e, 0x36, 0x9b, 0x04, 0x06, 0x18, 0x0e, 0x00, + 0x90, 0x00, 0xb0, 0x83, 0x27, 0x00, 0x2e, 0x20, + 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x04, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0xb0, + 0x49, 0x45, 0x58, 0x08, 0x1c, 0x04, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x04, 0xe7, 0xf3, 0x78, 0xe0, + 0x28, 0x00, 0xd1, 0x73, 0x98, 0x03, 0x28, 0x20, + 0xd1, 0x19, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x02, + 0x20, 0xb6, 0xb0, 0x04, 0xe7, 0xe7, 0x69, 0x38, + 0x49, 0x3c, 0x60, 0x48, 0x48, 0x3b, 0x68, 0x40, + 0x68, 0x00, 0x60, 0xb8, 0x1d, 0xf8, 0x30, 0x05, + 0x90, 0x02, 0x20, 0x01, 0x90, 0x00, 0x48, 0x37, + 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, 0x1f, 0xc1, + 0x39, 0x19, 0x91, 0x01, 0xe0, 0x1d, 0x98, 0x03, + 0x28, 0x10, 0xd1, 0x17, 0x68, 0xa0, 0x49, 0x31, + 0x60, 0x48, 0x48, 0x30, 0x68, 0x40, 0x68, 0x00, + 0x61, 0x20, 0x48, 0x2e, 0x68, 0x40, 0x68, 0x00, + 0x61, 0x60, 0x1d, 0xe0, 0x30, 0x11, 0x90, 0x02, + 0x48, 0x2a, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, + 0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, 0x20, 0x00, + 0x90, 0x00, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x04, + 0xe7, 0xb5, 0x48, 0x24, 0x68, 0x40, 0x68, 0x80, + 0x28, 0x00, 0xd0, 0x37, 0x25, 0x00, 0x48, 0x21, + 0x68, 0x40, 0x68, 0x02, 0x99, 0x01, 0x98, 0x02, + 0xf0, 0x00, 0xfb, 0xe8, 0x19, 0x45, 0x48, 0x1d, + 0x68, 0x40, 0x49, 0x1c, 0x60, 0x08, 0x48, 0x1b, + 0x68, 0x00, 0x68, 0x80, 0x49, 0x19, 0x60, 0x48, + 0x48, 0x18, 0x68, 0x40, 0x68, 0x40, 0x00, 0x80, + 0x1f, 0xc1, 0x39, 0x05, 0x91, 0x01, 0x48, 0x15, + 0x68, 0x40, 0x68, 0x80, 0x28, 0x00, 0xd1, 0xe2, + 0x20, 0x00, 0x49, 0x12, 0x68, 0x09, 0x60, 0x88, + 0x48, 0x10, 0x68, 0x40, 0x99, 0x04, 0x60, 0x08, + 0x48, 0x0e, 0x68, 0x40, 0x68, 0x40, 0x99, 0x05, + 0x60, 0x08, 0x98, 0x00, 0x28, 0x00, 0xd0, 0x06, + 0x60, 0x7d, 0x78, 0x78, 0x1c, 0x31, 0xf0, 0x00, + 0xf8, 0x13, 0xe0, 0x00, 0xe0, 0x05, 0x20, 0x00, + 0xb0, 0x04, 0xe7, 0x78, 0x20, 0xb4, 0xb0, 0x04, + 0xe7, 0x75, 0x20, 0xbc, 0xb0, 0x04, 0xe7, 0x72, + 0xb0, 0x03, 0xb0, 0x01, 0xe7, 0x6f, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x60, 0x88, + 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0xb0, 0x81, + 0x2c, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x00, 0xa8, 0x49, 0xa2, 0x58, 0x08, 0x90, 0x04, - 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x07, - 0xe7, 0xf2, 0x00, 0xa8, 0x49, 0x9e, 0x68, 0x09, - 0x18, 0x40, 0x90, 0x05, 0x00, 0xe8, 0x1b, 0x40, - 0x00, 0x80, 0x49, 0x9c, 0x68, 0x09, 0x18, 0x46, - 0x98, 0x06, 0x28, 0x00, 0xd0, 0x73, 0x28, 0x01, - 0xd0, 0x4f, 0x28, 0x02, 0xd0, 0x00, 0xe1, 0x1d, - 0x98, 0x04, 0x69, 0x00, 0x60, 0x70, 0x98, 0x04, + 0x00, 0xa0, 0x4b, 0x14, 0x58, 0x18, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x01, 0xe7, 0xf3, + 0x68, 0xe8, 0x1c, 0x01, 0xd1, 0x02, 0x20, 0xb6, + 0xb0, 0x01, 0xe7, 0xed, 0x11, 0x10, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x28, 0x00, 0xd1, 0x04, + 0x68, 0x48, 0x40, 0xd0, 0x06, 0x07, 0x0e, 0x3f, + 0xe0, 0x09, 0x68, 0x48, 0x07, 0x16, 0x0f, 0x36, + 0x40, 0xf0, 0x68, 0x4e, 0x40, 0xd6, 0x1c, 0x33, + 0x18, 0xc0, 0x06, 0x07, 0x0e, 0x3f, 0x70, 0x0f, + 0x70, 0x4a, 0x20, 0x00, 0xb0, 0x01, 0xe7, 0xd3, + 0xb0, 0x01, 0xe7, 0xd1, 0x2e, 0x08, 0x5e, 0x5c, + 0xb4, 0xb0, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11, + 0x0e, 0x09, 0x29, 0x20, 0xdb, 0x02, 0x20, 0xa2, + 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x88, 0x4d, 0x08, + 0x58, 0x28, 0x1c, 0x04, 0xd1, 0x01, 0x20, 0xb0, + 0xe7, 0xf6, 0x68, 0xe0, 0x1c, 0x07, 0xd1, 0x01, + 0x20, 0xb6, 0xe7, 0xf1, 0x78, 0x78, 0x70, 0x18, + 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, + 0x2e, 0x08, 0x5e, 0x5c, 0xb5, 0xf3, 0xb0, 0x81, + 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, + 0x99, 0x02, 0x06, 0x0d, 0x0e, 0x2d, 0xb0, 0x86, + 0x20, 0x00, 0x90, 0x00, 0x2d, 0x20, 0xdd, 0x05, + 0x20, 0xa2, 0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x00, 0xa8, 0x49, 0xa2, + 0x58, 0x08, 0x90, 0x04, 0x28, 0x00, 0xd1, 0x02, + 0x20, 0xb0, 0xb0, 0x07, 0xe7, 0xf2, 0x00, 0xa8, + 0x49, 0x9e, 0x68, 0x09, 0x18, 0x40, 0x90, 0x05, + 0x00, 0xe8, 0x1b, 0x40, 0x00, 0x80, 0x49, 0x9c, + 0x68, 0x09, 0x18, 0x46, 0x98, 0x06, 0x28, 0x00, + 0xd0, 0x73, 0x28, 0x01, 0xd0, 0x4f, 0x28, 0x02, + 0xd0, 0x00, 0xe1, 0x1d, 0x98, 0x04, 0x69, 0x00, + 0x60, 0x70, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, + 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13, + 0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, + 0xe0, 0x11, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, + 0xe7, 0xf8, 0x48, 0x8e, 0x5d, 0xc0, 0x42, 0xa8, + 0xd1, 0x08, 0x00, 0xb8, 0x49, 0x8c, 0x58, 0x08, + 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, + 0x40, 0x19, 0x70, 0x01, 0xe7, 0xed, 0xe0, 0x1e, + 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x48, 0x84, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, + 0x00, 0xb8, 0x49, 0x83, 0x58, 0x08, 0x30, 0x01, + 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, + 0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, + 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0x88, 0x30, + 0x4b, 0x7a, 0x40, 0x18, 0x80, 0x30, 0x98, 0x05, + 0x68, 0x00, 0x23, 0x01, 0x03, 0x5b, 0x43, 0x18, + 0x99, 0x05, 0x60, 0x08, 0xe0, 0xd3, 0x98, 0x05, + 0x68, 0x00, 0x4b, 0x75, 0x40, 0x18, 0x99, 0x05, + 0x60, 0x08, 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, + 0x70, 0xf0, 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13, 0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x11, 0x1c, 0x78, - 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x8e, + 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x63, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x08, 0x00, 0xb8, - 0x49, 0x8c, 0x58, 0x08, 0x30, 0x01, 0x78, 0x01, - 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, 0x70, 0x01, + 0xe0, 0x00, 0xe0, 0x27, 0x49, 0x60, 0x58, 0x0c, + 0x78, 0x60, 0x23, 0x80, 0x43, 0x18, 0x70, 0x60, 0xe7, 0xed, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07, - 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x84, 0x5d, 0xc0, - 0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x83, + 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x59, 0x5d, 0xc0, + 0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x58, 0x58, 0x08, 0x30, 0x01, 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, 0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x00, - 0xe7, 0xe4, 0x88, 0x30, 0x4b, 0x7a, 0x40, 0x18, - 0x80, 0x30, 0x98, 0x05, 0x68, 0x00, 0x23, 0x01, - 0x03, 0x5b, 0x43, 0x18, 0x99, 0x05, 0x60, 0x08, - 0xe0, 0xd3, 0x98, 0x05, 0x68, 0x00, 0x4b, 0x75, - 0x40, 0x18, 0x99, 0x05, 0x60, 0x08, 0x20, 0x00, - 0x60, 0xb0, 0x20, 0x00, 0x70, 0xf0, 0x20, 0x00, - 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, - 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x28, 0x13, - 0xd0, 0x16, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, - 0xe0, 0x11, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, - 0xe7, 0xf8, 0x48, 0x63, 0x5d, 0xc0, 0x42, 0xa8, - 0xd1, 0x08, 0x00, 0xb8, 0xe0, 0x00, 0xe0, 0x27, - 0x49, 0x60, 0x58, 0x0c, 0x78, 0x60, 0x23, 0x80, - 0x43, 0x18, 0x70, 0x60, 0xe7, 0xed, 0xe0, 0x1e, + 0xe7, 0xe4, 0xe0, 0x88, 0x98, 0x05, 0x68, 0x00, + 0x4b, 0x4f, 0x40, 0x18, 0x99, 0x05, 0x60, 0x08, + 0x20, 0x00, 0x60, 0xb0, 0x20, 0x00, 0x70, 0xf0, + 0x20, 0x00, 0x60, 0xf0, 0x98, 0x04, 0x78, 0x40, + 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x02, 0x98, 0x04, + 0x78, 0x40, 0x21, 0x20, 0x40, 0x01, 0x91, 0x03, + 0x98, 0x02, 0x28, 0x13, 0xd0, 0x4c, 0x27, 0x00, + 0x2f, 0x20, 0xdb, 0x04, 0xe0, 0x47, 0x1c, 0x78, + 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x3b, + 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x3e, 0x00, 0xb8, + 0x49, 0x39, 0x58, 0x0c, 0x20, 0x80, 0x70, 0x60, + 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, 0xfb, 0x30, + 0x78, 0xa0, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x28, + 0x6a, 0xe0, 0x22, 0x00, 0x92, 0x01, 0x99, 0x01, + 0x29, 0x08, 0xdb, 0x06, 0xe0, 0x1f, 0x99, 0x01, + 0x31, 0x01, 0x06, 0x09, 0x0e, 0x09, 0x91, 0x01, + 0xe7, 0xf5, 0x99, 0x01, 0x00, 0x89, 0x18, 0x09, + 0x68, 0x49, 0x9a, 0x01, 0x00, 0x92, 0x18, 0x12, + 0x64, 0x51, 0x22, 0x00, 0x99, 0x01, 0x00, 0x89, + 0x18, 0x09, 0x62, 0x4a, 0x99, 0x01, 0x00, 0x89, + 0x18, 0x09, 0x6c, 0x49, 0x29, 0x00, 0xd0, 0x05, + 0x9a, 0x01, 0x21, 0x80, 0x41, 0x11, 0x88, 0x02, + 0x43, 0x11, 0x80, 0x01, 0xe7, 0xdf, 0x88, 0x01, + 0x80, 0x41, 0x78, 0xa0, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x04, 0x98, 0x04, 0x68, 0xc1, 0x1c, 0x20, + 0xf0, 0x00, 0xfa, 0x3d, 0xe7, 0xb7, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10, 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, - 0x48, 0x59, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, - 0x00, 0xb8, 0x49, 0x58, 0x58, 0x08, 0x30, 0x01, - 0x78, 0x01, 0x23, 0x80, 0x43, 0xdb, 0x40, 0x19, - 0x70, 0x01, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, + 0x48, 0x16, 0x5d, 0xc0, 0x42, 0xa8, 0xd1, 0x11, + 0x00, 0xb8, 0x49, 0x15, 0x58, 0x0c, 0x20, 0x80, + 0x70, 0x60, 0x99, 0x03, 0x1c, 0x20, 0xf7, 0xfd, + 0xfa, 0xe3, 0x98, 0x00, 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x02, - 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0xe0, 0x88, - 0x98, 0x05, 0x68, 0x00, 0x4b, 0x4f, 0x40, 0x18, - 0x99, 0x05, 0x60, 0x08, 0x20, 0x00, 0x60, 0xb0, - 0x20, 0x00, 0x70, 0xf0, 0x20, 0x00, 0x60, 0xf0, - 0x98, 0x04, 0x78, 0x40, 0x06, 0xc0, 0x0e, 0xc0, - 0x90, 0x02, 0x98, 0x04, 0x78, 0x40, 0x21, 0x20, - 0x40, 0x01, 0x91, 0x03, 0x98, 0x02, 0x28, 0x13, - 0xd0, 0x4c, 0x27, 0x00, 0x2f, 0x20, 0xdb, 0x04, - 0xe0, 0x47, 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, - 0xe7, 0xf8, 0x48, 0x3b, 0x5d, 0xc0, 0x42, 0xa8, - 0xd1, 0x3e, 0x00, 0xb8, 0x49, 0x39, 0x58, 0x0c, - 0x20, 0x80, 0x70, 0x60, 0x99, 0x03, 0x1c, 0x20, - 0xf7, 0xfd, 0xfb, 0x30, 0x78, 0xa0, 0x23, 0x04, - 0x40, 0x18, 0xd0, 0x28, 0x6a, 0xe0, 0x22, 0x00, - 0x92, 0x01, 0x99, 0x01, 0x29, 0x08, 0xdb, 0x06, - 0xe0, 0x1f, 0x99, 0x01, 0x31, 0x01, 0x06, 0x09, - 0x0e, 0x09, 0x91, 0x01, 0xe7, 0xf5, 0x99, 0x01, - 0x00, 0x89, 0x18, 0x09, 0x68, 0x49, 0x9a, 0x01, - 0x00, 0x92, 0x18, 0x12, 0x64, 0x51, 0x22, 0x00, - 0x99, 0x01, 0x00, 0x89, 0x18, 0x09, 0x62, 0x4a, - 0x99, 0x01, 0x00, 0x89, 0x18, 0x09, 0x6c, 0x49, - 0x29, 0x00, 0xd0, 0x05, 0x9a, 0x01, 0x21, 0x80, - 0x41, 0x11, 0x88, 0x02, 0x43, 0x11, 0x80, 0x01, - 0xe7, 0xdf, 0x88, 0x01, 0x80, 0x41, 0x78, 0xa0, - 0x23, 0x20, 0x40, 0x18, 0xd0, 0x04, 0x98, 0x04, - 0x68, 0xc1, 0x1c, 0x20, 0xf0, 0x00, 0xfa, 0x3d, - 0xe7, 0xb7, 0xe0, 0x1e, 0x27, 0x00, 0x2f, 0x10, - 0xdb, 0x04, 0xe0, 0x1a, 0x1c, 0x78, 0x06, 0x07, - 0x0e, 0x3f, 0xe7, 0xf8, 0x48, 0x16, 0x5d, 0xc0, - 0x42, 0xa8, 0xd1, 0x11, 0x00, 0xb8, 0x49, 0x15, - 0x58, 0x0c, 0x20, 0x80, 0x70, 0x60, 0x99, 0x03, - 0x1c, 0x20, 0xf7, 0xfd, 0xfa, 0xe3, 0x98, 0x00, - 0x30, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, - 0x98, 0x00, 0x28, 0x02, 0xd1, 0x00, 0xe0, 0x00, - 0xe7, 0xe4, 0xe0, 0x02, 0x20, 0xbc, 0xb0, 0x07, - 0xe6, 0xbe, 0x98, 0x06, 0x99, 0x04, 0x70, 0xc8, - 0x20, 0x00, 0xb0, 0x07, 0xe6, 0xb8, 0xb0, 0x06, - 0xb0, 0x01, 0xe6, 0xb5, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5d, 0xcc, - 0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xec, - 0x2e, 0x08, 0x5f, 0xcc, 0x2e, 0x08, 0x5f, 0x6c, - 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0a, 0x06, 0x11, - 0x0e, 0x09, 0x29, 0x20, 0xdd, 0x02, 0x20, 0xa2, - 0xbc, 0x90, 0x47, 0x70, 0x00, 0x88, 0x4c, 0x05, - 0x58, 0x20, 0x1c, 0x07, 0xd1, 0x01, 0x20, 0xb0, - 0xe7, 0xf6, 0x78, 0xf8, 0x70, 0x18, 0x20, 0x00, - 0xe7, 0xf2, 0xe7, 0xf1, 0x2e, 0x08, 0x5e, 0x64, - 0xb4, 0x90, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0x38, - 0x16, 0x04, 0x2a, 0x02, 0xda, 0x02, 0x20, 0x00, - 0xbc, 0x90, 0x47, 0x70, 0x2c, 0x01, 0xd1, 0x01, - 0x21, 0x28, 0xe0, 0x09, 0x2c, 0x02, 0xd1, 0x01, - 0x21, 0x20, 0xe0, 0x05, 0x2c, 0x00, 0xd1, 0x01, - 0x21, 0x0c, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xef, - 0x00, 0x50, 0x18, 0x80, 0x01, 0x80, 0x18, 0x41, - 0x1c, 0xc8, 0x08, 0x81, 0x1c, 0x08, 0xe7, 0xe7, - 0xe7, 0xe6, 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x81, - 0x9a, 0x03, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, - 0xb0, 0x84, 0x99, 0x04, 0x29, 0x20, 0xdb, 0x05, - 0x20, 0xa2, 0xb0, 0x05, 0xb0, 0x03, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x99, 0x04, 0x00, 0x88, - 0x49, 0x29, 0x58, 0x08, 0x1c, 0x06, 0xd1, 0x02, - 0x20, 0xb0, 0xb0, 0x05, 0xe7, 0xf2, 0x2f, 0x00, - 0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xed, - 0x4b, 0x24, 0x42, 0x9f, 0xd1, 0x0a, 0x78, 0xf0, - 0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x05, - 0xe7, 0xe4, 0x20, 0x00, 0x60, 0xf0, 0x20, 0x00, - 0xb0, 0x05, 0xe7, 0xdf, 0x68, 0xf0, 0x28, 0x00, - 0xd0, 0x02, 0x20, 0xb4, 0xb0, 0x05, 0xe7, 0xd9, - 0x99, 0x06, 0x00, 0x88, 0x1f, 0xc1, 0x39, 0x19, - 0x91, 0x02, 0x20, 0xff, 0x30, 0x81, 0x90, 0x01, - 0x99, 0x02, 0x98, 0x01, 0x42, 0x81, 0xda, 0x02, - 0x20, 0xb5, 0xb0, 0x05, 0xe7, 0xca, 0x1c, 0x3c, - 0x60, 0xf4, 0x37, 0x14, 0x1c, 0x3d, 0x37, 0x0c, - 0x60, 0x2f, 0x99, 0x06, 0x60, 0x69, 0x20, 0x00, - 0x60, 0xa8, 0x97, 0x03, 0x20, 0x00, 0x60, 0xe0, - 0x1d, 0xe0, 0x30, 0x05, 0x9a, 0x03, 0x99, 0x02, - 0xf0, 0x00, 0xf9, 0x56, 0x90, 0x00, 0x20, 0x00, - 0x70, 0xa0, 0x98, 0x00, 0x60, 0x60, 0x9a, 0x03, - 0x60, 0xa2, 0x61, 0x25, 0x99, 0x04, 0x20, 0x54, - 0xf7, 0xff, 0xfd, 0xa0, 0xb0, 0x05, 0xe7, 0xa9, - 0xb0, 0x04, 0xb0, 0x01, 0xe7, 0xa6, 0x00, 0x00, - 0x2e, 0x08, 0x5e, 0x64, 0x00, 0x00, 0xff, 0xff, - 0xb5, 0xff, 0xb0, 0x83, 0x9a, 0x05, 0x06, 0x11, - 0x0e, 0x09, 0x91, 0x00, 0x9b, 0x06, 0x06, 0x18, - 0x0e, 0x00, 0x90, 0x01, 0x98, 0x0c, 0x06, 0x01, - 0x0e, 0x09, 0x91, 0x02, 0xb0, 0x85, 0x99, 0x05, - 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x08, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x98, 0x08, 0x28, 0x00, 0xd1, 0x02, 0x20, 0xb4, - 0xb0, 0x08, 0xe7, 0xf5, 0x99, 0x05, 0x00, 0xc8, - 0x1a, 0x40, 0x00, 0x80, 0x49, 0x83, 0x68, 0x09, - 0x18, 0x47, 0x98, 0x08, 0x4b, 0x82, 0x42, 0x98, - 0xd1, 0x73, 0x99, 0x05, 0x00, 0x88, 0x49, 0x81, - 0x58, 0x08, 0x1c, 0x05, 0xd1, 0x02, 0x20, 0xb0, - 0xb0, 0x08, 0xe7, 0xe1, 0x68, 0xe8, 0x28, 0x00, - 0xd1, 0x02, 0x78, 0xe8, 0x28, 0x00, 0xd0, 0x02, - 0x20, 0xbc, 0xb0, 0x08, 0xe7, 0xd8, 0x78, 0xa8, - 0x28, 0x00, 0xd0, 0x54, 0x20, 0x00, 0x42, 0x80, - 0xd0, 0x1d, 0x24, 0x00, 0x2c, 0x20, 0xdb, 0x04, - 0xe0, 0x18, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, - 0xe7, 0xf8, 0x48, 0x73, 0x5d, 0x00, 0x99, 0x05, - 0x42, 0x88, 0xd1, 0x0e, 0x20, 0x01, 0x40, 0xa0, - 0x43, 0xc0, 0x49, 0x70, 0x68, 0x09, 0x40, 0x08, - 0x49, 0x6e, 0x60, 0x08, 0x20, 0x00, 0x00, 0xa1, - 0x4a, 0x6d, 0x50, 0x50, 0x20, 0xff, 0x49, 0x6a, - 0x55, 0x08, 0xe7, 0xe6, 0xe0, 0x33, 0x4a, 0x6b, - 0x92, 0x03, 0x7e, 0x38, 0x1c, 0x06, 0x28, 0xff, - 0xd0, 0x14, 0x20, 0x00, 0x00, 0xb1, 0x4a, 0x68, - 0x50, 0x50, 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, - 0x49, 0x66, 0x68, 0x09, 0x40, 0x08, 0x49, 0x65, - 0x60, 0x08, 0x20, 0xff, 0x76, 0x38, 0x21, 0xff, - 0x48, 0x63, 0x55, 0x81, 0x21, 0x00, 0x00, 0xb0, - 0x9a, 0x03, 0x50, 0x11, 0x7e, 0x78, 0x1c, 0x06, - 0x28, 0xff, 0xd0, 0x14, 0x21, 0x00, 0x00, 0xb0, - 0x4a, 0x5b, 0x50, 0x11, 0x20, 0x01, 0x40, 0xb0, - 0x43, 0xc0, 0x49, 0x5a, 0x68, 0x09, 0x40, 0x08, - 0x49, 0x58, 0x60, 0x08, 0x20, 0xff, 0x76, 0x78, - 0x20, 0xff, 0x49, 0x51, 0x55, 0x88, 0x21, 0x00, - 0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11, 0x20, 0x00, - 0x99, 0x05, 0x00, 0x89, 0x4a, 0x4b, 0x50, 0x50, - 0x24, 0x00, 0x2c, 0x0c, 0xdb, 0x06, 0xe0, 0x09, - 0xe0, 0x00, 0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, - 0x0e, 0x24, 0xe7, 0xf6, 0x20, 0x00, 0x19, 0x39, - 0x73, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, - 0x20, 0x00, 0x70, 0xf8, 0x20, 0x00, 0xb0, 0x08, - 0xe7, 0x66, 0x99, 0x05, 0x00, 0x88, 0x49, 0x3f, - 0x58, 0x08, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb0, - 0xb0, 0x08, 0xe7, 0x5d, 0x99, 0x07, 0x29, 0x11, - 0xdb, 0x02, 0x99, 0x07, 0x29, 0x13, 0xdd, 0x02, - 0x20, 0xb1, 0xb0, 0x08, 0xe7, 0x54, 0x99, 0x09, - 0x00, 0x88, 0x1f, 0xc1, 0x39, 0x21, 0x91, 0x01, - 0x20, 0xff, 0x30, 0x81, 0x90, 0x00, 0x99, 0x01, - 0x98, 0x00, 0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, - 0xb0, 0x08, 0xe7, 0x45, 0x9d, 0x08, 0x98, 0x08, - 0x30, 0x1c, 0x90, 0x08, 0x98, 0x08, 0x90, 0x04, - 0x98, 0x08, 0x30, 0x0c, 0x90, 0x08, 0x98, 0x08, - 0x90, 0x02, 0x9a, 0x02, 0x98, 0x04, 0x60, 0x02, - 0x99, 0x09, 0x98, 0x04, 0x60, 0x41, 0x20, 0x00, - 0x99, 0x04, 0x60, 0x88, 0x20, 0x00, 0x61, 0xa8, - 0x1d, 0xe8, 0x30, 0x11, 0x9a, 0x02, 0x99, 0x01, - 0xf0, 0x00, 0xf8, 0x56, 0x20, 0x00, 0x70, 0x28, - 0x98, 0x06, 0x99, 0x07, 0x43, 0x08, 0x70, 0x68, - 0x20, 0x00, 0x70, 0xa8, 0x20, 0x02, 0x70, 0xe8, - 0x20, 0x00, 0x71, 0x28, 0x98, 0x04, 0x60, 0xa8, - 0x20, 0x00, 0x60, 0xe8, 0x9a, 0x02, 0x61, 0x2a, - 0x9a, 0x02, 0x61, 0x6a, 0x99, 0x05, 0x00, 0x88, - 0x49, 0x16, 0x50, 0x0d, 0x20, 0x00, 0x60, 0xf8, - 0x88, 0x38, 0x4b, 0x1c, 0x40, 0x18, 0x80, 0x38, - 0x20, 0x00, 0x60, 0xb8, 0x9a, 0x02, 0x60, 0x7a, - 0x98, 0x06, 0x99, 0x07, 0x43, 0x08, 0x70, 0xb8, - 0x24, 0x00, 0x2c, 0x0c, 0xdb, 0x04, 0xe0, 0x07, - 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, - 0x20, 0x00, 0x19, 0x39, 0x74, 0x08, 0xe7, 0xf7, + 0xd1, 0x00, 0xe0, 0x00, 0xe7, 0xe4, 0xe0, 0x02, + 0x20, 0xbc, 0xb0, 0x07, 0xe6, 0xbe, 0x98, 0x06, + 0x99, 0x04, 0x70, 0xc8, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0xb8, 0xb0, 0x06, 0xb0, 0x01, 0xe6, 0xb5, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5d, 0xcc, + 0x2e, 0x08, 0x5d, 0xc4, 0x2e, 0x08, 0x5f, 0xa4, + 0x2e, 0x08, 0x5e, 0xe4, 0x2e, 0x08, 0x5f, 0xc4, + 0x2e, 0x08, 0x5f, 0x64, 0xff, 0xff, 0xfb, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xb4, 0x90, 0x1c, 0x03, + 0x1c, 0x0a, 0x06, 0x11, 0x0e, 0x09, 0x29, 0x20, + 0xdd, 0x02, 0x20, 0xa2, 0xbc, 0x90, 0x47, 0x70, + 0x00, 0x88, 0x4c, 0x05, 0x58, 0x20, 0x1c, 0x07, + 0xd1, 0x01, 0x20, 0xb0, 0xe7, 0xf6, 0x78, 0xf8, + 0x70, 0x18, 0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1, + 0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x06, 0x38, 0x16, 0x04, 0x2a, 0x02, + 0xda, 0x02, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, + 0x2c, 0x01, 0xd1, 0x01, 0x21, 0x28, 0xe0, 0x09, + 0x2c, 0x02, 0xd1, 0x01, 0x21, 0x20, 0xe0, 0x05, + 0x2c, 0x00, 0xd1, 0x01, 0x21, 0x0c, 0xe0, 0x01, + 0x20, 0x00, 0xe7, 0xef, 0x00, 0x50, 0x18, 0x80, + 0x01, 0x80, 0x18, 0x41, 0x1c, 0xc8, 0x08, 0x81, + 0x1c, 0x08, 0xe7, 0xe7, 0xe7, 0xe6, 0xb5, 0xf7, + 0x1c, 0x07, 0xb0, 0x81, 0x9a, 0x03, 0x06, 0x11, + 0x0e, 0x09, 0x91, 0x00, 0xb0, 0x84, 0x99, 0x04, + 0x29, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x05, + 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x99, 0x04, 0x00, 0x88, 0x49, 0x29, 0x58, 0x08, + 0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x05, + 0xe7, 0xf2, 0x2f, 0x00, 0xd1, 0x02, 0x20, 0xb4, + 0xb0, 0x05, 0xe7, 0xed, 0x4b, 0x24, 0x42, 0x9f, + 0xd1, 0x0a, 0x78, 0xf0, 0x28, 0x00, 0xd0, 0x02, + 0x20, 0xbc, 0xb0, 0x05, 0xe7, 0xe4, 0x20, 0x00, + 0x60, 0xf0, 0x20, 0x00, 0xb0, 0x05, 0xe7, 0xdf, + 0x68, 0xf0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0xb4, + 0xb0, 0x05, 0xe7, 0xd9, 0x99, 0x06, 0x00, 0x88, + 0x1f, 0xc1, 0x39, 0x19, 0x91, 0x02, 0x20, 0xff, + 0x30, 0x81, 0x90, 0x01, 0x99, 0x02, 0x98, 0x01, + 0x42, 0x81, 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x05, + 0xe7, 0xca, 0x1c, 0x3c, 0x60, 0xf4, 0x37, 0x14, + 0x1c, 0x3d, 0x37, 0x0c, 0x60, 0x2f, 0x99, 0x06, + 0x60, 0x69, 0x20, 0x00, 0x60, 0xa8, 0x97, 0x03, + 0x20, 0x00, 0x60, 0xe0, 0x1d, 0xe0, 0x30, 0x05, + 0x9a, 0x03, 0x99, 0x02, 0xf0, 0x00, 0xf9, 0x56, + 0x90, 0x00, 0x20, 0x00, 0x70, 0xa0, 0x98, 0x00, + 0x60, 0x60, 0x9a, 0x03, 0x60, 0xa2, 0x61, 0x25, + 0x99, 0x04, 0x20, 0x54, 0xf7, 0xff, 0xfd, 0xa0, + 0xb0, 0x05, 0xe7, 0xa9, 0xb0, 0x04, 0xb0, 0x01, + 0xe7, 0xa6, 0x00, 0x00, 0x2e, 0x08, 0x5e, 0x5c, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xff, 0xb0, 0x83, + 0x9a, 0x05, 0x06, 0x11, 0x0e, 0x09, 0x91, 0x00, + 0x9b, 0x06, 0x06, 0x18, 0x0e, 0x00, 0x90, 0x01, + 0x98, 0x0c, 0x06, 0x01, 0x0e, 0x09, 0x91, 0x02, + 0xb0, 0x85, 0x99, 0x05, 0x29, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x08, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x08, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0xb4, 0xb0, 0x08, 0xe7, 0xf5, + 0x99, 0x05, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, + 0x49, 0x83, 0x68, 0x09, 0x18, 0x47, 0x98, 0x08, + 0x4b, 0x82, 0x42, 0x98, 0xd1, 0x73, 0x99, 0x05, + 0x00, 0x88, 0x49, 0x81, 0x58, 0x08, 0x1c, 0x05, + 0xd1, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0xe1, + 0x68, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x78, 0xe8, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0xbc, 0xb0, 0x08, + 0xe7, 0xd8, 0x78, 0xa8, 0x28, 0x00, 0xd0, 0x54, + 0x20, 0x00, 0x42, 0x80, 0xd0, 0x1d, 0x24, 0x00, + 0x2c, 0x20, 0xdb, 0x04, 0xe0, 0x18, 0x1c, 0x60, + 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x48, 0x73, + 0x5d, 0x00, 0x99, 0x05, 0x42, 0x88, 0xd1, 0x0e, + 0x20, 0x01, 0x40, 0xa0, 0x43, 0xc0, 0x49, 0x70, + 0x68, 0x09, 0x40, 0x08, 0x49, 0x6e, 0x60, 0x08, + 0x20, 0x00, 0x00, 0xa1, 0x4a, 0x6d, 0x50, 0x50, + 0x20, 0xff, 0x49, 0x6a, 0x55, 0x08, 0xe7, 0xe6, + 0xe0, 0x33, 0x4a, 0x6b, 0x92, 0x03, 0x7e, 0x38, + 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, 0x20, 0x00, + 0x00, 0xb1, 0x4a, 0x68, 0x50, 0x50, 0x20, 0x01, + 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x66, 0x68, 0x09, + 0x40, 0x08, 0x49, 0x65, 0x60, 0x08, 0x20, 0xff, + 0x76, 0x38, 0x21, 0xff, 0x48, 0x63, 0x55, 0x81, + 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, 0x50, 0x11, + 0x7e, 0x78, 0x1c, 0x06, 0x28, 0xff, 0xd0, 0x14, + 0x21, 0x00, 0x00, 0xb0, 0x4a, 0x5b, 0x50, 0x11, + 0x20, 0x01, 0x40, 0xb0, 0x43, 0xc0, 0x49, 0x5a, + 0x68, 0x09, 0x40, 0x08, 0x49, 0x58, 0x60, 0x08, + 0x20, 0xff, 0x76, 0x78, 0x20, 0xff, 0x49, 0x51, + 0x55, 0x88, 0x21, 0x00, 0x00, 0xb0, 0x9a, 0x03, + 0x50, 0x11, 0x20, 0x00, 0x99, 0x05, 0x00, 0x89, + 0x4a, 0x4b, 0x50, 0x50, 0x24, 0x00, 0x2c, 0x0c, + 0xdb, 0x06, 0xe0, 0x09, 0xe0, 0x00, 0xe0, 0x0e, + 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf6, + 0x20, 0x00, 0x19, 0x39, 0x73, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, 0x20, 0x00, 0x70, 0xf8, - 0x20, 0xff, 0x76, 0x38, 0x20, 0xff, 0x76, 0x78, - 0x20, 0x00, 0xb0, 0x08, 0xe6, 0xec, 0xb0, 0x05, - 0xb0, 0x03, 0xe6, 0xe9, 0x2e, 0x08, 0x5d, 0xcc, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x5e, 0x64, - 0x2e, 0x08, 0x5f, 0xac, 0x2e, 0x08, 0x5e, 0xe4, - 0x2e, 0x08, 0x5e, 0xec, 0x9e, 0x00, 0x04, 0xb8, - 0x2e, 0x08, 0x5f, 0x6c, 0x2e, 0x08, 0x5e, 0xe8, - 0x2e, 0x08, 0x5f, 0xcc, 0xff, 0xff, 0xfb, 0xff, - 0xb4, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, - 0x21, 0x00, 0x68, 0x22, 0x2a, 0x00, 0xd0, 0x00, - 0x60, 0x13, 0x1d, 0xd8, 0x30, 0xb9, 0x60, 0x18, - 0x33, 0xc0, 0x31, 0x01, 0x3f, 0xc0, 0x2f, 0xc0, - 0xd8, 0xf7, 0x20, 0x00, 0x60, 0x18, 0x60, 0x23, - 0x31, 0x01, 0x1c, 0x08, 0xbc, 0x90, 0x47, 0x70, - 0xe7, 0xfc, 0xb4, 0x90, 0x1c, 0x03, 0x1c, 0x0a, - 0x6b, 0x18, 0x68, 0xd1, 0x68, 0x07, 0x2f, 0x00, - 0xd0, 0x0c, 0x68, 0x07, 0x60, 0x0f, 0x68, 0x41, - 0x68, 0x57, 0x68, 0x84, 0x19, 0x3f, 0x60, 0x57, - 0x27, 0x00, 0x60, 0x07, 0x27, 0x00, 0x60, 0x47, - 0x27, 0x00, 0x60, 0x87, 0x6a, 0xc7, 0x2f, 0x00, - 0xd0, 0x0c, 0x6a, 0xc7, 0x60, 0x0f, 0x6b, 0x01, - 0x68, 0x57, 0x6b, 0x44, 0x19, 0x3f, 0x60, 0x57, - 0x27, 0x00, 0x62, 0xc7, 0x27, 0x00, 0x63, 0x07, - 0x27, 0x00, 0x63, 0x47, 0x60, 0xd1, 0xbc, 0x90, - 0x47, 0x70, 0xe7, 0xfc, 0x20, 0x00, 0x49, 0x01, - 0x70, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x7c, 0x1c, - 0xb5, 0xff, 0xb0, 0x82, 0x9b, 0x05, 0x06, 0x18, - 0x16, 0x00, 0x90, 0x00, 0x98, 0x0c, 0x06, 0x01, - 0x16, 0x09, 0x91, 0x01, 0x98, 0x00, 0x28, 0x1f, - 0xdd, 0x05, 0x20, 0xaf, 0xb0, 0x02, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x37, - 0x78, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x20, 0xd2, - 0xb0, 0x02, 0xe7, 0xf4, 0xe0, 0x64, 0x20, 0xff, - 0x49, 0x32, 0x70, 0x08, 0x49, 0x32, 0x98, 0x00, - 0xf0, 0x09, 0xfa, 0xa8, 0x9a, 0x04, 0x2a, 0x00, - 0xd9, 0x52, 0x20, 0xff, 0x49, 0x2f, 0x70, 0x08, - 0x9d, 0x02, 0x98, 0x0b, 0x99, 0x01, 0x18, 0x44, - 0x99, 0x01, 0x20, 0xc0, 0x1a, 0x40, 0x9a, 0x04, - 0x42, 0x90, 0xd9, 0x01, 0x9f, 0x04, 0xe0, 0x02, - 0x99, 0x01, 0x20, 0xc0, 0x1a, 0x47, 0x1c, 0x3a, - 0x1c, 0x21, 0x1c, 0x28, 0x23, 0xfe, 0xf0, 0x05, - 0xfa, 0xa5, 0x1c, 0x06, 0x2e, 0xd0, 0xd1, 0x0a, - 0x20, 0x03, 0xf0, 0x04, 0xf9, 0xa9, 0x1c, 0x3a, - 0x1c, 0x21, 0x1c, 0x28, 0x23, 0xfe, 0xf0, 0x05, - 0xfa, 0x99, 0x1c, 0x06, 0xe7, 0xf2, 0x98, 0x02, - 0x19, 0xc0, 0x90, 0x02, 0x9a, 0x04, 0x1b, 0xd2, - 0x92, 0x04, 0x9d, 0x0b, 0x9c, 0x03, 0x9b, 0x00, - 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 0xf0, 0x05, - 0xfa, 0x89, 0x1c, 0x06, 0x2e, 0xd0, 0xd1, 0x0a, - 0x20, 0x03, 0xf0, 0x04, 0xf9, 0x8d, 0x9b, 0x00, - 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, 0xf0, 0x05, - 0xfa, 0x7d, 0x1c, 0x06, 0xe7, 0xf2, 0x99, 0x03, - 0x29, 0x20, 0xd3, 0x04, 0x99, 0x01, 0x18, 0x78, - 0x99, 0x03, 0x18, 0x41, 0x91, 0x03, 0x48, 0x0b, - 0x78, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x20, 0x03, - 0xf0, 0x04, 0xf9, 0x76, 0xe7, 0xf7, 0xe7, 0xa9, - 0x20, 0x00, 0x49, 0x04, 0x70, 0x08, 0x20, 0x00, - 0xb0, 0x02, 0xe7, 0x90, 0xb0, 0x02, 0xe7, 0x8e, - 0xe7, 0x8d, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0xa8, - 0x2e, 0x01, 0x2e, 0x19, 0x2e, 0x08, 0x7c, 0x1c, - 0xb5, 0xff, 0x1c, 0x0f, 0x9a, 0x02, 0x06, 0x14, - 0x0e, 0x24, 0x9b, 0x03, 0x06, 0x1d, 0x0e, 0x2d, - 0x2c, 0x1f, 0xdb, 0x04, 0x20, 0xb3, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x04, 0x3a, - 0x0c, 0x12, 0x2d, 0x01, 0xd1, 0x73, 0x20, 0x01, - 0x03, 0x40, 0x40, 0x10, 0xd0, 0x0a, 0x4b, 0x6f, - 0x40, 0x1a, 0x48, 0x6f, 0x68, 0x00, 0x68, 0x00, - 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, 0x4b, 0x6c, - 0x68, 0x1b, 0x60, 0x18, 0x20, 0x01, 0x02, 0x40, - 0x40, 0x10, 0xd0, 0x0a, 0x4b, 0x69, 0x40, 0x1a, - 0x48, 0x67, 0x68, 0x00, 0x68, 0x00, 0x23, 0x20, - 0x43, 0xdb, 0x40, 0x18, 0x4b, 0x64, 0x68, 0x1b, - 0x60, 0x18, 0x20, 0x01, 0x05, 0x00, 0x40, 0x38, - 0xd0, 0x08, 0x48, 0x63, 0x68, 0x00, 0x69, 0x80, - 0x23, 0x01, 0x05, 0x1b, 0x43, 0x18, 0x4b, 0x60, - 0x68, 0x1b, 0x61, 0x98, 0x20, 0x01, 0x05, 0x40, - 0x40, 0x38, 0xd0, 0x08, 0x48, 0x5c, 0x68, 0x00, - 0x69, 0x80, 0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, - 0x4b, 0x59, 0x68, 0x1b, 0x61, 0x98, 0x0a, 0x12, - 0x48, 0x55, 0x68, 0x00, 0x68, 0x00, 0x43, 0x90, - 0x4b, 0x53, 0x68, 0x1b, 0x60, 0x18, 0x48, 0x52, - 0x68, 0x00, 0x68, 0x00, 0x4b, 0x53, 0x65, 0x18, - 0x48, 0x51, 0x68, 0x00, 0x77, 0x04, 0x20, 0x09, - 0x04, 0x80, 0x40, 0x38, 0xd0, 0x35, 0x21, 0x00, - 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, - 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x01, - 0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x27, - 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0e, - 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x46, - 0x68, 0x1b, 0x5a, 0x18, 0x23, 0xff, 0x33, 0x01, - 0x43, 0x18, 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, - 0x4e, 0x41, 0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, - 0x04, 0x80, 0x40, 0x38, 0xd0, 0x10, 0x00, 0xc8, - 0x1a, 0x40, 0x00, 0x80, 0xe0, 0x00, 0xe0, 0x0d, - 0x4b, 0x3b, 0x68, 0x1b, 0x5a, 0x18, 0x23, 0x01, - 0x02, 0x5b, 0x43, 0x18, 0x00, 0xcb, 0x1a, 0x5b, - 0x00, 0x9b, 0x4e, 0x37, 0x68, 0x36, 0x52, 0xf0, - 0xe7, 0xcd, 0xe0, 0x5c, 0x2d, 0x02, 0xd1, 0x5a, - 0x0a, 0x12, 0x48, 0x2f, 0x68, 0x00, 0x68, 0x00, - 0x43, 0x10, 0x4b, 0x2d, 0x68, 0x1b, 0x60, 0x18, - 0x48, 0x2b, 0x68, 0x00, 0x68, 0x00, 0x4b, 0x2d, - 0x65, 0x18, 0x20, 0x01, 0x05, 0x00, 0x40, 0x38, - 0xd0, 0x07, 0x48, 0x29, 0x68, 0x00, 0x69, 0x80, - 0x4b, 0x2a, 0x40, 0x18, 0x4b, 0x26, 0x68, 0x1b, - 0x61, 0x98, 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, - 0xd0, 0x07, 0x48, 0x23, 0x68, 0x00, 0x69, 0x80, - 0x4b, 0x25, 0x40, 0x18, 0x4b, 0x20, 0x68, 0x1b, - 0x61, 0x98, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, + 0x20, 0x00, 0xb0, 0x08, 0xe7, 0x66, 0x99, 0x05, + 0x00, 0x88, 0x49, 0x3f, 0x58, 0x08, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0xb0, 0xb0, 0x08, 0xe7, 0x5d, + 0x99, 0x07, 0x29, 0x11, 0xdb, 0x02, 0x99, 0x07, + 0x29, 0x13, 0xdd, 0x02, 0x20, 0xb1, 0xb0, 0x08, + 0xe7, 0x54, 0x99, 0x09, 0x00, 0x88, 0x1f, 0xc1, + 0x39, 0x21, 0x91, 0x01, 0x20, 0xff, 0x30, 0x81, + 0x90, 0x00, 0x99, 0x01, 0x98, 0x00, 0x42, 0x81, + 0xda, 0x02, 0x20, 0xb5, 0xb0, 0x08, 0xe7, 0x45, + 0x9d, 0x08, 0x98, 0x08, 0x30, 0x1c, 0x90, 0x08, + 0x98, 0x08, 0x90, 0x04, 0x98, 0x08, 0x30, 0x0c, + 0x90, 0x08, 0x98, 0x08, 0x90, 0x02, 0x9a, 0x02, + 0x98, 0x04, 0x60, 0x02, 0x99, 0x09, 0x98, 0x04, + 0x60, 0x41, 0x20, 0x00, 0x99, 0x04, 0x60, 0x88, + 0x20, 0x00, 0x61, 0xa8, 0x1d, 0xe8, 0x30, 0x11, + 0x9a, 0x02, 0x99, 0x01, 0xf0, 0x00, 0xf8, 0x56, + 0x20, 0x00, 0x70, 0x28, 0x98, 0x06, 0x99, 0x07, + 0x43, 0x08, 0x70, 0x68, 0x20, 0x00, 0x70, 0xa8, + 0x20, 0x02, 0x70, 0xe8, 0x20, 0x00, 0x71, 0x28, + 0x98, 0x04, 0x60, 0xa8, 0x20, 0x00, 0x60, 0xe8, + 0x9a, 0x02, 0x61, 0x2a, 0x9a, 0x02, 0x61, 0x6a, + 0x99, 0x05, 0x00, 0x88, 0x49, 0x16, 0x50, 0x0d, + 0x20, 0x00, 0x60, 0xf8, 0x88, 0x38, 0x4b, 0x1c, + 0x40, 0x18, 0x80, 0x38, 0x20, 0x00, 0x60, 0xb8, + 0x9a, 0x02, 0x60, 0x7a, 0x98, 0x06, 0x99, 0x07, + 0x43, 0x08, 0x70, 0xb8, 0x24, 0x00, 0x2c, 0x0c, + 0xdb, 0x04, 0xe0, 0x07, 0x1c, 0x60, 0x06, 0x04, + 0x0e, 0x24, 0xe7, 0xf8, 0x20, 0x00, 0x19, 0x39, + 0x74, 0x08, 0xe7, 0xf7, 0x20, 0x00, 0x83, 0x38, + 0x20, 0x00, 0x70, 0xf8, 0x20, 0xff, 0x76, 0x38, + 0x20, 0xff, 0x76, 0x78, 0x20, 0x00, 0xb0, 0x08, + 0xe6, 0xec, 0xb0, 0x05, 0xb0, 0x03, 0xe6, 0xe9, + 0x2e, 0x08, 0x5d, 0xc4, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5f, 0xa4, + 0x2e, 0x08, 0x5e, 0xdc, 0x2e, 0x08, 0x5e, 0xe4, + 0x9e, 0x00, 0x04, 0xb8, 0x2e, 0x08, 0x5f, 0x64, + 0x2e, 0x08, 0x5e, 0xe0, 0x2e, 0x08, 0x5f, 0xc4, + 0xff, 0xff, 0xfb, 0xff, 0xb4, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x21, 0x00, 0x68, 0x22, + 0x2a, 0x00, 0xd0, 0x00, 0x60, 0x13, 0x1d, 0xd8, + 0x30, 0xb9, 0x60, 0x18, 0x33, 0xc0, 0x31, 0x01, + 0x3f, 0xc0, 0x2f, 0xc0, 0xd8, 0xf7, 0x20, 0x00, + 0x60, 0x18, 0x60, 0x23, 0x31, 0x01, 0x1c, 0x08, + 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0xb4, 0x90, + 0x1c, 0x03, 0x1c, 0x0a, 0x6b, 0x18, 0x68, 0xd1, + 0x68, 0x07, 0x2f, 0x00, 0xd0, 0x0c, 0x68, 0x07, + 0x60, 0x0f, 0x68, 0x41, 0x68, 0x57, 0x68, 0x84, + 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x60, 0x07, + 0x27, 0x00, 0x60, 0x47, 0x27, 0x00, 0x60, 0x87, + 0x6a, 0xc7, 0x2f, 0x00, 0xd0, 0x0c, 0x6a, 0xc7, + 0x60, 0x0f, 0x6b, 0x01, 0x68, 0x57, 0x6b, 0x44, + 0x19, 0x3f, 0x60, 0x57, 0x27, 0x00, 0x62, 0xc7, + 0x27, 0x00, 0x63, 0x07, 0x27, 0x00, 0x63, 0x47, + 0x60, 0xd1, 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, + 0x20, 0x00, 0x49, 0x01, 0x70, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0xb0, 0x82, + 0x9b, 0x05, 0x06, 0x18, 0x16, 0x00, 0x90, 0x00, + 0x98, 0x0c, 0x06, 0x01, 0x16, 0x09, 0x91, 0x01, + 0x98, 0x00, 0x28, 0x1f, 0xdd, 0x05, 0x20, 0xaf, + 0xb0, 0x02, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x37, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0x20, 0xd2, 0xb0, 0x02, 0xe7, 0xf4, + 0xe0, 0x64, 0x20, 0xff, 0x49, 0x32, 0x70, 0x08, + 0x49, 0x32, 0x98, 0x00, 0xf0, 0x09, 0xfa, 0xca, + 0x9a, 0x04, 0x2a, 0x00, 0xd9, 0x52, 0x20, 0xff, + 0x49, 0x2f, 0x70, 0x08, 0x9d, 0x02, 0x98, 0x0b, + 0x99, 0x01, 0x18, 0x44, 0x99, 0x01, 0x20, 0xc0, + 0x1a, 0x40, 0x9a, 0x04, 0x42, 0x90, 0xd9, 0x01, + 0x9f, 0x04, 0xe0, 0x02, 0x99, 0x01, 0x20, 0xc0, + 0x1a, 0x47, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, + 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0xa5, 0x1c, 0x06, + 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, + 0xf9, 0xa9, 0x1c, 0x3a, 0x1c, 0x21, 0x1c, 0x28, + 0x23, 0xfe, 0xf0, 0x05, 0xfa, 0x99, 0x1c, 0x06, + 0xe7, 0xf2, 0x98, 0x02, 0x19, 0xc0, 0x90, 0x02, + 0x9a, 0x04, 0x1b, 0xd2, 0x92, 0x04, 0x9d, 0x0b, + 0x9c, 0x03, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, + 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x89, 0x1c, 0x06, + 0x2e, 0xd0, 0xd1, 0x0a, 0x20, 0x03, 0xf0, 0x04, + 0xf9, 0x8d, 0x9b, 0x00, 0x1c, 0x3a, 0x1c, 0x21, + 0x1c, 0x28, 0xf0, 0x05, 0xfa, 0x7d, 0x1c, 0x06, + 0xe7, 0xf2, 0x99, 0x03, 0x29, 0x20, 0xd3, 0x04, + 0x99, 0x01, 0x18, 0x78, 0x99, 0x03, 0x18, 0x41, + 0x91, 0x03, 0x48, 0x0b, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x03, 0x20, 0x03, 0xf0, 0x04, 0xf9, 0x76, + 0xe7, 0xf7, 0xe7, 0xa9, 0x20, 0x00, 0x49, 0x04, + 0x70, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x90, + 0xb0, 0x02, 0xe7, 0x8e, 0xe7, 0x8d, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0xa0, 0x2e, 0x01, 0x35, 0x35, + 0x2e, 0x08, 0x7c, 0x14, 0xb5, 0xff, 0x1c, 0x0f, + 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, 0x9b, 0x03, + 0x06, 0x1d, 0x0e, 0x2d, 0x2c, 0x1f, 0xdb, 0x04, + 0x20, 0xb3, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x04, 0x3a, 0x0c, 0x12, 0x2d, 0x01, + 0xd1, 0x73, 0x20, 0x01, 0x03, 0x40, 0x40, 0x10, + 0xd0, 0x0a, 0x4b, 0x6f, 0x40, 0x1a, 0x48, 0x6f, + 0x68, 0x00, 0x68, 0x00, 0x23, 0x02, 0x43, 0xdb, + 0x40, 0x18, 0x4b, 0x6c, 0x68, 0x1b, 0x60, 0x18, + 0x20, 0x01, 0x02, 0x40, 0x40, 0x10, 0xd0, 0x0a, + 0x4b, 0x69, 0x40, 0x1a, 0x48, 0x67, 0x68, 0x00, + 0x68, 0x00, 0x23, 0x20, 0x43, 0xdb, 0x40, 0x18, + 0x4b, 0x64, 0x68, 0x1b, 0x60, 0x18, 0x20, 0x01, + 0x05, 0x00, 0x40, 0x38, 0xd0, 0x08, 0x48, 0x63, + 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, 0x05, 0x1b, + 0x43, 0x18, 0x4b, 0x60, 0x68, 0x1b, 0x61, 0x98, + 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x08, + 0x48, 0x5c, 0x68, 0x00, 0x69, 0x80, 0x23, 0x01, + 0x05, 0x5b, 0x43, 0x18, 0x4b, 0x59, 0x68, 0x1b, + 0x61, 0x98, 0x0a, 0x12, 0x48, 0x55, 0x68, 0x00, + 0x68, 0x00, 0x43, 0x90, 0x4b, 0x53, 0x68, 0x1b, + 0x60, 0x18, 0x48, 0x52, 0x68, 0x00, 0x68, 0x00, + 0x4b, 0x53, 0x65, 0x18, 0x48, 0x51, 0x68, 0x00, + 0x77, 0x04, 0x20, 0x09, 0x04, 0x80, 0x40, 0x38, + 0xd0, 0x35, 0x21, 0x00, 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, - 0xe7, 0xf8, 0x20, 0x09, 0x04, 0x80, 0x40, 0x38, - 0xd0, 0x28, 0x20, 0x01, 0x40, 0x88, 0x9b, 0x00, - 0x40, 0x18, 0xd0, 0x23, 0x20, 0x01, 0x05, 0x40, + 0xe7, 0xf8, 0x20, 0x01, 0x40, 0x88, 0x9b, 0x00, + 0x40, 0x18, 0xd0, 0x27, 0x20, 0x01, 0x05, 0x40, + 0x40, 0x38, 0xd0, 0x0e, 0x00, 0xc8, 0x1a, 0x40, + 0x00, 0x80, 0x4b, 0x46, 0x68, 0x1b, 0x5a, 0x18, + 0x23, 0xff, 0x33, 0x01, 0x43, 0x18, 0x00, 0xcb, + 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x41, 0x68, 0x36, + 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 0x40, 0x38, + 0xd0, 0x10, 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, + 0xe0, 0x00, 0xe0, 0x0d, 0x4b, 0x3b, 0x68, 0x1b, + 0x5a, 0x18, 0x23, 0x01, 0x02, 0x5b, 0x43, 0x18, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x37, + 0x68, 0x36, 0x52, 0xf0, 0xe7, 0xcd, 0xe0, 0x5c, + 0x2d, 0x02, 0xd1, 0x5a, 0x0a, 0x12, 0x48, 0x2f, + 0x68, 0x00, 0x68, 0x00, 0x43, 0x10, 0x4b, 0x2d, + 0x68, 0x1b, 0x60, 0x18, 0x48, 0x2b, 0x68, 0x00, + 0x68, 0x00, 0x4b, 0x2d, 0x65, 0x18, 0x20, 0x01, + 0x05, 0x00, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x29, + 0x68, 0x00, 0x69, 0x80, 0x4b, 0x2a, 0x40, 0x18, + 0x4b, 0x26, 0x68, 0x1b, 0x61, 0x98, 0x20, 0x01, + 0x05, 0x40, 0x40, 0x38, 0xd0, 0x07, 0x48, 0x23, + 0x68, 0x00, 0x69, 0x80, 0x4b, 0x25, 0x40, 0x18, + 0x4b, 0x20, 0x68, 0x1b, 0x61, 0x98, 0x21, 0x00, + 0x29, 0x20, 0xdb, 0x04, 0xe0, 0x31, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x20, 0x09, + 0x04, 0x80, 0x40, 0x38, 0xd0, 0x28, 0x20, 0x01, + 0x40, 0x88, 0x9b, 0x00, 0x40, 0x18, 0xd0, 0x23, + 0x20, 0x01, 0x05, 0x40, 0x40, 0x38, 0xd0, 0x0d, + 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x15, + 0x68, 0x1b, 0x5a, 0x18, 0x4b, 0x16, 0x40, 0x18, + 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x11, + 0x68, 0x36, 0x52, 0xf0, 0x20, 0x01, 0x04, 0x80, 0x40, 0x38, 0xd0, 0x0d, 0x00, 0xc8, 0x1a, 0x40, - 0x00, 0x80, 0x4b, 0x15, 0x68, 0x1b, 0x5a, 0x18, - 0x4b, 0x16, 0x40, 0x18, 0x00, 0xcb, 0x1a, 0x5b, - 0x00, 0x9b, 0x4e, 0x11, 0x68, 0x36, 0x52, 0xf0, - 0x20, 0x01, 0x04, 0x80, 0x40, 0x38, 0xd0, 0x0d, - 0x00, 0xc8, 0x1a, 0x40, 0x00, 0x80, 0x4b, 0x0c, - 0x68, 0x1b, 0x5a, 0x18, 0x4b, 0x05, 0x40, 0x18, - 0x00, 0xcb, 0x1a, 0x5b, 0x00, 0x9b, 0x4e, 0x08, - 0x68, 0x36, 0x52, 0xf0, 0xe7, 0xcd, 0x20, 0x00, - 0xe7, 0x15, 0xe7, 0x14, 0xff, 0xff, 0xfd, 0xff, - 0x2e, 0x08, 0x7c, 0x20, 0xff, 0xff, 0xdf, 0xff, - 0x2e, 0x08, 0x5e, 0x14, 0x66, 0x00, 0x00, 0x80, - 0x2e, 0x08, 0x5d, 0xcc, 0xff, 0xef, 0xff, 0xff, - 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xb5, 0x80, 0x1c, 0x07, 0x48, 0x17, 0x68, 0x01, - 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x47, 0x60, 0x38, - 0x48, 0x14, 0x68, 0x00, 0x1d, 0x01, 0x20, 0x00, - 0xf0, 0x12, 0xf8, 0x40, 0x60, 0x78, 0x48, 0x11, - 0x68, 0x00, 0x1d, 0xc1, 0x31, 0x05, 0x20, 0x00, - 0xf0, 0x12, 0xf8, 0x38, 0x60, 0xf8, 0x48, 0x0d, - 0x68, 0x00, 0x1d, 0xc1, 0x31, 0x09, 0x20, 0x00, - 0xf0, 0x12, 0xf8, 0x30, 0x61, 0x38, 0x48, 0x09, - 0x68, 0x00, 0x1d, 0xc1, 0x31, 0x0d, 0x20, 0x00, - 0xf0, 0x12, 0xf8, 0x28, 0x61, 0x78, 0x48, 0x05, - 0x68, 0x00, 0x1d, 0xc1, 0x31, 0x01, 0x20, 0x00, - 0xf0, 0x12, 0xf8, 0x20, 0x60, 0xb8, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x5e, 0x14, - 0xb5, 0xf0, 0x1c, 0x07, 0xb0, 0x82, 0x26, 0x00, - 0x89, 0xb8, 0x23, 0x08, 0x40, 0x18, 0xd0, 0x08, - 0x48, 0x59, 0x6e, 0xc2, 0x48, 0x58, 0x6f, 0x01, - 0x48, 0x57, 0x6a, 0x00, 0xf7, 0xfd, 0xff, 0x5c, - 0x1c, 0x06, 0x89, 0xb8, 0x23, 0x10, 0x40, 0x18, - 0xd0, 0x02, 0x48, 0x53, 0x69, 0x40, 0x1c, 0x06, - 0x89, 0xb8, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x21, - 0x48, 0x50, 0x68, 0xc0, 0x90, 0x00, 0x68, 0x78, - 0x02, 0x40, 0x99, 0x00, 0x1a, 0x08, 0x90, 0x01, - 0x98, 0x01, 0x21, 0x33, 0x06, 0x49, 0x65, 0xc8, - 0x98, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0x08, - 0x98, 0x01, 0x49, 0x48, 0x60, 0x88, 0x98, 0x00, - 0x49, 0x46, 0x60, 0xc8, 0x20, 0x01, 0x21, 0x33, - 0x06, 0x49, 0x66, 0xc8, 0x20, 0x00, 0x21, 0x33, - 0x06, 0x49, 0x66, 0xc8, 0x89, 0xb8, 0x23, 0x02, - 0x43, 0x18, 0x81, 0xb8, 0x89, 0xb8, 0x23, 0x02, - 0x40, 0x18, 0xd0, 0x3e, 0x48, 0x3d, 0x68, 0x80, - 0x1f, 0xc4, 0x3c, 0xff, 0x3c, 0xfa, 0x68, 0x38, - 0x02, 0x40, 0x1a, 0x25, 0x48, 0x38, 0x60, 0x45, - 0x48, 0x37, 0x60, 0x84, 0x20, 0x33, 0x06, 0x40, - 0x65, 0x45, 0x20, 0x33, 0x06, 0x40, 0x65, 0x84, - 0x1b, 0x60, 0x38, 0xc0, 0x21, 0x33, 0x06, 0x49, - 0x66, 0x88, 0x21, 0x00, 0x48, 0x32, 0xf7, 0xfd, - 0xfb, 0x89, 0x48, 0x32, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x00, 0xe7, 0xfa, 0x48, 0x30, 0x68, 0x01, - 0x23, 0xff, 0x33, 0x01, 0x43, 0x19, 0x60, 0x01, - 0x48, 0x2e, 0x6d, 0x80, 0x49, 0x2d, 0x65, 0x88, - 0x48, 0x2c, 0x6b, 0xc0, 0x23, 0x01, 0x07, 0x9b, - 0x40, 0x18, 0xd0, 0x00, 0xe7, 0xf8, 0x20, 0x33, - 0x06, 0x40, 0x66, 0x45, 0x20, 0x33, 0x06, 0x40, - 0x66, 0x84, 0x21, 0x00, 0x20, 0xff, 0xf7, 0xfd, - 0xfb, 0x69, 0x48, 0x20, 0x60, 0x05, 0x48, 0x1f, - 0x60, 0x44, 0x89, 0xb8, 0x23, 0x04, 0x40, 0x18, - 0xd0, 0x21, 0x68, 0xb8, 0x28, 0x00, 0xd1, 0x06, - 0x48, 0x1f, 0x68, 0x01, 0x23, 0x02, 0x43, 0xdb, - 0x40, 0x19, 0x60, 0x01, 0xe0, 0x17, 0x69, 0x38, - 0x49, 0x1a, 0x65, 0x88, 0x69, 0x38, 0x68, 0xb9, - 0x02, 0x49, 0x18, 0x40, 0x49, 0x17, 0x65, 0xc8, - 0x20, 0x03, 0x02, 0x00, 0x49, 0x15, 0x67, 0x48, - 0x20, 0x02, 0x49, 0x14, 0x67, 0x88, 0x20, 0x40, - 0x49, 0x12, 0x66, 0x08, 0x48, 0x12, 0x68, 0x01, - 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, 0x20, 0x33, - 0x06, 0x40, 0x6d, 0x40, 0x23, 0x0d, 0x06, 0x9b, - 0x1a, 0xc0, 0x60, 0x38, 0x20, 0x33, 0x06, 0x40, - 0x6d, 0xc0, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, - 0x60, 0x78, 0x48, 0x0a, 0x43, 0x30, 0x60, 0xb8, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x7c, 0x24, - 0x00, 0x00, 0x80, 0x0f, 0xcc, 0x00, 0x05, 0x00, - 0x66, 0x00, 0x00, 0xe0, 0x66, 0x00, 0x00, 0x80, - 0x66, 0x00, 0x00, 0xf0, 0xcc, 0x00, 0x00, 0x00, - 0xb5, 0xf3, 0x1c, 0x02, 0xb0, 0x81, 0x68, 0x93, - 0x68, 0x54, 0x21, 0x00, 0x1d, 0xd8, 0x30, 0xb9, - 0x1b, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x2d, 0x12, - 0xda, 0x12, 0x21, 0x00, 0x42, 0xa9, 0xdb, 0x04, - 0xe0, 0x08, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, - 0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01, 0x98, 0x02, - 0x54, 0x46, 0xe7, 0xf6, 0x68, 0x1b, 0x1d, 0x18, - 0x90, 0x00, 0x98, 0x00, 0x78, 0x80, 0x18, 0xc4, - 0x1c, 0x0f, 0x2f, 0x12, 0xdb, 0x04, 0xe0, 0x08, - 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, - 0x78, 0x26, 0x34, 0x01, 0x98, 0x02, 0x55, 0xc6, - 0xe7, 0xf6, 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, - 0xe7, 0xf9, 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0d, - 0x1c, 0x14, 0xb0, 0x82, 0x20, 0x00, 0x70, 0x20, - 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x03, - 0x20, 0xb1, 0xb0, 0x02, 0xbc, 0xf0, 0x47, 0x70, - 0x78, 0xba, 0x20, 0x40, 0x40, 0x10, 0xd0, 0x2a, - 0x07, 0x12, 0x0f, 0x12, 0x07, 0xd0, 0x0f, 0xc0, - 0xd0, 0x25, 0x20, 0x40, 0x70, 0x20, 0x35, 0x0a, - 0x21, 0x00, 0x1d, 0xf8, 0x30, 0x0d, 0x90, 0x01, - 0x1d, 0xf8, 0x30, 0x1d, 0x90, 0x00, 0x21, 0x00, - 0x29, 0x08, 0xdb, 0x04, 0xe0, 0x14, 0x1c, 0x48, - 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x2e, - 0x35, 0x01, 0x98, 0x00, 0x78, 0x03, 0x30, 0x01, - 0x90, 0x00, 0x40, 0x33, 0x98, 0x01, 0x78, 0x06, - 0x30, 0x01, 0x90, 0x01, 0x42, 0xb3, 0xd0, 0x02, - 0x20, 0x00, 0x70, 0x20, 0xe0, 0x00, 0xe7, 0xea, - 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xce, 0x20, 0xb1, - 0xb0, 0x02, 0xe7, 0xcb, 0xb0, 0x02, 0xe7, 0xc9, - 0xb5, 0xf7, 0x1c, 0x07, 0xb0, 0x8d, 0x20, 0x00, - 0x9a, 0x0f, 0x70, 0x10, 0x78, 0x78, 0x23, 0x80, - 0x40, 0x18, 0xd0, 0x05, 0x20, 0xb1, 0xb0, 0x0d, - 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x78, 0xb8, 0x90, 0x05, 0x98, 0x05, 0x23, 0x40, - 0x40, 0x18, 0xd0, 0x73, 0x98, 0x05, 0x07, 0x00, - 0x0f, 0x00, 0x90, 0x05, 0x98, 0x05, 0x23, 0x02, - 0x40, 0x18, 0xd1, 0x03, 0x98, 0x05, 0x23, 0x04, - 0x40, 0x18, 0xd0, 0x68, 0x99, 0x0e, 0x79, 0x48, - 0x23, 0x3e, 0x40, 0x18, 0x90, 0x0c, 0x78, 0xf8, - 0x90, 0x04, 0x98, 0x04, 0x01, 0x00, 0x4b, 0x81, - 0x18, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x68, 0x00, - 0x90, 0x01, 0x78, 0x7c, 0x23, 0xbf, 0x40, 0x1c, - 0x23, 0xfe, 0x40, 0x1c, 0x20, 0x00, 0x90, 0x03, - 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, 0x99, 0x0c, - 0x42, 0x88, 0xd0, 0x08, 0x06, 0x20, 0x0e, 0x00, - 0x24, 0x01, 0x43, 0x04, 0x20, 0x01, 0x90, 0x03, - 0x23, 0xdf, 0x40, 0x1c, 0xe0, 0x06, 0x20, 0x02, - 0x40, 0x20, 0xd0, 0x03, 0x70, 0x7c, 0x20, 0x00, - 0xb0, 0x0d, 0xe7, 0xbd, 0x23, 0xfd, 0x40, 0x1c, - 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x73, - 0x6a, 0xfd, 0x98, 0x03, 0x28, 0x00, 0xd0, 0x14, - 0x26, 0x00, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x0e, + 0x00, 0x80, 0x4b, 0x0c, 0x68, 0x1b, 0x5a, 0x18, + 0x4b, 0x05, 0x40, 0x18, 0x00, 0xcb, 0x1a, 0x5b, + 0x00, 0x9b, 0x4e, 0x08, 0x68, 0x36, 0x52, 0xf0, + 0xe7, 0xcd, 0x20, 0x00, 0xe7, 0x15, 0xe7, 0x14, + 0xff, 0xff, 0xfd, 0xff, 0x2e, 0x08, 0x7c, 0x18, + 0xff, 0xff, 0xdf, 0xff, 0x2e, 0x08, 0x5e, 0x0c, + 0x66, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xc4, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xb5, 0x80, 0x1c, 0x07, + 0x48, 0x17, 0x68, 0x01, 0x20, 0x00, 0xf0, 0x12, + 0xf8, 0x69, 0x60, 0x38, 0x48, 0x14, 0x68, 0x00, + 0x1d, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x62, + 0x60, 0x78, 0x48, 0x11, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x05, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x5a, + 0x60, 0xf8, 0x48, 0x0d, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x09, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x52, + 0x61, 0x38, 0x48, 0x09, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x0d, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x4a, + 0x61, 0x78, 0x48, 0x05, 0x68, 0x00, 0x1d, 0xc1, + 0x31, 0x01, 0x20, 0x00, 0xf0, 0x12, 0xf8, 0x42, + 0x60, 0xb8, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x5e, 0x0c, 0xb5, 0xf0, 0x1c, 0x07, + 0xb0, 0x82, 0x26, 0x00, 0x89, 0xb8, 0x23, 0x08, + 0x40, 0x18, 0xd0, 0x08, 0x48, 0x59, 0x6e, 0xc2, + 0x48, 0x58, 0x6f, 0x01, 0x48, 0x57, 0x6a, 0x00, + 0xf7, 0xfd, 0xff, 0x5c, 0x1c, 0x06, 0x89, 0xb8, + 0x23, 0x10, 0x40, 0x18, 0xd0, 0x02, 0x48, 0x53, + 0x69, 0x40, 0x1c, 0x06, 0x89, 0xb8, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x21, 0x48, 0x50, 0x68, 0xc0, + 0x90, 0x00, 0x68, 0x78, 0x02, 0x40, 0x99, 0x00, + 0x1a, 0x08, 0x90, 0x01, 0x98, 0x01, 0x21, 0x33, + 0x06, 0x49, 0x65, 0xc8, 0x98, 0x00, 0x21, 0x33, + 0x06, 0x49, 0x66, 0x08, 0x98, 0x01, 0x49, 0x48, + 0x60, 0x88, 0x98, 0x00, 0x49, 0x46, 0x60, 0xc8, + 0x20, 0x01, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, + 0x20, 0x00, 0x21, 0x33, 0x06, 0x49, 0x66, 0xc8, + 0x89, 0xb8, 0x23, 0x02, 0x43, 0x18, 0x81, 0xb8, + 0x89, 0xb8, 0x23, 0x02, 0x40, 0x18, 0xd0, 0x3e, + 0x48, 0x3d, 0x68, 0x80, 0x1f, 0xc4, 0x3c, 0xff, + 0x3c, 0xfa, 0x68, 0x38, 0x02, 0x40, 0x1a, 0x25, + 0x48, 0x38, 0x60, 0x45, 0x48, 0x37, 0x60, 0x84, + 0x20, 0x33, 0x06, 0x40, 0x65, 0x45, 0x20, 0x33, + 0x06, 0x40, 0x65, 0x84, 0x1b, 0x60, 0x38, 0xc0, + 0x21, 0x33, 0x06, 0x49, 0x66, 0x88, 0x21, 0x00, + 0x48, 0x32, 0xf7, 0xfd, 0xfb, 0x89, 0x48, 0x32, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xfa, + 0x48, 0x30, 0x68, 0x01, 0x23, 0xff, 0x33, 0x01, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x2e, 0x6d, 0x80, + 0x49, 0x2d, 0x65, 0x88, 0x48, 0x2c, 0x6b, 0xc0, + 0x23, 0x01, 0x07, 0x9b, 0x40, 0x18, 0xd0, 0x00, + 0xe7, 0xf8, 0x20, 0x33, 0x06, 0x40, 0x66, 0x45, + 0x20, 0x33, 0x06, 0x40, 0x66, 0x84, 0x21, 0x00, + 0x20, 0xff, 0xf7, 0xfd, 0xfb, 0x69, 0x48, 0x20, + 0x60, 0x05, 0x48, 0x1f, 0x60, 0x44, 0x89, 0xb8, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x21, 0x68, 0xb8, + 0x28, 0x00, 0xd1, 0x06, 0x48, 0x1f, 0x68, 0x01, + 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0xe0, 0x17, 0x69, 0x38, 0x49, 0x1a, 0x65, 0x88, + 0x69, 0x38, 0x68, 0xb9, 0x02, 0x49, 0x18, 0x40, + 0x49, 0x17, 0x65, 0xc8, 0x20, 0x03, 0x02, 0x00, + 0x49, 0x15, 0x67, 0x48, 0x20, 0x02, 0x49, 0x14, + 0x67, 0x88, 0x20, 0x40, 0x49, 0x12, 0x66, 0x08, + 0x48, 0x12, 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, + 0x60, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6d, 0x40, + 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x38, + 0x20, 0x33, 0x06, 0x40, 0x6d, 0xc0, 0x23, 0x0d, + 0x06, 0x9b, 0x1a, 0xc0, 0x60, 0x78, 0x48, 0x0a, + 0x43, 0x30, 0x60, 0xb8, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xcc, 0x00, 0x0f, 0x80, + 0x2e, 0x08, 0x7c, 0x1c, 0x00, 0x00, 0x80, 0x0f, + 0xcc, 0x00, 0x05, 0x00, 0x66, 0x00, 0x00, 0xe0, + 0x66, 0x00, 0x00, 0x80, 0x66, 0x00, 0x00, 0xf0, + 0xcc, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x1c, 0x02, + 0xb0, 0x81, 0x68, 0x93, 0x68, 0x54, 0x21, 0x00, + 0x1d, 0xd8, 0x30, 0xb9, 0x1b, 0x00, 0x06, 0x05, + 0x0e, 0x2d, 0x2d, 0x12, 0xda, 0x12, 0x21, 0x00, + 0x42, 0xa9, 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x48, + 0x06, 0x01, 0x0e, 0x09, 0xe7, 0xf8, 0x78, 0x26, + 0x34, 0x01, 0x98, 0x02, 0x54, 0x46, 0xe7, 0xf6, + 0x68, 0x1b, 0x1d, 0x18, 0x90, 0x00, 0x98, 0x00, + 0x78, 0x80, 0x18, 0xc4, 0x1c, 0x0f, 0x2f, 0x12, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x78, 0x06, 0x07, + 0x0e, 0x3f, 0xe7, 0xf8, 0x78, 0x26, 0x34, 0x01, + 0x98, 0x02, 0x55, 0xc6, 0xe7, 0xf6, 0x20, 0x00, + 0xb0, 0x01, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0xb4, 0xf0, + 0x1c, 0x07, 0x1c, 0x0d, 0x1c, 0x14, 0xb0, 0x82, + 0x20, 0x00, 0x70, 0x20, 0x78, 0x78, 0x23, 0x80, + 0x40, 0x18, 0xd0, 0x03, 0x20, 0xb1, 0xb0, 0x02, + 0xbc, 0xf0, 0x47, 0x70, 0x78, 0xba, 0x20, 0x40, + 0x40, 0x10, 0xd0, 0x2a, 0x07, 0x12, 0x0f, 0x12, + 0x07, 0xd0, 0x0f, 0xc0, 0xd0, 0x25, 0x20, 0x40, + 0x70, 0x20, 0x35, 0x0a, 0x21, 0x00, 0x1d, 0xf8, + 0x30, 0x0d, 0x90, 0x01, 0x1d, 0xf8, 0x30, 0x1d, + 0x90, 0x00, 0x21, 0x00, 0x29, 0x08, 0xdb, 0x04, + 0xe0, 0x14, 0x1c, 0x48, 0x06, 0x01, 0x0e, 0x09, + 0xe7, 0xf8, 0x78, 0x2e, 0x35, 0x01, 0x98, 0x00, + 0x78, 0x03, 0x30, 0x01, 0x90, 0x00, 0x40, 0x33, + 0x98, 0x01, 0x78, 0x06, 0x30, 0x01, 0x90, 0x01, + 0x42, 0xb3, 0xd0, 0x02, 0x20, 0x00, 0x70, 0x20, + 0xe0, 0x00, 0xe7, 0xea, 0x20, 0x00, 0xb0, 0x02, + 0xe7, 0xce, 0x20, 0xb1, 0xb0, 0x02, 0xe7, 0xcb, + 0xb0, 0x02, 0xe7, 0xc9, 0xb5, 0xf7, 0x1c, 0x07, + 0xb0, 0x8d, 0x20, 0x00, 0x9a, 0x0f, 0x70, 0x10, + 0x78, 0x78, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0xb1, 0xb0, 0x0d, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x78, 0xb8, 0x90, 0x05, + 0x98, 0x05, 0x23, 0x40, 0x40, 0x18, 0xd0, 0x73, + 0x98, 0x05, 0x07, 0x00, 0x0f, 0x00, 0x90, 0x05, + 0x98, 0x05, 0x23, 0x02, 0x40, 0x18, 0xd1, 0x03, + 0x98, 0x05, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x68, + 0x99, 0x0e, 0x79, 0x48, 0x23, 0x3e, 0x40, 0x18, + 0x90, 0x0c, 0x78, 0xf8, 0x90, 0x04, 0x98, 0x04, + 0x01, 0x00, 0x4b, 0x81, 0x18, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x68, 0x00, 0x90, 0x01, 0x78, 0x7c, + 0x23, 0xbf, 0x40, 0x1c, 0x23, 0xfe, 0x40, 0x1c, + 0x20, 0x00, 0x90, 0x03, 0x98, 0x01, 0x06, 0x00, + 0x0e, 0x00, 0x99, 0x0c, 0x42, 0x88, 0xd0, 0x08, + 0x06, 0x20, 0x0e, 0x00, 0x24, 0x01, 0x43, 0x04, + 0x20, 0x01, 0x90, 0x03, 0x23, 0xdf, 0x40, 0x1c, + 0xe0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x03, + 0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, 0xe7, 0xbd, + 0x23, 0xfd, 0x40, 0x1c, 0x98, 0x05, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x73, 0x6a, 0xfd, 0x98, 0x03, + 0x28, 0x00, 0xd0, 0x14, 0x26, 0x00, 0x2e, 0x08, + 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x70, 0x06, 0x06, + 0x0e, 0x36, 0xe7, 0xf8, 0x00, 0xb0, 0x19, 0x40, + 0x68, 0x40, 0x00, 0xb1, 0x19, 0x49, 0x64, 0x48, + 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0x62, 0x48, + 0xe7, 0xf0, 0x88, 0x28, 0x80, 0x68, 0x20, 0x20, + 0x40, 0x20, 0xd1, 0x3e, 0x99, 0x0e, 0x79, 0xc8, + 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x0a, + 0x99, 0x0e, 0x79, 0xc8, 0x06, 0xc0, 0x0e, 0xc0, + 0x90, 0x09, 0x98, 0x0a, 0x30, 0x01, 0x06, 0x06, + 0x0e, 0x36, 0x2e, 0x08, 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x70, 0x06, 0x06, 0x0e, 0x36, 0xe7, 0xf8, - 0x00, 0xb0, 0x19, 0x40, 0x68, 0x40, 0x00, 0xb1, - 0x19, 0x49, 0x64, 0x48, 0x20, 0x00, 0x00, 0xb1, - 0x19, 0x49, 0x62, 0x48, 0xe7, 0xf0, 0x88, 0x28, - 0x80, 0x68, 0x20, 0x20, 0x40, 0x20, 0xd1, 0x3e, - 0x99, 0x0e, 0x79, 0xc8, 0x09, 0x40, 0x06, 0x00, - 0x0e, 0x00, 0x90, 0x0a, 0x99, 0x0e, 0x79, 0xc8, - 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x09, 0x98, 0x0a, - 0x30, 0x01, 0x06, 0x06, 0x0e, 0x36, 0x2e, 0x08, - 0xdb, 0x04, 0xe0, 0x10, 0x1c, 0x70, 0x06, 0x06, - 0x0e, 0x36, 0xe7, 0xf8, 0x20, 0x00, 0x00, 0xb1, - 0x19, 0x49, 0xe0, 0x01, 0xe0, 0x9d, 0xe0, 0x9c, - 0x64, 0x48, 0x88, 0x68, 0x21, 0x80, 0x41, 0x31, - 0x43, 0x88, 0x80, 0x68, 0xe7, 0xee, 0x98, 0x0a, - 0x00, 0x80, 0x19, 0x40, 0x6c, 0x41, 0x98, 0x09, - 0x00, 0x80, 0x4a, 0x4b, 0x58, 0x10, 0x40, 0x08, - 0x99, 0x0a, 0x00, 0x89, 0x19, 0x49, 0x64, 0x48, - 0x06, 0x20, 0x0e, 0x00, 0x24, 0x20, 0x43, 0x04, - 0x98, 0x01, 0x0a, 0x00, 0x02, 0x00, 0x90, 0x01, - 0x98, 0x01, 0x99, 0x0c, 0x43, 0x08, 0x90, 0x01, - 0x98, 0x01, 0x99, 0x02, 0x60, 0x08, 0x78, 0x38, - 0x23, 0x80, 0x40, 0x18, 0xd0, 0x19, 0x99, 0x0e, - 0x7b, 0x08, 0x07, 0x42, 0x0f, 0x52, 0x92, 0x07, - 0x99, 0x0e, 0x7b, 0x08, 0x08, 0xc0, 0x06, 0x02, - 0x0e, 0x12, 0x92, 0x08, 0x1d, 0xe9, 0x31, 0x3d, - 0x91, 0x06, 0x99, 0x06, 0x9a, 0x08, 0x5c, 0x88, - 0x49, 0x36, 0x9a, 0x07, 0x5c, 0x89, 0xe0, 0x00, - 0xe0, 0x4e, 0x40, 0x08, 0x99, 0x06, 0x9a, 0x08, - 0x54, 0x88, 0x99, 0x0e, 0x79, 0x88, 0x06, 0xc0, - 0x0e, 0xc0, 0x90, 0x00, 0x98, 0x00, 0x49, 0x30, - 0x40, 0xc1, 0x91, 0x00, 0x99, 0x0e, 0x79, 0x88, - 0x09, 0x40, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x0b, - 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, - 0x99, 0x00, 0x40, 0x08, 0xd0, 0x33, 0x06, 0x20, - 0x0e, 0x00, 0x24, 0x40, 0x43, 0x04, 0x9a, 0x0b, - 0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, - 0x40, 0x41, 0x00, 0x90, 0x19, 0x40, 0x64, 0x41, - 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, 0x6a, 0x40, - 0x99, 0x00, 0x43, 0x01, 0x00, 0x90, 0x19, 0x40, - 0x62, 0x41, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, - 0x6c, 0x40, 0x28, 0x00, 0xd1, 0x17, 0x88, 0x68, - 0x9a, 0x0b, 0x21, 0x80, 0x41, 0x11, 0x43, 0x88, - 0x80, 0x68, 0x88, 0x68, 0x28, 0x00, 0xd1, 0x0e, - 0x06, 0x20, 0x0e, 0x00, 0x24, 0x02, 0x43, 0x04, - 0x23, 0xfe, 0x40, 0x1c, 0x98, 0x0c, 0x30, 0x02, - 0x06, 0x00, 0x0e, 0x00, 0x90, 0x0c, 0x98, 0x0c, - 0x23, 0x3e, 0x40, 0x18, 0x90, 0x0c, 0xe0, 0x0a, - 0x06, 0x20, 0x0e, 0x00, 0x24, 0x40, 0x43, 0x04, - 0x23, 0xfe, 0x40, 0x1c, 0x98, 0x0c, 0x1c, 0x41, - 0x98, 0x04, 0xf0, 0x00, 0xf8, 0x13, 0x9a, 0x0f, - 0x70, 0x14, 0x70, 0x7c, 0x20, 0x00, 0xb0, 0x0d, - 0xe6, 0xe2, 0x20, 0xb1, 0xb0, 0x0d, 0xe6, 0xdf, - 0xb0, 0x0d, 0xe6, 0xdd, 0x64, 0x00, 0x08, 0x00, - 0x2e, 0x08, 0x20, 0x18, 0x2e, 0x08, 0x20, 0x98, - 0x80, 0x00, 0x00, 0x00, 0xb5, 0xf3, 0x98, 0x00, - 0x06, 0x07, 0x0e, 0x3f, 0x99, 0x01, 0x06, 0x0e, - 0x0e, 0x36, 0x00, 0xf8, 0x4b, 0x13, 0x18, 0xc5, - 0x01, 0x38, 0x4b, 0x13, 0x18, 0xc4, 0x01, 0x38, - 0x4b, 0x12, 0x18, 0xc2, 0x68, 0x10, 0x23, 0x40, - 0x43, 0xdb, 0x40, 0x18, 0x60, 0x10, 0x2e, 0x3e, - 0xdc, 0x15, 0x68, 0x20, 0x1c, 0x01, 0x0a, 0x09, - 0x02, 0x09, 0x43, 0x31, 0x60, 0x21, 0x68, 0x28, - 0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x23, 0x3e, - 0x43, 0x19, 0x60, 0x29, 0x68, 0x10, 0x23, 0x40, - 0x43, 0x18, 0x60, 0x10, 0x20, 0x00, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0xbd, - 0xe7, 0xf9, 0xe7, 0xf8, 0x64, 0x00, 0x10, 0x00, - 0x64, 0x00, 0x08, 0x00, 0x64, 0x00, 0x08, 0x08, - 0xb5, 0xf3, 0xb0, 0x93, 0x98, 0x13, 0x69, 0x00, - 0x90, 0x01, 0x98, 0x01, 0x78, 0x40, 0x23, 0x80, - 0x40, 0x18, 0xd0, 0x05, 0x20, 0xbe, 0xb0, 0x13, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x98, 0x01, 0x78, 0x80, 0x90, 0x08, 0x98, 0x08, - 0x23, 0x40, 0x40, 0x18, 0xd0, 0x73, 0x98, 0x08, - 0x23, 0x20, 0x40, 0x18, 0xd0, 0x6f, 0x98, 0x01, - 0x6b, 0x07, 0x98, 0x01, 0x79, 0xc0, 0x00, 0x80, - 0x49, 0x76, 0x58, 0x08, 0x90, 0x00, 0x98, 0x00, - 0x68, 0xc0, 0x1c, 0x06, 0xd1, 0x02, 0x20, 0xb6, - 0xb0, 0x13, 0xe7, 0xe1, 0x78, 0xb0, 0x07, 0xc0, - 0x0f, 0xc0, 0xd0, 0x02, 0x20, 0xb6, 0xb0, 0x13, - 0xe7, 0xda, 0xa9, 0x11, 0x1c, 0x30, 0xf0, 0x00, - 0xf9, 0x2b, 0x90, 0x02, 0x98, 0x11, 0x28, 0x00, - 0xd1, 0x02, 0x98, 0x02, 0xb0, 0x13, 0xe7, 0xcf, - 0x98, 0x11, 0x90, 0x0e, 0x20, 0x01, 0x90, 0x0b, - 0x98, 0x13, 0x88, 0x40, 0x90, 0x0d, 0x98, 0x13, - 0x68, 0x40, 0x90, 0x06, 0x98, 0x13, 0x68, 0x81, - 0x91, 0x10, 0x99, 0x10, 0x1d, 0xc8, 0x30, 0xb9, - 0x90, 0x05, 0x98, 0x05, 0x99, 0x06, 0x1a, 0x40, - 0x04, 0x04, 0x0c, 0x24, 0x99, 0x14, 0x79, 0x88, - 0x90, 0x03, 0x98, 0x03, 0x06, 0xc0, 0x0e, 0xc0, - 0x90, 0x0a, 0x98, 0x0a, 0x49, 0x5a, 0x40, 0xc1, - 0x91, 0x0a, 0x98, 0x03, 0x09, 0x40, 0x06, 0x00, - 0x0e, 0x00, 0x90, 0x09, 0x98, 0x09, 0x00, 0x80, - 0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x40, 0x08, - 0xd0, 0x02, 0x20, 0xb1, 0xb0, 0x13, 0xe7, 0x9f, - 0x20, 0xb8, 0x90, 0x0c, 0x98, 0x11, 0x30, 0x08, - 0x90, 0x04, 0x20, 0x00, 0x90, 0x07, 0x98, 0x07, - 0x28, 0x00, 0xd0, 0x10, 0x99, 0x10, 0x68, 0x09, - 0x91, 0x10, 0x99, 0x10, 0x1d, 0x08, 0x90, 0x12, - 0x98, 0x12, 0x78, 0x80, 0x99, 0x10, 0x18, 0x40, - 0x90, 0x06, 0x98, 0x12, 0x78, 0x81, 0x20, 0xc0, - 0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24, 0x98, 0x0d, - 0x42, 0x84, 0xdb, 0x05, 0xe0, 0x00, 0xe0, 0x7c, - 0x9c, 0x0d, 0x20, 0x00, 0x90, 0x0d, 0xe0, 0x06, - 0x98, 0x0d, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00, - 0x90, 0x0d, 0x20, 0x01, 0x90, 0x07, 0x98, 0x0c, - 0x42, 0xa0, 0xda, 0x2e, 0x25, 0x00, 0x98, 0x0c, - 0x42, 0x85, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, - 0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf7, 0x98, 0x06, - 0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, - 0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2, - 0x98, 0x0c, 0x1a, 0x20, 0x04, 0x04, 0x0c, 0x24, - 0xa9, 0x11, 0x1c, 0x30, 0xf0, 0x00, 0xf8, 0xac, - 0x90, 0x02, 0x98, 0x11, 0x28, 0x00, 0xd1, 0x08, - 0x98, 0x0e, 0x60, 0xb0, 0x68, 0x70, 0x99, 0x0b, - 0x18, 0x40, 0x60, 0x70, 0x98, 0x02, 0xb0, 0x13, - 0xe7, 0x4a, 0x98, 0x0b, 0x30, 0x01, 0x90, 0x0b, - 0x20, 0xb8, 0x90, 0x0c, 0x98, 0x11, 0x30, 0x08, - 0x90, 0x04, 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x04, + 0x20, 0x00, 0x00, 0xb1, 0x19, 0x49, 0xe0, 0x01, + 0xe0, 0x9d, 0xe0, 0x9c, 0x64, 0x48, 0x88, 0x68, + 0x21, 0x80, 0x41, 0x31, 0x43, 0x88, 0x80, 0x68, + 0xe7, 0xee, 0x98, 0x0a, 0x00, 0x80, 0x19, 0x40, + 0x6c, 0x41, 0x98, 0x09, 0x00, 0x80, 0x4a, 0x4b, + 0x58, 0x10, 0x40, 0x08, 0x99, 0x0a, 0x00, 0x89, + 0x19, 0x49, 0x64, 0x48, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x20, 0x43, 0x04, 0x98, 0x01, 0x0a, 0x00, + 0x02, 0x00, 0x90, 0x01, 0x98, 0x01, 0x99, 0x0c, + 0x43, 0x08, 0x90, 0x01, 0x98, 0x01, 0x99, 0x02, + 0x60, 0x08, 0x78, 0x38, 0x23, 0x80, 0x40, 0x18, + 0xd0, 0x19, 0x99, 0x0e, 0x7b, 0x08, 0x07, 0x42, + 0x0f, 0x52, 0x92, 0x07, 0x99, 0x0e, 0x7b, 0x08, + 0x08, 0xc0, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x08, + 0x1d, 0xe9, 0x31, 0x3d, 0x91, 0x06, 0x99, 0x06, + 0x9a, 0x08, 0x5c, 0x88, 0x49, 0x36, 0x9a, 0x07, + 0x5c, 0x89, 0xe0, 0x00, 0xe0, 0x4e, 0x40, 0x08, + 0x99, 0x06, 0x9a, 0x08, 0x54, 0x88, 0x99, 0x0e, + 0x79, 0x88, 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x00, + 0x98, 0x00, 0x49, 0x30, 0x40, 0xc1, 0x91, 0x00, + 0x99, 0x0e, 0x79, 0x88, 0x09, 0x40, 0x06, 0x02, + 0x0e, 0x12, 0x92, 0x0b, 0x9a, 0x0b, 0x00, 0x90, + 0x19, 0x40, 0x6c, 0x40, 0x99, 0x00, 0x40, 0x08, + 0xd0, 0x33, 0x06, 0x20, 0x0e, 0x00, 0x24, 0x40, + 0x43, 0x04, 0x9a, 0x0b, 0x00, 0x90, 0x19, 0x40, + 0x6c, 0x40, 0x99, 0x00, 0x40, 0x41, 0x00, 0x90, + 0x19, 0x40, 0x64, 0x41, 0x9a, 0x0b, 0x00, 0x90, + 0x19, 0x40, 0x6a, 0x40, 0x99, 0x00, 0x43, 0x01, + 0x00, 0x90, 0x19, 0x40, 0x62, 0x41, 0x9a, 0x0b, + 0x00, 0x90, 0x19, 0x40, 0x6c, 0x40, 0x28, 0x00, + 0xd1, 0x17, 0x88, 0x68, 0x9a, 0x0b, 0x21, 0x80, + 0x41, 0x11, 0x43, 0x88, 0x80, 0x68, 0x88, 0x68, + 0x28, 0x00, 0xd1, 0x0e, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x02, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, + 0x98, 0x0c, 0x30, 0x02, 0x06, 0x00, 0x0e, 0x00, + 0x90, 0x0c, 0x98, 0x0c, 0x23, 0x3e, 0x40, 0x18, + 0x90, 0x0c, 0xe0, 0x0a, 0x06, 0x20, 0x0e, 0x00, + 0x24, 0x40, 0x43, 0x04, 0x23, 0xfe, 0x40, 0x1c, + 0x98, 0x0c, 0x1c, 0x41, 0x98, 0x04, 0xf0, 0x00, + 0xf8, 0x13, 0x9a, 0x0f, 0x70, 0x14, 0x70, 0x7c, + 0x20, 0x00, 0xb0, 0x0d, 0xe6, 0xe2, 0x20, 0xb1, + 0xb0, 0x0d, 0xe6, 0xdf, 0xb0, 0x0d, 0xe6, 0xdd, + 0x64, 0x00, 0x08, 0x00, 0x2e, 0x08, 0x20, 0x10, + 0x2e, 0x08, 0x20, 0x90, 0x80, 0x00, 0x00, 0x00, + 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x07, 0x0e, 0x3f, + 0x99, 0x01, 0x06, 0x0e, 0x0e, 0x36, 0x00, 0xf8, + 0x4b, 0x13, 0x18, 0xc5, 0x01, 0x38, 0x4b, 0x13, + 0x18, 0xc4, 0x01, 0x38, 0x4b, 0x12, 0x18, 0xc2, + 0x68, 0x10, 0x23, 0x40, 0x43, 0xdb, 0x40, 0x18, + 0x60, 0x10, 0x2e, 0x3e, 0xdc, 0x15, 0x68, 0x20, + 0x1c, 0x01, 0x0a, 0x09, 0x02, 0x09, 0x43, 0x31, + 0x60, 0x21, 0x68, 0x28, 0x1c, 0x01, 0x0a, 0x09, + 0x02, 0x09, 0x23, 0x3e, 0x43, 0x19, 0x60, 0x29, + 0x68, 0x10, 0x23, 0x40, 0x43, 0x18, 0x60, 0x10, + 0x20, 0x00, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x20, 0xbd, 0xe7, 0xf9, 0xe7, 0xf8, + 0x64, 0x00, 0x10, 0x00, 0x64, 0x00, 0x08, 0x00, + 0x64, 0x00, 0x08, 0x08, 0xb5, 0xf3, 0xb0, 0x93, + 0x98, 0x13, 0x69, 0x00, 0x90, 0x01, 0x98, 0x01, + 0x78, 0x40, 0x23, 0x80, 0x40, 0x18, 0xd0, 0x05, + 0x20, 0xbe, 0xb0, 0x13, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x98, 0x01, 0x78, 0x80, + 0x90, 0x08, 0x98, 0x08, 0x23, 0x40, 0x40, 0x18, + 0xd0, 0x73, 0x98, 0x08, 0x23, 0x20, 0x40, 0x18, + 0xd0, 0x6f, 0x98, 0x01, 0x6b, 0x07, 0x98, 0x01, + 0x79, 0xc0, 0x00, 0x80, 0x49, 0x76, 0x58, 0x08, + 0x90, 0x00, 0x98, 0x00, 0x68, 0xc0, 0x1c, 0x06, + 0xd1, 0x02, 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xe1, + 0x78, 0xb0, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x02, + 0x20, 0xb6, 0xb0, 0x13, 0xe7, 0xda, 0xa9, 0x11, + 0x1c, 0x30, 0xf0, 0x00, 0xf9, 0x2b, 0x90, 0x02, + 0x98, 0x11, 0x28, 0x00, 0xd1, 0x02, 0x98, 0x02, + 0xb0, 0x13, 0xe7, 0xcf, 0x98, 0x11, 0x90, 0x0e, + 0x20, 0x01, 0x90, 0x0b, 0x98, 0x13, 0x88, 0x40, + 0x90, 0x0d, 0x98, 0x13, 0x68, 0x40, 0x90, 0x06, + 0x98, 0x13, 0x68, 0x81, 0x91, 0x10, 0x99, 0x10, + 0x1d, 0xc8, 0x30, 0xb9, 0x90, 0x05, 0x98, 0x05, + 0x99, 0x06, 0x1a, 0x40, 0x04, 0x04, 0x0c, 0x24, + 0x99, 0x14, 0x79, 0x88, 0x90, 0x03, 0x98, 0x03, + 0x06, 0xc0, 0x0e, 0xc0, 0x90, 0x0a, 0x98, 0x0a, + 0x49, 0x5a, 0x40, 0xc1, 0x91, 0x0a, 0x98, 0x03, + 0x09, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x90, 0x09, + 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x6b, 0x80, + 0x99, 0x0a, 0x40, 0x08, 0xd0, 0x02, 0x20, 0xb1, + 0xb0, 0x13, 0xe7, 0x9f, 0x20, 0xb8, 0x90, 0x0c, + 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x20, 0x00, + 0x90, 0x07, 0x98, 0x07, 0x28, 0x00, 0xd0, 0x10, + 0x99, 0x10, 0x68, 0x09, 0x91, 0x10, 0x99, 0x10, + 0x1d, 0x08, 0x90, 0x12, 0x98, 0x12, 0x78, 0x80, + 0x99, 0x10, 0x18, 0x40, 0x90, 0x06, 0x98, 0x12, + 0x78, 0x81, 0x20, 0xc0, 0x1a, 0x40, 0x04, 0x04, + 0x0c, 0x24, 0x98, 0x0d, 0x42, 0x84, 0xdb, 0x05, + 0xe0, 0x00, 0xe0, 0x7c, 0x9c, 0x0d, 0x20, 0x00, + 0x90, 0x0d, 0xe0, 0x06, 0x98, 0x0d, 0x1b, 0x00, + 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0d, 0x20, 0x01, + 0x90, 0x07, 0x98, 0x0c, 0x42, 0xa0, 0xda, 0x2e, + 0x25, 0x00, 0x98, 0x0c, 0x42, 0x85, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, 0x06, 0x05, 0x0e, 0x2d, - 0xe7, 0xf8, 0x98, 0x06, 0x78, 0x01, 0x30, 0x01, + 0xe7, 0xf7, 0x98, 0x06, 0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, 0x70, 0x01, 0x30, 0x01, - 0x90, 0x04, 0xe7, 0xf2, 0x98, 0x0c, 0x1b, 0x00, - 0x04, 0x00, 0x0c, 0x00, 0x90, 0x0c, 0x98, 0x0d, - 0x28, 0x00, 0xd1, 0x90, 0x6b, 0x39, 0x91, 0x0f, - 0x6a, 0xf8, 0x28, 0x00, 0xd1, 0x02, 0x98, 0x0e, - 0x62, 0xf8, 0xe0, 0x05, 0x98, 0x0e, 0x99, 0x0f, - 0x60, 0x08, 0x98, 0x0e, 0x6d, 0xb9, 0x60, 0x08, - 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x6b, 0x80, - 0x99, 0x0a, 0x43, 0x01, 0x98, 0x09, 0x00, 0x80, - 0x19, 0xc0, 0x63, 0x81, 0x6b, 0x78, 0x99, 0x0b, - 0x18, 0x40, 0x63, 0x78, 0x20, 0x00, 0x99, 0x11, - 0x60, 0x08, 0x98, 0x11, 0x63, 0x38, 0x98, 0x0e, - 0x30, 0x04, 0x65, 0xb8, 0x98, 0x02, 0xb0, 0x13, - 0xe7, 0x02, 0x20, 0xb1, 0xb0, 0x13, 0xe6, 0xff, - 0xb0, 0x13, 0xe6, 0xfd, 0x2e, 0x08, 0x5e, 0x64, - 0x80, 0x00, 0x00, 0x00, 0xb4, 0xf0, 0x1c, 0x01, - 0x78, 0x88, 0x23, 0x20, 0x40, 0x18, 0xd0, 0x42, - 0x79, 0xc8, 0x00, 0x80, 0x4b, 0x21, 0x58, 0x1d, - 0x6b, 0x0a, 0x68, 0xef, 0x68, 0x10, 0x28, 0x00, - 0xd0, 0x17, 0x68, 0xfe, 0x68, 0x10, 0x60, 0x30, - 0x68, 0x50, 0x60, 0xf8, 0x68, 0x78, 0x68, 0x93, - 0x18, 0xc0, 0x60, 0x78, 0x20, 0x00, 0x60, 0x10, - 0x20, 0x00, 0x60, 0x50, 0x20, 0x00, 0x60, 0x90, - 0x68, 0x78, 0x78, 0x3b, 0x42, 0x98, 0xd9, 0x04, - 0x78, 0xb8, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x18, - 0x70, 0xb8, 0x6a, 0xd0, 0x60, 0x10, 0x6b, 0x10, - 0x60, 0x50, 0x6b, 0x50, 0x60, 0x90, 0x24, 0x00, - 0x2c, 0x08, 0xdb, 0x04, 0xe0, 0x0e, 0x1c, 0x60, - 0x06, 0x04, 0x0e, 0x24, 0xe7, 0xf8, 0x00, 0xa0, - 0x18, 0x80, 0x6b, 0x80, 0x00, 0xa3, 0x18, 0x9b, - 0x60, 0xd8, 0x23, 0x00, 0x00, 0xa0, 0x18, 0x80, - 0x63, 0x83, 0xe7, 0xf0, 0x20, 0x00, 0x62, 0xd0, - 0x20, 0x00, 0x63, 0x10, 0x20, 0x00, 0x63, 0x50, - 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, 0x20, 0xb1, - 0xe7, 0xfb, 0xe7, 0xfa, 0x2e, 0x08, 0x5e, 0x64, - 0xb4, 0x90, 0x1c, 0x02, 0x1c, 0x0f, 0x78, 0x14, - 0x68, 0x90, 0x1c, 0x01, 0xd1, 0x08, 0x20, 0x00, - 0x60, 0x38, 0x78, 0x90, 0x23, 0x01, 0x43, 0x18, - 0x70, 0x90, 0x20, 0xb7, 0xbc, 0x90, 0x47, 0x70, - 0x68, 0x08, 0x60, 0x90, 0x20, 0x00, 0x60, 0x48, - 0x60, 0x39, 0x68, 0x50, 0x38, 0x01, 0x60, 0x50, - 0x68, 0x50, 0x42, 0xa0, 0xd1, 0x02, 0x20, 0xbf, - 0xe7, 0xf0, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xed, - 0xe7, 0xec, 0x00, 0x00, 0x1c, 0x01, 0x22, 0x00, - 0x6a, 0x50, 0x68, 0x02, 0x60, 0x0a, 0x4a, 0x05, - 0x6f, 0xd2, 0x60, 0x8a, 0x4a, 0x04, 0x68, 0x12, - 0x60, 0x4a, 0x22, 0x1d, 0x02, 0x92, 0x68, 0x12, - 0x60, 0xca, 0x47, 0x70, 0xcc, 0x00, 0x0f, 0x80, - 0x2e, 0x08, 0x1f, 0xac, 0x1c, 0x01, 0x48, 0x02, - 0x60, 0x01, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, - 0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x20, 0x33, - 0x06, 0x40, 0x62, 0x01, 0x20, 0x00, 0x47, 0x70, - 0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, - 0x6a, 0xc0, 0x23, 0x7f, 0x03, 0x9b, 0x40, 0x18, - 0x03, 0x8a, 0x43, 0x10, 0x22, 0x33, 0x06, 0x52, - 0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, - 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, - 0x23, 0x03, 0x03, 0x1b, 0x40, 0x18, 0x43, 0x08, + 0x90, 0x04, 0xe7, 0xf2, 0x98, 0x0c, 0x1a, 0x20, + 0x04, 0x04, 0x0c, 0x24, 0xa9, 0x11, 0x1c, 0x30, + 0xf0, 0x00, 0xf8, 0xac, 0x90, 0x02, 0x98, 0x11, + 0x28, 0x00, 0xd1, 0x08, 0x98, 0x0e, 0x60, 0xb0, + 0x68, 0x70, 0x99, 0x0b, 0x18, 0x40, 0x60, 0x70, + 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x4a, 0x98, 0x0b, + 0x30, 0x01, 0x90, 0x0b, 0x20, 0xb8, 0x90, 0x0c, + 0x98, 0x11, 0x30, 0x08, 0x90, 0x04, 0x25, 0x00, + 0x42, 0xa5, 0xdb, 0x04, 0xe0, 0x0c, 0x1c, 0x68, + 0x06, 0x05, 0x0e, 0x2d, 0xe7, 0xf8, 0x98, 0x06, + 0x78, 0x01, 0x30, 0x01, 0x90, 0x06, 0x98, 0x04, + 0x70, 0x01, 0x30, 0x01, 0x90, 0x04, 0xe7, 0xf2, + 0x98, 0x0c, 0x1b, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x90, 0x0c, 0x98, 0x0d, 0x28, 0x00, 0xd1, 0x90, + 0x6b, 0x39, 0x91, 0x0f, 0x6a, 0xf8, 0x28, 0x00, + 0xd1, 0x02, 0x98, 0x0e, 0x62, 0xf8, 0xe0, 0x05, + 0x98, 0x0e, 0x99, 0x0f, 0x60, 0x08, 0x98, 0x0e, + 0x6d, 0xb9, 0x60, 0x08, 0x98, 0x09, 0x00, 0x80, + 0x19, 0xc0, 0x6b, 0x80, 0x99, 0x0a, 0x43, 0x01, + 0x98, 0x09, 0x00, 0x80, 0x19, 0xc0, 0x63, 0x81, + 0x6b, 0x78, 0x99, 0x0b, 0x18, 0x40, 0x63, 0x78, + 0x20, 0x00, 0x99, 0x11, 0x60, 0x08, 0x98, 0x11, + 0x63, 0x38, 0x98, 0x0e, 0x30, 0x04, 0x65, 0xb8, + 0x98, 0x02, 0xb0, 0x13, 0xe7, 0x02, 0x20, 0xb1, + 0xb0, 0x13, 0xe6, 0xff, 0xb0, 0x13, 0xe6, 0xfd, + 0x2e, 0x08, 0x5e, 0x5c, 0x80, 0x00, 0x00, 0x00, + 0xb4, 0xf0, 0x1c, 0x01, 0x78, 0x88, 0x23, 0x20, + 0x40, 0x18, 0xd0, 0x42, 0x79, 0xc8, 0x00, 0x80, + 0x4b, 0x21, 0x58, 0x1d, 0x6b, 0x0a, 0x68, 0xef, + 0x68, 0x10, 0x28, 0x00, 0xd0, 0x17, 0x68, 0xfe, + 0x68, 0x10, 0x60, 0x30, 0x68, 0x50, 0x60, 0xf8, + 0x68, 0x78, 0x68, 0x93, 0x18, 0xc0, 0x60, 0x78, + 0x20, 0x00, 0x60, 0x10, 0x20, 0x00, 0x60, 0x50, + 0x20, 0x00, 0x60, 0x90, 0x68, 0x78, 0x78, 0x3b, + 0x42, 0x98, 0xd9, 0x04, 0x78, 0xb8, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x18, 0x70, 0xb8, 0x6a, 0xd0, + 0x60, 0x10, 0x6b, 0x10, 0x60, 0x50, 0x6b, 0x50, + 0x60, 0x90, 0x24, 0x00, 0x2c, 0x08, 0xdb, 0x04, + 0xe0, 0x0e, 0x1c, 0x60, 0x06, 0x04, 0x0e, 0x24, + 0xe7, 0xf8, 0x00, 0xa0, 0x18, 0x80, 0x6b, 0x80, + 0x00, 0xa3, 0x18, 0x9b, 0x60, 0xd8, 0x23, 0x00, + 0x00, 0xa0, 0x18, 0x80, 0x63, 0x83, 0xe7, 0xf0, + 0x20, 0x00, 0x62, 0xd0, 0x20, 0x00, 0x63, 0x10, + 0x20, 0x00, 0x63, 0x50, 0x20, 0x00, 0xbc, 0xf0, + 0x47, 0x70, 0x20, 0xb1, 0xe7, 0xfb, 0xe7, 0xfa, + 0x2e, 0x08, 0x5e, 0x5c, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x78, 0x14, 0x68, 0x90, 0x1c, 0x01, + 0xd1, 0x08, 0x20, 0x00, 0x60, 0x38, 0x78, 0x90, + 0x23, 0x01, 0x43, 0x18, 0x70, 0x90, 0x20, 0xb7, + 0xbc, 0x90, 0x47, 0x70, 0x68, 0x08, 0x60, 0x90, + 0x20, 0x00, 0x60, 0x48, 0x60, 0x39, 0x68, 0x50, + 0x38, 0x01, 0x60, 0x50, 0x68, 0x50, 0x42, 0xa0, + 0xd1, 0x02, 0x20, 0xbf, 0xe7, 0xf0, 0xe0, 0x01, + 0x20, 0x00, 0xe7, 0xed, 0xe7, 0xec, 0x00, 0x00, + 0x1c, 0x01, 0x22, 0x00, 0x6a, 0x50, 0x68, 0x02, + 0x60, 0x0a, 0x4a, 0x05, 0x6f, 0xd2, 0x60, 0x8a, + 0x4a, 0x04, 0x68, 0x12, 0x60, 0x4a, 0x22, 0x1d, + 0x02, 0x92, 0x68, 0x12, 0x60, 0xca, 0x47, 0x70, + 0xcc, 0x00, 0x0f, 0x80, 0x2e, 0x08, 0x1f, 0xa4, + 0x1c, 0x01, 0x48, 0x02, 0x60, 0x01, 0x20, 0x00, + 0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x01, 0x00, + 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x62, 0x01, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, + 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x7f, + 0x03, 0x9b, 0x40, 0x18, 0x03, 0x8a, 0x43, 0x10, 0x22, 0x33, 0x06, 0x52, 0x62, 0xd0, 0x20, 0x00, - 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x06, 0x0a, - 0x0e, 0x12, 0x2a, 0x00, 0xd0, 0x06, 0x20, 0x33, - 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x01, 0x05, 0x5b, - 0x43, 0x18, 0xe0, 0x04, 0x20, 0x33, 0x06, 0x40, - 0x6a, 0xc0, 0x4b, 0x04, 0x40, 0x18, 0x23, 0x33, - 0x06, 0x5b, 0x62, 0xd8, 0x20, 0x00, 0x47, 0x70, - 0xe7, 0xfd, 0x00, 0x00, 0xff, 0xdf, 0xff, 0xff, - 0x48, 0x04, 0x69, 0x80, 0x07, 0xc0, 0x0f, 0xc0, - 0xd0, 0x01, 0x20, 0xff, 0x47, 0x70, 0x20, 0x00, - 0xe7, 0xfc, 0xe7, 0xfb, 0x66, 0x00, 0x00, 0x80, - 0xb4, 0x80, 0x1c, 0x01, 0x06, 0x0f, 0x0e, 0x3f, - 0x4a, 0x08, 0x2f, 0x00, 0xd0, 0x03, 0x68, 0x10, - 0x23, 0x01, 0x43, 0x18, 0xe0, 0x02, 0x68, 0x10, - 0x08, 0x40, 0x00, 0x40, 0x68, 0x13, 0x43, 0x18, - 0x60, 0x10, 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, - 0xe7, 0xfc, 0x00, 0x00, 0x66, 0x00, 0x00, 0x98, - 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x4b, 0x06, - 0x40, 0x1a, 0x4b, 0x06, 0x40, 0x1f, 0x0b, 0x10, - 0x02, 0x39, 0x43, 0x08, 0x49, 0x04, 0x61, 0xc8, - 0x20, 0x00, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, - 0x01, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xf0, 0x00, - 0x66, 0x00, 0x00, 0x80, 0x48, 0x01, 0x69, 0xc0, - 0x47, 0x70, 0xe7, 0xfd, 0x66, 0x00, 0x00, 0x80, - 0x1c, 0x01, 0x48, 0x07, 0x68, 0x02, 0x4b, 0x07, - 0x40, 0x1a, 0x60, 0x02, 0x23, 0x01, 0x05, 0x9b, - 0x42, 0x99, 0xd1, 0x03, 0x48, 0x02, 0x68, 0x02, - 0x43, 0x0a, 0x60, 0x02, 0x47, 0x70, 0x00, 0x00, - 0x66, 0x00, 0x00, 0x2c, 0xff, 0xbf, 0xff, 0xff, - 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, 0x67, 0x41, - 0x47, 0x70, 0x1c, 0x01, 0x20, 0x33, 0x06, 0x40, - 0x67, 0x81, 0x47, 0x70, 0xb5, 0x90, 0x4c, 0x21, - 0x20, 0x01, 0x60, 0x20, 0xf0, 0x11, 0xfb, 0x48, - 0x48, 0x1f, 0x69, 0x84, 0x27, 0x00, 0x2f, 0x04, - 0xd3, 0x04, 0xe0, 0x06, 0x1c, 0x78, 0x06, 0x07, - 0x0e, 0x3f, 0xe7, 0xf8, 0x21, 0x00, 0xc4, 0x02, - 0xe7, 0xf8, 0x20, 0x00, 0x49, 0x18, 0x69, 0x49, - 0x60, 0x08, 0x20, 0x00, 0x49, 0x16, 0x69, 0x49, - 0x60, 0x48, 0x20, 0x00, 0x49, 0x14, 0x69, 0x49, - 0x60, 0x88, 0x20, 0x00, 0x49, 0x12, 0x69, 0x49, - 0x60, 0xc8, 0x20, 0x00, 0x49, 0x10, 0x69, 0x49, - 0x61, 0x08, 0x20, 0x00, 0x49, 0x0e, 0x69, 0x49, - 0x61, 0x48, 0x20, 0x00, 0x49, 0x0c, 0x69, 0x49, - 0x61, 0x88, 0x20, 0x00, 0x49, 0x0a, 0x69, 0x49, - 0x61, 0xc8, 0x20, 0x00, 0x49, 0x08, 0x69, 0x49, - 0x62, 0x08, 0x20, 0x00, 0x49, 0x06, 0x69, 0x49, - 0x62, 0x48, 0x20, 0x18, 0x49, 0x04, 0x69, 0x49, - 0x62, 0x88, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0xe7, 0xfb, 0x70, 0x00, 0x00, 0x38, - 0x2e, 0x08, 0x1f, 0xb0, 0xb5, 0xff, 0x1c, 0x0f, - 0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, - 0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, - 0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20, - 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x23, 0x04, - 0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20, - 0x00, 0x80, 0x49, 0x31, 0x58, 0x08, 0x43, 0x70, - 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, - 0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, - 0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, - 0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x11, 0xfa, 0xe6, - 0xf0, 0x11, 0xfa, 0xc2, 0x48, 0x27, 0x69, 0x80, - 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x49, 0x25, - 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x48, 0x23, - 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, - 0x49, 0x20, 0x69, 0x89, 0x60, 0x08, 0x6b, 0xe0, - 0x49, 0x1e, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1e, - 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, - 0x49, 0x1a, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, - 0x0f, 0xc0, 0x1c, 0x21, 0x1c, 0x20, 0xf0, 0x00, - 0xfe, 0x51, 0x48, 0x16, 0x69, 0xc0, 0x68, 0x00, - 0x4b, 0x16, 0x40, 0x18, 0x02, 0x29, 0x0a, 0x09, - 0x00, 0x89, 0x43, 0x08, 0x49, 0x11, 0x69, 0xc9, - 0x60, 0x08, 0x01, 0x80, 0x48, 0x0f, 0x69, 0xc0, - 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x99, 0x00, - 0x06, 0xc9, 0x43, 0x08, 0x49, 0x0b, 0x69, 0xc9, - 0x60, 0x08, 0x99, 0x04, 0x1c, 0x20, 0x22, 0x00, - 0xf0, 0x00, 0xfe, 0xbc, 0xf0, 0x00, 0xff, 0x9d, - 0xf0, 0x11, 0xfa, 0xb8, 0x20, 0x00, 0xb0, 0x01, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb0, 0x01, 0xe7, 0xf9, 0x2e, 0x03, 0x32, 0xa4, - 0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, - 0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, + 0x47, 0x70, 0xe7, 0xfd, 0x1c, 0x01, 0x20, 0x33, + 0x06, 0x40, 0x6a, 0xc0, 0x23, 0x03, 0x03, 0x1b, + 0x40, 0x18, 0x43, 0x08, 0x22, 0x33, 0x06, 0x52, + 0x62, 0xd0, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, + 0x1c, 0x01, 0x06, 0x0a, 0x0e, 0x12, 0x2a, 0x00, + 0xd0, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, + 0x23, 0x01, 0x05, 0x5b, 0x43, 0x18, 0xe0, 0x04, + 0x20, 0x33, 0x06, 0x40, 0x6a, 0xc0, 0x4b, 0x04, + 0x40, 0x18, 0x23, 0x33, 0x06, 0x5b, 0x62, 0xd8, + 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, + 0xff, 0xdf, 0xff, 0xff, 0x48, 0x04, 0x69, 0x80, + 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xff, + 0x47, 0x70, 0x20, 0x00, 0xe7, 0xfc, 0xe7, 0xfb, + 0x66, 0x00, 0x00, 0x80, 0xb4, 0x80, 0x1c, 0x01, + 0x06, 0x0f, 0x0e, 0x3f, 0x4a, 0x08, 0x2f, 0x00, + 0xd0, 0x03, 0x68, 0x10, 0x23, 0x01, 0x43, 0x18, + 0xe0, 0x02, 0x68, 0x10, 0x08, 0x40, 0x00, 0x40, + 0x68, 0x13, 0x43, 0x18, 0x60, 0x10, 0x20, 0x00, + 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x98, 0xb4, 0x80, 0x1c, 0x07, + 0x1c, 0x0a, 0x4b, 0x06, 0x40, 0x1a, 0x4b, 0x06, + 0x40, 0x1f, 0x0b, 0x10, 0x02, 0x39, 0x43, 0x08, + 0x49, 0x04, 0x61, 0xc8, 0x20, 0x00, 0xbc, 0x80, + 0x47, 0x70, 0xe7, 0xfc, 0x01, 0xff, 0xf0, 0x00, + 0x00, 0xff, 0xf0, 0x00, 0x66, 0x00, 0x00, 0x80, + 0x48, 0x01, 0x69, 0xc0, 0x47, 0x70, 0xe7, 0xfd, + 0x66, 0x00, 0x00, 0x80, 0x1c, 0x01, 0x48, 0x07, + 0x68, 0x02, 0x4b, 0x07, 0x40, 0x1a, 0x60, 0x02, + 0x23, 0x01, 0x05, 0x9b, 0x42, 0x99, 0xd1, 0x03, + 0x48, 0x02, 0x68, 0x02, 0x43, 0x0a, 0x60, 0x02, + 0x47, 0x70, 0x00, 0x00, 0x66, 0x00, 0x00, 0x2c, + 0xff, 0xbf, 0xff, 0xff, 0x1c, 0x01, 0x20, 0x33, + 0x06, 0x40, 0x67, 0x41, 0x47, 0x70, 0x1c, 0x01, + 0x20, 0x33, 0x06, 0x40, 0x67, 0x81, 0x47, 0x70, + 0xb5, 0x90, 0x4c, 0x21, 0x20, 0x01, 0x60, 0x20, + 0xf0, 0x11, 0xfb, 0x6a, 0x48, 0x1f, 0x69, 0x84, + 0x27, 0x00, 0x2f, 0x04, 0xd3, 0x04, 0xe0, 0x06, + 0x1c, 0x78, 0x06, 0x07, 0x0e, 0x3f, 0xe7, 0xf8, + 0x21, 0x00, 0xc4, 0x02, 0xe7, 0xf8, 0x20, 0x00, + 0x49, 0x18, 0x69, 0x49, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x16, 0x69, 0x49, 0x60, 0x48, 0x20, 0x00, + 0x49, 0x14, 0x69, 0x49, 0x60, 0x88, 0x20, 0x00, + 0x49, 0x12, 0x69, 0x49, 0x60, 0xc8, 0x20, 0x00, + 0x49, 0x10, 0x69, 0x49, 0x61, 0x08, 0x20, 0x00, + 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x20, 0x00, + 0x49, 0x0c, 0x69, 0x49, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x0a, 0x69, 0x49, 0x61, 0xc8, 0x20, 0x00, + 0x49, 0x08, 0x69, 0x49, 0x62, 0x08, 0x20, 0x00, + 0x49, 0x06, 0x69, 0x49, 0x62, 0x48, 0x20, 0x18, + 0x49, 0x04, 0x69, 0x49, 0x62, 0x88, 0x20, 0x00, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xe7, 0xfb, + 0x70, 0x00, 0x00, 0x38, 0x2e, 0x08, 0x1f, 0xa8, 0xb5, 0xff, 0x1c, 0x0f, 0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, 0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, 0x9a, 0x03, 0x43, 0x50, - 0x19, 0xc6, 0x69, 0x20, 0x00, 0x80, 0x49, 0x37, + 0x19, 0xc6, 0x69, 0x20, 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, - 0x08, 0x76, 0x69, 0x20, 0x00, 0x80, 0x49, 0x34, + 0x08, 0x76, 0x69, 0x20, 0x00, 0x80, 0x49, 0x31, 0x58, 0x08, 0x43, 0x70, 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, 0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, 0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, 0x0a, 0x00, 0x1c, 0x05, - 0xf0, 0x11, 0xfa, 0x64, 0xf0, 0x11, 0xfa, 0x40, - 0x48, 0x2a, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, - 0x00, 0xc0, 0x23, 0x01, 0x43, 0x18, 0x49, 0x27, - 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x6b, 0xe0, - 0x49, 0x24, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x24, - 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, - 0x49, 0x20, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, - 0x0f, 0xc0, 0x48, 0x1e, 0x69, 0x80, 0x68, 0x00, - 0x01, 0x40, 0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, - 0x43, 0x01, 0x48, 0x1a, 0x69, 0x80, 0x60, 0x01, - 0x1c, 0x21, 0x1c, 0x20, 0xf0, 0x00, 0xfd, 0xca, - 0x48, 0x16, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x17, - 0x40, 0x18, 0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, - 0x43, 0x08, 0x49, 0x12, 0x69, 0xc9, 0x60, 0x08, - 0x01, 0x80, 0x48, 0x10, 0x69, 0xc0, 0x68, 0x00, - 0x01, 0x40, 0x09, 0x40, 0x49, 0x0d, 0x69, 0xc9, - 0x60, 0x08, 0xf0, 0x00, 0xff, 0x1e, 0xf0, 0x11, - 0xfa, 0x17, 0x48, 0x0a, 0x6b, 0x81, 0x1c, 0x20, - 0xf0, 0x00, 0xfe, 0xf0, 0x9b, 0x04, 0x60, 0x18, - 0xf0, 0x11, 0xfa, 0x30, 0x20, 0x00, 0xb0, 0x01, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb0, 0x01, 0xe7, 0xf9, 0x2e, 0x03, 0x32, 0xa4, - 0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, - 0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, - 0xb5, 0xff, 0x1c, 0x0c, 0x1c, 0x1f, 0xb0, 0x83, - 0x9d, 0x03, 0x6b, 0x28, 0x6a, 0xa9, 0x1a, 0x40, - 0x30, 0x01, 0x90, 0x00, 0x19, 0xe0, 0x99, 0x00, - 0x42, 0x88, 0xd9, 0x01, 0x98, 0x00, 0x1b, 0x07, - 0x69, 0x28, 0x28, 0x08, 0xd1, 0x02, 0x08, 0x7f, - 0x08, 0x64, 0x00, 0x64, 0x6b, 0xa8, 0x9a, 0x05, - 0x43, 0x50, 0x19, 0x01, 0x91, 0x01, 0x69, 0x28, - 0x00, 0x80, 0x49, 0x38, 0x58, 0x08, 0x23, 0x04, - 0x40, 0x18, 0xd0, 0x02, 0x99, 0x01, 0x08, 0x49, - 0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x34, - 0x58, 0x08, 0x99, 0x01, 0x43, 0x48, 0x90, 0x02, - 0x69, 0xa8, 0x99, 0x02, 0x09, 0x49, 0x18, 0x46, - 0x6b, 0xe8, 0x28, 0x00, 0xd1, 0x02, 0x03, 0x30, - 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30, 0x0a, 0x00, - 0x1c, 0x06, 0xf0, 0x11, 0xf9, 0xcb, 0xf0, 0x11, - 0xf9, 0xa7, 0x48, 0x2a, 0x69, 0x80, 0x68, 0x00, - 0x01, 0x40, 0x09, 0x40, 0x49, 0x27, 0x69, 0x89, - 0x60, 0x08, 0x48, 0x26, 0x69, 0x80, 0x68, 0x00, - 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x02, 0x43, 0x18, - 0x49, 0x22, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, - 0x6b, 0xe8, 0x49, 0x20, 0x69, 0x89, 0x68, 0x09, - 0x4b, 0x1f, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, - 0x43, 0x08, 0x49, 0x1c, 0x69, 0x89, 0x60, 0x08, - 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x29, 0x1c, 0x28, - 0xf0, 0x00, 0xfd, 0x34, 0x48, 0x17, 0x69, 0xc0, - 0x68, 0x00, 0x4b, 0x18, 0x40, 0x18, 0x02, 0x31, - 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x13, - 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x11, - 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, - 0x99, 0x02, 0x06, 0xc9, 0x43, 0x08, 0x49, 0x0d, - 0x69, 0xc9, 0x60, 0x08, 0x99, 0x0c, 0x1c, 0x28, - 0x22, 0x02, 0xf0, 0x00, 0xfd, 0x9f, 0x48, 0x09, - 0x69, 0x40, 0x62, 0x07, 0xf0, 0x00, 0xfe, 0x7d, - 0xf0, 0x11, 0xf9, 0x98, 0x20, 0x00, 0xb0, 0x03, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb0, 0x03, 0xe7, 0xf9, 0x2e, 0x03, 0x32, 0xa4, - 0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, - 0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, - 0xb5, 0xff, 0xb0, 0x81, 0x9f, 0x01, 0x6b, 0x78, - 0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, - 0x9a, 0x03, 0x9b, 0x04, 0x18, 0xd0, 0x99, 0x00, - 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, 0x9a, 0x03, - 0x1a, 0x83, 0x93, 0x04, 0x69, 0x38, 0x28, 0x08, - 0xd1, 0x03, 0x99, 0x02, 0x08, 0x49, 0x00, 0x49, - 0x91, 0x02, 0x6b, 0xb8, 0x9a, 0x03, 0x43, 0x50, - 0x99, 0x02, 0x18, 0x45, 0x69, 0x38, 0x00, 0x80, - 0x49, 0x3c, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, - 0xd0, 0x00, 0x08, 0x6d, 0x69, 0x38, 0x00, 0x80, - 0x49, 0x39, 0x58, 0x08, 0x1c, 0x06, 0x43, 0x6e, - 0x69, 0xb8, 0x09, 0x71, 0x18, 0x44, 0x6b, 0xf8, - 0x28, 0x00, 0xd1, 0x02, 0x03, 0x20, 0x0b, 0x00, - 0xe0, 0x01, 0x02, 0x20, 0x0a, 0x00, 0x1c, 0x04, - 0xf0, 0x11, 0xf9, 0x34, 0xf0, 0x11, 0xf9, 0x10, - 0x48, 0x30, 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, - 0x09, 0x40, 0x49, 0x2e, 0x69, 0x89, 0x60, 0x08, - 0x48, 0x2c, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, - 0x00, 0xc0, 0x23, 0x03, 0x43, 0x18, 0x49, 0x29, - 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x6b, 0xf8, - 0x49, 0x26, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x26, - 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, - 0x49, 0x22, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, - 0x0f, 0xc0, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00, - 0xfc, 0x9d, 0x99, 0x0a, 0x1c, 0x38, 0x22, 0x03, - 0xf0, 0x00, 0xfd, 0x20, 0x69, 0xf8, 0x49, 0x1b, - 0x69, 0x49, 0x61, 0x08, 0x48, 0x19, 0x69, 0xc0, - 0x68, 0x00, 0x4b, 0x1a, 0x40, 0x18, 0x02, 0x21, - 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x15, - 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x13, - 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, - 0x06, 0xf1, 0x43, 0x08, 0x49, 0x0f, 0x69, 0xc9, - 0x60, 0x08, 0x48, 0x0e, 0x69, 0x40, 0x61, 0x84, - 0x06, 0xf0, 0x0e, 0xc0, 0x49, 0x0b, 0x69, 0x49, - 0x61, 0x48, 0x9b, 0x04, 0x48, 0x09, 0x69, 0x40, - 0x62, 0x43, 0xf0, 0x00, 0xfd, 0xda, 0xf0, 0x11, - 0xf8, 0xf5, 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, - 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0x32, 0xa4, - 0x2e, 0x03, 0x32, 0xf4, 0x2e, 0x08, 0x1f, 0xb0, - 0xff, 0xff, 0xdf, 0xff, 0xfc, 0x00, 0x00, 0x03, - 0xb5, 0xf3, 0xb0, 0x86, 0x9f, 0x06, 0x99, 0x07, - 0x68, 0x8c, 0x99, 0x07, 0x68, 0xc8, 0x90, 0x03, - 0x99, 0x07, 0x68, 0x0d, 0x99, 0x07, 0x68, 0x49, - 0x91, 0x02, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40, - 0x30, 0x01, 0x90, 0x01, 0x6b, 0x38, 0x6a, 0xb9, - 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x02, - 0x98, 0x03, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88, - 0xd9, 0x03, 0x98, 0x01, 0x99, 0x02, 0x1a, 0x40, - 0x90, 0x03, 0x19, 0x28, 0x99, 0x00, 0x42, 0x88, - 0xd9, 0x01, 0x98, 0x00, 0x1b, 0x44, 0x69, 0x38, - 0x28, 0x08, 0xd1, 0x02, 0x08, 0x64, 0x08, 0x6d, - 0x00, 0x6d, 0x6b, 0xb8, 0x99, 0x02, 0x43, 0x48, - 0x19, 0x41, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, - 0x49, 0x41, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, - 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, - 0x69, 0x38, 0x00, 0x80, 0x49, 0x3d, 0x58, 0x08, - 0x99, 0x04, 0x43, 0x48, 0x90, 0x05, 0x69, 0xb8, - 0x99, 0x05, 0x09, 0x49, 0x18, 0x46, 0x6b, 0xf8, - 0x28, 0x00, 0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, - 0xe0, 0x01, 0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, - 0xf0, 0x11, 0xf8, 0x78, 0xf0, 0x11, 0xf8, 0x54, - 0x48, 0x33, 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, - 0x09, 0x40, 0x49, 0x31, 0x69, 0x89, 0x60, 0x08, - 0x48, 0x2f, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, - 0x00, 0xc0, 0x23, 0x04, 0x43, 0x18, 0x49, 0x2c, - 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, 0x48, 0x2a, + 0xf0, 0x11, 0xfb, 0x08, 0xf0, 0x11, 0xfa, 0xe4, + 0x48, 0x27, 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, + 0x00, 0xc0, 0x49, 0x25, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x48, 0x23, 0x69, 0x80, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x49, 0x20, 0x69, 0x89, + 0x60, 0x08, 0x6b, 0xe0, 0x49, 0x1e, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x1e, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1a, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x21, + 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0x51, 0x48, 0x16, + 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x16, 0x40, 0x18, + 0x02, 0x29, 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x11, 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, + 0x48, 0x0f, 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, + 0x09, 0x40, 0x99, 0x00, 0x06, 0xc9, 0x43, 0x08, + 0x49, 0x0b, 0x69, 0xc9, 0x60, 0x08, 0x99, 0x04, + 0x1c, 0x20, 0x22, 0x00, 0xf0, 0x00, 0xfe, 0xbc, + 0xf0, 0x00, 0xff, 0x9d, 0xf0, 0x11, 0xfa, 0xda, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, + 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0f, + 0xb0, 0x81, 0x9c, 0x01, 0x69, 0x20, 0x28, 0x08, + 0xd1, 0x01, 0x08, 0x7f, 0x00, 0x7f, 0x6b, 0xa0, + 0x9a, 0x03, 0x43, 0x50, 0x19, 0xc6, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x37, 0x58, 0x08, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x00, 0x08, 0x76, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x43, 0x70, + 0x90, 0x00, 0x69, 0xa0, 0x99, 0x00, 0x09, 0x49, + 0x18, 0x45, 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x28, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x28, + 0x0a, 0x00, 0x1c, 0x05, 0xf0, 0x11, 0xfa, 0x86, + 0xf0, 0x11, 0xfa, 0x62, 0x48, 0x2a, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x01, + 0x43, 0x18, 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x6b, 0xe0, 0x49, 0x24, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x24, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x20, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x48, 0x1e, + 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x99, 0x00, 0x06, 0xc9, 0x43, 0x01, 0x48, 0x1a, + 0x69, 0x80, 0x60, 0x01, 0x1c, 0x21, 0x1c, 0x20, + 0xf0, 0x00, 0xfd, 0xca, 0x48, 0x16, 0x69, 0xc0, + 0x68, 0x00, 0x4b, 0x17, 0x40, 0x18, 0x02, 0x29, + 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, + 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x48, 0x10, 0x69, 0xc0, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, - 0x99, 0x05, 0x06, 0xc9, 0x43, 0x08, 0x49, 0x26, - 0x69, 0xc9, 0x60, 0x08, 0x48, 0x24, 0x69, 0xc0, - 0x68, 0x00, 0x4b, 0x24, 0x40, 0x18, 0x02, 0x31, - 0x0a, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x20, - 0x69, 0xc9, 0x60, 0x08, 0x01, 0x80, 0x1c, 0x39, - 0x1c, 0x38, 0xf0, 0x00, 0xfb, 0xd7, 0x6b, 0xf8, - 0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1c, - 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, - 0x49, 0x17, 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, - 0x0f, 0xc0, 0x99, 0x07, 0x69, 0x09, 0x1c, 0x38, - 0x22, 0x04, 0xf0, 0x00, 0xfc, 0x4b, 0x69, 0xf8, - 0x49, 0x11, 0x69, 0x49, 0x61, 0x08, 0x98, 0x05, - 0x06, 0xc0, 0x0e, 0xc0, 0x49, 0x0e, 0x69, 0x49, - 0x61, 0x48, 0x48, 0x0d, 0x69, 0x40, 0x61, 0x86, - 0x48, 0x0b, 0x69, 0x40, 0x62, 0x04, 0x98, 0x03, - 0x49, 0x09, 0x69, 0x49, 0x62, 0x48, 0xf0, 0x00, - 0xfd, 0x18, 0xf0, 0x11, 0xf8, 0x33, 0x20, 0x00, - 0xb0, 0x06, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xb0, 0x06, 0xe7, 0xf9, 0x00, 0x00, - 0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x03, 0x32, 0xf4, - 0x2e, 0x08, 0x1f, 0xb0, 0xfc, 0x00, 0x00, 0x03, - 0xff, 0xff, 0xdf, 0xff, 0xb5, 0xff, 0x9d, 0x09, - 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, 0x0e, 0x12, - 0x92, 0x00, 0xb0, 0x93, 0x98, 0x14, 0x90, 0x12, - 0x99, 0x15, 0x91, 0x11, 0xaf, 0x0c, 0x1c, 0x38, - 0x9a, 0x16, 0xca, 0x5e, 0xc0, 0x5e, 0x68, 0x39, - 0x91, 0x04, 0x68, 0x79, 0x91, 0x03, 0x98, 0x12, - 0x99, 0x11, 0x42, 0x88, 0xd1, 0x73, 0x99, 0x03, - 0x42, 0x8d, 0xd9, 0x71, 0x68, 0xb8, 0x90, 0x01, - 0x68, 0xf8, 0x90, 0x02, 0x99, 0x11, 0x6b, 0x48, - 0x6a, 0xc9, 0x1a, 0x40, 0x1c, 0x44, 0x99, 0x11, - 0x6b, 0x08, 0x6a, 0x89, 0x1a, 0x40, 0x30, 0x01, - 0x90, 0x00, 0x98, 0x02, 0x18, 0x28, 0x42, 0xa0, - 0xd9, 0x01, 0x1b, 0x61, 0x91, 0x02, 0x9b, 0x17, - 0x98, 0x01, 0x18, 0x18, 0x99, 0x00, 0x42, 0x88, - 0xd9, 0x03, 0x98, 0x00, 0x9b, 0x17, 0x1a, 0xc0, - 0x90, 0x01, 0x98, 0x01, 0x60, 0xb8, 0x98, 0x02, - 0x60, 0xf8, 0x98, 0x12, 0x69, 0xc0, 0x90, 0x0a, - 0x98, 0x12, 0x6b, 0x80, 0x99, 0x03, 0x43, 0x48, - 0x99, 0x04, 0x18, 0x41, 0x91, 0x05, 0x98, 0x12, - 0x69, 0x00, 0x00, 0x80, 0x49, 0x48, 0x58, 0x08, - 0x99, 0x05, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x12, - 0x69, 0x80, 0x99, 0x0b, 0x09, 0x49, 0x18, 0x41, - 0x91, 0x07, 0x98, 0x0a, 0x99, 0x02, 0x43, 0x48, - 0x90, 0x0b, 0x98, 0x0b, 0x09, 0x40, 0x99, 0x07, - 0x18, 0x40, 0x90, 0x06, 0x98, 0x06, 0x0b, 0xc0, - 0x99, 0x07, 0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x09, - 0x98, 0x09, 0x28, 0x00, 0xd0, 0x56, 0x9e, 0x02, - 0x98, 0x06, 0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, - 0x91, 0x08, 0x99, 0x08, 0x98, 0x0a, 0xf0, 0x04, - 0xf9, 0x17, 0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, - 0x34, 0x01, 0x99, 0x03, 0x98, 0x02, 0x18, 0x08, - 0x1b, 0x00, 0x60, 0x78, 0x60, 0xfc, 0x98, 0x02, - 0x18, 0x28, 0x1b, 0x05, 0x9a, 0x13, 0x1c, 0x29, - 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, - 0x98, 0x16, 0xf0, 0x00, 0xf8, 0x57, 0xb0, 0x02, - 0x1b, 0x36, 0x98, 0x09, 0xe0, 0x01, 0xe0, 0x3c, - 0xe0, 0x3b, 0x38, 0x01, 0x90, 0x09, 0x98, 0x09, - 0x28, 0x00, 0xd0, 0x1a, 0x98, 0x0a, 0x21, 0x01, - 0x03, 0x09, 0xf0, 0x04, 0xf8, 0xf1, 0x1c, 0x04, - 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, - 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, - 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, - 0x98, 0x16, 0xf0, 0x00, 0xf8, 0x37, 0xb0, 0x02, - 0x1b, 0x36, 0x98, 0x09, 0x38, 0x01, 0x90, 0x09, - 0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, - 0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x13, - 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, - 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0x22, - 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13, 0x1c, 0x29, - 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, - 0x98, 0x16, 0xf0, 0x00, 0xf8, 0x17, 0xb0, 0x02, - 0xe0, 0x09, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, - 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, - 0xf0, 0x00, 0xf8, 0xb8, 0xb0, 0x02, 0x20, 0x00, - 0xb0, 0x14, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xb0, 0x13, 0xb0, 0x01, 0xe7, 0xf8, - 0x2e, 0x03, 0x32, 0xf4, 0xb5, 0xff, 0x9d, 0x09, - 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, 0x0e, 0x12, - 0x92, 0x00, 0xb0, 0x92, 0x98, 0x13, 0x90, 0x11, - 0x99, 0x14, 0x91, 0x10, 0xaf, 0x0b, 0x1c, 0x38, - 0x9a, 0x15, 0xca, 0x5e, 0xc0, 0x5e, 0x68, 0x38, - 0x90, 0x03, 0x68, 0x78, 0x90, 0x02, 0x68, 0xb8, - 0x90, 0x00, 0x68, 0xf9, 0x91, 0x01, 0x98, 0x11, - 0x69, 0xc0, 0x90, 0x09, 0x99, 0x10, 0x6b, 0x88, - 0x43, 0x68, 0x9b, 0x16, 0x18, 0xc1, 0x91, 0x04, - 0x99, 0x10, 0x69, 0x08, 0x00, 0x80, 0x49, 0x42, - 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, 0x90, 0x0a, - 0x99, 0x10, 0x69, 0x88, 0x99, 0x0a, 0x09, 0x49, - 0x18, 0x40, 0x90, 0x06, 0x98, 0x09, 0x99, 0x01, - 0x43, 0x48, 0x90, 0x0a, 0x98, 0x0a, 0x09, 0x40, - 0x99, 0x06, 0x18, 0x40, 0x90, 0x05, 0x98, 0x05, - 0x0b, 0xc0, 0x99, 0x06, 0x0b, 0xc9, 0x1a, 0x40, - 0x90, 0x08, 0x98, 0x08, 0x28, 0x00, 0xd0, 0x53, - 0x9e, 0x01, 0x98, 0x05, 0x04, 0x40, 0x0c, 0x40, - 0x01, 0x41, 0x91, 0x07, 0x99, 0x07, 0x98, 0x09, - 0xf0, 0x04, 0xf8, 0x5e, 0x1c, 0x04, 0x2c, 0x00, - 0xd1, 0x00, 0x34, 0x01, 0x98, 0x02, 0x99, 0x01, - 0x18, 0x40, 0x1b, 0x00, 0x60, 0x78, 0x60, 0xfc, - 0x99, 0x01, 0x18, 0x68, 0x1b, 0x05, 0x9a, 0x12, - 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, - 0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x4a, - 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, - 0x90, 0x08, 0x98, 0x08, 0x28, 0x00, 0xd0, 0x1a, - 0x98, 0x09, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04, - 0xf8, 0x3b, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80, + 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, 0xf0, 0x00, + 0xff, 0x1e, 0xf0, 0x11, 0xfa, 0x39, 0x48, 0x0a, + 0x6b, 0x81, 0x1c, 0x20, 0xf0, 0x00, 0xfe, 0xf0, + 0x9b, 0x04, 0x60, 0x18, 0xf0, 0x11, 0xfa, 0x52, + 0x20, 0x00, 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, + 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, + 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0x1c, 0x0c, + 0x1c, 0x1f, 0xb0, 0x83, 0x9d, 0x03, 0x6b, 0x28, + 0x6a, 0xa9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, + 0x19, 0xe0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, + 0x98, 0x00, 0x1b, 0x07, 0x69, 0x28, 0x28, 0x08, + 0xd1, 0x02, 0x08, 0x7f, 0x08, 0x64, 0x00, 0x64, + 0x6b, 0xa8, 0x9a, 0x05, 0x43, 0x50, 0x19, 0x01, + 0x91, 0x01, 0x69, 0x28, 0x00, 0x80, 0x49, 0x38, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, + 0x99, 0x01, 0x08, 0x49, 0x91, 0x01, 0x69, 0x28, + 0x00, 0x80, 0x49, 0x34, 0x58, 0x08, 0x99, 0x01, + 0x43, 0x48, 0x90, 0x02, 0x69, 0xa8, 0x99, 0x02, + 0x09, 0x49, 0x18, 0x46, 0x6b, 0xe8, 0x28, 0x00, + 0xd1, 0x02, 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, + 0x02, 0x30, 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11, + 0xf9, 0xed, 0xf0, 0x11, 0xf9, 0xc9, 0x48, 0x2a, + 0x69, 0x80, 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, + 0x49, 0x27, 0x69, 0x89, 0x60, 0x08, 0x48, 0x26, + 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, + 0x23, 0x02, 0x43, 0x18, 0x49, 0x22, 0x69, 0x89, + 0x60, 0x08, 0x07, 0x40, 0x6b, 0xe8, 0x49, 0x20, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1f, 0x40, 0x19, + 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x1c, + 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, + 0x1c, 0x29, 0x1c, 0x28, 0xf0, 0x00, 0xfd, 0x34, + 0x48, 0x17, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x18, + 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x13, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x99, 0x02, 0x06, 0xc9, + 0x43, 0x08, 0x49, 0x0d, 0x69, 0xc9, 0x60, 0x08, + 0x99, 0x0c, 0x1c, 0x28, 0x22, 0x02, 0xf0, 0x00, + 0xfd, 0x9f, 0x48, 0x09, 0x69, 0x40, 0x62, 0x07, + 0xf0, 0x00, 0xfe, 0x7d, 0xf0, 0x11, 0xf9, 0xba, + 0x20, 0x00, 0xb0, 0x03, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x03, 0xe7, 0xf9, + 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, + 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xff, 0xb0, 0x81, + 0x9f, 0x01, 0x6b, 0x78, 0x6a, 0xf9, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x00, 0x9a, 0x03, 0x9b, 0x04, + 0x18, 0xd0, 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, + 0x98, 0x00, 0x9a, 0x03, 0x1a, 0x83, 0x93, 0x04, + 0x69, 0x38, 0x28, 0x08, 0xd1, 0x03, 0x99, 0x02, + 0x08, 0x49, 0x00, 0x49, 0x91, 0x02, 0x6b, 0xb8, + 0x9a, 0x03, 0x43, 0x50, 0x99, 0x02, 0x18, 0x45, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x00, 0x08, 0x6d, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x39, 0x58, 0x08, + 0x1c, 0x06, 0x43, 0x6e, 0x69, 0xb8, 0x09, 0x71, + 0x18, 0x44, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x20, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x20, + 0x0a, 0x00, 0x1c, 0x04, 0xf0, 0x11, 0xf9, 0x56, + 0xf0, 0x11, 0xf9, 0x32, 0x48, 0x30, 0x69, 0x80, + 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x2e, + 0x69, 0x89, 0x60, 0x08, 0x48, 0x2c, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x03, + 0x43, 0x18, 0x49, 0x29, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x6b, 0xf8, 0x49, 0x26, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x26, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x22, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x1c, 0x39, + 0x1c, 0x38, 0xf0, 0x00, 0xfc, 0x9d, 0x99, 0x0a, + 0x1c, 0x38, 0x22, 0x03, 0xf0, 0x00, 0xfd, 0x20, + 0x69, 0xf8, 0x49, 0x1b, 0x69, 0x49, 0x61, 0x08, + 0x48, 0x19, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x1a, + 0x40, 0x18, 0x02, 0x21, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x15, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x48, 0x13, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x06, 0xf1, 0x43, 0x08, + 0x49, 0x0f, 0x69, 0xc9, 0x60, 0x08, 0x48, 0x0e, + 0x69, 0x40, 0x61, 0x84, 0x06, 0xf0, 0x0e, 0xc0, + 0x49, 0x0b, 0x69, 0x49, 0x61, 0x48, 0x9b, 0x04, + 0x48, 0x09, 0x69, 0x40, 0x62, 0x43, 0xf0, 0x00, + 0xfd, 0xda, 0xf0, 0x11, 0xf9, 0x17, 0x20, 0x00, + 0xb0, 0x01, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x03, 0x3a, 0x04, 0x2e, 0x03, 0x3a, 0x54, + 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xdf, 0xff, + 0xfc, 0x00, 0x00, 0x03, 0xb5, 0xf3, 0xb0, 0x86, + 0x9f, 0x06, 0x99, 0x07, 0x68, 0x8c, 0x99, 0x07, + 0x68, 0xc8, 0x90, 0x03, 0x99, 0x07, 0x68, 0x0d, + 0x99, 0x07, 0x68, 0x49, 0x91, 0x02, 0x6b, 0x78, + 0x6a, 0xf9, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01, + 0x6b, 0x38, 0x6a, 0xb9, 0x1a, 0x40, 0x30, 0x01, + 0x90, 0x00, 0x99, 0x02, 0x98, 0x03, 0x18, 0x08, + 0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01, + 0x99, 0x02, 0x1a, 0x40, 0x90, 0x03, 0x19, 0x28, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x01, 0x98, 0x00, + 0x1b, 0x44, 0x69, 0x38, 0x28, 0x08, 0xd1, 0x02, + 0x08, 0x64, 0x08, 0x6d, 0x00, 0x6d, 0x6b, 0xb8, + 0x99, 0x02, 0x43, 0x48, 0x19, 0x41, 0x91, 0x04, + 0x69, 0x38, 0x00, 0x80, 0x49, 0x41, 0x58, 0x08, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x99, 0x04, + 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, + 0x49, 0x3d, 0x58, 0x08, 0x99, 0x04, 0x43, 0x48, + 0x90, 0x05, 0x69, 0xb8, 0x99, 0x05, 0x09, 0x49, + 0x18, 0x46, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x02, + 0x03, 0x30, 0x0b, 0x00, 0xe0, 0x01, 0x02, 0x30, + 0x0a, 0x00, 0x1c, 0x06, 0xf0, 0x11, 0xf8, 0x9a, + 0xf0, 0x11, 0xf8, 0x76, 0x48, 0x33, 0x69, 0x80, + 0x68, 0x00, 0x01, 0x40, 0x09, 0x40, 0x49, 0x31, + 0x69, 0x89, 0x60, 0x08, 0x48, 0x2f, 0x69, 0x80, + 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x04, + 0x43, 0x18, 0x49, 0x2c, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x40, 0x48, 0x2a, 0x69, 0xc0, 0x68, 0x00, + 0x01, 0x40, 0x09, 0x40, 0x99, 0x05, 0x06, 0xc9, + 0x43, 0x08, 0x49, 0x26, 0x69, 0xc9, 0x60, 0x08, + 0x48, 0x24, 0x69, 0xc0, 0x68, 0x00, 0x4b, 0x24, + 0x40, 0x18, 0x02, 0x31, 0x0a, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x20, 0x69, 0xc9, 0x60, 0x08, + 0x01, 0x80, 0x1c, 0x39, 0x1c, 0x38, 0xf0, 0x00, + 0xfb, 0xd7, 0x6b, 0xf8, 0x49, 0x1b, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x1c, 0x40, 0x19, 0x07, 0xc0, + 0x0c, 0x80, 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, + 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, 0x99, 0x07, + 0x69, 0x09, 0x1c, 0x38, 0x22, 0x04, 0xf0, 0x00, + 0xfc, 0x4b, 0x69, 0xf8, 0x49, 0x11, 0x69, 0x49, + 0x61, 0x08, 0x98, 0x05, 0x06, 0xc0, 0x0e, 0xc0, + 0x49, 0x0e, 0x69, 0x49, 0x61, 0x48, 0x48, 0x0d, + 0x69, 0x40, 0x61, 0x86, 0x48, 0x0b, 0x69, 0x40, + 0x62, 0x04, 0x98, 0x03, 0x49, 0x09, 0x69, 0x49, + 0x62, 0x48, 0xf0, 0x00, 0xfd, 0x18, 0xf0, 0x11, + 0xf8, 0x55, 0x20, 0x00, 0xb0, 0x06, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x06, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x04, + 0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8, + 0xfc, 0x00, 0x00, 0x03, 0xff, 0xff, 0xdf, 0xff, + 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x93, + 0x98, 0x14, 0x90, 0x12, 0x99, 0x15, 0x91, 0x11, + 0xaf, 0x0c, 0x1c, 0x38, 0x9a, 0x16, 0xca, 0x5e, + 0xc0, 0x5e, 0x68, 0x39, 0x91, 0x04, 0x68, 0x79, + 0x91, 0x03, 0x98, 0x12, 0x99, 0x11, 0x42, 0x88, + 0xd1, 0x73, 0x99, 0x03, 0x42, 0x8d, 0xd9, 0x71, + 0x68, 0xb8, 0x90, 0x01, 0x68, 0xf8, 0x90, 0x02, + 0x99, 0x11, 0x6b, 0x48, 0x6a, 0xc9, 0x1a, 0x40, + 0x1c, 0x44, 0x99, 0x11, 0x6b, 0x08, 0x6a, 0x89, + 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x98, 0x02, + 0x18, 0x28, 0x42, 0xa0, 0xd9, 0x01, 0x1b, 0x61, + 0x91, 0x02, 0x9b, 0x17, 0x98, 0x01, 0x18, 0x18, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, + 0x9b, 0x17, 0x1a, 0xc0, 0x90, 0x01, 0x98, 0x01, + 0x60, 0xb8, 0x98, 0x02, 0x60, 0xf8, 0x98, 0x12, + 0x69, 0xc0, 0x90, 0x0a, 0x98, 0x12, 0x6b, 0x80, + 0x99, 0x03, 0x43, 0x48, 0x99, 0x04, 0x18, 0x41, + 0x91, 0x05, 0x98, 0x12, 0x69, 0x00, 0x00, 0x80, + 0x49, 0x48, 0x58, 0x08, 0x99, 0x05, 0x43, 0x48, + 0x90, 0x0b, 0x98, 0x12, 0x69, 0x80, 0x99, 0x0b, + 0x09, 0x49, 0x18, 0x41, 0x91, 0x07, 0x98, 0x0a, + 0x99, 0x02, 0x43, 0x48, 0x90, 0x0b, 0x98, 0x0b, + 0x09, 0x40, 0x99, 0x07, 0x18, 0x40, 0x90, 0x06, + 0x98, 0x06, 0x0b, 0xc0, 0x99, 0x07, 0x0b, 0xc9, + 0x1a, 0x40, 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, + 0xd0, 0x56, 0x9e, 0x02, 0x98, 0x06, 0x04, 0x40, + 0x0c, 0x40, 0x01, 0x41, 0x91, 0x08, 0x99, 0x08, + 0x98, 0x0a, 0xf0, 0x04, 0xf9, 0x17, 0x1c, 0x04, + 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, 0x99, 0x03, + 0x98, 0x02, 0x18, 0x08, 0x1b, 0x00, 0x60, 0x78, + 0x60, 0xfc, 0x98, 0x02, 0x18, 0x28, 0x1b, 0x05, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x57, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, + 0xe0, 0x01, 0xe0, 0x3c, 0xe0, 0x3b, 0x38, 0x01, + 0x90, 0x09, 0x98, 0x09, 0x28, 0x00, 0xd0, 0x1a, + 0x98, 0x0a, 0x21, 0x01, 0x03, 0x09, 0xf0, 0x04, + 0xf8, 0xf1, 0x1c, 0x04, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, 0x68, 0xf8, 0x1a, 0x2d, - 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, - 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, - 0xf8, 0x2d, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x08, - 0x38, 0x01, 0x90, 0x08, 0xe7, 0xe1, 0x68, 0x78, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x37, 0xb0, 0x02, 0x1b, 0x36, 0x98, 0x09, + 0x38, 0x01, 0x90, 0x09, 0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfe, 0x68, 0xf8, - 0x1a, 0x2d, 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, + 0x1a, 0x2d, 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, + 0x9b, 0x19, 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, + 0xf0, 0x00, 0xf8, 0x22, 0xb0, 0x02, 0xe0, 0x09, + 0x9a, 0x13, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, + 0x1c, 0x3a, 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, + 0xf8, 0x17, 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x13, + 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x19, 0x1c, 0x3a, + 0x99, 0x17, 0x98, 0x16, 0xf0, 0x00, 0xf8, 0xb8, + 0xb0, 0x02, 0x20, 0x00, 0xb0, 0x14, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x13, + 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x54, + 0xb5, 0xff, 0x9d, 0x09, 0xb0, 0x81, 0x98, 0x0b, + 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x92, + 0x98, 0x13, 0x90, 0x11, 0x99, 0x14, 0x91, 0x10, + 0xaf, 0x0b, 0x1c, 0x38, 0x9a, 0x15, 0xca, 0x5e, + 0xc0, 0x5e, 0x68, 0x38, 0x90, 0x03, 0x68, 0x78, + 0x90, 0x02, 0x68, 0xb8, 0x90, 0x00, 0x68, 0xf9, + 0x91, 0x01, 0x98, 0x11, 0x69, 0xc0, 0x90, 0x09, + 0x99, 0x10, 0x6b, 0x88, 0x43, 0x68, 0x9b, 0x16, + 0x18, 0xc1, 0x91, 0x04, 0x99, 0x10, 0x69, 0x08, + 0x00, 0x80, 0x49, 0x42, 0x58, 0x08, 0x99, 0x04, + 0x43, 0x48, 0x90, 0x0a, 0x99, 0x10, 0x69, 0x88, + 0x99, 0x0a, 0x09, 0x49, 0x18, 0x40, 0x90, 0x06, + 0x98, 0x09, 0x99, 0x01, 0x43, 0x48, 0x90, 0x0a, + 0x98, 0x0a, 0x09, 0x40, 0x99, 0x06, 0x18, 0x40, + 0x90, 0x05, 0x98, 0x05, 0x0b, 0xc0, 0x99, 0x06, + 0x0b, 0xc9, 0x1a, 0x40, 0x90, 0x08, 0x98, 0x08, + 0x28, 0x00, 0xd0, 0x53, 0x9e, 0x01, 0x98, 0x05, + 0x04, 0x40, 0x0c, 0x40, 0x01, 0x41, 0x91, 0x07, + 0x99, 0x07, 0x98, 0x09, 0xf0, 0x04, 0xf8, 0x5e, + 0x1c, 0x04, 0x2c, 0x00, 0xd1, 0x00, 0x34, 0x01, + 0x98, 0x02, 0x99, 0x01, 0x18, 0x40, 0x1b, 0x00, + 0x60, 0x78, 0x60, 0xfc, 0x99, 0x01, 0x18, 0x68, + 0x1b, 0x05, 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15, - 0xf0, 0x00, 0xf8, 0x18, 0xb0, 0x02, 0xe0, 0x09, - 0x9a, 0x12, 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, - 0x1c, 0x3a, 0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, - 0xf8, 0x0d, 0xb0, 0x02, 0x20, 0x00, 0xb0, 0x13, - 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0xb0, 0x12, 0xb0, 0x01, 0xe7, 0xf8, 0x00, 0x00, - 0x2e, 0x03, 0x32, 0xf4, 0xb5, 0xff, 0xb0, 0x81, - 0x98, 0x0b, 0x06, 0x02, 0x0e, 0x12, 0x92, 0x00, - 0xb0, 0x8e, 0x9f, 0x0f, 0x9c, 0x10, 0x9a, 0x11, - 0x68, 0x10, 0x90, 0x07, 0x9a, 0x11, 0x68, 0x50, - 0x90, 0x06, 0x9a, 0x11, 0x68, 0x91, 0x91, 0x08, - 0x9a, 0x11, 0x68, 0xd0, 0x90, 0x09, 0x6b, 0x60, - 0x6a, 0xe1, 0x1a, 0x40, 0x30, 0x01, 0x90, 0x01, - 0x6b, 0x20, 0x6a, 0xa1, 0x1a, 0x40, 0x30, 0x01, - 0x90, 0x00, 0x99, 0x18, 0x98, 0x09, 0x18, 0x08, - 0x99, 0x01, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x01, - 0x99, 0x18, 0x1a, 0x41, 0x91, 0x09, 0x9b, 0x12, - 0x99, 0x08, 0x18, 0x58, 0x99, 0x00, 0x42, 0x88, - 0xd9, 0x03, 0x98, 0x00, 0x9b, 0x12, 0x1a, 0xc1, - 0x91, 0x08, 0x22, 0x00, 0x92, 0x05, 0x42, 0xa7, - 0xd1, 0x20, 0x99, 0x18, 0x98, 0x06, 0x42, 0x81, - 0xd9, 0x0c, 0x22, 0x02, 0x92, 0x05, 0x99, 0x06, - 0x98, 0x09, 0x18, 0x08, 0x1e, 0x41, 0x91, 0x06, - 0x99, 0x18, 0x98, 0x09, 0x18, 0x08, 0x1e, 0x41, - 0x91, 0x18, 0xe0, 0x0f, 0x9b, 0x12, 0x98, 0x07, - 0x42, 0x83, 0xd9, 0x0b, 0x22, 0x01, 0x92, 0x05, - 0x98, 0x07, 0x99, 0x08, 0x18, 0x40, 0x38, 0x01, - 0x90, 0x07, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58, - 0x1e, 0x43, 0x93, 0x12, 0x69, 0x38, 0x28, 0x08, - 0xd1, 0x0a, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08, - 0x98, 0x07, 0x08, 0x40, 0x00, 0x40, 0x90, 0x07, - 0x9b, 0x12, 0x08, 0x5b, 0x00, 0x5b, 0x93, 0x12, - 0x69, 0x38, 0x00, 0x80, 0x49, 0xc6, 0x58, 0x08, - 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 0x90, 0x03, - 0x69, 0x20, 0x00, 0x80, 0x49, 0xc2, 0x58, 0x08, - 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 0x90, 0x02, - 0x6b, 0xb8, 0x99, 0x06, 0x43, 0x48, 0x99, 0x07, - 0x18, 0x41, 0x91, 0x04, 0x98, 0x03, 0x28, 0x00, - 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, - 0x69, 0x38, 0x00, 0x80, 0x49, 0xb9, 0x58, 0x08, - 0x99, 0x04, 0x1c, 0x06, 0x43, 0x4e, 0x6b, 0xa0, - 0x99, 0x18, 0x43, 0x48, 0x9b, 0x12, 0x18, 0xc1, - 0x91, 0x04, 0x98, 0x02, 0x28, 0x00, 0xd0, 0x02, - 0x99, 0x04, 0x08, 0x49, 0x91, 0x04, 0x69, 0x20, - 0x00, 0x80, 0x49, 0xb0, 0x58, 0x08, 0x99, 0x04, - 0x1c, 0x05, 0x43, 0x4d, 0x9a, 0x05, 0x2a, 0x01, - 0xd1, 0x3d, 0x69, 0x38, 0x28, 0x08, 0xd0, 0x3a, - 0x69, 0x38, 0x28, 0x09, 0xd0, 0x02, 0x69, 0x38, - 0x28, 0x0a, 0xd1, 0x0a, 0x36, 0x10, 0x69, 0xb8, - 0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x06, 0xf0, - 0x0e, 0xc0, 0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0a, - 0xe0, 0x0b, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, - 0x91, 0x0b, 0x69, 0x38, 0x00, 0x80, 0x49, 0x9f, - 0x58, 0x08, 0x19, 0x86, 0x06, 0xf1, 0x0e, 0xc9, - 0x91, 0x0a, 0x69, 0x20, 0x28, 0x09, 0xd0, 0x02, - 0x69, 0x20, 0x28, 0x0a, 0xd1, 0x0a, 0x35, 0x10, + 0xf0, 0x00, 0xf8, 0x4a, 0xb0, 0x02, 0x1b, 0x36, + 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, 0x98, 0x08, + 0x28, 0x00, 0xd0, 0x1a, 0x98, 0x09, 0x21, 0x01, + 0x03, 0x09, 0xf0, 0x04, 0xf8, 0x3b, 0x1c, 0x04, + 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, 0x60, 0xfc, + 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, 0x1c, 0x29, + 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, + 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x2d, 0xb0, 0x02, + 0x1b, 0x36, 0x98, 0x08, 0x38, 0x01, 0x90, 0x08, + 0xe7, 0xe1, 0x68, 0x78, 0x1b, 0x80, 0x60, 0x78, + 0x60, 0xfe, 0x68, 0xf8, 0x1a, 0x2d, 0x9a, 0x12, + 0x1c, 0x29, 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, + 0x99, 0x16, 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x18, + 0xb0, 0x02, 0xe0, 0x09, 0x9a, 0x12, 0x1c, 0x29, + 0xb4, 0x06, 0x9b, 0x18, 0x1c, 0x3a, 0x99, 0x16, + 0x98, 0x15, 0xf0, 0x00, 0xf8, 0x0d, 0xb0, 0x02, + 0x20, 0x00, 0xb0, 0x13, 0xb0, 0x04, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x12, 0xb0, 0x01, + 0xe7, 0xf8, 0x00, 0x00, 0x2e, 0x03, 0x3a, 0x54, + 0xb5, 0xff, 0xb0, 0x81, 0x98, 0x0b, 0x06, 0x02, + 0x0e, 0x12, 0x92, 0x00, 0xb0, 0x8e, 0x9f, 0x0f, + 0x9c, 0x10, 0x9a, 0x11, 0x68, 0x10, 0x90, 0x07, + 0x9a, 0x11, 0x68, 0x50, 0x90, 0x06, 0x9a, 0x11, + 0x68, 0x91, 0x91, 0x08, 0x9a, 0x11, 0x68, 0xd0, + 0x90, 0x09, 0x6b, 0x60, 0x6a, 0xe1, 0x1a, 0x40, + 0x30, 0x01, 0x90, 0x01, 0x6b, 0x20, 0x6a, 0xa1, + 0x1a, 0x40, 0x30, 0x01, 0x90, 0x00, 0x99, 0x18, + 0x98, 0x09, 0x18, 0x08, 0x99, 0x01, 0x42, 0x88, + 0xd9, 0x03, 0x98, 0x01, 0x99, 0x18, 0x1a, 0x41, + 0x91, 0x09, 0x9b, 0x12, 0x99, 0x08, 0x18, 0x58, + 0x99, 0x00, 0x42, 0x88, 0xd9, 0x03, 0x98, 0x00, + 0x9b, 0x12, 0x1a, 0xc1, 0x91, 0x08, 0x22, 0x00, + 0x92, 0x05, 0x42, 0xa7, 0xd1, 0x20, 0x99, 0x18, + 0x98, 0x06, 0x42, 0x81, 0xd9, 0x0c, 0x22, 0x02, + 0x92, 0x05, 0x99, 0x06, 0x98, 0x09, 0x18, 0x08, + 0x1e, 0x41, 0x91, 0x06, 0x99, 0x18, 0x98, 0x09, + 0x18, 0x08, 0x1e, 0x41, 0x91, 0x18, 0xe0, 0x0f, + 0x9b, 0x12, 0x98, 0x07, 0x42, 0x83, 0xd9, 0x0b, + 0x22, 0x01, 0x92, 0x05, 0x98, 0x07, 0x99, 0x08, + 0x18, 0x40, 0x38, 0x01, 0x90, 0x07, 0x9b, 0x12, + 0x99, 0x08, 0x18, 0x58, 0x1e, 0x43, 0x93, 0x12, + 0x69, 0x38, 0x28, 0x08, 0xd1, 0x0a, 0x99, 0x08, + 0x08, 0x49, 0x91, 0x08, 0x98, 0x07, 0x08, 0x40, + 0x00, 0x40, 0x90, 0x07, 0x9b, 0x12, 0x08, 0x5b, + 0x00, 0x5b, 0x93, 0x12, 0x69, 0x38, 0x00, 0x80, + 0x49, 0xc6, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x90, 0x03, 0x69, 0x20, 0x00, 0x80, + 0x49, 0xc2, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x90, 0x02, 0x6b, 0xb8, 0x99, 0x06, + 0x43, 0x48, 0x99, 0x07, 0x18, 0x41, 0x91, 0x04, + 0x98, 0x03, 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, + 0x08, 0x49, 0x91, 0x04, 0x69, 0x38, 0x00, 0x80, + 0x49, 0xb9, 0x58, 0x08, 0x99, 0x04, 0x1c, 0x06, + 0x43, 0x4e, 0x6b, 0xa0, 0x99, 0x18, 0x43, 0x48, + 0x9b, 0x12, 0x18, 0xc1, 0x91, 0x04, 0x98, 0x02, + 0x28, 0x00, 0xd0, 0x02, 0x99, 0x04, 0x08, 0x49, + 0x91, 0x04, 0x69, 0x20, 0x00, 0x80, 0x49, 0xb0, + 0x58, 0x08, 0x99, 0x04, 0x1c, 0x05, 0x43, 0x4d, + 0x9a, 0x05, 0x2a, 0x01, 0xd1, 0x3d, 0x69, 0x38, + 0x28, 0x08, 0xd0, 0x3a, 0x69, 0x38, 0x28, 0x09, + 0xd0, 0x02, 0x69, 0x38, 0x28, 0x0a, 0xd1, 0x0a, + 0x36, 0x10, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, + 0x91, 0x0b, 0x06, 0xf0, 0x0e, 0xc0, 0x1d, 0xc1, + 0x31, 0x01, 0x91, 0x0a, 0xe0, 0x0b, 0x69, 0xb8, + 0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0x38, + 0x00, 0x80, 0x49, 0x9f, 0x58, 0x08, 0x19, 0x86, + 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, 0x69, 0x20, + 0x28, 0x09, 0xd0, 0x02, 0x69, 0x20, 0x28, 0x0a, + 0xd1, 0x0a, 0x35, 0x10, 0x69, 0xa0, 0x09, 0x69, + 0x18, 0x41, 0x91, 0x0d, 0x06, 0xe8, 0x0e, 0xc0, + 0x1d, 0xc1, 0x31, 0x01, 0x91, 0x0c, 0xe0, 0x0b, 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, - 0x06, 0xe8, 0x0e, 0xc0, 0x1d, 0xc1, 0x31, 0x01, - 0x91, 0x0c, 0xe0, 0x0b, 0x69, 0xa0, 0x09, 0x69, - 0x18, 0x41, 0x91, 0x0d, 0x69, 0x20, 0x00, 0x80, - 0x49, 0x90, 0x58, 0x08, 0x19, 0x45, 0x06, 0xe9, - 0x0e, 0xc9, 0x91, 0x0c, 0xe0, 0x0d, 0x69, 0xb8, - 0x09, 0x71, 0x18, 0x41, 0x91, 0x0b, 0x69, 0xa0, - 0x09, 0x69, 0x18, 0x41, 0x91, 0x0d, 0x06, 0xf1, - 0x0e, 0xc9, 0x91, 0x0a, 0x06, 0xe9, 0x0e, 0xc9, - 0x91, 0x0c, 0x6b, 0xf8, 0x28, 0x00, 0xd1, 0x03, - 0x99, 0x0b, 0x03, 0x09, 0x0b, 0x09, 0xe0, 0x02, - 0x99, 0x0b, 0x02, 0x09, 0x0a, 0x09, 0x91, 0x0b, - 0x6b, 0xe0, 0x28, 0x00, 0xd1, 0x03, 0x99, 0x0d, - 0x03, 0x09, 0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0d, - 0x02, 0x09, 0x0a, 0x09, 0x91, 0x0d, 0xf0, 0x10, - 0xfd, 0x79, 0xf0, 0x10, 0xfd, 0x55, 0x48, 0x7a, - 0x69, 0x80, 0x68, 0x00, 0x08, 0xc0, 0x00, 0xc0, - 0x23, 0x05, 0x43, 0x18, 0x49, 0x76, 0x69, 0x89, - 0x60, 0x08, 0x07, 0x40, 0x1c, 0x21, 0x1c, 0x38, - 0xf0, 0x00, 0xf8, 0xf8, 0x98, 0x03, 0x28, 0x00, - 0xd0, 0x18, 0x98, 0x02, 0x28, 0x00, 0xd0, 0x15, - 0x48, 0x6f, 0x69, 0x80, 0x68, 0x00, 0x23, 0x08, - 0x43, 0xdb, 0x40, 0x18, 0x49, 0x6c, 0x69, 0x89, - 0x60, 0x08, 0x07, 0x00, 0x48, 0x6a, 0x69, 0x80, - 0x68, 0x00, 0x4b, 0x6a, 0x40, 0x18, 0x49, 0x68, - 0x69, 0x89, 0x60, 0x08, 0x05, 0xc0, 0x99, 0x08, - 0x08, 0x49, 0x91, 0x08, 0x6b, 0xf8, 0x49, 0x64, - 0x69, 0x89, 0x68, 0x09, 0x4b, 0x64, 0x40, 0x19, - 0x07, 0xc0, 0x0c, 0x40, 0x43, 0x08, 0x49, 0x60, - 0x69, 0x89, 0x60, 0x08, 0x04, 0x40, 0x0f, 0xc0, - 0x6b, 0xe0, 0x49, 0x5d, 0x69, 0x89, 0x68, 0x09, - 0x4b, 0x5e, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x80, - 0x43, 0x08, 0x49, 0x59, 0x69, 0x89, 0x60, 0x08, - 0x04, 0x80, 0x0f, 0xc0, 0x68, 0x38, 0x28, 0x00, - 0xd0, 0x0d, 0x79, 0x38, 0x49, 0x54, 0x69, 0x89, - 0x68, 0x09, 0x4b, 0x57, 0x40, 0x19, 0x03, 0xc0, - 0x43, 0x08, 0x49, 0x51, 0x69, 0x89, 0x60, 0x08, - 0x02, 0x40, 0x0e, 0x00, 0xe0, 0x0d, 0x6a, 0x78, - 0x78, 0x00, 0x49, 0x4d, 0x69, 0x89, 0x68, 0x09, - 0x4b, 0x4f, 0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, - 0x49, 0x49, 0x69, 0x89, 0x60, 0x08, 0x02, 0x40, - 0x0e, 0x00, 0x69, 0x20, 0x00, 0x80, 0x49, 0x45, - 0x58, 0x08, 0x99, 0x08, 0x43, 0x48, 0x28, 0x40, - 0xd9, 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x01, - 0x1c, 0x08, 0x49, 0x41, 0x69, 0x89, 0x68, 0x09, - 0x4b, 0x44, 0x40, 0x19, 0x07, 0xc2, 0x09, 0x52, - 0x43, 0x11, 0x4a, 0x3d, 0x69, 0x92, 0x60, 0x11, - 0x01, 0x49, 0x0f, 0xc9, 0x49, 0x3a, 0x69, 0x89, - 0x68, 0x09, 0x4b, 0x3f, 0x40, 0x19, 0x9a, 0x05, - 0x07, 0x92, 0x0f, 0x92, 0x05, 0xd2, 0x43, 0x11, - 0x4a, 0x35, 0x69, 0x92, 0x60, 0x11, 0x01, 0xc9, - 0x49, 0x33, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x39, - 0x40, 0x19, 0x9a, 0x0e, 0x07, 0xd2, 0x09, 0x92, - 0x43, 0x11, 0x4a, 0x2f, 0x69, 0x92, 0x60, 0x11, - 0x01, 0x89, 0x69, 0xf9, 0x4a, 0x2c, 0x69, 0x52, - 0x60, 0x11, 0x49, 0x2b, 0x69, 0x89, 0x68, 0x09, - 0x01, 0x49, 0x09, 0x49, 0x9a, 0x0a, 0x06, 0xd2, - 0x43, 0x11, 0x4a, 0x27, 0x69, 0x92, 0x60, 0x11, - 0x99, 0x0a, 0x4a, 0x25, 0x69, 0x52, 0x60, 0x51, - 0x99, 0x0b, 0x4a, 0x23, 0x69, 0x52, 0x60, 0x91, - 0x99, 0x0b, 0x4a, 0x21, 0x69, 0x52, 0x60, 0xd1, - 0x69, 0xe1, 0x4a, 0x1f, 0x69, 0x52, 0x61, 0x11, - 0x49, 0x1d, 0x69, 0xc9, 0x68, 0x09, 0x01, 0x49, - 0x09, 0x49, 0x9a, 0x0c, 0x06, 0xd2, 0x43, 0x11, - 0x4a, 0x19, 0x69, 0xd2, 0x60, 0x11, 0x99, 0x0c, - 0x4a, 0x17, 0x69, 0x52, 0x61, 0x51, 0x99, 0x0d, - 0x4a, 0x15, 0x69, 0x52, 0x61, 0x91, 0x99, 0x0d, - 0x4a, 0x13, 0x69, 0x52, 0x61, 0xd1, 0x99, 0x09, - 0x4a, 0x11, 0x69, 0x52, 0x62, 0x51, 0x99, 0x08, - 0x4a, 0x0f, 0x69, 0x52, 0x62, 0x11, 0x68, 0x38, - 0x28, 0x00, 0xd0, 0x05, 0x48, 0x14, 0x68, 0x01, - 0x23, 0x01, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x02, - 0x48, 0x11, 0x21, 0x00, 0x60, 0x01, 0xf0, 0x00, - 0xf9, 0x8c, 0xf0, 0x10, 0xfc, 0xa7, 0x20, 0x00, - 0xb0, 0x0f, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xb0, 0x0e, 0xb0, 0x01, 0xe7, 0xf8, - 0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x03, 0x32, 0xf4, - 0x2e, 0x08, 0x1f, 0xb0, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0x80, 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xff, - 0xfe, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, - 0x68, 0x00, 0x00, 0x40, 0xb4, 0x80, 0x1c, 0x07, - 0x1c, 0x0a, 0x69, 0x38, 0x00, 0x80, 0x49, 0x3c, + 0x69, 0x20, 0x00, 0x80, 0x49, 0x90, 0x58, 0x08, + 0x19, 0x45, 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, + 0xe0, 0x0d, 0x69, 0xb8, 0x09, 0x71, 0x18, 0x41, + 0x91, 0x0b, 0x69, 0xa0, 0x09, 0x69, 0x18, 0x41, + 0x91, 0x0d, 0x06, 0xf1, 0x0e, 0xc9, 0x91, 0x0a, + 0x06, 0xe9, 0x0e, 0xc9, 0x91, 0x0c, 0x6b, 0xf8, + 0x28, 0x00, 0xd1, 0x03, 0x99, 0x0b, 0x03, 0x09, + 0x0b, 0x09, 0xe0, 0x02, 0x99, 0x0b, 0x02, 0x09, + 0x0a, 0x09, 0x91, 0x0b, 0x6b, 0xe0, 0x28, 0x00, + 0xd1, 0x03, 0x99, 0x0d, 0x03, 0x09, 0x0b, 0x09, + 0xe0, 0x02, 0x99, 0x0d, 0x02, 0x09, 0x0a, 0x09, + 0x91, 0x0d, 0xf0, 0x10, 0xfd, 0x9b, 0xf0, 0x10, + 0xfd, 0x77, 0x48, 0x7a, 0x69, 0x80, 0x68, 0x00, + 0x08, 0xc0, 0x00, 0xc0, 0x23, 0x05, 0x43, 0x18, + 0x49, 0x76, 0x69, 0x89, 0x60, 0x08, 0x07, 0x40, + 0x1c, 0x21, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0xf8, + 0x98, 0x03, 0x28, 0x00, 0xd0, 0x18, 0x98, 0x02, + 0x28, 0x00, 0xd0, 0x15, 0x48, 0x6f, 0x69, 0x80, + 0x68, 0x00, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x18, + 0x49, 0x6c, 0x69, 0x89, 0x60, 0x08, 0x07, 0x00, + 0x48, 0x6a, 0x69, 0x80, 0x68, 0x00, 0x4b, 0x6a, + 0x40, 0x18, 0x49, 0x68, 0x69, 0x89, 0x60, 0x08, + 0x05, 0xc0, 0x99, 0x08, 0x08, 0x49, 0x91, 0x08, + 0x6b, 0xf8, 0x49, 0x64, 0x69, 0x89, 0x68, 0x09, + 0x4b, 0x64, 0x40, 0x19, 0x07, 0xc0, 0x0c, 0x40, + 0x43, 0x08, 0x49, 0x60, 0x69, 0x89, 0x60, 0x08, + 0x04, 0x40, 0x0f, 0xc0, 0x6b, 0xe0, 0x49, 0x5d, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x5e, 0x40, 0x19, + 0x07, 0xc0, 0x0c, 0x80, 0x43, 0x08, 0x49, 0x59, + 0x69, 0x89, 0x60, 0x08, 0x04, 0x80, 0x0f, 0xc0, + 0x68, 0x38, 0x28, 0x00, 0xd0, 0x0d, 0x79, 0x38, + 0x49, 0x54, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x57, + 0x40, 0x19, 0x03, 0xc0, 0x43, 0x08, 0x49, 0x51, + 0x69, 0x89, 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, + 0xe0, 0x0d, 0x6a, 0x78, 0x78, 0x00, 0x49, 0x4d, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x4f, 0x40, 0x19, + 0x03, 0xc0, 0x43, 0x08, 0x49, 0x49, 0x69, 0x89, + 0x60, 0x08, 0x02, 0x40, 0x0e, 0x00, 0x69, 0x20, + 0x00, 0x80, 0x49, 0x45, 0x58, 0x08, 0x99, 0x08, + 0x43, 0x48, 0x28, 0x40, 0xd9, 0x01, 0x21, 0x00, + 0xe0, 0x00, 0x21, 0x01, 0x1c, 0x08, 0x49, 0x41, + 0x69, 0x89, 0x68, 0x09, 0x4b, 0x44, 0x40, 0x19, + 0x07, 0xc2, 0x09, 0x52, 0x43, 0x11, 0x4a, 0x3d, + 0x69, 0x92, 0x60, 0x11, 0x01, 0x49, 0x0f, 0xc9, + 0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x3f, + 0x40, 0x19, 0x9a, 0x05, 0x07, 0x92, 0x0f, 0x92, + 0x05, 0xd2, 0x43, 0x11, 0x4a, 0x35, 0x69, 0x92, + 0x60, 0x11, 0x01, 0xc9, 0x49, 0x33, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x39, 0x40, 0x19, 0x9a, 0x0e, + 0x07, 0xd2, 0x09, 0x92, 0x43, 0x11, 0x4a, 0x2f, + 0x69, 0x92, 0x60, 0x11, 0x01, 0x89, 0x69, 0xf9, + 0x4a, 0x2c, 0x69, 0x52, 0x60, 0x11, 0x49, 0x2b, + 0x69, 0x89, 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, + 0x9a, 0x0a, 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x27, + 0x69, 0x92, 0x60, 0x11, 0x99, 0x0a, 0x4a, 0x25, + 0x69, 0x52, 0x60, 0x51, 0x99, 0x0b, 0x4a, 0x23, + 0x69, 0x52, 0x60, 0x91, 0x99, 0x0b, 0x4a, 0x21, + 0x69, 0x52, 0x60, 0xd1, 0x69, 0xe1, 0x4a, 0x1f, + 0x69, 0x52, 0x61, 0x11, 0x49, 0x1d, 0x69, 0xc9, + 0x68, 0x09, 0x01, 0x49, 0x09, 0x49, 0x9a, 0x0c, + 0x06, 0xd2, 0x43, 0x11, 0x4a, 0x19, 0x69, 0xd2, + 0x60, 0x11, 0x99, 0x0c, 0x4a, 0x17, 0x69, 0x52, + 0x61, 0x51, 0x99, 0x0d, 0x4a, 0x15, 0x69, 0x52, + 0x61, 0x91, 0x99, 0x0d, 0x4a, 0x13, 0x69, 0x52, + 0x61, 0xd1, 0x99, 0x09, 0x4a, 0x11, 0x69, 0x52, + 0x62, 0x51, 0x99, 0x08, 0x4a, 0x0f, 0x69, 0x52, + 0x62, 0x11, 0x68, 0x38, 0x28, 0x00, 0xd0, 0x05, + 0x48, 0x14, 0x68, 0x01, 0x23, 0x01, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x02, 0x48, 0x11, 0x21, 0x00, + 0x60, 0x01, 0xf0, 0x00, 0xf9, 0x8c, 0xf0, 0x10, + 0xfc, 0xc9, 0x20, 0x00, 0xb0, 0x0f, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x0e, + 0xb0, 0x01, 0xe7, 0xf8, 0x2e, 0x03, 0x3a, 0x04, + 0x2e, 0x03, 0x3a, 0x54, 0x2e, 0x08, 0x1f, 0xa8, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x80, 0x7f, 0xff, + 0xfb, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xff, 0xff, + 0xfd, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x40, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, + 0x00, 0x80, 0x49, 0x3c, 0x58, 0x08, 0x23, 0x18, + 0x40, 0x18, 0x08, 0xc0, 0x49, 0x3a, 0x69, 0x89, + 0x68, 0x09, 0x23, 0xc0, 0x43, 0xdb, 0x40, 0x19, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x08, + 0x49, 0x35, 0x69, 0x89, 0x60, 0x08, 0x06, 0x00, + 0x0f, 0x80, 0x69, 0x38, 0x00, 0x80, 0x49, 0x31, + 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, + 0x49, 0x2f, 0x69, 0x89, 0x68, 0x09, 0x23, 0x08, + 0x43, 0xdb, 0x40, 0x19, 0x07, 0xc0, 0x0f, 0x00, + 0x43, 0x08, 0x49, 0x2b, 0x69, 0x89, 0x60, 0x08, + 0x07, 0x00, 0x0f, 0xc0, 0x69, 0x38, 0x00, 0x80, + 0x49, 0x26, 0x58, 0x08, 0x49, 0x26, 0x69, 0x89, + 0x68, 0x09, 0x23, 0x30, 0x43, 0xdb, 0x40, 0x19, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x00, 0x43, 0x08, + 0x49, 0x21, 0x69, 0x89, 0x60, 0x08, 0x06, 0x80, + 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, 0x49, 0x1d, 0x58, 0x08, 0x23, 0x18, 0x40, 0x18, 0x08, 0xc0, - 0x49, 0x3a, 0x69, 0x89, 0x68, 0x09, 0x23, 0xc0, - 0x43, 0xdb, 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, - 0x01, 0x80, 0x43, 0x08, 0x49, 0x35, 0x69, 0x89, - 0x60, 0x08, 0x06, 0x00, 0x0f, 0x80, 0x69, 0x38, - 0x00, 0x80, 0x49, 0x31, 0x58, 0x08, 0x23, 0x04, - 0x40, 0x18, 0x08, 0x80, 0x49, 0x2f, 0x69, 0x89, - 0x68, 0x09, 0x23, 0x08, 0x43, 0xdb, 0x40, 0x19, - 0x07, 0xc0, 0x0f, 0x00, 0x43, 0x08, 0x49, 0x2b, - 0x69, 0x89, 0x60, 0x08, 0x07, 0x00, 0x0f, 0xc0, - 0x69, 0x38, 0x00, 0x80, 0x49, 0x26, 0x58, 0x08, - 0x49, 0x26, 0x69, 0x89, 0x68, 0x09, 0x23, 0x30, - 0x43, 0xdb, 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, - 0x01, 0x00, 0x43, 0x08, 0x49, 0x21, 0x69, 0x89, - 0x60, 0x08, 0x06, 0x80, 0x0f, 0x80, 0x69, 0x10, - 0x00, 0x80, 0x49, 0x1d, 0x58, 0x08, 0x23, 0x18, - 0x40, 0x18, 0x08, 0xc0, 0x49, 0x1b, 0x69, 0x89, - 0x68, 0x09, 0x4b, 0x1b, 0x40, 0x19, 0x07, 0x80, - 0x0f, 0x80, 0x02, 0xc0, 0x43, 0x08, 0x49, 0x17, - 0x69, 0x89, 0x60, 0x08, 0x04, 0xc0, 0x0f, 0x80, - 0x69, 0x10, 0x00, 0x80, 0x49, 0x12, 0x58, 0x08, - 0x23, 0x04, 0x40, 0x18, 0x08, 0x80, 0x49, 0x11, - 0x69, 0x89, 0x68, 0x09, 0x4b, 0x11, 0x40, 0x19, - 0x07, 0xc0, 0x0d, 0xc0, 0x43, 0x08, 0x49, 0x0d, - 0x69, 0x89, 0x60, 0x08, 0x05, 0xc0, 0x0f, 0xc0, - 0x69, 0x10, 0x00, 0x80, 0x49, 0x08, 0x58, 0x08, - 0x49, 0x08, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x0a, - 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0x40, - 0x43, 0x08, 0x49, 0x04, 0x69, 0x89, 0x60, 0x08, - 0x05, 0x40, 0x0f, 0x80, 0xbc, 0x80, 0x47, 0x70, - 0x2e, 0x03, 0x32, 0xa4, 0x2e, 0x08, 0x1f, 0xb0, - 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xfe, 0xff, - 0xff, 0xff, 0xf9, 0xff, 0xb4, 0xb0, 0x1c, 0x04, - 0x1c, 0x0f, 0x1c, 0x15, 0x2d, 0x00, 0xd0, 0x06, - 0x2d, 0x02, 0xd0, 0x21, 0x2d, 0x03, 0xd0, 0x02, - 0x2d, 0x04, 0xd0, 0x1d, 0xe0, 0xa3, 0x69, 0x20, - 0x28, 0x0b, 0xd2, 0x14, 0xa3, 0x01, 0x5c, 0x1b, - 0x00, 0x5b, 0x44, 0x9f, 0x05, 0x07, 0x09, 0x0b, - 0x05, 0x07, 0x09, 0x0b, 0x0d, 0x0e, 0x0e, 0x00, - 0x07, 0xff, 0xe0, 0x09, 0x07, 0xbf, 0xe0, 0x07, - 0x07, 0x3f, 0xe0, 0x05, 0x06, 0x3f, 0xe0, 0x03, - 0xe0, 0x02, 0x02, 0x3f, 0xe0, 0x00, 0xe7, 0xff, - 0x48, 0x46, 0x6a, 0x00, 0x60, 0x07, 0xe0, 0x86, - 0x69, 0x20, 0x28, 0x0b, 0xd2, 0x73, 0xa3, 0x02, - 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, - 0x06, 0x15, 0x24, 0x33, 0x06, 0x15, 0x24, 0x33, - 0x41, 0x45, 0x45, 0x00, 0x01, 0xff, 0x48, 0x3d, - 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x3c, 0x40, 0x18, + 0x49, 0x1b, 0x69, 0x89, 0x68, 0x09, 0x4b, 0x1b, + 0x40, 0x19, 0x07, 0x80, 0x0f, 0x80, 0x02, 0xc0, + 0x43, 0x08, 0x49, 0x17, 0x69, 0x89, 0x60, 0x08, + 0x04, 0xc0, 0x0f, 0x80, 0x69, 0x10, 0x00, 0x80, + 0x49, 0x12, 0x58, 0x08, 0x23, 0x04, 0x40, 0x18, + 0x08, 0x80, 0x49, 0x11, 0x69, 0x89, 0x68, 0x09, + 0x4b, 0x11, 0x40, 0x19, 0x07, 0xc0, 0x0d, 0xc0, + 0x43, 0x08, 0x49, 0x0d, 0x69, 0x89, 0x60, 0x08, + 0x05, 0xc0, 0x0f, 0xc0, 0x69, 0x10, 0x00, 0x80, + 0x49, 0x08, 0x58, 0x08, 0x49, 0x08, 0x69, 0x89, + 0x68, 0x09, 0x4b, 0x0a, 0x40, 0x19, 0x07, 0x80, + 0x0f, 0x80, 0x02, 0x40, 0x43, 0x08, 0x49, 0x04, + 0x69, 0x89, 0x60, 0x08, 0x05, 0x40, 0x0f, 0x80, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x03, 0x3a, 0x04, + 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xe7, 0xff, + 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xff, + 0xb4, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x15, + 0x2d, 0x00, 0xd0, 0x06, 0x2d, 0x02, 0xd0, 0x21, + 0x2d, 0x03, 0xd0, 0x02, 0x2d, 0x04, 0xd0, 0x1d, + 0xe0, 0xa3, 0x69, 0x20, 0x28, 0x0b, 0xd2, 0x14, + 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x05, 0x07, 0x09, 0x0b, 0x05, 0x07, 0x09, 0x0b, + 0x0d, 0x0e, 0x0e, 0x00, 0x07, 0xff, 0xe0, 0x09, + 0x07, 0xbf, 0xe0, 0x07, 0x07, 0x3f, 0xe0, 0x05, + 0x06, 0x3f, 0xe0, 0x03, 0xe0, 0x02, 0x02, 0x3f, + 0xe0, 0x00, 0xe7, 0xff, 0x48, 0x46, 0x6a, 0x00, + 0x60, 0x07, 0xe0, 0x86, 0x69, 0x20, 0x28, 0x0b, + 0xd2, 0x73, 0xa3, 0x02, 0x5c, 0x1b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x06, 0x15, 0x24, 0x33, + 0x06, 0x15, 0x24, 0x33, 0x41, 0x45, 0x45, 0x00, + 0x01, 0xff, 0x48, 0x3d, 0x6a, 0x40, 0x68, 0x00, + 0x4b, 0x3c, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x38, 0x6a, 0x49, + 0x60, 0x08, 0x05, 0x80, 0xe0, 0x69, 0x01, 0xbf, + 0x48, 0x35, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x35, + 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, + 0x43, 0x08, 0x49, 0x31, 0x6a, 0x49, 0x60, 0x08, + 0x05, 0x80, 0xe0, 0x5a, 0x01, 0x3f, 0x48, 0x2e, + 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x2d, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, - 0x49, 0x38, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, - 0xe0, 0x69, 0x01, 0xbf, 0x48, 0x35, 0x6a, 0x40, - 0x68, 0x00, 0x4b, 0x35, 0x40, 0x18, 0x06, 0x39, - 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, 0x49, 0x31, - 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, 0xe0, 0x5a, - 0x01, 0x3f, 0x48, 0x2e, 0x6a, 0x40, 0x68, 0x00, - 0x4b, 0x2d, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, - 0x00, 0x89, 0x43, 0x08, 0x49, 0x29, 0x6a, 0x49, - 0x60, 0x08, 0x05, 0x80, 0xe0, 0x4b, 0x48, 0x27, - 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x26, 0x40, 0x18, + 0x49, 0x29, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, + 0xe0, 0x4b, 0x48, 0x27, 0x6a, 0x40, 0x68, 0x00, + 0x4b, 0x26, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x22, 0x6a, 0x49, + 0x60, 0x08, 0x05, 0x80, 0xe0, 0x3d, 0x48, 0x20, + 0x6a, 0x00, 0x60, 0x07, 0xe0, 0x39, 0x48, 0x1e, + 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x1d, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, 0x00, 0x89, 0x43, 0x08, - 0x49, 0x22, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, - 0xe0, 0x3d, 0x48, 0x20, 0x6a, 0x00, 0x60, 0x07, - 0xe0, 0x39, 0x48, 0x1e, 0x6a, 0x40, 0x68, 0x00, - 0x4b, 0x1d, 0x40, 0x18, 0x06, 0x39, 0x0e, 0x09, - 0x00, 0x89, 0x43, 0x08, 0x49, 0x19, 0x6a, 0x49, - 0x60, 0x08, 0x05, 0x80, 0x48, 0x17, 0x6a, 0x40, - 0x68, 0x00, 0x4b, 0x18, 0x40, 0x18, 0x21, 0xff, - 0x02, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x08, - 0x49, 0x12, 0x6a, 0x49, 0x60, 0x08, 0x03, 0x80, - 0x48, 0x10, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x12, - 0x40, 0x18, 0x21, 0xff, 0x04, 0x09, 0x40, 0x39, - 0x00, 0x89, 0x43, 0x01, 0x48, 0x0b, 0x6a, 0x40, - 0x60, 0x01, 0x01, 0x88, 0xe0, 0x00, 0xe0, 0x0d, - 0x48, 0x08, 0x6a, 0x40, 0x68, 0x00, 0x01, 0x80, - 0x09, 0x80, 0x21, 0x3f, 0x06, 0x09, 0x40, 0x39, - 0x00, 0x89, 0x43, 0x08, 0x49, 0x03, 0x6a, 0x49, - 0x60, 0x08, 0xe0, 0x00, 0xe7, 0xff, 0xbc, 0xb0, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0xb0, - 0xff, 0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, - 0xfc, 0x03, 0xff, 0xff, 0xb4, 0x80, 0x1c, 0x07, - 0x1c, 0x0a, 0x69, 0x38, 0x28, 0x0b, 0xd2, 0x1a, - 0xa3, 0x01, 0x5c, 0x1b, 0x00, 0x5b, 0x44, 0x9f, - 0x05, 0x08, 0x0b, 0x0e, 0x05, 0x08, 0x0b, 0x0e, - 0x11, 0x13, 0x13, 0x00, 0x68, 0x10, 0x0f, 0xc1, - 0xe0, 0x0f, 0x68, 0x10, 0x0f, 0x81, 0xe0, 0x0c, - 0x68, 0x10, 0x0f, 0x01, 0xe0, 0x09, 0x68, 0x10, - 0x0e, 0x01, 0xe0, 0x06, 0x68, 0x11, 0xe0, 0x04, - 0x68, 0x10, 0x0a, 0x01, 0xe0, 0x01, 0x68, 0x11, - 0xe7, 0xff, 0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, - 0xe7, 0xfc, 0x48, 0x14, 0x69, 0x80, 0x68, 0x00, - 0x49, 0x12, 0x6a, 0x89, 0x60, 0x08, 0x48, 0x11, - 0x69, 0xc0, 0x68, 0x00, 0x49, 0x0f, 0x6a, 0xc9, - 0x60, 0x08, 0x48, 0x0e, 0x6a, 0x00, 0x68, 0x00, - 0x49, 0x0c, 0x6b, 0x09, 0x60, 0x08, 0x48, 0x0b, - 0x6a, 0x40, 0x68, 0x00, 0x49, 0x09, 0x6b, 0x49, - 0x60, 0x08, 0x20, 0x01, 0x49, 0x07, 0x6b, 0xc9, - 0x60, 0x08, 0x20, 0x00, 0x49, 0x06, 0x60, 0x08, - 0x20, 0x00, 0x49, 0x05, 0x60, 0x48, 0x20, 0x00, - 0x49, 0x03, 0x60, 0x88, 0x20, 0x00, 0x49, 0x02, - 0x60, 0xc8, 0x47, 0x70, 0x2e, 0x08, 0x1f, 0xb0, - 0x2e, 0x08, 0x1f, 0xb4, 0xb4, 0x90, 0x1c, 0x01, - 0x29, 0x00, 0xd1, 0x02, 0x20, 0x8d, 0xbc, 0x90, - 0x47, 0x70, 0x4c, 0x08, 0x1c, 0x0f, 0x22, 0x00, - 0x23, 0xff, 0x33, 0x01, 0x42, 0x9a, 0xd3, 0x02, - 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xf8, 0xcf, 0x08, - 0xc4, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0xee, - 0xe7, 0xed, 0x00, 0x00, 0x68, 0x00, 0x18, 0x00, - 0xb4, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x13, - 0x06, 0x1a, 0x0e, 0x12, 0x1c, 0x21, 0x60, 0x0f, - 0x71, 0x0a, 0x20, 0x00, 0xbc, 0x90, 0x47, 0x70, - 0xe7, 0xfc, 0x00, 0x00, 0xb5, 0x00, 0x48, 0x1d, - 0x69, 0x00, 0x23, 0x04, 0x40, 0x18, 0xd0, 0x19, - 0x48, 0x1a, 0x69, 0x00, 0x23, 0x02, 0x40, 0x18, - 0xd0, 0x09, 0x48, 0x18, 0x69, 0x40, 0x49, 0x18, - 0x68, 0x09, 0x60, 0x08, 0x20, 0x01, 0x49, 0x17, - 0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x00, - 0x49, 0x14, 0x68, 0x09, 0x70, 0x08, 0x48, 0x14, + 0x49, 0x19, 0x6a, 0x49, 0x60, 0x08, 0x05, 0x80, + 0x48, 0x17, 0x6a, 0x40, 0x68, 0x00, 0x4b, 0x18, + 0x40, 0x18, 0x21, 0xff, 0x02, 0x09, 0x40, 0x39, + 0x00, 0x89, 0x43, 0x08, 0x49, 0x12, 0x6a, 0x49, + 0x60, 0x08, 0x03, 0x80, 0x48, 0x10, 0x6a, 0x40, + 0x68, 0x00, 0x4b, 0x12, 0x40, 0x18, 0x21, 0xff, + 0x04, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x01, + 0x48, 0x0b, 0x6a, 0x40, 0x60, 0x01, 0x01, 0x88, + 0xe0, 0x00, 0xe0, 0x0d, 0x48, 0x08, 0x6a, 0x40, + 0x68, 0x00, 0x01, 0x80, 0x09, 0x80, 0x21, 0x3f, + 0x06, 0x09, 0x40, 0x39, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x03, 0x6a, 0x49, 0x60, 0x08, 0xe0, 0x00, + 0xe7, 0xff, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x1f, 0xa8, 0xff, 0xff, 0xfc, 0x03, + 0xff, 0xfc, 0x03, 0xff, 0xfc, 0x03, 0xff, 0xff, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x69, 0x38, + 0x28, 0x0b, 0xd2, 0x1a, 0xa3, 0x01, 0x5c, 0x1b, + 0x00, 0x5b, 0x44, 0x9f, 0x05, 0x08, 0x0b, 0x0e, + 0x05, 0x08, 0x0b, 0x0e, 0x11, 0x13, 0x13, 0x00, + 0x68, 0x10, 0x0f, 0xc1, 0xe0, 0x0f, 0x68, 0x10, + 0x0f, 0x81, 0xe0, 0x0c, 0x68, 0x10, 0x0f, 0x01, + 0xe0, 0x09, 0x68, 0x10, 0x0e, 0x01, 0xe0, 0x06, + 0x68, 0x11, 0xe0, 0x04, 0x68, 0x10, 0x0a, 0x01, + 0xe0, 0x01, 0x68, 0x11, 0xe7, 0xff, 0x1c, 0x08, + 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, 0x48, 0x14, + 0x69, 0x80, 0x68, 0x00, 0x49, 0x12, 0x6a, 0x89, + 0x60, 0x08, 0x48, 0x11, 0x69, 0xc0, 0x68, 0x00, + 0x49, 0x0f, 0x6a, 0xc9, 0x60, 0x08, 0x48, 0x0e, + 0x6a, 0x00, 0x68, 0x00, 0x49, 0x0c, 0x6b, 0x09, + 0x60, 0x08, 0x48, 0x0b, 0x6a, 0x40, 0x68, 0x00, + 0x49, 0x09, 0x6b, 0x49, 0x60, 0x08, 0x20, 0x01, + 0x49, 0x07, 0x6b, 0xc9, 0x60, 0x08, 0x20, 0x00, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0x49, 0x05, + 0x60, 0x48, 0x20, 0x00, 0x49, 0x03, 0x60, 0x88, + 0x20, 0x00, 0x49, 0x02, 0x60, 0xc8, 0x47, 0x70, + 0x2e, 0x08, 0x1f, 0xa8, 0x2e, 0x08, 0x1f, 0xac, + 0xb4, 0x90, 0x1c, 0x01, 0x29, 0x00, 0xd1, 0x02, + 0x20, 0x8d, 0xbc, 0x90, 0x47, 0x70, 0x4c, 0x08, + 0x1c, 0x0f, 0x22, 0x00, 0x23, 0xff, 0x33, 0x01, + 0x42, 0x9a, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, + 0xe7, 0xf8, 0xcf, 0x08, 0xc4, 0x08, 0xe7, 0xfa, + 0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, 0x00, 0x00, + 0x68, 0x00, 0x18, 0x00, 0xb4, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x13, 0x06, 0x1a, 0x0e, 0x12, + 0x1c, 0x21, 0x60, 0x0f, 0x71, 0x0a, 0x20, 0x00, + 0xbc, 0x90, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0xb5, 0x00, 0x48, 0x1d, 0x69, 0x00, 0x23, 0x04, + 0x40, 0x18, 0xd0, 0x19, 0x48, 0x1a, 0x69, 0x00, + 0x23, 0x02, 0x40, 0x18, 0xd0, 0x09, 0x48, 0x18, + 0x69, 0x40, 0x49, 0x18, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x17, 0x68, 0x09, 0x70, 0x08, + 0xe0, 0x03, 0x20, 0x00, 0x49, 0x14, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x14, 0x78, 0x01, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x07, 0xfb, 0x65, 0xe0, 0x18, + 0x48, 0x11, 0x6a, 0x80, 0x23, 0x02, 0x40, 0x18, + 0xd0, 0x13, 0x48, 0x0f, 0x6a, 0x80, 0x07, 0xc0, + 0x0f, 0xc0, 0xd0, 0x04, 0x20, 0xfe, 0x49, 0x0d, + 0x68, 0x09, 0x70, 0x08, 0xe0, 0x03, 0x20, 0x0e, + 0x49, 0x0a, 0x68, 0x09, 0x70, 0x08, 0x48, 0x0a, 0x78, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x07, - 0xfb, 0x43, 0xe0, 0x18, 0x48, 0x11, 0x6a, 0x80, - 0x23, 0x02, 0x40, 0x18, 0xd0, 0x13, 0x48, 0x0f, - 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x04, - 0x20, 0xfe, 0x49, 0x0d, 0x68, 0x09, 0x70, 0x08, - 0xe0, 0x03, 0x20, 0x0e, 0x49, 0x0a, 0x68, 0x09, - 0x70, 0x08, 0x48, 0x0a, 0x78, 0x01, 0x20, 0x01, - 0x40, 0x88, 0xf0, 0x07, 0xfb, 0x29, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x00, - 0x2e, 0x08, 0x7c, 0x34, 0x2e, 0x08, 0x7c, 0x38, - 0x2e, 0x08, 0x7c, 0x3c, 0x6e, 0x00, 0x0e, 0x00, - 0x2e, 0x08, 0x7c, 0x40, 0x2e, 0x08, 0x7c, 0x44, - 0xb5, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, - 0x06, 0x2e, 0x0e, 0x36, 0x2e, 0x1f, 0xdd, 0x03, - 0x20, 0xaf, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x49, 0x08, 0x20, 0x0d, 0xf0, 0x07, 0xfb, 0x1a, - 0x48, 0x07, 0x60, 0x04, 0x20, 0x00, 0x49, 0x06, - 0x68, 0x09, 0x70, 0x08, 0x48, 0x05, 0x60, 0x07, - 0x48, 0x05, 0x70, 0x06, 0x20, 0x00, 0xe7, 0xec, - 0xe7, 0xeb, 0x00, 0x00, 0x2e, 0x01, 0x4c, 0xd1, - 0x2e, 0x08, 0x7c, 0x38, 0x2e, 0x08, 0x7c, 0x34, - 0x2e, 0x08, 0x7c, 0x3c, 0xb5, 0xb0, 0x1c, 0x04, - 0x1c, 0x0f, 0x06, 0x25, 0x0e, 0x2d, 0x2d, 0x1f, - 0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x49, 0x07, 0x20, 0x0d, 0xf0, 0x07, - 0xfa, 0xf5, 0x48, 0x06, 0x60, 0x07, 0x20, 0x00, - 0x49, 0x04, 0x68, 0x09, 0x70, 0x08, 0x48, 0x04, - 0x70, 0x05, 0x20, 0x00, 0xe7, 0xee, 0xe7, 0xed, - 0x2e, 0x01, 0x4c, 0xd1, 0x2e, 0x08, 0x7c, 0x40, - 0x2e, 0x08, 0x7c, 0x44, 0xb4, 0xb0, 0x1c, 0x01, - 0x4a, 0x35, 0x23, 0x01, 0x60, 0x13, 0x4a, 0x35, - 0x1c, 0x0f, 0x68, 0x3d, 0xc2, 0x20, 0x88, 0x8d, - 0xc2, 0x20, 0x88, 0xcb, 0x60, 0x13, 0x68, 0x8c, - 0x2c, 0x00, 0xd0, 0x57, 0x4a, 0x30, 0x1c, 0x27, - 0x20, 0x00, 0x28, 0x13, 0xdb, 0x02, 0xe0, 0x04, - 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, - 0xe7, 0xfa, 0x4a, 0x2c, 0x1d, 0xe7, 0x37, 0x45, - 0x20, 0x00, 0x28, 0x0b, 0xdb, 0x02, 0xe0, 0x04, - 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, - 0xe7, 0xfa, 0x4a, 0x27, 0x1d, 0xe7, 0x37, 0x71, - 0x20, 0x00, 0x28, 0x07, 0xdb, 0x02, 0xe0, 0x04, - 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, - 0xe7, 0xfa, 0x4a, 0x22, 0x1d, 0xe7, 0x37, 0x8d, - 0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, - 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, - 0xe7, 0xfa, 0x4a, 0x1d, 0x1d, 0xe7, 0x37, 0xb1, - 0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, - 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, - 0xe7, 0xfa, 0x68, 0x0d, 0x23, 0x01, 0x02, 0x9b, - 0x40, 0x2b, 0xd0, 0x17, 0x4a, 0x15, 0x1d, 0xe7, - 0x37, 0xd5, 0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, - 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, - 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x10, 0x1d, 0xe7, - 0x37, 0xf9, 0x20, 0x00, 0x28, 0x09, 0xdb, 0x02, - 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, 0xcf, 0x20, - 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x02, 0x23, 0x00, - 0x60, 0x13, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, - 0x6e, 0x00, 0x0c, 0x0c, 0x6e, 0x00, 0x0c, 0x00, - 0x6e, 0x00, 0x08, 0x00, 0x6e, 0x00, 0x08, 0x50, - 0x6e, 0x00, 0x08, 0x80, 0x6e, 0x00, 0x08, 0xa0, - 0x6e, 0x00, 0x08, 0xd0, 0x6e, 0x00, 0x09, 0x00, - 0x6e, 0x00, 0x09, 0x30, 0xb4, 0xf0, 0x1c, 0x01, - 0x69, 0x08, 0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x01, - 0xdb, 0x04, 0x69, 0x08, 0x06, 0xc0, 0x0e, 0xc0, - 0x28, 0x0a, 0xdd, 0x02, 0x20, 0xc3, 0xbc, 0xf0, - 0x47, 0x70, 0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, - 0x28, 0x01, 0xdb, 0x04, 0x69, 0x08, 0x05, 0x80, - 0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x01, 0x20, 0xc4, - 0xe7, 0xf1, 0x48, 0x4f, 0x6a, 0x80, 0x07, 0xc0, - 0x0f, 0xc0, 0xd1, 0x01, 0x20, 0xc0, 0xe7, 0xea, - 0x68, 0x08, 0x07, 0x00, 0x0f, 0xc0, 0x4b, 0x4b, - 0x70, 0x18, 0x4f, 0x49, 0x1c, 0x0c, 0x22, 0x00, - 0x2a, 0x04, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, - 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, - 0x4f, 0x45, 0x69, 0x08, 0x06, 0xc0, 0x0e, 0xc0, - 0x00, 0x43, 0x18, 0x18, 0x38, 0x03, 0x69, 0x0b, - 0x05, 0x9b, 0x0e, 0xde, 0x00, 0x73, 0x19, 0x9b, - 0x3b, 0x03, 0x01, 0x5b, 0x43, 0x18, 0x60, 0x38, - 0x4f, 0x3e, 0x69, 0x48, 0x60, 0x38, 0x4f, 0x3e, - 0x69, 0x88, 0x05, 0x40, 0x0d, 0x40, 0x69, 0x8b, - 0x02, 0x9b, 0x0d, 0x5b, 0x02, 0xdb, 0x43, 0x18, - 0x60, 0x38, 0x69, 0xcd, 0x2d, 0x00, 0xd0, 0x63, - 0x4f, 0x38, 0x1c, 0x2c, 0x22, 0x00, 0x2a, 0x09, - 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, - 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x34, - 0x1d, 0xec, 0x34, 0x1d, 0x22, 0x00, 0x2a, 0x09, - 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, - 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x2f, - 0x1d, 0xec, 0x34, 0x41, 0x22, 0x00, 0x2a, 0x09, - 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, - 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x2a, - 0x1d, 0xec, 0x34, 0x65, 0x22, 0x00, 0x2a, 0x09, - 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, - 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x25, - 0x1d, 0xec, 0x34, 0x89, 0x22, 0x00, 0x2a, 0x05, - 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, - 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x20, - 0x1d, 0xec, 0x34, 0x9d, 0x22, 0x00, 0x2a, 0x05, - 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, - 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, 0x68, 0x08, - 0x23, 0x01, 0x02, 0x9b, 0x40, 0x18, 0xd0, 0x17, - 0x4f, 0x18, 0x1d, 0xec, 0x34, 0xb1, 0x22, 0x00, - 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, - 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, - 0x4f, 0x13, 0x1d, 0xec, 0x34, 0xc5, 0x22, 0x00, - 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, 0x32, 0x01, - 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, 0xe7, 0xfa, - 0x20, 0x00, 0xe7, 0x54, 0xe7, 0x53, 0x00, 0x00, - 0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0x7c, 0x45, - 0x6e, 0x00, 0x0e, 0x10, 0x6e, 0x00, 0x0e, 0x14, - 0x6e, 0x00, 0x0e, 0x18, 0x6e, 0x00, 0x0a, 0x00, - 0x6e, 0x00, 0x0a, 0x24, 0x6e, 0x00, 0x0a, 0x48, - 0x6e, 0x00, 0x0a, 0x90, 0x6e, 0x00, 0x0a, 0xc0, - 0x6e, 0x00, 0x0a, 0xe4, 0x6e, 0x00, 0x09, 0xc0, - 0x6e, 0x00, 0x09, 0xe4, 0x1c, 0x01, 0x48, 0x0c, - 0x78, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, - 0x47, 0x70, 0x48, 0x0a, 0x6a, 0x80, 0x07, 0xc0, - 0x0f, 0xc0, 0xd1, 0x01, 0x20, 0xc0, 0xe7, 0xf7, - 0x20, 0x00, 0x4b, 0x06, 0x61, 0x58, 0x4a, 0x06, - 0x68, 0x08, 0x60, 0x10, 0x4a, 0x05, 0x68, 0x48, - 0x60, 0x10, 0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, - 0x2e, 0x08, 0x7c, 0x45, 0x6e, 0x00, 0x0e, 0x00, - 0x6e, 0x00, 0x0e, 0x20, 0x6e, 0x00, 0x0e, 0x24, - 0x48, 0x09, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x01, - 0x20, 0xc1, 0x47, 0x70, 0x48, 0x07, 0x6a, 0x80, - 0x07, 0xc0, 0x0f, 0xc0, 0xd0, 0x01, 0x20, 0xc2, - 0xe7, 0xf7, 0x20, 0x01, 0x49, 0x03, 0x61, 0x48, - 0x20, 0x00, 0xe7, 0xf2, 0xe7, 0xf1, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0x45, 0x6e, 0x00, 0x0e, 0x00, - 0xb5, 0xff, 0x1c, 0x04, 0x1c, 0x0d, 0x1c, 0x17, - 0x9e, 0x09, 0x20, 0x00, 0x60, 0x30, 0x48, 0x13, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x07, 0x9b, 0x03, - 0x2b, 0x00, 0xd1, 0x04, 0x20, 0x8a, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x23, 0xff, - 0x33, 0x01, 0x42, 0x9c, 0xdd, 0x01, 0x20, 0x87, - 0xe7, 0xf5, 0x19, 0x28, 0x23, 0xff, 0x33, 0x01, - 0x42, 0x98, 0xd9, 0x01, 0x20, 0x88, 0xe7, 0xee, - 0x68, 0x79, 0x1c, 0x20, 0x80, 0x48, 0x70, 0x0d, - 0x9b, 0x03, 0x60, 0x4b, 0x68, 0x78, 0x60, 0xc8, - 0x68, 0x38, 0x60, 0x88, 0x60, 0x31, 0x20, 0x00, - 0xe7, 0xe1, 0xe7, 0xe0, 0x2e, 0x08, 0x60, 0x8c, - 0x1c, 0x03, 0x1c, 0x0a, 0x1c, 0x19, 0x68, 0xc8, - 0x60, 0x50, 0x68, 0x88, 0x60, 0x10, 0x20, 0x00, - 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0xb0, 0x87, - 0x21, 0x00, 0x91, 0x06, 0x26, 0x00, 0x98, 0x07, - 0xf0, 0x00, 0xfa, 0xcb, 0x90, 0x03, 0x9c, 0x07, - 0x9d, 0x08, 0x88, 0x69, 0x91, 0x04, 0x98, 0x03, - 0x99, 0x04, 0x42, 0x88, 0xd0, 0x09, 0x48, 0xbb, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x05, 0x20, 0xff, - 0xb0, 0x07, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x78, 0x28, 0x90, 0x05, 0x99, 0x04, - 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xdd, 0x02, - 0x20, 0xff, 0xb0, 0x07, 0xe7, 0xf1, 0x98, 0x05, - 0x99, 0x04, 0x18, 0x40, 0x23, 0xff, 0x33, 0x01, - 0x42, 0x98, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07, - 0xe7, 0xe7, 0x48, 0xad, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x0a, 0x68, 0xa0, 0x23, 0x01, 0x06, 0x1b, - 0x40, 0x18, 0xd0, 0x05, 0x68, 0x68, 0x28, 0x00, - 0xd1, 0x02, 0x20, 0x8a, 0xb0, 0x07, 0xe7, 0xd8, - 0x62, 0x65, 0x69, 0x60, 0x4b, 0xa5, 0x40, 0x18, - 0x99, 0x05, 0x06, 0x09, 0x0e, 0x09, 0x04, 0x09, - 0x43, 0x08, 0x61, 0x60, 0x02, 0x00, 0x68, 0xe0, - 0x90, 0x00, 0x48, 0x9e, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x06, 0x98, 0x00, 0x28, 0x19, 0xd3, 0x01, - 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, 0xe0, 0x05, - 0x98, 0x00, 0x28, 0x08, 0xd3, 0x01, 0x20, 0x01, - 0xe0, 0x00, 0x20, 0x00, 0x28, 0x00, 0xd0, 0x02, - 0x20, 0x00, 0xb0, 0x07, 0xe7, 0xb5, 0x48, 0x94, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x1e, 0x48, 0x91, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x1a, 0x68, 0xa0, - 0x02, 0x00, 0x0e, 0x00, 0x06, 0x01, 0x0e, 0x09, - 0x91, 0x06, 0x99, 0x04, 0x29, 0x04, 0xd0, 0x06, - 0x29, 0x10, 0xd0, 0x07, 0x23, 0xff, 0x33, 0x01, - 0x42, 0x99, 0xd0, 0x06, 0xe0, 0x08, 0x26, 0xff, - 0x36, 0x01, 0xe0, 0x07, 0x26, 0x01, 0x02, 0x76, - 0xe0, 0x04, 0x26, 0x03, 0x02, 0x36, 0xe0, 0x01, - 0x26, 0x00, 0xe7, 0xff, 0x49, 0x84, 0x20, 0x91, - 0xf0, 0x0f, 0xff, 0xa8, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x01, 0xff, 0xb1, 0xe7, 0xf5, - 0x98, 0x00, 0x00, 0x80, 0x49, 0x7f, 0x58, 0x08, - 0x99, 0x07, 0x42, 0x88, 0xd0, 0x05, 0x20, 0x92, - 0x49, 0x7b, 0x60, 0x08, 0x20, 0xff, 0xb0, 0x07, - 0xe7, 0x7b, 0x48, 0x77, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x73, 0x48, 0x74, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x6f, 0x98, 0x00, 0xf0, 0x02, 0xfe, 0xd6, - 0x28, 0x00, 0xd0, 0x6a, 0xb0, 0x82, 0x49, 0x74, - 0x20, 0x91, 0xf0, 0x0f, 0xff, 0x83, 0x28, 0x92, - 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02, 0xff, 0x25, - 0x20, 0x92, 0x49, 0x6f, 0x60, 0x08, 0x20, 0x01, - 0x49, 0x6e, 0x68, 0x09, 0x60, 0x08, 0x27, 0x00, - 0x20, 0x00, 0x90, 0x00, 0x98, 0x00, 0x28, 0x00, - 0xd1, 0x15, 0x2f, 0x07, 0xd2, 0x13, 0x6a, 0xe0, - 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, - 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x65, - 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, - 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x01, - 0x20, 0x01, 0x90, 0x00, 0xe7, 0xe6, 0x98, 0x00, - 0x28, 0x00, 0xd1, 0x14, 0x2f, 0x18, 0xd2, 0x12, - 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, - 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x59, - 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, 0xd1, 0x01, - 0x20, 0x01, 0x90, 0x00, 0xe7, 0xe7, 0x3f, 0x01, - 0x2f, 0x07, 0xd2, 0x10, 0x00, 0xb8, 0x19, 0xc0, - 0x00, 0xc0, 0x49, 0x50, 0x68, 0x09, 0x18, 0x40, - 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, 0x1c, 0x21, - 0xf0, 0x02, 0xfb, 0x38, 0x48, 0x4b, 0x68, 0x00, - 0xf0, 0x02, 0xfe, 0xee, 0xe0, 0x46, 0x2f, 0x18, - 0xd2, 0x44, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x47, - 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x0a, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x26, - 0x20, 0x4c, 0x43, 0x78, 0x49, 0x41, 0x68, 0x09, - 0xe0, 0x00, 0xe0, 0x48, 0x18, 0x40, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x82, 0x6f, 0xc0, 0x28, 0x00, - 0xd0, 0x17, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x3b, - 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, - 0xd0, 0x0b, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x35, - 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x02, 0x68, 0x00, 0x0c, 0x00, 0x04, 0x00, - 0xd1, 0x0a, 0x20, 0x02, 0x21, 0x4c, 0x43, 0x79, - 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, - 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, 0xe0, 0x09, - 0x20, 0x03, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x29, - 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, - 0x39, 0x82, 0x67, 0x48, 0x49, 0x24, 0x20, 0x91, - 0xf0, 0x0f, 0xfe, 0xe4, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0x48, 0x22, 0x68, 0x00, 0x90, 0x01, - 0x48, 0x21, 0x68, 0x00, 0x49, 0x1f, 0x60, 0x08, - 0x98, 0x01, 0x49, 0x1f, 0x60, 0x08, 0x20, 0x92, - 0x49, 0x1b, 0x60, 0x08, 0xb0, 0x02, 0x48, 0x15, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x1d, 0x98, 0x00, - 0x01, 0x00, 0x4b, 0x1a, 0x18, 0xc1, 0x91, 0x01, - 0x1d, 0xe0, 0x30, 0x0d, 0x90, 0x02, 0x98, 0x02, - 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x48, 0x0e, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0d, 0x68, 0x68, - 0x08, 0x80, 0x99, 0x06, 0x00, 0x89, 0x4b, 0x12, - 0x18, 0xc9, 0x67, 0x08, 0x98, 0x05, 0x43, 0x30, - 0x99, 0x06, 0x00, 0x89, 0x4b, 0x0f, 0x18, 0xc9, - 0x61, 0x08, 0x20, 0x92, 0x49, 0x06, 0x60, 0x08, - 0x20, 0x00, 0xb0, 0x07, 0xe6, 0x91, 0xb0, 0x07, - 0xe6, 0x8f, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x60, 0x8c, 0xff, 0x00, 0xff, 0xff, - 0x2e, 0x08, 0x7c, 0xc8, 0x2e, 0x08, 0x7c, 0x60, - 0x2e, 0x08, 0x94, 0x90, 0x2e, 0x08, 0x7d, 0xbc, - 0x2e, 0x08, 0x7d, 0xc0, 0x68, 0x00, 0x0c, 0x00, - 0x68, 0x00, 0x0e, 0x00, 0x68, 0x00, 0x0e, 0x80, - 0x1c, 0x01, 0x1c, 0x0a, 0x6a, 0x53, 0x1c, 0x18, - 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, - 0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, - 0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, - 0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01, - 0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, - 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee, - 0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, - 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, - 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x0f, 0xfe, 0x66, + 0xfb, 0x4b, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x6e, 0x00, 0x0c, 0x00, 0x2e, 0x08, 0x7c, 0x2c, + 0x2e, 0x08, 0x7c, 0x30, 0x2e, 0x08, 0x7c, 0x34, + 0x6e, 0x00, 0x0e, 0x00, 0x2e, 0x08, 0x7c, 0x38, + 0x2e, 0x08, 0x7c, 0x3c, 0xb5, 0xf0, 0x1c, 0x05, + 0x1c, 0x0c, 0x1c, 0x17, 0x06, 0x2e, 0x0e, 0x36, + 0x2e, 0x1f, 0xdd, 0x03, 0x20, 0xaf, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x49, 0x08, 0x20, 0x0d, + 0xf0, 0x07, 0xfb, 0x3c, 0x48, 0x07, 0x60, 0x04, + 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x70, 0x08, + 0x48, 0x05, 0x60, 0x07, 0x48, 0x05, 0x70, 0x06, + 0x20, 0x00, 0xe7, 0xec, 0xe7, 0xeb, 0x00, 0x00, + 0x2e, 0x01, 0x53, 0xed, 0x2e, 0x08, 0x7c, 0x30, + 0x2e, 0x08, 0x7c, 0x2c, 0x2e, 0x08, 0x7c, 0x34, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x2d, 0x1f, 0xdd, 0x03, 0x20, 0xaf, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x07, + 0x20, 0x0d, 0xf0, 0x07, 0xfb, 0x17, 0x48, 0x06, + 0x60, 0x07, 0x20, 0x00, 0x49, 0x04, 0x68, 0x09, + 0x70, 0x08, 0x48, 0x04, 0x70, 0x05, 0x20, 0x00, + 0xe7, 0xee, 0xe7, 0xed, 0x2e, 0x01, 0x53, 0xed, + 0x2e, 0x08, 0x7c, 0x38, 0x2e, 0x08, 0x7c, 0x3c, + 0xb4, 0xb0, 0x1c, 0x01, 0x4a, 0x35, 0x23, 0x01, + 0x60, 0x13, 0x4a, 0x35, 0x1c, 0x0f, 0x68, 0x3d, + 0xc2, 0x20, 0x88, 0x8d, 0xc2, 0x20, 0x88, 0xcb, + 0x60, 0x13, 0x68, 0x8c, 0x2c, 0x00, 0xd0, 0x57, + 0x4a, 0x30, 0x1c, 0x27, 0x20, 0x00, 0x28, 0x13, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x2c, + 0x1d, 0xe7, 0x37, 0x45, 0x20, 0x00, 0x28, 0x0b, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x27, + 0x1d, 0xe7, 0x37, 0x71, 0x20, 0x00, 0x28, 0x07, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x22, + 0x1d, 0xe7, 0x37, 0x8d, 0x20, 0x00, 0x28, 0x09, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x4a, 0x1d, + 0x1d, 0xe7, 0x37, 0xb1, 0x20, 0x00, 0x28, 0x09, + 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, 0xe7, 0xfa, + 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, 0x68, 0x0d, + 0x23, 0x01, 0x02, 0x9b, 0x40, 0x2b, 0xd0, 0x17, + 0x4a, 0x15, 0x1d, 0xe7, 0x37, 0xd5, 0x20, 0x00, + 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, + 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, + 0x4a, 0x10, 0x1d, 0xe7, 0x37, 0xf9, 0x20, 0x00, + 0x28, 0x09, 0xdb, 0x02, 0xe0, 0x04, 0x30, 0x01, + 0xe7, 0xfa, 0xcf, 0x20, 0xc2, 0x20, 0xe7, 0xfa, + 0x4a, 0x02, 0x23, 0x00, 0x60, 0x13, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x6e, 0x00, 0x0c, 0x0c, + 0x6e, 0x00, 0x0c, 0x00, 0x6e, 0x00, 0x08, 0x00, + 0x6e, 0x00, 0x08, 0x50, 0x6e, 0x00, 0x08, 0x80, + 0x6e, 0x00, 0x08, 0xa0, 0x6e, 0x00, 0x08, 0xd0, + 0x6e, 0x00, 0x09, 0x00, 0x6e, 0x00, 0x09, 0x30, + 0xb4, 0xf0, 0x1c, 0x01, 0x69, 0x08, 0x06, 0xc0, + 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, 0x69, 0x08, + 0x06, 0xc0, 0x0e, 0xc0, 0x28, 0x0a, 0xdd, 0x02, + 0x20, 0xc3, 0xbc, 0xf0, 0x47, 0x70, 0x69, 0x08, + 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x01, 0xdb, 0x04, + 0x69, 0x08, 0x05, 0x80, 0x0e, 0xc0, 0x28, 0x0a, + 0xdd, 0x01, 0x20, 0xc4, 0xe7, 0xf1, 0x48, 0x4f, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, + 0x20, 0xc0, 0xe7, 0xea, 0x68, 0x08, 0x07, 0x00, + 0x0f, 0xc0, 0x4b, 0x4b, 0x70, 0x18, 0x4f, 0x49, + 0x1c, 0x0c, 0x22, 0x00, 0x2a, 0x04, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x45, 0x69, 0x08, + 0x06, 0xc0, 0x0e, 0xc0, 0x00, 0x43, 0x18, 0x18, + 0x38, 0x03, 0x69, 0x0b, 0x05, 0x9b, 0x0e, 0xde, + 0x00, 0x73, 0x19, 0x9b, 0x3b, 0x03, 0x01, 0x5b, + 0x43, 0x18, 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x48, + 0x60, 0x38, 0x4f, 0x3e, 0x69, 0x88, 0x05, 0x40, + 0x0d, 0x40, 0x69, 0x8b, 0x02, 0x9b, 0x0d, 0x5b, + 0x02, 0xdb, 0x43, 0x18, 0x60, 0x38, 0x69, 0xcd, + 0x2d, 0x00, 0xd0, 0x63, 0x4f, 0x38, 0x1c, 0x2c, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x34, 0x1d, 0xec, 0x34, 0x1d, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x2f, 0x1d, 0xec, 0x34, 0x41, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x2a, 0x1d, 0xec, 0x34, 0x65, + 0x22, 0x00, 0x2a, 0x09, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x25, 0x1d, 0xec, 0x34, 0x89, + 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x4f, 0x20, 0x1d, 0xec, 0x34, 0x9d, + 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, 0xe0, 0x04, + 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, 0xc7, 0x08, + 0xe7, 0xfa, 0x68, 0x08, 0x23, 0x01, 0x02, 0x9b, + 0x40, 0x18, 0xd0, 0x17, 0x4f, 0x18, 0x1d, 0xec, + 0x34, 0xb1, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x4f, 0x13, 0x1d, 0xec, + 0x34, 0xc5, 0x22, 0x00, 0x2a, 0x05, 0xd3, 0x02, + 0xe0, 0x04, 0x32, 0x01, 0xe7, 0xfa, 0xcc, 0x08, + 0xc7, 0x08, 0xe7, 0xfa, 0x20, 0x00, 0xe7, 0x54, + 0xe7, 0x53, 0x00, 0x00, 0x6e, 0x00, 0x0e, 0x00, + 0x2e, 0x08, 0x7c, 0x3d, 0x6e, 0x00, 0x0e, 0x10, + 0x6e, 0x00, 0x0e, 0x14, 0x6e, 0x00, 0x0e, 0x18, + 0x6e, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x0a, 0x24, + 0x6e, 0x00, 0x0a, 0x48, 0x6e, 0x00, 0x0a, 0x90, + 0x6e, 0x00, 0x0a, 0xc0, 0x6e, 0x00, 0x0a, 0xe4, + 0x6e, 0x00, 0x09, 0xc0, 0x6e, 0x00, 0x09, 0xe4, + 0x1c, 0x01, 0x48, 0x0c, 0x78, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, 0x48, 0x0a, + 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, 0xd1, 0x01, + 0x20, 0xc0, 0xe7, 0xf7, 0x20, 0x00, 0x4b, 0x06, + 0x61, 0x58, 0x4a, 0x06, 0x68, 0x08, 0x60, 0x10, + 0x4a, 0x05, 0x68, 0x48, 0x60, 0x10, 0x20, 0x00, + 0xe7, 0xec, 0xe7, 0xeb, 0x2e, 0x08, 0x7c, 0x3d, + 0x6e, 0x00, 0x0e, 0x00, 0x6e, 0x00, 0x0e, 0x20, + 0x6e, 0x00, 0x0e, 0x24, 0x48, 0x09, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xc1, 0x47, 0x70, + 0x48, 0x07, 0x6a, 0x80, 0x07, 0xc0, 0x0f, 0xc0, + 0xd0, 0x01, 0x20, 0xc2, 0xe7, 0xf7, 0x20, 0x01, + 0x49, 0x03, 0x61, 0x48, 0x20, 0x00, 0xe7, 0xf2, + 0xe7, 0xf1, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x3d, + 0x6e, 0x00, 0x0e, 0x00, 0xb5, 0xff, 0x1c, 0x04, + 0x1c, 0x0d, 0x1c, 0x17, 0x9e, 0x09, 0x20, 0x00, + 0x60, 0x30, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x07, 0x9b, 0x03, 0x2b, 0x00, 0xd1, 0x04, + 0x20, 0x8a, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, + 0xdd, 0x01, 0x20, 0x87, 0xe7, 0xf5, 0x19, 0x28, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xd9, 0x01, + 0x20, 0x88, 0xe7, 0xee, 0x68, 0x79, 0x1c, 0x20, + 0x80, 0x48, 0x70, 0x0d, 0x9b, 0x03, 0x60, 0x4b, + 0x68, 0x78, 0x60, 0xc8, 0x68, 0x38, 0x60, 0x88, + 0x60, 0x31, 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, + 0x2e, 0x08, 0x60, 0x84, 0x1c, 0x03, 0x1c, 0x0a, + 0x1c, 0x19, 0x68, 0xc8, 0x60, 0x50, 0x68, 0x88, + 0x60, 0x10, 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, + 0xb5, 0xf3, 0xb0, 0x87, 0x21, 0x00, 0x91, 0x06, + 0x26, 0x00, 0x98, 0x07, 0xf0, 0x00, 0xfa, 0xcb, + 0x90, 0x03, 0x9c, 0x07, 0x9d, 0x08, 0x88, 0x69, + 0x91, 0x04, 0x98, 0x03, 0x99, 0x04, 0x42, 0x88, + 0xd0, 0x09, 0x48, 0xbb, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x05, 0x20, 0xff, 0xb0, 0x07, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x28, + 0x90, 0x05, 0x99, 0x04, 0x23, 0xff, 0x33, 0x01, + 0x42, 0x99, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x07, + 0xe7, 0xf1, 0x98, 0x05, 0x99, 0x04, 0x18, 0x40, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, + 0x20, 0xff, 0xb0, 0x07, 0xe7, 0xe7, 0x48, 0xad, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, 0x68, 0xa0, + 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, 0xd0, 0x05, + 0x68, 0x68, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8a, + 0xb0, 0x07, 0xe7, 0xd8, 0x62, 0x65, 0x69, 0x60, + 0x4b, 0xa5, 0x40, 0x18, 0x99, 0x05, 0x06, 0x09, + 0x0e, 0x09, 0x04, 0x09, 0x43, 0x08, 0x61, 0x60, + 0x02, 0x00, 0x68, 0xe0, 0x90, 0x00, 0x48, 0x9e, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x06, 0x98, 0x00, + 0x28, 0x19, 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, + 0x20, 0x00, 0xe0, 0x05, 0x98, 0x00, 0x28, 0x08, + 0xd3, 0x01, 0x20, 0x01, 0xe0, 0x00, 0x20, 0x00, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x00, 0xb0, 0x07, + 0xe7, 0xb5, 0x48, 0x94, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x1e, 0x48, 0x91, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x1a, 0x68, 0xa0, 0x02, 0x00, 0x0e, 0x00, + 0x06, 0x01, 0x0e, 0x09, 0x91, 0x06, 0x99, 0x04, + 0x29, 0x04, 0xd0, 0x06, 0x29, 0x10, 0xd0, 0x07, + 0x23, 0xff, 0x33, 0x01, 0x42, 0x99, 0xd0, 0x06, + 0xe0, 0x08, 0x26, 0xff, 0x36, 0x01, 0xe0, 0x07, + 0x26, 0x01, 0x02, 0x76, 0xe0, 0x04, 0x26, 0x03, + 0x02, 0x36, 0xe0, 0x01, 0x26, 0x00, 0xe7, 0xff, + 0x49, 0x84, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0xca, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, - 0xfe, 0x6f, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, - 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, - 0x35, 0x01, 0xe7, 0xfa, 0xcf, 0x01, 0x19, 0x71, - 0x00, 0x89, 0x4b, 0x13, 0x18, 0xc9, 0x60, 0x08, - 0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, - 0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, - 0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc1, 0x9a, 0x00, - 0x1c, 0x38, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0xfe, - 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, - 0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, - 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, - 0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x7c, 0xcc, - 0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0xd0, 0x21, 0x04, 0xe0, 0x00, - 0x31, 0x01, 0x1c, 0x08, 0x47, 0x70, 0xe7, 0xfd, + 0xff, 0xb1, 0xe7, 0xf5, 0x98, 0x00, 0x00, 0x80, + 0x49, 0x7f, 0x58, 0x08, 0x99, 0x07, 0x42, 0x88, + 0xd0, 0x05, 0x20, 0x92, 0x49, 0x7b, 0x60, 0x08, + 0x20, 0xff, 0xb0, 0x07, 0xe7, 0x7b, 0x48, 0x77, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x73, 0x48, 0x74, + 0x68, 0x00, 0x28, 0x00, 0xd0, 0x6f, 0x98, 0x00, + 0xf0, 0x02, 0xfe, 0xd6, 0x28, 0x00, 0xd0, 0x6a, + 0xb0, 0x82, 0x49, 0x74, 0x20, 0x91, 0xf0, 0x0f, + 0xff, 0xa5, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0xf0, 0x02, 0xff, 0x25, 0x20, 0x92, 0x49, 0x6f, + 0x60, 0x08, 0x20, 0x01, 0x49, 0x6e, 0x68, 0x09, + 0x60, 0x08, 0x27, 0x00, 0x20, 0x00, 0x90, 0x00, + 0x98, 0x00, 0x28, 0x00, 0xd1, 0x15, 0x2f, 0x07, + 0xd2, 0x13, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, + 0x00, 0xc0, 0x4a, 0x65, 0x68, 0x12, 0x18, 0x80, + 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, + 0xe7, 0xe6, 0x98, 0x00, 0x28, 0x00, 0xd1, 0x14, + 0x2f, 0x18, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, + 0x43, 0x58, 0x4a, 0x59, 0x68, 0x12, 0x18, 0x80, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, + 0x42, 0x81, 0xd1, 0x01, 0x20, 0x01, 0x90, 0x00, + 0xe7, 0xe7, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x10, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x50, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc0, 0x1c, 0x21, 0xf0, 0x02, 0xfb, 0x38, + 0x48, 0x4b, 0x68, 0x00, 0xf0, 0x02, 0xfe, 0xee, + 0xe0, 0x46, 0x2f, 0x18, 0xd2, 0x44, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x47, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x0a, 0x1c, 0x21, + 0xf0, 0x02, 0xfb, 0x26, 0x20, 0x4c, 0x43, 0x78, + 0x49, 0x41, 0x68, 0x09, 0xe0, 0x00, 0xe0, 0x48, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x82, + 0x6f, 0xc0, 0x28, 0x00, 0xd0, 0x17, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x3b, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, + 0x04, 0x00, 0x0c, 0x00, 0xd0, 0x0b, 0x20, 0x4c, + 0x43, 0x78, 0x49, 0x35, 0x68, 0x09, 0x18, 0x40, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, + 0x0c, 0x00, 0x04, 0x00, 0xd1, 0x0a, 0x20, 0x02, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, + 0x67, 0x48, 0xe0, 0x09, 0x20, 0x03, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x29, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x82, 0x67, 0x48, + 0x49, 0x24, 0x20, 0x91, 0xf0, 0x0f, 0xff, 0x06, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x22, + 0x68, 0x00, 0x90, 0x01, 0x48, 0x21, 0x68, 0x00, + 0x49, 0x1f, 0x60, 0x08, 0x98, 0x01, 0x49, 0x1f, + 0x60, 0x08, 0x20, 0x92, 0x49, 0x1b, 0x60, 0x08, + 0xb0, 0x02, 0x48, 0x15, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x1d, 0x98, 0x00, 0x01, 0x00, 0x4b, 0x1a, + 0x18, 0xc1, 0x91, 0x01, 0x1d, 0xe0, 0x30, 0x0d, + 0x90, 0x02, 0x98, 0x02, 0x68, 0x00, 0x99, 0x01, + 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x0d, 0x68, 0x68, 0x08, 0x80, 0x99, 0x06, + 0x00, 0x89, 0x4b, 0x12, 0x18, 0xc9, 0x67, 0x08, + 0x98, 0x05, 0x43, 0x30, 0x99, 0x06, 0x00, 0x89, + 0x4b, 0x0f, 0x18, 0xc9, 0x61, 0x08, 0x20, 0x92, + 0x49, 0x06, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x07, + 0xe6, 0x91, 0xb0, 0x07, 0xe6, 0x8f, 0x00, 0x00, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x60, 0x84, + 0xff, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x7c, 0xc0, + 0x2e, 0x08, 0x7c, 0x58, 0x2e, 0x08, 0x94, 0x88, + 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8, + 0x68, 0x00, 0x0c, 0x00, 0x68, 0x00, 0x0e, 0x00, + 0x68, 0x00, 0x0e, 0x80, 0x1c, 0x01, 0x1c, 0x0a, + 0x6a, 0x53, 0x1c, 0x18, 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, @@ -10854,1550 +11055,1558 @@ 0xb0, 0x02, 0xe7, 0xee, 0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, 0x49, 0x1c, 0x20, 0x91, - 0xf0, 0x0f, 0xfd, 0xfc, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x01, 0xfe, 0x05, 0xe7, 0xf5, + 0xf0, 0x0f, 0xfe, 0x88, 0x28, 0x92, 0xd0, 0x03, + 0x20, 0x01, 0xf0, 0x01, 0xfe, 0x6f, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, 0x35, 0x01, 0xe7, 0xfa, - 0x19, 0x70, 0x00, 0x80, 0x4b, 0x13, 0x18, 0xc0, - 0x68, 0x01, 0xc7, 0x02, 0xe7, 0xf6, 0xe0, 0x15, + 0xcf, 0x01, 0x19, 0x71, 0x00, 0x89, 0x4b, 0x13, + 0x18, 0xc9, 0x60, 0x08, 0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, 0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, 0x00, 0xb0, 0x4b, 0x0d, - 0x18, 0xc0, 0x9a, 0x00, 0x1c, 0x39, 0x23, 0x02, - 0xf0, 0x00, 0xfa, 0x94, 0x28, 0x00, 0xd0, 0x00, + 0x18, 0xc1, 0x9a, 0x00, 0x1c, 0x38, 0x23, 0x02, + 0xf0, 0x00, 0xfa, 0xfe, 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, 0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, 0xb0, 0x02, 0xe7, 0xb0, - 0xb0, 0x02, 0xe7, 0xae, 0x2e, 0x08, 0x60, 0x8c, - 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x08, 0x00, - 0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xd0, - 0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x15, 0x0e, 0x2d, - 0x9c, 0x00, 0x88, 0x66, 0x42, 0xb5, 0xdd, 0x04, - 0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x78, 0x20, 0x19, 0x40, 0x06, 0x07, - 0x0e, 0x3f, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9f, - 0xdd, 0x01, 0x20, 0xff, 0xe7, 0xf1, 0x49, 0x0a, - 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0xa3, 0x28, 0x92, - 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0xac, - 0xe7, 0xf5, 0x99, 0x01, 0x00, 0xb8, 0x4b, 0x05, - 0x18, 0xc0, 0x60, 0x01, 0x20, 0x92, 0x49, 0x02, - 0x60, 0x08, 0x20, 0x00, 0xe7, 0xdd, 0xe7, 0xdc, - 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x08, 0x00, - 0xb5, 0xf7, 0x9a, 0x02, 0x06, 0x14, 0x0e, 0x24, - 0x9f, 0x00, 0x88, 0x7d, 0x78, 0x38, 0x19, 0x00, - 0x06, 0x06, 0x0e, 0x36, 0x42, 0xac, 0xdd, 0x04, - 0x20, 0xff, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0x49, 0x0b, 0x20, 0x91, 0xf0, 0x0f, - 0xfd, 0x79, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, - 0xf0, 0x01, 0xfd, 0x82, 0xe7, 0xf5, 0x00, 0xb0, - 0x4b, 0x06, 0x18, 0xc0, 0x68, 0x00, 0x99, 0x01, - 0x60, 0x08, 0x20, 0x92, 0x49, 0x02, 0x60, 0x08, - 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x08, 0x00, - 0x1c, 0x01, 0x1c, 0x0a, 0x88, 0x50, 0x47, 0x70, - 0xe7, 0xfd, 0xb4, 0x80, 0x1c, 0x01, 0x1c, 0x0f, - 0x69, 0x3a, 0x2a, 0x08, 0xd2, 0x12, 0xa3, 0x02, - 0x5c, 0x9b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, - 0x04, 0x07, 0x09, 0x0b, 0x04, 0x07, 0x09, 0x0b, - 0x20, 0x02, 0xbc, 0x80, 0x47, 0x70, 0x20, 0x04, - 0xe7, 0xfb, 0x20, 0x10, 0xe7, 0xf9, 0x20, 0xff, - 0x30, 0x01, 0xe7, 0xf6, 0x20, 0x00, 0xe7, 0xf4, - 0xe7, 0xf3, 0xb5, 0xf3, 0x98, 0x00, 0x06, 0x05, - 0x0e, 0x2d, 0x48, 0x89, 0x68, 0x00, 0x28, 0x00, - 0xd1, 0x04, 0x20, 0x8b, 0xb0, 0x02, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x48, 0x85, 0x68, 0x00, - 0x28, 0x01, 0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, - 0x20, 0x8c, 0xe7, 0xf3, 0xe0, 0xfe, 0x2d, 0x07, - 0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xee, 0x49, 0x80, - 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x23, 0x28, 0x92, - 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x2c, - 0xe7, 0xf5, 0x1c, 0x28, 0xf7, 0xf8, 0xfc, 0xd8, - 0x1c, 0x04, 0x2c, 0x00, 0xd0, 0x09, 0x68, 0xa0, - 0x4b, 0x78, 0x40, 0x18, 0x99, 0x01, 0x07, 0xc9, - 0x09, 0xc9, 0x43, 0x08, 0x60, 0xa0, 0x01, 0xc0, - 0xe0, 0x04, 0x20, 0x92, 0x49, 0x72, 0x60, 0x08, - 0x20, 0xff, 0xe7, 0xcf, 0x48, 0x6f, 0x68, 0x00, - 0x28, 0x00, 0xd1, 0x11, 0x99, 0x01, 0x29, 0x00, - 0xd0, 0x06, 0x48, 0x6f, 0x21, 0x01, 0x40, 0xa9, - 0x68, 0x02, 0x43, 0x11, 0x60, 0x01, 0xe0, 0x06, - 0x48, 0x6b, 0x21, 0x01, 0x40, 0xa9, 0x43, 0xc9, - 0x68, 0x02, 0x40, 0x11, 0x60, 0x01, 0xe0, 0xbf, - 0x68, 0xe0, 0xf0, 0x02, 0xfc, 0x3b, 0x28, 0x00, - 0xd0, 0x73, 0xb0, 0x81, 0x49, 0x65, 0x20, 0x91, - 0xf0, 0x0f, 0xfc, 0xe8, 0x28, 0x92, 0xd0, 0x00, - 0xe7, 0xf8, 0xf0, 0x02, 0xfc, 0x8a, 0x20, 0x92, - 0x49, 0x60, 0x60, 0x08, 0x20, 0x01, 0x49, 0x60, - 0x68, 0x09, 0x60, 0x08, 0x27, 0x00, 0x26, 0x00, - 0x2e, 0x00, 0xd1, 0x14, 0x2f, 0x07, 0xd2, 0x12, - 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, - 0x37, 0x01, 0x00, 0x83, 0x18, 0x18, 0x00, 0xc0, - 0x4a, 0x57, 0x68, 0x12, 0x18, 0x80, 0x23, 0x05, - 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0x81, - 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe8, 0x2e, 0x00, - 0xd1, 0x13, 0x2f, 0x18, 0xd2, 0x11, 0x6a, 0xe0, - 0x05, 0x81, 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, - 0x23, 0x4c, 0x43, 0x58, 0x4a, 0x4c, 0x68, 0x12, - 0x18, 0x80, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, - 0x69, 0x40, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, - 0xe7, 0xe9, 0x3f, 0x01, 0x2f, 0x07, 0xd2, 0x32, - 0x99, 0x02, 0x29, 0x00, 0xd0, 0x16, 0x00, 0xb8, - 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x42, 0x68, 0x09, - 0x18, 0x40, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, - 0x6e, 0x80, 0x4b, 0x40, 0x43, 0x18, 0x00, 0xb9, - 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x3c, 0x68, 0x12, - 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, - 0x66, 0x88, 0xe0, 0x17, 0x00, 0xb8, 0x19, 0xc0, - 0x00, 0xc0, 0x49, 0x37, 0x68, 0x09, 0x18, 0x40, - 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, - 0x04, 0x00, 0x0c, 0x00, 0x00, 0xb9, 0x19, 0xc9, - 0x00, 0xc9, 0x4a, 0x31, 0x68, 0x12, 0x18, 0x89, - 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, - 0xe0, 0x00, 0xe0, 0x45, 0xe0, 0x2b, 0x99, 0x02, - 0x29, 0x00, 0xd0, 0x14, 0x20, 0x4c, 0x43, 0x78, - 0x49, 0x29, 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, 0x4b, 0x27, - 0x43, 0x18, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x24, - 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, - 0x39, 0x02, 0x60, 0x08, 0xe0, 0x13, 0x20, 0x4c, - 0x43, 0x78, 0x49, 0x1f, 0x68, 0x09, 0x18, 0x40, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x68, 0x00, - 0x04, 0x00, 0x0c, 0x00, 0x21, 0x4c, 0x43, 0x79, - 0x4a, 0x19, 0x68, 0x12, 0x18, 0x89, 0x39, 0xff, - 0x39, 0xff, 0x39, 0x02, 0x60, 0x08, 0x48, 0x16, - 0x68, 0x00, 0xf0, 0x02, 0xfc, 0x05, 0x49, 0x13, - 0x20, 0x91, 0xf0, 0x0f, 0xfc, 0x43, 0x28, 0x92, - 0xd0, 0x00, 0xe7, 0xf8, 0x48, 0x10, 0x68, 0x00, - 0x90, 0x00, 0x48, 0x11, 0x68, 0x00, 0x49, 0x0e, - 0x60, 0x08, 0x98, 0x00, 0x49, 0x0e, 0x60, 0x08, - 0x20, 0x92, 0x49, 0x0a, 0x60, 0x08, 0xb0, 0x01, - 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, - 0xe6, 0xf4, 0xe6, 0xf3, 0xe6, 0xf2, 0x00, 0x00, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x7c, 0xcc, 0xfe, 0xff, 0xff, 0xff, - 0x68, 0x00, 0x00, 0x20, 0x2e, 0x08, 0x94, 0x90, - 0x2e, 0x08, 0x7d, 0xbc, 0xff, 0xff, 0x00, 0x00, - 0x2e, 0x08, 0x7d, 0xc0, 0xb5, 0xf0, 0x1c, 0x04, - 0x1c, 0x0f, 0x06, 0x26, 0x0e, 0x36, 0x48, 0x0f, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x8b, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x07, - 0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xf8, 0x1c, 0x30, - 0xf7, 0xf8, 0xfb, 0xc2, 0x1c, 0x05, 0x2d, 0x00, - 0xd0, 0x04, 0x68, 0xa8, 0x01, 0xc0, 0x0f, 0xc0, - 0x60, 0x38, 0xe0, 0x04, 0x20, 0x92, 0x49, 0x04, - 0x60, 0x08, 0x20, 0xff, 0xe7, 0xe8, 0x20, 0x00, - 0xe7, 0xe6, 0xe7, 0xe5, 0x2e, 0x08, 0x60, 0x8c, - 0x2e, 0x08, 0x7c, 0xcc, 0xb5, 0xb0, 0x1c, 0x04, - 0x1c, 0x0f, 0x06, 0x25, 0x0e, 0x2d, 0x48, 0x20, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x8b, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x1d, - 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, 0x2d, 0x17, - 0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf4, 0xe0, 0x2d, - 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xef, - 0x48, 0x16, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, - 0x20, 0xff, 0xe7, 0xe9, 0x49, 0x14, 0x20, 0x91, - 0xf0, 0x0f, 0xfb, 0xcc, 0x28, 0x92, 0xd0, 0x03, - 0x20, 0x01, 0xf0, 0x01, 0xfb, 0xd5, 0xe7, 0xf5, - 0x2f, 0x00, 0xd0, 0x08, 0x48, 0x0f, 0x1d, 0xe9, - 0x31, 0x01, 0x22, 0x01, 0x40, 0x8a, 0x68, 0x01, - 0x43, 0x11, 0x60, 0x01, 0xe0, 0x08, 0x48, 0x0b, - 0x1d, 0xea, 0x32, 0x01, 0x21, 0x01, 0x40, 0x91, - 0x43, 0xc9, 0x68, 0x02, 0x40, 0x11, 0x60, 0x01, - 0x20, 0x92, 0x49, 0x05, 0x60, 0x08, 0x20, 0x00, - 0xe7, 0xc6, 0xe7, 0xc5, 0xe7, 0xc4, 0x00, 0x00, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x94, 0x8c, - 0x2e, 0x08, 0x7c, 0xcc, 0x68, 0x00, 0x00, 0x20, - 0xb4, 0x90, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, - 0x0e, 0x09, 0x48, 0x10, 0x68, 0x00, 0x28, 0x00, - 0xd1, 0x02, 0x20, 0x8b, 0xbc, 0x90, 0x47, 0x70, - 0x29, 0x07, 0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xf9, - 0x48, 0x0b, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, - 0x20, 0xff, 0xe7, 0xf3, 0x1d, 0xc8, 0x30, 0x01, - 0x24, 0x01, 0x40, 0x84, 0x1c, 0x23, 0x20, 0x0d, - 0x06, 0xc0, 0x6a, 0x00, 0x40, 0x18, 0x1d, 0xcc, - 0x34, 0x01, 0x40, 0xe0, 0x60, 0x10, 0x20, 0x00, - 0xe7, 0xe4, 0xe7, 0xe3, 0x2e, 0x08, 0x60, 0x8c, - 0x2e, 0x08, 0x94, 0x8c, 0xb5, 0xb0, 0x1c, 0x04, - 0x1c, 0x0f, 0x06, 0x25, 0x0e, 0x2d, 0x48, 0x13, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x03, 0x20, 0x8b, - 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x07, - 0xdd, 0x01, 0x20, 0x8c, 0xe7, 0xf8, 0x48, 0x0e, - 0x68, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, - 0xe7, 0xf2, 0x49, 0x0c, 0x20, 0x91, 0xf0, 0x0f, - 0xfb, 0x5d, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, - 0xf0, 0x01, 0xfb, 0x66, 0xe7, 0xf5, 0x08, 0xb8, - 0x00, 0xa9, 0x4b, 0x07, 0x18, 0xc9, 0x67, 0x08, + 0xb0, 0x02, 0xe7, 0xae, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x08, 0x00, + 0xf0, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc8, + 0x21, 0x04, 0xe0, 0x00, 0x31, 0x01, 0x1c, 0x08, + 0x47, 0x70, 0xe7, 0xfd, 0xb5, 0xf3, 0x1c, 0x0f, + 0xb0, 0x82, 0x48, 0x2b, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x05, 0x20, 0x8a, 0xb0, 0x02, 0xb0, 0x02, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x98, 0x02, + 0x90, 0x01, 0x98, 0x01, 0x88, 0x44, 0x98, 0x01, + 0x78, 0x06, 0x23, 0xff, 0x33, 0x01, 0x42, 0x9c, + 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xee, + 0x19, 0x30, 0x23, 0xff, 0x33, 0x01, 0x42, 0x98, + 0xdd, 0x02, 0x20, 0xff, 0xb0, 0x02, 0xe7, 0xe6, + 0x49, 0x1c, 0x20, 0x91, 0xf0, 0x0f, 0xfe, 0x1e, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xfe, 0x05, 0xe7, 0xf5, 0x2c, 0x10, 0xda, 0x0d, + 0x25, 0x00, 0x42, 0xa5, 0xdb, 0x02, 0xe0, 0x08, + 0x35, 0x01, 0xe7, 0xfa, 0x19, 0x70, 0x00, 0x80, + 0x4b, 0x13, 0x18, 0xc0, 0x68, 0x01, 0xc7, 0x02, + 0xe7, 0xf6, 0xe0, 0x15, 0x4a, 0x11, 0x43, 0x22, + 0x92, 0x00, 0x20, 0x91, 0x49, 0x10, 0x60, 0x08, + 0x00, 0xb0, 0x4b, 0x0d, 0x18, 0xc0, 0x9a, 0x00, + 0x1c, 0x39, 0x23, 0x02, 0xf0, 0x00, 0xfa, 0x94, + 0x28, 0x00, 0xd0, 0x00, 0xe7, 0xf4, 0x48, 0x0a, + 0x68, 0x00, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xfa, 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0x00, - 0xe7, 0xde, 0xe7, 0xdd, 0x2e, 0x08, 0x60, 0x8c, - 0x2e, 0x08, 0x94, 0x8c, 0x2e, 0x08, 0x7c, 0xcc, - 0x68, 0x00, 0x0e, 0x00, 0xb4, 0xf0, 0x1c, 0x05, - 0x1c, 0x0c, 0x1c, 0x17, 0x1c, 0x1e, 0x04, 0x3f, - 0x0c, 0x3f, 0x1c, 0x39, 0x29, 0x00, 0xd8, 0x02, - 0xe0, 0x04, 0x39, 0x01, 0xe7, 0xfa, 0xcd, 0x04, - 0xc4, 0x04, 0xe7, 0xfa, 0x20, 0x92, 0x4a, 0x03, - 0x60, 0x10, 0x20, 0x00, 0xbc, 0xf0, 0x47, 0x70, - 0xe7, 0xfc, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xd0, - 0x20, 0x00, 0x6b, 0x00, 0x49, 0x63, 0x60, 0x08, - 0x20, 0x00, 0x6b, 0x40, 0x49, 0x62, 0x60, 0x08, - 0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, - 0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6a, 0xc0, + 0xb0, 0x02, 0xe7, 0xb0, 0xb0, 0x02, 0xe7, 0xae, + 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4, + 0x68, 0x00, 0x08, 0x00, 0xf0, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0xc8, 0xb5, 0xf7, 0x9a, 0x02, + 0x06, 0x15, 0x0e, 0x2d, 0x9c, 0x00, 0x88, 0x66, + 0x42, 0xb5, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x78, 0x20, + 0x19, 0x40, 0x06, 0x07, 0x0e, 0x3f, 0x23, 0xff, + 0x33, 0x01, 0x42, 0x9f, 0xdd, 0x01, 0x20, 0xff, + 0xe7, 0xf1, 0x49, 0x0a, 0x20, 0x91, 0xf0, 0x0f, + 0xfd, 0xc5, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x01, 0xfd, 0xac, 0xe7, 0xf5, 0x99, 0x01, + 0x00, 0xb8, 0x4b, 0x05, 0x18, 0xc0, 0x60, 0x01, + 0x20, 0x92, 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, + 0xe7, 0xdd, 0xe7, 0xdc, 0x2e, 0x08, 0x7c, 0xc4, + 0x68, 0x00, 0x08, 0x00, 0xb5, 0xf7, 0x9a, 0x02, + 0x06, 0x14, 0x0e, 0x24, 0x9f, 0x00, 0x88, 0x7d, + 0x78, 0x38, 0x19, 0x00, 0x06, 0x06, 0x0e, 0x36, + 0x42, 0xac, 0xdd, 0x04, 0x20, 0xff, 0xb0, 0x03, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x49, 0x0b, + 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x9b, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfd, 0x82, + 0xe7, 0xf5, 0x00, 0xb0, 0x4b, 0x06, 0x18, 0xc0, + 0x68, 0x00, 0x99, 0x01, 0x60, 0x08, 0x20, 0x92, + 0x49, 0x02, 0x60, 0x08, 0x20, 0x00, 0xe7, 0xe6, + 0xe7, 0xe5, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0xc4, + 0x68, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x1c, 0x0a, + 0x88, 0x50, 0x47, 0x70, 0xe7, 0xfd, 0xb4, 0x80, + 0x1c, 0x01, 0x1c, 0x0f, 0x69, 0x3a, 0x2a, 0x08, + 0xd2, 0x12, 0xa3, 0x02, 0x5c, 0x9b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x07, 0x09, 0x0b, + 0x04, 0x07, 0x09, 0x0b, 0x20, 0x02, 0xbc, 0x80, + 0x47, 0x70, 0x20, 0x04, 0xe7, 0xfb, 0x20, 0x10, + 0xe7, 0xf9, 0x20, 0xff, 0x30, 0x01, 0xe7, 0xf6, + 0x20, 0x00, 0xe7, 0xf4, 0xe7, 0xf3, 0xb5, 0xf3, + 0x98, 0x00, 0x06, 0x05, 0x0e, 0x2d, 0x48, 0x89, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x20, 0x8b, + 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x48, 0x85, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x04, + 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, 0xe7, 0xf3, + 0xe0, 0xfe, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xee, 0x49, 0x80, 0x20, 0x91, 0xf0, 0x0f, + 0xfd, 0x45, 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, + 0xf0, 0x01, 0xfd, 0x2c, 0xe7, 0xf5, 0x1c, 0x28, + 0xf7, 0xf8, 0xfc, 0xd8, 0x1c, 0x04, 0x2c, 0x00, + 0xd0, 0x09, 0x68, 0xa0, 0x4b, 0x78, 0x40, 0x18, + 0x99, 0x01, 0x07, 0xc9, 0x09, 0xc9, 0x43, 0x08, + 0x60, 0xa0, 0x01, 0xc0, 0xe0, 0x04, 0x20, 0x92, + 0x49, 0x72, 0x60, 0x08, 0x20, 0xff, 0xe7, 0xcf, + 0x48, 0x6f, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x11, + 0x99, 0x01, 0x29, 0x00, 0xd0, 0x06, 0x48, 0x6f, + 0x21, 0x01, 0x40, 0xa9, 0x68, 0x02, 0x43, 0x11, + 0x60, 0x01, 0xe0, 0x06, 0x48, 0x6b, 0x21, 0x01, + 0x40, 0xa9, 0x43, 0xc9, 0x68, 0x02, 0x40, 0x11, + 0x60, 0x01, 0xe0, 0xbf, 0x68, 0xe0, 0xf0, 0x02, + 0xfc, 0x3b, 0x28, 0x00, 0xd0, 0x73, 0xb0, 0x81, + 0x49, 0x65, 0x20, 0x91, 0xf0, 0x0f, 0xfd, 0x0a, + 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, 0xf0, 0x02, + 0xfc, 0x8a, 0x20, 0x92, 0x49, 0x60, 0x60, 0x08, + 0x20, 0x01, 0x49, 0x60, 0x68, 0x09, 0x60, 0x08, + 0x27, 0x00, 0x26, 0x00, 0x2e, 0x00, 0xd1, 0x14, + 0x2f, 0x07, 0xd2, 0x12, 0x6a, 0xe0, 0x05, 0x81, + 0x0d, 0x89, 0x1c, 0x38, 0x37, 0x01, 0x00, 0x83, + 0x18, 0x18, 0x00, 0xc0, 0x4a, 0x57, 0x68, 0x12, + 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, + 0x6f, 0xc0, 0x42, 0x81, 0xd1, 0x00, 0x26, 0x01, + 0xe7, 0xe8, 0x2e, 0x00, 0xd1, 0x13, 0x2f, 0x18, + 0xd2, 0x11, 0x6a, 0xe0, 0x05, 0x81, 0x0d, 0x89, + 0x1c, 0x38, 0x37, 0x01, 0x23, 0x4c, 0x43, 0x58, + 0x4a, 0x4c, 0x68, 0x12, 0x18, 0x80, 0x38, 0xff, + 0x38, 0xff, 0x38, 0x02, 0x69, 0x40, 0x42, 0x81, + 0xd1, 0x00, 0x26, 0x01, 0xe7, 0xe9, 0x3f, 0x01, + 0x2f, 0x07, 0xd2, 0x32, 0x99, 0x02, 0x29, 0x00, + 0xd0, 0x16, 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, + 0x49, 0x42, 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6e, 0x80, 0x4b, 0x40, + 0x43, 0x18, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x3c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x17, + 0x00, 0xb8, 0x19, 0xc0, 0x00, 0xc0, 0x49, 0x37, + 0x68, 0x09, 0x18, 0x40, 0x23, 0x05, 0x02, 0x1b, + 0x18, 0xc0, 0x6e, 0x80, 0x04, 0x00, 0x0c, 0x00, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x31, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0x88, 0xe0, 0x00, 0xe0, 0x45, + 0xe0, 0x2b, 0x99, 0x02, 0x29, 0x00, 0xd0, 0x14, + 0x20, 0x4c, 0x43, 0x78, 0x49, 0x29, 0x68, 0x09, + 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x68, 0x00, 0x4b, 0x27, 0x43, 0x18, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x24, 0x68, 0x12, 0x18, 0x89, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x60, 0x08, + 0xe0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x49, 0x1f, + 0x68, 0x09, 0x18, 0x40, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x00, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x19, 0x68, 0x12, + 0x18, 0x89, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x60, 0x08, 0x48, 0x16, 0x68, 0x00, 0xf0, 0x02, + 0xfc, 0x05, 0x49, 0x13, 0x20, 0x91, 0xf0, 0x0f, + 0xfc, 0x65, 0x28, 0x92, 0xd0, 0x00, 0xe7, 0xf8, + 0x48, 0x10, 0x68, 0x00, 0x90, 0x00, 0x48, 0x11, + 0x68, 0x00, 0x49, 0x0e, 0x60, 0x08, 0x98, 0x00, + 0x49, 0x0e, 0x60, 0x08, 0x20, 0x92, 0x49, 0x0a, + 0x60, 0x08, 0xb0, 0x01, 0x20, 0x92, 0x49, 0x05, + 0x60, 0x08, 0x20, 0x00, 0xe6, 0xf4, 0xe6, 0xf3, + 0xe6, 0xf2, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4, + 0xfe, 0xff, 0xff, 0xff, 0x68, 0x00, 0x00, 0x20, + 0x2e, 0x08, 0x94, 0x88, 0x2e, 0x08, 0x7d, 0xb4, + 0xff, 0xff, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xb8, + 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x26, + 0x0e, 0x36, 0x48, 0x0f, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2e, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xf8, 0x1c, 0x30, 0xf7, 0xf8, 0xfb, 0xc2, + 0x1c, 0x05, 0x2d, 0x00, 0xd0, 0x04, 0x68, 0xa8, + 0x01, 0xc0, 0x0f, 0xc0, 0x60, 0x38, 0xe0, 0x04, + 0x20, 0x92, 0x49, 0x04, 0x60, 0x08, 0x20, 0xff, + 0xe7, 0xe8, 0x20, 0x00, 0xe7, 0xe6, 0xe7, 0xe5, + 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x7c, 0xc4, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x48, 0x20, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x48, 0x1d, 0x68, 0x00, 0x28, 0x01, + 0xd1, 0x04, 0x2d, 0x17, 0xdd, 0x02, 0x20, 0x8c, + 0xe7, 0xf4, 0xe0, 0x2d, 0x2d, 0x07, 0xdd, 0x01, + 0x20, 0x8c, 0xe7, 0xef, 0x48, 0x16, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xe9, + 0x49, 0x14, 0x20, 0x91, 0xf0, 0x0f, 0xfb, 0xee, + 0x28, 0x92, 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, + 0xfb, 0xd5, 0xe7, 0xf5, 0x2f, 0x00, 0xd0, 0x08, + 0x48, 0x0f, 0x1d, 0xe9, 0x31, 0x01, 0x22, 0x01, + 0x40, 0x8a, 0x68, 0x01, 0x43, 0x11, 0x60, 0x01, + 0xe0, 0x08, 0x48, 0x0b, 0x1d, 0xea, 0x32, 0x01, + 0x21, 0x01, 0x40, 0x91, 0x43, 0xc9, 0x68, 0x02, + 0x40, 0x11, 0x60, 0x01, 0x20, 0x92, 0x49, 0x05, + 0x60, 0x08, 0x20, 0x00, 0xe7, 0xc6, 0xe7, 0xc5, + 0xe7, 0xc4, 0x00, 0x00, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x94, 0x84, 0x2e, 0x08, 0x7c, 0xc4, + 0x68, 0x00, 0x00, 0x20, 0xb4, 0x90, 0x1c, 0x07, + 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x48, 0x10, + 0x68, 0x00, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x8b, + 0xbc, 0x90, 0x47, 0x70, 0x29, 0x07, 0xdd, 0x01, + 0x20, 0x8c, 0xe7, 0xf9, 0x48, 0x0b, 0x68, 0x00, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf3, + 0x1d, 0xc8, 0x30, 0x01, 0x24, 0x01, 0x40, 0x84, + 0x1c, 0x23, 0x20, 0x0d, 0x06, 0xc0, 0x6a, 0x00, + 0x40, 0x18, 0x1d, 0xcc, 0x34, 0x01, 0x40, 0xe0, + 0x60, 0x10, 0x20, 0x00, 0xe7, 0xe4, 0xe7, 0xe3, + 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84, + 0xb5, 0xb0, 0x1c, 0x04, 0x1c, 0x0f, 0x06, 0x25, + 0x0e, 0x2d, 0x48, 0x13, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x03, 0x20, 0x8b, 0xbc, 0xb0, 0xbc, 0x08, + 0x47, 0x18, 0x2d, 0x07, 0xdd, 0x01, 0x20, 0x8c, + 0xe7, 0xf8, 0x48, 0x0e, 0x68, 0x00, 0x28, 0x00, + 0xd0, 0x01, 0x20, 0xff, 0xe7, 0xf2, 0x49, 0x0c, + 0x20, 0x91, 0xf0, 0x0f, 0xfb, 0x7f, 0x28, 0x92, + 0xd0, 0x03, 0x20, 0x01, 0xf0, 0x01, 0xfb, 0x66, + 0xe7, 0xf5, 0x08, 0xb8, 0x00, 0xa9, 0x4b, 0x07, + 0x18, 0xc9, 0x67, 0x08, 0x20, 0x92, 0x49, 0x04, + 0x60, 0x08, 0x20, 0x00, 0xe7, 0xde, 0xe7, 0xdd, + 0x2e, 0x08, 0x60, 0x84, 0x2e, 0x08, 0x94, 0x84, + 0x2e, 0x08, 0x7c, 0xc4, 0x68, 0x00, 0x0e, 0x00, + 0xb4, 0xf0, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0x1c, 0x1e, 0x04, 0x3f, 0x0c, 0x3f, 0x1c, 0x39, + 0x29, 0x00, 0xd8, 0x02, 0xe0, 0x04, 0x39, 0x01, + 0xe7, 0xfa, 0xcd, 0x04, 0xc4, 0x04, 0xe7, 0xfa, + 0x20, 0x92, 0x4a, 0x03, 0x60, 0x10, 0x20, 0x00, + 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xfc, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0xc8, 0x20, 0x00, 0x6b, 0x00, + 0x49, 0x63, 0x60, 0x08, 0x20, 0x00, 0x6b, 0x40, 0x49, 0x62, 0x60, 0x08, 0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 0x49, 0x63, 0x60, 0x08, - 0x48, 0x63, 0x49, 0x64, 0x60, 0x08, 0x20, 0x00, - 0x6b, 0x80, 0x49, 0x63, 0x60, 0x08, 0x20, 0x00, - 0x6b, 0xc0, 0x49, 0x62, 0x60, 0x08, 0x20, 0x00, - 0x6c, 0x00, 0x49, 0x61, 0x60, 0x08, 0x20, 0x00, - 0x6c, 0x40, 0x49, 0x60, 0x60, 0x08, 0x20, 0x00, - 0x6c, 0x80, 0x49, 0x5f, 0x60, 0x08, 0x20, 0x00, - 0x6c, 0xc0, 0x49, 0x5e, 0x60, 0x08, 0x20, 0x00, - 0x6e, 0xc0, 0x49, 0x5d, 0x60, 0x08, 0x20, 0x80, - 0x6d, 0x00, 0x49, 0x5c, 0x60, 0x08, 0x20, 0x80, - 0x6d, 0x40, 0x49, 0x5b, 0x60, 0x08, 0x20, 0x80, - 0x6d, 0x80, 0x49, 0x5a, 0x60, 0x08, 0x20, 0x00, - 0x6d, 0x00, 0x49, 0x59, 0x60, 0x08, 0x20, 0x00, - 0x6d, 0x40, 0x49, 0x58, 0x60, 0x08, 0x20, 0x00, - 0x6d, 0x80, 0x49, 0x57, 0x60, 0x08, 0x20, 0x00, - 0x6d, 0xc0, 0x49, 0x56, 0x60, 0x08, 0x20, 0x80, - 0x6a, 0xc0, 0x49, 0x55, 0x60, 0x08, 0x20, 0x80, - 0x6d, 0xc0, 0x49, 0x54, 0x60, 0x08, 0x20, 0x80, - 0x6c, 0xc0, 0x49, 0x53, 0x60, 0x08, 0x20, 0x80, - 0x68, 0x40, 0x49, 0x52, 0x60, 0x08, 0x20, 0x80, - 0x68, 0x80, 0x49, 0x51, 0x60, 0x08, 0x20, 0x80, - 0x68, 0xc0, 0x49, 0x50, 0x60, 0x08, 0x20, 0x80, - 0x69, 0x00, 0x49, 0x4f, 0x60, 0x08, 0x20, 0x80, - 0x69, 0x40, 0x49, 0x4e, 0x60, 0x08, 0x20, 0x80, - 0x69, 0x80, 0x49, 0x4d, 0x60, 0x08, 0x20, 0x80, - 0x69, 0xc0, 0x49, 0x4c, 0x60, 0x08, 0x20, 0x80, - 0x6a, 0x00, 0x49, 0x4b, 0x60, 0x08, 0x20, 0x80, - 0x6a, 0x40, 0x49, 0x4a, 0x60, 0x08, 0x20, 0x80, - 0x6a, 0x80, 0x49, 0x49, 0x60, 0x08, 0x20, 0x00, - 0x6f, 0x00, 0x49, 0x48, 0x60, 0x08, 0x20, 0x00, - 0x6f, 0x40, 0x49, 0x47, 0x60, 0x08, 0x20, 0x80, - 0x6c, 0x40, 0x49, 0x46, 0x60, 0x08, 0x20, 0x80, - 0x6c, 0x80, 0x49, 0x45, 0x60, 0x08, 0x20, 0x80, - 0x6e, 0x40, 0x49, 0x44, 0x60, 0x08, 0x20, 0x80, - 0x6e, 0x80, 0x49, 0x43, 0x60, 0x08, 0x20, 0x00, - 0x49, 0x42, 0x60, 0x08, 0x20, 0x00, 0x49, 0x41, - 0x60, 0x48, 0x48, 0x41, 0x49, 0x3f, 0x60, 0x88, - 0x48, 0x40, 0x49, 0x3e, 0x60, 0xc8, 0x20, 0xff, - 0x30, 0x01, 0x68, 0x40, 0x49, 0x3e, 0x60, 0x08, - 0x20, 0x80, 0x6e, 0xc0, 0x49, 0x3d, 0x60, 0x08, - 0x20, 0x80, 0x6f, 0x00, 0x49, 0x3c, 0x60, 0x08, - 0x20, 0x80, 0x6f, 0x40, 0x49, 0x3b, 0x60, 0x08, - 0x20, 0x80, 0x6f, 0x80, 0x49, 0x3a, 0x60, 0x08, - 0x20, 0x80, 0x6f, 0xc0, 0x49, 0x39, 0x60, 0x08, - 0x20, 0xff, 0x30, 0x01, 0x68, 0x80, 0x49, 0x38, - 0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x5d, 0xc4, - 0x2e, 0x08, 0x5d, 0xc8, 0x64, 0x00, 0x05, 0x00, - 0x2e, 0x08, 0x5d, 0xd0, 0x64, 0x00, 0x00, 0x80, - 0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x5d, 0xcc, - 0x64, 0x00, 0x04, 0x00, 0x2e, 0x08, 0x5d, 0xd8, - 0x9e, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x5d, 0xf0, - 0x9e, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x5d, 0xdc, - 0x2e, 0x08, 0x94, 0xa4, 0x2e, 0x08, 0x94, 0xa8, - 0x2e, 0x08, 0x94, 0xac, 0x2e, 0x08, 0x94, 0xb0, - 0x2e, 0x08, 0x5d, 0xe0, 0x2e, 0x08, 0x5d, 0xe4, - 0x2e, 0x08, 0x5d, 0xf4, 0x2e, 0x08, 0x5d, 0xf8, - 0x2e, 0x08, 0x5d, 0xfc, 0x2e, 0x08, 0x5e, 0x00, - 0x2e, 0x08, 0x5d, 0xe8, 0x2e, 0x08, 0x5d, 0xec, - 0x2e, 0x08, 0x60, 0x74, 0x2e, 0x08, 0x60, 0x78, + 0x20, 0x00, 0x6a, 0xc0, 0x49, 0x62, 0x60, 0x08, + 0x48, 0x62, 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, + 0x49, 0x63, 0x60, 0x08, 0x48, 0x63, 0x49, 0x64, + 0x60, 0x08, 0x20, 0x00, 0x6b, 0x80, 0x49, 0x63, + 0x60, 0x08, 0x20, 0x00, 0x6b, 0xc0, 0x49, 0x62, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x00, 0x49, 0x61, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x40, 0x49, 0x60, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0x80, 0x49, 0x5f, + 0x60, 0x08, 0x20, 0x00, 0x6c, 0xc0, 0x49, 0x5e, + 0x60, 0x08, 0x20, 0x00, 0x6e, 0xc0, 0x49, 0x5d, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x00, 0x49, 0x5c, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x40, 0x49, 0x5b, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0x80, 0x49, 0x5a, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x00, 0x49, 0x59, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x40, 0x49, 0x58, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0x80, 0x49, 0x57, + 0x60, 0x08, 0x20, 0x00, 0x6d, 0xc0, 0x49, 0x56, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0xc0, 0x49, 0x55, + 0x60, 0x08, 0x20, 0x80, 0x6d, 0xc0, 0x49, 0x54, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0xc0, 0x49, 0x53, + 0x60, 0x08, 0x20, 0x80, 0x68, 0x40, 0x49, 0x52, + 0x60, 0x08, 0x20, 0x80, 0x68, 0x80, 0x49, 0x51, + 0x60, 0x08, 0x20, 0x80, 0x68, 0xc0, 0x49, 0x50, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x00, 0x49, 0x4f, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x40, 0x49, 0x4e, + 0x60, 0x08, 0x20, 0x80, 0x69, 0x80, 0x49, 0x4d, + 0x60, 0x08, 0x20, 0x80, 0x69, 0xc0, 0x49, 0x4c, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x00, 0x49, 0x4b, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x40, 0x49, 0x4a, + 0x60, 0x08, 0x20, 0x80, 0x6a, 0x80, 0x49, 0x49, + 0x60, 0x08, 0x20, 0x00, 0x6f, 0x00, 0x49, 0x48, + 0x60, 0x08, 0x20, 0x00, 0x6f, 0x40, 0x49, 0x47, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0x40, 0x49, 0x46, + 0x60, 0x08, 0x20, 0x80, 0x6c, 0x80, 0x49, 0x45, + 0x60, 0x08, 0x20, 0x80, 0x6e, 0x40, 0x49, 0x44, + 0x60, 0x08, 0x20, 0x80, 0x6e, 0x80, 0x49, 0x43, + 0x60, 0x08, 0x20, 0x00, 0x49, 0x42, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x41, 0x60, 0x48, 0x48, 0x41, + 0x49, 0x3f, 0x60, 0x88, 0x48, 0x40, 0x49, 0x3e, + 0x60, 0xc8, 0x20, 0xff, 0x30, 0x01, 0x68, 0x40, + 0x49, 0x3e, 0x60, 0x08, 0x20, 0x80, 0x6e, 0xc0, + 0x49, 0x3d, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x00, + 0x49, 0x3c, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x40, + 0x49, 0x3b, 0x60, 0x08, 0x20, 0x80, 0x6f, 0x80, + 0x49, 0x3a, 0x60, 0x08, 0x20, 0x80, 0x6f, 0xc0, + 0x49, 0x39, 0x60, 0x08, 0x20, 0xff, 0x30, 0x01, + 0x68, 0x80, 0x49, 0x38, 0x60, 0x08, 0x47, 0x70, + 0x2e, 0x08, 0x5d, 0xbc, 0x2e, 0x08, 0x5d, 0xc0, + 0x64, 0x00, 0x05, 0x00, 0x2e, 0x08, 0x5d, 0xc8, + 0x64, 0x00, 0x00, 0x80, 0x2e, 0x08, 0x5d, 0xcc, + 0x2e, 0x08, 0x5d, 0xc4, 0x64, 0x00, 0x04, 0x00, + 0x2e, 0x08, 0x5d, 0xd0, 0x9e, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x5d, 0xe8, 0x9e, 0x00, 0x05, 0x00, + 0x2e, 0x08, 0x5d, 0xd4, 0x2e, 0x08, 0x94, 0x9c, + 0x2e, 0x08, 0x94, 0xa0, 0x2e, 0x08, 0x94, 0xa4, + 0x2e, 0x08, 0x94, 0xa8, 0x2e, 0x08, 0x5d, 0xd8, + 0x2e, 0x08, 0x5d, 0xdc, 0x2e, 0x08, 0x5d, 0xec, + 0x2e, 0x08, 0x5d, 0xf0, 0x2e, 0x08, 0x5d, 0xf4, + 0x2e, 0x08, 0x5d, 0xf8, 0x2e, 0x08, 0x5d, 0xe0, + 0x2e, 0x08, 0x5d, 0xe4, 0x2e, 0x08, 0x60, 0x6c, + 0x2e, 0x08, 0x60, 0x70, 0x2e, 0x08, 0x5d, 0xfc, + 0x2e, 0x08, 0x5e, 0x00, 0x2e, 0x08, 0x5e, 0x2c, 0x2e, 0x08, 0x5e, 0x04, 0x2e, 0x08, 0x5e, 0x08, - 0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x5e, 0x0c, - 0x2e, 0x08, 0x5e, 0x10, 0x2e, 0x08, 0x5e, 0x14, - 0x2e, 0x08, 0x5e, 0x18, 0x2e, 0x08, 0x5e, 0x1c, - 0x2e, 0x08, 0x5e, 0x20, 0x2e, 0x08, 0x5e, 0x24, - 0x2e, 0x08, 0x5e, 0x28, 0x2e, 0x08, 0x5e, 0x2c, - 0x2e, 0x08, 0x5e, 0x30, 0x2e, 0x08, 0x5d, 0xb8, - 0x2e, 0x08, 0x5d, 0xbc, 0x2e, 0x08, 0x7c, 0x4c, - 0x2e, 0x08, 0x5e, 0x5c, 0x2e, 0x08, 0x5e, 0x3c, - 0x2e, 0x08, 0x60, 0x7c, 0x2e, 0x08, 0x7c, 0x24, - 0xcc, 0x1f, 0xe0, 0x00, 0xcc, 0x1f, 0xfe, 0x00, - 0x2e, 0x08, 0x5e, 0x48, 0x2e, 0x08, 0x5e, 0x60, - 0x2e, 0x08, 0x5e, 0x40, 0x2e, 0x08, 0x5e, 0x44, - 0x2e, 0x08, 0x7c, 0x48, 0x2e, 0x08, 0x7c, 0x20, - 0x2e, 0x08, 0x5e, 0x50, 0x49, 0x4f, 0x68, 0x0a, - 0x23, 0x04, 0x43, 0x1a, 0x60, 0x0a, 0x21, 0xff, - 0x4a, 0x4d, 0x68, 0x12, 0x32, 0x40, 0x72, 0x11, - 0x21, 0xff, 0x4a, 0x4b, 0x68, 0x12, 0x32, 0x40, - 0x76, 0x11, 0x21, 0xff, 0x4a, 0x48, 0x68, 0x12, - 0x32, 0x60, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x46, - 0x68, 0x12, 0x32, 0x20, 0x72, 0x11, 0x21, 0xff, - 0x4a, 0x43, 0x68, 0x12, 0x32, 0x20, 0x76, 0x11, - 0x21, 0xff, 0x4a, 0x41, 0x68, 0x12, 0x32, 0x60, - 0x76, 0x11, 0x21, 0x00, 0x4a, 0x3e, 0x68, 0x12, - 0x32, 0x40, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x3c, - 0x68, 0x12, 0x32, 0x40, 0x76, 0x91, 0x21, 0x00, - 0x4a, 0x39, 0x68, 0x12, 0x32, 0x60, 0x72, 0x91, - 0x21, 0x00, 0x4a, 0x37, 0x68, 0x12, 0x32, 0x20, - 0x72, 0x91, 0x21, 0x00, 0x4a, 0x34, 0x68, 0x12, - 0x32, 0x20, 0x76, 0x91, 0x21, 0x00, 0x4a, 0x32, - 0x68, 0x12, 0x32, 0x60, 0x76, 0x91, 0x21, 0x00, - 0x4a, 0x2f, 0x68, 0x12, 0x32, 0x80, 0x70, 0xd1, - 0x21, 0x00, 0x4a, 0x2d, 0x68, 0x12, 0x32, 0x80, - 0x70, 0x51, 0x21, 0x00, 0x4a, 0x2a, 0x68, 0x12, - 0x32, 0x80, 0x70, 0x91, 0x21, 0x00, 0x4a, 0x29, - 0x60, 0x11, 0x21, 0x00, 0x4a, 0x28, 0x64, 0x11, - 0x21, 0x03, 0x4a, 0x28, 0x61, 0x11, 0x49, 0x28, - 0x68, 0x0a, 0x4b, 0x28, 0x43, 0x1a, 0x60, 0x0a, - 0x49, 0x26, 0x22, 0x33, 0x06, 0x52, 0x60, 0x51, - 0x21, 0x00, 0x4a, 0x25, 0x70, 0x11, 0x21, 0x00, - 0x4a, 0x23, 0x70, 0x51, 0x21, 0x00, 0x4a, 0x22, - 0x70, 0x91, 0x21, 0x00, 0x4a, 0x20, 0x70, 0xd1, - 0x21, 0x00, 0x4a, 0x1f, 0x71, 0x11, 0x21, 0x00, - 0x4a, 0x1d, 0x71, 0x51, 0x21, 0x00, 0x4a, 0x1c, - 0x71, 0x91, 0x21, 0x00, 0x4a, 0x1a, 0x71, 0xd1, - 0x21, 0x00, 0x4a, 0x19, 0x72, 0x11, 0x21, 0x00, - 0x4a, 0x17, 0x72, 0x51, 0x21, 0x00, 0x4a, 0x16, - 0x72, 0x91, 0x21, 0x00, 0x4a, 0x14, 0x72, 0xd1, - 0x21, 0x00, 0x4a, 0x13, 0x73, 0x11, 0x21, 0xff, - 0x4a, 0x11, 0x70, 0x11, 0x21, 0x00, 0x4a, 0x10, - 0x70, 0x11, 0x21, 0x00, 0x4a, 0x0e, 0x70, 0x51, - 0x20, 0x00, 0x28, 0x20, 0xdb, 0x04, 0xe0, 0x08, - 0x1c, 0x41, 0x06, 0x08, 0x0e, 0x00, 0xe7, 0xf8, - 0x21, 0xff, 0x4a, 0x03, 0x68, 0x12, 0x54, 0x11, - 0xe7, 0xf6, 0x47, 0x70, 0x66, 0x00, 0x01, 0x18, - 0x2e, 0x08, 0x7c, 0x4c, 0x9e, 0x00, 0x0a, 0x00, - 0x9e, 0x00, 0x0a, 0x80, 0x66, 0x00, 0x01, 0x00, - 0x66, 0x00, 0x00, 0x08, 0x23, 0x48, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0x50, 0xb4, 0x80, 0x1c, 0x07, - 0x1c, 0x0a, 0x06, 0x39, 0x0e, 0x09, 0x29, 0x05, - 0xd2, 0x40, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x03, 0x14, 0x07, 0x0d, - 0x13, 0x00, 0x78, 0x10, 0x4b, 0x1f, 0x70, 0x18, - 0xe0, 0x38, 0x78, 0x50, 0x4b, 0x1e, 0x68, 0x1b, - 0x33, 0x80, 0x71, 0x58, 0xe0, 0x32, 0x78, 0x10, - 0x4b, 0x1b, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x18, - 0xe0, 0x2c, 0xe0, 0x2b, 0x78, 0x10, 0x4b, 0x17, - 0x70, 0x18, 0x78, 0x50, 0x4b, 0x15, 0x70, 0x58, - 0x78, 0x90, 0x4b, 0x14, 0x70, 0x98, 0x78, 0xd0, - 0x4b, 0x12, 0x70, 0xd8, 0x79, 0x10, 0x4b, 0x11, - 0x71, 0x18, 0x79, 0x50, 0x4b, 0x0f, 0x71, 0x58, - 0x79, 0x90, 0x4b, 0x0e, 0x71, 0x98, 0x79, 0xd0, - 0x4b, 0x0c, 0x71, 0xd8, 0x7a, 0x10, 0x4b, 0x0b, - 0x72, 0x18, 0x7a, 0x50, 0x4b, 0x09, 0x72, 0x58, - 0x7a, 0x90, 0x4b, 0x08, 0x72, 0x98, 0x7a, 0xd0, - 0x4b, 0x06, 0x72, 0xd8, 0x7b, 0x10, 0x4b, 0x05, - 0x73, 0x18, 0xe0, 0x03, 0x20, 0x4a, 0xbc, 0x80, - 0x47, 0x70, 0xe7, 0xff, 0x20, 0x00, 0xe7, 0xfa, - 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x50, - 0x2e, 0x08, 0x7c, 0x4c, 0xb5, 0xf3, 0x1c, 0x07, - 0x06, 0x3e, 0x0e, 0x36, 0x99, 0x01, 0x06, 0x0c, - 0x0e, 0x24, 0x2e, 0x20, 0xdb, 0x04, 0x20, 0xa2, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, - 0x2c, 0x04, 0xd1, 0x0b, 0x48, 0xb8, 0x68, 0x00, - 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x39, - 0x48, 0xb5, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, - 0x28, 0x00, 0xd1, 0x33, 0x2c, 0x00, 0xd1, 0x17, - 0x48, 0xb1, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, - 0x28, 0x00, 0xd1, 0x2b, 0x48, 0xae, 0x68, 0x00, - 0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x25, - 0x48, 0xab, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80, - 0x28, 0x00, 0xd1, 0x1f, 0x48, 0xa8, 0x68, 0x00, - 0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x19, - 0x2c, 0x01, 0xd1, 0x19, 0x48, 0xa4, 0x68, 0x00, - 0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x11, - 0x48, 0xa1, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, - 0x28, 0x00, 0xd1, 0x0b, 0x48, 0x9e, 0x68, 0x00, - 0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, - 0x48, 0x9b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, - 0x28, 0x00, 0xd0, 0x01, 0x20, 0x49, 0xe7, 0xb3, - 0x48, 0x97, 0x68, 0x00, 0x55, 0x84, 0x2c, 0xff, - 0xd0, 0x73, 0x20, 0x01, 0x49, 0x95, 0x60, 0x48, - 0x2c, 0x05, 0xd2, 0x6f, 0xa3, 0x01, 0x5d, 0x1b, - 0x00, 0x5b, 0x44, 0x9f, 0x02, 0x34, 0x30, 0x30, - 0x30, 0x00, 0x20, 0x02, 0x49, 0x90, 0x61, 0x88, - 0x48, 0x90, 0x6a, 0xc0, 0x49, 0x90, 0x60, 0x08, - 0x48, 0x90, 0x68, 0x01, 0x23, 0x01, 0x07, 0x5b, - 0x43, 0x19, 0x60, 0x01, 0x48, 0x8e, 0x49, 0x8b, - 0x62, 0xc8, 0x48, 0x8c, 0x68, 0x01, 0x4b, 0x8d, - 0x40, 0x19, 0x60, 0x01, 0x20, 0x01, 0x21, 0x31, - 0x06, 0x49, 0x61, 0x88, 0x20, 0x15, 0x21, 0x31, - 0x06, 0x49, 0x61, 0x08, 0x20, 0x0f, 0x21, 0x31, - 0x06, 0x49, 0x61, 0xc8, 0x20, 0x0c, 0x21, 0x31, - 0x06, 0x49, 0x61, 0xc8, 0x20, 0x54, 0x21, 0x31, - 0x06, 0x49, 0x62, 0xc8, 0x20, 0x37, 0x21, 0x31, - 0x06, 0x49, 0x60, 0x88, 0xe0, 0x56, 0x20, 0x00, - 0x49, 0x79, 0x61, 0x88, 0xe0, 0x52, 0x20, 0x01, - 0x49, 0x77, 0x61, 0x88, 0x20, 0x01, 0x49, 0x7c, - 0x62, 0x88, 0x48, 0x7c, 0x78, 0x00, 0x06, 0x80, - 0x0e, 0x80, 0x02, 0x80, 0x49, 0x79, 0x78, 0x49, - 0x07, 0xc9, 0x0d, 0x89, 0x43, 0x08, 0x49, 0x77, - 0x78, 0x89, 0x07, 0xc9, 0x0d, 0xc9, 0x43, 0x08, - 0x49, 0x74, 0x78, 0xc9, 0x07, 0x89, 0x0f, 0x89, - 0x01, 0x89, 0x43, 0x08, 0x49, 0x71, 0x79, 0x09, - 0x07, 0x89, 0x0f, 0x89, 0x01, 0x09, 0x43, 0x08, - 0x49, 0x6e, 0x79, 0x49, 0x07, 0x89, 0x0f, 0x89, - 0x00, 0x89, 0x43, 0x08, 0x49, 0x6b, 0x79, 0x89, - 0x07, 0x89, 0x0f, 0x89, 0x43, 0x08, 0x49, 0x68, - 0x62, 0x08, 0x48, 0x68, 0x79, 0xc0, 0x07, 0xc0, - 0x0e, 0x40, 0x49, 0x66, 0x7a, 0x09, 0x07, 0xc9, - 0xe0, 0x01, 0xe0, 0x21, 0xe0, 0x18, 0x0e, 0xc9, - 0x43, 0x08, 0x49, 0x62, 0x7a, 0x49, 0x07, 0xc9, - 0x0f, 0x09, 0x43, 0x08, 0x49, 0x5f, 0x7a, 0x89, - 0x07, 0xc9, 0x0f, 0x49, 0x43, 0x08, 0x49, 0x5d, - 0x7a, 0xc9, 0x07, 0xc9, 0x0f, 0x89, 0x43, 0x08, - 0x49, 0x5a, 0x7b, 0x09, 0x07, 0xc9, 0x0f, 0xc9, - 0x43, 0x08, 0x49, 0x57, 0x62, 0x48, 0xe0, 0x01, - 0x20, 0x4a, 0xe7, 0x1d, 0x48, 0x51, 0x68, 0x01, - 0x4b, 0x55, 0x40, 0x19, 0x60, 0x01, 0xe0, 0x8f, - 0x48, 0x49, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, - 0x28, 0x00, 0xd0, 0x08, 0x22, 0x00, 0xb4, 0x04, - 0x1c, 0x30, 0x23, 0x00, 0x22, 0x00, 0x49, 0x4f, - 0xf7, 0xf4, 0xfc, 0x10, 0xb0, 0x01, 0x20, 0x00, - 0x49, 0x42, 0x60, 0x48, 0x48, 0x45, 0x68, 0x01, - 0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01, 0x48, 0x4a, - 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x49, - 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, - 0x2c, 0x00, 0xd1, 0x0e, 0x48, 0x3c, 0x68, 0x00, - 0x28, 0x00, 0xd0, 0x0a, 0x48, 0x3a, 0x68, 0x00, - 0x49, 0x38, 0x62, 0xc8, 0x20, 0x00, 0x49, 0x38, - 0x60, 0x08, 0x20, 0x00, 0x21, 0x31, 0x06, 0x49, - 0x61, 0x88, 0x20, 0x00, 0x49, 0x30, 0x68, 0x09, - 0x31, 0x80, 0x70, 0x48, 0x20, 0x00, 0x49, 0x2e, - 0x68, 0x09, 0x31, 0x80, 0x70, 0x88, 0x20, 0x00, - 0x49, 0x39, 0x60, 0x08, 0x20, 0x00, 0x49, 0x39, - 0x64, 0x08, 0x20, 0x03, 0x49, 0x2a, 0x61, 0x08, - 0x25, 0x00, 0x2d, 0x20, 0xd3, 0x02, 0xe0, 0x06, - 0x35, 0x01, 0xe7, 0xfa, 0x20, 0xff, 0x49, 0x24, - 0x68, 0x09, 0x55, 0x48, 0xe7, 0xf8, 0x20, 0xff, - 0x49, 0x21, 0x68, 0x09, 0x31, 0x40, 0x72, 0x08, - 0x20, 0xff, 0x49, 0x1f, 0x68, 0x09, 0x31, 0x40, - 0x76, 0x08, 0x20, 0xff, 0x49, 0x1c, 0x68, 0x09, - 0x31, 0x60, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1a, - 0x68, 0x09, 0x31, 0x20, 0x72, 0x08, 0x20, 0xff, - 0x49, 0x17, 0x68, 0x09, 0x31, 0x20, 0x76, 0x08, - 0x20, 0xff, 0x49, 0x15, 0x68, 0x09, 0x31, 0x60, - 0x76, 0x08, 0x20, 0x00, 0x49, 0x12, 0x68, 0x09, - 0x31, 0x40, 0x72, 0x88, 0x20, 0x00, 0x49, 0x10, - 0x68, 0x09, 0x31, 0x40, 0x76, 0x88, 0x20, 0x00, - 0x49, 0x0d, 0x68, 0x09, 0x31, 0x60, 0x72, 0x88, - 0x20, 0x00, 0x49, 0x0b, 0x68, 0x09, 0x31, 0x20, - 0x72, 0x88, 0x20, 0x00, 0x49, 0x08, 0x68, 0x09, - 0x31, 0x20, 0x76, 0x88, 0x20, 0x00, 0x49, 0x06, - 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x20, 0x00, - 0x49, 0x03, 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, - 0x20, 0x00, 0xe6, 0x85, 0xe6, 0x84, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0x4c, 0x62, 0x00, 0x03, 0x00, - 0x66, 0x00, 0x01, 0x00, 0xa0, 0x00, 0x0d, 0x80, - 0x2e, 0x08, 0x20, 0x10, 0x66, 0x00, 0x00, 0x08, - 0x2e, 0x01, 0x84, 0x8c, 0xdf, 0xff, 0xff, 0xff, - 0x62, 0x01, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x50, - 0xfc, 0xb7, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, - 0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, + 0x2e, 0x08, 0x5e, 0x0c, 0x2e, 0x08, 0x5e, 0x10, + 0x2e, 0x08, 0x5e, 0x14, 0x2e, 0x08, 0x5e, 0x18, + 0x2e, 0x08, 0x5e, 0x1c, 0x2e, 0x08, 0x5e, 0x20, + 0x2e, 0x08, 0x5e, 0x24, 0x2e, 0x08, 0x5e, 0x28, + 0x2e, 0x08, 0x5d, 0xb0, 0x2e, 0x08, 0x5d, 0xb4, + 0x2e, 0x08, 0x7c, 0x44, 0x2e, 0x08, 0x5e, 0x54, + 0x2e, 0x08, 0x5e, 0x34, 0x2e, 0x08, 0x60, 0x74, + 0x2e, 0x08, 0x7c, 0x1c, 0xcc, 0x1f, 0xe0, 0x00, + 0xcc, 0x1f, 0xfe, 0x00, 0x2e, 0x08, 0x5e, 0x40, + 0x2e, 0x08, 0x5e, 0x58, 0x2e, 0x08, 0x5e, 0x38, + 0x2e, 0x08, 0x5e, 0x3c, 0x2e, 0x08, 0x7c, 0x40, + 0x2e, 0x08, 0x7c, 0x18, 0x2e, 0x08, 0x5e, 0x48, + 0x49, 0x4f, 0x68, 0x0a, 0x23, 0x04, 0x43, 0x1a, + 0x60, 0x0a, 0x21, 0xff, 0x4a, 0x4d, 0x68, 0x12, + 0x32, 0x40, 0x72, 0x11, 0x21, 0xff, 0x4a, 0x4b, + 0x68, 0x12, 0x32, 0x40, 0x76, 0x11, 0x21, 0xff, + 0x4a, 0x48, 0x68, 0x12, 0x32, 0x60, 0x72, 0x11, + 0x21, 0xff, 0x4a, 0x46, 0x68, 0x12, 0x32, 0x20, + 0x72, 0x11, 0x21, 0xff, 0x4a, 0x43, 0x68, 0x12, + 0x32, 0x20, 0x76, 0x11, 0x21, 0xff, 0x4a, 0x41, + 0x68, 0x12, 0x32, 0x60, 0x76, 0x11, 0x21, 0x00, + 0x4a, 0x3e, 0x68, 0x12, 0x32, 0x40, 0x72, 0x91, + 0x21, 0x00, 0x4a, 0x3c, 0x68, 0x12, 0x32, 0x40, + 0x76, 0x91, 0x21, 0x00, 0x4a, 0x39, 0x68, 0x12, + 0x32, 0x60, 0x72, 0x91, 0x21, 0x00, 0x4a, 0x37, + 0x68, 0x12, 0x32, 0x20, 0x72, 0x91, 0x21, 0x00, + 0x4a, 0x34, 0x68, 0x12, 0x32, 0x20, 0x76, 0x91, + 0x21, 0x00, 0x4a, 0x32, 0x68, 0x12, 0x32, 0x60, + 0x76, 0x91, 0x21, 0x00, 0x4a, 0x2f, 0x68, 0x12, + 0x32, 0x80, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x2d, + 0x68, 0x12, 0x32, 0x80, 0x70, 0x51, 0x21, 0x00, + 0x4a, 0x2a, 0x68, 0x12, 0x32, 0x80, 0x70, 0x91, + 0x21, 0x00, 0x4a, 0x29, 0x60, 0x11, 0x21, 0x00, + 0x4a, 0x28, 0x64, 0x11, 0x21, 0x03, 0x4a, 0x28, + 0x61, 0x11, 0x49, 0x28, 0x68, 0x0a, 0x4b, 0x28, + 0x43, 0x1a, 0x60, 0x0a, 0x49, 0x26, 0x22, 0x33, + 0x06, 0x52, 0x60, 0x51, 0x21, 0x00, 0x4a, 0x25, + 0x70, 0x11, 0x21, 0x00, 0x4a, 0x23, 0x70, 0x51, + 0x21, 0x00, 0x4a, 0x22, 0x70, 0x91, 0x21, 0x00, + 0x4a, 0x20, 0x70, 0xd1, 0x21, 0x00, 0x4a, 0x1f, + 0x71, 0x11, 0x21, 0x00, 0x4a, 0x1d, 0x71, 0x51, + 0x21, 0x00, 0x4a, 0x1c, 0x71, 0x91, 0x21, 0x00, + 0x4a, 0x1a, 0x71, 0xd1, 0x21, 0x00, 0x4a, 0x19, + 0x72, 0x11, 0x21, 0x00, 0x4a, 0x17, 0x72, 0x51, + 0x21, 0x00, 0x4a, 0x16, 0x72, 0x91, 0x21, 0x00, + 0x4a, 0x14, 0x72, 0xd1, 0x21, 0x00, 0x4a, 0x13, + 0x73, 0x11, 0x21, 0xff, 0x4a, 0x11, 0x70, 0x11, + 0x21, 0x00, 0x4a, 0x10, 0x70, 0x11, 0x21, 0x00, + 0x4a, 0x0e, 0x70, 0x51, 0x20, 0x00, 0x28, 0x20, + 0xdb, 0x04, 0xe0, 0x08, 0x1c, 0x41, 0x06, 0x08, + 0x0e, 0x00, 0xe7, 0xf8, 0x21, 0xff, 0x4a, 0x03, + 0x68, 0x12, 0x54, 0x11, 0xe7, 0xf6, 0x47, 0x70, + 0x66, 0x00, 0x01, 0x18, 0x2e, 0x08, 0x7c, 0x44, 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, - 0xb5, 0xf7, 0x1c, 0x17, 0x98, 0x00, 0x06, 0x02, - 0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d, - 0x48, 0x6a, 0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, - 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x03, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, - 0x20, 0x4b, 0xe7, 0xf7, 0x48, 0x64, 0x69, 0x80, - 0x28, 0x00, 0xd1, 0x03, 0x29, 0x04, 0xd1, 0x01, - 0x20, 0x58, 0xe7, 0xef, 0x48, 0x60, 0x69, 0x80, - 0x28, 0x00, 0xd1, 0x03, 0x29, 0x02, 0xd0, 0x01, - 0x29, 0x03, 0xd1, 0x0b, 0x48, 0x5c, 0x69, 0x80, - 0x28, 0x02, 0xd1, 0x01, 0x29, 0x00, 0xd1, 0x05, - 0x48, 0x59, 0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, - 0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d, 0xe7, 0xd9, - 0x29, 0x02, 0xd1, 0x05, 0x48, 0x53, 0x68, 0x00, - 0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x17, - 0x29, 0x03, 0xd1, 0x05, 0x48, 0x4f, 0x68, 0x00, - 0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0f, - 0x29, 0x00, 0xd1, 0x05, 0x48, 0x4b, 0x68, 0x00, - 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x07, - 0x29, 0x01, 0xd1, 0x07, 0x48, 0x47, 0x68, 0x00, - 0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x01, - 0x20, 0x4e, 0xe7, 0xb7, 0x68, 0x78, 0x28, 0x00, - 0xd1, 0x01, 0x20, 0x4c, 0xe7, 0xb2, 0x23, 0x01, - 0x01, 0x08, 0x4e, 0x40, 0x68, 0x36, 0x19, 0x80, - 0x30, 0x20, 0x72, 0x83, 0x2d, 0x01, 0xd1, 0x0b, - 0x20, 0x33, 0x06, 0x40, 0x6e, 0x40, 0x23, 0x0d, - 0x06, 0x9b, 0x1a, 0xc0, 0x00, 0xd3, 0x4e, 0x3b, - 0x68, 0x36, 0x19, 0x9b, 0x60, 0x58, 0xe0, 0x12, - 0x2d, 0x02, 0xd1, 0x0a, 0x48, 0x38, 0x6c, 0xc0, - 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc3, 0x00, 0xd0, - 0x4e, 0x34, 0x68, 0x36, 0x19, 0x80, 0x60, 0x43, - 0xe0, 0x05, 0x68, 0x3b, 0x00, 0xd0, 0x4e, 0x31, - 0x68, 0x36, 0x19, 0x80, 0x60, 0x43, 0x68, 0x3b, - 0x01, 0x08, 0x4e, 0x2c, 0x68, 0x36, 0x19, 0x80, - 0x62, 0x03, 0x68, 0x7b, 0x01, 0x08, 0x4e, 0x29, - 0x68, 0x36, 0x19, 0x80, 0x62, 0x43, 0x01, 0x08, - 0x4b, 0x26, 0x68, 0x1b, 0x18, 0xc0, 0x62, 0xc7, - 0x01, 0x08, 0x4b, 0x24, 0x68, 0x1b, 0x18, 0xc0, - 0x30, 0x20, 0x72, 0x45, 0x01, 0x08, 0x4b, 0x21, - 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x02, - 0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78, - 0x20, 0x00, 0x4b, 0x20, 0x60, 0x18, 0x20, 0x00, - 0x4b, 0x1f, 0x64, 0x18, 0x01, 0x08, 0x4b, 0x19, - 0x68, 0x1b, 0x18, 0xc0, 0x6a, 0x40, 0x28, 0xbc, - 0xdd, 0x01, 0x24, 0xbc, 0xe0, 0x04, 0x01, 0x08, - 0x4b, 0x14, 0x68, 0x1b, 0x18, 0xc0, 0x6a, 0x44, - 0x48, 0x18, 0x60, 0x04, 0x29, 0x01, 0xd1, 0x14, - 0x20, 0x01, 0x4b, 0x17, 0x62, 0x98, 0x48, 0x17, - 0x68, 0x03, 0x04, 0x1b, 0x0c, 0x1b, 0x60, 0x03, - 0x48, 0x14, 0x04, 0x23, 0x68, 0x06, 0x43, 0x33, - 0x60, 0x03, 0x48, 0x13, 0x68, 0x06, 0x23, 0x20, - 0x43, 0x33, 0x60, 0x03, 0x20, 0x01, 0x4b, 0x0e, - 0x63, 0x18, 0x48, 0x07, 0x69, 0x80, 0x28, 0x00, - 0xd1, 0x04, 0x48, 0x0e, 0x68, 0x06, 0x23, 0x28, - 0x43, 0x33, 0x60, 0x03, 0x20, 0x00, 0xe7, 0x31, - 0xe7, 0x30, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x4c, - 0x66, 0x00, 0x01, 0x00, 0x2e, 0x08, 0x5d, 0xdc, - 0x66, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x0a, 0x00, - 0x9e, 0x00, 0x0a, 0x80, 0x62, 0x00, 0x03, 0x00, - 0x62, 0x01, 0x00, 0x00, 0x62, 0x01, 0x00, 0x20, - 0x62, 0x01, 0x00, 0x24, 0x64, 0x00, 0x00, 0x60, - 0xb5, 0xf3, 0x1c, 0x0f, 0x98, 0x00, 0x06, 0x06, - 0x0e, 0x36, 0xb0, 0x82, 0x4d, 0x68, 0x49, 0x69, - 0x91, 0x01, 0x48, 0x69, 0x68, 0x00, 0x5d, 0x84, - 0x2e, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x02, - 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, 0xb0, 0x02, - 0xe7, 0xf6, 0x48, 0x62, 0x69, 0x80, 0x28, 0x00, - 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, - 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, 0x48, 0x5d, - 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, - 0xd1, 0x05, 0x48, 0x5a, 0x69, 0x80, 0x28, 0x01, - 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, 0x20, 0x4d, - 0xb0, 0x02, 0xe7, 0xdd, 0x48, 0x54, 0x68, 0x00, - 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x02, - 0x20, 0x4f, 0xb0, 0x02, 0xe7, 0xd4, 0x48, 0x50, - 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, - 0xd0, 0x02, 0x20, 0x50, 0xb0, 0x02, 0xe7, 0xcb, - 0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c, - 0xb0, 0x02, 0xe7, 0xc5, 0x2c, 0x04, 0xd1, 0x08, - 0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xff, 0xac, - 0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x02, - 0xe7, 0xba, 0x48, 0x43, 0x68, 0x00, 0x30, 0x80, - 0x78, 0x80, 0x21, 0x01, 0x40, 0x81, 0x48, 0x41, - 0x68, 0x40, 0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, - 0xd0, 0x02, 0x20, 0x51, 0xb0, 0x02, 0xe7, 0xab, - 0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x00, - 0x23, 0x04, 0x40, 0x18, 0xd0, 0x02, 0x20, 0x52, - 0xb0, 0x02, 0xe7, 0xa1, 0x2c, 0x00, 0xd1, 0x04, - 0x48, 0x37, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19, - 0x60, 0x01, 0x20, 0x01, 0x49, 0x32, 0x68, 0x09, - 0x31, 0x60, 0x76, 0x88, 0x68, 0x38, 0x49, 0x30, - 0x68, 0x09, 0x67, 0x08, 0x68, 0x78, 0x49, 0x2e, - 0x68, 0x09, 0x67, 0x48, 0x48, 0x2c, 0x68, 0x00, - 0x67, 0xc7, 0x20, 0x00, 0x49, 0x2a, 0x68, 0x09, - 0x31, 0x60, 0x76, 0x48, 0x48, 0x28, 0x68, 0x00, - 0x30, 0x60, 0x76, 0x06, 0x20, 0x00, 0x60, 0x78, - 0x20, 0x00, 0x72, 0x78, 0x48, 0x24, 0x68, 0x00, - 0x5d, 0x80, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x01, - 0x49, 0x24, 0x62, 0x88, 0x98, 0x00, 0x01, 0x00, - 0x19, 0x45, 0x48, 0x1f, 0x68, 0x00, 0x6f, 0x40, - 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x20, 0x60, 0xa8, - 0x20, 0xbc, 0x49, 0x1b, 0x68, 0x09, 0x31, 0x80, - 0x70, 0x08, 0xe0, 0x0d, 0x48, 0x18, 0x68, 0x00, - 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, - 0x60, 0xa8, 0x48, 0x15, 0x68, 0x00, 0x6f, 0x40, - 0x49, 0x13, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, - 0x48, 0x11, 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, - 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 0x99, 0x01, - 0x18, 0x41, 0x91, 0x01, 0x48, 0x0c, 0x68, 0x00, - 0x6f, 0x00, 0x60, 0x28, 0x99, 0x01, 0x1d, 0x08, - 0x60, 0x68, 0x20, 0x01, 0x06, 0x00, 0x60, 0xe8, - 0x99, 0x00, 0x20, 0x01, 0x40, 0x88, 0x21, 0x33, - 0x06, 0x49, 0x63, 0x48, 0x20, 0x00, 0xb0, 0x02, - 0xe7, 0x3a, 0xb0, 0x02, 0xe7, 0x38, 0x00, 0x00, - 0x9e, 0x00, 0x09, 0x80, 0x9e, 0x00, 0x0b, 0x80, - 0x2e, 0x08, 0x7c, 0x4c, 0x66, 0x00, 0x01, 0x00, - 0x62, 0x00, 0x00, 0x1c, 0x62, 0x01, 0x00, 0x00, - 0x40, 0x00, 0x00, 0xbc, 0xb5, 0xf3, 0x1c, 0x0f, - 0xb0, 0x81, 0x98, 0x01, 0x06, 0x00, 0x0e, 0x00, - 0x90, 0x00, 0xb0, 0x82, 0x48, 0xf9, 0x68, 0x00, - 0x99, 0x02, 0x5c, 0x44, 0x98, 0x02, 0x28, 0x20, - 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x03, 0xb0, 0x02, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, - 0xd1, 0x02, 0x20, 0x4b, 0xb0, 0x03, 0xe7, 0xf6, - 0x48, 0xf1, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, - 0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, - 0x2c, 0x04, 0xd1, 0x0b, 0x48, 0xec, 0x69, 0x80, - 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, - 0x48, 0xe9, 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, - 0x2c, 0x01, 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x03, - 0xe7, 0xdd, 0x48, 0xe4, 0x68, 0x00, 0x30, 0x60, - 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, - 0xb0, 0x03, 0xe7, 0xd4, 0x68, 0x78, 0x28, 0x00, - 0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x03, 0xe7, 0xce, - 0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc, - 0xf0, 0x01, 0xfe, 0xce, 0x29, 0x00, 0xd0, 0x02, - 0x20, 0x59, 0xb0, 0x03, 0xe7, 0xc3, 0x48, 0xd7, - 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, - 0xd0, 0x02, 0x20, 0x50, 0xb0, 0x03, 0xe7, 0xba, - 0x2c, 0x00, 0xd1, 0x04, 0x48, 0xd3, 0x68, 0x01, - 0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x48, 0xd2, - 0x68, 0x01, 0x23, 0x8d, 0x05, 0x9b, 0x43, 0x19, - 0x60, 0x01, 0x48, 0xd0, 0x21, 0x33, 0x06, 0x49, - 0x60, 0x48, 0x20, 0x01, 0x49, 0xc9, 0x68, 0x09, - 0x31, 0x60, 0x76, 0x88, 0x68, 0x38, 0x49, 0xc7, - 0x68, 0x09, 0x67, 0x08, 0x68, 0x78, 0x49, 0xc5, - 0x68, 0x09, 0x67, 0x48, 0x48, 0xc3, 0x68, 0x00, - 0x67, 0xc7, 0x20, 0x00, 0x49, 0xc1, 0x68, 0x09, - 0x31, 0x60, 0x76, 0x48, 0x98, 0x02, 0x49, 0xbf, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x48, + 0xb4, 0x80, 0x1c, 0x07, 0x1c, 0x0a, 0x06, 0x39, + 0x0e, 0x09, 0x29, 0x05, 0xd2, 0x40, 0xa3, 0x02, + 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, + 0x03, 0x14, 0x07, 0x0d, 0x13, 0x00, 0x78, 0x10, + 0x4b, 0x1f, 0x70, 0x18, 0xe0, 0x38, 0x78, 0x50, + 0x4b, 0x1e, 0x68, 0x1b, 0x33, 0x80, 0x71, 0x58, + 0xe0, 0x32, 0x78, 0x10, 0x4b, 0x1b, 0x68, 0x1b, + 0x33, 0x80, 0x71, 0x18, 0xe0, 0x2c, 0xe0, 0x2b, + 0x78, 0x10, 0x4b, 0x17, 0x70, 0x18, 0x78, 0x50, + 0x4b, 0x15, 0x70, 0x58, 0x78, 0x90, 0x4b, 0x14, + 0x70, 0x98, 0x78, 0xd0, 0x4b, 0x12, 0x70, 0xd8, + 0x79, 0x10, 0x4b, 0x11, 0x71, 0x18, 0x79, 0x50, + 0x4b, 0x0f, 0x71, 0x58, 0x79, 0x90, 0x4b, 0x0e, + 0x71, 0x98, 0x79, 0xd0, 0x4b, 0x0c, 0x71, 0xd8, + 0x7a, 0x10, 0x4b, 0x0b, 0x72, 0x18, 0x7a, 0x50, + 0x4b, 0x09, 0x72, 0x58, 0x7a, 0x90, 0x4b, 0x08, + 0x72, 0x98, 0x7a, 0xd0, 0x4b, 0x06, 0x72, 0xd8, + 0x7b, 0x10, 0x4b, 0x05, 0x73, 0x18, 0xe0, 0x03, + 0x20, 0x4a, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xff, + 0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0x48, 0x2e, 0x08, 0x7c, 0x44, + 0xb5, 0xf3, 0x1c, 0x07, 0x06, 0x3e, 0x0e, 0x36, + 0x99, 0x01, 0x06, 0x0c, 0x0e, 0x24, 0x2e, 0x20, + 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0xb8, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x39, 0x48, 0xb5, 0x68, 0x00, + 0x30, 0x20, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x33, + 0x2c, 0x00, 0xd1, 0x17, 0x48, 0xb1, 0x68, 0x00, + 0x30, 0x40, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x2b, + 0x48, 0xae, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x25, 0x48, 0xab, 0x68, 0x00, + 0x30, 0x60, 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x1f, + 0x48, 0xa8, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x19, 0x2c, 0x01, 0xd1, 0x19, + 0x48, 0xa4, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x11, 0x48, 0xa1, 0x68, 0x00, + 0x30, 0x40, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x0b, + 0x48, 0x9e, 0x68, 0x00, 0x30, 0x60, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x48, 0x9b, 0x68, 0x00, + 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x01, + 0x20, 0x49, 0xe7, 0xb3, 0x48, 0x97, 0x68, 0x00, + 0x55, 0x84, 0x2c, 0xff, 0xd0, 0x73, 0x20, 0x01, + 0x49, 0x95, 0x60, 0x48, 0x2c, 0x05, 0xd2, 0x6f, + 0xa3, 0x01, 0x5d, 0x1b, 0x00, 0x5b, 0x44, 0x9f, + 0x02, 0x34, 0x30, 0x30, 0x30, 0x00, 0x20, 0x02, + 0x49, 0x90, 0x61, 0x88, 0x48, 0x90, 0x6a, 0xc0, + 0x49, 0x90, 0x60, 0x08, 0x48, 0x90, 0x68, 0x01, + 0x23, 0x01, 0x07, 0x5b, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x8e, 0x49, 0x8b, 0x62, 0xc8, 0x48, 0x8c, + 0x68, 0x01, 0x4b, 0x8d, 0x40, 0x19, 0x60, 0x01, + 0x20, 0x01, 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, + 0x20, 0x15, 0x21, 0x31, 0x06, 0x49, 0x61, 0x08, + 0x20, 0x0f, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, + 0x20, 0x0c, 0x21, 0x31, 0x06, 0x49, 0x61, 0xc8, + 0x20, 0x54, 0x21, 0x31, 0x06, 0x49, 0x62, 0xc8, + 0x20, 0x37, 0x21, 0x31, 0x06, 0x49, 0x60, 0x88, + 0xe0, 0x56, 0x20, 0x00, 0x49, 0x79, 0x61, 0x88, + 0xe0, 0x52, 0x20, 0x01, 0x49, 0x77, 0x61, 0x88, + 0x20, 0x01, 0x49, 0x7c, 0x62, 0x88, 0x48, 0x7c, + 0x78, 0x00, 0x06, 0x80, 0x0e, 0x80, 0x02, 0x80, + 0x49, 0x79, 0x78, 0x49, 0x07, 0xc9, 0x0d, 0x89, + 0x43, 0x08, 0x49, 0x77, 0x78, 0x89, 0x07, 0xc9, + 0x0d, 0xc9, 0x43, 0x08, 0x49, 0x74, 0x78, 0xc9, + 0x07, 0x89, 0x0f, 0x89, 0x01, 0x89, 0x43, 0x08, + 0x49, 0x71, 0x79, 0x09, 0x07, 0x89, 0x0f, 0x89, + 0x01, 0x09, 0x43, 0x08, 0x49, 0x6e, 0x79, 0x49, + 0x07, 0x89, 0x0f, 0x89, 0x00, 0x89, 0x43, 0x08, + 0x49, 0x6b, 0x79, 0x89, 0x07, 0x89, 0x0f, 0x89, + 0x43, 0x08, 0x49, 0x68, 0x62, 0x08, 0x48, 0x68, + 0x79, 0xc0, 0x07, 0xc0, 0x0e, 0x40, 0x49, 0x66, + 0x7a, 0x09, 0x07, 0xc9, 0xe0, 0x01, 0xe0, 0x21, + 0xe0, 0x18, 0x0e, 0xc9, 0x43, 0x08, 0x49, 0x62, + 0x7a, 0x49, 0x07, 0xc9, 0x0f, 0x09, 0x43, 0x08, + 0x49, 0x5f, 0x7a, 0x89, 0x07, 0xc9, 0x0f, 0x49, + 0x43, 0x08, 0x49, 0x5d, 0x7a, 0xc9, 0x07, 0xc9, + 0x0f, 0x89, 0x43, 0x08, 0x49, 0x5a, 0x7b, 0x09, + 0x07, 0xc9, 0x0f, 0xc9, 0x43, 0x08, 0x49, 0x57, + 0x62, 0x48, 0xe0, 0x01, 0x20, 0x4a, 0xe7, 0x1d, + 0x48, 0x51, 0x68, 0x01, 0x4b, 0x55, 0x40, 0x19, + 0x60, 0x01, 0xe0, 0x8f, 0x48, 0x49, 0x68, 0x00, + 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x08, + 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x30, 0x23, 0x00, + 0x22, 0x00, 0x49, 0x4f, 0xf7, 0xf4, 0xfc, 0x10, + 0xb0, 0x01, 0x20, 0x00, 0x49, 0x42, 0x60, 0x48, + 0x48, 0x45, 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, + 0x60, 0x01, 0x48, 0x4a, 0x21, 0x33, 0x06, 0x49, + 0x60, 0x48, 0x48, 0x49, 0x68, 0x01, 0x23, 0x04, + 0x43, 0x19, 0x60, 0x01, 0x2c, 0x00, 0xd1, 0x0e, + 0x48, 0x3c, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x0a, + 0x48, 0x3a, 0x68, 0x00, 0x49, 0x38, 0x62, 0xc8, + 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, + 0x21, 0x31, 0x06, 0x49, 0x61, 0x88, 0x20, 0x00, + 0x49, 0x30, 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, + 0x20, 0x00, 0x49, 0x2e, 0x68, 0x09, 0x31, 0x80, + 0x70, 0x88, 0x20, 0x00, 0x49, 0x39, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x39, 0x64, 0x08, 0x20, 0x03, + 0x49, 0x2a, 0x61, 0x08, 0x25, 0x00, 0x2d, 0x20, + 0xd3, 0x02, 0xe0, 0x06, 0x35, 0x01, 0xe7, 0xfa, + 0x20, 0xff, 0x49, 0x24, 0x68, 0x09, 0x55, 0x48, + 0xe7, 0xf8, 0x20, 0xff, 0x49, 0x21, 0x68, 0x09, + 0x31, 0x40, 0x72, 0x08, 0x20, 0xff, 0x49, 0x1f, + 0x68, 0x09, 0x31, 0x40, 0x76, 0x08, 0x20, 0xff, + 0x49, 0x1c, 0x68, 0x09, 0x31, 0x60, 0x72, 0x08, + 0x20, 0xff, 0x49, 0x1a, 0x68, 0x09, 0x31, 0x20, + 0x72, 0x08, 0x20, 0xff, 0x49, 0x17, 0x68, 0x09, + 0x31, 0x20, 0x76, 0x08, 0x20, 0xff, 0x49, 0x15, 0x68, 0x09, 0x31, 0x60, 0x76, 0x08, 0x20, 0x00, - 0x49, 0xbc, 0x68, 0x09, 0x6f, 0xc9, 0x60, 0x48, - 0x20, 0x00, 0x49, 0xba, 0x68, 0x09, 0x6f, 0xc9, - 0x72, 0x48, 0x48, 0xb8, 0x68, 0x00, 0x99, 0x02, - 0x5c, 0x40, 0x28, 0x01, 0xd1, 0x02, 0x20, 0x01, - 0x49, 0xb9, 0x62, 0x88, 0x48, 0xb3, 0x68, 0x00, - 0x30, 0x80, 0x78, 0x81, 0x20, 0x01, 0x40, 0x88, - 0x49, 0xb1, 0x68, 0x49, 0x40, 0x08, 0x07, 0x80, - 0x0f, 0x80, 0xd0, 0x1b, 0x20, 0x00, 0x49, 0xad, - 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x20, 0x51, - 0x49, 0xaa, 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, - 0x48, 0xa8, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, - 0x28, 0xff, 0xd0, 0x07, 0x48, 0xa5, 0x68, 0x00, - 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, - 0xf0, 0x05, 0xfd, 0x8e, 0x20, 0x51, 0xb0, 0x03, - 0xe7, 0x55, 0xe1, 0x6c, 0x20, 0x33, 0x06, 0x40, - 0x6b, 0x81, 0x91, 0x00, 0x99, 0x00, 0x20, 0x04, - 0x40, 0x08, 0xd0, 0x07, 0x20, 0x04, 0xf0, 0x00, - 0xfc, 0xb3, 0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, - 0x91, 0x00, 0xe7, 0xf3, 0x4d, 0x9d, 0x99, 0x00, - 0x01, 0x08, 0x19, 0x45, 0x48, 0x95, 0x68, 0x00, - 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x9a, - 0x60, 0xa8, 0x20, 0xbc, 0x49, 0x91, 0x68, 0x09, - 0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d, 0x48, 0x8f, - 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, - 0x43, 0x18, 0x60, 0xa8, 0x48, 0x8b, 0x68, 0x00, - 0x6f, 0x40, 0x49, 0x8a, 0x68, 0x09, 0x31, 0x80, - 0x70, 0x08, 0x48, 0x90, 0x90, 0x01, 0x48, 0x87, - 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x00, 0x43, - 0x18, 0x18, 0x01, 0x80, 0x99, 0x01, 0x18, 0x40, - 0x90, 0x01, 0x48, 0x82, 0x68, 0x00, 0x6f, 0x00, - 0x60, 0x28, 0x98, 0x01, 0x30, 0x04, 0x60, 0x68, - 0x20, 0x01, 0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, - 0x20, 0x01, 0x40, 0x88, 0x21, 0x33, 0x06, 0x49, - 0x63, 0x48, 0x48, 0x83, 0x6b, 0x00, 0x23, 0x01, - 0x06, 0x1b, 0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, - 0xf0, 0x00, 0xfc, 0x6a, 0xe7, 0xf5, 0x20, 0x01, - 0x06, 0x00, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, - 0x4e, 0x7c, 0x48, 0x72, 0x68, 0x00, 0x30, 0x80, - 0x78, 0x80, 0x01, 0x00, 0x19, 0x86, 0x98, 0x01, - 0x30, 0x04, 0x60, 0x30, 0x48, 0x78, 0x60, 0x70, - 0x48, 0x6c, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00, - 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xb0, - 0x20, 0x01, 0x05, 0x80, 0x60, 0xf0, 0x48, 0x67, - 0x68, 0x00, 0x30, 0x80, 0x78, 0x81, 0x20, 0x01, - 0x40, 0x88, 0x49, 0x65, 0x60, 0xc8, 0x48, 0x63, - 0x68, 0x00, 0x30, 0x60, 0x7e, 0x00, 0x49, 0x61, - 0x68, 0x09, 0x5c, 0x08, 0x28, 0x00, 0xd0, 0x48, - 0x28, 0x01, 0xd0, 0x47, 0x28, 0x02, 0xd0, 0x02, - 0x28, 0x03, 0xd0, 0x21, 0xe0, 0x5a, 0x48, 0x67, - 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, - 0x48, 0x58, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x57, - 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, - 0x28, 0xbc, 0xd8, 0x05, 0x48, 0x5f, 0x68, 0x01, - 0x23, 0x10, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, - 0x48, 0x5c, 0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, - 0x40, 0x19, 0x60, 0x01, 0x48, 0x59, 0x68, 0x01, - 0x23, 0x08, 0x43, 0x19, 0x60, 0x01, 0xe0, 0x39, - 0x48, 0x56, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, - 0x60, 0x01, 0x48, 0x48, 0x68, 0x00, 0x6f, 0x40, - 0x49, 0x46, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, - 0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05, 0x48, 0x4f, - 0x68, 0x01, 0x23, 0x10, 0x43, 0x19, 0x60, 0x01, - 0xe0, 0x05, 0x48, 0x4c, 0x68, 0x01, 0x23, 0x10, - 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x48, 0x49, - 0x68, 0x01, 0x23, 0x08, 0x43, 0x19, 0x60, 0x01, - 0xe0, 0x18, 0xe0, 0x17, 0x48, 0x46, 0x68, 0x01, - 0x04, 0x09, 0x0c, 0x09, 0x60, 0x01, 0x48, 0x44, - 0x49, 0x36, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, - 0x04, 0x09, 0x68, 0x02, 0x43, 0x11, 0x60, 0x01, - 0x48, 0x40, 0x68, 0x01, 0x23, 0x20, 0x43, 0xdb, - 0x40, 0x19, 0x60, 0x01, 0x20, 0x01, 0x49, 0x34, - 0x63, 0x08, 0xe7, 0xff, 0x48, 0x36, 0x6b, 0x00, - 0x23, 0x01, 0x05, 0x9b, 0x40, 0x18, 0xd1, 0x03, - 0x20, 0x04, 0xf0, 0x00, 0xfb, 0xd1, 0xe7, 0xf5, - 0x20, 0x01, 0x05, 0x80, 0x21, 0x33, 0x06, 0x49, - 0x60, 0x48, 0x48, 0x26, 0x68, 0x00, 0x30, 0x80, - 0x78, 0x80, 0x23, 0x01, 0x40, 0x58, 0x49, 0x23, - 0x68, 0x09, 0x31, 0x80, 0x70, 0x88, 0x48, 0x21, - 0x68, 0x00, 0x6f, 0x40, 0x49, 0x1f, 0x68, 0x09, - 0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x49, 0x1d, - 0x68, 0x09, 0x67, 0x48, 0x48, 0x1b, 0x68, 0x00, - 0x6f, 0xc0, 0x30, 0x04, 0x49, 0x19, 0x68, 0x09, - 0x31, 0x80, 0x78, 0x09, 0x68, 0x02, 0x18, 0x89, - 0x60, 0x01, 0x48, 0x16, 0x68, 0x00, 0x6f, 0x00, - 0x49, 0x14, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, - 0x18, 0x40, 0x49, 0x12, 0x68, 0x09, 0x67, 0x08, - 0x48, 0x10, 0x68, 0x00, 0x6f, 0x40, 0x28, 0x00, - 0xd0, 0x00, 0xe6, 0xb3, 0x48, 0x11, 0x21, 0x33, - 0x06, 0x49, 0x60, 0x48, 0x48, 0x0e, 0x68, 0x01, - 0x4b, 0x19, 0x40, 0x19, 0x60, 0x01, 0x20, 0x48, - 0x49, 0x08, 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, + 0x49, 0x12, 0x68, 0x09, 0x31, 0x40, 0x72, 0x88, + 0x20, 0x00, 0x49, 0x10, 0x68, 0x09, 0x31, 0x40, + 0x76, 0x88, 0x20, 0x00, 0x49, 0x0d, 0x68, 0x09, + 0x31, 0x60, 0x72, 0x88, 0x20, 0x00, 0x49, 0x0b, + 0x68, 0x09, 0x31, 0x20, 0x72, 0x88, 0x20, 0x00, + 0x49, 0x08, 0x68, 0x09, 0x31, 0x20, 0x76, 0x88, 0x20, 0x00, 0x49, 0x06, 0x68, 0x09, 0x31, 0x60, - 0x76, 0x88, 0x48, 0x04, 0x68, 0x00, 0x6f, 0xc0, - 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x29, 0x48, 0x01, - 0xe0, 0x20, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x4c, - 0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c, - 0x66, 0x00, 0x00, 0x08, 0x23, 0x48, 0x00, 0x00, - 0x62, 0x01, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, - 0x40, 0x00, 0x00, 0xbc, 0x9e, 0x00, 0x0b, 0x80, - 0x66, 0x00, 0x00, 0x80, 0x9e, 0x00, 0x09, 0xc0, - 0x66, 0x00, 0x01, 0xf0, 0x64, 0x00, 0x00, 0x60, - 0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24, - 0xfc, 0xb7, 0xff, 0xff, 0x68, 0x00, 0x6f, 0xc0, - 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, - 0xfc, 0x23, 0x20, 0x00, 0xb0, 0x03, 0xe5, 0xea, - 0xb0, 0x02, 0xb0, 0x01, 0xe5, 0xe7, 0xe5, 0xe6, - 0xb5, 0xb0, 0x1c, 0x07, 0x06, 0x3d, 0x0e, 0x2d, - 0x48, 0x5d, 0x68, 0x00, 0x5d, 0x44, 0x2d, 0x20, - 0xdb, 0x03, 0x20, 0xa2, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x48, 0x59, 0x68, 0x00, 0x5d, 0x40, - 0x28, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf5, - 0x48, 0x56, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, - 0x2c, 0x02, 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, - 0x2c, 0x04, 0xd1, 0x0b, 0x48, 0x51, 0x69, 0x80, - 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, - 0x48, 0x4e, 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, - 0x2c, 0x01, 0xd0, 0x02, 0x20, 0x4d, 0xe7, 0xdd, - 0xe0, 0x90, 0x48, 0x4b, 0x68, 0x01, 0x4b, 0x4b, - 0x43, 0x19, 0x60, 0x01, 0x48, 0x49, 0x21, 0x33, - 0x06, 0x49, 0x60, 0x48, 0x48, 0x48, 0x68, 0x01, - 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x20, 0x00, - 0x49, 0x41, 0x68, 0x09, 0x31, 0x80, 0x70, 0x88, - 0x20, 0x00, 0x49, 0x3f, 0x68, 0x09, 0x31, 0x80, - 0x70, 0x48, 0x20, 0xff, 0x49, 0x3c, 0x68, 0x09, - 0x55, 0x48, 0x2c, 0x00, 0xd1, 0x03, 0x20, 0x18, - 0x21, 0x31, 0x06, 0x49, 0x62, 0x48, 0x01, 0x20, - 0x49, 0x37, 0x68, 0x09, 0x18, 0x40, 0x30, 0x20, - 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x28, 0x20, 0x00, - 0x49, 0x38, 0x60, 0x08, 0x20, 0x00, 0x49, 0x38, - 0x64, 0x08, 0x20, 0x03, 0x49, 0x31, 0x61, 0x08, - 0x21, 0x55, 0x01, 0x20, 0x4a, 0x2e, 0x68, 0x12, - 0x18, 0x80, 0x6a, 0xc0, 0x72, 0x41, 0x21, 0x00, - 0x01, 0x20, 0x4a, 0x2b, 0x68, 0x12, 0x18, 0x80, - 0x30, 0x20, 0x72, 0x81, 0x01, 0x20, 0x49, 0x28, - 0x68, 0x09, 0x18, 0x40, 0x6a, 0xc0, 0x7a, 0x00, - 0x28, 0xff, 0xd0, 0x09, 0x01, 0x20, 0x49, 0x24, - 0x68, 0x09, 0x18, 0x40, 0x6a, 0xc0, 0x7a, 0x01, - 0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfb, 0x9c, - 0x48, 0x1f, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, - 0x28, 0x00, 0xd0, 0x2b, 0x48, 0x1c, 0x68, 0x00, - 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x0d, - 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 0x31, 0x80, - 0x70, 0xc8, 0x22, 0x00, 0xb4, 0x04, 0x1c, 0x28, - 0x23, 0x00, 0x22, 0x00, 0x49, 0x1b, 0xf7, 0xf3, - 0xfe, 0xcd, 0xb0, 0x01, 0x20, 0x55, 0x49, 0x12, - 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, - 0x49, 0x0f, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, - 0x48, 0x0d, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, - 0x28, 0xff, 0xd0, 0x07, 0x48, 0x0a, 0x68, 0x00, - 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, - 0xf0, 0x05, 0xfb, 0x6a, 0x48, 0x09, 0x21, 0x33, - 0x06, 0x49, 0x60, 0x48, 0x48, 0x06, 0x68, 0x01, - 0x4b, 0x0b, 0x40, 0x19, 0x60, 0x01, 0x20, 0x00, - 0xe7, 0x4c, 0xe7, 0x4b, 0xe7, 0x4a, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0x4c, 0x66, 0x00, 0x01, 0x00, - 0x66, 0x00, 0x00, 0x08, 0x23, 0x48, 0x00, 0x00, + 0x76, 0x88, 0x20, 0x00, 0x49, 0x03, 0x68, 0x09, + 0x31, 0x80, 0x70, 0xc8, 0x20, 0x00, 0xe6, 0x85, + 0xe6, 0x84, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, + 0x62, 0x00, 0x03, 0x00, 0x66, 0x00, 0x01, 0x00, + 0xa0, 0x00, 0x0d, 0x80, 0x2e, 0x08, 0x20, 0x08, + 0x66, 0x00, 0x00, 0x08, 0x2e, 0x01, 0x8b, 0xa8, + 0xdf, 0xff, 0xff, 0xff, 0x62, 0x01, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0x48, 0xfc, 0xb7, 0xff, 0xff, + 0x00, 0x00, 0xff, 0xff, 0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, 0x9e, 0x00, 0x0a, 0x00, - 0x9e, 0x00, 0x0a, 0x80, 0x00, 0x00, 0xff, 0xff, - 0xfc, 0xb7, 0xff, 0xff, 0xb5, 0xff, 0x1c, 0x1f, + 0x9e, 0x00, 0x0a, 0x80, 0xb5, 0xf7, 0x1c, 0x17, 0x98, 0x00, 0x06, 0x02, 0x0e, 0x12, 0x99, 0x01, - 0x06, 0x0d, 0x0e, 0x2d, 0x98, 0x02, 0x06, 0x04, - 0x0e, 0x24, 0x48, 0x2d, 0x68, 0x00, 0x5c, 0x81, - 0x2a, 0x20, 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x04, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x29, 0xff, - 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf7, 0x48, 0x27, - 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x29, 0x02, - 0xd0, 0x03, 0x29, 0x03, 0xd0, 0x01, 0x29, 0x04, - 0xd1, 0x0b, 0x48, 0x22, 0x69, 0x80, 0x28, 0x02, - 0xd1, 0x01, 0x29, 0x00, 0xd1, 0x05, 0x48, 0x1f, - 0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 0x29, 0x01, - 0xd0, 0x01, 0x20, 0x4d, 0xe7, 0xdf, 0x29, 0x05, - 0xd2, 0x2a, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, - 0x44, 0x9f, 0x1c, 0x00, 0x03, 0x07, 0x04, 0x05, - 0x06, 0x00, 0xe0, 0x24, 0xe0, 0x23, 0xe0, 0x22, - 0xe0, 0x21, 0x01, 0x08, 0x4b, 0x12, 0x68, 0x1b, - 0x18, 0xc0, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, - 0xd1, 0x05, 0x48, 0x0f, 0x68, 0x00, 0x30, 0x60, - 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x49, - 0xe7, 0xc1, 0xe0, 0x13, 0x2d, 0x00, 0xd1, 0x05, - 0x00, 0xa0, 0x4b, 0x0b, 0x18, 0xc0, 0x68, 0x00, - 0x60, 0x38, 0xe0, 0x04, 0x68, 0x38, 0x00, 0xa6, - 0x4b, 0x07, 0x18, 0xf3, 0x60, 0x18, 0xe0, 0x02, - 0x20, 0x4a, 0xe7, 0xb0, 0xe7, 0xff, 0x20, 0x00, - 0xe7, 0xad, 0xe7, 0xac, 0xe7, 0xab, 0x00, 0x00, - 0x2e, 0x08, 0x7c, 0x4c, 0x66, 0x00, 0x01, 0x00, - 0x62, 0x01, 0x00, 0x80, 0xb5, 0xf7, 0xb0, 0x82, - 0x98, 0x02, 0x06, 0x03, 0x0e, 0x1b, 0x93, 0x00, - 0x99, 0x03, 0x06, 0x08, 0x0e, 0x00, 0x90, 0x01, - 0x9a, 0x04, 0x06, 0x15, 0x0e, 0x2d, 0xb0, 0x84, - 0x4a, 0xca, 0x4f, 0xcb, 0x48, 0xcb, 0x68, 0x00, - 0x9b, 0x04, 0x5c, 0xc4, 0x48, 0xca, 0x90, 0x02, - 0x21, 0x00, 0x23, 0x00, 0x93, 0x01, 0x9b, 0x04, - 0x2b, 0x20, 0xdb, 0x05, 0x20, 0xa2, 0xb0, 0x06, + 0x06, 0x0d, 0x0e, 0x2d, 0x48, 0x6a, 0x68, 0x00, + 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, 0x20, 0xa2, 0xb0, 0x03, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, 0xb0, 0x06, - 0xe7, 0xf6, 0x48, 0xc2, 0x69, 0x80, 0x28, 0x02, - 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x03, 0x48, 0xbf, - 0x69, 0x80, 0x28, 0x02, 0xd0, 0x02, 0x20, 0x4d, - 0xb0, 0x06, 0xe7, 0xe9, 0x98, 0x05, 0x28, 0x01, - 0xd1, 0x08, 0x48, 0xb8, 0x68, 0x00, 0x30, 0x80, + 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, 0xe7, 0xf7, + 0x48, 0x64, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, + 0x29, 0x04, 0xd1, 0x01, 0x20, 0x58, 0xe7, 0xef, + 0x48, 0x60, 0x69, 0x80, 0x28, 0x00, 0xd1, 0x03, + 0x29, 0x02, 0xd0, 0x01, 0x29, 0x03, 0xd1, 0x0b, + 0x48, 0x5c, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x29, 0x00, 0xd1, 0x05, 0x48, 0x59, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, + 0x20, 0x4d, 0xe7, 0xd9, 0x29, 0x02, 0xd1, 0x05, + 0x48, 0x53, 0x68, 0x00, 0x30, 0x40, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x17, 0x29, 0x03, 0xd1, 0x05, + 0x48, 0x4f, 0x68, 0x00, 0x30, 0x40, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x0f, 0x29, 0x00, 0xd1, 0x05, + 0x48, 0x4b, 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, + 0x28, 0x00, 0xd1, 0x07, 0x29, 0x01, 0xd1, 0x07, + 0x48, 0x47, 0x68, 0x00, 0x30, 0x20, 0x7e, 0x80, + 0x28, 0x00, 0xd0, 0x01, 0x20, 0x4e, 0xe7, 0xb7, + 0x68, 0x78, 0x28, 0x00, 0xd1, 0x01, 0x20, 0x4c, + 0xe7, 0xb2, 0x23, 0x01, 0x01, 0x08, 0x4e, 0x40, + 0x68, 0x36, 0x19, 0x80, 0x30, 0x20, 0x72, 0x83, + 0x2d, 0x01, 0xd1, 0x0b, 0x20, 0x33, 0x06, 0x40, + 0x6e, 0x40, 0x23, 0x0d, 0x06, 0x9b, 0x1a, 0xc0, + 0x00, 0xd3, 0x4e, 0x3b, 0x68, 0x36, 0x19, 0x9b, + 0x60, 0x58, 0xe0, 0x12, 0x2d, 0x02, 0xd1, 0x0a, + 0x48, 0x38, 0x6c, 0xc0, 0x23, 0x0d, 0x06, 0x9b, + 0x1a, 0xc3, 0x00, 0xd0, 0x4e, 0x34, 0x68, 0x36, + 0x19, 0x80, 0x60, 0x43, 0xe0, 0x05, 0x68, 0x3b, + 0x00, 0xd0, 0x4e, 0x31, 0x68, 0x36, 0x19, 0x80, + 0x60, 0x43, 0x68, 0x3b, 0x01, 0x08, 0x4e, 0x2c, + 0x68, 0x36, 0x19, 0x80, 0x62, 0x03, 0x68, 0x7b, + 0x01, 0x08, 0x4e, 0x29, 0x68, 0x36, 0x19, 0x80, + 0x62, 0x43, 0x01, 0x08, 0x4b, 0x26, 0x68, 0x1b, + 0x18, 0xc0, 0x62, 0xc7, 0x01, 0x08, 0x4b, 0x24, + 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, 0x72, 0x45, + 0x01, 0x08, 0x4b, 0x21, 0x68, 0x1b, 0x18, 0xc0, + 0x30, 0x20, 0x72, 0x02, 0x20, 0x00, 0x60, 0x78, + 0x20, 0x00, 0x72, 0x78, 0x20, 0x00, 0x4b, 0x20, + 0x60, 0x18, 0x20, 0x00, 0x4b, 0x1f, 0x64, 0x18, + 0x01, 0x08, 0x4b, 0x19, 0x68, 0x1b, 0x18, 0xc0, + 0x6a, 0x40, 0x28, 0xbc, 0xdd, 0x01, 0x24, 0xbc, + 0xe0, 0x04, 0x01, 0x08, 0x4b, 0x14, 0x68, 0x1b, + 0x18, 0xc0, 0x6a, 0x44, 0x48, 0x18, 0x60, 0x04, + 0x29, 0x01, 0xd1, 0x14, 0x20, 0x01, 0x4b, 0x17, + 0x62, 0x98, 0x48, 0x17, 0x68, 0x03, 0x04, 0x1b, + 0x0c, 0x1b, 0x60, 0x03, 0x48, 0x14, 0x04, 0x23, + 0x68, 0x06, 0x43, 0x33, 0x60, 0x03, 0x48, 0x13, + 0x68, 0x06, 0x23, 0x20, 0x43, 0x33, 0x60, 0x03, + 0x20, 0x01, 0x4b, 0x0e, 0x63, 0x18, 0x48, 0x07, + 0x69, 0x80, 0x28, 0x00, 0xd1, 0x04, 0x48, 0x0e, + 0x68, 0x06, 0x23, 0x28, 0x43, 0x33, 0x60, 0x03, + 0x20, 0x00, 0xe7, 0x31, 0xe7, 0x30, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00, + 0x2e, 0x08, 0x5d, 0xd4, 0x66, 0x00, 0x00, 0x80, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x62, 0x00, 0x03, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x62, 0x01, 0x00, 0x20, 0x62, 0x01, 0x00, 0x24, + 0x64, 0x00, 0x00, 0x60, 0xb5, 0xf3, 0x1c, 0x0f, + 0x98, 0x00, 0x06, 0x06, 0x0e, 0x36, 0xb0, 0x82, + 0x4d, 0x68, 0x49, 0x69, 0x91, 0x01, 0x48, 0x69, + 0x68, 0x00, 0x5d, 0x84, 0x2e, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x02, 0xb0, 0x02, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, + 0x20, 0x4b, 0xb0, 0x02, 0xe7, 0xf6, 0x48, 0x62, + 0x69, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, + 0xd0, 0x03, 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, + 0xd1, 0x0b, 0x48, 0x5d, 0x69, 0x80, 0x28, 0x02, + 0xd1, 0x01, 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x5a, + 0x69, 0x80, 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, + 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x02, 0xe7, 0xdd, + 0x48, 0x54, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, + 0x28, 0x00, 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x02, + 0xe7, 0xd4, 0x48, 0x50, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, - 0xb0, 0x06, 0xe7, 0xdd, 0x98, 0x05, 0x28, 0x00, - 0xd1, 0x05, 0x48, 0xb2, 0x68, 0x00, 0x30, 0x20, - 0x7a, 0x80, 0x28, 0x00, 0xd0, 0x08, 0x98, 0x05, - 0x28, 0x01, 0xd1, 0x08, 0x48, 0xad, 0x68, 0x00, - 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd1, 0x02, - 0x20, 0x5a, 0xb0, 0x06, 0xe7, 0xc8, 0x20, 0x00, - 0x4b, 0xa8, 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, - 0x98, 0x05, 0x28, 0x00, 0xd1, 0x50, 0x2d, 0x01, - 0xd0, 0x01, 0x2d, 0x02, 0xd1, 0x32, 0x4e, 0xa6, - 0x68, 0x30, 0x23, 0x01, 0x04, 0xdb, 0x43, 0x18, - 0x60, 0x30, 0x20, 0x00, 0x4b, 0xa3, 0x60, 0x18, - 0x48, 0x9e, 0x68, 0x00, 0x30, 0x80, 0x78, 0x40, - 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, 0x9b, 0x02, - 0x18, 0xc0, 0x90, 0x02, 0x98, 0x02, 0x68, 0x01, - 0x48, 0x9a, 0x69, 0x80, 0x07, 0x80, 0x0f, 0x80, - 0x01, 0x80, 0x43, 0x01, 0x23, 0x20, 0x43, 0x19, - 0x4b, 0x99, 0x43, 0x19, 0x98, 0x02, 0x60, 0x01, - 0x4e, 0x98, 0x68, 0x30, 0x23, 0x01, 0x04, 0xdb, - 0x43, 0x18, 0x60, 0x30, 0x4e, 0x92, 0x68, 0x30, - 0x4b, 0x95, 0x40, 0x18, 0x60, 0x30, 0x2c, 0x00, - 0xd1, 0x04, 0x20, 0x00, 0x4b, 0x8b, 0x68, 0x1b, - 0x33, 0x20, 0x72, 0x98, 0x2d, 0x02, 0xd0, 0x04, - 0x20, 0x01, 0x04, 0xc0, 0x23, 0x33, 0x06, 0x5b, - 0x60, 0x18, 0x2c, 0x00, 0xd1, 0x0f, 0x20, 0xff, - 0x02, 0x00, 0x40, 0x08, 0xd1, 0x0b, 0x2d, 0x02, - 0xd0, 0x09, 0x48, 0x82, 0x68, 0x00, 0x30, 0x80, - 0x78, 0x40, 0x23, 0x01, 0x40, 0x58, 0x4b, 0x7f, - 0x68, 0x1b, 0x33, 0x80, 0x70, 0x58, 0xe0, 0xed, - 0x2d, 0x01, 0xd1, 0x73, 0x2c, 0x00, 0xd1, 0x72, - 0x20, 0x31, 0x06, 0x40, 0x68, 0x80, 0x23, 0x08, - 0x40, 0x18, 0xd1, 0x3a, 0x48, 0x7a, 0x68, 0x06, - 0x23, 0x05, 0x05, 0x9b, 0x43, 0x33, 0x60, 0x03, - 0x68, 0x10, 0x4b, 0x7c, 0x40, 0x18, 0x60, 0x10, - 0x32, 0xc0, 0x68, 0x10, 0x4b, 0x79, 0x40, 0x18, - 0x60, 0x10, 0x20, 0x00, 0x4b, 0x6f, 0x68, 0x1b, - 0x67, 0x58, 0x20, 0x00, 0x4b, 0x6d, 0x68, 0x1b, - 0x33, 0x80, 0x70, 0x18, 0x48, 0x6d, 0x68, 0x80, - 0x23, 0x02, 0x40, 0x18, 0xd1, 0x04, 0x20, 0x00, - 0x4b, 0x68, 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, - 0x20, 0x5b, 0x4b, 0x66, 0x68, 0x1b, 0x6f, 0xdb, - 0x72, 0x58, 0x4e, 0x6d, 0x68, 0x30, 0x23, 0x02, - 0x43, 0x18, 0x60, 0x30, 0x4e, 0x67, 0x68, 0x30, - 0x23, 0x05, 0x05, 0x9b, 0x43, 0x18, 0x60, 0x30, - 0x4e, 0x61, 0x68, 0x30, 0x4b, 0x67, 0x40, 0x18, - 0x60, 0x30, 0x20, 0x5b, 0xb0, 0x06, 0xe7, 0x2b, - 0xe0, 0xae, 0x48, 0x5d, 0x68, 0x06, 0x23, 0x01, - 0x05, 0x9b, 0x43, 0x33, 0x60, 0x03, 0x20, 0x31, - 0x06, 0x40, 0x6a, 0x00, 0x23, 0x04, 0x40, 0x18, - 0xd1, 0x27, 0x9b, 0x01, 0x20, 0x31, 0x06, 0x40, - 0x6b, 0x00, 0x18, 0x1b, 0x93, 0x01, 0x4e, 0x5c, - 0x68, 0x30, 0x23, 0x3b, 0x40, 0x18, 0x60, 0x30, - 0x4e, 0x57, 0x68, 0x30, 0x23, 0x0e, 0x43, 0x18, - 0x60, 0x30, 0x4e, 0x55, 0x68, 0x30, 0x23, 0x0c, - 0x40, 0x18, 0x60, 0x30, 0x20, 0x37, 0x23, 0x31, - 0x06, 0x5b, 0x60, 0x98, 0x20, 0x01, 0x90, 0x00, - 0x98, 0x00, 0x28, 0x64, 0xd3, 0x04, 0xe0, 0x07, - 0x98, 0x00, 0x30, 0x01, 0x90, 0x00, 0xe7, 0xf7, - 0xe7, 0xfa, 0xe0, 0x01, 0xe0, 0x36, 0xe0, 0x34, - 0xe7, 0xd1, 0x4e, 0x46, 0x68, 0x30, 0x23, 0x01, - 0x05, 0x9b, 0x43, 0x18, 0x60, 0x30, 0x4e, 0x40, - 0x68, 0x30, 0x4b, 0x48, 0x40, 0x18, 0x60, 0x30, - 0x48, 0x3c, 0x68, 0x40, 0x28, 0x00, 0xd0, 0x0d, - 0x20, 0x5b, 0x4b, 0x38, 0x68, 0x1b, 0x6f, 0xdb, - 0x72, 0x58, 0x20, 0x00, 0x4b, 0x35, 0x68, 0x1b, - 0x33, 0x60, 0x76, 0x98, 0x20, 0x5b, 0xb0, 0x06, - 0xe6, 0xda, 0xe0, 0x5d, 0x48, 0x31, 0x68, 0x00, - 0x6f, 0xc0, 0x1d, 0x06, 0x48, 0x2f, 0x68, 0x00, - 0x30, 0x80, 0x78, 0x00, 0x9b, 0x01, 0x1a, 0xc0, - 0x68, 0x33, 0x18, 0xc0, 0x60, 0x30, 0x20, 0x5c, - 0x4b, 0x2a, 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, - 0x20, 0x00, 0x4b, 0x28, 0x68, 0x1b, 0x33, 0x60, - 0x76, 0x98, 0xe0, 0x3f, 0x20, 0x33, 0x06, 0x40, - 0x6b, 0x80, 0x90, 0x03, 0x23, 0x04, 0x40, 0x18, - 0xd0, 0x03, 0x20, 0x52, 0xb0, 0x06, 0xe6, 0xb7, - 0xe0, 0x3a, 0x98, 0x03, 0x01, 0x00, 0x19, 0xc7, - 0x48, 0x1e, 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, - 0xdd, 0x07, 0x48, 0x29, 0x60, 0xb8, 0x20, 0xbc, - 0x4b, 0x1a, 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18, - 0xe0, 0x0d, 0x48, 0x18, 0x68, 0x00, 0x6f, 0x40, - 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xb8, - 0x48, 0x14, 0x68, 0x00, 0x6f, 0x40, 0x4b, 0x13, - 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18, 0x48, 0x11, - 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x00, 0x43, - 0x18, 0x18, 0x01, 0x80, 0x18, 0x82, 0x48, 0x0d, - 0x68, 0x00, 0x6f, 0x00, 0x60, 0x38, 0x1d, 0x10, - 0x60, 0x78, 0x20, 0x01, 0x06, 0x00, 0x60, 0xf8, - 0x9e, 0x03, 0x20, 0x01, 0x40, 0xb0, 0x23, 0x33, - 0x06, 0x5b, 0x63, 0x58, 0x20, 0x00, 0xb0, 0x06, - 0xe6, 0x7e, 0xb0, 0x04, 0xb0, 0x02, 0xe6, 0x7b, - 0xe6, 0x7a, 0x00, 0x00, 0x9e, 0x00, 0x0b, 0x80, - 0x9e, 0x00, 0x09, 0x80, 0x2e, 0x08, 0x7c, 0x4c, - 0x9e, 0x00, 0x0a, 0x00, 0x66, 0x00, 0x01, 0x00, - 0x66, 0x00, 0x00, 0x08, 0x62, 0x00, 0x03, 0x00, - 0x80, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x04, - 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, - 0x62, 0x00, 0x00, 0x1c, 0xfe, 0xbf, 0xff, 0xff, - 0x62, 0x00, 0x00, 0x08, 0xff, 0xbf, 0xff, 0xff, - 0x40, 0x00, 0x00, 0xbc, 0x48, 0x07, 0x69, 0x80, - 0x28, 0x02, 0xd0, 0x03, 0x48, 0x05, 0x69, 0x80, - 0x28, 0x03, 0xd1, 0x04, 0x20, 0x31, 0x06, 0x40, - 0x6a, 0x80, 0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, - 0xe7, 0xfb, 0xe7, 0xfa, 0x66, 0x00, 0x01, 0x00, - 0xb5, 0xb0, 0x27, 0x0f, 0x20, 0x31, 0x06, 0x40, - 0x68, 0xc0, 0x09, 0x05, 0xf7, 0xff, 0xff, 0xe6, - 0x43, 0xc4, 0x48, 0x18, 0x69, 0x80, 0x28, 0x00, - 0xd0, 0x03, 0x48, 0x16, 0x69, 0x80, 0x28, 0x01, - 0xd1, 0x03, 0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x2d, 0x09, 0xd2, 0x1e, 0xa3, 0x02, - 0x5d, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, - 0x0e, 0x00, 0x1c, 0x2f, 0xe0, 0x13, 0x20, 0x08, - 0x40, 0x20, 0xd0, 0x01, 0x1c, 0x2f, 0xe0, 0x00, - 0x27, 0x02, 0xe0, 0x0c, 0x20, 0x08, 0x40, 0x20, - 0xd0, 0x06, 0x20, 0x02, 0x40, 0x20, 0xd0, 0x01, - 0x27, 0x07, 0xe0, 0x00, 0x27, 0x08, 0xe0, 0x00, - 0x27, 0x02, 0xe0, 0x00, 0xe7, 0xff, 0x1c, 0x38, - 0xe7, 0xd8, 0xe7, 0xd7, 0x66, 0x00, 0x01, 0x00, - 0x1c, 0x01, 0x29, 0x07, 0xd2, 0x0f, 0xa3, 0x02, + 0xb0, 0x02, 0xe7, 0xcb, 0x68, 0x78, 0x28, 0x00, + 0xd1, 0x02, 0x20, 0x4c, 0xb0, 0x02, 0xe7, 0xc5, + 0x2c, 0x04, 0xd1, 0x08, 0x68, 0x79, 0x20, 0xbc, + 0xf0, 0x01, 0xff, 0xac, 0x29, 0x00, 0xd0, 0x02, + 0x20, 0x59, 0xb0, 0x02, 0xe7, 0xba, 0x48, 0x43, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x21, 0x01, + 0x40, 0x81, 0x48, 0x41, 0x68, 0x40, 0x40, 0x08, + 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x02, 0x20, 0x51, + 0xb0, 0x02, 0xe7, 0xab, 0x20, 0x33, 0x06, 0x40, + 0x6b, 0x80, 0x90, 0x00, 0x23, 0x04, 0x40, 0x18, + 0xd0, 0x02, 0x20, 0x52, 0xb0, 0x02, 0xe7, 0xa1, + 0x2c, 0x00, 0xd1, 0x04, 0x48, 0x37, 0x68, 0x01, + 0x23, 0xfd, 0x40, 0x19, 0x60, 0x01, 0x20, 0x01, + 0x49, 0x32, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, + 0x68, 0x38, 0x49, 0x30, 0x68, 0x09, 0x67, 0x08, + 0x68, 0x78, 0x49, 0x2e, 0x68, 0x09, 0x67, 0x48, + 0x48, 0x2c, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, + 0x49, 0x2a, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, + 0x48, 0x28, 0x68, 0x00, 0x30, 0x60, 0x76, 0x06, + 0x20, 0x00, 0x60, 0x78, 0x20, 0x00, 0x72, 0x78, + 0x48, 0x24, 0x68, 0x00, 0x5d, 0x80, 0x28, 0x01, + 0xd1, 0x02, 0x20, 0x01, 0x49, 0x24, 0x62, 0x88, + 0x98, 0x00, 0x01, 0x00, 0x19, 0x45, 0x48, 0x1f, + 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, + 0x48, 0x20, 0x60, 0xa8, 0x20, 0xbc, 0x49, 0x1b, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0xe0, 0x0d, + 0x48, 0x18, 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, + 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, 0x48, 0x15, + 0x68, 0x00, 0x6f, 0x40, 0x49, 0x13, 0x68, 0x09, + 0x31, 0x80, 0x70, 0x08, 0x48, 0x11, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, + 0x01, 0x80, 0x99, 0x01, 0x18, 0x41, 0x91, 0x01, + 0x48, 0x0c, 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, + 0x99, 0x01, 0x1d, 0x08, 0x60, 0x68, 0x20, 0x01, + 0x06, 0x00, 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, + 0x40, 0x88, 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, + 0x20, 0x00, 0xb0, 0x02, 0xe7, 0x3a, 0xb0, 0x02, + 0xe7, 0x38, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, + 0x9e, 0x00, 0x0b, 0x80, 0x2e, 0x08, 0x7c, 0x44, + 0x66, 0x00, 0x01, 0x00, 0x62, 0x00, 0x00, 0x1c, + 0x62, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0xbc, + 0xb5, 0xf3, 0x1c, 0x0f, 0xb0, 0x81, 0x98, 0x01, + 0x06, 0x00, 0x0e, 0x00, 0x90, 0x00, 0xb0, 0x82, + 0x48, 0xf9, 0x68, 0x00, 0x99, 0x02, 0x5c, 0x44, + 0x98, 0x02, 0x28, 0x20, 0xdb, 0x05, 0x20, 0xa2, + 0xb0, 0x03, 0xb0, 0x02, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, 0x20, 0x4b, + 0xb0, 0x03, 0xe7, 0xf6, 0x48, 0xf1, 0x69, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0xec, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x2c, 0x00, 0xd1, 0x05, 0x48, 0xe9, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, + 0x20, 0x4d, 0xb0, 0x03, 0xe7, 0xdd, 0x48, 0xe4, + 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x4f, 0xb0, 0x03, 0xe7, 0xd4, + 0x68, 0x78, 0x28, 0x00, 0xd1, 0x02, 0x20, 0x4c, + 0xb0, 0x03, 0xe7, 0xce, 0x2c, 0x04, 0xd1, 0x08, + 0x68, 0x79, 0x20, 0xbc, 0xf0, 0x01, 0xfe, 0xce, + 0x29, 0x00, 0xd0, 0x02, 0x20, 0x59, 0xb0, 0x03, + 0xe7, 0xc3, 0x48, 0xd7, 0x68, 0x00, 0x30, 0x80, + 0x78, 0xc0, 0x28, 0x00, 0xd0, 0x02, 0x20, 0x50, + 0xb0, 0x03, 0xe7, 0xba, 0x2c, 0x00, 0xd1, 0x04, + 0x48, 0xd3, 0x68, 0x01, 0x23, 0xfd, 0x40, 0x19, + 0x60, 0x01, 0x48, 0xd2, 0x68, 0x01, 0x23, 0x8d, + 0x05, 0x9b, 0x43, 0x19, 0x60, 0x01, 0x48, 0xd0, + 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x20, 0x01, + 0x49, 0xc9, 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, + 0x68, 0x38, 0x49, 0xc7, 0x68, 0x09, 0x67, 0x08, + 0x68, 0x78, 0x49, 0xc5, 0x68, 0x09, 0x67, 0x48, + 0x48, 0xc3, 0x68, 0x00, 0x67, 0xc7, 0x20, 0x00, + 0x49, 0xc1, 0x68, 0x09, 0x31, 0x60, 0x76, 0x48, + 0x98, 0x02, 0x49, 0xbf, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x08, 0x20, 0x00, 0x49, 0xbc, 0x68, 0x09, + 0x6f, 0xc9, 0x60, 0x48, 0x20, 0x00, 0x49, 0xba, + 0x68, 0x09, 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xb8, + 0x68, 0x00, 0x99, 0x02, 0x5c, 0x40, 0x28, 0x01, + 0xd1, 0x02, 0x20, 0x01, 0x49, 0xb9, 0x62, 0x88, + 0x48, 0xb3, 0x68, 0x00, 0x30, 0x80, 0x78, 0x81, + 0x20, 0x01, 0x40, 0x88, 0x49, 0xb1, 0x68, 0x49, + 0x40, 0x08, 0x07, 0x80, 0x0f, 0x80, 0xd0, 0x1b, + 0x20, 0x00, 0x49, 0xad, 0x68, 0x09, 0x31, 0x60, + 0x76, 0x88, 0x20, 0x51, 0x49, 0xaa, 0x68, 0x09, + 0x6f, 0xc9, 0x72, 0x48, 0x48, 0xa8, 0x68, 0x00, + 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, + 0x48, 0xa5, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfd, 0xb0, + 0x20, 0x51, 0xb0, 0x03, 0xe7, 0x55, 0xe1, 0x6c, + 0x20, 0x33, 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, + 0x99, 0x00, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x07, + 0x20, 0x04, 0xf0, 0x00, 0xfc, 0xb3, 0x20, 0x33, + 0x06, 0x40, 0x6b, 0x81, 0x91, 0x00, 0xe7, 0xf3, + 0x4d, 0x9d, 0x99, 0x00, 0x01, 0x08, 0x19, 0x45, + 0x48, 0x95, 0x68, 0x00, 0x6f, 0x40, 0x28, 0xbc, + 0xdd, 0x07, 0x48, 0x9a, 0x60, 0xa8, 0x20, 0xbc, + 0x49, 0x91, 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, + 0xe0, 0x0d, 0x48, 0x8f, 0x68, 0x00, 0x6f, 0x40, + 0x23, 0x01, 0x07, 0x9b, 0x43, 0x18, 0x60, 0xa8, + 0x48, 0x8b, 0x68, 0x00, 0x6f, 0x40, 0x49, 0x8a, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x08, 0x48, 0x90, + 0x90, 0x01, 0x48, 0x87, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x99, 0x01, 0x18, 0x40, 0x90, 0x01, 0x48, 0x82, + 0x68, 0x00, 0x6f, 0x00, 0x60, 0x28, 0x98, 0x01, + 0x30, 0x04, 0x60, 0x68, 0x20, 0x01, 0x06, 0x00, + 0x60, 0xe8, 0x99, 0x00, 0x20, 0x01, 0x40, 0x88, + 0x21, 0x33, 0x06, 0x49, 0x63, 0x48, 0x48, 0x83, + 0x6b, 0x00, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x18, + 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, 0xfc, 0x6a, + 0xe7, 0xf5, 0x20, 0x01, 0x06, 0x00, 0x21, 0x33, + 0x06, 0x49, 0x60, 0x48, 0x4e, 0x7c, 0x48, 0x72, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x01, 0x00, + 0x19, 0x86, 0x98, 0x01, 0x30, 0x04, 0x60, 0x30, + 0x48, 0x78, 0x60, 0x70, 0x48, 0x6c, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x00, 0x23, 0x01, 0x07, 0x9b, + 0x43, 0x18, 0x60, 0xb0, 0x20, 0x01, 0x05, 0x80, + 0x60, 0xf0, 0x48, 0x67, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x81, 0x20, 0x01, 0x40, 0x88, 0x49, 0x65, + 0x60, 0xc8, 0x48, 0x63, 0x68, 0x00, 0x30, 0x60, + 0x7e, 0x00, 0x49, 0x61, 0x68, 0x09, 0x5c, 0x08, + 0x28, 0x00, 0xd0, 0x48, 0x28, 0x01, 0xd0, 0x47, + 0x28, 0x02, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x21, + 0xe0, 0x5a, 0x48, 0x67, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x48, 0x58, 0x68, 0x00, + 0x6f, 0x40, 0x49, 0x57, 0x68, 0x09, 0x31, 0x80, + 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, 0xd8, 0x05, + 0x48, 0x5f, 0x68, 0x01, 0x23, 0x10, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x05, 0x48, 0x5c, 0x68, 0x01, + 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0x48, 0x59, 0x68, 0x01, 0x23, 0x08, 0x43, 0x19, + 0x60, 0x01, 0xe0, 0x39, 0x48, 0x56, 0x68, 0x01, + 0x23, 0x04, 0x43, 0x19, 0x60, 0x01, 0x48, 0x48, + 0x68, 0x00, 0x6f, 0x40, 0x49, 0x46, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x1a, 0x40, 0x28, 0xbc, + 0xd8, 0x05, 0x48, 0x4f, 0x68, 0x01, 0x23, 0x10, + 0x43, 0x19, 0x60, 0x01, 0xe0, 0x05, 0x48, 0x4c, + 0x68, 0x01, 0x23, 0x10, 0x43, 0xdb, 0x40, 0x19, + 0x60, 0x01, 0x48, 0x49, 0x68, 0x01, 0x23, 0x08, + 0x43, 0x19, 0x60, 0x01, 0xe0, 0x18, 0xe0, 0x17, + 0x48, 0x46, 0x68, 0x01, 0x04, 0x09, 0x0c, 0x09, + 0x60, 0x01, 0x48, 0x44, 0x49, 0x36, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x04, 0x09, 0x68, 0x02, + 0x43, 0x11, 0x60, 0x01, 0x48, 0x40, 0x68, 0x01, + 0x23, 0x20, 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, + 0x20, 0x01, 0x49, 0x34, 0x63, 0x08, 0xe7, 0xff, + 0x48, 0x36, 0x6b, 0x00, 0x23, 0x01, 0x05, 0x9b, + 0x40, 0x18, 0xd1, 0x03, 0x20, 0x04, 0xf0, 0x00, + 0xfb, 0xd1, 0xe7, 0xf5, 0x20, 0x01, 0x05, 0x80, + 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, 0x48, 0x26, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x80, 0x23, 0x01, + 0x40, 0x58, 0x49, 0x23, 0x68, 0x09, 0x31, 0x80, + 0x70, 0x88, 0x48, 0x21, 0x68, 0x00, 0x6f, 0x40, + 0x49, 0x1f, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, + 0x1a, 0x40, 0x49, 0x1d, 0x68, 0x09, 0x67, 0x48, + 0x48, 0x1b, 0x68, 0x00, 0x6f, 0xc0, 0x30, 0x04, + 0x49, 0x19, 0x68, 0x09, 0x31, 0x80, 0x78, 0x09, + 0x68, 0x02, 0x18, 0x89, 0x60, 0x01, 0x48, 0x16, + 0x68, 0x00, 0x6f, 0x00, 0x49, 0x14, 0x68, 0x09, + 0x31, 0x80, 0x78, 0x09, 0x18, 0x40, 0x49, 0x12, + 0x68, 0x09, 0x67, 0x08, 0x48, 0x10, 0x68, 0x00, + 0x6f, 0x40, 0x28, 0x00, 0xd0, 0x00, 0xe6, 0xb3, + 0x48, 0x11, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x0e, 0x68, 0x01, 0x4b, 0x19, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x48, 0x49, 0x08, 0x68, 0x09, + 0x6f, 0xc9, 0x72, 0x48, 0x20, 0x00, 0x49, 0x06, + 0x68, 0x09, 0x31, 0x60, 0x76, 0x88, 0x48, 0x04, + 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, + 0xd0, 0x29, 0x48, 0x01, 0xe0, 0x20, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0x44, 0x66, 0x00, 0x01, 0x00, + 0x62, 0x00, 0x00, 0x1c, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x62, 0x01, 0x00, 0x00, + 0x9e, 0x00, 0x09, 0x80, 0x40, 0x00, 0x00, 0xbc, + 0x9e, 0x00, 0x0b, 0x80, 0x66, 0x00, 0x00, 0x80, + 0x9e, 0x00, 0x09, 0xc0, 0x66, 0x00, 0x01, 0xf0, + 0x64, 0x00, 0x00, 0x60, 0x62, 0x01, 0x00, 0x20, + 0x62, 0x01, 0x00, 0x24, 0xfc, 0xb7, 0xff, 0xff, + 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, 0x20, 0x01, + 0x40, 0x88, 0xf0, 0x05, 0xfc, 0x45, 0x20, 0x00, + 0xb0, 0x03, 0xe5, 0xea, 0xb0, 0x02, 0xb0, 0x01, + 0xe5, 0xe7, 0xe5, 0xe6, 0xb5, 0xb0, 0x1c, 0x07, + 0x06, 0x3d, 0x0e, 0x2d, 0x48, 0x5d, 0x68, 0x00, + 0x5d, 0x44, 0x2d, 0x20, 0xdb, 0x03, 0x20, 0xa2, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x48, 0x59, + 0x68, 0x00, 0x5d, 0x40, 0x28, 0xff, 0xd1, 0x01, + 0x20, 0x4b, 0xe7, 0xf5, 0x48, 0x56, 0x69, 0x80, + 0x28, 0x00, 0xd1, 0x05, 0x2c, 0x02, 0xd0, 0x03, + 0x2c, 0x03, 0xd0, 0x01, 0x2c, 0x04, 0xd1, 0x0b, + 0x48, 0x51, 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, + 0x2c, 0x00, 0xd1, 0x05, 0x48, 0x4e, 0x69, 0x80, + 0x28, 0x01, 0xd1, 0x04, 0x2c, 0x01, 0xd0, 0x02, + 0x20, 0x4d, 0xe7, 0xdd, 0xe0, 0x90, 0x48, 0x4b, + 0x68, 0x01, 0x4b, 0x4b, 0x43, 0x19, 0x60, 0x01, + 0x48, 0x49, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x48, 0x68, 0x01, 0x23, 0x04, 0x43, 0x19, + 0x60, 0x01, 0x20, 0x00, 0x49, 0x41, 0x68, 0x09, + 0x31, 0x80, 0x70, 0x88, 0x20, 0x00, 0x49, 0x3f, + 0x68, 0x09, 0x31, 0x80, 0x70, 0x48, 0x20, 0xff, + 0x49, 0x3c, 0x68, 0x09, 0x55, 0x48, 0x2c, 0x00, + 0xd1, 0x03, 0x20, 0x18, 0x21, 0x31, 0x06, 0x49, + 0x62, 0x48, 0x01, 0x20, 0x49, 0x37, 0x68, 0x09, + 0x18, 0x40, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, + 0xd0, 0x28, 0x20, 0x00, 0x49, 0x38, 0x60, 0x08, + 0x20, 0x00, 0x49, 0x38, 0x64, 0x08, 0x20, 0x03, + 0x49, 0x31, 0x61, 0x08, 0x21, 0x55, 0x01, 0x20, + 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x80, 0x6a, 0xc0, + 0x72, 0x41, 0x21, 0x00, 0x01, 0x20, 0x4a, 0x2b, + 0x68, 0x12, 0x18, 0x80, 0x30, 0x20, 0x72, 0x81, + 0x01, 0x20, 0x49, 0x28, 0x68, 0x09, 0x18, 0x40, + 0x6a, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x09, + 0x01, 0x20, 0x49, 0x24, 0x68, 0x09, 0x18, 0x40, + 0x6a, 0xc0, 0x7a, 0x01, 0x20, 0x01, 0x40, 0x88, + 0xf0, 0x05, 0xfb, 0xbe, 0x48, 0x1f, 0x68, 0x00, + 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, 0xd0, 0x2b, + 0x48, 0x1c, 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, + 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x00, 0x49, 0x19, + 0x68, 0x09, 0x31, 0x80, 0x70, 0xc8, 0x22, 0x00, + 0xb4, 0x04, 0x1c, 0x28, 0x23, 0x00, 0x22, 0x00, + 0x49, 0x1b, 0xf7, 0xf3, 0xfe, 0xcd, 0xb0, 0x01, + 0x20, 0x55, 0x49, 0x12, 0x68, 0x09, 0x6f, 0xc9, + 0x72, 0x48, 0x20, 0x00, 0x49, 0x0f, 0x68, 0x09, + 0x31, 0x60, 0x76, 0x88, 0x48, 0x0d, 0x68, 0x00, + 0x6f, 0xc0, 0x7a, 0x00, 0x28, 0xff, 0xd0, 0x07, + 0x48, 0x0a, 0x68, 0x00, 0x6f, 0xc0, 0x7a, 0x01, + 0x20, 0x01, 0x40, 0x88, 0xf0, 0x05, 0xfb, 0x8c, + 0x48, 0x09, 0x21, 0x33, 0x06, 0x49, 0x60, 0x48, + 0x48, 0x06, 0x68, 0x01, 0x4b, 0x0b, 0x40, 0x19, + 0x60, 0x01, 0x20, 0x00, 0xe7, 0x4c, 0xe7, 0x4b, + 0xe7, 0x4a, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x23, 0x48, 0x00, 0x00, 0x66, 0x00, 0x01, 0x18, + 0x9e, 0x00, 0x0a, 0x00, 0x9e, 0x00, 0x0a, 0x80, + 0x00, 0x00, 0xff, 0xff, 0xfc, 0xb7, 0xff, 0xff, + 0xb5, 0xff, 0x1c, 0x1f, 0x98, 0x00, 0x06, 0x02, + 0x0e, 0x12, 0x99, 0x01, 0x06, 0x0d, 0x0e, 0x2d, + 0x98, 0x02, 0x06, 0x04, 0x0e, 0x24, 0x48, 0x2d, + 0x68, 0x00, 0x5c, 0x81, 0x2a, 0x20, 0xdb, 0x04, + 0x20, 0xa2, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x29, 0xff, 0xd1, 0x01, 0x20, 0x4b, + 0xe7, 0xf7, 0x48, 0x27, 0x69, 0x80, 0x28, 0x00, + 0xd1, 0x05, 0x29, 0x02, 0xd0, 0x03, 0x29, 0x03, + 0xd0, 0x01, 0x29, 0x04, 0xd1, 0x0b, 0x48, 0x22, + 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x29, 0x00, + 0xd1, 0x05, 0x48, 0x1f, 0x69, 0x80, 0x28, 0x01, + 0xd1, 0x03, 0x29, 0x01, 0xd0, 0x01, 0x20, 0x4d, + 0xe7, 0xdf, 0x29, 0x05, 0xd2, 0x2a, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, 0x44, 0x9f, 0x1c, 0x00, - 0x04, 0x05, 0x06, 0x09, 0x08, 0x07, 0x0a, 0x00, - 0xe0, 0x06, 0xe0, 0x05, 0xe0, 0x04, 0xe0, 0x03, - 0xe0, 0x02, 0xe0, 0x01, 0xe0, 0x00, 0xe7, 0xff, - 0x20, 0x00, 0x47, 0x70, 0xe7, 0xfd, 0x00, 0x00, - 0x20, 0x1d, 0x02, 0x80, 0x69, 0x80, 0x49, 0x06, - 0x60, 0x08, 0x20, 0x1d, 0x02, 0x80, 0x69, 0x40, - 0x49, 0x04, 0x60, 0x08, 0x20, 0x1d, 0x02, 0x80, - 0x69, 0xc0, 0x49, 0x03, 0x60, 0x08, 0x47, 0x70, - 0x2e, 0x08, 0x94, 0x98, 0x2e, 0x08, 0x94, 0x9c, - 0x2e, 0x08, 0x94, 0xa0, 0xb5, 0xf1, 0xb0, 0x81, - 0x20, 0x00, 0x4d, 0x21, 0x95, 0x00, 0x21, 0x00, - 0x22, 0x00, 0x23, 0x00, 0x43, 0xdb, 0x4c, 0x1f, - 0x68, 0x64, 0x42, 0x8c, 0xdd, 0x21, 0x1c, 0x0c, - 0x31, 0x01, 0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2f, - 0x42, 0x9f, 0xd0, 0xf8, 0x4c, 0x19, 0x68, 0x64, - 0x42, 0x8c, 0xda, 0x00, 0xe0, 0x15, 0x32, 0x01, - 0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4, 0x9d, 0x00, - 0x59, 0x2b, 0x42, 0x9f, 0xd0, 0xf8, 0x02, 0x9c, - 0x43, 0x3c, 0x1c, 0x25, 0x1c, 0x04, 0x30, 0x01, - 0x00, 0xa4, 0x9e, 0x01, 0x51, 0x35, 0x4c, 0x0f, - 0x68, 0x64, 0x42, 0x8c, 0xdb, 0x00, 0x32, 0x01, - 0xe7, 0xd9, 0x28, 0x08, 0xd3, 0x02, 0xe0, 0x07, - 0x30, 0x01, 0xe7, 0xfa, 0x25, 0x00, 0x43, 0xed, - 0x00, 0x84, 0x9e, 0x01, 0x51, 0x35, 0xe7, 0xf7, - 0x4c, 0x07, 0x68, 0x24, 0x2c, 0x00, 0xd1, 0x02, - 0x24, 0x0d, 0x06, 0xe4, 0x61, 0x22, 0xb0, 0x01, - 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x7c, 0xd4, 0x2e, 0x08, 0x7d, 0x9c, - 0x2e, 0x08, 0x94, 0x8c, 0xb5, 0x80, 0x48, 0xdc, - 0x68, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x48, 0xda, - 0x68, 0x00, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0xf7, 0xff, 0xff, 0x92, 0x48, 0xd7, 0x49, 0xd8, - 0x60, 0x08, 0x48, 0xd8, 0x49, 0xd8, 0x60, 0x08, - 0x48, 0xd8, 0x49, 0xd9, 0x60, 0x08, 0x48, 0xd3, - 0x49, 0xd8, 0x68, 0x0b, 0x4a, 0xd8, 0x21, 0x00, - 0xf0, 0x01, 0xf8, 0xda, 0x20, 0x00, 0x49, 0xd0, - 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0xd0, - 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0xd0, - 0x68, 0x09, 0x60, 0x08, 0x20, 0x00, 0x49, 0xca, - 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, - 0x66, 0x88, 0x48, 0xce, 0x49, 0xc6, 0x68, 0x09, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, - 0x20, 0x00, 0x49, 0xc5, 0x68, 0x09, 0x23, 0x07, - 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc7, - 0x49, 0xc1, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, - 0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc0, + 0x03, 0x07, 0x04, 0x05, 0x06, 0x00, 0xe0, 0x24, + 0xe0, 0x23, 0xe0, 0x22, 0xe0, 0x21, 0x01, 0x08, + 0x4b, 0x12, 0x68, 0x1b, 0x18, 0xc0, 0x30, 0x20, + 0x7a, 0x80, 0x28, 0x00, 0xd1, 0x05, 0x48, 0x0f, + 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x49, 0xe7, 0xc1, 0xe0, 0x13, + 0x2d, 0x00, 0xd1, 0x05, 0x00, 0xa0, 0x4b, 0x0b, + 0x18, 0xc0, 0x68, 0x00, 0x60, 0x38, 0xe0, 0x04, + 0x68, 0x38, 0x00, 0xa6, 0x4b, 0x07, 0x18, 0xf3, + 0x60, 0x18, 0xe0, 0x02, 0x20, 0x4a, 0xe7, 0xb0, + 0xe7, 0xff, 0x20, 0x00, 0xe7, 0xad, 0xe7, 0xac, + 0xe7, 0xab, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x44, + 0x66, 0x00, 0x01, 0x00, 0x62, 0x01, 0x00, 0x80, + 0xb5, 0xf7, 0xb0, 0x82, 0x98, 0x02, 0x06, 0x03, + 0x0e, 0x1b, 0x93, 0x00, 0x99, 0x03, 0x06, 0x08, + 0x0e, 0x00, 0x90, 0x01, 0x9a, 0x04, 0x06, 0x15, + 0x0e, 0x2d, 0xb0, 0x84, 0x4a, 0xca, 0x4f, 0xcb, + 0x48, 0xcb, 0x68, 0x00, 0x9b, 0x04, 0x5c, 0xc4, + 0x48, 0xca, 0x90, 0x02, 0x21, 0x00, 0x23, 0x00, + 0x93, 0x01, 0x9b, 0x04, 0x2b, 0x20, 0xdb, 0x05, + 0x20, 0xa2, 0xb0, 0x06, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2c, 0xff, 0xd1, 0x02, + 0x20, 0x4b, 0xb0, 0x06, 0xe7, 0xf6, 0x48, 0xc2, + 0x69, 0x80, 0x28, 0x02, 0xd1, 0x01, 0x2c, 0x00, + 0xd1, 0x03, 0x48, 0xbf, 0x69, 0x80, 0x28, 0x02, + 0xd0, 0x02, 0x20, 0x4d, 0xb0, 0x06, 0xe7, 0xe9, + 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, 0x48, 0xb8, + 0x68, 0x00, 0x30, 0x80, 0x78, 0xc0, 0x28, 0x00, + 0xd0, 0x02, 0x20, 0x50, 0xb0, 0x06, 0xe7, 0xdd, + 0x98, 0x05, 0x28, 0x00, 0xd1, 0x05, 0x48, 0xb2, + 0x68, 0x00, 0x30, 0x20, 0x7a, 0x80, 0x28, 0x00, + 0xd0, 0x08, 0x98, 0x05, 0x28, 0x01, 0xd1, 0x08, + 0x48, 0xad, 0x68, 0x00, 0x30, 0x60, 0x7e, 0x80, + 0x28, 0x00, 0xd1, 0x02, 0x20, 0x5a, 0xb0, 0x06, + 0xe7, 0xc8, 0x20, 0x00, 0x4b, 0xa8, 0x68, 0x1b, + 0x6f, 0xdb, 0x72, 0x58, 0x98, 0x05, 0x28, 0x00, + 0xd1, 0x50, 0x2d, 0x01, 0xd0, 0x01, 0x2d, 0x02, + 0xd1, 0x32, 0x4e, 0xa6, 0x68, 0x30, 0x23, 0x01, + 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, 0x20, 0x00, + 0x4b, 0xa3, 0x60, 0x18, 0x48, 0x9e, 0x68, 0x00, + 0x30, 0x80, 0x78, 0x40, 0x00, 0x43, 0x18, 0x18, + 0x01, 0x80, 0x9b, 0x02, 0x18, 0xc0, 0x90, 0x02, + 0x98, 0x02, 0x68, 0x01, 0x48, 0x9a, 0x69, 0x80, + 0x07, 0x80, 0x0f, 0x80, 0x01, 0x80, 0x43, 0x01, + 0x23, 0x20, 0x43, 0x19, 0x4b, 0x99, 0x43, 0x19, + 0x98, 0x02, 0x60, 0x01, 0x4e, 0x98, 0x68, 0x30, + 0x23, 0x01, 0x04, 0xdb, 0x43, 0x18, 0x60, 0x30, + 0x4e, 0x92, 0x68, 0x30, 0x4b, 0x95, 0x40, 0x18, + 0x60, 0x30, 0x2c, 0x00, 0xd1, 0x04, 0x20, 0x00, + 0x4b, 0x8b, 0x68, 0x1b, 0x33, 0x20, 0x72, 0x98, + 0x2d, 0x02, 0xd0, 0x04, 0x20, 0x01, 0x04, 0xc0, + 0x23, 0x33, 0x06, 0x5b, 0x60, 0x18, 0x2c, 0x00, + 0xd1, 0x0f, 0x20, 0xff, 0x02, 0x00, 0x40, 0x08, + 0xd1, 0x0b, 0x2d, 0x02, 0xd0, 0x09, 0x48, 0x82, + 0x68, 0x00, 0x30, 0x80, 0x78, 0x40, 0x23, 0x01, + 0x40, 0x58, 0x4b, 0x7f, 0x68, 0x1b, 0x33, 0x80, + 0x70, 0x58, 0xe0, 0xed, 0x2d, 0x01, 0xd1, 0x73, + 0x2c, 0x00, 0xd1, 0x72, 0x20, 0x31, 0x06, 0x40, + 0x68, 0x80, 0x23, 0x08, 0x40, 0x18, 0xd1, 0x3a, + 0x48, 0x7a, 0x68, 0x06, 0x23, 0x05, 0x05, 0x9b, + 0x43, 0x33, 0x60, 0x03, 0x68, 0x10, 0x4b, 0x7c, + 0x40, 0x18, 0x60, 0x10, 0x32, 0xc0, 0x68, 0x10, + 0x4b, 0x79, 0x40, 0x18, 0x60, 0x10, 0x20, 0x00, + 0x4b, 0x6f, 0x68, 0x1b, 0x67, 0x58, 0x20, 0x00, + 0x4b, 0x6d, 0x68, 0x1b, 0x33, 0x80, 0x70, 0x18, + 0x48, 0x6d, 0x68, 0x80, 0x23, 0x02, 0x40, 0x18, + 0xd1, 0x04, 0x20, 0x00, 0x4b, 0x68, 0x68, 0x1b, + 0x33, 0x60, 0x76, 0x98, 0x20, 0x5b, 0x4b, 0x66, + 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x4e, 0x6d, + 0x68, 0x30, 0x23, 0x02, 0x43, 0x18, 0x60, 0x30, + 0x4e, 0x67, 0x68, 0x30, 0x23, 0x05, 0x05, 0x9b, + 0x43, 0x18, 0x60, 0x30, 0x4e, 0x61, 0x68, 0x30, + 0x4b, 0x67, 0x40, 0x18, 0x60, 0x30, 0x20, 0x5b, + 0xb0, 0x06, 0xe7, 0x2b, 0xe0, 0xae, 0x48, 0x5d, + 0x68, 0x06, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x33, + 0x60, 0x03, 0x20, 0x31, 0x06, 0x40, 0x6a, 0x00, + 0x23, 0x04, 0x40, 0x18, 0xd1, 0x27, 0x9b, 0x01, + 0x20, 0x31, 0x06, 0x40, 0x6b, 0x00, 0x18, 0x1b, + 0x93, 0x01, 0x4e, 0x5c, 0x68, 0x30, 0x23, 0x3b, + 0x40, 0x18, 0x60, 0x30, 0x4e, 0x57, 0x68, 0x30, + 0x23, 0x0e, 0x43, 0x18, 0x60, 0x30, 0x4e, 0x55, + 0x68, 0x30, 0x23, 0x0c, 0x40, 0x18, 0x60, 0x30, + 0x20, 0x37, 0x23, 0x31, 0x06, 0x5b, 0x60, 0x98, + 0x20, 0x01, 0x90, 0x00, 0x98, 0x00, 0x28, 0x64, + 0xd3, 0x04, 0xe0, 0x07, 0x98, 0x00, 0x30, 0x01, + 0x90, 0x00, 0xe7, 0xf7, 0xe7, 0xfa, 0xe0, 0x01, + 0xe0, 0x36, 0xe0, 0x34, 0xe7, 0xd1, 0x4e, 0x46, + 0x68, 0x30, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, + 0x60, 0x30, 0x4e, 0x40, 0x68, 0x30, 0x4b, 0x48, + 0x40, 0x18, 0x60, 0x30, 0x48, 0x3c, 0x68, 0x40, + 0x28, 0x00, 0xd0, 0x0d, 0x20, 0x5b, 0x4b, 0x38, + 0x68, 0x1b, 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, + 0x4b, 0x35, 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, + 0x20, 0x5b, 0xb0, 0x06, 0xe6, 0xda, 0xe0, 0x5d, + 0x48, 0x31, 0x68, 0x00, 0x6f, 0xc0, 0x1d, 0x06, + 0x48, 0x2f, 0x68, 0x00, 0x30, 0x80, 0x78, 0x00, + 0x9b, 0x01, 0x1a, 0xc0, 0x68, 0x33, 0x18, 0xc0, + 0x60, 0x30, 0x20, 0x5c, 0x4b, 0x2a, 0x68, 0x1b, + 0x6f, 0xdb, 0x72, 0x58, 0x20, 0x00, 0x4b, 0x28, + 0x68, 0x1b, 0x33, 0x60, 0x76, 0x98, 0xe0, 0x3f, + 0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, 0x90, 0x03, + 0x23, 0x04, 0x40, 0x18, 0xd0, 0x03, 0x20, 0x52, + 0xb0, 0x06, 0xe6, 0xb7, 0xe0, 0x3a, 0x98, 0x03, + 0x01, 0x00, 0x19, 0xc7, 0x48, 0x1e, 0x68, 0x00, + 0x6f, 0x40, 0x28, 0xbc, 0xdd, 0x07, 0x48, 0x29, + 0x60, 0xb8, 0x20, 0xbc, 0x4b, 0x1a, 0x68, 0x1b, + 0x33, 0x80, 0x70, 0x18, 0xe0, 0x0d, 0x48, 0x18, + 0x68, 0x00, 0x6f, 0x40, 0x23, 0x01, 0x07, 0x9b, + 0x43, 0x18, 0x60, 0xb8, 0x48, 0x14, 0x68, 0x00, + 0x6f, 0x40, 0x4b, 0x13, 0x68, 0x1b, 0x33, 0x80, + 0x70, 0x18, 0x48, 0x11, 0x68, 0x00, 0x30, 0x80, + 0x78, 0x80, 0x00, 0x43, 0x18, 0x18, 0x01, 0x80, + 0x18, 0x82, 0x48, 0x0d, 0x68, 0x00, 0x6f, 0x00, + 0x60, 0x38, 0x1d, 0x10, 0x60, 0x78, 0x20, 0x01, + 0x06, 0x00, 0x60, 0xf8, 0x9e, 0x03, 0x20, 0x01, + 0x40, 0xb0, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58, + 0x20, 0x00, 0xb0, 0x06, 0xe6, 0x7e, 0xb0, 0x04, + 0xb0, 0x02, 0xe6, 0x7b, 0xe6, 0x7a, 0x00, 0x00, + 0x9e, 0x00, 0x0b, 0x80, 0x9e, 0x00, 0x09, 0x80, + 0x2e, 0x08, 0x7c, 0x44, 0x9e, 0x00, 0x0a, 0x00, + 0x66, 0x00, 0x01, 0x00, 0x66, 0x00, 0x00, 0x08, + 0x62, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x66, 0x00, 0x00, 0x04, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xff, 0x62, 0x00, 0x00, 0x1c, + 0xfe, 0xbf, 0xff, 0xff, 0x62, 0x00, 0x00, 0x08, + 0xff, 0xbf, 0xff, 0xff, 0x40, 0x00, 0x00, 0xbc, + 0x48, 0x07, 0x69, 0x80, 0x28, 0x02, 0xd0, 0x03, + 0x48, 0x05, 0x69, 0x80, 0x28, 0x03, 0xd1, 0x04, + 0x20, 0x31, 0x06, 0x40, 0x6a, 0x80, 0x47, 0x70, + 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfb, 0xe7, 0xfa, + 0x66, 0x00, 0x01, 0x00, 0xb5, 0xb0, 0x27, 0x0f, + 0x20, 0x31, 0x06, 0x40, 0x68, 0xc0, 0x09, 0x05, + 0xf7, 0xff, 0xff, 0xe6, 0x43, 0xc4, 0x48, 0x18, + 0x69, 0x80, 0x28, 0x00, 0xd0, 0x03, 0x48, 0x16, + 0x69, 0x80, 0x28, 0x01, 0xd1, 0x03, 0x1c, 0x38, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x2d, 0x09, + 0xd2, 0x1e, 0xa3, 0x02, 0x5d, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x07, 0x07, 0x07, 0x0e, 0x00, 0x1c, 0x2f, + 0xe0, 0x13, 0x20, 0x08, 0x40, 0x20, 0xd0, 0x01, + 0x1c, 0x2f, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x0c, + 0x20, 0x08, 0x40, 0x20, 0xd0, 0x06, 0x20, 0x02, + 0x40, 0x20, 0xd0, 0x01, 0x27, 0x07, 0xe0, 0x00, + 0x27, 0x08, 0xe0, 0x00, 0x27, 0x02, 0xe0, 0x00, + 0xe7, 0xff, 0x1c, 0x38, 0xe7, 0xd8, 0xe7, 0xd7, + 0x66, 0x00, 0x01, 0x00, 0x1c, 0x01, 0x29, 0x07, + 0xd2, 0x0f, 0xa3, 0x02, 0x5c, 0x5b, 0x00, 0x5b, + 0x44, 0x9f, 0x1c, 0x00, 0x04, 0x05, 0x06, 0x09, + 0x08, 0x07, 0x0a, 0x00, 0xe0, 0x06, 0xe0, 0x05, + 0xe0, 0x04, 0xe0, 0x03, 0xe0, 0x02, 0xe0, 0x01, + 0xe0, 0x00, 0xe7, 0xff, 0x20, 0x00, 0x47, 0x70, + 0xe7, 0xfd, 0x00, 0x00, 0x20, 0x1d, 0x02, 0x80, + 0x69, 0x80, 0x49, 0x06, 0x60, 0x08, 0x20, 0x1d, + 0x02, 0x80, 0x69, 0x40, 0x49, 0x04, 0x60, 0x08, + 0x20, 0x1d, 0x02, 0x80, 0x69, 0xc0, 0x49, 0x03, + 0x60, 0x08, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x90, + 0x2e, 0x08, 0x94, 0x94, 0x2e, 0x08, 0x94, 0x98, + 0xb5, 0xf1, 0xb0, 0x81, 0x20, 0x00, 0x4d, 0x21, + 0x95, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, + 0x43, 0xdb, 0x4c, 0x1f, 0x68, 0x64, 0x42, 0x8c, + 0xdd, 0x21, 0x1c, 0x0c, 0x31, 0x01, 0x00, 0xa4, + 0x9d, 0x00, 0x59, 0x2f, 0x42, 0x9f, 0xd0, 0xf8, + 0x4c, 0x19, 0x68, 0x64, 0x42, 0x8c, 0xda, 0x00, + 0xe0, 0x15, 0x32, 0x01, 0x1c, 0x0c, 0x31, 0x01, + 0x00, 0xa4, 0x9d, 0x00, 0x59, 0x2b, 0x42, 0x9f, + 0xd0, 0xf8, 0x02, 0x9c, 0x43, 0x3c, 0x1c, 0x25, + 0x1c, 0x04, 0x30, 0x01, 0x00, 0xa4, 0x9e, 0x01, + 0x51, 0x35, 0x4c, 0x0f, 0x68, 0x64, 0x42, 0x8c, + 0xdb, 0x00, 0x32, 0x01, 0xe7, 0xd9, 0x28, 0x08, + 0xd3, 0x02, 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xfa, + 0x25, 0x00, 0x43, 0xed, 0x00, 0x84, 0x9e, 0x01, + 0x51, 0x35, 0xe7, 0xf7, 0x4c, 0x07, 0x68, 0x24, + 0x2c, 0x00, 0xd1, 0x02, 0x24, 0x0d, 0x06, 0xe4, + 0x61, 0x22, 0xb0, 0x01, 0xb0, 0x01, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x7c, 0xcc, + 0x2e, 0x08, 0x7d, 0x94, 0x2e, 0x08, 0x94, 0x84, + 0xb5, 0x80, 0x48, 0xdc, 0x68, 0x00, 0x28, 0x00, + 0xd1, 0x04, 0x48, 0xda, 0x68, 0x00, 0xbc, 0x80, + 0xbc, 0x08, 0x47, 0x18, 0xf7, 0xff, 0xff, 0x92, + 0x48, 0xd7, 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, + 0x49, 0xd8, 0x60, 0x08, 0x48, 0xd8, 0x49, 0xd9, + 0x60, 0x08, 0x48, 0xd3, 0x49, 0xd8, 0x68, 0x0b, + 0x4a, 0xd8, 0x21, 0x00, 0xf0, 0x01, 0xf8, 0xda, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xd0, 0x68, 0x09, 0x60, 0x08, + 0x20, 0x00, 0x49, 0xca, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xce, + 0x49, 0xc6, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x20, 0x00, 0x49, 0xc5, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, - 0x66, 0x88, 0x48, 0xc0, 0x49, 0xbc, 0x68, 0x09, + 0x66, 0x88, 0x48, 0xc7, 0x49, 0xc1, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x66, 0xc8, - 0x27, 0x00, 0x2f, 0x19, 0xd3, 0x02, 0xe0, 0x38, - 0x37, 0x01, 0xe7, 0xfa, 0x48, 0xba, 0x00, 0xb9, - 0x4a, 0xb1, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, - 0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xb6, - 0x00, 0xb9, 0x4a, 0xad, 0x68, 0x12, 0x18, 0x89, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x60, 0x48, - 0x48, 0xb1, 0x00, 0xb9, 0x4a, 0xaa, 0x68, 0x12, + 0x20, 0x00, 0x49, 0xc0, 0x68, 0x09, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xc9, 0x66, 0x88, 0x48, 0xc0, + 0x49, 0xbc, 0x68, 0x09, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x66, 0xc8, 0x27, 0x00, 0x2f, 0x19, + 0xd3, 0x02, 0xe0, 0x38, 0x37, 0x01, 0xe7, 0xfa, + 0x48, 0xba, 0x00, 0xb9, 0x4a, 0xb1, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0x62, 0x08, 0x48, 0xad, 0x00, 0xb9, 0x4a, 0xa6, + 0x62, 0x08, 0x48, 0xb6, 0x00, 0xb9, 0x4a, 0xad, 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, - 0x18, 0xc9, 0x60, 0x48, 0x48, 0xa8, 0x00, 0xb9, - 0x4a, 0xa3, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, - 0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xa4, - 0x00, 0xb9, 0x4a, 0x9f, 0x68, 0x12, 0x18, 0x89, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0xb1, 0x00, 0xb9, + 0x4a, 0xaa, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x62, 0x08, 0x48, 0xad, + 0x00, 0xb9, 0x4a, 0xa6, 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xc9, 0x60, 0x48, - 0xe7, 0xc6, 0x27, 0x00, 0x2f, 0x07, 0xd3, 0x02, - 0xe0, 0x86, 0x37, 0x01, 0xe7, 0xfa, 0x48, 0x9c, - 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x92, + 0x48, 0xa8, 0x00, 0xb9, 0x4a, 0xa3, 0x68, 0x12, + 0x18, 0x89, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, + 0x62, 0x08, 0x48, 0xa4, 0x00, 0xb9, 0x4a, 0x9f, + 0x68, 0x12, 0x18, 0x89, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xc9, 0x60, 0x48, 0xe7, 0xc6, 0x27, 0x00, + 0x2f, 0x07, 0xd3, 0x02, 0xe0, 0x86, 0x37, 0x01, + 0xe7, 0xfa, 0x48, 0x9c, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x92, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x96, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x8c, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x91, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x87, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, - 0x18, 0xc9, 0x60, 0x08, 0x48, 0x96, 0x00, 0xb9, - 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x8c, 0x68, 0x12, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x8b, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x81, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, - 0x67, 0xc8, 0x48, 0x91, 0x00, 0xb9, 0x19, 0xc9, - 0x00, 0xc9, 0x4a, 0x87, 0x68, 0x12, 0x18, 0x89, - 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x48, - 0x48, 0x8b, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, - 0x4a, 0x81, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, - 0x02, 0x1b, 0x18, 0xc9, 0x67, 0x88, 0x48, 0x86, - 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x7e, + 0x67, 0x88, 0x48, 0x86, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x7e, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x80, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x78, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x7b, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x73, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, - 0x18, 0xc9, 0x60, 0x08, 0x48, 0x80, 0x00, 0xb9, - 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x78, 0x68, 0x12, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x75, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x6d, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, - 0x67, 0xc8, 0x48, 0x7b, 0x00, 0xb9, 0x19, 0xc9, - 0x00, 0xc9, 0x4a, 0x73, 0x68, 0x12, 0x18, 0x89, - 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x48, - 0x48, 0x75, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, - 0x4a, 0x6d, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, - 0x02, 0x1b, 0x18, 0xc9, 0x67, 0x88, 0x48, 0x70, - 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x6a, + 0x67, 0x88, 0x48, 0x70, 0x00, 0xb9, 0x19, 0xc9, + 0x00, 0xc9, 0x4a, 0x6a, 0x68, 0x12, 0x18, 0x89, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x08, + 0x48, 0x6a, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, + 0x4a, 0x64, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc9, 0x67, 0xc8, 0x48, 0x65, + 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x5f, 0x68, 0x12, 0x18, 0x89, 0x23, 0x0b, 0x01, 0xdb, - 0x18, 0xc9, 0x60, 0x08, 0x48, 0x6a, 0x00, 0xb9, - 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x64, 0x68, 0x12, + 0x18, 0xc9, 0x60, 0x48, 0x48, 0x5f, 0x00, 0xb9, + 0x19, 0xc9, 0x00, 0xc9, 0x4a, 0x59, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc9, - 0x67, 0xc8, 0x48, 0x65, 0x00, 0xb9, 0x19, 0xc9, - 0x00, 0xc9, 0x4a, 0x5f, 0x68, 0x12, 0x18, 0x89, - 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x60, 0x48, - 0x48, 0x5f, 0x00, 0xb9, 0x19, 0xc9, 0x00, 0xc9, - 0x4a, 0x59, 0x68, 0x12, 0x18, 0x89, 0x23, 0x05, - 0x02, 0x1b, 0x18, 0xc9, 0x67, 0x88, 0xe7, 0x78, - 0x27, 0x00, 0x2f, 0x12, 0xd3, 0x02, 0xe0, 0x56, - 0x37, 0x01, 0xe7, 0xfa, 0x48, 0x56, 0x21, 0x4c, - 0x43, 0x79, 0x4a, 0x4d, 0x68, 0x12, 0x18, 0x89, - 0x62, 0xc8, 0x48, 0x53, 0x21, 0x4c, 0x43, 0x79, - 0x4a, 0x49, 0x68, 0x12, 0x18, 0x89, 0x62, 0x88, - 0x48, 0x4f, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x46, - 0x68, 0x12, 0x18, 0x89, 0x63, 0x08, 0x48, 0x4c, - 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x42, 0x68, 0x12, - 0x18, 0x89, 0x62, 0x48, 0x48, 0x48, 0x21, 0x4c, - 0x43, 0x79, 0x4a, 0x41, 0x68, 0x12, 0x18, 0x89, - 0x62, 0xc8, 0x48, 0x45, 0x21, 0x4c, 0x43, 0x79, - 0x4a, 0x3d, 0x68, 0x12, 0x18, 0x89, 0x62, 0x88, - 0x48, 0x41, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x3a, - 0x68, 0x12, 0x18, 0x89, 0x63, 0x08, 0x48, 0x3e, - 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x36, 0x68, 0x12, - 0x18, 0x89, 0x62, 0x48, 0x48, 0x3a, 0x21, 0x4c, - 0x43, 0x79, 0x4a, 0x35, 0x68, 0x12, 0x18, 0x89, - 0x62, 0xc8, 0x48, 0x37, 0x21, 0x4c, 0x43, 0x79, - 0x4a, 0x31, 0x68, 0x12, 0x18, 0x89, 0x62, 0x88, - 0x48, 0x33, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2e, - 0x68, 0x12, 0x18, 0x89, 0x63, 0x08, 0x48, 0x30, - 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x2a, 0x68, 0x12, - 0x18, 0x89, 0x62, 0x48, 0xe7, 0xa8, 0x20, 0x00, - 0x49, 0x25, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x22, - 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0x61, 0x88, 0x20, 0x00, 0x49, 0x1c, 0x68, 0x09, + 0x67, 0x88, 0xe7, 0x78, 0x27, 0x00, 0x2f, 0x12, + 0xd3, 0x02, 0xe0, 0x56, 0x37, 0x01, 0xe7, 0xfa, + 0x48, 0x56, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x4d, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x53, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x49, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x4f, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x46, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x4c, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x42, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0x48, 0x48, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x41, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x45, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x3d, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x41, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x3a, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x3e, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x36, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0x48, 0x3a, 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x35, + 0x68, 0x12, 0x18, 0x89, 0x62, 0xc8, 0x48, 0x37, + 0x21, 0x4c, 0x43, 0x79, 0x4a, 0x31, 0x68, 0x12, + 0x18, 0x89, 0x62, 0x88, 0x48, 0x33, 0x21, 0x4c, + 0x43, 0x79, 0x4a, 0x2e, 0x68, 0x12, 0x18, 0x89, + 0x63, 0x08, 0x48, 0x30, 0x21, 0x4c, 0x43, 0x79, + 0x4a, 0x2a, 0x68, 0x12, 0x18, 0x89, 0x62, 0x48, + 0xe7, 0xa8, 0x20, 0x00, 0x49, 0x25, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, - 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 0x23, 0x0d, + 0x20, 0x00, 0x49, 0x22, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x00, - 0x49, 0x19, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x16, + 0x49, 0x1c, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xc9, 0x61, 0xc8, 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, - 0x61, 0x88, 0x20, 0x92, 0x49, 0x17, 0x60, 0x08, - 0x27, 0x00, 0x2f, 0x08, 0xd3, 0x02, 0xe0, 0x08, - 0x37, 0x01, 0xe7, 0xfa, 0x20, 0x00, 0x43, 0xc0, - 0x00, 0xb9, 0x4b, 0x13, 0x18, 0xc9, 0x64, 0x08, - 0xe7, 0xf6, 0x20, 0x10, 0x21, 0x0d, 0x06, 0xc9, - 0x61, 0x08, 0x20, 0x01, 0x49, 0x0f, 0x60, 0x08, - 0x48, 0x0e, 0x68, 0x00, 0xe6, 0x4d, 0xe6, 0x4c, - 0x2e, 0x08, 0x60, 0x8c, 0x2e, 0x08, 0x7d, 0xc4, - 0x2e, 0x08, 0x7d, 0xb8, 0x2e, 0x08, 0x85, 0x5c, - 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x8c, 0xf4, - 0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x94, 0x9c, - 0x00, 0x00, 0x16, 0xc8, 0x3f, 0xff, 0xff, 0xff, - 0x00, 0x00, 0xff, 0xff, 0x2e, 0x08, 0x94, 0x90, - 0x68, 0x00, 0x0d, 0x00, 0x2e, 0x08, 0x94, 0x8c, + 0x61, 0x88, 0x20, 0x00, 0x49, 0x19, 0x68, 0x09, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xc9, 0x61, 0xc8, + 0x20, 0x00, 0x49, 0x16, 0x68, 0x09, 0x23, 0x0d, + 0x01, 0xdb, 0x18, 0xc9, 0x61, 0x88, 0x20, 0x92, + 0x49, 0x17, 0x60, 0x08, 0x27, 0x00, 0x2f, 0x08, + 0xd3, 0x02, 0xe0, 0x08, 0x37, 0x01, 0xe7, 0xfa, + 0x20, 0x00, 0x43, 0xc0, 0x00, 0xb9, 0x4b, 0x13, + 0x18, 0xc9, 0x64, 0x08, 0xe7, 0xf6, 0x20, 0x10, + 0x21, 0x0d, 0x06, 0xc9, 0x61, 0x08, 0x20, 0x01, + 0x49, 0x0f, 0x60, 0x08, 0x48, 0x0e, 0x68, 0x00, + 0xe6, 0x4d, 0xe6, 0x4c, 0x2e, 0x08, 0x60, 0x84, + 0x2e, 0x08, 0x7d, 0xbc, 0x2e, 0x08, 0x7d, 0xb0, + 0x2e, 0x08, 0x85, 0x54, 0x2e, 0x08, 0x7d, 0xb4, + 0x2e, 0x08, 0x8c, 0xec, 0x2e, 0x08, 0x7d, 0xb8, + 0x2e, 0x08, 0x94, 0x94, 0x00, 0x00, 0x16, 0xc8, + 0x3f, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, + 0x2e, 0x08, 0x94, 0x88, 0x68, 0x00, 0x0d, 0x00, + 0x2e, 0x08, 0x94, 0x84, 0xb5, 0x90, 0x1c, 0x04, + 0x1c, 0x0f, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00, + 0xf8, 0x4d, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, + 0xf8, 0x03, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, + 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x68, 0x78, + 0x28, 0x07, 0xd9, 0x1d, 0x23, 0x03, 0x02, 0x5b, + 0x18, 0xf8, 0x6d, 0x40, 0x28, 0x00, 0xd0, 0x06, + 0x23, 0x03, 0x02, 0x5b, 0x18, 0xf8, 0x6d, 0x80, + 0x04, 0x00, 0x0c, 0x00, 0xd1, 0x02, 0x20, 0x02, + 0x60, 0xb8, 0xe0, 0x01, 0x20, 0x03, 0x60, 0xb8, + 0x1d, 0xfd, 0x35, 0x05, 0x23, 0x65, 0x01, 0x1b, + 0x18, 0xfe, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x11, + 0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0xee, + 0x2c, 0x06, 0xd0, 0x18, 0x00, 0xa0, 0x19, 0x00, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b, + 0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc5, + 0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, + 0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x04, + 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xd3, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x90, + 0x2e, 0x08, 0x94, 0x98, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0x2f, 0x10, 0xd0, 0x13, 0x20, 0x4c, + 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x01, + 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5, + 0x35, 0x4d, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, + 0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, + 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0xb3, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0x98, 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0x1c, 0x39, - 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x4d, 0x1c, 0x39, - 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x03, 0xbc, 0x90, + 0x1c, 0x20, 0xf0, 0x00, 0xf8, 0x07, 0x1c, 0x39, + 0x20, 0x00, 0xf0, 0x00, 0xf8, 0x33, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0xf0, 0x1c, 0x04, - 0x1c, 0x0f, 0x68, 0x78, 0x28, 0x07, 0xd9, 0x1d, - 0x23, 0x03, 0x02, 0x5b, 0x18, 0xf8, 0x6d, 0x40, - 0x28, 0x00, 0xd0, 0x06, 0x23, 0x03, 0x02, 0x5b, - 0x18, 0xf8, 0x6d, 0x80, 0x04, 0x00, 0x0c, 0x00, - 0xd1, 0x02, 0x20, 0x02, 0x60, 0xb8, 0xe0, 0x01, - 0x20, 0x03, 0x60, 0xb8, 0x1d, 0xfd, 0x35, 0x05, - 0x23, 0x65, 0x01, 0x1b, 0x18, 0xfe, 0x1c, 0x31, - 0x1c, 0x28, 0x4a, 0x11, 0x68, 0x13, 0x22, 0x28, - 0xf0, 0x00, 0xfe, 0xee, 0x2c, 0x06, 0xd0, 0x18, + 0x1c, 0x0f, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0xb1, 0x00, 0xdb, 0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, - 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc6, 0x00, 0xa0, - 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0xb1, - 0x00, 0xdb, 0x18, 0xc5, 0x20, 0x06, 0x1b, 0x00, - 0x00, 0x82, 0x18, 0x12, 0x00, 0xd2, 0x1c, 0x31, - 0x1c, 0x28, 0x4b, 0x04, 0x68, 0x1b, 0xf0, 0x00, - 0xfe, 0xd3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x94, 0x98, 0x2e, 0x08, 0x94, 0xa0, - 0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x2f, 0x10, - 0xd0, 0x13, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, - 0x1d, 0xc6, 0x36, 0x01, 0x20, 0x4c, 0x43, 0x78, - 0x19, 0x00, 0x1d, 0xc5, 0x35, 0x4d, 0x20, 0x10, + 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc5, 0x20, 0x06, + 0x1b, 0x00, 0x00, 0x82, 0x18, 0x12, 0x00, 0xd2, + 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x09, 0x68, 0x1b, + 0xf0, 0x00, 0xfe, 0x84, 0x1d, 0xfe, 0x36, 0x05, + 0x23, 0x65, 0x01, 0x1b, 0x18, 0xfd, 0x1c, 0x31, + 0x1c, 0x28, 0x4a, 0x05, 0x68, 0x13, 0x22, 0x28, + 0xf0, 0x00, 0xfe, 0x78, 0xbc, 0xf0, 0xbc, 0x08, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x98, + 0x2e, 0x08, 0x94, 0x90, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, + 0x1d, 0xc6, 0x36, 0x4d, 0x20, 0x4c, 0x43, 0x78, + 0x19, 0x00, 0x1d, 0xc5, 0x35, 0x01, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, 0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, 0x68, 0x1b, 0xf0, 0x00, - 0xfe, 0xb3, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x94, 0xa0, 0xb5, 0x90, 0x1c, 0x04, - 0x1c, 0x0f, 0x1c, 0x39, 0x1c, 0x20, 0xf0, 0x00, - 0xf8, 0x07, 0x1c, 0x39, 0x20, 0x00, 0xf0, 0x00, - 0xf8, 0x33, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x00, 0xa0, - 0x19, 0x00, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0xb1, - 0x00, 0xdb, 0x18, 0xc6, 0x00, 0xa0, 0x19, 0x00, - 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x2b, 0x01, 0x5b, - 0x18, 0xc5, 0x20, 0x06, 0x1b, 0x00, 0x00, 0x82, - 0x18, 0x12, 0x00, 0xd2, 0x1c, 0x31, 0x1c, 0x28, - 0x4b, 0x09, 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0x84, - 0x1d, 0xfe, 0x36, 0x05, 0x23, 0x65, 0x01, 0x1b, - 0x18, 0xfd, 0x1c, 0x31, 0x1c, 0x28, 0x4a, 0x05, - 0x68, 0x13, 0x22, 0x28, 0xf0, 0x00, 0xfe, 0x78, - 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x94, 0xa0, 0x2e, 0x08, 0x94, 0x98, - 0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0x20, 0x4c, - 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc6, 0x36, 0x4d, - 0x20, 0x4c, 0x43, 0x78, 0x19, 0x00, 0x1d, 0xc5, - 0x35, 0x01, 0x20, 0x10, 0x1b, 0xc0, 0x22, 0x4c, - 0x43, 0x42, 0x1c, 0x31, 0x1c, 0x28, 0x4b, 0x03, - 0x68, 0x1b, 0xf0, 0x00, 0xfe, 0x59, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xa0, - 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x20, 0x00, - 0x1c, 0x03, 0x30, 0x01, 0x00, 0x9b, 0x18, 0x9c, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, - 0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd2, 0x00, - 0xe7, 0xf2, 0x38, 0x01, 0x21, 0x18, 0x42, 0x81, - 0xd8, 0x02, 0xe0, 0x1a, 0x39, 0x01, 0xe7, 0xfa, - 0x00, 0x8b, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xe3, 0x69, 0xdc, 0x00, 0x8b, 0x18, 0x9d, - 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, - 0x00, 0x8b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, - 0x18, 0xe3, 0x68, 0x1c, 0x00, 0x8b, 0x18, 0x9d, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, - 0xe7, 0xe4, 0x23, 0x00, 0x2b, 0x00, 0xd0, 0x10, - 0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, - 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, - 0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, - 0xe0, 0x0e, 0x10, 0x7c, 0x00, 0x83, 0x18, 0x9d, - 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, - 0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, - 0xbc, 0xb0, 0x47, 0x70, 0xb4, 0xb0, 0x1c, 0x02, - 0x1c, 0x0f, 0x21, 0x00, 0x1c, 0x0b, 0x31, 0x01, + 0xfe, 0x59, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, + 0x2e, 0x08, 0x94, 0x98, 0xb4, 0xb0, 0x1c, 0x02, + 0x1c, 0x0f, 0x20, 0x00, 0x1c, 0x03, 0x30, 0x01, 0x00, 0x9b, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, 0x10, 0x7c, 0x34, 0x01, - 0x42, 0xa3, 0xd0, 0x00, 0xe7, 0xf2, 0x39, 0x01, - 0x1c, 0x08, 0x28, 0x18, 0xd3, 0x02, 0xe0, 0x1a, - 0x30, 0x01, 0xe7, 0xfa, 0x00, 0x83, 0x18, 0x9c, - 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xe3, 0x6a, 0x5c, + 0x42, 0xa3, 0xd2, 0x00, 0xe7, 0xf2, 0x38, 0x01, + 0x21, 0x18, 0x42, 0x81, 0xd8, 0x02, 0xe0, 0x1a, + 0x39, 0x01, 0xe7, 0xfa, 0x00, 0x8b, 0x18, 0x9c, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xe3, 0x69, 0xdc, + 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x00, 0x8b, 0x18, 0x9c, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x1c, + 0x00, 0x8b, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xe7, 0xe4, 0x23, 0x00, + 0x2b, 0x00, 0xd0, 0x10, 0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xeb, 0x62, 0x1c, 0x00, 0x83, 0x18, 0x9c, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x9c, + 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, - 0x18, 0xeb, 0x60, 0x5c, 0xe7, 0xe4, 0x4c, 0x06, - 0x23, 0x07, 0x02, 0x1b, 0x18, 0xd3, 0x60, 0x1c, - 0x4c, 0x03, 0x23, 0x07, 0x02, 0x1b, 0x18, 0xd3, - 0x66, 0x5c, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xb4, 0xb0, 0x1c, 0x07, - 0x1c, 0x0c, 0x1c, 0x15, 0x6a, 0xa1, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x19, 0x62, 0x39, 0x21, 0x01, - 0x02, 0x89, 0x43, 0x29, 0x62, 0x79, 0x6a, 0xe1, - 0x05, 0x89, 0x0d, 0x89, 0x61, 0xf9, 0x6b, 0x61, - 0x31, 0x01, 0x05, 0x89, 0x0d, 0x89, 0x61, 0xb9, - 0x69, 0x61, 0x60, 0xf9, 0x69, 0xa1, 0x61, 0x39, - 0x69, 0xe1, 0x61, 0x79, 0x68, 0xa1, 0x23, 0x01, - 0x06, 0x1b, 0x40, 0x19, 0xd0, 0x02, 0x49, 0x0f, - 0x60, 0xb9, 0xe0, 0x01, 0x21, 0x00, 0x60, 0xb9, - 0x6a, 0x60, 0x28, 0x00, 0xd0, 0x0b, 0x68, 0x41, - 0x60, 0x39, 0x78, 0x01, 0x00, 0x89, 0x4b, 0x0a, - 0x18, 0xc9, 0x60, 0x79, 0x68, 0xb9, 0x88, 0x42, - 0x43, 0x11, 0x60, 0xb9, 0xe0, 0x07, 0x21, 0x00, - 0x60, 0x39, 0x21, 0x00, 0x60, 0x79, 0x68, 0xb9, - 0x0c, 0x09, 0x04, 0x09, 0x60, 0xb9, 0xbc, 0xb0, - 0x47, 0x70, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0x68, 0x00, 0x08, 0x00, 0xb4, 0x80, 0x1c, 0x02, - 0x1c, 0x0f, 0x69, 0x79, 0x60, 0xd1, 0x69, 0xb9, - 0x61, 0x11, 0x69, 0xf9, 0x61, 0x51, 0x68, 0xb9, - 0x23, 0x01, 0x06, 0x1b, 0x40, 0x19, 0xd0, 0x02, - 0x49, 0x0e, 0x60, 0x91, 0xe0, 0x01, 0x21, 0x00, - 0x60, 0x91, 0x6a, 0x78, 0x28, 0x00, 0xd0, 0x0b, - 0x68, 0x41, 0x60, 0x11, 0x78, 0x01, 0x00, 0x89, - 0x4b, 0x09, 0x18, 0xc9, 0x60, 0x51, 0x68, 0x91, - 0x88, 0x43, 0x43, 0x19, 0x60, 0x91, 0xe0, 0x07, - 0x21, 0x00, 0x60, 0x11, 0x21, 0x00, 0x60, 0x51, - 0x68, 0x91, 0x0c, 0x09, 0x04, 0x09, 0x60, 0x91, - 0xbc, 0x80, 0x47, 0x70, 0xff, 0xff, 0x00, 0x00, - 0x68, 0x00, 0x08, 0x00, 0x1c, 0x01, 0x48, 0x07, - 0x62, 0x08, 0x48, 0x06, 0x62, 0x48, 0x48, 0x05, - 0x61, 0xc8, 0x48, 0x04, 0x61, 0x88, 0x20, 0x00, - 0x60, 0x08, 0x20, 0x00, 0x60, 0x48, 0x20, 0x00, - 0x60, 0x88, 0x47, 0x70, 0x00, 0x00, 0xff, 0xff, - 0xb5, 0xb0, 0x1c, 0x07, 0x1c, 0x0c, 0x2c, 0x07, - 0xd2, 0x73, 0x25, 0x00, 0x2d, 0x07, 0xdb, 0x02, - 0xe0, 0x2f, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, - 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, - 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, - 0x19, 0x49, 0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, - 0x01, 0xdb, 0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, - 0xd0, 0x1a, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, - 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, - 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x18, 0xeb, 0x60, 0x5c, 0xe0, 0x0e, 0x10, 0x7c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xeb, 0x62, 0x1c, 0x10, 0x7b, 0x1c, 0x5c, + 0x00, 0x83, 0x18, 0x9d, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xeb, 0x60, 0x5c, 0xbc, 0xb0, 0x47, 0x70, + 0xb4, 0xb0, 0x1c, 0x02, 0x1c, 0x0f, 0x21, 0x00, + 0x1c, 0x0b, 0x31, 0x01, 0x00, 0x9b, 0x18, 0x9c, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xe3, 0x68, 0x5b, + 0x10, 0x7c, 0x34, 0x01, 0x42, 0xa3, 0xd0, 0x00, + 0xe7, 0xf2, 0x39, 0x01, 0x1c, 0x08, 0x28, 0x18, + 0xd3, 0x02, 0xe0, 0x1a, 0x30, 0x01, 0xe7, 0xfa, + 0x00, 0x83, 0x18, 0x9c, 0x23, 0x0d, 0x01, 0xdb, + 0x18, 0xe3, 0x6a, 0x5c, 0x00, 0x83, 0x18, 0x9d, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xeb, 0x62, 0x1c, + 0x00, 0x83, 0x18, 0x9c, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xe3, 0x68, 0x9c, 0x00, 0x83, 0x18, 0x9d, + 0x23, 0x07, 0x02, 0x1b, 0x18, 0xeb, 0x60, 0x5c, + 0xe7, 0xe4, 0x4c, 0x06, 0x23, 0x07, 0x02, 0x1b, + 0x18, 0xd3, 0x60, 0x1c, 0x4c, 0x03, 0x23, 0x07, + 0x02, 0x1b, 0x18, 0xd3, 0x66, 0x5c, 0xbc, 0xb0, + 0x47, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xb4, 0xb0, 0x1c, 0x07, 0x1c, 0x0c, 0x1c, 0x15, + 0x6a, 0xa1, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x19, + 0x62, 0x39, 0x21, 0x01, 0x02, 0x89, 0x43, 0x29, + 0x62, 0x79, 0x6a, 0xe1, 0x05, 0x89, 0x0d, 0x89, + 0x61, 0xf9, 0x6b, 0x61, 0x31, 0x01, 0x05, 0x89, + 0x0d, 0x89, 0x61, 0xb9, 0x69, 0x61, 0x60, 0xf9, + 0x69, 0xa1, 0x61, 0x39, 0x69, 0xe1, 0x61, 0x79, + 0x68, 0xa1, 0x23, 0x01, 0x06, 0x1b, 0x40, 0x19, + 0xd0, 0x02, 0x49, 0x0f, 0x60, 0xb9, 0xe0, 0x01, + 0x21, 0x00, 0x60, 0xb9, 0x6a, 0x60, 0x28, 0x00, + 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x39, 0x78, 0x01, + 0x00, 0x89, 0x4b, 0x0a, 0x18, 0xc9, 0x60, 0x79, + 0x68, 0xb9, 0x88, 0x42, 0x43, 0x11, 0x60, 0xb9, + 0xe0, 0x07, 0x21, 0x00, 0x60, 0x39, 0x21, 0x00, + 0x60, 0x79, 0x68, 0xb9, 0x0c, 0x09, 0x04, 0x09, + 0x60, 0xb9, 0xbc, 0xb0, 0x47, 0x70, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, + 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x69, 0x79, + 0x60, 0xd1, 0x69, 0xb9, 0x61, 0x11, 0x69, 0xf9, + 0x61, 0x51, 0x68, 0xb9, 0x23, 0x01, 0x06, 0x1b, + 0x40, 0x19, 0xd0, 0x02, 0x49, 0x0e, 0x60, 0x91, + 0xe0, 0x01, 0x21, 0x00, 0x60, 0x91, 0x6a, 0x78, + 0x28, 0x00, 0xd0, 0x0b, 0x68, 0x41, 0x60, 0x11, + 0x78, 0x01, 0x00, 0x89, 0x4b, 0x09, 0x18, 0xc9, + 0x60, 0x51, 0x68, 0x91, 0x88, 0x43, 0x43, 0x19, + 0x60, 0x91, 0xe0, 0x07, 0x21, 0x00, 0x60, 0x11, + 0x21, 0x00, 0x60, 0x51, 0x68, 0x91, 0x0c, 0x09, + 0x04, 0x09, 0x60, 0x91, 0xbc, 0x80, 0x47, 0x70, + 0xff, 0xff, 0x00, 0x00, 0x68, 0x00, 0x08, 0x00, + 0x1c, 0x01, 0x48, 0x07, 0x62, 0x08, 0x48, 0x06, + 0x62, 0x48, 0x48, 0x05, 0x61, 0xc8, 0x48, 0x04, + 0x61, 0x88, 0x20, 0x00, 0x60, 0x08, 0x20, 0x00, + 0x60, 0x48, 0x20, 0x00, 0x60, 0x88, 0x47, 0x70, + 0x00, 0x00, 0xff, 0xff, 0xb5, 0xb0, 0x1c, 0x07, + 0x1c, 0x0c, 0x2c, 0x07, 0xd2, 0x73, 0x25, 0x00, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, - 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x01, 0x48, 0xf8, 0xf0, 0x00, 0xfb, 0xd2, - 0xe7, 0xcf, 0x23, 0xcf, 0x00, 0xdb, 0x18, 0xf8, - 0xf7, 0xff, 0xfb, 0xb8, 0x25, 0x00, 0x2d, 0x07, - 0xdb, 0x02, 0xe0, 0x54, 0x35, 0x01, 0xe7, 0xfa, - 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, - 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, - 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, 0x19, 0xc9, - 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, 0x68, 0x49, - 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, 0x19, 0x40, - 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, - 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, - 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xf8, + 0xf0, 0x00, 0xfb, 0xd2, 0xe7, 0xcf, 0x23, 0xcf, + 0x00, 0xdb, 0x18, 0xf8, 0xf7, 0xff, 0xfb, 0xb8, + 0x25, 0x00, 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x54, + 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, - 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, - 0x43, 0x98, 0x1c, 0x01, 0x48, 0xdb, 0xf0, 0x00, - 0xfb, 0x6b, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, - 0xe0, 0x00, 0xe0, 0x94, 0x6b, 0x09, 0x42, 0x88, - 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x01, 0x48, 0xcc, 0xf0, 0x00, 0xfb, 0x7a, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x30, 0x34, - 0xf7, 0xff, 0xfb, 0x60, 0xe7, 0xaa, 0x25, 0x07, - 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x4e, 0x35, 0x01, - 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, - 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x39, 0xff, - 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9, 0x42, 0x88, - 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0xc0, - 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xb1, - 0xf0, 0x00, 0xfb, 0x16, 0x20, 0x4c, 0x43, 0x68, - 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, - 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, + 0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, + 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, + 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, - 0x48, 0xa2, 0xf0, 0x00, 0xfb, 0x27, 0x20, 0x4c, - 0x43, 0x68, 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, - 0xfb, 0x0d, 0xe7, 0xb0, 0x25, 0x0a, 0x2d, 0x11, - 0xdb, 0x02, 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, - 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, - 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, - 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x48, 0xdb, 0xf0, 0x00, 0xfb, 0x6b, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, + 0x43, 0x69, 0x19, 0xc9, 0xe0, 0x00, 0xe0, 0x94, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0xcc, + 0xf0, 0x00, 0xfb, 0x7a, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x60, + 0xe7, 0xaa, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, - 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, - 0x43, 0x98, 0x1c, 0x01, 0x48, 0x8d, 0xf0, 0x00, - 0xfa, 0xcf, 0xe7, 0xdf, 0xe1, 0xca, 0x2c, 0x0e, - 0xd3, 0x73, 0x3c, 0x07, 0x1f, 0xe5, 0x42, 0xa5, - 0xd3, 0x02, 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0xb1, 0xf0, 0x00, 0xfb, 0x16, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, - 0x43, 0x98, 0x1c, 0x01, 0x48, 0x79, 0xf0, 0x00, - 0xfa, 0xd5, 0xe7, 0xdf, 0x1c, 0x25, 0x2d, 0x11, - 0xdb, 0x02, 0xe0, 0x50, 0x35, 0x01, 0xe7, 0xfa, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, - 0x43, 0x69, 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, - 0x39, 0x02, 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, - 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, - 0x38, 0x02, 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, - 0x43, 0x98, 0x1c, 0x01, 0x48, 0x61, 0xf0, 0x00, - 0xfa, 0x77, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, - 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, - 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, - 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x53, - 0xf0, 0x00, 0xfa, 0x88, 0x20, 0x4c, 0x43, 0x68, - 0xe0, 0x00, 0xe0, 0x29, 0x19, 0xc0, 0x30, 0x34, - 0xf7, 0xff, 0xfa, 0x6c, 0xe7, 0xae, 0x25, 0x0a, - 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, 0x35, 0x01, - 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, - 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, - 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, - 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x3d, - 0xf0, 0x00, 0xfa, 0x2e, 0xe7, 0xdf, 0xe1, 0x29, - 0x3c, 0x07, 0x1c, 0x25, 0x2d, 0x07, 0xdb, 0x02, - 0xe0, 0x2f, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, - 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, - 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, - 0x19, 0x49, 0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, - 0x01, 0xdb, 0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, - 0xd0, 0x1a, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, - 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, - 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, - 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, - 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x01, 0x48, 0x22, 0xf0, 0x00, 0xfa, 0x26, - 0xe7, 0xcf, 0x25, 0x00, 0x42, 0xa5, 0xd3, 0x02, - 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0xa2, 0xf0, 0x00, + 0xfb, 0x27, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x30, 0x34, 0xf7, 0xff, 0xfb, 0x0d, 0xe7, 0xb0, + 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x8d, 0xf0, 0x00, 0xfa, 0xcf, 0xe7, 0xdf, + 0xe1, 0xca, 0x2c, 0x0e, 0xd3, 0x73, 0x3c, 0x07, + 0x1f, 0xe5, 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x79, 0xf0, 0x00, 0xfa, 0xd5, 0xe7, 0xdf, + 0x1c, 0x25, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x50, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9, + 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x61, 0xf0, 0x00, 0xfa, 0x77, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x01, 0x48, 0x10, 0xf0, 0x00, 0xfa, 0x02, - 0xe7, 0xdf, 0x1c, 0x25, 0x2d, 0x07, 0xdb, 0x02, - 0xe0, 0x55, 0x35, 0x01, 0xe7, 0xfa, 0x00, 0xa8, - 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, - 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x00, 0xa9, - 0x19, 0x49, 0x00, 0xc9, 0x19, 0xc9, 0x23, 0x0b, - 0x01, 0xdb, 0x18, 0xc9, 0x68, 0x49, 0x42, 0x88, - 0xd0, 0x1d, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, - 0x19, 0xc0, 0xe0, 0x01, 0x2e, 0x08, 0x7d, 0x9c, - 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, - 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, - 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, - 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, - 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, - 0x48, 0x50, 0xf0, 0x00, 0xf9, 0x9d, 0x20, 0x4c, + 0x1c, 0x01, 0x48, 0x53, 0xf0, 0x00, 0xfa, 0x88, + 0x20, 0x4c, 0x43, 0x68, 0xe0, 0x00, 0xe0, 0x29, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xfa, 0x6c, + 0xe7, 0xae, 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, - 0x1c, 0x01, 0x48, 0x42, 0xf0, 0x00, 0xf9, 0xae, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x30, 0x34, - 0xf7, 0xff, 0xf9, 0x94, 0xe7, 0xa9, 0x25, 0x07, - 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x4e, 0x35, 0x01, + 0x1c, 0x01, 0x48, 0x3d, 0xf0, 0x00, 0xfa, 0x2e, + 0xe7, 0xdf, 0xe1, 0x29, 0x3c, 0x07, 0x1c, 0x25, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x2f, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1a, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, + 0x01, 0xdb, 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x22, + 0xf0, 0x00, 0xfa, 0x26, 0xe7, 0xcf, 0x25, 0x00, + 0x42, 0xa5, 0xd3, 0x02, 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, - 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x39, 0xff, - 0x39, 0xff, 0x39, 0x02, 0x69, 0xc9, 0x42, 0x88, - 0xd0, 0x18, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, - 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, 0x69, 0xc0, - 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, - 0x38, 0xff, 0x38, 0x02, 0x69, 0x80, 0x23, 0x01, - 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x27, - 0xf0, 0x00, 0xf9, 0x4a, 0x20, 0x4c, 0x43, 0x68, - 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, - 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, - 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, - 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, - 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, - 0x48, 0x18, 0xf0, 0x00, 0xf9, 0x5b, 0x20, 0x4c, - 0x43, 0x68, 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, - 0xf9, 0x41, 0xe7, 0xb0, 0x25, 0x0a, 0x2d, 0x11, - 0xdb, 0x02, 0xe0, 0x1f, 0x35, 0x01, 0xe7, 0xfa, + 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x10, + 0xf0, 0x00, 0xfa, 0x02, 0xe7, 0xdf, 0x1c, 0x25, + 0x2d, 0x07, 0xdb, 0x02, 0xe0, 0x55, 0x35, 0x01, + 0xe7, 0xfa, 0x00, 0xa8, 0x19, 0x40, 0x00, 0xc0, + 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc0, + 0x68, 0x00, 0x00, 0xa9, 0x19, 0x49, 0x00, 0xc9, + 0x19, 0xc9, 0x23, 0x0b, 0x01, 0xdb, 0x18, 0xc9, + 0x68, 0x49, 0x42, 0x88, 0xd0, 0x1d, 0x00, 0xa8, + 0x19, 0x40, 0x00, 0xc0, 0x19, 0xc0, 0xe0, 0x01, + 0x2e, 0x08, 0x7d, 0x94, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x40, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x00, 0xa8, 0x19, 0x40, + 0x00, 0xc0, 0x19, 0xc0, 0x23, 0x0b, 0x01, 0xdb, + 0x18, 0xc0, 0x68, 0x00, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0x50, 0xf0, 0x00, + 0xf9, 0x9d, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, + 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, + 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, 0x48, 0x42, + 0xf0, 0x00, 0xf9, 0xae, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x94, + 0xe7, 0xa9, 0x25, 0x07, 0x2d, 0x11, 0xdb, 0x02, + 0xe0, 0x4e, 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0x80, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x39, 0xff, 0x39, 0xff, 0x39, 0x02, + 0x69, 0xc9, 0x42, 0x88, 0xd0, 0x18, 0x20, 0x4c, + 0x43, 0x68, 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, + 0x38, 0x02, 0x69, 0xc0, 0x23, 0x01, 0x02, 0x9b, + 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x38, 0xff, 0x38, 0xff, 0x38, 0x02, + 0x69, 0x80, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, + 0x1c, 0x01, 0x48, 0x27, 0xf0, 0x00, 0xf9, 0x4a, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, 0x23, 0x01, 0x02, 0x9b, - 0x43, 0x98, 0x1c, 0x01, 0x48, 0x03, 0xf0, 0x00, - 0xf9, 0x03, 0xe7, 0xdf, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0x9c, - 0xb4, 0x90, 0x1c, 0x02, 0x1c, 0x0f, 0x3a, 0x01, - 0x2f, 0x01, 0xd1, 0x0d, 0x09, 0x50, 0x00, 0x80, - 0x49, 0x0d, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, - 0x21, 0x01, 0x40, 0xa1, 0x43, 0x08, 0x09, 0x51, - 0x00, 0x89, 0x4b, 0x09, 0x50, 0x58, 0xe0, 0x0d, - 0x09, 0x50, 0x00, 0x80, 0x49, 0x06, 0x58, 0x08, + 0x43, 0x98, 0x1c, 0x01, 0x48, 0x18, 0xf0, 0x00, + 0xf9, 0x5b, 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, + 0x30, 0x34, 0xf7, 0xff, 0xf9, 0x41, 0xe7, 0xb0, + 0x25, 0x0a, 0x2d, 0x11, 0xdb, 0x02, 0xe0, 0x1f, + 0x35, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x68, + 0x19, 0xc0, 0x6a, 0xc0, 0x21, 0x4c, 0x43, 0x69, + 0x19, 0xc9, 0x6b, 0x09, 0x42, 0x88, 0xd0, 0x12, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6b, 0x00, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x02, + 0x20, 0x4c, 0x43, 0x68, 0x19, 0xc0, 0x6a, 0xc0, + 0x23, 0x01, 0x02, 0x9b, 0x43, 0x98, 0x1c, 0x01, + 0x48, 0x03, 0xf0, 0x00, 0xf9, 0x03, 0xe7, 0xdf, + 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0x94, 0xb4, 0x90, 0x1c, 0x02, + 0x1c, 0x0f, 0x3a, 0x01, 0x2f, 0x01, 0xd1, 0x0d, + 0x09, 0x50, 0x00, 0x80, 0x49, 0x0d, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, 0x21, 0x01, 0x40, 0xa1, - 0x43, 0xc9, 0x40, 0x01, 0x09, 0x50, 0x00, 0x80, - 0x4b, 0x01, 0x50, 0x19, 0xbc, 0x90, 0x47, 0x70, - 0x2e, 0x08, 0x94, 0x94, 0xb4, 0x80, 0x1c, 0x01, - 0x39, 0x01, 0x09, 0x48, 0x00, 0x80, 0x4a, 0x08, - 0x58, 0x10, 0x06, 0xca, 0x0e, 0xd2, 0x27, 0x01, - 0x40, 0x97, 0x1c, 0x3b, 0x40, 0x18, 0xd0, 0x03, - 0x20, 0x01, 0xbc, 0x80, 0x47, 0x70, 0xe0, 0x01, - 0x20, 0x00, 0xe7, 0xfa, 0xe7, 0xf9, 0x00, 0x00, - 0x2e, 0x08, 0x94, 0x94, 0xb4, 0xf0, 0x1c, 0x07, - 0x1c, 0x0a, 0x68, 0x54, 0x6a, 0xf8, 0x05, 0x86, - 0x0d, 0xb6, 0x2c, 0x07, 0xda, 0x01, 0x1c, 0x20, - 0xe0, 0x00, 0x20, 0x07, 0x1c, 0x05, 0x21, 0x00, - 0x42, 0xa9, 0xd3, 0x02, 0xe0, 0x15, 0x31, 0x01, - 0xe7, 0xfa, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0, - 0x18, 0x80, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xc0, - 0x6f, 0xc0, 0x42, 0xb0, 0xd1, 0x08, 0x00, 0x88, - 0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x2b, - 0x01, 0x5b, 0x18, 0xc0, 0xbc, 0xf0, 0x47, 0x70, - 0xe7, 0xe9, 0x1f, 0xe0, 0x28, 0x11, 0xda, 0x01, - 0x1f, 0xe0, 0xe0, 0x00, 0x20, 0x11, 0x1c, 0x05, - 0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02, 0xe0, 0x0d, - 0x31, 0x01, 0xe7, 0xfa, 0x20, 0x4c, 0x43, 0x48, - 0x18, 0x80, 0x6a, 0x80, 0x42, 0xb0, 0xd1, 0x04, - 0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x30, 0x0c, - 0xe7, 0xe4, 0xe7, 0xf1, 0x20, 0x00, 0xe7, 0xe1, - 0xe7, 0xe0, 0xb5, 0x90, 0x48, 0x07, 0x68, 0x04, - 0x48, 0x07, 0x68, 0x07, 0x1c, 0x39, 0x1c, 0x20, - 0x4a, 0x06, 0x68, 0x13, 0x22, 0xf3, 0x00, 0xd2, - 0xf0, 0x00, 0xf9, 0xca, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x7d, 0xbc, - 0x2e, 0x08, 0x7d, 0xc0, 0x2e, 0x08, 0x94, 0x98, - 0xb4, 0xf0, 0x1c, 0x01, 0xb0, 0x83, 0x22, 0x00, - 0x68, 0x4b, 0x2b, 0x07, 0xdd, 0x01, 0x23, 0x07, - 0xe0, 0x00, 0x68, 0x4b, 0x1c, 0x1c, 0x23, 0x00, - 0x43, 0xdb, 0x93, 0x02, 0x23, 0x00, 0x43, 0xdb, - 0x93, 0x01, 0x23, 0x00, 0x93, 0x00, 0x4b, 0x17, - 0x68, 0x1b, 0x2b, 0x00, 0xd0, 0x07, 0x4b, 0x15, - 0x68, 0x1b, 0x6a, 0xdb, 0x93, 0x02, 0x4b, 0x13, - 0x68, 0x1b, 0x6b, 0x5b, 0x93, 0x01, 0x20, 0x00, - 0x42, 0xa0, 0xd3, 0x02, 0xe0, 0x16, 0x30, 0x01, - 0xe7, 0xfa, 0x00, 0x83, 0x18, 0x1b, 0x00, 0xdb, - 0x18, 0x5d, 0x23, 0x05, 0x02, 0x1b, 0x18, 0xeb, - 0x6e, 0x9f, 0x04, 0x3b, 0x0c, 0x1b, 0xd0, 0x08, - 0x0c, 0x3b, 0x04, 0x1b, 0xd0, 0x05, 0x9b, 0x00, - 0x18, 0xc5, 0x26, 0x01, 0x40, 0xae, 0x1c, 0x33, - 0x43, 0x1a, 0xe7, 0xe8, 0x23, 0x0d, 0x01, 0xdb, - 0x18, 0xcb, 0x61, 0xda, 0xb0, 0x03, 0xbc, 0xf0, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x7c, 0x60, - 0xb4, 0x80, 0x1c, 0x01, 0x20, 0x00, 0x68, 0x0a, - 0x42, 0x90, 0xdb, 0x02, 0xe0, 0x07, 0x30, 0x01, - 0xe7, 0xf9, 0x23, 0x00, 0x43, 0xdb, 0x68, 0x8a, - 0x00, 0x87, 0x51, 0xd3, 0xe7, 0xf7, 0x22, 0x00, - 0x43, 0xd2, 0x68, 0x8b, 0x68, 0x0f, 0x00, 0xbf, - 0x51, 0xda, 0x23, 0x00, 0x43, 0xdb, 0x68, 0x8a, - 0x68, 0x0f, 0x00, 0xbf, 0x19, 0xd2, 0x60, 0x53, - 0x22, 0x00, 0x60, 0x4a, 0xbc, 0x80, 0x47, 0x70, + 0x43, 0x08, 0x09, 0x51, 0x00, 0x89, 0x4b, 0x09, + 0x50, 0x58, 0xe0, 0x0d, 0x09, 0x50, 0x00, 0x80, + 0x49, 0x06, 0x58, 0x08, 0x06, 0xd4, 0x0e, 0xe4, + 0x21, 0x01, 0x40, 0xa1, 0x43, 0xc9, 0x40, 0x01, + 0x09, 0x50, 0x00, 0x80, 0x4b, 0x01, 0x50, 0x19, + 0xbc, 0x90, 0x47, 0x70, 0x2e, 0x08, 0x94, 0x8c, + 0xb4, 0x80, 0x1c, 0x01, 0x39, 0x01, 0x09, 0x48, + 0x00, 0x80, 0x4a, 0x08, 0x58, 0x10, 0x06, 0xca, + 0x0e, 0xd2, 0x27, 0x01, 0x40, 0x97, 0x1c, 0x3b, + 0x40, 0x18, 0xd0, 0x03, 0x20, 0x01, 0xbc, 0x80, + 0x47, 0x70, 0xe0, 0x01, 0x20, 0x00, 0xe7, 0xfa, + 0xe7, 0xf9, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x8c, + 0xb4, 0xf0, 0x1c, 0x07, 0x1c, 0x0a, 0x68, 0x54, + 0x6a, 0xf8, 0x05, 0x86, 0x0d, 0xb6, 0x2c, 0x07, + 0xda, 0x01, 0x1c, 0x20, 0xe0, 0x00, 0x20, 0x07, + 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, 0xd3, 0x02, + 0xe0, 0x15, 0x31, 0x01, 0xe7, 0xfa, 0x00, 0x88, + 0x18, 0x40, 0x00, 0xc0, 0x18, 0x80, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xc0, 0x6f, 0xc0, 0x42, 0xb0, + 0xd1, 0x08, 0x00, 0x88, 0x18, 0x40, 0x00, 0xc0, + 0x18, 0x80, 0x23, 0x2b, 0x01, 0x5b, 0x18, 0xc0, + 0xbc, 0xf0, 0x47, 0x70, 0xe7, 0xe9, 0x1f, 0xe0, + 0x28, 0x11, 0xda, 0x01, 0x1f, 0xe0, 0xe0, 0x00, + 0x20, 0x11, 0x1c, 0x05, 0x21, 0x00, 0x42, 0xa9, + 0xd3, 0x02, 0xe0, 0x0d, 0x31, 0x01, 0xe7, 0xfa, + 0x20, 0x4c, 0x43, 0x48, 0x18, 0x80, 0x6a, 0x80, + 0x42, 0xb0, 0xd1, 0x04, 0x20, 0x4c, 0x43, 0x48, + 0x18, 0x80, 0x30, 0x0c, 0xe7, 0xe4, 0xe7, 0xf1, + 0x20, 0x00, 0xe7, 0xe1, 0xe7, 0xe0, 0xb5, 0x90, + 0x48, 0x07, 0x68, 0x04, 0x48, 0x07, 0x68, 0x07, + 0x1c, 0x39, 0x1c, 0x20, 0x4a, 0x06, 0x68, 0x13, + 0x22, 0xf3, 0x00, 0xd2, 0xf0, 0x00, 0xf9, 0xca, + 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x2e, 0x08, 0x7d, 0xb4, 0x2e, 0x08, 0x7d, 0xb8, + 0x2e, 0x08, 0x94, 0x90, 0xb4, 0xf0, 0x1c, 0x01, + 0xb0, 0x83, 0x22, 0x00, 0x68, 0x4b, 0x2b, 0x07, + 0xdd, 0x01, 0x23, 0x07, 0xe0, 0x00, 0x68, 0x4b, + 0x1c, 0x1c, 0x23, 0x00, 0x43, 0xdb, 0x93, 0x02, + 0x23, 0x00, 0x43, 0xdb, 0x93, 0x01, 0x23, 0x00, + 0x93, 0x00, 0x4b, 0x17, 0x68, 0x1b, 0x2b, 0x00, + 0xd0, 0x07, 0x4b, 0x15, 0x68, 0x1b, 0x6a, 0xdb, + 0x93, 0x02, 0x4b, 0x13, 0x68, 0x1b, 0x6b, 0x5b, + 0x93, 0x01, 0x20, 0x00, 0x42, 0xa0, 0xd3, 0x02, + 0xe0, 0x16, 0x30, 0x01, 0xe7, 0xfa, 0x00, 0x83, + 0x18, 0x1b, 0x00, 0xdb, 0x18, 0x5d, 0x23, 0x05, + 0x02, 0x1b, 0x18, 0xeb, 0x6e, 0x9f, 0x04, 0x3b, + 0x0c, 0x1b, 0xd0, 0x08, 0x0c, 0x3b, 0x04, 0x1b, + 0xd0, 0x05, 0x9b, 0x00, 0x18, 0xc5, 0x26, 0x01, + 0x40, 0xae, 0x1c, 0x33, 0x43, 0x1a, 0xe7, 0xe8, + 0x23, 0x0d, 0x01, 0xdb, 0x18, 0xcb, 0x61, 0xda, + 0xb0, 0x03, 0xbc, 0xf0, 0x47, 0x70, 0x00, 0x00, + 0x2e, 0x08, 0x7c, 0x58, 0xb4, 0x80, 0x1c, 0x01, + 0x20, 0x00, 0x68, 0x0a, 0x42, 0x90, 0xdb, 0x02, + 0xe0, 0x07, 0x30, 0x01, 0xe7, 0xf9, 0x23, 0x00, + 0x43, 0xdb, 0x68, 0x8a, 0x00, 0x87, 0x51, 0xd3, + 0xe7, 0xf7, 0x22, 0x00, 0x43, 0xd2, 0x68, 0x8b, + 0x68, 0x0f, 0x00, 0xbf, 0x51, 0xda, 0x23, 0x00, + 0x43, 0xdb, 0x68, 0x8a, 0x68, 0x0f, 0x00, 0xbf, + 0x19, 0xd2, 0x60, 0x53, 0x22, 0x00, 0x60, 0x4a, + 0xbc, 0x80, 0x47, 0x70, 0xb4, 0xf0, 0x1c, 0x03, + 0x1c, 0x0c, 0x1c, 0x17, 0x68, 0x9a, 0xca, 0x40, + 0x42, 0xa6, 0xd2, 0x00, 0xe7, 0xfb, 0x3a, 0x04, + 0x1c, 0x11, 0xc9, 0x40, 0x42, 0xbe, 0xd2, 0x00, + 0xe7, 0xfb, 0x39, 0x04, 0x68, 0x10, 0x42, 0xa0, + 0xd1, 0x02, 0x68, 0x08, 0x42, 0xb8, 0xd0, 0x02, + 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 0x39, 0x04, + 0x68, 0x98, 0x68, 0x5e, 0x00, 0xb6, 0x19, 0x85, + 0x68, 0x58, 0x38, 0x02, 0x60, 0x58, 0x68, 0x50, + 0x60, 0x10, 0x32, 0x04, 0x42, 0x8a, 0xd3, 0xfa, + 0x68, 0x88, 0x60, 0x08, 0x31, 0x04, 0x42, 0xa9, + 0xd3, 0xfa, 0x20, 0x00, 0xe7, 0xe9, 0xe7, 0xe8, 0xb4, 0xf0, 0x1c, 0x03, 0x1c, 0x0c, 0x1c, 0x17, + 0x68, 0x58, 0x68, 0x1e, 0x3e, 0x01, 0x42, 0xb0, + 0xdb, 0x02, 0x20, 0xff, 0xbc, 0xf0, 0x47, 0x70, 0x68, 0x9a, 0xca, 0x40, 0x42, 0xa6, 0xd2, 0x00, - 0xe7, 0xfb, 0x3a, 0x04, 0x1c, 0x11, 0xc9, 0x40, - 0x42, 0xbe, 0xd2, 0x00, 0xe7, 0xfb, 0x39, 0x04, - 0x68, 0x10, 0x42, 0xa0, 0xd1, 0x02, 0x68, 0x08, - 0x42, 0xb8, 0xd0, 0x02, 0x20, 0xff, 0xbc, 0xf0, - 0x47, 0x70, 0x39, 0x04, 0x68, 0x98, 0x68, 0x5e, - 0x00, 0xb6, 0x19, 0x85, 0x68, 0x58, 0x38, 0x02, - 0x60, 0x58, 0x68, 0x50, 0x60, 0x10, 0x32, 0x04, - 0x42, 0x8a, 0xd3, 0xfa, 0x68, 0x88, 0x60, 0x08, - 0x31, 0x04, 0x42, 0xa9, 0xd3, 0xfa, 0x20, 0x00, - 0xe7, 0xe9, 0xe7, 0xe8, 0xb4, 0xf0, 0x1c, 0x03, - 0x1c, 0x0c, 0x1c, 0x17, 0x68, 0x58, 0x68, 0x1e, - 0x3e, 0x01, 0x42, 0xb0, 0xdb, 0x02, 0x20, 0xff, - 0xbc, 0xf0, 0x47, 0x70, 0x68, 0x9a, 0xca, 0x40, - 0x42, 0xa6, 0xd2, 0x00, 0xe7, 0xfb, 0x3a, 0x04, - 0x1c, 0x15, 0xcd, 0x40, 0x42, 0xbe, 0xd2, 0x00, - 0xe7, 0xfb, 0x68, 0x58, 0x30, 0x02, 0x60, 0x58, - 0x68, 0x98, 0x68, 0x5e, 0x00, 0xb6, 0x19, 0x80, - 0x1f, 0xc1, 0x39, 0x01, 0x68, 0x08, 0x60, 0x88, - 0x39, 0x04, 0x1d, 0xc8, 0x30, 0x01, 0x42, 0xa8, - 0xd8, 0xf8, 0x60, 0x8f, 0x68, 0x08, 0x60, 0x48, - 0x39, 0x04, 0x1d, 0x08, 0x42, 0x90, 0xd8, 0xf9, - 0x60, 0x14, 0x20, 0x00, 0xe7, 0xd8, 0xe7, 0xd7, - 0xb5, 0xf0, 0x1c, 0x07, 0x1c, 0x0c, 0xb0, 0x81, - 0x1c, 0x38, 0x21, 0x00, 0xf0, 0x0c, 0xff, 0xbe, - 0x1c, 0x06, 0x1c, 0x38, 0x21, 0x01, 0xf0, 0x0c, - 0xff, 0xb9, 0x90, 0x00, 0x1c, 0x31, 0x1c, 0x38, - 0xf0, 0x00, 0xf8, 0x50, 0x49, 0x20, 0x68, 0x09, - 0x60, 0x08, 0x99, 0x00, 0x1c, 0x38, 0xf0, 0x00, - 0xf8, 0x49, 0x49, 0x1e, 0x68, 0x09, 0x60, 0x08, - 0x48, 0x1b, 0x68, 0x00, 0x68, 0x05, 0x48, 0x1c, - 0x68, 0x01, 0x23, 0x02, 0x43, 0xdb, 0x40, 0x19, - 0x60, 0x01, 0x2c, 0x00, 0xd0, 0x0c, 0x48, 0x19, - 0x68, 0x00, 0x78, 0x00, 0x28, 0x00, 0xd0, 0x07, - 0x48, 0x14, 0x68, 0x00, 0x68, 0x05, 0x48, 0x14, - 0x68, 0x01, 0x23, 0x02, 0x43, 0x19, 0x60, 0x01, - 0x1c, 0x20, 0x49, 0x13, 0x68, 0x09, 0x70, 0x08, - 0x48, 0x12, 0x63, 0xc5, 0x20, 0x3f, 0x04, 0x00, - 0x40, 0x28, 0x0c, 0x00, 0x49, 0x10, 0x62, 0x08, - 0x20, 0xff, 0x02, 0x00, 0x40, 0x28, 0x0a, 0x00, - 0x49, 0x0d, 0x62, 0x48, 0x06, 0xa8, 0x0e, 0x80, - 0x23, 0x80, 0x43, 0x18, 0x49, 0x0a, 0x62, 0x88, - 0x1c, 0x28, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xb0, 0x01, 0xe7, 0xfa, 0x00, 0x00, + 0xe7, 0xfb, 0x3a, 0x04, 0x1c, 0x15, 0xcd, 0x40, + 0x42, 0xbe, 0xd2, 0x00, 0xe7, 0xfb, 0x68, 0x58, + 0x30, 0x02, 0x60, 0x58, 0x68, 0x98, 0x68, 0x5e, + 0x00, 0xb6, 0x19, 0x80, 0x1f, 0xc1, 0x39, 0x01, + 0x68, 0x08, 0x60, 0x88, 0x39, 0x04, 0x1d, 0xc8, + 0x30, 0x01, 0x42, 0xa8, 0xd8, 0xf8, 0x60, 0x8f, + 0x68, 0x08, 0x60, 0x48, 0x39, 0x04, 0x1d, 0x08, + 0x42, 0x90, 0xd8, 0xf9, 0x60, 0x14, 0x20, 0x00, + 0xe7, 0xd8, 0xe7, 0xd7, 0xb5, 0xf0, 0x1c, 0x07, + 0x1c, 0x0c, 0xb0, 0x81, 0x1c, 0x38, 0x21, 0x00, + 0xf0, 0x0c, 0xff, 0xe0, 0x1c, 0x06, 0x1c, 0x38, + 0x21, 0x01, 0xf0, 0x0c, 0xff, 0xdb, 0x90, 0x00, + 0x1c, 0x31, 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x50, + 0x49, 0x20, 0x68, 0x09, 0x60, 0x08, 0x99, 0x00, + 0x1c, 0x38, 0xf0, 0x00, 0xf8, 0x49, 0x49, 0x1e, + 0x68, 0x09, 0x60, 0x08, 0x48, 0x1b, 0x68, 0x00, + 0x68, 0x05, 0x48, 0x1c, 0x68, 0x01, 0x23, 0x02, + 0x43, 0xdb, 0x40, 0x19, 0x60, 0x01, 0x2c, 0x00, + 0xd0, 0x0c, 0x48, 0x19, 0x68, 0x00, 0x78, 0x00, + 0x28, 0x00, 0xd0, 0x07, 0x48, 0x14, 0x68, 0x00, + 0x68, 0x05, 0x48, 0x14, 0x68, 0x01, 0x23, 0x02, + 0x43, 0x19, 0x60, 0x01, 0x1c, 0x20, 0x49, 0x13, + 0x68, 0x09, 0x70, 0x08, 0x48, 0x12, 0x63, 0xc5, + 0x20, 0x3f, 0x04, 0x00, 0x40, 0x28, 0x0c, 0x00, + 0x49, 0x10, 0x62, 0x08, 0x20, 0xff, 0x02, 0x00, + 0x40, 0x28, 0x0a, 0x00, 0x49, 0x0d, 0x62, 0x48, + 0x06, 0xa8, 0x0e, 0x80, 0x23, 0x80, 0x43, 0x18, + 0x49, 0x0a, 0x62, 0x88, 0x1c, 0x28, 0xb0, 0x01, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xb0, 0x01, + 0xe7, 0xfa, 0x00, 0x00, 0x2e, 0x08, 0x94, 0x9c, + 0x2e, 0x08, 0x94, 0xa0, 0x6a, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x94, 0xa4, 0x2e, 0x08, 0x94, 0xa8, - 0x6a, 0x00, 0x00, 0x18, 0x2e, 0x08, 0x94, 0xac, - 0x2e, 0x08, 0x94, 0xb0, 0x68, 0x00, 0x0d, 0x00, - 0x72, 0x00, 0x01, 0x00, 0xb4, 0x80, 0x1c, 0x02, - 0x1c, 0x0f, 0x06, 0xb9, 0x0e, 0x89, 0x20, 0x01, - 0x03, 0x80, 0x40, 0x10, 0x09, 0xc0, 0x43, 0x01, - 0x20, 0xf0, 0x40, 0x10, 0x01, 0x40, 0x43, 0x01, - 0x07, 0x10, 0x0f, 0x00, 0x03, 0x00, 0x43, 0x01, - 0x20, 0x07, 0x02, 0xc0, 0x40, 0x10, 0x01, 0x40, - 0x43, 0x01, 0x20, 0x07, 0x02, 0x00, 0x40, 0x10, - 0x02, 0xc0, 0x43, 0x01, 0x1c, 0x08, 0xbc, 0x80, - 0x47, 0x70, 0xe7, 0xfc, 0xb5, 0xff, 0x1c, 0x05, - 0x1c, 0x0c, 0x1c, 0x17, 0x9b, 0x03, 0x06, 0x18, - 0x16, 0x06, 0x20, 0x33, 0x06, 0x40, 0x6b, 0x80, - 0x1c, 0x01, 0x20, 0x04, 0x40, 0x08, 0xd0, 0x05, - 0x20, 0xd0, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, - 0x47, 0x18, 0xe0, 0x17, 0x23, 0x04, 0x43, 0xdb, - 0x40, 0x19, 0x01, 0x08, 0x4b, 0x0a, 0x68, 0x1b, - 0x18, 0xc2, 0x60, 0x15, 0x60, 0x54, 0x2e, 0xfe, - 0xd0, 0x04, 0x20, 0x01, 0x40, 0xb0, 0x60, 0xd0, - 0x4b, 0x06, 0x43, 0x1f, 0x60, 0x97, 0x20, 0x01, - 0x40, 0x88, 0x23, 0x33, 0x06, 0x5b, 0x63, 0x58, - 0x20, 0x00, 0xe7, 0xe2, 0xe7, 0xe1, 0x00, 0x00, - 0x2e, 0x08, 0x20, 0x14, 0x80, 0x00, 0x00, 0x00, - 0xb4, 0xb0, 0x1c, 0x01, 0x06, 0x08, 0x16, 0x04, - 0x4f, 0x0c, 0x22, 0x00, 0x20, 0x00, 0x28, 0x04, - 0xd3, 0x02, 0xe0, 0x0b, 0x30, 0x01, 0xe7, 0xfa, - 0x01, 0x03, 0x19, 0xdb, 0x68, 0x5b, 0x42, 0xa3, - 0xd1, 0x03, 0x25, 0x01, 0x40, 0x85, 0x1c, 0x2b, - 0x43, 0x1a, 0xe7, 0xf3, 0x23, 0x33, 0x06, 0x5b, - 0x6c, 0x1b, 0x40, 0x13, 0xd0, 0x00, 0xe7, 0xf9, - 0xbc, 0xb0, 0x47, 0x70, 0x9e, 0x00, 0x00, 0xc0, - 0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x91, 0x10, 0x14, - 0xe2, 0x01, 0x00, 0xff, 0xe5, 0x9f, 0x10, 0x2c, - 0xe5, 0xd1, 0x10, 0x00, 0xe3, 0x51, 0x00, 0xff, - 0x0a, 0x00, 0x00, 0x05, 0xe5, 0x9f, 0x10, 0x1c, - 0xe5, 0xd1, 0x10, 0x00, 0xe3, 0xa0, 0x20, 0x01, - 0xe1, 0xa0, 0x11, 0x12, 0xe3, 0xa0, 0x24, 0x66, - 0xe5, 0x82, 0x10, 0x10, 0xe3, 0xa0, 0x14, 0x62, - 0xe5, 0x81, 0x00, 0x14, 0xe1, 0x2f, 0xff, 0x1e, - 0x2e, 0x08, 0x7c, 0x50, 0x47, 0x00, 0x00, 0x00, - 0x47, 0x08, 0x00, 0x00, 0x47, 0x10, 0x00, 0x00, - 0x47, 0x18, 0x00, 0x00, 0x47, 0x20, 0x00, 0x00, - 0x47, 0x28, 0x00, 0x00, 0x47, 0x30, 0x00, 0x00, - 0x47, 0x38, 0x00, 0x00, 0x17, 0xcb, 0x40, 0x59, - 0x1a, 0xc9, 0x17, 0xc2, 0x40, 0x50, 0x1a, 0x80, - 0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xe5, 0xb4, 0x0c, - 0x08, 0x4b, 0x1c, 0x02, 0x42, 0x9a, 0xd8, 0x00, - 0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00, 0xe0, 0x00, - 0x08, 0x52, 0x42, 0x91, 0x41, 0x5b, 0x42, 0x91, - 0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82, 0xd1, 0xf7, - 0x1c, 0x18, 0xbc, 0x0c, 0x40, 0x5a, 0x40, 0x50, - 0x1a, 0x80, 0x40, 0x59, 0x1a, 0xc9, 0x47, 0x70, - 0x08, 0x4b, 0x1c, 0x02, 0xd1, 0x01, 0xf0, 0x00, - 0xf9, 0xc7, 0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, - 0xd3, 0xfb, 0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, - 0x42, 0x91, 0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, - 0x1a, 0x89, 0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, - 0x47, 0x70, 0x00, 0x00, 0x3a, 0x20, 0xd5, 0x09, - 0x42, 0x53, 0x32, 0x20, 0x40, 0xd0, 0x46, 0x94, - 0x1c, 0x0a, 0x40, 0x9a, 0x43, 0x10, 0x46, 0x62, - 0x40, 0xd1, 0x47, 0x70, 0x1c, 0x08, 0x40, 0xd0, - 0x21, 0x00, 0x47, 0x70, 0x40, 0x10, 0x40, 0x19, - 0x47, 0x70, 0x00, 0x00, 0x47, 0x70, 0x00, 0x00, - 0x46, 0x84, 0x07, 0x83, 0xd0, 0x05, 0x1e, 0x52, - 0xd3, 0x12, 0x70, 0x01, 0x1c, 0x40, 0x07, 0x83, - 0xd1, 0xf9, 0x3a, 0x08, 0xd3, 0x07, 0x02, 0x0b, - 0x43, 0x19, 0x04, 0x0b, 0x43, 0x19, 0x1c, 0x0b, - 0xc0, 0x0a, 0x3a, 0x08, 0xd2, 0xfc, 0x1d, 0xd2, - 0xd3, 0x02, 0x54, 0x81, 0x1e, 0x52, 0xd2, 0xfc, - 0x46, 0x60, 0x47, 0x70, 0xb5, 0x80, 0x00, 0x43, - 0x15, 0x5f, 0x43, 0xff, 0x1c, 0x02, 0x0f, 0xc0, - 0x07, 0xc0, 0x2f, 0x00, 0xd0, 0x15, 0x43, 0x0b, - 0xd0, 0x0c, 0x28, 0x00, 0xd1, 0x07, 0x1c, 0x10, - 0xf0, 0x00, 0xf9, 0x92, 0xf0, 0x00, 0xfa, 0x2c, - 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, - 0x1c, 0x10, 0xe0, 0x11, 0x21, 0x01, 0x07, 0xc8, - 0xf0, 0x00, 0xfb, 0x2a, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x03, 0x13, 0x43, 0x0b, 0xd1, 0x05, - 0x28, 0x00, 0xd1, 0x03, 0x1c, 0x10, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x21, 0x01, 0x07, 0xc8, - 0xf0, 0x00, 0xfb, 0x14, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93, + 0x68, 0x00, 0x0d, 0x00, 0x72, 0x00, 0x01, 0x00, + 0xb4, 0x80, 0x1c, 0x02, 0x1c, 0x0f, 0x06, 0xb9, + 0x0e, 0x89, 0x20, 0x01, 0x03, 0x80, 0x40, 0x10, + 0x09, 0xc0, 0x43, 0x01, 0x20, 0xf0, 0x40, 0x10, + 0x01, 0x40, 0x43, 0x01, 0x07, 0x10, 0x0f, 0x00, + 0x03, 0x00, 0x43, 0x01, 0x20, 0x07, 0x02, 0xc0, + 0x40, 0x10, 0x01, 0x40, 0x43, 0x01, 0x20, 0x07, + 0x02, 0x00, 0x40, 0x10, 0x02, 0xc0, 0x43, 0x01, + 0x1c, 0x08, 0xbc, 0x80, 0x47, 0x70, 0xe7, 0xfc, + 0xb5, 0xff, 0x1c, 0x05, 0x1c, 0x0c, 0x1c, 0x17, + 0x9b, 0x03, 0x06, 0x18, 0x16, 0x06, 0x20, 0x33, + 0x06, 0x40, 0x6b, 0x80, 0x1c, 0x01, 0x20, 0x04, + 0x40, 0x08, 0xd0, 0x05, 0x20, 0xd0, 0xb0, 0x04, + 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0xe0, 0x17, + 0x23, 0x04, 0x43, 0xdb, 0x40, 0x19, 0x01, 0x08, + 0x4b, 0x0a, 0x68, 0x1b, 0x18, 0xc2, 0x60, 0x15, + 0x60, 0x54, 0x2e, 0xfe, 0xd0, 0x04, 0x20, 0x01, + 0x40, 0xb0, 0x60, 0xd0, 0x4b, 0x06, 0x43, 0x1f, + 0x60, 0x97, 0x20, 0x01, 0x40, 0x88, 0x23, 0x33, + 0x06, 0x5b, 0x63, 0x58, 0x20, 0x00, 0xe7, 0xe2, + 0xe7, 0xe1, 0x00, 0x00, 0x2e, 0x08, 0x20, 0x0c, + 0x80, 0x00, 0x00, 0x00, 0xb4, 0xb0, 0x1c, 0x01, + 0x06, 0x08, 0x16, 0x04, 0x4f, 0x0c, 0x22, 0x00, + 0x20, 0x00, 0x28, 0x04, 0xd3, 0x02, 0xe0, 0x0b, + 0x30, 0x01, 0xe7, 0xfa, 0x01, 0x03, 0x19, 0xdb, + 0x68, 0x5b, 0x42, 0xa3, 0xd1, 0x03, 0x25, 0x01, + 0x40, 0x85, 0x1c, 0x2b, 0x43, 0x1a, 0xe7, 0xf3, + 0x23, 0x33, 0x06, 0x5b, 0x6c, 0x1b, 0x40, 0x13, + 0xd0, 0x00, 0xe7, 0xf9, 0xbc, 0xb0, 0x47, 0x70, + 0x9e, 0x00, 0x00, 0xc0, 0xe3, 0xa0, 0x14, 0x62, + 0xe5, 0x91, 0x10, 0x14, 0xe2, 0x01, 0x00, 0xff, + 0xe5, 0x9f, 0x10, 0x2c, 0xe5, 0xd1, 0x10, 0x00, + 0xe3, 0x51, 0x00, 0xff, 0x0a, 0x00, 0x00, 0x05, + 0xe5, 0x9f, 0x10, 0x1c, 0xe5, 0xd1, 0x10, 0x00, + 0xe3, 0xa0, 0x20, 0x01, 0xe1, 0xa0, 0x11, 0x12, + 0xe3, 0xa0, 0x24, 0x66, 0xe5, 0x82, 0x10, 0x10, + 0xe3, 0xa0, 0x14, 0x62, 0xe5, 0x81, 0x00, 0x14, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x7c, 0x48, + 0x47, 0x00, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, + 0x47, 0x10, 0x00, 0x00, 0x47, 0x18, 0x00, 0x00, + 0x47, 0x20, 0x00, 0x00, 0x47, 0x28, 0x00, 0x00, + 0x47, 0x30, 0x00, 0x00, 0x47, 0x38, 0x00, 0x00, + 0x17, 0xcb, 0x40, 0x59, 0x1a, 0xc9, 0x17, 0xc2, + 0x40, 0x50, 0x1a, 0x80, 0xd1, 0x01, 0xf0, 0x00, + 0xfa, 0x07, 0xb4, 0x0c, 0x08, 0x4b, 0x1c, 0x02, + 0x42, 0x9a, 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, + 0x23, 0x00, 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, + 0x41, 0x5b, 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, + 0x42, 0x82, 0xd1, 0xf7, 0x1c, 0x18, 0xbc, 0x0c, + 0x40, 0x5a, 0x40, 0x50, 0x1a, 0x80, 0x40, 0x59, + 0x1a, 0xc9, 0x47, 0x70, 0x08, 0x4b, 0x1c, 0x02, + 0xd1, 0x01, 0xf0, 0x00, 0xf9, 0xe9, 0x42, 0x9a, + 0xd8, 0x00, 0x00, 0x52, 0xd3, 0xfb, 0x23, 0x00, + 0xe0, 0x00, 0x08, 0x52, 0x42, 0x91, 0x41, 0x5b, + 0x42, 0x91, 0xd3, 0x00, 0x1a, 0x89, 0x42, 0x82, + 0xd1, 0xf7, 0x1c, 0x18, 0x47, 0x70, 0x00, 0x00, + 0x3a, 0x20, 0xd5, 0x09, 0x42, 0x53, 0x32, 0x20, + 0x40, 0xd0, 0x46, 0x94, 0x1c, 0x0a, 0x40, 0x9a, + 0x43, 0x10, 0x46, 0x62, 0x40, 0xd1, 0x47, 0x70, + 0x1c, 0x08, 0x40, 0xd0, 0x21, 0x00, 0x47, 0x70, + 0x40, 0x10, 0x40, 0x19, 0x47, 0x70, 0x00, 0x00, + 0x47, 0x70, 0x00, 0x00, 0x1a, 0x43, 0x42, 0x93, 0xd3, 0x30, 0x46, 0x84, 0x07, 0x8b, 0xd0, 0x07, 0x1e, 0x52, 0xd3, 0x29, 0x78, 0x0b, 0x70, 0x03, 0x1c, 0x40, 0x1c, 0x49, 0x07, 0x8b, 0xd1, 0xf7, @@ -12423,17 +12632,13 @@ 0x02, 0x13, 0x0e, 0x1b, 0xd0, 0x04, 0x1c, 0x40, 0x04, 0x13, 0x0e, 0x1b, 0xd0, 0x00, 0x1c, 0x40, 0x44, 0x60, 0x47, 0x70, 0x80, 0x80, 0x80, 0x80, - 0x46, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, - 0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, - 0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, - 0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, - 0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, - 0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, - 0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, - 0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, - 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, - 0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, - 0x01, 0x01, 0x01, 0x01, 0x46, 0x84, 0x1c, 0x03, + 0x46, 0x84, 0x07, 0x83, 0xd0, 0x05, 0x1e, 0x52, + 0xd3, 0x12, 0x70, 0x01, 0x1c, 0x40, 0x07, 0x83, + 0xd1, 0xf9, 0x3a, 0x08, 0xd3, 0x07, 0x02, 0x0b, + 0x43, 0x19, 0x04, 0x0b, 0x43, 0x19, 0x1c, 0x0b, + 0xc0, 0x0a, 0x3a, 0x08, 0xd2, 0xfc, 0x1d, 0xd2, + 0xd3, 0x02, 0x54, 0x81, 0x1e, 0x52, 0xd2, 0xfc, + 0x46, 0x60, 0x47, 0x70, 0x46, 0x84, 0x1c, 0x03, 0x43, 0x0b, 0x07, 0x9b, 0xd1, 0x15, 0x1f, 0x12, 0xd3, 0x0b, 0xb4, 0xb0, 0x4c, 0x10, 0x01, 0xe5, 0xc9, 0x80, 0x1b, 0x3b, 0x43, 0xbb, 0x40, 0x2b, @@ -12444,6 +12649,37 @@ 0x47, 0x70, 0xbc, 0xb0, 0x1f, 0x09, 0x1c, 0xd2, 0xe7, 0xf1, 0x70, 0x03, 0x1c, 0x40, 0x1e, 0x52, 0xd2, 0xfb, 0x46, 0x60, 0x47, 0x70, 0x00, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x1c, 0x02, 0x43, 0x0a, + 0x07, 0x92, 0xd1, 0x13, 0x46, 0x84, 0xb4, 0x30, + 0x4c, 0x0c, 0x01, 0xe5, 0xe0, 0x00, 0xc0, 0x04, + 0xc9, 0x04, 0x1b, 0x13, 0x43, 0x93, 0x40, 0x2b, + 0xd0, 0xf9, 0xe0, 0x01, 0x02, 0x12, 0x1c, 0x40, + 0x0e, 0x13, 0x70, 0x03, 0xd1, 0xfa, 0xbc, 0x30, + 0x46, 0x60, 0x47, 0x70, 0x1c, 0x03, 0x78, 0x0a, + 0x70, 0x1a, 0x1c, 0x49, 0x1c, 0x5b, 0x2a, 0x00, + 0xd1, 0xf9, 0x47, 0x70, 0x01, 0x01, 0x01, 0x01, + 0xb5, 0x80, 0x00, 0x43, 0x15, 0x5f, 0x43, 0xff, + 0x1c, 0x02, 0x0f, 0xc0, 0x07, 0xc0, 0x2f, 0x00, + 0xd0, 0x15, 0x43, 0x0b, 0xd0, 0x0c, 0x28, 0x00, + 0xd1, 0x07, 0x1c, 0x10, 0xf0, 0x00, 0xf9, 0x00, + 0xf0, 0x00, 0xf9, 0x9a, 0xbc, 0x80, 0xbc, 0x08, + 0x47, 0x18, 0x21, 0x01, 0x1c, 0x10, 0xe0, 0x11, + 0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x98, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x03, 0x13, + 0x43, 0x0b, 0xd1, 0x05, 0x28, 0x00, 0xd1, 0x03, + 0x1c, 0x10, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, + 0x21, 0x01, 0x07, 0xc8, 0xf0, 0x00, 0xfa, 0x82, + 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, + 0x46, 0xbc, 0xb4, 0x60, 0x1c, 0x03, 0x43, 0x08, + 0x07, 0x80, 0xd1, 0x1b, 0x1f, 0x12, 0xd3, 0x0b, + 0x4e, 0x0f, 0xcb, 0x01, 0xc9, 0x80, 0x1b, 0xc0, + 0xd1, 0x09, 0x1b, 0xbd, 0x43, 0xbd, 0x01, 0xf7, + 0x40, 0x3d, 0xd1, 0x04, 0x1f, 0x12, 0xd2, 0xf4, + 0x1c, 0xd2, 0xd3, 0x0e, 0xe0, 0x02, 0x1f, 0x1b, + 0x1f, 0x09, 0x1c, 0xd2, 0x78, 0x18, 0x78, 0x0f, + 0x1b, 0xc0, 0xd1, 0x06, 0x2f, 0x00, 0xd0, 0x04, + 0x1c, 0x5b, 0x1c, 0x49, 0x1e, 0x52, 0xd2, 0xf5, + 0x20, 0x00, 0xbc, 0x60, 0x46, 0x67, 0x47, 0x70, 0x01, 0x01, 0x01, 0x01, 0x47, 0x78, 0x00, 0x00, 0xe2, 0x10, 0xc1, 0x02, 0x12, 0x60, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x03, 0xa0, 0x10, 0x00, @@ -12489,7 +12725,7 @@ 0xe5, 0x8c, 0xe0, 0x00, 0xea, 0x00, 0x01, 0x91, 0x80, 0x00, 0x00, 0x20, 0x44, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x62, 0x79, 0x20, 0x7a, 0x65, - 0x72, 0x6f, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x58, + 0x72, 0x6f, 0x00, 0x00, 0x2e, 0x08, 0x21, 0x50, 0xb5, 0xf0, 0xb0, 0x8f, 0xf0, 0x00, 0xfd, 0x01, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x0f, 0xf0, 0x00, 0xfd, 0x3b, 0x90, 0x03, 0x91, 0x04, 0x92, 0x05, @@ -12526,9 +12762,9 @@ 0xfd, 0x91, 0xb0, 0x06, 0xb0, 0x0f, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x3f, 0xe6, 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcd, 0x80, 0x00, 0x00, 0x00, - 0x2e, 0x03, 0x33, 0xb0, 0x80, 0x00, 0x3f, 0xff, - 0x80, 0x00, 0x3f, 0xfe, 0x2e, 0x03, 0x33, 0x5c, - 0x2e, 0x03, 0x33, 0x80, 0x2e, 0x03, 0x33, 0x44, + 0x2e, 0x03, 0x3b, 0x10, 0x80, 0x00, 0x3f, 0xff, + 0x80, 0x00, 0x3f, 0xfe, 0x2e, 0x03, 0x3a, 0xbc, + 0x2e, 0x03, 0x3a, 0xe0, 0x2e, 0x03, 0x3a, 0xa4, 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0x38, 0x80, 0xe1, 0xa0, 0x38, 0xa3, 0xe1, 0xc0, 0x00, 0x03, 0xe1, 0xd1, 0xc0, 0x80, 0x5a, 0x00, 0x00, 0x0c, @@ -12600,8 +12836,8 @@ 0xe5, 0x80, 0x20, 0x00, 0xe3, 0x31, 0x00, 0x00, 0x03, 0xa0, 0x00, 0x00, 0x15, 0x9f, 0x00, 0x0c, 0x18, 0x90, 0x00, 0x03, 0xe1, 0x80, 0x00, 0x03, - 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xb8, - 0x2e, 0x08, 0x20, 0xc4, 0xe3, 0x10, 0x06, 0x01, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xb0, + 0x2e, 0x08, 0x20, 0xbc, 0xe3, 0x10, 0x06, 0x01, 0x13, 0xa0, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1e, 0xea, 0x00, 0x00, 0x0a, 0xe3, 0x12, 0x07, 0x02, 0x0a, 0x00, 0x00, 0x08, 0xe1, 0x5c, 0x00, 0x80, @@ -12628,7 +12864,7 @@ 0xeb, 0x00, 0x00, 0x36, 0xe5, 0x9f, 0x03, 0xfc, 0xe5, 0x9f, 0x33, 0xfc, 0xeb, 0x00, 0x00, 0x12, 0xea, 0x00, 0x00, 0x4e, 0x2e, 0x00, 0x04, 0x04, - 0x2e, 0x03, 0x34, 0x9c, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x03, 0x3b, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 0xe3, 0x1c, 0x00, 0x01, 0x1a, 0x00, 0x00, 0x03, 0xe1, 0xa0, 0xe0, 0x0f, 0xe1, 0x2f, 0xff, 0x1c, @@ -12652,7 +12888,7 @@ 0x62, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x00, 0x00, - 0x2e, 0x08, 0x21, 0x58, 0x47, 0x78, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x50, 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0x73, 0x08, 0xe5, 0x87, 0x00, 0x00, 0xe2, 0x8f, 0x50, 0xc9, 0xe2, 0x85, 0x5c, 0x02, 0xe5, 0x87, 0x50, 0x10, 0xe2, 0x8f, 0x50, 0xe9, @@ -12750,12 +12986,12 @@ 0xe0, 0x90, 0x20, 0x02, 0x31, 0x52, 0x00, 0x01, 0x35, 0x8c, 0x20, 0x00, 0x23, 0xa0, 0x00, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, - 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xd4, - 0x2e, 0x08, 0x20, 0xa0, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x02, 0x56, 0x44, 0x2e, 0x02, 0x56, 0x40, - 0x2e, 0x02, 0x56, 0x3c, 0x2e, 0x08, 0x9a, 0x04, - 0x2e, 0x00, 0x1b, 0x8d, 0x2e, 0x01, 0x99, 0xd5, - 0x2e, 0x01, 0x98, 0x89, 0x2e, 0x01, 0x99, 0x49, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x08, 0x20, 0xcc, + 0x2e, 0x08, 0x20, 0x98, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x02, 0x5d, 0xa4, 0x2e, 0x02, 0x5d, 0xa0, + 0x2e, 0x02, 0x5d, 0x9c, 0x2e, 0x08, 0x99, 0xfc, + 0x2e, 0x00, 0x1c, 0x39, 0x2e, 0x01, 0xa1, 0x35, + 0x2e, 0x01, 0x9f, 0xe9, 0x2e, 0x01, 0xa0, 0xa9, 0x47, 0x78, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 0xe5, 0x90, 0x00, 0x00, 0xe2, 0x00, 0x04, 0xff, 0xe3, 0x50, 0x04, 0xea, 0x03, 0xa0, 0x00, 0x01, @@ -12796,10 +13032,10 @@ 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x46, 0x61, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x01, 0x91, 0xcc, 0x2e, 0x01, 0x91, 0xe4, - 0x2e, 0x01, 0x92, 0x00, 0x2e, 0x01, 0x92, 0x20, - 0x2e, 0x01, 0x92, 0x34, 0x2e, 0x01, 0x92, 0x44, - 0x2e, 0x01, 0x92, 0x5c, 0x2e, 0x01, 0x92, 0x74, + 0x2e, 0x01, 0x99, 0x2c, 0x2e, 0x01, 0x99, 0x44, + 0x2e, 0x01, 0x99, 0x60, 0x2e, 0x01, 0x99, 0x80, + 0x2e, 0x01, 0x99, 0x94, 0x2e, 0x01, 0x99, 0xa4, + 0x2e, 0x01, 0x99, 0xbc, 0x2e, 0x01, 0x99, 0xd4, 0xe2, 0x4f, 0x20, 0x28, 0xe7, 0x92, 0x01, 0x00, 0xea, 0xff, 0xff, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -12953,7 +13189,7 @@ 0xe1, 0x2f, 0xff, 0x1e, 0x47, 0x78, 0x00, 0x00, 0xe5, 0x9f, 0xc0, 0x08, 0xe5, 0x9c, 0xd0, 0x00, 0xe3, 0xa0, 0xb0, 0x00, 0xe1, 0x2f, 0xff, 0x1e, - 0x2e, 0x08, 0x21, 0x98, 0x47, 0x78, 0x00, 0x00, + 0x2e, 0x08, 0x21, 0x90, 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0xc0, 0xe4, 0xe5, 0x9c, 0x00, 0x00, 0xe3, 0x50, 0x00, 0x00, 0xe3, 0xa0, 0x00, 0x04, 0x15, 0x8c, 0x00, 0x04, @@ -12984,8 +13220,8 @@ 0x47, 0x78, 0x00, 0x00, 0xe1, 0xa0, 0xc0, 0x0d, 0xe9, 0x2d, 0xd9, 0xf0, 0xe2, 0x4c, 0xb0, 0x04, 0xe3, 0xa0, 0x10, 0x01, 0xea, 0xff, 0xfd, 0x88, - 0x2e, 0x08, 0x20, 0xbc, 0x2e, 0x08, 0x20, 0xce, - 0x2e, 0x01, 0xae, 0x81, 0x80, 0x00, 0x02, 0x00, + 0x2e, 0x08, 0x20, 0xb4, 0x2e, 0x08, 0x20, 0xc6, + 0x2e, 0x01, 0xb5, 0xe1, 0x80, 0x00, 0x02, 0x00, 0x80, 0x80, 0x0e, 0xa0, 0xb5, 0xff, 0xa6, 0x23, 0xa5, 0x22, 0xa4, 0x22, 0x68, 0x5a, 0x68, 0x1f, 0x4b, 0x21, 0x60, 0x5a, 0x23, 0x00, 0x4a, 0x21, @@ -13003,17 +13239,17 @@ 0xf7, 0xff, 0xff, 0xa0, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x30, 0x1c, 0x29, 0x1c, 0x22, 0xf0, 0x01, 0xfe, 0xa6, 0x2f, 0x00, 0xd0, 0x01, - 0xf7, 0xfe, 0xfd, 0xee, 0xb0, 0x04, 0xbc, 0xf0, + 0xf7, 0xfe, 0xfd, 0xcc, 0xb0, 0x04, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x3a, 0x74, 0x74, 0x00, - 0x2e, 0x08, 0x21, 0x9c, 0x2e, 0x08, 0x21, 0x9c, + 0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb2, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xaf, 0x11, - 0x2e, 0x01, 0xb1, 0xfd, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x01, 0xb6, 0x55, 0xb5, 0x90, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb9, 0x91, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb6, 0x71, + 0x2e, 0x01, 0xb9, 0x5d, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x01, 0xbd, 0xb5, 0xb5, 0x90, 0x28, 0x00, 0xd0, 0x04, 0x48, 0x12, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, 0xff, 0xfe, 0x4f, 0x10, 0x68, 0x78, - 0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xfd, 0xb6, + 0x28, 0x00, 0xd0, 0x03, 0xf7, 0xfe, 0xfd, 0x94, 0x20, 0x00, 0x60, 0x78, 0x4f, 0x0d, 0x78, 0x78, 0x24, 0x01, 0x28, 0x00, 0xd1, 0x05, 0x70, 0x7c, 0x48, 0x0b, 0x28, 0x00, 0xd0, 0x01, 0xf7, 0xff, @@ -13021,8 +13257,8 @@ 0x70, 0xbc, 0x48, 0x08, 0x28, 0x00, 0xd0, 0x01, 0xf0, 0x01, 0xfe, 0xb2, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x08, 0x21, 0x9c, 0x2e, 0x08, 0x21, 0x9c, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xb6, 0xf5, + 0x2e, 0x08, 0x21, 0x94, 0x2e, 0x08, 0x21, 0x94, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xbe, 0x55, 0xb5, 0x90, 0x1c, 0x0c, 0x21, 0x01, 0x1c, 0x17, 0xf0, 0x01, 0xfa, 0xbc, 0x21, 0x00, 0x1c, 0x20, 0xf0, 0x01, 0xfa, 0xb8, 0x21, 0x02, 0x1c, 0x38, @@ -13147,8 +13383,8 @@ 0xf7, 0xff, 0xf8, 0x88, 0x1e, 0x61, 0xa2, 0x19, 0xa0, 0x19, 0xf7, 0xff, 0xfe, 0x15, 0xb0, 0x09, 0xb0, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x21, 0xb4, 0x2e, 0x08, 0x21, 0xa4, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xe4, + 0x2e, 0x08, 0x21, 0xac, 0x2e, 0x08, 0x21, 0x9c, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 0x27, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f, 0x4f, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x00, 0x00, @@ -13256,7 +13492,7 @@ 0xe5, 0x81, 0xe0, 0x3c, 0xe3, 0xa0, 0xec, 0xde, 0xe3, 0x8e, 0xe0, 0xad, 0xe1, 0x8e, 0xe8, 0x0e, 0xe8, 0x81, 0x7f, 0xff, 0xea, 0x00, 0x00, 0x01, - 0x2e, 0x08, 0x22, 0xb4, 0x2e, 0x08, 0x22, 0xb8, + 0x2e, 0x08, 0x22, 0xac, 0x2e, 0x08, 0x22, 0xb0, 0xe5, 0x9f, 0xc1, 0x2c, 0xe3, 0x5c, 0x00, 0x00, 0x11, 0x2f, 0xff, 0x1c, 0xe6, 0x00, 0x00, 0x10, 0x80, 0x00, 0x02, 0x00, 0x46, 0x6c, 0x6f, 0x61, @@ -13295,7 +13531,7 @@ 0x13, 0xa0, 0x00, 0x00, 0x13, 0xa0, 0x11, 0x02, 0x03, 0xa0, 0x01, 0x02, 0xe3, 0x32, 0x01, 0x02, 0x11, 0xe0, 0x00, 0x00, 0x11, 0xe0, 0x10, 0x01, - 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x01, 0x8f, 0x31, + 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x01, 0x96, 0x91, 0xe3, 0x10, 0x02, 0x06, 0x1a, 0x00, 0x00, 0x0d, 0xe1, 0xb0, 0x80, 0x86, 0x0a, 0x00, 0x00, 0x0d, 0x22, 0x92, 0x20, 0x01, 0x22, 0x91, 0x10, 0x01, @@ -13683,7 +13919,7 @@ 0x49, 0x05, 0x70, 0x08, 0xa0, 0x05, 0x21, 0x03, 0xf0, 0x00, 0xf8, 0x78, 0x20, 0x64, 0xf7, 0xfe, 0xf8, 0x27, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x21, 0x9c, 0x53, 0x74, 0x61, 0x63, + 0x2e, 0x08, 0x21, 0x94, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x0a, 0x00, 0xb5, 0x00, 0x28, 0x07, 0xd1, 0x03, 0xf7, 0xff, 0xff, 0xe3, 0xbc, 0x08, @@ -13695,19 +13931,19 @@ 0x47, 0x18, 0x00, 0x87, 0x4b, 0x09, 0x59, 0xd9, 0x4a, 0x09, 0x42, 0x91, 0xd1, 0x02, 0xf7, 0xff, 0xff, 0xdd, 0xe0, 0x05, 0x4c, 0x07, 0x42, 0xa1, - 0xd0, 0x02, 0x51, 0xda, 0xf7, 0xfd, 0xfb, 0x10, + 0xd0, 0x02, 0x51, 0xda, 0xf7, 0xfd, 0xfa, 0xee, 0x20, 0x00, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x20, 0xb8, 0x2e, 0x08, 0x94, 0xb4, + 0x2e, 0x08, 0x20, 0xb0, 0x2e, 0x08, 0x94, 0xac, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x28, 0x00, 0xdd, 0x09, 0x28, 0x0b, 0xda, 0x07, 0x00, 0x80, 0x49, 0x04, 0x58, 0x08, 0x49, 0x04, 0x42, 0x88, 0xd0, 0x01, 0x20, 0x01, 0x47, 0x70, - 0x20, 0x00, 0x47, 0x70, 0x2e, 0x08, 0x94, 0xb4, + 0x20, 0x00, 0x47, 0x70, 0x2e, 0x08, 0x94, 0xac, 0xff, 0xff, 0xff, 0xff, 0x28, 0x00, 0xdd, 0x01, 0x28, 0x0b, 0xdb, 0x01, 0x48, 0x03, 0x47, 0x70, 0x00, 0x83, 0x4a, 0x03, 0x58, 0xd0, 0x50, 0xd1, 0x47, 0x70, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, - 0x2e, 0x08, 0x94, 0xb4, 0xb5, 0x90, 0x27, 0x01, + 0x2e, 0x08, 0x94, 0xac, 0xb5, 0x90, 0x27, 0x01, 0x4c, 0x05, 0x1c, 0x38, 0x1c, 0x21, 0xf7, 0xff, 0xff, 0xe9, 0x37, 0x01, 0x2f, 0x0b, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, @@ -13721,33 +13957,33 @@ 0xf0, 0x00, 0xf8, 0xcc, 0x78, 0x38, 0x28, 0x00, 0xd1, 0xf8, 0x08, 0xa0, 0xd3, 0x02, 0x20, 0x0a, 0xf0, 0x00, 0xf8, 0xc4, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x01, 0xb5, 0xd5, - 0x2e, 0x08, 0x21, 0x9c, 0xb5, 0x80, 0xb0, 0x83, - 0x90, 0x00, 0x91, 0x01, 0xf7, 0xfd, 0xfb, 0x8a, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x01, 0xbd, 0x35, + 0x2e, 0x08, 0x21, 0x94, 0xb5, 0x80, 0xb0, 0x83, + 0x90, 0x00, 0x91, 0x01, 0xf7, 0xfd, 0xfb, 0x1e, 0x90, 0x02, 0x46, 0x69, 0x20, 0x01, 0xf0, 0x01, 0xf8, 0x61, 0x23, 0x01, 0x1c, 0x07, 0x42, 0xd8, 0xd1, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x59, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x03, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x80, 0xb0, 0x81, + 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 0x20, 0x02, 0xf0, 0x01, 0xf8, 0x49, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x43, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb8, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x46, 0x69, 0x20, 0x05, 0xf0, 0x01, 0xf8, 0x31, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x2b, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb8, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x84, 0x90, 0x00, 0x91, 0x01, 0x92, 0x02, 0x93, 0x03, 0x46, 0x69, 0x20, 0x06, 0xf0, 0x01, 0xf8, 0x18, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x01, 0xf8, 0x12, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x00, 0xb0, 0x81, + 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 0x20, 0x08, 0xf0, 0x01, 0xf8, 0x01, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0x69, 0x40, 0xb0, 0x81, 0x90, 0x00, @@ -13758,12 +13994,12 @@ 0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0xe5, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x80, 0xb0, 0x81, + 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 0x20, 0x0b, 0xf0, 0x00, 0xff, 0xd5, 0x1c, 0x07, 0xd5, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0xcf, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x01, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb8, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x00, 0xb0, 0x81, 0x90, 0x00, 0x46, 0x69, 0x20, 0x0c, 0xf0, 0x00, 0xff, 0xbf, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x00, 0xb0, 0x83, @@ -13772,38 +14008,38 @@ 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x01, 0x46, 0x69, 0x20, 0x03, 0xf0, 0x00, 0xff, 0xab, 0xb0, 0x01, 0xbc, 0x08, 0x47, 0x18, 0xb5, 0x80, 0xb0, 0x82, - 0x90, 0x00, 0xf7, 0xfd, 0xfa, 0xc7, 0x90, 0x01, + 0x90, 0x00, 0xf7, 0xfd, 0xfa, 0x5b, 0x90, 0x01, 0x46, 0x69, 0x20, 0x12, 0xf0, 0x00, 0xff, 0x9e, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x98, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb8, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x82, 0x90, 0x00, 0xf7, 0xfd, - 0xfa, 0xad, 0x90, 0x01, 0x46, 0x69, 0x20, 0x0e, + 0xfa, 0x41, 0x90, 0x01, 0x46, 0x69, 0x20, 0x0e, 0xf0, 0x00, 0xff, 0x84, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x7e, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x80, 0xb0, 0x84, - 0x90, 0x00, 0x1c, 0x0f, 0xf7, 0xfd, 0xfa, 0x92, + 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x84, + 0x90, 0x00, 0x1c, 0x0f, 0xf7, 0xfd, 0xfa, 0x26, 0x90, 0x01, 0x97, 0x02, 0x1c, 0x38, 0xf7, 0xfd, - 0xfa, 0x8d, 0x90, 0x03, 0x46, 0x69, 0x20, 0x0f, + 0xfa, 0x21, 0x90, 0x03, 0x46, 0x69, 0x20, 0x0f, 0xf0, 0x00, 0xff, 0x64, 0x1c, 0x07, 0xd0, 0x05, 0x21, 0x00, 0x20, 0x13, 0xf0, 0x00, 0xff, 0x5e, 0x49, 0x03, 0x60, 0x08, 0x1c, 0x38, 0xb0, 0x04, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x20, 0xb8, 0xb5, 0x80, 0xb0, 0x82, + 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0x80, 0xb0, 0x82, 0x4f, 0x08, 0x97, 0x00, 0x20, 0xff, 0x30, 0x01, 0x90, 0x01, 0x46, 0x69, 0x20, 0x15, 0xf0, 0x00, 0xff, 0x49, 0x28, 0x00, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x1c, 0x38, 0xb0, 0x02, 0xbc, 0x80, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xe4, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x94, 0xdc, 0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 0xff, 0x39, 0x49, 0x02, 0x68, 0x09, 0x1a, 0x40, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0xac, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x21, 0xa4, 0xb5, 0x00, 0x21, 0x00, 0x20, 0x10, 0xf0, 0x00, 0xff, 0x2d, 0x49, 0x02, 0x60, 0x08, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xac, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x21, 0xa4, 0xb5, 0x80, 0x21, 0x00, 0x1c, 0x07, 0x20, 0x11, 0xf0, 0x00, 0xff, 0x20, 0x2f, 0x00, 0xd0, 0x00, 0x60, 0x38, 0xbc, 0x80, 0xbc, 0x08, 0x47, 0x18, @@ -13812,12 +14048,12 @@ 0x30, 0x01, 0xd4, 0xfc, 0x20, 0x00, 0x4a, 0x06, 0x5c, 0x17, 0x54, 0x0f, 0x18, 0x0f, 0x37, 0x80, 0x70, 0x3b, 0x30, 0x01, 0x28, 0x80, 0xd3, 0xf7, - 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x21, 0xb4, - 0x2e, 0x03, 0x33, 0xf8, 0xb5, 0x80, 0x49, 0x07, - 0x68, 0x09, 0xf7, 0xfd, 0xf9, 0x35, 0x1c, 0x07, + 0xbc, 0x80, 0x47, 0x70, 0x2e, 0x08, 0x21, 0xac, + 0x2e, 0x03, 0x3b, 0x58, 0xb5, 0x80, 0x49, 0x07, + 0x68, 0x09, 0xf7, 0xfd, 0xf9, 0x13, 0x1c, 0x07, 0xd1, 0x03, 0xa1, 0x05, 0xa0, 0x05, 0xf0, 0x00, 0xfc, 0xe7, 0x1c, 0x38, 0xbc, 0x80, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x49, 0x2f, @@ -13850,9 +14086,9 @@ 0x68, 0xc1, 0x4b, 0x07, 0x40, 0x19, 0x42, 0xa9, 0xd1, 0x01, 0xf0, 0x00, 0xfc, 0xbb, 0x37, 0x01, 0x2f, 0x0d, 0xdb, 0xf3, 0xbc, 0xb0, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xe4, - 0x00, 0x00, 0x02, 0x02, 0x2e, 0x08, 0x96, 0x24, - 0x2e, 0x08, 0x96, 0x64, 0x2e, 0x08, 0x96, 0xa4, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, + 0x00, 0x00, 0x02, 0x02, 0x2e, 0x08, 0x96, 0x1c, + 0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x96, 0x9c, 0xb5, 0xf0, 0x1c, 0x07, 0x69, 0x04, 0x6a, 0xc0, 0x68, 0x79, 0x42, 0x88, 0xd9, 0x00, 0x1c, 0x01, 0x68, 0xf8, 0x4b, 0x13, 0x40, 0x18, 0x07, 0x82, @@ -13891,14 +14127,14 @@ 0x98, 0x01, 0xf7, 0xff, 0xfd, 0x83, 0x28, 0x00, 0xda, 0x01, 0x25, 0x00, 0x43, 0xed, 0x0b, 0x30, 0xd3, 0x04, 0x98, 0x00, 0x49, 0x0f, 0x68, 0x09, - 0xf7, 0xfd, 0xf8, 0x02, 0x0d, 0xf0, 0x05, 0xc0, + 0xf7, 0xfc, 0xff, 0xe0, 0x0d, 0xf0, 0x05, 0xc0, 0x23, 0xa5, 0x05, 0xdb, 0x42, 0xd8, 0xd1, 0x07, 0x48, 0x0b, 0x28, 0x00, 0xd0, 0x04, 0x1c, 0x38, 0x1c, 0x29, 0xf7, 0xff, 0xff, 0xfe, 0x1c, 0x05, 0x22, 0x40, 0x21, 0x00, 0x1c, 0x38, 0xf7, 0xfd, - 0xf8, 0x4b, 0x1c, 0x28, 0xb0, 0x03, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xe4, - 0xff, 0xef, 0xff, 0xff, 0x2e, 0x08, 0x20, 0xb4, + 0xf8, 0x8f, 0x1c, 0x28, 0xb0, 0x03, 0xbc, 0xf0, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, + 0xff, 0xef, 0xff, 0xff, 0x2e, 0x08, 0x20, 0xac, 0x00, 0x00, 0x00, 0x00, 0xb5, 0xf7, 0x1c, 0x10, 0x1c, 0x0c, 0x1c, 0x17, 0xf7, 0xff, 0xff, 0x98, 0x78, 0x20, 0x34, 0x01, 0x28, 0x61, 0xd0, 0x09, @@ -13923,7 +14159,7 @@ 0x07, 0xa4, 0xd1, 0x04, 0xf7, 0xff, 0xff, 0xaa, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x33, 0x01, 0x2b, 0x10, 0xdb, 0xf2, 0x20, 0x00, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xe4, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x0f, 0x4d, 0x10, 0x68, 0xe8, 0x08, 0x80, 0xd3, 0x18, 0x20, 0x01, 0x4e, 0x0e, 0x70, 0x30, 0x40, 0x38, 0xd0, 0x03, @@ -13933,7 +14169,7 @@ 0xf0, 0x00, 0xfc, 0x14, 0x20, 0x00, 0x70, 0x30, 0x20, 0x01, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, 0x20, 0x00, 0xbc, 0xf0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x96, 0x64, 0x2e, 0x08, 0x21, 0x9c, + 0x2e, 0x08, 0x96, 0x5c, 0x2e, 0x08, 0x21, 0x94, 0xb5, 0x80, 0x1c, 0x07, 0xa0, 0x06, 0x21, 0x01, 0xf7, 0xff, 0xfc, 0x80, 0x21, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xfc, 0x7c, 0x20, 0x01, 0xf7, 0xfd, @@ -13942,7 +14178,7 @@ 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x00, 0xb5, 0xf0, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0x0f, 0x48, 0x20, 0x22, 0x01, 0x02, 0x92, 0x21, 0x00, - 0x1c, 0x06, 0xf7, 0xfc, 0xff, 0x91, 0x4a, 0x1e, + 0x1c, 0x06, 0xf7, 0xfc, 0xff, 0xd5, 0x4a, 0x1e, 0x1c, 0x28, 0xa1, 0x1e, 0xf7, 0xff, 0xff, 0x4e, 0x28, 0x00, 0xd1, 0x02, 0x1c, 0x28, 0xf7, 0xff, 0xff, 0xd3, 0x1c, 0x20, 0x1c, 0x32, 0xa1, 0x1a, @@ -13957,22 +14193,22 @@ 0x02, 0x52, 0x21, 0x00, 0x1c, 0x28, 0x1c, 0x33, 0xf0, 0x00, 0xf8, 0x46, 0x28, 0x00, 0xd0, 0x02, 0x1c, 0x38, 0xf7, 0xff, 0xff, 0xa5, 0xbc, 0xf0, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xe4, - 0x2e, 0x08, 0x96, 0x64, 0x77, 0x00, 0x00, 0x00, - 0x72, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x96, 0x24, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x95, 0xdc, + 0x2e, 0x08, 0x96, 0x5c, 0x77, 0x00, 0x00, 0x00, + 0x72, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x96, 0x1c, 0xb5, 0x90, 0x27, 0x03, 0x4c, 0x09, 0x01, 0xb8, 0x19, 0x00, 0xf7, 0xff, 0xfe, 0xa5, 0x37, 0x01, 0x2f, 0x10, 0xdb, 0xf8, 0x27, 0x00, 0x01, 0xb8, 0x19, 0x00, 0xf7, 0xff, 0xfe, 0x9d, 0x37, 0x01, 0x2f, 0x03, 0xdb, 0xf8, 0xbc, 0x90, 0xbc, 0x08, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xe4, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x95, 0xdc, 0xb5, 0xb0, 0x01, 0x80, 0x1c, 0x0f, 0x4c, 0x0a, 0x19, 0x00, 0x1c, 0x05, 0xf7, 0xff, 0xfe, 0x8c, 0x01, 0xb8, 0x19, 0x00, 0x23, 0x01, 0x05, 0x1b, 0x68, 0xc1, 0x43, 0x19, 0x60, 0xc1, 0x4b, 0x05, 0x40, 0x19, 0x60, 0xe9, 0x69, 0x40, 0x61, 0x68, 0x1c, 0x38, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, - 0x2e, 0x08, 0x95, 0xe4, 0x00, 0x10, 0x8f, 0x03, + 0x2e, 0x08, 0x95, 0xdc, 0x00, 0x10, 0x8f, 0x03, 0xb4, 0xf0, 0x1c, 0x1f, 0x68, 0xc3, 0x07, 0x9e, 0x0f, 0xb6, 0x25, 0x01, 0x1c, 0x1c, 0x2e, 0x00, 0xd0, 0x13, 0x1c, 0x1e, 0x0d, 0xf3, 0xd2, 0x10, @@ -14122,12 +14358,12 @@ 0x47, 0x18, 0xb5, 0x90, 0x1c, 0x07, 0x48, 0x0d, 0x68, 0x01, 0x29, 0x00, 0xd1, 0x12, 0x4c, 0x0c, 0x1c, 0x20, 0xa1, 0x0c, 0x22, 0x14, 0xf7, 0xfc, - 0xfd, 0x0d, 0x1d, 0xe0, 0x30, 0x0b, 0x1c, 0x39, + 0xfc, 0xa1, 0x1d, 0xe0, 0x30, 0x0b, 0x1c, 0x39, 0xf7, 0xff, 0xff, 0xda, 0x21, 0x29, 0x70, 0x01, 0x21, 0x00, 0x70, 0x41, 0x1c, 0x20, 0xbc, 0x90, 0xbc, 0x08, 0x47, 0x18, 0x30, 0x08, 0xbc, 0x90, - 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xd4, - 0x2e, 0x08, 0x99, 0xe4, 0x55, 0x6e, 0x6b, 0x6e, + 0xbc, 0x08, 0x47, 0x18, 0x2e, 0x08, 0x20, 0xcc, + 0x2e, 0x08, 0x99, 0xdc, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x28, 0x30, 0x78, 0x00, 0x00, 0xb5, 0x90, 0x1c, 0x04, 0x1c, 0x0f, 0xa0, 0x09, @@ -14158,7 +14394,7 @@ 0x28, 0x00, 0xd0, 0x01, 0x24, 0x00, 0x43, 0xe4, 0x37, 0x01, 0x2f, 0x10, 0xdb, 0xf4, 0x1c, 0x20, 0xbc, 0xb0, 0xbc, 0x08, 0x47, 0x18, 0x00, 0x00, - 0x2e, 0x08, 0x95, 0xe4, 0xb5, 0xf7, 0x68, 0xc5, + 0x2e, 0x08, 0x95, 0xdc, 0xb5, 0xf7, 0x68, 0xc5, 0x69, 0x46, 0x1c, 0x0c, 0x1c, 0x07, 0xb0, 0x81, 0x48, 0x3c, 0x40, 0x28, 0xd0, 0x04, 0x1c, 0x38, 0xf7, 0xff, 0xf9, 0x92, 0x28, 0x00, 0xd0, 0x01, @@ -14208,7 +14444,7 @@ 0x6a, 0x80, 0xe0, 0x04, 0x68, 0x42, 0x69, 0x83, 0x18, 0xd2, 0x69, 0x00, 0x1a, 0x10, 0x0d, 0x09, 0xd3, 0xf3, 0x28, 0x00, 0xdd, 0xf1, 0x38, 0x01, - 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb8, + 0x47, 0x70, 0x00, 0x00, 0x2e, 0x08, 0x20, 0xb0, 0xb5, 0xf0, 0x1c, 0x04, 0x68, 0xc8, 0x1c, 0x0f, 0x4b, 0x5a, 0x40, 0x18, 0x23, 0x01, 0x05, 0x9b, 0x43, 0x18, 0x60, 0xc8, 0x09, 0x80, 0xd3, 0x02, @@ -14301,8 +14537,8 @@ 0xe4, 0x90, 0x40, 0x04, 0xe4, 0x81, 0x40, 0x04, 0xe2, 0x53, 0x30, 0x04, 0x1a, 0xff, 0xff, 0xfb, 0xe5, 0x9f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x01, 0xc2, 0x84, 0x2e, 0x01, 0xc2, 0x28, - 0x2e, 0x01, 0xc2, 0x58, 0xe9, 0x2d, 0x00, 0x38, + 0x2e, 0x01, 0xc9, 0xe4, 0x2e, 0x01, 0xc9, 0x88, + 0x2e, 0x01, 0xc9, 0xb8, 0xe9, 0x2d, 0x00, 0x38, 0xe3, 0x52, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x3f, 0xe3, 0xe0, 0x30, 0x03, 0xe0, 0x12, 0x30, 0x03, 0x0a, 0x00, 0x00, 0x30, 0xe2, 0x10, 0x30, 0x01, @@ -14338,11 +14574,11 @@ 0xe4, 0xd0, 0x40, 0x01, 0xe4, 0xc1, 0x40, 0x01, 0xe8, 0xbd, 0x00, 0x38, 0xe3, 0x8e, 0xe0, 0x01, 0xe1, 0x2f, 0xff, 0x1e, 0xe9, 0x2d, 0x01, 0xf8, - 0xe5, 0x9f, 0xf0, 0x18, 0x2e, 0x01, 0xc0, 0xf8, - 0x2e, 0x01, 0xc1, 0x30, 0x2e, 0x01, 0xc1, 0x4c, - 0x2e, 0x01, 0xc0, 0xf8, 0x2e, 0x01, 0xc1, 0x14, - 0x2e, 0x01, 0xc1, 0x4c, 0x2e, 0x01, 0xc1, 0x30, - 0x2e, 0x01, 0xc0, 0xa8, 0xe9, 0x2d, 0x5f, 0xff, + 0xe5, 0x9f, 0xf0, 0x18, 0x2e, 0x01, 0xc8, 0x58, + 0x2e, 0x01, 0xc8, 0x90, 0x2e, 0x01, 0xc8, 0xac, + 0x2e, 0x01, 0xc8, 0x58, 0x2e, 0x01, 0xc8, 0x74, + 0x2e, 0x01, 0xc8, 0xac, 0x2e, 0x01, 0xc8, 0x90, + 0x2e, 0x01, 0xc8, 0x08, 0xe9, 0x2d, 0x5f, 0xff, 0xe1, 0x4f, 0x00, 0x00, 0xe9, 0x2d, 0x00, 0x01, 0xe2, 0x8f, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x10, 0x21, 0xff, 0x48, 0x37, 0x68, 0x00, 0x40, 0x52, @@ -14357,7 +14593,7 @@ 0x68, 0x00, 0xb4, 0x01, 0x08, 0x90, 0x21, 0x01, 0x40, 0x81, 0x48, 0x21, 0x60, 0x01, 0x48, 0x1d, 0x58, 0x82, 0x48, 0x01, 0x46, 0x86, 0x47, 0x10, - 0x2e, 0x01, 0xc3, 0x61, 0xbc, 0x02, 0x48, 0x1d, + 0x2e, 0x01, 0xca, 0xc1, 0xbc, 0x02, 0x48, 0x1d, 0x60, 0x01, 0x00, 0x00, 0x47, 0x78, 0x00, 0x00, 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x69, 0xf0, 0x00, 0xe8, 0xbd, 0x5f, 0xff, 0xe2, 0x5e, 0xf0, 0x04, @@ -14370,8 +14606,8 @@ 0x68, 0x00, 0x47, 0x18, 0x46, 0x73, 0x49, 0x09, 0x60, 0x08, 0x47, 0x18, 0x46, 0x73, 0x4a, 0x03, 0x00, 0x80, 0x18, 0x12, 0x68, 0x10, 0x60, 0x11, - 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x3a, 0xfc, - 0x2e, 0x01, 0xc3, 0x90, 0x66, 0x00, 0x00, 0x10, + 0x47, 0x18, 0x00, 0x00, 0x2e, 0x08, 0x3a, 0xf4, + 0x2e, 0x01, 0xca, 0xf0, 0x66, 0x00, 0x00, 0x10, 0x66, 0x00, 0x00, 0x14, 0x66, 0x00, 0x00, 0x18, 0x66, 0x00, 0x00, 0x1c, 0xe9, 0x2d, 0x5f, 0xf0, 0xe1, 0x4f, 0x40, 0x00, 0xe3, 0x14, 0x00, 0x20, @@ -14379,8 +14615,8 @@ 0x05, 0x1e, 0x40, 0x04, 0x03, 0xc4, 0x44, 0xff, 0xe5, 0x9f, 0x50, 0x14, 0xe7, 0x95, 0x51, 0x04, 0xe5, 0x9f, 0xe0, 0x00, 0xe1, 0x2f, 0xff, 0x15, - 0x2e, 0x01, 0xc4, 0x10, 0xe8, 0xbd, 0x5f, 0xf0, - 0xe1, 0xb0, 0xf0, 0x0e, 0x2e, 0x08, 0x1f, 0xf0, + 0x2e, 0x01, 0xcb, 0x70, 0xe8, 0xbd, 0x5f, 0xf0, + 0xe1, 0xb0, 0xf0, 0x0e, 0x2e, 0x08, 0x1f, 0xe8, 0x00, 0x00, 0x00, 0xc0, 0x46, 0x73, 0x47, 0x78, 0xe1, 0x0f, 0x10, 0x00, 0xe3, 0x81, 0x00, 0x80, 0xe1, 0x29, 0xf0, 0x00, 0xe2, 0x01, 0x00, 0x80, @@ -18926,7 +19162,7 @@ 0xeb, 0x00, 0x38, 0x99, 0xea, 0xff, 0xff, 0xf7, 0xe8, 0xbd, 0x40, 0x00, 0xe1, 0x2f, 0xff, 0x1e, 0xb5, 0x00, 0x4a, 0x12, 0x68, 0x10, 0x28, 0x00, - 0xd1, 0x03, 0x20, 0x00, 0xf7, 0xf1, 0xff, 0xe8, + 0xd1, 0x03, 0x20, 0x00, 0xf7, 0xf1, 0xff, 0xc6, 0xe7, 0xf7, 0xbd, 0x00, 0x47, 0x78, 0x00, 0x00, 0xe9, 0x2d, 0x40, 0x00, 0xe5, 0x9f, 0x20, 0x2c, 0xe3, 0xa0, 0x10, 0x01, 0xe1, 0x02, 0x00, 0x91, @@ -18935,7 +19171,7 @@ 0xea, 0xff, 0xff, 0xf7, 0xe8, 0xbd, 0x00, 0x01, 0xe1, 0x2f, 0xff, 0x10, 0x48, 0x02, 0x40, 0x49, 0x60, 0x01, 0x47, 0x70, 0x70, 0x00, 0x00, 0x34, - 0x2e, 0x08, 0x1f, 0xb0, 0x47, 0x78, 0x46, 0xc0, + 0x2e, 0x08, 0x1f, 0xa8, 0x47, 0x78, 0x46, 0xc0, 0xe1, 0xa0, 0x09, 0x00, 0xe1, 0xb0, 0x10, 0x01, 0x03, 0xc0, 0x01, 0x02, 0x13, 0x80, 0x01, 0x02, 0xe3, 0xa0, 0x13, 0x3f, 0xe3, 0xa0, 0x30, 0x0e, @@ -19058,18 +19294,18 @@ 0x34, 0x83, 0x20, 0x04, 0x3a, 0xff, 0xff, 0xfc, 0xe1, 0x2f, 0xff, 0x1e, 0x2e, 0x1b, 0xff, 0xf0, 0x2e, 0x1b, 0x7f, 0xf0, 0x2e, 0x1b, 0x7f, 0xef, - 0x2e, 0x08, 0x9a, 0x08, 0xcc, 0x1f, 0xff, 0xef, - 0xcc, 0x1f, 0x7f, 0xf0, 0x2e, 0x00, 0x1b, 0x8d, - 0x2e, 0x01, 0xc2, 0xe8, 0x2e, 0x01, 0xc3, 0xe0, - 0x2e, 0x08, 0x32, 0xfc, 0x00, 0x00, 0x08, 0x00, - 0x2e, 0x08, 0x22, 0xfc, 0x00, 0x00, 0x08, 0x00, - 0x2e, 0x08, 0x2a, 0xfc, 0x00, 0x00, 0x08, 0x00, - 0x2e, 0x08, 0x59, 0xb8, 0xe5, 0x9f, 0xf0, 0x04, + 0x2e, 0x08, 0x9a, 0x00, 0xcc, 0x1f, 0xff, 0xef, + 0xcc, 0x1f, 0x7f, 0xf0, 0x2e, 0x00, 0x1c, 0x39, + 0x2e, 0x01, 0xca, 0x48, 0x2e, 0x01, 0xcb, 0x40, + 0x2e, 0x08, 0x32, 0xf4, 0x00, 0x00, 0x08, 0x00, + 0x2e, 0x08, 0x22, 0xf4, 0x00, 0x00, 0x08, 0x00, + 0x2e, 0x08, 0x2a, 0xf4, 0x00, 0x00, 0x08, 0x00, + 0x2e, 0x08, 0x59, 0xb0, 0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, 0xe5, 0x9f, 0xf0, 0x04, - 0x2e, 0x08, 0x59, 0xb8, 0x2e, 0x08, 0x59, 0xb9, - 0x2e, 0x08, 0x59, 0xba, 0x2e, 0x03, 0x34, 0x9c, - 0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x3b, 0x78, - 0x2e, 0x08, 0x9a, 0x04, 0x1d, 0x77, 0x1e, 0x16, + 0x2e, 0x08, 0x59, 0xb0, 0x2e, 0x08, 0x59, 0xb1, + 0x2e, 0x08, 0x59, 0xb2, 0x2e, 0x03, 0x3b, 0xfc, + 0x2e, 0x08, 0x00, 0x00, 0x2e, 0x08, 0x3b, 0x70, + 0x2e, 0x08, 0x99, 0xfc, 0x1d, 0x77, 0x1e, 0x16, 0x03, 0x00, 0x03, 0x03, 0x1d, 0x7f, 0x50, 0x50, 0x4f, 0x5d, 0x49, 0x5d, 0x40, 0x4a, 0x44, 0x43, 0x01, 0x49, 0x4d, 0x56, 0x48, 0x4b, 0x5d, 0x4f, @@ -26169,10 +26405,11 @@ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x02, 0x02, 0x02, 0x02, 0x40, 0xe5, 0x9f, 0xc0, 0x00, - 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x01, 0x71, 0xfd, + 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x01, 0x79, 0x19, 0xe5, 0x9f, 0xc0, 0x00, 0xe1, 0x2f, 0xff, 0x1c, - 0x2e, 0x00, 0x5b, 0x9b, 0xe5, 0x9f, 0xc0, 0x00, - 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5c, 0x25, + 0x2e, 0x00, 0x5c, 0x7b, 0xe5, 0x9f, 0xc0, 0x00, + 0xe1, 0x2f, 0xff, 0x1c, 0x2e, 0x00, 0x5d, 0x05, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26181,10 +26418,9 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x01, 0xc9, 0x08, 0x2e, 0x01, 0xca, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x01, 0xc1, 0xa8, 0x2e, 0x01, 0xc2, 0xc0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xc1, 0xa8, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xc9, 0x08, 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, @@ -26223,15 +26459,14 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xcf, - 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0xcf, 0x00, 0x00, 0x02, 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, @@ -26283,8 +26518,8 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26293,15 +26528,15 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x01, 0x00, - 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, - 0x74, 0x20, 0x46, 0x75, 0x6a, 0x69, 0x74, 0x73, - 0x75, 0x20, 0x53, 0x69, 0x65, 0x6d, 0x65, 0x6e, - 0x73, 0x20, 0x26, 0x20, 0x43, 0x6f, 0x6e, 0x76, - 0x65, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x65, 0x20, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2c, 0x00, 0x01, 0x00, 0x43, 0x6f, 0x70, 0x79, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x46, 0x75, + 0x6a, 0x69, 0x74, 0x73, 0x75, 0x20, 0x53, 0x69, + 0x65, 0x6d, 0x65, 0x6e, 0x73, 0x20, 0x26, 0x20, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x67, 0x65, + 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26349,7 +26584,6 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x00, 0x13, 0x88, 0x02, 0x02, 0x01, 0x00, @@ -26359,10 +26593,10 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xd4, - 0x2e, 0x08, 0x05, 0xd4, 0x2e, 0x08, 0x05, 0xdc, - 0x2e, 0x08, 0x05, 0xdc, 0x2e, 0x08, 0x05, 0xe4, - 0x2e, 0x08, 0x05, 0xe4, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x05, 0xc4, + 0x2e, 0x08, 0x05, 0xc4, 0x2e, 0x08, 0x05, 0xcc, + 0x2e, 0x08, 0x05, 0xcc, 0x2e, 0x08, 0x05, 0xd4, + 0x2e, 0x08, 0x05, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26930,17 +27164,18 @@ 0x7e, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x66, 0x3c, + 0x00, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x67, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, - 0x2e, 0x08, 0x07, 0xa8, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x08, 0x07, 0x98, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26953,33 +27188,18 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, + 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xf7, - 0x11, 0x38, 0x06, 0x53, 0x2e, 0x08, 0x17, 0xe8, - 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, - 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -26989,38 +27209,53 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb1, 0x0e, 0xa6, 0x06, 0x53, + 0x2e, 0x08, 0x17, 0xdc, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x38, - 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x20, - 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x21, - 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, + 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, + 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x19, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xb9, - 0x0e, 0xa6, 0x06, 0x53, 0x2e, 0x08, 0x19, 0x18, - 0x2e, 0x08, 0x1a, 0x3c, 0x2e, 0x08, 0x19, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0xf5, 0x11, 0x38, 0x06, 0x53, + 0x2e, 0x08, 0x19, 0x0c, 0x2e, 0x08, 0x19, 0x00, + 0x2e, 0x08, 0x1a, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x64, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80, 0x10, 0x80, 0x00, 0x80, 0xda, 0x80, 0x00, 0x5a, 0x51, 0xf0, 0x00, 0x36, 0x91, 0x22, @@ -27178,27 +27413,27 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x50, - 0x2e, 0x08, 0x1f, 0x54, 0x2e, 0x08, 0x1f, 0x58, - 0x2e, 0x08, 0x1f, 0x60, 0x2e, 0x08, 0x1f, 0x64, - 0x2e, 0x08, 0x1f, 0x68, 0x6e, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x08, 0x1f, 0x48, + 0x2e, 0x08, 0x1f, 0x4c, 0x2e, 0x08, 0x1f, 0x50, + 0x2e, 0x08, 0x1f, 0x58, 0x2e, 0x08, 0x1f, 0x5c, + 0x2e, 0x08, 0x1f, 0x60, 0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x00, 0x6e, 0x00, 0x01, 0x08, 0x6e, 0x00, 0x01, 0x0c, 0x6e, 0x00, 0x01, 0x04, 0x6e, 0x00, 0x01, 0x10, 0x6e, 0x00, 0x01, 0x14, - 0x2e, 0x08, 0x60, 0x60, 0x00, 0x00, 0x00, 0x0d, + 0x2e, 0x08, 0x60, 0x58, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x25, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x0d, 0x00, + 0x2e, 0x08, 0x1f, 0xac, 0x2e, 0x08, 0x1f, 0xb0, 0x2e, 0x08, 0x1f, 0xb4, 0x2e, 0x08, 0x1f, 0xb8, - 0x2e, 0x08, 0x1f, 0xbc, 0x2e, 0x08, 0x1f, 0xc0, 0x70, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x04, 0x70, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x0c, 0x70, 0x00, 0x00, 0x10, 0x70, 0x00, 0x00, 0x30, - 0x2e, 0x01, 0xc4, 0xa9, 0x2e, 0x01, 0xc4, 0x39, - 0x2e, 0x01, 0xc3, 0xb1, 0x2e, 0x01, 0xc3, 0xa9, - 0x2e, 0x01, 0xc4, 0xe1, 0x2e, 0x01, 0xc4, 0x71, - 0x2e, 0x01, 0xc5, 0x25, 0x2e, 0x01, 0xc5, 0x1d, + 0x2e, 0x01, 0xcc, 0x09, 0x2e, 0x01, 0xcb, 0x99, + 0x2e, 0x01, 0xcb, 0x11, 0x2e, 0x01, 0xcb, 0x09, + 0x2e, 0x01, 0xcc, 0x41, 0x2e, 0x01, 0xcb, 0xd1, + 0x2e, 0x01, 0xcc, 0x85, 0x2e, 0x01, 0xcc, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x09, 0x80, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, @@ -28060,21 +28295,21 @@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, - 0x2e, 0x01, 0xc3, 0x90, 0x2e, 0x01, 0xc3, 0x90, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, + 0x2e, 0x01, 0xca, 0xf0, 0x2e, 0x01, 0xca, 0xf0, }; diff -Nru a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c --- a/drivers/media/dvb/ttpci/budget-ci.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/ttpci/budget-ci.c Wed Oct 8 12:24:55 2003 @@ -357,10 +357,12 @@ static struct saa7146_extension budget_extension; MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC); +MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); static struct pci_device_id pci_tbl[] = { MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c), MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f), + MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011), { .vendor = 0, } @@ -384,10 +386,7 @@ static int __init budget_ci_init(void) { - if (saa7146_register_extension(&budget_extension)) - return -ENODEV; - - return 0; + return saa7146_register_extension(&budget_extension); } diff -Nru a/drivers/media/dvb/ttpci/budget-core.c b/drivers/media/dvb/ttpci/budget-core.c --- a/drivers/media/dvb/ttpci/budget-core.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/ttpci/budget-core.c Wed Oct 8 12:24:56 2003 @@ -46,12 +46,12 @@ mdelay(10); saa7146_write(dev, BASE_ODD3, 0); - saa7146_write(dev, BASE_EVEN3, TS_WIDTH*TS_HEIGHT/2); + saa7146_write(dev, BASE_EVEN3, 0); saa7146_write(dev, PROT_ADDR3, TS_WIDTH*TS_HEIGHT); saa7146_write(dev, BASE_PAGE3, budget->pt.dma |ME1|0x90); saa7146_write(dev, PITCH3, TS_WIDTH); - saa7146_write(dev, NUM_LINE_BYTE3, ((TS_HEIGHT/2)<<16)|TS_WIDTH); + saa7146_write(dev, NUM_LINE_BYTE3, (TS_HEIGHT<<16)|TS_WIDTH); saa7146_write(dev, MC2, (MASK_04 | MASK_20)); saa7146_write(dev, MC1, (MASK_04 | MASK_20)); // DMA3 on @@ -80,14 +80,11 @@ return; if (newdma > olddma) { /* no wraparound, dump olddma..newdma */ - if(mem[olddma] == 0x47) dvb_dmx_swfilter_packets(&budget->demux, mem+olddma, (newdma-olddma) / 188); } else { /* wraparound, dump olddma..buflen and 0..newdma */ - if(mem[olddma] == 0x47) dvb_dmx_swfilter_packets(&budget->demux, mem+olddma, (TS_BUFLEN-olddma) / 188); - if(mem[0] == 0x47) dvb_dmx_swfilter_packets(&budget->demux, mem, newdma / 188); } diff -Nru a/drivers/media/dvb/ttpci/budget-patch.c b/drivers/media/dvb/ttpci/budget-patch.c --- a/drivers/media/dvb/ttpci/budget-patch.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/ttpci/budget-patch.c Wed Oct 8 12:24:55 2003 @@ -247,10 +247,7 @@ static int __init budget_patch_init(void) { - if (saa7146_register_extension(&budget_extension)) - return -ENODEV; - - return 0; + return saa7146_register_extension(&budget_extension); } diff -Nru a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c --- a/drivers/media/dvb/ttpci/budget.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/dvb/ttpci/budget.c Wed Oct 8 12:24:56 2003 @@ -192,7 +192,6 @@ MAKE_BUDGET_INFO(ttbs, "TT-Budget/WinTV-NOVA-S PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbc, "TT-Budget/WinTV-NOVA-C PCI", BUDGET_TT); MAKE_BUDGET_INFO(ttbt, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); -MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); MAKE_BUDGET_INFO(satel, "SATELCO Multimedia PCI", BUDGET_TT_HW_DISEQC); /* Uncomment for Budget Patch */ /*MAKE_BUDGET_INFO(fs_1_3,"Siemens/Technotrend/Hauppauge PCI rev1.3+Budget_Patch", BUDGET_PATCH);*/ @@ -203,7 +202,6 @@ MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1003), MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), - MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011), MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), { .vendor = 0, @@ -228,10 +226,7 @@ static int __init budget_init(void) { - if (saa7146_register_extension(&budget_extension)) - return -ENODEV; - - return 0; + return saa7146_register_extension(&budget_extension); } diff -Nru a/drivers/media/dvb/ttusb-budget/Kconfig b/drivers/media/dvb/ttusb-budget/Kconfig --- a/drivers/media/dvb/ttusb-budget/Kconfig Wed Oct 8 12:24:55 2003 +++ b/drivers/media/dvb/ttusb-budget/Kconfig Wed Oct 8 12:24:55 2003 @@ -1,6 +1,6 @@ config DVB_TTUSB_BUDGET tristate "Technotrend/Hauppauge Nova-USB devices" - depends on DVB_CORE && USB + depends on DVB_CORE help Support for external USB adapters designed by Technotrend and produced by Hauppauge, shipped under the brand name 'Nova-USB'. diff -Nru a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c --- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c Wed Oct 8 12:24:57 2003 @@ -9,6 +9,7 @@ * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. */ +#include #include #include #include @@ -27,7 +28,6 @@ #include #include #include -#include #include "dvb_functions.h" @@ -1055,7 +1055,8 @@ if (tc < 0) return 0; - copy_to_user(buf, stc_firmware + *offset, tc); + if (copy_to_user(buf, stc_firmware + *offset, tc)) + return -EFAULT; *offset += tc; diff -Nru a/drivers/media/dvb/ttusb-dec/ttusb_dec.c b/drivers/media/dvb/ttusb-dec/ttusb_dec.c --- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c Wed Oct 8 12:24:57 2003 @@ -19,6 +19,7 @@ * */ +#include #include #include #include diff -Nru a/drivers/media/radio/radio-gemtek-pci.c b/drivers/media/radio/radio-gemtek-pci.c --- a/drivers/media/radio/radio-gemtek-pci.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/radio/radio-gemtek-pci.c Wed Oct 8 12:24:55 2003 @@ -37,7 +37,6 @@ *************************************************************************** */ -#include #include #include #include diff -Nru a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig --- a/drivers/media/video/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/Kconfig Wed Oct 8 12:24:57 2003 @@ -3,7 +3,7 @@ # menu "Video For Linux" - depends on VIDEO_DEV!=n + depends on VIDEO_DEV comment "Video Adapters" @@ -228,7 +228,8 @@ config VIDEO_MXB tristate "Siemens-Nixdorf 'Multimedia eXtension Board'" - depends on VIDEO_DEV && PCI && I2C + depends on VIDEO_DEV && PCI + select VIDEO_SAA7146_VV ---help--- This is a video4linux driver for the 'Multimedia eXtension Board' TV card by Siemens-Nixdorf. @@ -238,7 +239,8 @@ config VIDEO_DPC tristate "Philips-Semiconductors 'dpc7146 demonstration board'" - depends on VIDEO_DEV && PCI && I2C + depends on VIDEO_DEV && PCI + select VIDEO_SAA7146_VV ---help--- This is a video4linux driver for the 'dpc7146 demonstration board' by Philips-Semiconductors. It's the reference design @@ -251,7 +253,8 @@ config VIDEO_HEXIUM_ORION tristate "Hexium HV-PCI6 and Orion frame grabber" - depends on VIDEO_DEV && PCI && I2C + depends on VIDEO_DEV && PCI + select VIDEO_SAA7146_VV ---help--- This is a video4linux driver for the Hexium HV-PCI6 and Orion frame grabber cards by Hexium. @@ -261,7 +264,8 @@ config VIDEO_HEXIUM_GEMINI tristate "Hexium Gemini frame grabber" - depends on VIDEO_DEV && PCI && I2C + depends on VIDEO_DEV && PCI + select VIDEO_SAA7146_VV ---help--- This is a video4linux driver for the Hexium Gemini frame grabber card by Hexium. Please note that the Gemini Dual diff -Nru a/drivers/media/video/adv7170.c b/drivers/media/video/adv7170.c --- a/drivers/media/video/adv7170.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/adv7170.c Wed Oct 8 12:24:57 2003 @@ -28,8 +28,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -49,7 +47,6 @@ #include #include -#include #include MODULE_DESCRIPTION("Analog Devices ADV7170 video encoder driver"); diff -Nru a/drivers/media/video/adv7175.c b/drivers/media/video/adv7175.c --- a/drivers/media/video/adv7175.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/adv7175.c Wed Oct 8 12:24:57 2003 @@ -24,8 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -45,7 +43,6 @@ #include #include -#include #include MODULE_DESCRIPTION("Analog Devices ADV7175 video encoder driver"); diff -Nru a/drivers/media/video/bt819.c b/drivers/media/video/bt819.c --- a/drivers/media/video/bt819.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/bt819.c Wed Oct 8 12:24:55 2003 @@ -28,8 +28,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -49,7 +47,6 @@ #include #include -#include #include MODULE_DESCRIPTION("Brooktree-819 video decoder driver"); diff -Nru a/drivers/media/video/bt848.h b/drivers/media/video/bt848.h --- a/drivers/media/video/bt848.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/bt848.h Wed Oct 8 12:24:56 2003 @@ -282,12 +282,15 @@ #define BT848_GPIO_DMA_CTL_FIFO_ENABLE (1<<0) #define BT848_I2C 0x110 +#define BT878_I2C_MODE (1<<7) +#define BT878_I2C_RATE (1<<6) +#define BT878_I2C_NOSTOP (1<<5) +#define BT878_I2C_NOSTART (1<<4) #define BT848_I2C_DIV (0xf<<4) #define BT848_I2C_SYNC (1<<3) #define BT848_I2C_W3B (1<<2) #define BT848_I2C_SCL (1<<1) #define BT848_I2C_SDA (1<<0) - #define BT848_RISC_STRT_ADD 0x114 #define BT848_GPIO_OUT_EN 0x118 diff -Nru a/drivers/media/video/bt856.c b/drivers/media/video/bt856.c --- a/drivers/media/video/bt856.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/bt856.c Wed Oct 8 12:24:55 2003 @@ -28,8 +28,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -49,7 +47,6 @@ #include #include -#include #include MODULE_DESCRIPTION("Brooktree-856A video encoder driver"); diff -Nru a/drivers/media/video/btcx-risc.c b/drivers/media/video/btcx-risc.c --- a/drivers/media/video/btcx-risc.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/btcx-risc.c Wed Oct 8 12:24:55 2003 @@ -44,39 +44,6 @@ static int memcnt; -int btcx_riscmem_alloc(struct pci_dev *pci, - struct btcx_riscmem *risc, - unsigned int size) -{ - u32 *cpu; - dma_addr_t dma; - - cpu = pci_alloc_consistent(pci, size, &dma); - if (NULL == cpu) - return -ENOMEM; - memset(cpu,0,size); - -#if 0 - if (risc->cpu && risc->size < size) { - /* realloc (enlarge buffer) -- copy old stuff */ - memcpy(cpu,risc->cpu,risc->size); - btcx_riscmem_free(pci,risc); - } -#else - BUG_ON(NULL != risc->cpu); -#endif - risc->cpu = cpu; - risc->dma = dma; - risc->size = size; - - if (debug) { - memcnt++; - printk("btcx: riscmem alloc size=%d [%d]\n",size,memcnt); - } - - return 0; -} - void btcx_riscmem_free(struct pci_dev *pci, struct btcx_riscmem *risc) { @@ -88,6 +55,31 @@ memcnt--; printk("btcx: riscmem free [%d]\n",memcnt); } +} + +int btcx_riscmem_alloc(struct pci_dev *pci, + struct btcx_riscmem *risc, + unsigned int size) +{ + u32 *cpu; + dma_addr_t dma; + + if (NULL != risc->cpu && risc->size < size) + btcx_riscmem_free(pci,risc); + if (NULL == risc->cpu) { + cpu = pci_alloc_consistent(pci, size, &dma); + if (NULL == cpu) + return -ENOMEM; + risc->cpu = cpu; + risc->dma = dma; + risc->size = size; + if (debug) { + memcnt++; + printk("btcx: riscmem alloc size=%d [%d]\n",size,memcnt); + } + } + memset(risc->cpu,0,risc->size); + return 0; } /* ---------------------------------------------------------- */ diff -Nru a/drivers/media/video/bttv-cards.c b/drivers/media/video/bttv-cards.c --- a/drivers/media/video/bttv-cards.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/bttv-cards.c Wed Oct 8 12:24:56 2003 @@ -21,10 +21,9 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - + */ -#include #include #include #include @@ -32,7 +31,9 @@ #include #include #include -#include +#ifdef CONFIG_FW_LOADER +# include +#endif #include @@ -62,6 +63,7 @@ static void rv605_muxsel(struct bttv *btv, unsigned int input); static void eagle_muxsel(struct bttv *btv, unsigned int input); static void xguard_muxsel(struct bttv *btv, unsigned int input); +static void ivc120_muxsel(struct bttv *btv, unsigned int input); static int terratec_active_radio_upgrade(struct bttv *btv); static int tea5757_read(struct bttv *btv); @@ -78,6 +80,7 @@ static unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; static unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; static unsigned int tuner[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; +static unsigned int svhs[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET}; #ifdef MODULE static unsigned int autoload = 1; #else @@ -216,12 +219,32 @@ { 0x1466aa06, BTTV_PV150, "Provideo PV150B-3" }, { 0x1467aa07, BTTV_PV150, "Provideo PV150B-4" }, - - { 0xa1550000, BTTV_IVC200, "IVC-200" }, - { 0xa1550001, BTTV_IVC200, "IVC-200" }, - { 0xa1550002, BTTV_IVC200, "IVC-200" }, - { 0xa1550003, BTTV_IVC200, "IVC-200" }, - + { 0xa132ff00, BTTV_IVC100, "IVC-100" }, + { 0xa1550000, BTTV_IVC200, "IVC-200" }, + { 0xa1550001, BTTV_IVC200, "IVC-200" }, + { 0xa1550002, BTTV_IVC200, "IVC-200" }, + { 0xa1550003, BTTV_IVC200, "IVC-200" }, + { 0xa1550100, BTTV_IVC200, "IVC-200G" }, + { 0xa1550101, BTTV_IVC200, "IVC-200G" }, + { 0xa1550102, BTTV_IVC200, "IVC-200G" }, + { 0xa1550103, BTTV_IVC200, "IVC-200G" }, + { 0xa182ff00, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff01, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff02, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff03, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff04, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff05, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff06, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff07, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff08, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff09, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff0a, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff0b, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff0c, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff0d, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff0e, BTTV_IVC120, "IVC-120G" }, + { 0xa182ff0f, BTTV_IVC120, "IVC-120G" }, + { 0x41424344, BTTV_GRANDTEC, "GrandTec Multi Capture" }, { 0x01020304, BTTV_XGUARD, "Grandtec Grand X-Guard" }, @@ -1338,7 +1361,7 @@ },{ .name = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF", .video_inputs = 4, - .audio_inputs = 3, + .audio_inputs = 3, .tuner = 0, .svhs = 2, .gpiomask = 7, @@ -1388,18 +1411,19 @@ .gpiomask = 7, .audiomux = {7}, },{ - .name = "GV-BCTV5/PCI", + .name = "IODATA GV-BCTV5/PCI", .video_inputs = 3, .audio_inputs = 1, .tuner = 0, .svhs = 2, - .gpiomask = 0x010f00, + .gpiomask = 0x0f0f80, .muxsel = {2, 3, 1, 0}, - .audiomux = {0x10000, 0, 0x10000, 0, 0, 0}, + .audiomux = {0x030000, 0x010000, 0x030000, 0, 0x020000, 0}, .no_msp34xx = 1, .pll = PLL_28, .tuner_type = TUNER_PHILIPS_NTSC_M, .audio_hook = gvbctv3pci_audio, + .has_radio = 1, },{ .name = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */ .video_inputs = 4, /* id-inputs-clock */ @@ -1720,16 +1744,14 @@ /* ---- card 0x68 ---------------------------------- */ .name = "Nebula Electronics DigiTV", - .video_inputs = 0, - .audio_inputs = 0, .svhs = -1, .muxsel = { 2, 3, 1, 0}, - .needs_tvaudio = 0, .no_msp34xx = 1, .no_tda9875 = 1, .no_tda7432 = 1, .pll = PLL_28, .tuner_type = -1, + .no_video = 1, },{ /* Jorge Boncompte - DTI2 */ .name = "ProVideo PV143", @@ -1801,6 +1823,33 @@ .needs_tvaudio = 1, .pll = PLL_28, .tuner_type = -1, +},{ + .name = "IVC-100", + .video_inputs = 4, + .audio_inputs = 0, + .tuner = -1, + .tuner_type = -1, + .svhs = -1, + .gpiomask = 0xdf, + .muxsel = { 2, 3, 1, 0 }, + .pll = PLL_28, +},{ + /* IVC-120G - Alan Garfield */ + .name = "IVC-120G", + .video_inputs = 16, + .audio_inputs = 0, /* card has no audio */ + .tuner = -1, /* card has no tuner */ + .tuner_type = -1, + .svhs = -1, /* card has no svhs */ + .needs_tvaudio = 0, + .no_msp34xx = 1, + .no_tda9875 = 1, + .no_tda7432 = 1, + .gpiomask = 0x00, + .muxsel = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }, + .muxsel_hook = ivc120_muxsel, + .pll = PLL_28, }}; const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards); @@ -1853,12 +1902,8 @@ btv->type=card[btv->nr]; /* print which card config we are using */ - sprintf(btv->video_dev.name,"BT%d%s(%.23s)", - btv->id, - (btv->id==848 && btv->revision==0x12) ? "A" : "", - bttv_tvcards[btv->type].name); printk(KERN_INFO "bttv%d: using: %s [card=%d,%s]\n",btv->nr, - btv->video_dev.name,btv->type, + bttv_tvcards[btv->type].name, btv->type, card[btv->nr] < bttv_num_tvcards ? "insmod option" : "autodetected"); @@ -2107,6 +2152,27 @@ /* ----------------------------------------------------------------------- */ +void bttv_reset_audio(struct bttv *btv) +{ + /* + * BT878A has a audio-reset register. + * 1. This register is an audio reset function but it is in + * function-0 (video capture) address space. + * 2. It is enough to do this once per power-up of the card. + * 3. There is a typo in the Conexant doc -- it is not at + * 0x5B, but at 0x058. (B is an odd-number, obviously a typo!). + * --//Shrikumar 030609 + */ + if (btv->id != 878) + return; + + if (bttv_debug) + printk("bttv%d: BT878A ARESET\n",btv->nr); + btwrite((1<<7), 0x058); + udelay(10); + btwrite( 0, 0x058); +} + /* initialization part one -- before registering i2c bus */ void __devinit bttv_init_card1(struct bttv *btv) { @@ -2269,6 +2335,9 @@ &btv->pinnacle_id); if (btv->tuner_type != UNSET) bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type); + btv->svhs = bttv_tvcards[btv->type].svhs; + if (svhs[btv->nr] != UNSET) + btv->svhs = svhs[btv->nr]; if (bttv_tvcards[btv->type].has_radio) btv->has_radio=1; @@ -2548,10 +2617,9 @@ int __devinit pvr_boot(struct bttv *btv) { const struct firmware *fw_entry; - struct device *dev = &btv->dev->dev; int rc; - rc = request_firmware(&fw_entry, "hcwamc.rbf", dev); + rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->dev->dev); if (rc != 0) { printk(KERN_WARNING "bttv%d: no altera firmware [via hotplug]\n", btv->nr); @@ -2696,12 +2764,12 @@ static void __devinit avermedia_eeprom(struct bttv *btv) { - int tuner_make,tuner_tv_fm,tuner_format,tuner=0,remote; + int tuner_make,tuner_tv_fm,tuner_format,tuner=0; - tuner_make = (eeprom_data[0x41] & 0x7); - tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; - tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; - remote = (eeprom_data[0x42] & 0x01); + tuner_make = (eeprom_data[0x41] & 0x7); + tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; + tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; + btv->has_remote = (eeprom_data[0x42] & 0x01); if (tuner_make == 0 || tuner_make == 2) if(tuner_format <=9) @@ -2718,8 +2786,8 @@ } else printk("Unknown type"); printk(" radio:%s remote control:%s\n", - tuner_tv_fm?"yes":"no", - remote?"yes":"no"); + tuner_tv_fm ? "yes" : "no", + btv->has_remote ? "yes" : "no"); } /* used on Voodoo TV/FM (Voodoo 200), S0 wired to 0x10000 */ @@ -3448,6 +3516,72 @@ btwrite(masks[input%16], BT848_GPIO_DATA); } +/* + * ivc120_muxsel [Added by Alan Garfield ] + * + * The IVC120G security card has 4 i2c controlled TDA8540 matrix + * swichers to provide 16 channels to MUX0. The TDA8540's have + * 4 indepedant outputs and as such the IVC120G also has the + * optional "Monitor Out" bus. This allows the card to be looking + * at one input while the monitor is looking at another. + * + * Since I've couldn't be bothered figuring out how to add an + * independant muxsel for the monitor bus, I've just set it to + * whatever the card is looking at. + * + * OUT0 of the TDA8540's is connected to MUX0 (0x03) + * OUT1 of the TDA8540's is connected to "Monitor Out" (0x0C) + * + * TDA8540_ALT3 IN0-3 = Channel 13 - 16 (0x03) + * TDA8540_ALT4 IN0-3 = Channel 1 - 4 (0x03) + * TDA8540_ALT5 IN0-3 = Channel 5 - 8 (0x03) + * TDA8540_ALT6 IN0-3 = Channel 9 - 12 (0x03) + * + */ + +/* All 7 possible sub-ids for the TDA8540 Matrix Switcher */ +#define I2C_TDA8540 0x90 +#define I2C_TDA8540_ALT1 0x92 +#define I2C_TDA8540_ALT2 0x94 +#define I2C_TDA8540_ALT3 0x96 +#define I2C_TDA8540_ALT4 0x98 +#define I2C_TDA8540_ALT5 0x9a +#define I2C_TDA8540_ALT6 0x9c + +static void ivc120_muxsel(struct bttv *btv, unsigned int input) +{ + // Simple maths + int key = input % 4; + int matrix = input / 4; + + dprintk("bttv%d: ivc120_muxsel: Input - %02d | TDA - %02d | In - %02d\n", + btv->nr, input, matrix, key); + + // Handles the input selection on the TDA8540's + bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x00, + ((matrix == 3) ? (key | key << 2) : 0x00), 1); + bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x00, + ((matrix == 0) ? (key | key << 2) : 0x00), 1); + bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x00, + ((matrix == 1) ? (key | key << 2) : 0x00), 1); + bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x00, + ((matrix == 2) ? (key | key << 2) : 0x00), 1); + + // Handles the output enables on the TDA8540's + bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x02, + ((matrix == 3) ? 0x03 : 0x00), 1); // 13 - 16 + bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x02, + ((matrix == 0) ? 0x03 : 0x00), 1); // 1-4 + bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x02, + ((matrix == 1) ? 0x03 : 0x00), 1); // 5-8 + bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x02, + ((matrix == 2) ? 0x03 : 0x00), 1); // 9-12 + + // Selects MUX0 for input on the 878 + btaor((0)<<5, ~(3<<5), BT848_IFORM); +} + + /* ----------------------------------------------------------------------- */ /* motherboard chipset specific stuff */ @@ -3467,9 +3601,11 @@ latency = 0x0A; #endif +#if 0 /* print which chipset we have */ while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8,dev))) printk(KERN_INFO "bttv: Host bridge is %s\n",pci_name(dev)); +#endif /* print warnings about any quirks found */ if (triton1) diff -Nru a/drivers/media/video/bttv-driver.c b/drivers/media/video/bttv-driver.c --- a/drivers/media/video/bttv-driver.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/bttv-driver.c Wed Oct 8 12:24:57 2003 @@ -61,14 +61,15 @@ static int vbi_nr = -1; static unsigned int fdsr = 0; -static unsigned int gpint = 1; /* options */ -static unsigned int combfilter = 0; -static unsigned int lumafilter = 0; -static unsigned int automute = 1; -static unsigned int chroma_agc = 0; -static unsigned int adc_crush = 1; +static unsigned int combfilter = 0; +static unsigned int lumafilter = 0; +static unsigned int automute = 1; +static unsigned int chroma_agc = 0; +static unsigned int adc_crush = 1; +static unsigned int vcr_hack = 0; +static unsigned int irq_iswitch = 0; /* API features (turn on/off stuff for testing) */ static unsigned int sloppy = 0; @@ -98,7 +99,6 @@ MODULE_PARM(vbi_nr,"i"); MODULE_PARM(fdsr,"i"); -MODULE_PARM(gpint,"i"); MODULE_PARM(combfilter,"i"); MODULE_PARM(lumafilter,"i"); @@ -108,6 +108,10 @@ MODULE_PARM_DESC(chroma_agc,"enables the AGC of chroma signal, default is 0 (no)"); MODULE_PARM(adc_crush,"i"); MODULE_PARM_DESC(adc_crush,"enables the luminance ADC crush, default is 1 (yes)"); +MODULE_PARM(vcr_hack,"i"); +MODULE_PARM_DESC(vcr_hack,"enables the VCR hack (improves synch on poor VCR tapes), default is 0 (no)"); +MODULE_PARM(irq_iswitch,"i"); +MODULE_PARM_DESC(irq_iswitch,"switch inputs in irq handler"); MODULE_PARM(sloppy,"i"); MODULE_PARM(v4l2,"i"); @@ -115,7 +119,6 @@ MODULE_DESCRIPTION("bttv - v4l/v4l2 driver module for bt848/878 based cards"); MODULE_AUTHOR("Ralph Metzler & Marcus Metzler & Gerd Knorr"); MODULE_LICENSE("GPL"); -MODULE_ALIAS_CHARDEV_MAJOR(VIDEO_MAJOR); /* kernel args */ #ifndef MODULE @@ -124,6 +127,17 @@ #endif /* ----------------------------------------------------------------------- */ +/* sysfs */ + +static ssize_t show_card(struct class_device *cd, char *buf) +{ + struct video_device *vfd = to_video_device(cd); + struct bttv *btv = dev_get_drvdata(vfd->dev); + return sprintf(buf, "%d\n", btv ? btv->type : UNSET); +} +static CLASS_DEVICE_ATTR(card, S_IRUGO, show_card, NULL); + +/* ----------------------------------------------------------------------- */ /* static data */ /* special timing tables from conexant... */ @@ -464,7 +478,8 @@ #define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 2) #define V4L2_CID_PRIVATE_LUMAFILTER (V4L2_CID_PRIVATE_BASE + 3) #define V4L2_CID_PRIVATE_AGC_CRUSH (V4L2_CID_PRIVATE_BASE + 4) -#define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 5) +#define V4L2_CID_PRIVATE_VCR_HACK (V4L2_CID_PRIVATE_BASE + 5) +#define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 6) static const struct v4l2_queryctrl no_ctl = { .name = "42", @@ -576,6 +591,12 @@ .minimum = 0, .maximum = 1, .type = V4L2_CTRL_TYPE_BOOLEAN, + },{ + .id = V4L2_CID_PRIVATE_VCR_HACK, + .name = "vcr hack", + .minimum = 0, + .maximum = 1, + .type = V4L2_CTRL_TYPE_BOOLEAN, } }; const int BTTV_CTLS = ARRAY_SIZE(bttv_ctls); @@ -721,7 +742,7 @@ int table_idx = bttv_tvnorms[btv->tvnorm].sram; int fsc = bttv_tvnorms[btv->tvnorm].Fsc; - if (bttv_tvcards[btv->type].muxsel[btv->input] < 0) { + if (UNSET == bttv_tvcards[btv->type].muxsel[btv->input]) { dprintk("bttv%d: load digital timing table (table_idx=%d)\n", btv->nr,table_idx); @@ -815,13 +836,7 @@ if (mask2) btaor(mask2,~mask2,BT848_GPIO_OUT_EN); -#if 0 - /* This seems to get rid of some synchronization problems */ - btand(~(3<<5), BT848_IFORM); - schedule_timeout(HZ/10); -#endif - - if (input==bttv_tvcards[btv->type].svhs) { + if (input == btv->svhs) { btor(BT848_CONTROL_COMP, BT848_E_CONTROL); btor(BT848_CONTROL_COMP, BT848_O_CONTROL); } else { @@ -933,8 +948,21 @@ static void set_input(struct bttv *btv, unsigned int input) { + unsigned long flags; + btv->input = input; - video_mux(btv,input); + if (irq_iswitch) { + spin_lock_irqsave(&btv->s_lock,flags); + if (btv->curr.irqflags) { + /* active capture -> delayed input switch */ + btv->new_input = input; + } else { + video_mux(btv,input); + } + spin_unlock_irqrestore(&btv->s_lock,flags); + } else { + video_mux(btv,input); + } audio_mux(btv,(input == bttv_tvcards[btv->type].tuner ? AUDIO_TUNER : AUDIO_EXTERN)); set_tvnorm(btv,btv->tvnorm); @@ -974,6 +1002,16 @@ btwrite(BT848_CONTROL_LDEC, BT848_E_CONTROL); btwrite(BT848_CONTROL_LDEC, BT848_O_CONTROL); } + + /* interrupt */ + btwrite(0xfffffUL, BT848_INT_STAT); + btwrite((btv->triton1) | + BT848_INT_GPINT | + BT848_INT_SCERR | + (fdsr ? BT848_INT_FDSR : 0) | + BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES| + BT848_INT_FMTCHG|BT848_INT_HLOCK, + BT848_INT_MASK); } extern void bttv_reinit_bt848(struct bttv *btv) @@ -1053,6 +1091,9 @@ case V4L2_CID_PRIVATE_AGC_CRUSH: c->value = btv->opt_adc_crush; break; + case V4L2_CID_PRIVATE_VCR_HACK: + c->value = btv->opt_vcr_hack; + break; default: return -EINVAL; } @@ -1138,6 +1179,9 @@ btwrite(BT848_ADC_RESERVED | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0), BT848_ADC); break; + case V4L2_CID_PRIVATE_VCR_HACK: + btv->opt_vcr_hack = c->value; + break; default: return -EINVAL; } @@ -1281,7 +1325,7 @@ /* alloc risc memory */ if (STATE_NEEDS_INIT == buf->vb.state) { redo_dma_risc = 1; - if (0 != (rc = videobuf_iolock(btv->dev,&buf->vb))) + if (0 != (rc = videobuf_iolock(btv->dev,&buf->vb,&btv->fbuf))) goto fail; } @@ -1429,7 +1473,7 @@ v->flags|=VIDEO_VC_TUNER; v->type=VIDEO_TYPE_TV; v->tuners=1; - } else if (channel == bttv_tvcards[btv->type].svhs) { + } else if (channel == btv->svhs) { strcpy(v->name,"S-Video"); } else { sprintf(v->name,"Composite%d",channel); @@ -1562,7 +1606,7 @@ sprintf(i->name, "Television"); i->type = V4L2_INPUT_TYPE_TUNER; i->tuner = 0; - } else if (i->index==bttv_tvcards[btv->type].svhs) { + } else if (i->index == btv->svhs) { sprintf(i->name, "S-Video"); } else { sprintf(i->name,"Composite%d",i->index); @@ -1766,7 +1810,7 @@ } /* clip against screen */ if (NULL != btv->fbuf.base) - n = btcx_screen_clips(btv->fbuf.width, btv->fbuf.width, + n = btcx_screen_clips(btv->fbuf.fmt.width, btv->fbuf.fmt.height, &win->w, clips, n); btcx_sort_clips(clips,n); @@ -2032,6 +2076,21 @@ if (btv->errors) bttv_reinit_bt848(btv); +#ifdef VIDIOC_G_PRIORITY + switch (cmd) { + case VIDIOCSFREQ: + case VIDIOCSTUNER: + case VIDIOCSCHAN: + case VIDIOC_S_CTRL: + case VIDIOC_S_STD: + case VIDIOC_S_INPUT: + case VIDIOC_S_TUNER: + case VIDIOC_S_FREQUENCY: + retval = v4l2_prio_check(&btv->prio,&fh->prio); + if (0 != retval) + return retval; + }; +#endif switch (cmd) { /* *** v4l1 *** ************************************************ */ @@ -2040,7 +2099,7 @@ struct video_capability *cap = arg; memset(cap,0,sizeof(*cap)); - strcpy(cap->name,btv->video_dev.name); + strcpy(cap->name,btv->video_dev->name); if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type) { /* vbi */ cap->type = VID_TYPE_TUNER|VID_TYPE_TELETEXT; @@ -2147,7 +2206,13 @@ case VIDIOCGFBUF: { struct video_buffer *fbuf = arg; - *fbuf = btv->fbuf; + + fbuf->base = btv->fbuf.base; + fbuf->width = btv->fbuf.fmt.width; + fbuf->height = btv->fbuf.fmt.height; + fbuf->bytesperline = btv->fbuf.fmt.bytesperline; + if (fh->ovfmt) + fbuf->depth = fh->ovfmt->depth; return 0; } case VIDIOCSFBUF: @@ -2200,7 +2265,13 @@ fbuf->depth != 24 && fbuf->depth != 32) goto fh_unlock_and_return; } - btv->fbuf = *fbuf; + btv->fbuf.base = fbuf->base; + btv->fbuf.fmt.width = fbuf->width; + btv->fbuf.fmt.height = fbuf->height; + if (fbuf->bytesperline) + btv->fbuf.fmt.bytesperline = fbuf->bytesperline; + else + btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fbuf->depth/8; up(&fh->cap.lock); return 0; } @@ -2245,7 +2316,8 @@ unsigned int i; down(&fh->cap.lock); - retval = videobuf_mmap_setup(file,&fh->cap,gbuffers,gbufsize); + retval = videobuf_mmap_setup(file,&fh->cap,gbuffers,gbufsize, + V4L2_MEMORY_MMAP); if (retval < 0) goto fh_unlock_and_return; memset(mbuf,0,sizeof(*mbuf)); @@ -2391,7 +2463,7 @@ if (0 == v4l2) return -EINVAL; strcpy(cap->driver,"bttv"); - strlcpy(cap->card,btv->video_dev.name,sizeof(cap->card)); + strlcpy(cap->card,btv->video_dev->name,sizeof(cap->card)); sprintf(cap->bus_info,"PCI:%s",pci_name(btv->dev)); cap->version = BTTV_VERSION_CODE; cap->capabilities = @@ -2474,11 +2546,7 @@ { struct v4l2_framebuffer *fb = arg; - memset(fb,0,sizeof(*fb)); - fb->base = btv->fbuf.base; - fb->fmt.width = btv->fbuf.width; - fb->fmt.height = btv->fbuf.height; - fb->fmt.bytesperline = btv->fbuf.bytesperline; + *fb = btv->fbuf; fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING; if (fh->ovfmt) fb->fmt.pixelformat = fh->ovfmt->fourcc; @@ -2488,16 +2556,12 @@ { struct v4l2_framebuffer *fb = arg; const struct bttv_format *fmt; - unsigned long end; if(!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RAWIO)) return -EPERM; /* check args */ - end = (unsigned long)fb->base + - fb->fmt.height * fb->fmt.bytesperline; - fmt = format_by_fourcc(fb->fmt.pixelformat); if (NULL == fmt) return -EINVAL; @@ -2514,14 +2578,13 @@ } /* ok, accept it */ - btv->fbuf.base = fb->base; - btv->fbuf.width = fb->fmt.width; - btv->fbuf.height = fb->fmt.height; - btv->fbuf.depth = fmt->depth; + btv->fbuf.base = fb->base; + btv->fbuf.fmt.width = fb->fmt.width; + btv->fbuf.fmt.height = fb->fmt.height; if (0 != fb->fmt.bytesperline) - btv->fbuf.bytesperline = fb->fmt.bytesperline; + btv->fbuf.fmt.bytesperline = fb->fmt.bytesperline; else - btv->fbuf.bytesperline = btv->fbuf.width*fmt->depth/8; + btv->fbuf.fmt.bytesperline = btv->fbuf.fmt.width*fmt->depth/8; retval = 0; fh->ovfmt = fmt; @@ -2642,6 +2705,23 @@ parm->parm.capture.timeperframe = s.frameperiod; return 0; } + +#ifdef VIDIOC_G_PRIORITY + case VIDIOC_G_PRIORITY: + { + enum v4l2_priority *p = arg; + + *p = v4l2_prio_max(&btv->prio); + return 0; + } + case VIDIOC_S_PRIORITY: + { + enum v4l2_priority *prio = arg; + + return v4l2_prio_change(&btv->prio, &fh->prio, *prio); + } +#endif + case VIDIOC_ENUMSTD: case VIDIOC_G_STD: @@ -2768,12 +2848,12 @@ dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor); for (i = 0; i < bttv_num; i++) { - if (bttvs[i].video_dev.minor == minor) { + if (bttvs[i].video_dev->minor == minor) { btv = &bttvs[i]; type = V4L2_BUF_TYPE_VIDEO_CAPTURE; break; } - if (bttvs[i].vbi_dev.minor == minor) { + if (bttvs[i].vbi_dev->minor == minor) { btv = &bttvs[i]; type = V4L2_BUF_TYPE_VBI_CAPTURE; break; @@ -2793,6 +2873,10 @@ *fh = btv->init; fh->type = type; fh->ov.setup_ok = 0; +#ifdef VIDIOC_G_PRIORITY + v4l2_prio_open(&btv->prio,&fh->prio); +#endif + videobuf_queue_init(&fh->cap, &bttv_video_qops, btv->dev, &btv->s_lock, V4L2_BUF_TYPE_VIDEO_CAPTURE, @@ -2840,6 +2924,9 @@ free_btres(btv,fh,RESOURCE_VBI); } +#ifdef VIDIOC_G_PRIORITY + v4l2_prio_close(&btv->prio,&fh->prio); +#endif file->private_data = NULL; kfree(fh); @@ -2897,13 +2984,12 @@ { int minor = iminor(inode); struct bttv *btv = NULL; - u32 v = 400*16; unsigned int i; dprintk("bttv: open minor=%d\n",minor); for (i = 0; i < bttv_num; i++) { - if (bttvs[i].radio_dev.minor == minor) { + if (bttvs[i].radio_dev->minor == minor) { btv = &bttvs[i]; break; } @@ -2921,7 +3007,6 @@ file->private_data = btv; i2c_vidiocschan(btv); - bttv_call_i2c_clients(btv,VIDIOCSFREQ,&v); bttv_call_i2c_clients(btv,AUDC_SET_RADIO,&btv->tuner_type); audio_mux(btv,AUDIO_RADIO); @@ -2948,7 +3033,7 @@ struct video_capability *cap = arg; memset(cap,0,sizeof(*cap)); - strcpy(cap->name,btv->radio_dev.name); + strcpy(cap->name,btv->radio_dev->name); cap->type = VID_TYPE_TUNER; cap->channels = 1; cap->audios = 1; @@ -3131,7 +3216,7 @@ } if (wakeup->top == wakeup->bottom) { if (NULL != wakeup->top && curr->top != wakeup->top) { - if (irq_debug) + if (irq_debug > 1) printk("bttv%d: wakeup: both=%p\n",btv->nr,wakeup->top); wakeup->top->vb.ts = ts; wakeup->top->vb.field_count = btv->field_count; @@ -3140,7 +3225,7 @@ } } else { if (NULL != wakeup->top && curr->top != wakeup->top) { - if (irq_debug) + if (irq_debug > 1) printk("bttv%d: wakeup: top=%p\n",btv->nr,wakeup->top); wakeup->top->vb.ts = ts; wakeup->top->vb.field_count = btv->field_count; @@ -3148,7 +3233,7 @@ wake_up(&wakeup->top->vb.done); } if (NULL != wakeup->bottom && curr->bottom != wakeup->bottom) { - if (irq_debug) + if (irq_debug > 1) printk("bttv%d: wakeup: bottom=%p\n",btv->nr,wakeup->bottom); wakeup->bottom->vb.ts = ts; wakeup->bottom->vb.field_count = btv->field_count; @@ -3247,6 +3332,12 @@ bttv_buffer_set_activate(btv, &new); bttv_set_dma(btv, 0, new.irqflags); + /* switch input */ + if (UNSET != btv->new_input) { + video_mux(btv,btv->new_input); + btv->new_input = UNSET; + } + /* wake up finished buffers */ bttv_irq_wakeup_set(btv, &old, &new, STATE_DONE); spin_unlock(&btv->s_lock); @@ -3274,7 +3365,7 @@ /* get device status bits */ dstat=btread(BT848_DSTATUS); - if (0 /*irq_debug*/) { + if (irq_debug) { printk(KERN_DEBUG "bttv%d: irq loop=%d fc=%d " "riscs=%x, riscc=%08x, ", btv->nr, count, btv->field_count, @@ -3295,8 +3386,13 @@ if (astat&BT848_INT_VSYNC) btv->field_count++; - if (astat & BT848_INT_GPINT) + if (astat & BT848_INT_GPINT) { +#ifdef CONFIG_VIDEO_IR + if (btv->remote) + bttv_input_irq(btv); +#endif wake_up(&btv->gpioq); + } if ((astat & BT848_INT_RISCI) && (stat & (2<<28))) bttv_irq_wakeup_top(btv); @@ -3325,10 +3421,12 @@ } count++; - if (count > 20) { + if (count > 4) { btwrite(0, BT848_INT_MASK); printk(KERN_ERR - "bttv%d: IRQ lockup, cleared int mask\n", btv->nr); + "bttv%d: IRQ lockup, cleared int mask [", btv->nr); + bttv_print_irqbits(stat,astat); + printk("]\n"); } } return IRQ_RETVAL(handled); @@ -3338,31 +3436,89 @@ /* ----------------------------------------------------------------------- */ /* initialitation */ +static struct video_device *vdev_init(struct bttv *btv, + struct video_device *template, + char *type) +{ + struct video_device *vfd; + + vfd = video_device_alloc(); + if (NULL == vfd) + return NULL; + *vfd = *template; + vfd->minor = -1; + vfd->dev = &btv->dev->dev; + vfd->release = video_device_release; + snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)", + btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "", + type, bttv_tvcards[btv->type].name); + return vfd; +} + +static void bttv_unregister_video(struct bttv *btv) +{ + if (btv->video_dev) { + if (-1 != btv->video_dev->minor) + video_unregister_device(btv->video_dev); + else + video_device_release(btv->video_dev); + btv->video_dev = NULL; + } + if (btv->vbi_dev) { + if (-1 != btv->vbi_dev->minor) + video_unregister_device(btv->vbi_dev); + else + video_device_release(btv->vbi_dev); + btv->vbi_dev = NULL; + } + if (btv->radio_dev) { + if (-1 != btv->radio_dev->minor) + video_unregister_device(btv->radio_dev); + else + video_device_release(btv->radio_dev); + btv->radio_dev = NULL; + } +} + /* register video4linux devices */ static int __devinit bttv_register_video(struct bttv *btv) { - if(video_register_device(&btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0) - return -1; + /* video */ + btv->video_dev = vdev_init(btv, &bttv_video_template, "video"); + if (NULL == btv->video_dev) + goto err; + if (video_register_device(btv->video_dev,VFL_TYPE_GRABBER,video_nr)<0) + goto err; printk(KERN_INFO "bttv%d: registered device video%d\n", - btv->nr,btv->video_dev.minor & 0x1f); + btv->nr,btv->video_dev->minor & 0x1f); + video_device_create_file(btv->video_dev, &class_device_attr_card); - if(video_register_device(&btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0) { - video_unregister_device(&btv->video_dev); - return -1; - } + /* vbi */ + btv->vbi_dev = vdev_init(btv, &bttv_vbi_template, "vbi"); + if (NULL == btv->vbi_dev) + goto err; + if (video_register_device(btv->vbi_dev,VFL_TYPE_VBI,vbi_nr)<0) + goto err; printk(KERN_INFO "bttv%d: registered device vbi%d\n", - btv->nr,btv->vbi_dev.minor & 0x1f); + btv->nr,btv->vbi_dev->minor & 0x1f); if (!btv->has_radio) return 0; - if (video_register_device(&btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0) { - video_unregister_device(&btv->vbi_dev); - video_unregister_device(&btv->video_dev); - return -1; - } + /* radio */ + btv->radio_dev = vdev_init(btv, &radio_template, "radio"); + if (NULL == btv->radio_dev) + goto err; + if (video_register_device(btv->radio_dev, VFL_TYPE_RADIO,radio_nr)<0) + goto err; printk(KERN_INFO "bttv%d: registered device radio%d\n", - btv->nr,btv->radio_dev.minor & 0x1f); - return 0; + btv->nr,btv->radio_dev->minor & 0x1f); + + /* all done */ + return 0; + + err: + bttv_unregister_video(btv); + return -1; } @@ -3401,6 +3557,9 @@ init_waitqueue_head(&btv->gpioq); INIT_LIST_HEAD(&btv->capture); INIT_LIST_HEAD(&btv->vcapture); +#ifdef VIDIOC_G_PRIORITY + v4l2_prio_init(&btv->prio); +#endif init_timer(&btv->timeout); btv->timeout.function = bttv_irq_timeout; @@ -3409,19 +3568,10 @@ btv->i2c_rc = -1; btv->tuner_type = UNSET; btv->pinnacle_id = UNSET; - - memcpy(&btv->video_dev, &bttv_video_template, sizeof(bttv_video_template)); - memcpy(&btv->radio_dev, &radio_template, sizeof(radio_template)); - memcpy(&btv->vbi_dev, &bttv_vbi_template, sizeof(bttv_vbi_template)); - btv->video_dev.minor = -1; - btv->video_dev.priv = btv; - btv->radio_dev.minor = -1; - btv->radio_dev.priv = btv; - btv->vbi_dev.minor = -1; - btv->vbi_dev.priv = btv; + btv->new_input = UNSET; btv->has_radio=radio[btv->nr]; - /* pci stuff (init, get irq/mmip, ... */ + /* pci stuff (init, get irq/mmio, ... */ btv->dev = dev; btv->id = dev->device; if (pci_enable_device(dev)) { @@ -3437,13 +3587,15 @@ if (!request_mem_region(pci_resource_start(dev,0), pci_resource_len(dev,0), btv->name)) { + printk(KERN_WARNING "bttv%d: can't request iomem (0x%lx).\n", + btv->nr, pci_resource_start(dev,0)); return -EBUSY; } pci_set_master(dev); pci_set_command(dev); pci_set_drvdata(dev,btv); if (!pci_dma_supported(dev,0xffffffff)) { - printk("bttv: Oops: no 32bit PCI DMA ???\n"); + printk("bttv%d: Oops: no 32bit PCI DMA ???\n", btv->nr); result = -EIO; goto fail1; } @@ -3454,13 +3606,14 @@ bttv_num,btv->id, btv->revision, pci_name(dev)); printk("irq: %d, latency: %d, mmio: 0x%lx\n", btv->dev->irq, lat, pci_resource_start(dev,0)); + schedule(); -#ifdef __sparc__ - /* why no ioremap for sparc? */ - btv->bt848_mmio=(unsigned char *)pci_resource_start(dev,0); -#else btv->bt848_mmio=ioremap(pci_resource_start(dev,0), 0x1000); -#endif + if (NULL == ioremap(pci_resource_start(dev,0), 0x1000)) { + printk("bttv%d: ioremap() failed\n", btv->nr); + result = -EIO; + goto fail1; + } /* identify card */ bttv_idcard(btv); @@ -3486,6 +3639,7 @@ btv->opt_automute = automute; btv->opt_chroma_agc = chroma_agc; btv->opt_adc_crush = adc_crush; + btv->opt_vcr_hack = vcr_hack; /* fill struct bttv with some useful defaults */ btv->init.btv = btv; @@ -3502,7 +3656,8 @@ bttv_gpio_tracking(btv,"pre-init"); bttv_risc_init_main(btv); - init_bt848(btv); + if (!bttv_tvcards[btv->type].no_video) + init_bt848(btv); /* gpio */ btwrite(0x00, BT848_GPIO_REG_INP); @@ -3510,16 +3665,6 @@ if (bttv_gpio) bttv_gpio_tracking(btv,"init"); - /* interrupt */ - btwrite(0xfffffUL, BT848_INT_STAT); - btwrite((btv->triton1) | - (gpint ? BT848_INT_GPINT : 0) | - BT848_INT_SCERR| - (fdsr ? BT848_INT_FDSR : 0) | - BT848_INT_RISCI|BT848_INT_OCERR|BT848_INT_VPRES| - BT848_INT_FMTCHG|BT848_INT_HLOCK, - BT848_INT_MASK); - /* needs to be done before i2c is registered */ bttv_init_card1(btv); @@ -3529,15 +3674,20 @@ /* some card-specific stuff (needs working i2c) */ bttv_init_card2(btv); - /* register video4linux */ - bttv_register_video(btv); + /* register video4linux + input */ + if (!bttv_tvcards[btv->type].no_video) { + bttv_register_video(btv); +#ifdef CONFIG_VIDEO_IR + bttv_input_init(btv); +#endif - bt848_bright(btv,32768); - bt848_contrast(btv,32768); - bt848_hue(btv,32768); - bt848_sat(btv,32768); - audio_mux(btv,AUDIO_MUTE); - set_input(btv,0); + bt848_bright(btv,32768); + bt848_contrast(btv,32768); + bt848_hue(btv,32768); + bt848_sat(btv,32768); + audio_mux(btv,AUDIO_MUTE); + set_input(btv,0); + } /* everything is fine */ bttv_num++; @@ -3547,6 +3697,8 @@ free_irq(btv->dev->irq,btv); fail1: + if (btv->bt848_mmio) + iounmap(btv->bt848_mmio); release_mem_region(pci_resource_start(btv->dev,0), pci_resource_len(btv->dev,0)); pci_set_drvdata(dev,NULL); @@ -3572,23 +3724,21 @@ btv->shutdown=1; wake_up(&btv->gpioq); - /* unregister i2c_bus */ - if (0 == btv->i2c_rc) - i2c_bit_del_bus(&btv->i2c_adap); + /* unregister i2c_bus + input */ + fini_bttv_i2c(btv); +#ifdef CONFIG_VIDEO_IR + bttv_input_fini(btv); +#endif /* unregister video4linux */ - if (btv->video_dev.minor!=-1) - video_unregister_device(&btv->video_dev); - if (btv->radio_dev.minor!=-1) - video_unregister_device(&btv->radio_dev); - if (btv->vbi_dev.minor!=-1) - video_unregister_device(&btv->vbi_dev); + bttv_unregister_video(btv); /* free allocated memory */ btcx_riscmem_free(btv->dev,&btv->main); /* free ressources */ free_irq(btv->dev->irq,btv); + iounmap(btv->bt848_mmio); release_mem_region(pci_resource_start(btv->dev,0), pci_resource_len(btv->dev,0)); diff -Nru a/drivers/media/video/bttv-if.c b/drivers/media/video/bttv-if.c --- a/drivers/media/video/bttv-if.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/bttv-if.c Wed Oct 8 12:24:55 2003 @@ -27,15 +27,23 @@ #include #include +#include #include #include "bttvp.h" -static struct i2c_algo_bit_data bttv_i2c_algo_template; -static struct i2c_adapter bttv_i2c_adap_template; +static struct i2c_algo_bit_data bttv_i2c_algo_bit_template; +static struct i2c_adapter bttv_i2c_adap_sw_template; +static struct i2c_adapter bttv_i2c_adap_hw_template; static struct i2c_client bttv_i2c_client_template; +#ifndef I2C_PEC +static void bttv_inc_use(struct i2c_adapter *adap); +static void bttv_dec_use(struct i2c_adapter *adap); +#endif +static int attach_inform(struct i2c_client *client); + EXPORT_SYMBOL(bttv_get_cardinfo); EXPORT_SYMBOL(bttv_get_pcidev); EXPORT_SYMBOL(bttv_get_id); @@ -45,6 +53,11 @@ EXPORT_SYMBOL(bttv_get_gpio_queue); EXPORT_SYMBOL(bttv_i2c_call); +static int i2c_debug = 0; +static int i2c_hw = 0; +MODULE_PARM(i2c_debug,"i"); +MODULE_PARM(i2c_hw,"i"); + /* ----------------------------------------------------------------------- */ /* Exported functions - for other modules which want to access the */ /* gpio ports (IR for example) */ @@ -76,6 +89,7 @@ return bttvs[card].type; } + int bttv_gpio_enable(unsigned int card, unsigned long mask, unsigned long data) { struct bttv *btv; @@ -146,7 +160,7 @@ /* ----------------------------------------------------------------------- */ -/* I2C functions */ +/* I2C functions - bitbanging adapter (software i2c) */ void bttv_bit_setscl(void *data, int state) { @@ -190,6 +204,222 @@ return state; } +static struct i2c_algo_bit_data bttv_i2c_algo_bit_template = { + .setsda = bttv_bit_setsda, + .setscl = bttv_bit_setscl, + .getsda = bttv_bit_getsda, + .getscl = bttv_bit_getscl, + .udelay = 16, + .mdelay = 10, + .timeout = 200, +}; + +static struct i2c_adapter bttv_i2c_adap_sw_template = { +#ifdef I2C_PEC + .owner = THIS_MODULE, +#else + .inc_use = bttv_inc_use, + .dec_use = bttv_dec_use, +#endif +#ifdef I2C_ADAP_CLASS_TV_ANALOG + .class = I2C_ADAP_CLASS_TV_ANALOG, +#endif + I2C_DEVNAME("bt848"), + .id = I2C_HW_B_BT848, + .client_register = attach_inform, +}; + +/* ----------------------------------------------------------------------- */ +/* I2C functions - hardware i2c */ + +static int algo_control(struct i2c_adapter *adapter, + unsigned int cmd, unsigned long arg) +{ + return 0; +} + +static u32 functionality(struct i2c_adapter *adap) +{ + return I2C_FUNC_SMBUS_EMUL; +} + +static int +bttv_i2c_wait_done(struct bttv *btv) +{ + u32 stat; + int timeout; + + timeout = jiffies + HZ/100 + 1; /* 10ms */ + for (;;) { + stat = btread(BT848_INT_STAT); + if (stat & BT848_INT_I2CDONE) + break; + if (time_after(jiffies,timeout)) + return -EIO; + udelay(10); + } + btwrite(BT848_INT_I2CDONE|BT848_INT_RACK, BT848_INT_STAT); + return ((stat & BT848_INT_RACK) ? 1 : 0); +} + +#define I2C_HW (BT878_I2C_MODE | BT848_I2C_SYNC |\ + BT848_I2C_SCL | BT848_I2C_SDA) + +static int +bttv_i2c_sendbytes(struct bttv *btv, const struct i2c_msg *msg, int last) +{ + u32 xmit; + int retval,cnt; + + /* start, address + first byte */ + xmit = (msg->addr << 25) | (msg->buf[0] << 16) | I2C_HW; + if (msg->len > 1 || !last) + xmit |= BT878_I2C_NOSTOP; + btwrite(xmit, BT848_I2C); + retval = bttv_i2c_wait_done(btv); + if (retval < 0) + goto err; + if (retval == 0) + goto eio; + if (i2c_debug) { + printk(" addr << 1, msg->buf[0]); + if (!(xmit & BT878_I2C_NOSTOP)) + printk(" >\n"); + } + + for (cnt = 1; cnt < msg->len; cnt++ ) { + /* following bytes */ + xmit = (msg->buf[cnt] << 24) | I2C_HW | BT878_I2C_NOSTART; + if (cnt < msg->len-1 || !last) + xmit |= BT878_I2C_NOSTOP; + btwrite(xmit, BT848_I2C); + retval = bttv_i2c_wait_done(btv); + if (retval < 0) + goto err; + if (retval == 0) + goto eio; + if (i2c_debug) { + printk(" %02x", msg->buf[cnt]); + if (!(xmit & BT878_I2C_NOSTOP)) + printk(" >\n"); + } + } + return msg->len; + + eio: + retval = -EIO; + err: + if (i2c_debug) + printk(" ERR: %d\n",retval); + return retval; +} + +static int +bttv_i2c_readbytes(struct bttv *btv, const struct i2c_msg *msg, int last) +{ + u32 xmit; + u32 cnt; + int retval; + + for(cnt = 0; cnt < msg->len; cnt++) { + xmit = (msg->addr << 25) | (1 << 24) | I2C_HW; + if (cnt < msg->len-1) + xmit |= BT848_I2C_W3B; + if (cnt < msg->len-1 || !last) + xmit |= BT878_I2C_NOSTOP; + if (cnt) + xmit |= BT878_I2C_NOSTART; + btwrite(xmit, BT848_I2C); + retval = bttv_i2c_wait_done(btv); + if (retval < 0) + goto err; + if (retval == 0) + goto eio; + msg->buf[cnt] = ((u32)btread(BT848_I2C) >> 8) & 0xff; + if (i2c_debug) { + if (!(xmit & BT878_I2C_NOSTART)) + printk(" addr << 1) +1); + printk(" =%02x", msg->buf[cnt]); + if (!(xmit & BT878_I2C_NOSTOP)) + printk(" >\n"); + } + } + return msg->len; + + eio: + retval = -EIO; + err: + if (i2c_debug) + printk(" ERR: %d\n",retval); + return retval; +} + +int bttv_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) +{ + struct bttv *btv = i2c_get_adapdata(i2c_adap); + int retval = 0; + int i; + + if (i2c_debug) + printk("bt-i2c:"); + btwrite(BT848_INT_I2CDONE|BT848_INT_RACK, BT848_INT_STAT); + for (i = 0 ; i < num; i++) { + if (msgs[i].flags & I2C_M_RD) { + /* read */ + retval = bttv_i2c_readbytes(btv, &msgs[i], i+1 == num); + if (retval < 0) + goto err; + } else { + /* write */ + retval = bttv_i2c_sendbytes(btv, &msgs[i], i+1 == num); + if (retval < 0) + goto err; + } + } + return num; + + err: + return retval; +} + +static struct i2c_algorithm bttv_algo = { + .name = "bt878", + .id = I2C_ALGO_BIT | I2C_HW_B_BT848 /* FIXME */, + .master_xfer = bttv_i2c_xfer, + .algo_control = algo_control, + .functionality = functionality, +}; + +static struct i2c_adapter bttv_i2c_adap_hw_template = { +#ifdef I2C_PEC + .owner = THIS_MODULE, +#else + .inc_use = bttv_inc_use, + .dec_use = bttv_dec_use, +#endif +#ifdef I2C_ADAP_CLASS_TV_ANALOG + .class = I2C_ADAP_CLASS_TV_ANALOG, +#endif + I2C_DEVNAME("bt878"), + .id = I2C_ALGO_BIT | I2C_HW_B_BT848 /* FIXME */, + .algo = &bttv_algo, + .client_register = attach_inform, +}; + +/* ----------------------------------------------------------------------- */ +/* I2C functions - common stuff */ + +#ifndef I2C_PEC +static void bttv_inc_use(struct i2c_adapter *adap) +{ + MOD_INC_USE_COUNT; +} + +static void bttv_dec_use(struct i2c_adapter *adap) +{ + MOD_DEC_USE_COUNT; +} +#endif static int attach_inform(struct i2c_client *client) { @@ -221,24 +451,6 @@ bttv_call_i2c_clients(&bttvs[card], cmd, arg); } -static struct i2c_algo_bit_data bttv_i2c_algo_template = { - .setsda = bttv_bit_setsda, - .setscl = bttv_bit_setscl, - .getsda = bttv_bit_getsda, - .getscl = bttv_bit_getscl, - .udelay = 16, - .mdelay = 10, - .timeout = 200, -}; - -static struct i2c_adapter bttv_i2c_adap_template = { - .owner = THIS_MODULE, - .class = I2C_ADAP_CLASS_TV_ANALOG, - I2C_DEVNAME("bt848"), - .id = I2C_HW_B_BT848, - .client_register = attach_inform, -}; - static struct i2c_client bttv_i2c_client_template = { I2C_DEVNAME("bttv internal"), .id = -1, @@ -308,26 +520,54 @@ /* init + register i2c algo-bit adapter */ int __devinit init_bttv_i2c(struct bttv *btv) { - memcpy(&btv->i2c_adap, &bttv_i2c_adap_template, - sizeof(struct i2c_adapter)); - memcpy(&btv->i2c_algo, &bttv_i2c_algo_template, - sizeof(struct i2c_algo_bit_data)); + int use_hw = (btv->id == 878) && i2c_hw; + memcpy(&btv->i2c_client, &bttv_i2c_client_template, - sizeof(struct i2c_client)); + sizeof(bttv_i2c_client_template)); + + if (use_hw) { + /* bt878 */ + memcpy(&btv->i2c_adap, &bttv_i2c_adap_hw_template, + sizeof(bttv_i2c_adap_hw_template)); + } else { + /* bt848 */ + memcpy(&btv->i2c_adap, &bttv_i2c_adap_sw_template, + sizeof(bttv_i2c_adap_sw_template)); + memcpy(&btv->i2c_algo, &bttv_i2c_algo_bit_template, + sizeof(bttv_i2c_algo_bit_template)); + btv->i2c_algo.data = btv; + btv->i2c_adap.algo_data = &btv->i2c_algo; + } - sprintf(btv->i2c_adap.name, "bt848 #%d", btv->nr); btv->i2c_adap.dev.parent = &btv->dev->dev; + snprintf(btv->i2c_adap.name, sizeof(btv->i2c_adap.name), + "bt%d #%d [%s]", btv->id, btv->nr, use_hw ? "hw" : "sw"); - btv->i2c_algo.data = btv; i2c_set_adapdata(&btv->i2c_adap, btv); - btv->i2c_adap.algo_data = &btv->i2c_algo; btv->i2c_client.adapter = &btv->i2c_adap; - bttv_bit_setscl(btv,1); - bttv_bit_setsda(btv,1); - - btv->i2c_rc = i2c_bit_add_bus(&btv->i2c_adap); + if (use_hw) { + btv->i2c_rc = i2c_add_adapter(&btv->i2c_adap); + } else { + bttv_bit_setscl(btv,1); + bttv_bit_setsda(btv,1); + btv->i2c_rc = i2c_bit_add_bus(&btv->i2c_adap); + } return btv->i2c_rc; +} + +int __devexit fini_bttv_i2c(struct bttv *btv) +{ + int use_hw = (btv->id == 878) && i2c_hw; + + if (0 != btv->i2c_rc) + return 0; + + if (use_hw) { + return i2c_del_adapter(&btv->i2c_adap); + } else { + return i2c_bit_del_bus(&btv->i2c_adap); + } } /* diff -Nru a/drivers/media/video/bttv-risc.c b/drivers/media/video/bttv-risc.c --- a/drivers/media/video/bttv-risc.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/bttv-risc.c Wed Oct 8 12:24:56 2003 @@ -33,6 +33,8 @@ #include "bttvp.h" +#define VCR_HACK_LINES 4 + /* ---------------------------------------------------------- */ /* risc code generators */ @@ -62,6 +64,9 @@ /* scan lines */ sg = sglist; for (line = 0; line < lines; line++) { + if ((btv->opt_vcr_hack) && + (line >= (lines - VCR_HACK_LINES))) + continue; while (offset >= sg_dma_len(sg)) { offset -= sg_dma_len(sg); sg++; @@ -136,6 +141,9 @@ usg = sglist; vsg = sglist; for (line = 0; line < ylines; line++) { + if ((btv->opt_vcr_hack) && + (line >= (ylines - VCR_HACK_LINES))) + continue; switch (vshift) { case 0: chroma = 1; break; case 1: chroma = !(line & 1); break; @@ -219,8 +227,10 @@ instructions = (ov->nclips + 1) * ((skip_even || skip_odd) ? ov->w.height>>1 : ov->w.height); instructions += 2; - if ((rc = btcx_riscmem_alloc(btv->dev,risc,instructions*8)) < 0) + if ((rc = btcx_riscmem_alloc(btv->dev,risc,instructions*8)) < 0) { + kfree(skips); return rc; + } /* sync instruction */ rp = risc->cpu; @@ -228,12 +238,18 @@ *(rp++) = cpu_to_le32(0); addr = (unsigned long)btv->fbuf.base; - addr += btv->fbuf.bytesperline * ov->w.top; - addr += ((btv->fbuf.depth+7) >> 3) * ov->w.left; + addr += btv->fbuf.fmt.bytesperline * ov->w.top; + addr += (fmt->depth >> 3) * ov->w.left; /* scan lines */ for (maxy = -1, line = 0; line < ov->w.height; - line++, addr += btv->fbuf.bytesperline) { + line++, addr += btv->fbuf.fmt.bytesperline) { + if ((btv->opt_vcr_hack) && + (line >= (ov->w.height - VCR_HACK_LINES))) + continue; + if ((line%2) == 0 && skip_even) + continue; + if ((line%2) == 1 && skip_odd) if ((line%2) == 0 && skip_even) continue; if ((line%2) == 1 && skip_odd) diff -Nru a/drivers/media/video/bttv-vbi.c b/drivers/media/video/bttv-vbi.c --- a/drivers/media/video/bttv-vbi.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/bttv-vbi.c Wed Oct 8 12:24:57 2003 @@ -87,7 +87,7 @@ return -EINVAL; if (STATE_NEEDS_INIT == buf->vb.state) { - if (0 != (rc = videobuf_iolock(btv->dev,&buf->vb))) + if (0 != (rc = videobuf_iolock(btv->dev, &buf->vb, NULL))) goto fail; if (0 != (rc = vbi_buffer_risc(btv,buf,fh->lines))) goto fail; diff -Nru a/drivers/media/video/bttv.h b/drivers/media/video/bttv.h --- a/drivers/media/video/bttv.h Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/bttv.h Wed Oct 8 12:24:55 2003 @@ -115,6 +115,8 @@ #define BTTV_XGUARD 0x67 #define BTTV_NEBULA_DIGITV 0x68 #define BTTV_PV143 0x69 +#define BTTV_IVC100 0x6e +#define BTTV_IVC120 0x6f /* i2c address list */ #define I2C_TSA5522 0xc2 @@ -169,6 +171,9 @@ unsigned int no_tda7432:1; unsigned int needs_tvaudio:1; unsigned int msp34xx_alt:1; + + /* flag: video pci function is unused */ + unsigned int no_video; /* other settings */ unsigned int pll; diff -Nru a/drivers/media/video/bttvp.h b/drivers/media/video/bttvp.h --- a/drivers/media/video/bttvp.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/bttvp.h Wed Oct 8 12:24:56 2003 @@ -24,8 +24,8 @@ #ifndef _BTTVP_H_ #define _BTTVP_H_ - -#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,11) +#include +#define BTTV_VERSION_CODE KERNEL_VERSION(0,9,12) #include #include @@ -33,9 +33,11 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -43,6 +45,9 @@ #include "bt848.h" #include "bttv.h" #include "btcx-risc.h" +#ifdef CONFIG_VIDEO_IR +#include "ir-common.h" +#endif #ifdef __KERNEL__ @@ -141,6 +146,9 @@ struct bttv_fh { struct bttv *btv; int resources; +#ifdef VIDIOC_G_PRIORITY + enum v4l2_priority prio; +#endif enum v4l2_buf_type type; /* video capture */ @@ -210,6 +218,12 @@ extern struct videobuf_queue_ops bttv_vbi_qops; +/* ---------------------------------------------------------- */ +/* bttv-input.c */ + +int bttv_input_init(struct bttv *btv); +void bttv_input_fini(struct bttv *btv); +void bttv_input_irq(struct bttv *btv); /* ---------------------------------------------------------- */ /* bttv-driver.c */ @@ -220,6 +234,7 @@ extern unsigned int bttv_gpio; extern void bttv_gpio_tracking(struct bttv *btv, char *comment); extern int init_bttv_i2c(struct bttv *btv); +extern int fini_bttv_i2c(struct bttv *btv); extern int pvr_boot(struct bttv *btv); extern int bttv_common_ioctls(struct bttv *btv, unsigned int cmd, void *arg); @@ -248,6 +263,18 @@ unsigned int pll_current; /* Currently programmed ofreq */ }; +#ifdef CONFIG_VIDEO_IR +/* for gpio-connected remote control */ +struct bttv_input { + struct input_dev dev; + struct ir_input_state ir; + char name[32]; + char phys[32]; + u32 mask_keycode; + u32 mask_keydown; +}; +#endif + struct bttv { /* pci device config */ struct pci_dev *dev; @@ -262,6 +289,7 @@ unsigned int type; /* card type (pointer into tvcards[]) */ unsigned int tuner_type; /* tuner chip type */ unsigned int pinnacle_id; + unsigned int svhs; struct bttv_pll_info pll; int triton1; @@ -277,22 +305,31 @@ int i2c_state, i2c_rc; /* video4linux (1) */ - struct video_device video_dev; - struct video_device radio_dev; - struct video_device vbi_dev; + struct video_device *video_dev; + struct video_device *radio_dev; + struct video_device *vbi_dev; + + /* infrared remote */ + int has_remote; +#ifdef CONFIG_VIDEO_IR + struct bttv_input *remote; +#endif /* locking */ spinlock_t s_lock; struct semaphore lock; int resources; struct semaphore reslock; - +#ifdef VIDIOC_G_PRIORITY + struct v4l2_prio_state prio; +#endif + /* video state */ unsigned int input; unsigned int audio; unsigned long freq; int tvnorm,hue,contrast,bright,saturation; - struct video_buffer fbuf; + struct v4l2_framebuffer fbuf; unsigned int field_count; /* various options */ @@ -301,6 +338,7 @@ int opt_automute; int opt_chroma_agc; int opt_adc_crush; + int opt_vcr_hack; /* radio data/state */ int has_radio; @@ -328,6 +366,7 @@ struct list_head capture; /* video capture queue */ struct list_head vcapture; /* vbi capture queue */ struct bttv_buffer_set curr; /* active buffers */ + int new_input; unsigned long cap_ctl; unsigned long dma_on; diff -Nru a/drivers/media/video/bw-qcam.c b/drivers/media/video/bw-qcam.c --- a/drivers/media/video/bw-qcam.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/bw-qcam.c Wed Oct 8 12:24:56 2003 @@ -72,7 +72,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/media/video/c-qcam.c b/drivers/media/video/c-qcam.c --- a/drivers/media/video/c-qcam.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/c-qcam.c Wed Oct 8 12:24:56 2003 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/media/video/cpia.c b/drivers/media/video/cpia.c --- a/drivers/media/video/cpia.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/cpia.c Wed Oct 8 12:24:57 2003 @@ -29,7 +29,6 @@ #include #include -#include #include #include #include diff -Nru a/drivers/media/video/cpia_pp.c b/drivers/media/video/cpia_pp.c --- a/drivers/media/video/cpia_pp.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/cpia_pp.c Wed Oct 8 12:24:55 2003 @@ -26,7 +26,6 @@ /* #define _CPIA_DEBUG_ 1 */ #include -#include #include #include diff -Nru a/drivers/media/video/hexium.h b/drivers/media/video/hexium.h --- a/drivers/media/video/hexium.h Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,51 +0,0 @@ -#ifndef __HEXIUM__ -#define __HEXIUM__ - -#define HEXIUM_HV_PCI6_ORION 1 -#define HEXIUM_ORION_1SVHS_3BNC 2 -#define HEXIUM_ORION_4BNC 3 -#define HEXIUM_GEMUINI 4 -#define HEXIUM_GEMUINI_DUAL 5 - -static struct saa7146_standard hexium_standards[] = { - { - .name = "PAL", .id = V4L2_STD_PAL, - .v_offset = 0x17, .v_field = 288, .v_calc = 576, - .h_offset = 0x14, .h_pixels = 680, .h_calc = 680+1, - .v_max_out = 576, .h_max_out = 768, - }, { - .name = "NTSC", .id = V4L2_STD_NTSC, - .v_offset = 0x17, .v_field = 240, .v_calc = 480, - .h_offset = 0x06, .h_pixels = 640, .h_calc = 641+1, - .v_max_out = 480, .h_max_out = 640, - }, { - .name = "SECAM", .id = V4L2_STD_SECAM, - .v_offset = 0x14, .v_field = 288, .v_calc = 576, - .h_offset = 0x14, .h_pixels = 720, .h_calc = 720+1, - .v_max_out = 576, .h_max_out = 768, - } -}; - - -#define HEXIUM_INPUTS 9 -static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = { - { 0, "CVBS 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 1, "CVBS 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 2, "CVBS 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 3, "CVBS 4", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 4, "CVBS 5", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 5, "CVBS 6", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 6, "Y/C 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 7, "Y/C 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, - { 8, "Y/C 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, -}; - -#define HEXIUM_AUDIOS 0 - -struct hexium_data -{ - s8 adr; - u8 byte; -}; - -#endif diff -Nru a/drivers/media/video/hexium_gemini.c b/drivers/media/video/hexium_gemini.c --- a/drivers/media/video/hexium_gemini.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/hexium_gemini.c Wed Oct 8 12:24:56 2003 @@ -32,7 +32,148 @@ /* global variables */ static int hexium_num = 0; -#include "hexium_gemini.h" +#define HEXIUM_GEMINI 4 +#define HEXIUM_GEMINI_DUAL 5 + +#define HEXIUM_INPUTS 9 +static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = { + { 0, "CVBS 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 1, "CVBS 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 2, "CVBS 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 3, "CVBS 4", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 4, "CVBS 5", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 5, "CVBS 6", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 6, "Y/C 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 7, "Y/C 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 8, "Y/C 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, +}; + +#define HEXIUM_AUDIOS 0 + +struct hexium_data +{ + s8 adr; + u8 byte; +}; + +static struct saa7146_extension_ioctls ioctls[] = { + { VIDIOC_G_INPUT, SAA7146_EXCLUSIVE }, + { VIDIOC_S_INPUT, SAA7146_EXCLUSIVE }, + { VIDIOC_QUERYCTRL, SAA7146_BEFORE }, + { VIDIOC_ENUMINPUT, SAA7146_EXCLUSIVE }, + { VIDIOC_S_STD, SAA7146_AFTER }, + { VIDIOC_G_CTRL, SAA7146_BEFORE }, + { VIDIOC_S_CTRL, SAA7146_BEFORE }, + { 0, 0 } +}; + +#define HEXIUM_CONTROLS 1 +static struct v4l2_queryctrl hexium_controls[] = { + { V4L2_CID_PRIVATE_BASE, V4L2_CTRL_TYPE_BOOLEAN, "B/W", 0, 1, 1, 0, 0 }, +}; + +#define HEXIUM_GEMINI_V_1_0 1 +#define HEXIUM_GEMINI_DUAL_V_1_0 2 + +struct hexium +{ + int type; + struct video_device video_dev; + struct i2c_adapter i2c_adapter; + + int cur_input; /* current input */ + v4l2_std_id cur_std; /* current standard */ + int cur_bw; /* current black/white status */ +}; + +/* Samsung KS0127B decoder default registers */ +static u8 hexium_ks0127b[0x100]={ +/*00*/ 0x00,0x52,0x30,0x40,0x01,0x0C,0x2A,0x10, +/*08*/ 0x00,0x00,0x00,0x60,0x00,0x00,0x0F,0x06, +/*10*/ 0x00,0x00,0xE4,0xC0,0x00,0x00,0x00,0x00, +/*18*/ 0x14,0x9B,0xFE,0xFF,0xFC,0xFF,0x03,0x22, +/*20*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*28*/ 0x00,0x00,0x00,0x00,0x00,0x2C,0x9B,0x00, +/*30*/ 0x00,0x00,0x10,0x80,0x80,0x10,0x80,0x80, +/*38*/ 0x01,0x04,0x00,0x00,0x00,0x29,0xC0,0x00, +/*40*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*48*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*50*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*58*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*60*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*68*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*70*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*78*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*80*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*88*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*90*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*98*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*A0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*A8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*B0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*B8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*C0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*C8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*D0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*D8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*E0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*E8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*F0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +/*F8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; + +static struct hexium_data hexium_pal[] = { + { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF } +}; + +static struct hexium_data hexium_pal_bw[] = { + { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF } +}; + +static struct hexium_data hexium_ntsc[] = { + { 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF } +}; + +static struct hexium_data hexium_ntsc_bw[] = { + { 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF } +}; + +static struct hexium_data hexium_secam[] = { + { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF } +}; + +static struct hexium_data hexium_input_select[] = { + { 0x02, 0x60 }, + { 0x02, 0x64 }, + { 0x02, 0x61 }, + { 0x02, 0x65 }, + { 0x02, 0x62 }, + { 0x02, 0x66 }, + { 0x02, 0x68 }, + { 0x02, 0x69 }, + { 0x02, 0x6A }, +}; + +/* fixme: h_offset = 0 for Hexium Gemini *Dual*, which + are currently *not* supported*/ +static struct saa7146_standard hexium_standards[] = { + { + .name = "PAL", .id = V4L2_STD_PAL, + .v_offset = 28, .v_field = 288, .v_calc = 576, + .h_offset = 1, .h_pixels = 680, .h_calc = 680+1, + .v_max_out = 576, .h_max_out = 768, + }, { + .name = "NTSC", .id = V4L2_STD_NTSC, + .v_offset = 28, .v_field = 240, .v_calc = 480, + .h_offset = 1, .h_pixels = 640, .h_calc = 641+1, + .v_max_out = 480, .h_max_out = 640, + }, { + .name = "SECAM", .id = V4L2_STD_SECAM, + .v_offset = 28, .v_field = 288, .v_calc = 576, + .h_offset = 1, .h_pixels = 720, .h_calc = 720+1, + .v_max_out = 576, .h_max_out = 768, + } +}; /* bring hardware to a sane state. this has to be done, just in case someone wants to capture from this device before it has been properly initialized. @@ -50,7 +191,7 @@ for (i = 0; i < sizeof(hexium_ks0127b); i++) { data.byte = hexium_ks0127b[i]; if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, i, I2C_SMBUS_BYTE_DATA, &data)) { - printk("failed for address 0x%02x\n", i); + printk("hexium_gemini: hexium_init_done() failed for address 0x%02x\n", i); } } @@ -81,7 +222,7 @@ while (vdec[i].adr != -1) { data.byte = vdec[i].byte; if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x6c, 0, I2C_SMBUS_WRITE, vdec[i].adr, I2C_SMBUS_BYTE_DATA, &data)) { - printk("failed for address 0x%02x\n", i); + printk("hexium_init_done: hexium_set_standard() failed for address 0x%02x\n", i); return -1; } i++; @@ -100,14 +241,13 @@ hexium = (struct hexium *) kmalloc(sizeof(struct hexium), GFP_KERNEL); if (NULL == hexium) { - printk("hexium_v4l2.o: hexium_probe: not enough kernel memory.\n"); + printk("hexium_gemini: not enough kernel memory in hexium_attach().\n"); return -ENOMEM; } memset(hexium, 0x0, sizeof(struct hexium)); (struct hexium *) dev->ext_priv = hexium; - /* FIXME: enable i2c-port pins, video-port-pins - video port pins should be enabled here ?! */ + /* enable i2c-port pins */ saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26)); saa7146_i2c_adapter_prepare(dev, &hexium->i2c_adapter, SAA7146_I2C_BUS_BIT_RATE_480); @@ -135,12 +275,12 @@ hexium->cur_input = 0; saa7146_vv_init(dev, &vv_data); - if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium", VFL_TYPE_GRABBER)) { - ERR(("cannot register capture v4l2 device. skipping.\n")); + if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium gemini", VFL_TYPE_GRABBER)) { + printk("hexium_gemini: cannot register capture v4l2 device. skipping.\n"); return -1; } - printk("hexium: found 'hexium frame grabber'-%d.\n", hexium_num); + printk("hexium_gemini: found 'hexium gemini' frame grabber-%d.\n", hexium_num); hexium_num++; return 0; @@ -302,7 +442,7 @@ } default: /* - DEB_D(("v4l2_ioctl does not handle this ioctl.\n")); + DEB_D(("hexium_ioctl() does not handle this ioctl.\n")); */ return -ENOIOCTLCMD; } diff -Nru a/drivers/media/video/hexium_gemini.h b/drivers/media/video/hexium_gemini.h --- a/drivers/media/video/hexium_gemini.h Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,103 +0,0 @@ -#ifndef __HEXIUM_GEMINI__ -#define __HEXIUM_GEMINI__ - -#include "hexium.h" - -static struct saa7146_extension_ioctls ioctls[] = { - { VIDIOC_G_INPUT, SAA7146_EXCLUSIVE }, - { VIDIOC_S_INPUT, SAA7146_EXCLUSIVE }, - { VIDIOC_QUERYCTRL, SAA7146_BEFORE }, - { VIDIOC_ENUMINPUT, SAA7146_EXCLUSIVE }, - { VIDIOC_S_STD, SAA7146_AFTER }, - { VIDIOC_G_CTRL, SAA7146_BEFORE }, - { VIDIOC_S_CTRL, SAA7146_BEFORE }, - { 0, 0 } -}; - -#define HEXIUM_CONTROLS 1 -static struct v4l2_queryctrl hexium_controls[] = { - { V4L2_CID_PRIVATE_BASE, V4L2_CTRL_TYPE_BOOLEAN, "B/W", 0, 1, 1, 0, 0 }, -}; - -#define HEXIUM_GEMUINI_V_1_0 1 -#define HEXIUM_GEMUINI_DUAL_V_1_0 2 - -struct hexium -{ - int type; - struct video_device video_dev; - struct i2c_adapter i2c_adapter; - - int cur_input; /* current input */ - v4l2_std_id cur_std; /* current standard */ - int cur_bw; /* current black/white status */ -}; - -/* Samsung KS0127B decoder default registers */ -static u8 hexium_ks0127b[0x100]={ -/*00*/ 0x00,0x52,0x30,0x40,0x01,0x0C,0x2A,0x10, -/*08*/ 0x00,0x00,0x00,0x60,0x00,0x00,0x0F,0x06, -/*10*/ 0x00,0x00,0xE4,0xC0,0x00,0x00,0x00,0x00, -/*18*/ 0x14,0x9B,0xFE,0xFF,0xFC,0xFF,0x03,0x22, -/*20*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*28*/ 0x00,0x00,0x00,0x00,0x00,0x2C,0x9B,0x00, -/*30*/ 0x00,0x00,0x10,0x80,0x80,0x10,0x80,0x80, -/*38*/ 0x01,0x04,0x00,0x00,0x00,0x29,0xC0,0x00, -/*40*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*48*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*50*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*58*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*60*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*68*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*70*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*78*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*80*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*88*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*90*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*98*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*A0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*A8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*B0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*B8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*C0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*C8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*D0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*D8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*E0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*E8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*F0*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -/*F8*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -}; - -static struct hexium_data hexium_pal[] = { - { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF } -}; - -static struct hexium_data hexium_pal_bw[] = { - { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF } -}; - -static struct hexium_data hexium_ntsc[] = { - { 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF } -}; - -static struct hexium_data hexium_ntsc_bw[] = { - { 0x01, 0x53 }, { 0x12, 0x04 }, { 0x2D, 0x23 }, { 0x2E, 0x81 }, { -1 , 0xFF } -}; - -static struct hexium_data hexium_secam[] = { - { 0x01, 0x52 }, { 0x12, 0x64 }, { 0x2D, 0x2C }, { 0x2E, 0x9B }, { -1 , 0xFF } -}; - -static struct hexium_data hexium_input_select[] = { - { 0x02, 0x60 }, - { 0x02, 0x64 }, - { 0x02, 0x61 }, - { 0x02, 0x65 }, - { 0x02, 0x62 }, - { 0x02, 0x66 }, - { 0x02, 0x68 }, - { 0x02, 0x69 }, - { 0x02, 0x6A }, -}; -#endif diff -Nru a/drivers/media/video/hexium_orion.c b/drivers/media/video/hexium_orion.c --- a/drivers/media/video/hexium_orion.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/hexium_orion.c Wed Oct 8 12:24:55 2003 @@ -30,9 +30,183 @@ MODULE_PARM_DESC(debug, "debug verbosity"); /* global variables */ -int hexium_num = 0; +static int hexium_num = 0; -#include "hexium_orion.h" +#define HEXIUM_HV_PCI6_ORION 1 +#define HEXIUM_ORION_1SVHS_3BNC 2 +#define HEXIUM_ORION_4BNC 3 + +#define HEXIUM_INPUTS 9 +static struct v4l2_input hexium_inputs[HEXIUM_INPUTS] = { + { 0, "CVBS 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 1, "CVBS 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 2, "CVBS 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 3, "CVBS 4", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 4, "CVBS 5", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 5, "CVBS 6", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 6, "Y/C 1", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 7, "Y/C 2", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, + { 8, "Y/C 3", V4L2_INPUT_TYPE_CAMERA, 2, 0, V4L2_STD_PAL_BG|V4L2_STD_NTSC_M, 0 }, +}; + +#define HEXIUM_AUDIOS 0 + +struct hexium_data +{ + s8 adr; + u8 byte; +}; + +static struct saa7146_extension_ioctls ioctls[] = { + { VIDIOC_G_INPUT, SAA7146_EXCLUSIVE }, + { VIDIOC_S_INPUT, SAA7146_EXCLUSIVE }, + { VIDIOC_ENUMINPUT, SAA7146_EXCLUSIVE }, + { VIDIOC_S_STD, SAA7146_AFTER }, + { 0, 0 } +}; + +struct hexium +{ + int type; + struct video_device video_dev; + struct i2c_adapter i2c_adapter; + int cur_input; /* current input */ +}; + +/* Philips SAA7110 decoder default registers */ +static u8 hexium_saa7110[53]={ +/*00*/ 0x4C,0x3C,0x0D,0xEF,0xBD,0xF0,0x00,0x00, +/*08*/ 0xF8,0xF8,0x60,0x60,0x40,0x86,0x18,0x90, +/*10*/ 0x00,0x2C,0x40,0x46,0x42,0x1A,0xFF,0xDA, +/*18*/ 0xF0,0x8B,0x00,0x00,0x00,0x00,0x00,0x00, +/*20*/ 0xD9,0x17,0x40,0x41,0x80,0x41,0x80,0x4F, +/*28*/ 0xFE,0x01,0x0F,0x0F,0x03,0x01,0x81,0x03, +/*30*/ 0x44,0x75,0x01,0x8C,0x03 +}; + +static struct { + struct hexium_data data[8]; +} hexium_input_select[] = { +{ + { /* cvbs 1 */ + { 0x06, 0x00 }, + { 0x20, 0xD9 }, + { 0x21, 0x17 }, // 0x16, + { 0x22, 0x40 }, + { 0x2C, 0x03 }, + { 0x30, 0x44 }, + { 0x31, 0x75 }, // ?? + { 0x21, 0x16 }, // 0x03, + } +}, { + { /* cvbs 2 */ + { 0x06, 0x00 }, + { 0x20, 0x78 }, + { 0x21, 0x07 }, // 0x03, + { 0x22, 0xD2 }, + { 0x2C, 0x83 }, + { 0x30, 0x60 }, + { 0x31, 0xB5 }, // ? + { 0x21, 0x03 }, + } +}, { + { /* cvbs 3 */ + { 0x06, 0x00 }, + { 0x20, 0xBA }, + { 0x21, 0x07 }, // 0x05, + { 0x22, 0x91 }, + { 0x2C, 0x03 }, + { 0x30, 0x60 }, + { 0x31, 0xB5 }, // ?? + { 0x21, 0x05 }, // 0x03, + } +}, { + { /* cvbs 4 */ + { 0x06, 0x00 }, + { 0x20, 0xD8 }, + { 0x21, 0x17 }, // 0x16, + { 0x22, 0x40 }, + { 0x2C, 0x03 }, + { 0x30, 0x44 }, + { 0x31, 0x75 }, // ?? + { 0x21, 0x16 }, // 0x03, + } +}, { + { /* cvbs 5 */ + { 0x06, 0x00 }, + { 0x20, 0xB8 }, + { 0x21, 0x07 }, // 0x05, + { 0x22, 0x91 }, + { 0x2C, 0x03 }, + { 0x30, 0x60 }, + { 0x31, 0xB5 }, // ?? + { 0x21, 0x05 }, // 0x03, + } +}, { + { /* cvbs 6 */ + { 0x06, 0x00 }, + { 0x20, 0x7C }, + { 0x21, 0x07 }, // 0x03 + { 0x22, 0xD2 }, + { 0x2C, 0x83 }, + { 0x30, 0x60 }, + { 0x31, 0xB5 }, // ?? + { 0x21, 0x03 }, + } +}, { + { /* y/c 1 */ + { 0x06, 0x80 }, + { 0x20, 0x59 }, + { 0x21, 0x17 }, + { 0x22, 0x42 }, + { 0x2C, 0xA3 }, + { 0x30, 0x44 }, + { 0x31, 0x75 }, + { 0x21, 0x12 }, + } +}, { + { /* y/c 2 */ + { 0x06, 0x80 }, + { 0x20, 0x9A }, + { 0x21, 0x17 }, + { 0x22, 0xB1 }, + { 0x2C, 0x13 }, + { 0x30, 0x60 }, + { 0x31, 0xB5 }, + { 0x21, 0x14 }, + } +}, { + { /* y/c 3 */ + { 0x06, 0x80 }, + { 0x20, 0x3C }, + { 0x21, 0x27 }, + { 0x22, 0xC1 }, + { 0x2C, 0x23 }, + { 0x30, 0x44 }, + { 0x31, 0x75 }, + { 0x21, 0x21 }, + } +} +}; + +static struct saa7146_standard hexium_standards[] = { + { + .name = "PAL", .id = V4L2_STD_PAL, + .v_offset = 16, .v_field = 288, .v_calc = 576, + .h_offset = 1, .h_pixels = 680, .h_calc = 680+1, + .v_max_out = 576, .h_max_out = 768, + }, { + .name = "NTSC", .id = V4L2_STD_NTSC, + .v_offset = 16, .v_field = 240, .v_calc = 480, + .h_offset = 1, .h_pixels = 640, .h_calc = 641+1, + .v_max_out = 480, .h_max_out = 640, + }, { + .name = "SECAM", .id = V4L2_STD_SECAM, + .v_offset = 16, .v_field = 288, .v_calc = 576, + .h_offset = 1, .h_pixels = 720, .h_calc = 720+1, + .v_max_out = 576, .h_max_out = 768, + } +}; /* this is only called for old HV-PCI6/Orion cards without eeprom */ @@ -51,16 +225,15 @@ hexium = (struct hexium *) kmalloc(sizeof(struct hexium), GFP_KERNEL); if (NULL == hexium) { - printk("hexium_orion.o: hexium_probe: not enough kernel memory.\n"); + printk("hexium_orion: hexium_probe: not enough kernel memory.\n"); return -ENOMEM; } memset(hexium, 0x0, sizeof(struct hexium)); - /* FIXME: enable i2c-port pins, video-port-pins - video port pins should be enabled here ?! */ + /* enable i2c-port pins */ saa7146_write(dev, MC1, (MASK_08 | MASK_24 | MASK_10 | MASK_26)); - saa7146_write(dev, DD1_INIT, 0x02000200); + saa7146_write(dev, DD1_INIT, 0x01000100); saa7146_write(dev, DD1_STREAM_B, 0x00000000); saa7146_write(dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26)); @@ -80,7 +253,7 @@ /* detect newer Hexium Orion cards by subsystem ids */ if (0x17c8 == dev->pci->subsystem_vendor && 0x0101 == dev->pci->subsystem_device) { - printk("hexium_orion.o: device is a Hexium Orion w/ 1 SVHS + 3 BNC inputs.\n"); + printk("hexium_orion: device is a Hexium Orion w/ 1 SVHS + 3 BNC inputs.\n"); /* we store the pointer in our private data field */ (struct hexium *) dev->ext_priv = hexium; hexium->type = HEXIUM_ORION_1SVHS_3BNC; @@ -88,7 +261,7 @@ } if (0x17c8 == dev->pci->subsystem_vendor && 0x2101 == dev->pci->subsystem_device) { - printk("hexium_orion.o: device is a Hexium Orion w/ 4 BNC inputs.\n"); + printk("hexium_orion: device is a Hexium Orion w/ 4 BNC inputs.\n"); /* we store the pointer in our private data field */ (struct hexium *) dev->ext_priv = hexium; hexium->type = HEXIUM_ORION_4BNC; @@ -98,7 +271,7 @@ /* check if this is an old hexium Orion card by looking at a saa7110 at address 0x4e */ if (0 == (err = i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_READ, 0x00, I2C_SMBUS_BYTE_DATA, &data))) { - printk("hexium_orion.o: device is a Hexium HV-PCI6/Orion (old).\n"); + printk("hexium_orion: device is a Hexium HV-PCI6/Orion (old).\n"); /* we store the pointer in our private data field */ (struct hexium *) dev->ext_priv = hexium; hexium->type = HEXIUM_HV_PCI6_ORION; @@ -133,6 +306,25 @@ return 0; } +static int hexium_set_input(struct hexium *hexium, int input) +{ + union i2c_smbus_data data; + int i = 0; + + DEB_D((".\n")); + + for (i = 0; i < 8; i++) { + int adr = hexium_input_select[input].data[i].adr; + data.byte = hexium_input_select[input].data[i].byte; + if (0 != i2c_smbus_xfer(&hexium->i2c_adapter, 0x4e, 0, I2C_SMBUS_WRITE, adr, I2C_SMBUS_BYTE_DATA, &data)) { + return -1; + } + printk("%d: 0x%02x => 0x%02x\n",input, adr,data.byte); + } + + return 0; +} + static struct saa7146_ext_vv vv_data; /* this function only gets called when the probing was successful */ @@ -143,12 +335,12 @@ DEB_EE((".\n")); saa7146_vv_init(dev, &vv_data); - if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium", VFL_TYPE_GRABBER)) { - ERR(("cannot register capture v4l2 device. skipping.\n")); + if (0 != saa7146_register_device(&hexium->video_dev, dev, "hexium orion", VFL_TYPE_GRABBER)) { + printk("hexium_orion: cannot register capture v4l2 device. skipping.\n"); return -1; } - printk("hexium_orion.o: found 'hexium orion' frame grabber-%d.\n", hexium_num); + printk("hexium_orion: found 'hexium orion' frame grabber-%d.\n", hexium_num); hexium_num++; /* the rest */ @@ -213,16 +405,13 @@ } hexium->cur_input = input; - - /* fixme: switch input here, switch audio, too! */ -// saa7146_set_hps_source_and_sync(dev, input_port_selection[input].hps_source, input_port_selection[input].hps_sync); - printk("hexium_orion.o: VIDIOC_S_INPUT: fixme switch input.\n"); + hexium_set_input(hexium, input); return 0; } default: /* - DEB_D(("v4l2_ioctl does not handle this ioctl.\n")); + DEB_D(("hexium_ioctl() does not handle this ioctl.\n")); */ return -ENOIOCTLCMD; } diff -Nru a/drivers/media/video/hexium_orion.h b/drivers/media/video/hexium_orion.h --- a/drivers/media/video/hexium_orion.h Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,138 +0,0 @@ -#ifndef __HEXIUM_ORION__ -#define __HEXIUM_ORION__ - -#include "hexium.h" - -static struct saa7146_extension_ioctls ioctls[] = { - { VIDIOC_G_INPUT, SAA7146_EXCLUSIVE }, - { VIDIOC_S_INPUT, SAA7146_EXCLUSIVE }, - { VIDIOC_ENUMINPUT, SAA7146_EXCLUSIVE }, - { VIDIOC_S_STD, SAA7146_AFTER }, - { 0, 0 } -}; - -struct hexium -{ - int type; - struct video_device video_dev; - struct i2c_adapter i2c_adapter; - int cur_input; /* current input */ -}; - -/* Philips SAA7110 decoder default registers */ -static u8 hexium_saa7110[53]={ -/*00*/ 0x4C,0x3C,0x0D,0xEF,0xBD,0xF0,0x00,0x00, -/*08*/ 0xF8,0xF8,0x60,0x60,0x40,0x86,0x18,0x90, -/*10*/ 0x00,0x2C,0x40,0x46,0x42,0x1A,0xFF,0xDA, -/*18*/ 0xF0,0x8B,0x00,0x00,0x00,0x00,0x00,0x00, -/*20*/ 0xD9,0x17,0x40,0x41,0x80,0x41,0x80,0x4F, -/*28*/ 0xFE,0x01,0x0F,0x0F,0x03,0x01,0x81,0x03, -/*30*/ 0x44,0x75,0x01,0x8C,0x03 -}; - -static struct { - struct hexium_data data[8]; -} hexium_input_select[] = { -{ - { /* input 0 */ - { 0x06, 0x00 }, - { 0x20, 0xD9 }, - { 0x21, 0x17 }, // 0x16, - { 0x22, 0x40 }, - { 0x2C, 0x03 }, - { 0x30, 0x44 }, - { 0x31, 0x75 }, // ?? - { 0x21, 0x16 }, // 0x03, - } -}, { - { /* input 1 */ - { 0x06, 0x00 }, - { 0x20, 0xD8 }, - { 0x21, 0x17 }, // 0x16, - { 0x22, 0x40 }, - { 0x2C, 0x03 }, - { 0x30, 0x44 }, - { 0x31, 0x75 }, // ?? - { 0x21, 0x16 }, // 0x03, - } -}, { - { /* input 2 */ - { 0x06, 0x00 }, - { 0x20, 0xBA }, - { 0x21, 0x07 }, // 0x05, - { 0x22, 0x91 }, - { 0x2C, 0x03 }, - { 0x30, 0x60 }, - { 0x31, 0xB5 }, // ?? - { 0x21, 0x05 }, // 0x03, - } -}, { - { /* input 3 */ - { 0x06, 0x00 }, - { 0x20, 0xB8 }, - { 0x21, 0x07 }, // 0x05, - { 0x22, 0x91 }, - { 0x2C, 0x03 }, - { 0x30, 0x60 }, - { 0x31, 0xB5 }, // ?? - { 0x21, 0x05 }, // 0x03, - } -}, { - { /* input 4 */ - { 0x06, 0x00 }, - { 0x20, 0x7C }, - { 0x21, 0x07 }, // 0x03 - { 0x22, 0xD2 }, - { 0x2C, 0x83 }, - { 0x30, 0x60 }, - { 0x31, 0xB5 }, // ?? - { 0x21, 0x03 }, - } -}, { - { /* input 5 */ - { 0x06, 0x00 }, - { 0x20, 0x78 }, - { 0x21, 0x07 }, // 0x03, - { 0x22, 0xD2 }, - { 0x2C, 0x83 }, - { 0x30, 0x60 }, - { 0x31, 0xB5 }, // ? - { 0x21, 0x03 }, - } -}, { - { /* input 6 */ - { 0x06, 0x80 }, - { 0x20, 0x59 }, - { 0x21, 0x17 }, - { 0x22, 0x42 }, - { 0x2C, 0xA3 }, - { 0x30, 0x44 }, - { 0x31, 0x75 }, - { 0x21, 0x12 }, - } -}, { - { /* input 7 */ - { 0x06, 0x80 }, - { 0x20, 0x9A }, - { 0x21, 0x17 }, - { 0x22, 0xB1 }, - { 0x2C, 0x13 }, - { 0x30, 0x60 }, - { 0x31, 0xB5 }, - { 0x21, 0x14 }, - } -}, { - { /* input 8 */ - { 0x06, 0x80 }, - { 0x20, 0x3C }, - { 0x21, 0x27 }, - { 0x22, 0xC1 }, - { 0x2C, 0x23 }, - { 0x30, 0x44 }, - { 0x31, 0x75 }, - { 0x21, 0x21 }, - } -} -}; - -#endif diff -Nru a/drivers/media/video/meye.h b/drivers/media/video/meye.h --- a/drivers/media/video/meye.h Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/meye.h Wed Oct 8 12:24:56 2003 @@ -36,8 +36,6 @@ #include #include #include -#include -#include /****************************************************************************/ /* Motion JPEG chip registers */ diff -Nru a/drivers/media/video/planb.c b/drivers/media/video/planb.c --- a/drivers/media/video/planb.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/planb.c Wed Oct 8 12:24:57 2003 @@ -27,7 +27,6 @@ /* $Id: planb.c,v 1.18 1999/05/02 17:36:34 mlan Exp $ */ -#include #include #include #include diff -Nru a/drivers/media/video/pms.c b/drivers/media/video/pms.c --- a/drivers/media/video/pms.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/pms.c Wed Oct 8 12:24:57 2003 @@ -30,7 +30,6 @@ #include #include #include -#include #include diff -Nru a/drivers/media/video/saa7110.c b/drivers/media/video/saa7110.c --- a/drivers/media/video/saa7110.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/saa7110.c Wed Oct 8 12:24:55 2003 @@ -25,8 +25,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include diff -Nru a/drivers/media/video/saa7111.c b/drivers/media/video/saa7111.c --- a/drivers/media/video/saa7111.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/saa7111.c Wed Oct 8 12:24:56 2003 @@ -24,8 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -45,7 +43,6 @@ #include #include -#include #include MODULE_DESCRIPTION("Philips SAA7111 video decoder driver"); diff -Nru a/drivers/media/video/saa7114.c b/drivers/media/video/saa7114.c --- a/drivers/media/video/saa7114.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/saa7114.c Wed Oct 8 12:24:57 2003 @@ -28,8 +28,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -51,7 +49,6 @@ #include #include -#include #include MODULE_DESCRIPTION("Philips SAA7114H video decoder driver"); diff -Nru a/drivers/media/video/saa7134/saa6752hs.c b/drivers/media/video/saa7134/saa6752hs.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/media/video/saa7134/saa6752hs.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,406 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* Addresses to scan */ +static unsigned short normal_i2c[] = {0x20, I2C_CLIENT_END}; +static unsigned short normal_i2c_range[] = {I2C_CLIENT_END}; +I2C_CLIENT_INSMOD; + +MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder"); +MODULE_AUTHOR("Andrew de Quincey"); +MODULE_LICENSE("GPL"); + +static struct i2c_driver driver; +static struct i2c_client client_template; + + +enum saa6752hs_command { + SAA6752HS_COMMAND_RESET = 0, + SAA6752HS_COMMAND_STOP = 1, + SAA6752HS_COMMAND_START = 2, + SAA6752HS_COMMAND_PAUSE = 3, + SAA6752HS_COMMAND_RECONFIGURE = 4, + SAA6752HS_COMMAND_SLEEP = 5, + SAA6752HS_COMMAND_RECONFIGURE_FORCE = 6, + + SAA6752HS_COMMAND_MAX +}; + + +/* ---------------------------------------------------------------------- */ + +static u8 PAT[] = { + 0xc2, // i2c register + 0x00, // table number for encoder + + 0x47, // sync + 0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) + 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) + + 0x00, // PSI pointer to start of table + + 0x00, // tid(0) + 0xb0, 0x0d, // section_syntax_indicator(1), section_length(13) + + 0x00, 0x01, // transport_stream_id(1) + + 0xc1, // version_number(0), current_next_indicator(1) + + 0x00, 0x00, // section_number(0), last_section_number(0) + + 0x00, 0x01, // program_number(1) + + 0xe0, 0x10, // PMT PID(0x10) + + 0x76, 0xf1, 0x44, 0xd1 // CRC32 +}; + +static u8 PMT[] = { + 0xc2, // i2c register + 0x01, // table number for encoder + + 0x47, // sync + 0x40, 0x10, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0x10) + 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) + + 0x00, // PSI pointer to start of table + + 0x02, // tid(2) + 0xb0, 0x17, // section_syntax_indicator(1), section_length(23) + + 0x00, 0x01, // program_number(1) + + 0xc1, // version_number(0), current_next_indicator(1) + + 0x00, 0x00, // section_number(0), last_section_number(0) + + 0xe1, 0x04, // PCR_PID (0x104) + + 0xf0, 0x00, // program_info_length(0) + + 0x02, 0xe1, 0x00, 0xf0, 0x00, // video stream type(2), pid(0x100) + 0x04, 0xe1, 0x03, 0xf0, 0x00, // audio stream type(4), pid(0x103) + + 0xa1, 0xca, 0x0f, 0x82 // CRC32 +}; + +static struct mpeg_params mpeg_params_template = +{ + .bitrate_mode = MPEG_BITRATE_MODE_CBR, + .video_target_bitrate = 5000, + .audio_bitrate = MPEG_AUDIO_BITRATE_256, + .total_bitrate = 6000, +}; + + +/* ---------------------------------------------------------------------- */ + + +static int saa6752hs_chip_command(struct i2c_client* client, + enum saa6752hs_command command) +{ + unsigned char buf[3]; + unsigned long timeout; + int status = 0; + + // execute the command + switch(command) { + case SAA6752HS_COMMAND_RESET: + buf[0] = 0x00; + break; + + case SAA6752HS_COMMAND_STOP: + buf[0] = 0x03; + break; + + case SAA6752HS_COMMAND_START: + buf[0] = 0x02; + break; + + case SAA6752HS_COMMAND_PAUSE: + buf[0] = 0x04; + break; + + case SAA6752HS_COMMAND_RECONFIGURE: + buf[0] = 0x05; + break; + + case SAA6752HS_COMMAND_SLEEP: + buf[0] = 0x06; + break; + + case SAA6752HS_COMMAND_RECONFIGURE_FORCE: + buf[0] = 0x07; + break; + + default: + return -EINVAL; + } + + // set it and wait for it to be so + i2c_master_send(client, buf, 1); + timeout = jiffies + HZ * 3; + for (;;) { + // get the current status + buf[0] = 0x10; + i2c_master_send(client, buf, 1); + i2c_master_recv(client, buf, 1); + + if (!(buf[0] & 0x20)) + break; + if (time_after(jiffies,timeout)) { + status = -ETIMEDOUT; + break; + } + + // wait a bit + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } + + // delay a bit to let encoder settle + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(5); + + // done + return status; +} + + +static int saa6752hs_set_bitrate(struct i2c_client* client, + struct mpeg_params* params) +{ + u8 buf[3]; + + // set the bitrate mode + buf[0] = 0x71; + buf[1] = params->bitrate_mode; + i2c_master_send(client, buf, 2); + + // set the video bitrate + if (params->bitrate_mode == MPEG_BITRATE_MODE_VBR) { + // set the target bitrate + buf[0] = 0x80; + buf[1] = params->video_target_bitrate >> 8; + buf[2] = params->video_target_bitrate & 0xff; + i2c_master_send(client, buf, 3); + + // set the max bitrate + buf[0] = 0x81; + buf[1] = params->video_max_bitrate >> 8; + buf[2] = params->video_max_bitrate & 0xff; + i2c_master_send(client, buf, 3); + } else { + // set the target bitrate (no max bitrate for CBR) + buf[0] = 0x81; + buf[1] = params->video_target_bitrate >> 8; + buf[2] = params->video_target_bitrate & 0xff; + i2c_master_send(client, buf, 3); + } + + // set the audio bitrate + buf[0] = 0x94; + buf[1] = params->audio_bitrate; + i2c_master_send(client, buf, 2); + + // set the total bitrate + buf[0] = 0xb1; + buf[1] = params->total_bitrate >> 8; + buf[2] = params->total_bitrate & 0xff; + i2c_master_send(client, buf, 3); + + return 0; +} + + +static int saa6752hs_init(struct i2c_client* client, struct mpeg_params* params) +{ + unsigned char buf[3]; + + // check the bitrate parameters first + if (params != NULL) { + if (params->bitrate_mode >= MPEG_BITRATE_MODE_MAX) + return -EINVAL; + if (params->video_target_bitrate >= MPEG_VIDEO_TARGET_BITRATE_MAX) + return -EINVAL; + if (params->video_max_bitrate >= MPEG_VIDEO_MAX_BITRATE_MAX) + return -EINVAL; + if (params->audio_bitrate >= MPEG_AUDIO_BITRATE_MAX) + return -EINVAL; + if (params->total_bitrate >= MPEG_TOTAL_BITRATE_MAX) + return -EINVAL; + if (params->bitrate_mode == MPEG_BITRATE_MODE_MAX && + params->video_target_bitrate <= params->video_max_bitrate) + return -EINVAL; + } + + // Set GOP structure {3, 13} + buf[0] = 0x72; + buf[1] = 0x03; + buf[2] = 0x0D; + i2c_master_send(client,buf,3); + + // Set minimum Q-scale {4} + buf[0] = 0x82; + buf[1] = 0x04; + i2c_master_send(client,buf,2); + + // Set maximum Q-scale {12} + buf[0] = 0x83; + buf[1] = 0x0C; + i2c_master_send(client,buf,2); + + // Set Output Protocol + buf[0] = 0xD0; + buf[1] = 0x01; + i2c_master_send(client,buf,2); + + // Set video output stream format {TS} + buf[0] = 0xB0; + buf[1] = 0x05; + i2c_master_send(client,buf,2); + + // Set Audio PID {0x103} + buf[0] = 0xC1; + buf[1] = 0x01; + buf[2] = 0x03; + i2c_master_send(client,buf,3); + + // setup bitrate settings + if (params) { + saa6752hs_set_bitrate(client, params); + memcpy(client->data, params, sizeof(struct mpeg_params)); + } else { + // parameters were not supplied. use the previous set + saa6752hs_set_bitrate(client, (struct mpeg_params*) client->data); + } + + // Send SI tables + i2c_master_send(client,PAT,sizeof(PAT)); + i2c_master_send(client,PMT,sizeof(PMT)); + + // mute then unmute audio. This removes buzzing artefacts + buf[0] = 0xa4; + buf[1] = 1; + i2c_master_send(client, buf, 2); + buf[1] = 0; + i2c_master_send(client, buf, 2); + + // start it going + saa6752hs_chip_command(client, SAA6752HS_COMMAND_START); + + return 0; +} + +static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind) +{ + struct i2c_client *client; + struct mpeg_params* params; + + client_template.adapter = adap; + client_template.addr = addr; + + printk("saa6752hs: chip found @ 0x%x\n", addr<<1); + + if (NULL == (client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL))) + return -ENOMEM; + memcpy(client,&client_template,sizeof(struct i2c_client)); + strlcpy(client->name, "saa6752hs", sizeof(client->name)); + + if (NULL == (params = kmalloc(sizeof(struct mpeg_params), GFP_KERNEL))) + return -ENOMEM; + memcpy(params,&mpeg_params_template,sizeof(struct mpeg_params)); + client->data = params; + + i2c_attach_client(client); + + return 0; +} + +static int saa6752hs_probe(struct i2c_adapter *adap) +{ + if (adap->class & I2C_ADAP_CLASS_TV_ANALOG) + return i2c_probe(adap, &addr_data, saa6752hs_attach); + + return 0; +} + +static int saa6752hs_detach(struct i2c_client *client) +{ + i2c_detach_client(client); + kfree(client->data); + kfree(client); + return 0; +} + +static int +saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg) +{ + struct mpeg_params* init_arg = arg; + + switch (cmd) { + case MPEG_SETPARAMS: + return saa6752hs_init(client, init_arg); + + default: + /* nothing */ + break; + } + + return 0; +} + +/* ----------------------------------------------------------------------- */ + +static struct i2c_driver driver = { + .owner = THIS_MODULE, + .name = "i2c saa6752hs MPEG encoder", + .id = I2C_DRIVERID_SAA6752HS, + .flags = I2C_DF_NOTIFY, + .attach_adapter = saa6752hs_probe, + .detach_client = saa6752hs_detach, + .command = saa6752hs_command, +}; + +static struct i2c_client client_template = +{ + I2C_DEVNAME("(saa6752hs unset)"), + .flags = I2C_CLIENT_ALLOW_USE, + .driver = &driver, +}; + +static int saa6752hs_init_module(void) +{ + i2c_add_driver(&driver); + return 0; +} + +static void saa6752hs_cleanup_module(void) +{ + i2c_del_driver(&driver); +} + +module_init(saa6752hs_init_module); +module_exit(saa6752hs_cleanup_module); + +/* + * Overrides for Emacs so that we follow Linus's tabbing style. + * --------------------------------------------------------------------------- + * Local variables: + * c-basic-offset: 8 + * End: + */ diff -Nru a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c --- a/drivers/media/video/saa7134/saa7134-cards.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/saa7134/saa7134-cards.c Wed Oct 8 12:24:57 2003 @@ -32,6 +32,8 @@ static char name_tv_mono[] = "TV (mono only)"; static char name_comp1[] = "Composite1"; static char name_comp2[] = "Composite2"; +static char name_comp3[] = "Composite3"; +static char name_comp4[] = "Composite4"; static char name_svideo[] = "S-Video"; /* ------------------------------------------------------------------ */ @@ -361,14 +363,16 @@ }, [SAA7134_BOARD_MD7134] = { .name = "Medion 7134", - .audio_clock = 0x00200000, + //.audio_clock = 0x00200000, + .audio_clock = 0x00187de7, .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, .need_tda9887 = 1, .inputs = {{ .name = name_tv, .vmux = 1, - .amux = LINE2, + .amux = TV, .tv = 1, +#if 0 },{ .name = name_comp1, .vmux = 0, @@ -381,6 +385,7 @@ .name = name_svideo, .vmux = 8, .amux = LINE2, +#endif }}, .radio = { .name = name_radio, @@ -388,9 +393,12 @@ }, }, [SAA7134_BOARD_TYPHOON_90031] = { + /* Christian Rothl�nder */ .name = "Typhoon TV+Radio 90031", .audio_clock = 0x00200000, - .tuner_type = TUNER_PHILIPS_PAL, + //.tuner_type = TUNER_PHILIPS_PAL, + .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, + .need_tda9887 = 1, .inputs = {{ .name = name_tv, .vmux = 1, @@ -409,7 +417,7 @@ .name = name_radio, .amux = LINE2, }, - }, + }, [SAA7134_BOARD_ELSA] = { .name = "ELSA EX-VISION 300TV", .audio_clock = 0x00187de7, @@ -444,14 +452,123 @@ .tv = 1, }}, }, - + [SAA7134_BOARD_ASUSTeK_TVFM7134] = { + .name = "ASUS TV-FM 7134", + .audio_clock = 0x00187de7, + .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, + .need_tda9887 = 1, + .inputs = {{ + .name = name_tv, + .vmux = 1, + .amux = TV, + .tv = 1, +#if 0 /* untested */ + },{ + .name = name_comp1, + .vmux = 4, + .amux = LINE2, + },{ + .name = name_comp2, + .vmux = 2, + .amux = LINE2, + },{ + .name = name_svideo, + .vmux = 6, + .amux = LINE2, + },{ + .name = "S-Video2", + .vmux = 7, + .amux = LINE2, +#endif + }}, + .radio = { + .name = name_radio, + .amux = LINE1, + }, + }, + [SAA7134_BOARD_VA1000POWER] = { + .name = "AOPEN VA1000 POWER", + .audio_clock = 0x00187de7, + .tuner_type = TUNER_PHILIPS_NTSC, + .inputs = {{ + .name = name_svideo, + .vmux = 8, + .amux = LINE1, + },{ + .name = name_comp1, + .vmux = 3, + .amux = LINE1, + },{ + .name = name_tv, + .vmux = 1, + .amux = LINE2, + .tv = 1, + }}, + }, + [SAA7134_BOARD_BMK_MPEX_NOTUNER] = { + /* "Andrew de Quincey" */ + .name = "BMK MPEX No Tuner", + .audio_clock = 0x200000, + .tuner_type = TUNER_ABSENT, + .inputs = {{ + .name = name_comp1, + .vmux = 4, + .amux = LINE1, + },{ + .name = name_comp2, + .vmux = 3, + .amux = LINE1, + },{ + .name = name_comp3, + .vmux = 0, + .amux = LINE1, + },{ + .name = name_comp4, + .vmux = 1, + .amux = LINE1, + },{ + .name = name_svideo, + .vmux = 8, + .amux = LINE1, + }}, + .i2s_rate = 48000, + .has_ts = 1, + .video_out = CCIR656, + }, + [SAA7134_BOARD_VIDEOMATE_TV] = { + .name = "Compro VideoMate TV", + .audio_clock = 0x00187de7, + .tuner_type = TUNER_PHILIPS_NTSC_M, + .inputs = {{ + .name = name_svideo, + .vmux = 8, + .amux = LINE1, + },{ + .name = name_comp1, + .vmux = 3, + .amux = LINE1, + },{ + .name = name_tv, + .vmux = 1, + .amux = LINE2, + .tv = 1, + }}, + }, + [SAA7134_BOARD_CRONOS_PLUS] = { + .name = "Matrox CronosPlus", + .tuner_type = TUNER_ABSENT, + .inputs = {{ + .name = name_comp1, + .vmux = 0, + }}, + }, }; const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); /* ------------------------------------------------------------------ */ /* PCI ids + subsystem IDs */ -struct pci_device_id __devinitdata saa7134_pci_tbl[] = { +struct pci_device_id saa7134_pci_tbl[] = { { .vendor = PCI_VENDOR_ID_PHILIPS, .device = PCI_DEVICE_ID_PHILIPS_SAA7134, @@ -519,6 +636,42 @@ .subdevice = 0x226b, .driver_data = SAA7134_BOARD_ELSA_500TV, },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7134, + .subvendor = PCI_VENDOR_ID_ASUSTEK, + .subdevice = 0x4842, + .driver_data = SAA7134_BOARD_ASUSTeK_TVFM7134, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7134, + .subvendor = PCI_VENDOR_ID_ASUSTEK, + .subdevice = 0x4830, + .driver_data = SAA7134_BOARD_ASUSTeK_TVFM7134, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7134, + .subvendor = PCI_VENDOR_ID_PHILIPS, + .subdevice = 0xfe01, + .driver_data = SAA7134_BOARD_TYPHOON_90031, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7134, + .subvendor = 0x1131, + .subdevice = 0x7133, + .driver_data = SAA7134_BOARD_VA1000POWER, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7133, + .subvendor = 0x185b, + .subdevice = 0xc100, + .driver_data = SAA7134_BOARD_VIDEOMATE_TV, + },{ + .vendor = PCI_VENDOR_ID_PHILIPS, + .device = PCI_DEVICE_ID_PHILIPS_SAA7130, + .subvendor = PCI_VENDOR_ID_MATROX, + .subdevice = 0x48d0, + .driver_data = SAA7134_BOARD_CRONOS_PLUS, + },{ /* --- boards without eeprom + subsystem ID --- */ .vendor = PCI_VENDOR_ID_PHILIPS, @@ -595,22 +748,16 @@ static void board_flyvideo(struct saa7134_dev *dev) { +#if 0 u32 value; + int index; - saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0); - value = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2); -#if 0 - { - int index = (value & 0x1f00) >> 8; - printk(KERN_INFO "%s: flyvideo: gpio is 0x%x " - "[model=%s,tuner=%d]\n", - dev->name, value, fly_list[index].model, - fly_list[index].tuner_type); - dev->tuner_type = fly_list[index].tuner_type; - } -#else - printk(KERN_INFO "%s: flyvideo: gpio is 0x%x\n", - dev->name, value); + value = dev->gpio_value; + index = (value & 0x1f00) >> 8; + printk(KERN_INFO "%s: flyvideo: gpio is 0x%x [model=%s,tuner=%d]\n", + dev->name, value, fly_list[index].model, + fly_list[index].tuner_type); + dev->tuner_type = fly_list[index].tuner_type; #endif } @@ -618,10 +765,19 @@ int saa7134_board_init(struct saa7134_dev *dev) { + // Always print gpio, often manufacturers encode tuner type and other info. + saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0); + dev->gpio_value = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2); + printk(KERN_INFO "%s: board init: gpio is %x\n", dev->name, dev->gpio_value); + switch (dev->board) { case SAA7134_BOARD_FLYVIDEO2000: case SAA7134_BOARD_FLYVIDEO3000: board_flyvideo(dev); + dev->has_remote = 1; + break; + case SAA7134_BOARD_CINERGY400: + dev->has_remote = 1; break; } return 0; diff -Nru a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c --- a/drivers/media/video/saa7134/saa7134-core.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/saa7134/saa7134-core.c Wed Oct 8 12:24:56 2003 @@ -35,7 +35,7 @@ MODULE_AUTHOR("Gerd Knorr [SuSE Labs]"); MODULE_LICENSE("GPL"); -#define SAA7134_MAXBOARDS 4 +#define SAA7134_MAXBOARDS 8 /* ------------------------------------------------------------------ */ @@ -51,32 +51,32 @@ MODULE_PARM(gpio_tracking,"i"); MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]"); -static unsigned int video_nr = -1; -MODULE_PARM(video_nr,"i"); +static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; +MODULE_PARM(video_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i"); MODULE_PARM_DESC(video_nr,"video device number"); -static unsigned int ts_nr = -1; -MODULE_PARM(ts_nr,"i"); +static unsigned int ts_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; +MODULE_PARM(ts_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i"); MODULE_PARM_DESC(ts_nr,"ts device number"); -static unsigned int vbi_nr = -1; -MODULE_PARM(vbi_nr,"i"); +static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; +MODULE_PARM(vbi_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i"); MODULE_PARM_DESC(vbi_nr,"vbi device number"); -static unsigned int radio_nr = -1; -MODULE_PARM(radio_nr,"i"); +static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; +MODULE_PARM(radio_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i"); MODULE_PARM_DESC(radio_nr,"radio device number"); static unsigned int oss = 0; MODULE_PARM(oss,"i"); MODULE_PARM_DESC(oss,"register oss devices (default: no)"); -static unsigned int dsp_nr = -1; -MODULE_PARM(dsp_nr,"i"); +static unsigned int dsp_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; +MODULE_PARM(dsp_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i"); MODULE_PARM_DESC(dsp_nr,"oss dsp device number"); -static unsigned int mixer_nr = -1; -MODULE_PARM(mixer_nr,"i"); +static unsigned int mixer_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; +MODULE_PARM(mixer_nr,"1-" __stringify(SAA7134_MAXBOARDS) "i"); MODULE_PARM_DESC(mixer_nr,"oss mixer device number"); static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET }; @@ -529,7 +529,8 @@ static char *irqbits[] = { "DONE_RA0", "DONE_RA1", "DONE_RA2", "DONE_RA3", "AR", "PE", "PWR_ON", "RDCAP", "INTL", "FIDT", "MMC", - "TRIG_ERR", "CONF_ERR", "LOAD_ERR" + "TRIG_ERR", "CONF_ERR", "LOAD_ERR", + "GPIO16?", "GPIO18", "GPIO22", "GPIO23" }; #define IRQBITS ARRAY_SIZE(irqbits) @@ -598,6 +599,13 @@ if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) saa7134_irq_oss_done(dev,status); +#ifdef CONFIG_VIDEO_IR + if ((report & (SAA7134_IRQ_REPORT_GPIO16 | + SAA7134_IRQ_REPORT_GPIO18)) && + dev->remote) + saa7134_input_irq(dev); +#endif + }; if (10 == loop) { print_irqstatus(dev,loop,report,status); @@ -613,23 +621,30 @@ /* ------------------------------------------------------------------ */ -static int saa7134_hwinit(struct saa7134_dev *dev) +/* early init (no i2c, no irq) */ +static int saa7134_hwinit1(struct saa7134_dev *dev) { + dprintk("hwinit1\n"); + + saa_writel(SAA7134_IRQ1, 0); + saa_writel(SAA7134_IRQ2, 0); init_MUTEX(&dev->lock); dev->slock = SPIN_LOCK_UNLOCKED; saa7134_track_gpio(dev,"pre-init"); - saa7134_tvaudio_init(dev); - saa7134_video_init(dev); - saa7134_vbi_init(dev); + saa7134_video_init1(dev); + saa7134_vbi_init1(dev); if (card_has_ts(dev)) - saa7134_ts_init(dev); + saa7134_ts_init1(dev); +#ifdef CONFIG_VIDEO_IR + saa7134_input_init1(dev); +#endif switch (dev->pci->device) { case PCI_DEVICE_ID_PHILIPS_SAA7134: case PCI_DEVICE_ID_PHILIPS_SAA7133: case PCI_DEVICE_ID_PHILIPS_SAA7135: - saa7134_oss_init(dev); + saa7134_oss_init1(dev); break; } @@ -648,20 +663,6 @@ SAA7134_MAIN_CTRL_EBADC | SAA7134_MAIN_CTRL_EBDAC); - /* IRQ's */ - saa_writel(SAA7134_IRQ1, 0); - saa_writel(SAA7134_IRQ2, - SAA7134_IRQ2_INTE_SC2 | - SAA7134_IRQ2_INTE_SC1 | - SAA7134_IRQ2_INTE_SC0 | - /* SAA7134_IRQ2_INTE_DEC5 | FIXME: TRIG_ERR ??? */ - SAA7134_IRQ2_INTE_DEC3 | - SAA7134_IRQ2_INTE_DEC2 | - /* SAA7134_IRQ2_INTE_DEC1 | */ - SAA7134_IRQ2_INTE_DEC0 | - SAA7134_IRQ2_INTE_PE | - SAA7134_IRQ2_INTE_AR); - /* enable peripheral devices */ saa_writeb(SAA7134_SPECIAL_MODE, 0x01); @@ -671,6 +672,57 @@ return 0; } +/* late init (with i2c + irq) */ +static int saa7134_hwinit2(struct saa7134_dev *dev) +{ + dprintk("hwinit2\n"); + + saa7134_video_init2(dev); + saa7134_tvaudio_init2(dev); + + /* enable IRQ's */ + saa_writel(SAA7134_IRQ1, 0); + saa_writel(SAA7134_IRQ2, + SAA7134_IRQ2_INTE_GPIO18 | + SAA7134_IRQ2_INTE_GPIO18A | + SAA7134_IRQ2_INTE_GPIO16 | + SAA7134_IRQ2_INTE_SC2 | + SAA7134_IRQ2_INTE_SC1 | + SAA7134_IRQ2_INTE_SC0 | + /* SAA7134_IRQ2_INTE_DEC5 | FIXME: TRIG_ERR ??? */ + SAA7134_IRQ2_INTE_DEC3 | + SAA7134_IRQ2_INTE_DEC2 | + /* SAA7134_IRQ2_INTE_DEC1 | */ + SAA7134_IRQ2_INTE_DEC0 | + SAA7134_IRQ2_INTE_PE | + SAA7134_IRQ2_INTE_AR); + + return 0; +} + +/* shutdown */ +static int saa7134_hwfini(struct saa7134_dev *dev) +{ + dprintk("hwfini\n"); + + switch (dev->pci->device) { + case PCI_DEVICE_ID_PHILIPS_SAA7134: + case PCI_DEVICE_ID_PHILIPS_SAA7133: + case PCI_DEVICE_ID_PHILIPS_SAA7135: + saa7134_oss_fini(dev); + break; + } + if (card_has_ts(dev)) + saa7134_ts_fini(dev); +#ifdef CONFIG_VIDEO_IR + saa7134_input_fini(dev); +#endif + saa7134_vbi_fini(dev); + saa7134_video_fini(dev); + saa7134_tvaudio_fini(dev); + return 0; +} + static void __devinit must_configure_manually(void) { unsigned int i,p; @@ -698,6 +750,56 @@ } } +static struct video_device *vdev_init(struct saa7134_dev *dev, + struct video_device *template, + char *type) +{ + struct video_device *vfd; + + vfd = video_device_alloc(); + if (NULL == vfd) + return NULL; + *vfd = *template; + vfd->minor = -1; + vfd->dev = &dev->pci->dev; + vfd->release = video_device_release; + snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", + dev->name, type, saa7134_boards[dev->board].name); + return vfd; +} + +static void saa7134_unregister_video(struct saa7134_dev *dev) +{ + if (dev->video_dev) { + if (-1 != dev->video_dev->minor) + video_unregister_device(dev->video_dev); + else + video_device_release(dev->video_dev); + dev->video_dev = NULL; + } + if (dev->ts_dev) { + if (-1 != dev->ts_dev->minor) + video_unregister_device(dev->ts_dev); + else + video_device_release(dev->ts_dev); + dev->ts_dev = NULL; + } + if (dev->vbi_dev) { + if (-1 != dev->vbi_dev->minor) + video_unregister_device(dev->vbi_dev); + else + video_device_release(dev->vbi_dev); + dev->vbi_dev = NULL; + } + if (dev->radio_dev) { + if (-1 != dev->radio_dev->minor) + video_unregister_device(dev->radio_dev); + else + video_device_release(dev->radio_dev); + dev->radio_dev = NULL; + } +} + static int __devinit saa7134_initdev(struct pci_dev *pci_dev, const struct pci_device_id *pci_id) { @@ -705,10 +807,8 @@ int err; dev = kmalloc(sizeof(*dev),GFP_KERNEL); - if (NULL == dev) { - err = -ENOMEM; - goto fail0; - } + if (NULL == dev) + return -ENOMEM; memset(dev,0,sizeof(*dev)); /* pci init */ @@ -785,19 +885,17 @@ goto fail1; } dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000); - if (!dev->lmmio) { - printk(KERN_ERR "Unable to remap memory.\n"); - err = -ENOMEM; + dev->bmmio = (__u8*)dev->lmmio; + if (NULL == dev->lmmio) { + err = -EIO; + printk(KERN_ERR "%s: can't ioremap() MMIO memory\n", + dev->name); goto fail2; } - dev->bmmio = (__u8*)dev->lmmio; - - /* register i2c bus */ - saa7134_i2c_register(dev); - /* initialize hardware */ + /* initialize hardware #1 */ saa7134_board_init(dev); - saa7134_hwinit(dev); + saa7134_hwinit1(dev); /* get irq */ err = request_irq(pci_dev->irq, saa7134_irq, @@ -808,53 +906,63 @@ goto fail3; } + /* wait a bit, register i2c bus */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(HZ/10); + saa7134_i2c_register(dev); + + /* initialize hardware #2 */ + saa7134_hwinit2(dev); + /* load i2c helpers */ if (TUNER_ABSENT != dev->tuner_type) request_module("tuner"); if (saa7134_boards[dev->board].need_tda9887) request_module("tda9887"); + if (card_has_ts(dev)) + request_module("saa6752hs"); /* register v4l devices */ - dev->video_dev = saa7134_video_template; - dev->video_dev.priv = dev; - err = video_register_device(&dev->video_dev,VFL_TYPE_GRABBER,video_nr); + dev->video_dev = vdev_init(dev,&saa7134_video_template,"video"); + err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER, + video_nr[saa7134_devcount]); if (err < 0) { printk(KERN_INFO "%s: can't register video device\n", dev->name); goto fail4; } printk(KERN_INFO "%s: registered device video%d [v4l2]\n", - dev->name,dev->video_dev.minor & 0x1f); + dev->name,dev->video_dev->minor & 0x1f); - dev->ts_dev = saa7134_ts_template; - dev->ts_dev.priv = dev; if (card_has_ts(dev)) { - err = video_register_device(&dev->ts_dev,VFL_TYPE_GRABBER,ts_nr); + dev->ts_dev = vdev_init(dev,&saa7134_ts_template,"ts"); + err = video_register_device(dev->ts_dev,VFL_TYPE_GRABBER, + ts_nr[saa7134_devcount]); if (err < 0) { printk(KERN_INFO "%s: can't register video device\n", dev->name); - goto fail5; + goto fail4; } printk(KERN_INFO "%s: registered device video%d [ts]\n", - dev->name,dev->ts_dev.minor & 0x1f); + dev->name,dev->ts_dev->minor & 0x1f); } - dev->vbi_dev = saa7134_vbi_template; - dev->vbi_dev.priv = dev; - err = video_register_device(&dev->vbi_dev,VFL_TYPE_VBI,vbi_nr); + dev->vbi_dev = vdev_init(dev,&saa7134_vbi_template,"vbi"); + err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI, + vbi_nr[saa7134_devcount]); if (err < 0) - goto fail6; + goto fail4; printk(KERN_INFO "%s: registered device vbi%d\n", - dev->name,dev->vbi_dev.minor & 0x1f); + dev->name,dev->vbi_dev->minor & 0x1f); - dev->radio_dev = saa7134_radio_template; - dev->radio_dev.priv = dev; if (card_has_radio(dev)) { - err = video_register_device(&dev->radio_dev,VFL_TYPE_RADIO,radio_nr); + dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio"); + err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO, + radio_nr[saa7134_devcount]); if (err < 0) - goto fail7; + goto fail4; printk(KERN_INFO "%s: registered device radio%d\n", - dev->name,dev->radio_dev.minor & 0x1f); + dev->name,dev->radio_dev->minor & 0x1f); } /* register oss devices */ @@ -864,17 +972,19 @@ case PCI_DEVICE_ID_PHILIPS_SAA7135: if (oss) { err = dev->oss.minor_dsp = - register_sound_dsp(&saa7134_dsp_fops,dsp_nr); + register_sound_dsp(&saa7134_dsp_fops, + dsp_nr[saa7134_devcount]); if (err < 0) { - goto fail8; + goto fail4; } printk(KERN_INFO "%s: registered device dsp%d\n", dev->name,dev->oss.minor_dsp >> 4); err = dev->oss.minor_mixer = - register_sound_mixer(&saa7134_mixer_fops,mixer_nr); + register_sound_mixer(&saa7134_mixer_fops, + mixer_nr[saa7134_devcount]); if (err < 0) - goto fail9; + goto fail5; printk(KERN_INFO "%s: registered device mixer%d\n", dev->name,dev->oss.minor_mixer >> 4); } @@ -887,7 +997,7 @@ saa7134_devcount++; return 0; - fail9: + fail5: switch (dev->pci->device) { case PCI_DEVICE_ID_PHILIPS_SAA7134: case PCI_DEVICE_ID_PHILIPS_SAA7133: @@ -896,39 +1006,18 @@ unregister_sound_dsp(dev->oss.minor_dsp); break; } - fail8: - if (card_has_radio(dev)) - video_unregister_device(&dev->radio_dev); - fail7: - video_unregister_device(&dev->vbi_dev); - fail6: - if (card_has_ts(dev)) - video_unregister_device(&dev->ts_dev); - fail5: - video_unregister_device(&dev->video_dev); fail4: + saa7134_unregister_video(dev); + saa7134_i2c_unregister(dev); free_irq(pci_dev->irq, dev); fail3: - switch (dev->pci->device) { - case PCI_DEVICE_ID_PHILIPS_SAA7134: - case PCI_DEVICE_ID_PHILIPS_SAA7133: - case PCI_DEVICE_ID_PHILIPS_SAA7135: - saa7134_oss_fini(dev); - break; - } - if (card_has_ts(dev)) - saa7134_ts_fini(dev); - saa7134_vbi_fini(dev); - saa7134_video_fini(dev); - saa7134_tvaudio_fini(dev); - iounmap (dev->lmmio); - saa7134_i2c_unregister(dev); + saa7134_hwfini(dev); + iounmap(dev->lmmio); fail2: release_mem_region(pci_resource_start(pci_dev,0), pci_resource_len(pci_dev,0)); fail1: kfree(dev); - fail0: return err; } @@ -964,12 +1053,6 @@ saa7134_vbi_fini(dev); saa7134_video_fini(dev); saa7134_tvaudio_fini(dev); - iounmap(dev->lmmio); - - /* release ressources */ - free_irq(pci_dev->irq, dev); - release_mem_region(pci_resource_start(pci_dev,0), - pci_resource_len(pci_dev,0)); /* unregister */ saa7134_i2c_unregister(dev); @@ -983,17 +1066,18 @@ } break; } - if (card_has_radio(dev)) - video_unregister_device(&dev->radio_dev); - video_unregister_device(&dev->vbi_dev); - if (card_has_ts(dev)) - video_unregister_device(&dev->ts_dev); - video_unregister_device(&dev->video_dev); - pci_set_drvdata(pci_dev, NULL); -#if 0 - /* causes some trouble when reinserting the driver ... */ + saa7134_unregister_video(dev); + + /* release ressources */ + free_irq(pci_dev->irq, dev); + iounmap(dev->lmmio); + release_mem_region(pci_resource_start(pci_dev,0), + pci_resource_len(pci_dev,0)); + +#if 0 /* causes some trouble when reinserting the driver ... */ pci_disable_device(pci_dev); #endif + pci_set_drvdata(pci_dev, NULL); /* free memory */ list_del(&dev->devlist); diff -Nru a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c --- a/drivers/media/video/saa7134/saa7134-i2c.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/saa7134/saa7134-i2c.c Wed Oct 8 12:24:55 2003 @@ -311,6 +311,17 @@ return I2C_FUNC_SMBUS_EMUL; } +#ifndef I2C_PEC +static void inc_use(struct i2c_adapter *adap) +{ + MOD_INC_USE_COUNT; +} + +static void dec_use(struct i2c_adapter *adap) +{ + MOD_DEC_USE_COUNT; +} +#endif static int attach_inform(struct i2c_client *client) { @@ -330,8 +341,15 @@ }; static struct i2c_adapter saa7134_adap_template = { +#ifdef I2C_PEC .owner = THIS_MODULE, +#else + .inc_use = inc_use, + .dec_use = dec_use, +#endif +#ifdef I2C_ADAP_CLASS_TV_ANALOG .class = I2C_ADAP_CLASS_TV_ANALOG, +#endif I2C_DEVNAME("saa7134"), .id = I2C_ALGO_SAA7134, .algo = &saa7134_algo, @@ -393,12 +411,14 @@ void saa7134_i2c_call_clients(struct saa7134_dev *dev, unsigned int cmd, void *arg) { + BUG_ON(NULL == dev->i2c_adap.algo_data); i2c_clients_command(&dev->i2c_adap, cmd, arg); } int saa7134_i2c_register(struct saa7134_dev *dev) { dev->i2c_adap = saa7134_adap_template; + dev->i2c_adap.dev.parent = &dev->pci->dev; strcpy(dev->i2c_adap.name,dev->name); dev->i2c_adap.algo_data = dev; i2c_add_adapter(&dev->i2c_adap); diff -Nru a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c --- a/drivers/media/video/saa7134/saa7134-oss.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/saa7134/saa7134-oss.c Wed Oct 8 12:24:56 2003 @@ -732,7 +732,7 @@ /* ------------------------------------------------------------------ */ -int saa7134_oss_init(struct saa7134_dev *dev) +int saa7134_oss_init1(struct saa7134_dev *dev) { /* general */ init_MUTEX(&dev->oss.lock); diff -Nru a/drivers/media/video/saa7134/saa7134-reg.h b/drivers/media/video/saa7134/saa7134-reg.h --- a/drivers/media/video/saa7134/saa7134-reg.h Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/saa7134/saa7134-reg.h Wed Oct 8 12:24:57 2003 @@ -101,7 +101,15 @@ #define SAA7134_IRQ1_INTE_RA0_2 (1 << 2) #define SAA7134_IRQ1_INTE_RA0_1 (1 << 1) #define SAA7134_IRQ1_INTE_RA0_0 (1 << 0) + #define SAA7134_IRQ2 (0x2c8 >> 2) +#define SAA7134_IRQ2_INTE_GPIO23A (1 << 17) +#define SAA7134_IRQ2_INTE_GPIO23 (1 << 16) +#define SAA7134_IRQ2_INTE_GPIO22A (1 << 15) +#define SAA7134_IRQ2_INTE_GPIO22 (1 << 14) +#define SAA7134_IRQ2_INTE_GPIO18A (1 << 13) +#define SAA7134_IRQ2_INTE_GPIO18 (1 << 12) +#define SAA7134_IRQ2_INTE_GPIO16 (1 << 11) /* not certain */ #define SAA7134_IRQ2_INTE_SC2 (1 << 10) #define SAA7134_IRQ2_INTE_SC1 (1 << 9) #define SAA7134_IRQ2_INTE_SC0 (1 << 8) @@ -113,7 +121,12 @@ #define SAA7134_IRQ2_INTE_DEC0 (1 << 2) #define SAA7134_IRQ2_INTE_PE (1 << 1) #define SAA7134_IRQ2_INTE_AR (1 << 0) + #define SAA7134_IRQ_REPORT (0x2cc >> 2) +#define SAA7134_IRQ_REPORT_GPIO23 (1 << 17) +#define SAA7134_IRQ_REPORT_GPIO22 (1 << 16) +#define SAA7134_IRQ_REPORT_GPIO18 (1 << 15) +#define SAA7134_IRQ_REPORT_GPIO16 (1 << 14) /* not certain */ #define SAA7134_IRQ_REPORT_LOAD_ERR (1 << 13) #define SAA7134_IRQ_REPORT_CONF_ERR (1 << 12) #define SAA7134_IRQ_REPORT_TRIG_ERR (1 << 11) diff -Nru a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c --- a/drivers/media/video/saa7134/saa7134-ts.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/saa7134/saa7134-ts.c Wed Oct 8 12:24:55 2003 @@ -24,10 +24,13 @@ #include #include #include +#include #include "saa7134-reg.h" #include "saa7134.h" +#include + /* ------------------------------------------------------------------ */ static unsigned int ts_debug = 0; @@ -109,7 +112,7 @@ buf->vb.size = size; buf->pt = &dev->ts.pt_ts; - err = videobuf_iolock(dev->pci,&buf->vb); + err = videobuf_iolock(dev->pci,&buf->vb,NULL); if (err) goto oops; err = saa7134_pgtable_build(dev->pci,buf->pt, @@ -162,6 +165,26 @@ .buf_release = buffer_release, }; + +/* ------------------------------------------------------------------ */ + +static void ts_reset_encoder(struct saa7134_dev* dev) +{ + saa_writeb(SAA7134_SPECIAL_MODE, 0x00); + mdelay(10); + saa_writeb(SAA7134_SPECIAL_MODE, 0x01); + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(HZ/10); +} + +static int ts_init_encoder(struct saa7134_dev* dev, void* arg) +{ + ts_reset_encoder(dev); + saa7134_i2c_call_clients(dev, MPEG_SETPARAMS, arg); + return 0; +} + + /* ------------------------------------------------------------------ */ static int ts_open(struct inode *inode, struct file *file) @@ -173,7 +196,7 @@ list_for_each(list,&saa7134_devlist) { h = list_entry(list, struct saa7134_dev, devlist); - if (h->ts_dev.minor == minor) + if (h->ts_dev->minor == minor) dev = h; } if (NULL == dev) @@ -185,9 +208,11 @@ if (dev->ts.users) goto done; + dev->ts.started = 0; dev->ts.users++; file->private_data = dev; err = 0; + done: up(&dev->ts.ts.lock); return err; @@ -203,6 +228,11 @@ if (dev->ts.ts.reading) videobuf_read_stop(file,&dev->ts.ts); dev->ts.users--; + + /* stop the encoder */ + if (dev->ts.started) + ts_reset_encoder(dev); + up(&dev->ts.ts.lock); return 0; } @@ -212,6 +242,11 @@ { struct saa7134_dev *dev = file->private_data; + if (!dev->ts.started) { + ts_init_encoder(dev, NULL); + dev->ts.started = 1; + } + return videobuf_read_stream(file, &dev->ts.ts, data, count, ppos, 0); } @@ -345,6 +380,7 @@ f->fmt.pix.height = 576; f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG; f->fmt.pix.sizeimage = TS_PACKET_SIZE*TS_NR_PACKETS; + return 0; } case VIDIOC_REQBUFS: @@ -365,6 +401,14 @@ case VIDIOC_STREAMOFF: return videobuf_streamoff(file,&dev->ts.ts); + case VIDIOC_QUERYCTRL: + case VIDIOC_G_CTRL: + case VIDIOC_S_CTRL: + return saa7134_common_ioctl(dev, cmd, arg); + + case MPEG_SETPARAMS: + return ts_init_encoder(dev, arg); + default: return -ENOIOCTLCMD; } @@ -404,7 +448,7 @@ .minor = -1, }; -int saa7134_ts_init(struct saa7134_dev *dev) +int saa7134_ts_init1(struct saa7134_dev *dev) { /* sanitycheck insmod options */ if (tsbufs < 2) diff -Nru a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c --- a/drivers/media/video/saa7134/saa7134-tvaudio.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/saa7134/saa7134-tvaudio.c Wed Oct 8 12:24:55 2003 @@ -2,7 +2,7 @@ * device driver for philips saa7134 based TV cards * tv audio decoder (fm stereo, nicam, ...) * - * (c) 2001,02 Gerd Knorr [SuSE Labs] + * (c) 2001-03 Gerd Knorr [SuSE Labs] * * 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 @@ -172,7 +172,7 @@ { unsigned int mute; struct saa7134_input *in; - int reg = 0; + int ausel=0, ics=0, ocs=0; int mask; /* look what is to do ... */ @@ -200,11 +200,13 @@ /* switch internal audio mux */ switch (in->amux) { - case TV: reg = 0x02; break; - case LINE1: reg = 0x00; break; - case LINE2: reg = 0x01; break; - } - saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, reg); + case TV: ausel=0xc0; ics=0x00; ocs=0x02; break; + case LINE1: ausel=0x80; ics=0x00; ocs=0x00; break; + case LINE2: ausel=0x80; ics=0x08; ocs=0x01; break; + } + saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, ausel); + saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, ics); + saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, ocs); /* switch gpio-connected external audio mux */ if (0 == card(dev).gpiomask) @@ -547,11 +549,19 @@ tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO); dev->tvaudio = &tvaudio[audio]; - if (tvaudio_sleep(dev,3*HZ)) - goto restart; - rx = tvaudio_getstereo(dev,&tvaudio[i]); - mode = saa7134_tvaudio_rx2mode(rx); - tvaudio_setstereo(dev,&tvaudio[audio],mode); + for (;;) { + if (tvaudio_sleep(dev,3*HZ)) + goto restart; + if (dev->thread.exit || signal_pending(current)) + break; + if (UNSET == dev->thread.mode) { + rx = tvaudio_getstereo(dev,&tvaudio[i]); + mode = saa7134_tvaudio_rx2mode(rx); + } else { + mode = dev->thread.mode; + } + tvaudio_setstereo(dev,&tvaudio[audio],mode); + } } done: @@ -592,8 +602,8 @@ [0x1f] = "??? [in progress]", }; -#define DSP_RETRY 16 -#define DSP_DELAY 16 +#define DSP_RETRY 30 +#define DSP_DELAY 10 static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit) { @@ -838,10 +848,11 @@ return retval; } -int saa7134_tvaudio_init(struct saa7134_dev *dev) +int saa7134_tvaudio_init2(struct saa7134_dev *dev) { DECLARE_MUTEX_LOCKED(sem); int (*my_thread)(void *data) = NULL; + int rc; /* enable I2S audio output */ if (saa7134_boards[dev->board].i2s_rate) { @@ -872,8 +883,12 @@ /* start tvaudio thread */ init_waitqueue_head(&dev->thread.wq); dev->thread.notify = &sem; - kernel_thread(my_thread,dev,0); - down(&sem); + rc = kernel_thread(my_thread,dev,0); + if (rc < 0) + printk(KERN_WARNING "%s: kernel_thread() failed\n", + dev->name); + else + down(&sem); dev->thread.notify = NULL; wake_up_interruptible(&dev->thread.wq); } @@ -900,6 +915,7 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev) { if (dev->thread.task) { + dev->thread.mode = UNSET; dev->thread.scan2++; wake_up_interruptible(&dev->thread.wq); } else { diff -Nru a/drivers/media/video/saa7134/saa7134-vbi.c b/drivers/media/video/saa7134/saa7134-vbi.c --- a/drivers/media/video/saa7134/saa7134-vbi.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/saa7134/saa7134-vbi.c Wed Oct 8 12:24:57 2003 @@ -146,7 +146,7 @@ buf->vb.size = size; buf->pt = &fh->pt_vbi; - err = videobuf_iolock(dev->pci,&buf->vb); + err = videobuf_iolock(dev->pci,&buf->vb,NULL); if (err) goto oops; err = saa7134_pgtable_build(dev->pci,buf->pt, @@ -215,7 +215,7 @@ /* ------------------------------------------------------------------ */ -int saa7134_vbi_init(struct saa7134_dev *dev) +int saa7134_vbi_init1(struct saa7134_dev *dev) { INIT_LIST_HEAD(&dev->vbi_q.queue); init_timer(&dev->vbi_q.timeout); diff -Nru a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c --- a/drivers/media/video/saa7134/saa7134-video.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/saa7134/saa7134-video.c Wed Oct 8 12:24:55 2003 @@ -578,21 +578,12 @@ saa_writeb(SAA7134_VIDEO_LINES2(task), height/div >> 8); /* deinterlace y offsets */ - if (interlace) { - y_odd = dev->ctl_y_odd; - y_even = dev->ctl_y_even; - saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd); - saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even); - saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd); - saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even); - } else { - y_odd = dev->ctl_y_odd; - y_even = dev->ctl_y_even; - saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd); - saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even); - saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd); - saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even); - } + y_odd = dev->ctl_y_odd; + y_even = dev->ctl_y_even; + saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd); + saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even); + saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd); + saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even); } /* ------------------------------------------------------------------ */ @@ -912,7 +903,7 @@ buf->fmt = fh->fmt; buf->pt = &fh->pt_cap; - err = videobuf_iolock(dev->pci,&buf->vb); + err = videobuf_iolock(dev->pci,&buf->vb,&dev->ovbuf); if (err) goto oops; err = saa7134_pgtable_build(dev->pci,buf->pt, @@ -1084,7 +1075,7 @@ default: return -EINVAL; } - if (restart_overlay && res_check(fh, RESOURCE_OVERLAY)) { + if (restart_overlay && fh && res_check(fh, RESOURCE_OVERLAY)) { spin_lock_irqsave(&dev->slock,flags); stop_preview(dev,fh); start_preview(dev,fh); @@ -1140,13 +1131,13 @@ list_for_each(list,&saa7134_devlist) { h = list_entry(list, struct saa7134_dev, devlist); - if (h->video_dev.minor == minor) + if (h->video_dev && (h->video_dev->minor == minor)) dev = h; - if (h->radio_dev.minor == minor) { + if (h->radio_dev && (h->radio_dev->minor == minor)) { radio = 1; dev = h; } - if (h->vbi_dev.minor == minor) { + if (h->vbi_dev && (h->vbi_dev->minor == minor)) { type = V4L2_BUF_TYPE_VBI_CAPTURE; dev = h; } @@ -1188,13 +1179,10 @@ if (fh->radio) { /* switch to radio mode */ - u32 v = 400*16; saa7134_tvaudio_setinput(dev,&card(dev).radio); - saa7134_i2c_call_clients(dev,VIDIOCSFREQ,&v); saa7134_i2c_call_clients(dev,AUDC_SET_RADIO,NULL); } else { /* switch to video/vbi mode */ - set_tvnorm(dev,dev->tvnorm); video_mux(dev,dev->ctl_input); } return 0; @@ -1327,7 +1315,7 @@ f->fmt.vbi.count[0] = norm->vbi_v_stop - norm->vbi_v_start +1; f->fmt.vbi.start[1] = norm->video_v_stop + norm->vbi_v_start +1; f->fmt.vbi.count[1] = f->fmt.vbi.count[0]; - f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */; + f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */ #if 0 if (V4L2_STD_PAL == norm->id) { @@ -1479,6 +1467,92 @@ } } +int saa7134_common_ioctl(struct saa7134_dev *dev, + unsigned int cmd, void *arg) +{ + int err; + + switch (cmd) { + case VIDIOC_QUERYCTRL: + { + const struct v4l2_queryctrl *ctrl; + struct v4l2_queryctrl *c = arg; + + if ((c->id < V4L2_CID_BASE || + c->id >= V4L2_CID_LASTP1) && + (c->id < V4L2_CID_PRIVATE_BASE || + c->id >= V4L2_CID_PRIVATE_LASTP1)) + return -EINVAL; + ctrl = ctrl_by_id(c->id); + *c = (NULL != ctrl) ? *ctrl : no_ctrl; + return 0; + } + case VIDIOC_G_CTRL: + return get_control(dev,arg); + case VIDIOC_S_CTRL: + { + down(&dev->lock); + err = set_control(dev,NULL,arg); + up(&dev->lock); + return err; + } + /* --- input switching --------------------------------------- */ + case VIDIOC_ENUMINPUT: + { + struct v4l2_input *i = arg; + unsigned int n; + + n = i->index; + if (n >= SAA7134_INPUT_MAX) + return -EINVAL; + if (NULL == card_in(dev,i->index).name) + return -EINVAL; + memset(i,0,sizeof(*i)); + i->index = n; + i->type = V4L2_INPUT_TYPE_CAMERA; + strcpy(i->name,card_in(dev,n).name); + if (card_in(dev,n).tv) + i->type = V4L2_INPUT_TYPE_TUNER; + i->audioset = 1; + if (n == dev->ctl_input) { + int v1 = saa_readb(SAA7134_STATUS_VIDEO1); + int v2 = saa_readb(SAA7134_STATUS_VIDEO2); + + if (0 != (v1 & 0x40)) + i->status |= V4L2_IN_ST_NO_H_LOCK; + if (0 != (v2 & 0x40)) + i->status |= V4L2_IN_ST_NO_SYNC; + if (0 != (v2 & 0x0e)) + i->status |= V4L2_IN_ST_MACROVISION; + } + for (n = 0; n < TVNORMS; n++) + i->std |= tvnorms[n].id; + return 0; + } + case VIDIOC_G_INPUT: + { + int *i = arg; + *i = dev->ctl_input; + return 0; + } + case VIDIOC_S_INPUT: + { + int *i = arg; + + if (*i < 0 || *i >= SAA7134_INPUT_MAX) + return -EINVAL; + if (NULL == card_in(dev,*i).name) + return -EINVAL; + down(&dev->lock); + video_mux(dev,*i); + up(&dev->lock); + return 0; + } + + } + return 0; +} + /* * This function is _not_ called directly, but from * video_generic_ioctl (and maybe others). userspace @@ -1562,59 +1636,6 @@ return 0; } - /* --- input switching --------------------------------------- */ - case VIDIOC_ENUMINPUT: - { - struct v4l2_input *i = arg; - unsigned int n; - - n = i->index; - if (n >= SAA7134_INPUT_MAX) - return -EINVAL; - if (NULL == card_in(dev,i->index).name) - return -EINVAL; - memset(i,0,sizeof(*i)); - i->index = n; - i->type = V4L2_INPUT_TYPE_CAMERA; - strcpy(i->name,card_in(dev,n).name); - if (card_in(dev,n).tv) - i->type = V4L2_INPUT_TYPE_TUNER; - i->audioset = 1; - if (n == dev->ctl_input) { - int v1 = saa_readb(SAA7134_STATUS_VIDEO1); - int v2 = saa_readb(SAA7134_STATUS_VIDEO2); - - if (0 != (v1 & 0x40)) - i->status |= V4L2_IN_ST_NO_H_LOCK; - if (0 != (v2 & 0x40)) - i->status |= V4L2_IN_ST_NO_SYNC; - if (0 != (v2 & 0x0e)) - i->status |= V4L2_IN_ST_MACROVISION; - } - for (n = 0; n < TVNORMS; n++) - i->std |= tvnorms[n].id; - return 0; - } - case VIDIOC_G_INPUT: - { - int *i = arg; - *i = dev->ctl_input; - return 0; - } - case VIDIOC_S_INPUT: - { - int *i = arg; - - if (*i < 0 || *i >= SAA7134_INPUT_MAX) - return -EINVAL; - if (NULL == card_in(dev,*i).name) - return -EINVAL; - down(&dev->lock); - video_mux(dev,*i); - up(&dev->lock); - return 0; - } - /* --- tuner ioctls ------------------------------------------ */ case VIDIOC_G_TUNER: { @@ -1643,9 +1664,17 @@ } case VIDIOC_S_TUNER: { -#if 0 struct v4l2_tuner *t = arg; -#endif + int rx,mode; + + mode = dev->thread.mode; + if (UNSET == mode) { + rx = saa7134_tvaudio_getstereo(dev); + mode = saa7134_tvaudio_rx2mode(t->rxsubchans); + } + if (mode != t->audmode) { + dev->thread.mode = t->audmode; + } return 0; } case VIDIOC_G_FREQUENCY: @@ -1673,29 +1702,14 @@ } /* --- control ioctls ---------------------------------------- */ + case VIDIOC_ENUMINPUT: + case VIDIOC_G_INPUT: + case VIDIOC_S_INPUT: case VIDIOC_QUERYCTRL: - { - const struct v4l2_queryctrl *ctrl; - struct v4l2_queryctrl *c = arg; - - if ((c->id < V4L2_CID_BASE || - c->id >= V4L2_CID_LASTP1) && - (c->id < V4L2_CID_PRIVATE_BASE || - c->id >= V4L2_CID_PRIVATE_LASTP1)) - return -EINVAL; - ctrl = ctrl_by_id(c->id); - *c = (NULL != ctrl) ? *ctrl : no_ctrl; - return 0; - } case VIDIOC_G_CTRL: - return get_control(dev,arg); case VIDIOC_S_CTRL: - { - down(&dev->lock); - err = set_control(dev,fh,arg); - up(&dev->lock); - return err; - } + return saa7134_common_ioctl(dev, cmd, arg); + case VIDIOC_G_AUDIO: { struct v4l2_audio *a = arg; @@ -1828,8 +1842,9 @@ q = saa7134_queue(fh); memset(&req,0,sizeof(req)); - req.type = q->type; - req.count = gbuffers; + req.type = q->type; + req.count = gbuffers; + req.memory = V4L2_MEMORY_MMAP; err = videobuf_reqbufs(file,q,&req); if (err < 0) return err; @@ -1913,6 +1928,9 @@ struct v4l2_tuner *t = arg; struct video_tuner vt; + if (0 != t->index) + return -EINVAL; + memset(t,0,sizeof(*t)); strcpy(t->name, "Radio"); t->rangelow = (int)(65*16); @@ -2046,7 +2064,7 @@ .minor = -1, }; -int saa7134_video_init(struct saa7134_dev *dev) +int saa7134_video_init1(struct saa7134_dev *dev) { /* sanitycheck insmod options */ if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME) @@ -2072,12 +2090,6 @@ dev->video_q.timeout.data = (unsigned long)(&dev->video_q); dev->video_q.dev = dev; - /* init video hw */ - set_tvnorm(dev,&tvnorms[0]); - video_mux(dev,0); - saa7134_tvaudio_setmute(dev); - saa7134_tvaudio_setvolume(dev,dev->ctl_volume); - if (saa7134_boards[dev->board].video_out) { /* enable video output */ int vo = saa7134_boards[dev->board].video_out; @@ -2092,6 +2104,16 @@ saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]); } + return 0; +} + +int saa7134_video_init2(struct saa7134_dev *dev) +{ + /* init video hw */ + set_tvnorm(dev,&tvnorms[0]); + video_mux(dev,0); + saa7134_tvaudio_setmute(dev); + saa7134_tvaudio_setvolume(dev,dev->ctl_volume); return 0; } diff -Nru a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h --- a/drivers/media/video/saa7134/saa7134.h Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/saa7134/saa7134.h Wed Oct 8 12:24:57 2003 @@ -18,20 +18,26 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include +#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,9) + #include #include #include #include +#include #include +#ifdef CONFIG_VIDEO_IR +#include "ir-common.h" +#endif + #include #include #include #include -#define SAA7134_VERSION_CODE KERNEL_VERSION(0,2,8) - #ifndef TRUE # define TRUE (1==1) #endif @@ -132,6 +138,11 @@ #define SAA7134_BOARD_TYPHOON_90031 13 #define SAA7134_BOARD_ELSA 14 #define SAA7134_BOARD_ELSA_500TV 15 +#define SAA7134_BOARD_ASUSTeK_TVFM7134 16 +#define SAA7134_BOARD_VA1000POWER 17 +#define SAA7134_BOARD_BMK_MPEX_NOTUNER 18 +#define SAA7134_BOARD_VIDEOMATE_TV 19 +#define SAA7134_BOARD_CRONOS_PLUS 20 #define SAA7134_INPUT_MAX 8 @@ -199,6 +210,7 @@ unsigned int exit; unsigned int scan1; unsigned int scan2; + unsigned int mode; }; /* buffer for one video/vbi/ts frame */ @@ -254,6 +266,7 @@ /* TS capture */ struct videobuf_queue ts; struct saa7134_pgtable pt_ts; + int started; }; /* oss dsp status */ @@ -285,6 +298,18 @@ unsigned int read_count; }; +#ifdef CONFIG_VIDEO_IR +/* IR input */ +struct saa7134_ir { + struct input_dev dev; + struct ir_input_state ir; + char name[32]; + char phys[32]; + u32 mask_keycode; + u32 mask_keydown; +}; +#endif + /* global device status */ struct saa7134_dev { struct list_head devlist; @@ -293,13 +318,19 @@ /* various device info */ unsigned int resources; - struct video_device video_dev; - struct video_device ts_dev; - struct video_device radio_dev; - struct video_device vbi_dev; + struct video_device *video_dev; + struct video_device *ts_dev; + struct video_device *radio_dev; + struct video_device *vbi_dev; struct saa7134_oss oss; struct saa7134_ts ts; + /* infrared remote */ + int has_remote; +#ifdef CONFIG_VIDEO_IR + struct saa7134_ir *remote; +#endif + /* pci i/o */ char name[32]; struct pci_dev *pci; @@ -310,6 +341,7 @@ /* config info */ unsigned int board; unsigned int tuner_type; + unsigned int gpio_value; /* i2c i/o */ struct i2c_adapter i2c_adap; @@ -371,7 +403,9 @@ #define saa_setb(reg,bit) saa_andorb((reg),(bit),(bit)) #define saa_clearb(reg,bit) saa_andorb((reg),(bit),0) -#define saa_wait(d) { if (need_resched()) schedule(); else udelay(d);} +//#define saa_wait(d) { if (need_resched()) schedule(); else udelay(d);} +#define saa_wait(d) { udelay(d); } +//#define saa_wait(d) { schedule_timeout(HZ*d/1000 ?:1); } /* ----------------------------------------------------------- */ /* saa7134-core.c */ @@ -432,7 +466,8 @@ int saa7134_common_ioctl(struct saa7134_dev *dev, unsigned int cmd, void *arg); -int saa7134_video_init(struct saa7134_dev *dev); +int saa7134_video_init1(struct saa7134_dev *dev); +int saa7134_video_init2(struct saa7134_dev *dev); int saa7134_video_fini(struct saa7134_dev *dev); void saa7134_irq_video_intl(struct saa7134_dev *dev); void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status); @@ -442,7 +477,7 @@ /* saa7134-ts.c */ extern struct video_device saa7134_ts_template; -int saa7134_ts_init(struct saa7134_dev *dev); +int saa7134_ts_init1(struct saa7134_dev *dev); int saa7134_ts_fini(struct saa7134_dev *dev); void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status); @@ -453,7 +488,7 @@ extern struct videobuf_queue_ops saa7134_vbi_qops; extern struct video_device saa7134_vbi_template; -int saa7134_vbi_init(struct saa7134_dev *dev); +int saa7134_vbi_init1(struct saa7134_dev *dev); int saa7134_vbi_fini(struct saa7134_dev *dev); void saa7134_irq_vbi_done(struct saa7134_dev *dev, unsigned long status); @@ -469,7 +504,7 @@ void saa7134_tvaudio_setvolume(struct saa7134_dev *dev, int level); int saa7134_tvaudio_getstereo(struct saa7134_dev *dev); -int saa7134_tvaudio_init(struct saa7134_dev *dev); +int saa7134_tvaudio_init2(struct saa7134_dev *dev); int saa7134_tvaudio_fini(struct saa7134_dev *dev); int saa7134_tvaudio_do_scan(struct saa7134_dev *dev); @@ -481,10 +516,16 @@ extern struct file_operations saa7134_dsp_fops; extern struct file_operations saa7134_mixer_fops; -int saa7134_oss_init(struct saa7134_dev *dev); +int saa7134_oss_init1(struct saa7134_dev *dev); int saa7134_oss_fini(struct saa7134_dev *dev); void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status); +/* ----------------------------------------------------------- */ +/* saa7134-input.c */ + +int saa7134_input_init1(struct saa7134_dev *dev); +void saa7134_input_fini(struct saa7134_dev *dev); +void saa7134_input_irq(struct saa7134_dev *dev); /* * Local variables: diff -Nru a/drivers/media/video/saa7185.c b/drivers/media/video/saa7185.c --- a/drivers/media/video/saa7185.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/saa7185.c Wed Oct 8 12:24:55 2003 @@ -24,8 +24,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include - #include #include #include @@ -45,7 +43,6 @@ #include #include -#include #include MODULE_DESCRIPTION("Philips SAA7185 video encoder driver"); diff -Nru a/drivers/media/video/stradis.c b/drivers/media/video/stradis.c --- a/drivers/media/video/stradis.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/stradis.c Wed Oct 8 12:24:57 2003 @@ -20,7 +20,6 @@ */ #include -#include #include #include #include diff -Nru a/drivers/media/video/tuner-3036.c b/drivers/media/video/tuner-3036.c --- a/drivers/media/video/tuner-3036.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/tuner-3036.c Wed Oct 8 12:24:56 2003 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include diff -Nru a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c --- a/drivers/media/video/v4l2-common.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/v4l2-common.c Wed Oct 8 12:24:57 2003 @@ -45,7 +45,6 @@ */ #include -#include #include #include #include diff -Nru a/drivers/media/video/video-buf.c b/drivers/media/video/video-buf.c --- a/drivers/media/video/video-buf.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/video-buf.c Wed Oct 8 12:24:56 2003 @@ -197,6 +197,20 @@ return 0; } +int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction, + dma_addr_t addr, int nr_pages) +{ + dprintk(1,"init overlay [%d pages @ bus 0x%lx]\n", + nr_pages,(unsigned long)addr); + dma->direction = direction; + if (0 == addr) + return -EINVAL; + + dma->bus_addr = addr; + dma->nr_pages = nr_pages; + return 0; +} + int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma) { int err; @@ -218,12 +232,23 @@ dma->sglist = videobuf_vmalloc_to_sg (dma->vmalloc,dma->nr_pages); } + if (dma->bus_addr) { + dma->sglist = kmalloc(sizeof(struct scatterlist), GFP_KERNEL); + if (NULL != dma->sglist) { + dma->sglen = 1; + sg_dma_address(&dma->sglist[0]) = dma->bus_addr & ~PAGE_MASK; + dma->sglist[0].offset = dma->bus_addr & PAGE_MASK; + sg_dma_len(&dma->sglist[0]) = dma->nr_pages * PAGE_SIZE; + } + } if (NULL == dma->sglist) { dprintk(1,"scatterlist is NULL\n"); return -ENOMEM; } - dma->sglen = pci_map_sg(dev,dma->sglist,dma->nr_pages, - dma->direction); + + if (!dma->bus_addr) + dma->sglen = pci_map_sg(dev,dma->sglist,dma->nr_pages, + dma->direction); return 0; } @@ -232,7 +257,8 @@ if (!dma->sglen) BUG(); - pci_dma_sync_sg(dev,dma->sglist,dma->nr_pages,dma->direction); + if (!dma->bus_addr) + pci_dma_sync_sg(dev,dma->sglist,dma->nr_pages,dma->direction); return 0; } @@ -241,7 +267,8 @@ if (!dma->sglen) return 0; - pci_unmap_sg(dev,dma->sglist,dma->nr_pages,dma->direction); + if (!dma->bus_addr) + pci_unmap_sg(dev,dma->sglist,dma->nr_pages,dma->direction); kfree(dma->sglist); dma->sglist = NULL; dma->sglen = 0; @@ -266,6 +293,9 @@ vfree(dma->vmalloc); dma->vmalloc = NULL; } + if (dma->bus_addr) { + dma->bus_addr = 0; + } dma->direction = PCI_DMA_NONE; return 0; } @@ -309,27 +339,48 @@ } int -videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb) +videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb, + struct v4l2_framebuffer *fbuf) { int err,pages; + dma_addr_t bus; - if (0 == vb->baddr) { - /* no userspace addr -- kernel bounce buffer */ + switch (vb->memory) { + case V4L2_MEMORY_MMAP: + case V4L2_MEMORY_USERPTR: + if (0 == vb->baddr) { + /* no userspace addr -- kernel bounce buffer */ + pages = PAGE_ALIGN(vb->size) >> PAGE_SHIFT; + err = videobuf_dma_init_kernel(&vb->dma,PCI_DMA_FROMDEVICE, + pages); + if (0 != err) + return err; + } else { + /* dma directly to userspace */ + err = videobuf_dma_init_user(&vb->dma,PCI_DMA_FROMDEVICE, + vb->baddr,vb->bsize); + if (0 != err) + return err; + } + break; + case V4L2_MEMORY_OVERLAY: + if (NULL == fbuf) + return -EINVAL; + /* FIXME: need sanity checks for vb->boff */ + bus = (dma_addr_t)fbuf->base + vb->boff; pages = PAGE_ALIGN(vb->size) >> PAGE_SHIFT; - err = videobuf_dma_init_kernel(&vb->dma,PCI_DMA_FROMDEVICE, - pages); - if (0 != err) - return err; - } else { - /* dma directly to userspace */ - err = videobuf_dma_init_user(&vb->dma,PCI_DMA_FROMDEVICE, - vb->baddr,vb->bsize); + err = videobuf_dma_init_overlay(&vb->dma,PCI_DMA_FROMDEVICE, + bus, pages); if (0 != err) return err; + break; + default: + BUG(); } err = videobuf_dma_pci_map(pci,&vb->dma); if (0 != err) return err; + return 0; } @@ -447,11 +498,26 @@ { b->index = vb->i; b->type = type; - b->m.offset = vb->boff; - b->length = vb->bsize; + + b->memory = vb->memory; + switch (b->memory) { + case V4L2_MEMORY_MMAP: + b->m.offset = vb->boff; + b->length = vb->bsize; + break; + case V4L2_MEMORY_USERPTR: + b->m.userptr = vb->baddr; + b->length = vb->bsize; + break; + case V4L2_MEMORY_OVERLAY: + b->m.offset = vb->boff; + break; + } + b->flags = 0; if (vb->map) b->flags |= V4L2_BUF_FLAG_MAPPED; + switch (vb->state) { case STATE_PREPARED: case STATE_QUEUED: @@ -467,6 +533,7 @@ /* nothing */ break; } + b->field = vb->field; b->timestamp = vb->ts; b->bytesused = vb->size; @@ -484,6 +551,10 @@ return -EINVAL; if (req->count < 1) return -EINVAL; + if (req->memory != V4L2_MEMORY_MMAP && + req->memory != V4L2_MEMORY_USERPTR && + req->memory != V4L2_MEMORY_OVERLAY) + return -EINVAL; down(&q->lock); count = req->count; @@ -495,10 +566,10 @@ dprintk(1,"reqbufs: bufs=%d, size=0x%x [%d pages total]\n", count, size, (count*size)>>PAGE_SHIFT); - retval = videobuf_mmap_setup(file,q,count,size); + retval = videobuf_mmap_setup(file,q,count,size,req->memory); if (retval < 0) goto done; - req->type = q->type; + req->count = count; done: @@ -540,12 +611,29 @@ buf = q->bufs[b->index]; if (NULL == buf) goto done; - if (0 == buf->baddr) + if (buf->memory != b->memory) goto done; if (buf->state == STATE_QUEUED || buf->state == STATE_ACTIVE) goto done; + switch (b->memory) { + case V4L2_MEMORY_MMAP: + if (0 == buf->baddr) + goto done; + break; + case V4L2_MEMORY_USERPTR: + if (b->length < buf->bsize) + goto done; + buf->baddr = b->m.userptr; + break; + case V4L2_MEMORY_OVERLAY: + buf->boff = b->m.offset; + break; + default: + goto done; + } + field = videobuf_next_field(q); retval = q->ops->buf_prepare(file,buf,field); if (0 != retval) @@ -663,8 +751,9 @@ if (NULL == q->read_buf) goto done; - q->read_buf->baddr = (unsigned long)data; - q->read_buf->bsize = count; + q->read_buf->memory = V4L2_MEMORY_USERPTR; + q->read_buf->baddr = (unsigned long)data; + q->read_buf->bsize = count; field = videobuf_next_field(q); retval = q->ops->buf_prepare(file,q->read_buf,field); if (0 != retval) @@ -719,6 +808,7 @@ q->read_buf = videobuf_alloc(q->msize); if (NULL == q->read_buf) goto done; + q->read_buf->memory = V4L2_MEMORY_USERPTR; field = videobuf_next_field(q); retval = q->ops->buf_prepare(file,q->read_buf,field); if (0 != retval) @@ -780,7 +870,7 @@ count = VIDEO_MAX_FRAME; size = PAGE_ALIGN(size); - err = videobuf_mmap_setup(file, q, count, size); + err = videobuf_mmap_setup(file, q, count, size, V4L2_MEMORY_USERPTR); if (err) return err; for (i = 0; i < count; i++) { @@ -850,31 +940,36 @@ break; } - if (vbihack) { - /* dirty, undocumented hack -- pass the frame counter - * within the last four bytes of each vbi data block. - * We need that one to maintain backward compatibility - * to all vbi decoding software out there ... */ - fc = (unsigned int*)q->read_buf->dma.vmalloc; - fc += (q->read_buf->size>>2) -1; - *fc = q->read_buf->field_count >> 1; - dprintk(1,"vbihack: %d\n",*fc); - } - - /* copy stuff */ - bytes = count; - if (bytes > q->read_buf->size - q->read_off) - bytes = q->read_buf->size - q->read_off; - if (copy_to_user(data + retval, - q->read_buf->dma.vmalloc + q->read_off, - bytes)) { - if (0 == retval) - retval = -EFAULT; - break; + if (q->read_buf->state == STATE_DONE) { + if (vbihack) { + /* dirty, undocumented hack -- pass the frame counter + * within the last four bytes of each vbi data block. + * We need that one to maintain backward compatibility + * to all vbi decoding software out there ... */ + fc = (unsigned int*)q->read_buf->dma.vmalloc; + fc += (q->read_buf->size>>2) -1; + *fc = q->read_buf->field_count >> 1; + dprintk(1,"vbihack: %d\n",*fc); + } + + /* copy stuff */ + bytes = count; + if (bytes > q->read_buf->size - q->read_off) + bytes = q->read_buf->size - q->read_off; + if (copy_to_user(data + retval, + q->read_buf->dma.vmalloc + q->read_off, + bytes)) { + if (0 == retval) + retval = -EFAULT; + break; + } + count -= bytes; + retval += bytes; + q->read_off += bytes; + } else { + /* some error -- skip buffer */ + q->read_off = q->read_buf->size; } - count -= bytes; - retval += bytes; - q->read_off += bytes; /* requeue buffer when done with copying */ if (q->read_off == q->read_buf->size) { @@ -1004,7 +1099,8 @@ }; int videobuf_mmap_setup(struct file *file, struct videobuf_queue *q, - unsigned int bcount, unsigned int bsize) + unsigned int bcount, unsigned int bsize, + enum v4l2_memory memory) { unsigned int i; int err; @@ -1012,12 +1108,21 @@ err = videobuf_mmap_free(file,q); if (0 != err) return err; - + for (i = 0; i < bcount; i++) { q->bufs[i] = videobuf_alloc(q->msize); - q->bufs[i]->i = i; - q->bufs[i]->boff = bsize * i; - q->bufs[i]->bsize = bsize; + q->bufs[i]->i = i; + q->bufs[i]->memory = memory; + q->bufs[i]->bsize = bsize; + switch (memory) { + case V4L2_MEMORY_MMAP: + q->bufs[i]->boff = bsize * i; + break; + case V4L2_MEMORY_USERPTR: + case V4L2_MEMORY_OVERLAY: + /* nothing */ + break; + }; } dprintk(1,"mmap setup: %d buffers, %d bytes each\n", bcount,bsize); @@ -1063,6 +1168,8 @@ for (first = 0; first < VIDEO_MAX_FRAME; first++) { if (NULL == q->bufs[first]) continue; + if (V4L2_MEMORY_MMAP != q->bufs[first]->memory) + continue; if (q->bufs[first]->boff == (vma->vm_pgoff << PAGE_SHIFT)) break; } @@ -1076,6 +1183,8 @@ for (size = 0, last = first; last < VIDEO_MAX_FRAME; last++) { if (NULL == q->bufs[last]) continue; + if (V4L2_MEMORY_MMAP != q->bufs[last]->memory) + continue; if (q->bufs[last]->map) { retval = -EBUSY; goto done; @@ -1124,6 +1233,7 @@ EXPORT_SYMBOL_GPL(videobuf_dma_init_user); EXPORT_SYMBOL_GPL(videobuf_dma_init_kernel); +EXPORT_SYMBOL_GPL(videobuf_dma_init_overlay); EXPORT_SYMBOL_GPL(videobuf_dma_pci_map); EXPORT_SYMBOL_GPL(videobuf_dma_pci_sync); EXPORT_SYMBOL_GPL(videobuf_dma_pci_unmap); diff -Nru a/drivers/media/video/videocodec.c b/drivers/media/video/videocodec.c --- a/drivers/media/video/videocodec.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/videocodec.c Wed Oct 8 12:24:56 2003 @@ -29,7 +29,6 @@ #define VIDEOCODEC_VERSION "v0.2" -#include #include #include #include diff -Nru a/drivers/media/video/videodev.c b/drivers/media/video/videodev.c --- a/drivers/media/video/videodev.c Wed Oct 8 12:24:55 2003 +++ b/drivers/media/video/videodev.c Wed Oct 8 12:24:55 2003 @@ -15,7 +15,6 @@ * - Added procfs support */ -#include #include #include #include @@ -27,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -52,7 +50,7 @@ { struct video_device *vfd = container_of(cd, struct video_device, class_dev); dev_t dev = MKDEV(VIDEO_MAJOR, vfd->minor); - return sprintf(buf,"%04x\n",old_encode_dev(dev)); + return print_dev_t(buf,dev); } static CLASS_DEVICE_ATTR(name, S_IRUGO, show_name, NULL); diff -Nru a/drivers/media/video/vpx3220.c b/drivers/media/video/vpx3220.c --- a/drivers/media/video/vpx3220.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/vpx3220.c Wed Oct 8 12:24:57 2003 @@ -18,7 +18,6 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include #include #include diff -Nru a/drivers/media/video/zoran_card.c b/drivers/media/video/zoran_card.c --- a/drivers/media/video/zoran_card.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/zoran_card.c Wed Oct 8 12:24:57 2003 @@ -28,7 +28,6 @@ */ #include -#include #include #include #include diff -Nru a/drivers/media/video/zoran_device.c b/drivers/media/video/zoran_device.c --- a/drivers/media/video/zoran_device.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/zoran_device.c Wed Oct 8 12:24:56 2003 @@ -28,7 +28,6 @@ */ #include -#include #include #include #include diff -Nru a/drivers/media/video/zoran_procfs.c b/drivers/media/video/zoran_procfs.c --- a/drivers/media/video/zoran_procfs.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/zoran_procfs.c Wed Oct 8 12:24:57 2003 @@ -28,7 +28,6 @@ */ #include -#include #include #include #include diff -Nru a/drivers/media/video/zr36120.c b/drivers/media/video/zr36120.c --- a/drivers/media/video/zr36120.c Wed Oct 8 12:24:56 2003 +++ b/drivers/media/video/zr36120.c Wed Oct 8 12:24:56 2003 @@ -36,7 +36,6 @@ #include #include -#include #include #include "tuner.h" diff -Nru a/drivers/media/video/zr36120_i2c.c b/drivers/media/video/zr36120_i2c.c --- a/drivers/media/video/zr36120_i2c.c Wed Oct 8 12:24:57 2003 +++ b/drivers/media/video/zr36120_i2c.c Wed Oct 8 12:24:57 2003 @@ -22,7 +22,6 @@ #include #include -#include #include #include diff -Nru a/drivers/mtd/chips/cfi_cmdset_0020.c b/drivers/mtd/chips/cfi_cmdset_0020.c --- a/drivers/mtd/chips/cfi_cmdset_0020.c Wed Oct 8 12:24:56 2003 +++ b/drivers/mtd/chips/cfi_cmdset_0020.c Wed Oct 8 12:24:56 2003 @@ -17,6 +17,7 @@ * - added a writev function */ +#include #include #include #include @@ -26,7 +27,6 @@ #include #include -#include #include #include #include @@ -208,6 +208,7 @@ if (!mtd->eraseregions) { printk(KERN_ERR "Failed to allocate memory for MTD erase region info\n"); kfree(cfi->cmdset_priv); + kfree(mtd); return NULL; } @@ -232,6 +233,7 @@ printk(KERN_WARNING "Sum of regions (%lx) != total size of set of interleaved chips (%lx)\n", offset, devsize); kfree(mtd->eraseregions); kfree(cfi->cmdset_priv); + kfree(mtd); return NULL; } diff -Nru a/drivers/mtd/chips/gen_probe.c b/drivers/mtd/chips/gen_probe.c --- a/drivers/mtd/chips/gen_probe.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mtd/chips/gen_probe.c Wed Oct 8 12:24:57 2003 @@ -11,7 +11,6 @@ #include #include #include -#include #include static struct mtd_info *check_cmd_set(struct map_info *, int); diff -Nru a/drivers/mtd/chips/map_rom.c b/drivers/mtd/chips/map_rom.c --- a/drivers/mtd/chips/map_rom.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mtd/chips/map_rom.c Wed Oct 8 12:24:57 2003 @@ -4,7 +4,6 @@ * $Id: map_rom.c,v 1.20 2003/05/28 12:51:49 dwmw2 Exp $ */ -#include #include #include #include diff -Nru a/drivers/mtd/chips/sharp.c b/drivers/mtd/chips/sharp.c --- a/drivers/mtd/chips/sharp.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mtd/chips/sharp.c Wed Oct 8 12:24:57 2003 @@ -22,7 +22,6 @@ #include #include -#include #include #include #include diff -Nru a/drivers/mtd/devices/lart.c b/drivers/mtd/devices/lart.c --- a/drivers/mtd/devices/lart.c Wed Oct 8 12:24:56 2003 +++ b/drivers/mtd/devices/lart.c Wed Oct 8 12:24:56 2003 @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #ifdef HAVE_PARTITIONS diff -Nru a/drivers/mtd/devices/pmc551.c b/drivers/mtd/devices/pmc551.c --- a/drivers/mtd/devices/pmc551.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mtd/devices/pmc551.c Wed Oct 8 12:24:57 2003 @@ -82,6 +82,7 @@ * * Comb the init routine. It's still a bit cludgy on a few things. */ +#include #include #include #include diff -Nru a/drivers/mtd/maps/integrator-flash.c b/drivers/mtd/maps/integrator-flash.c --- a/drivers/mtd/maps/integrator-flash.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mtd/maps/integrator-flash.c Wed Oct 8 12:24:57 2003 @@ -31,223 +31,181 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include -// board specific stuff - sorry, it should be in arch/arm/mach-*. -#ifdef CONFIG_ARCH_INTEGRATOR - -#define FLASH_BASE INTEGRATOR_FLASH_BASE -#define FLASH_SIZE INTEGRATOR_FLASH_SIZE - -#define FLASH_PART_SIZE 0x400000 - -#define SC_CTRLC (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET) -#define SC_CTRLS (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET) -#define EBI_CSR1 (IO_ADDRESS(INTEGRATOR_EBI_BASE) + INTEGRATOR_EBI_CSR1_OFFSET) -#define EBI_LOCK (IO_ADDRESS(INTEGRATOR_EBI_BASE) + INTEGRATOR_EBI_LOCK_OFFSET) - -/* - * Initialise the flash access systems: - * - Disable VPP - * - Assert WP - * - Set write enable bit in EBI reg - */ -static void armflash_flash_init(void) -{ - unsigned int tmp; - - __raw_writel(INTEGRATOR_SC_CTRL_nFLVPPEN | INTEGRATOR_SC_CTRL_nFLWP, SC_CTRLC); - - tmp = __raw_readl(EBI_CSR1) | INTEGRATOR_EBI_WRITE_ENABLE; - __raw_writel(tmp, EBI_CSR1); - - if (!(__raw_readl(EBI_CSR1) & INTEGRATOR_EBI_WRITE_ENABLE)) { - __raw_writel(0xa05f, EBI_LOCK); - __raw_writel(tmp, EBI_CSR1); - __raw_writel(0, EBI_LOCK); - } -} - -/* - * Shutdown the flash access systems: - * - Disable VPP - * - Assert WP - * - Clear write enable bit in EBI reg - */ -static void armflash_flash_exit(void) -{ - unsigned int tmp; - - __raw_writel(INTEGRATOR_SC_CTRL_nFLVPPEN | INTEGRATOR_SC_CTRL_nFLWP, SC_CTRLC); - - /* - * Clear the write enable bit in system controller EBI register. - */ - tmp = __raw_readl(EBI_CSR1) & ~INTEGRATOR_EBI_WRITE_ENABLE; - __raw_writel(tmp, EBI_CSR1); - - if (__raw_readl(EBI_CSR1) & INTEGRATOR_EBI_WRITE_ENABLE) { - __raw_writel(0xa05f, EBI_LOCK); - __raw_writel(tmp, EBI_CSR1); - __raw_writel(0, EBI_LOCK); - } -} - -static void armflash_flash_wp(int on) -{ - unsigned int reg; - - if (on) - reg = SC_CTRLC; - else - reg = SC_CTRLS; - - __raw_writel(INTEGRATOR_SC_CTRL_nFLWP, reg); -} - -static void armflash_set_vpp(struct map_info *map, int on) -{ - unsigned int reg; - - if (on) - reg = SC_CTRLS; - else - reg = SC_CTRLC; - - __raw_writel(INTEGRATOR_SC_CTRL_nFLVPPEN, reg); -} -#endif - #ifdef CONFIG_ARCH_P720T - #define FLASH_BASE (0x04000000) #define FLASH_SIZE (64*1024*1024) +#endif -#define FLASH_PART_SIZE (4*1024*1024) -#define FLASH_BLOCK_SIZE (128*1024) +struct armflash_info { + struct flash_platform_data *plat; + struct resource *res; + struct mtd_partition *parts; + struct mtd_info *mtd; + struct map_info map; +}; -static void armflash_flash_init(void) +static void armflash_set_vpp(struct map_info *map, int on) { -} + struct armflash_info *info = container_of(map, struct armflash_info, map); -static void armflash_flash_exit(void) -{ + if (info->plat && info->plat->set_vpp) + info->plat->set_vpp(on); } -static void armflash_flash_wp(int on) -{ -} +static const char *probes[] = { "RedBoot", "afs", NULL }; -static void armflash_set_vpp(struct map_info *map, int on) +static int armflash_probe(struct device *_dev) { -} -#endif + struct platform_device *dev = to_platform_device(_dev); + struct flash_platform_data *plat = dev->dev.platform_data; + struct resource *res = dev->resource; + unsigned int size = res->end - res->start + 1; + struct armflash_info *info; + int err; + void *base; + info = kmalloc(sizeof(struct armflash_info), GFP_KERNEL); + if (!info) { + err = -ENOMEM; + goto out; + } -static struct map_info armflash_map = -{ - .name = "AFS", - .set_vpp = armflash_set_vpp, - .phys = FLASH_BASE, -}; + memset(info, 0, sizeof(struct armflash_info)); -static struct mtd_info *mtd; -static struct mtd_partition *parts; -static const char *probes[] = { "RedBoot", "afs", NULL }; + info->plat = plat; + if (plat && plat->init) { + err = plat->init(); + if (err) + goto no_resource; + } -static int __init armflash_cfi_init(void *base, u_int size) -{ - int ret; + info->res = request_mem_region(res->start, size, "armflash"); + if (!info->res) { + err = -EBUSY; + goto no_resource; + } - armflash_flash_init(); - armflash_flash_wp(1); + base = ioremap(res->start, size); + if (!base) { + err = -ENOMEM; + goto no_mem; + } /* * look for CFI based flash parts fitted to this board */ - armflash_map.size = size; - armflash_map.buswidth = 4; - armflash_map.virt = (unsigned long) base; + info->map.size = size; + info->map.buswidth = plat->width; + info->map.phys = res->start; + info->map.virt = (unsigned long) base; + info->map.name = dev->dev.bus_id; + info->map.set_vpp = armflash_set_vpp; - simple_map_init(&armflash_map); + simple_map_init(&info->map); /* * Also, the CFI layer automatically works out what size * of chips we have, and does the necessary identification * for us automatically. */ - mtd = do_map_probe("cfi_probe", &armflash_map); - if (!mtd) - return -ENXIO; - - mtd->owner = THIS_MODULE; - - ret = parse_mtd_partitions(mtd, probes, &parts, (void *)0); - if (ret > 0) { - ret = add_mtd_partitions(mtd, parts, ret); - if (ret) - printk(KERN_ERR "mtd partition registration " - "failed: %d\n", ret); + info->mtd = do_map_probe(plat->map_name, &info->map); + if (!info->mtd) { + err = -ENXIO; + goto no_device; } + info->mtd->owner = THIS_MODULE; + + err = parse_mtd_partitions(info->mtd, probes, &info->parts, 0); + if (err > 0) { + err = add_mtd_partitions(info->mtd, info->parts, err); + if (err) + printk(KERN_ERR + "mtd partition registration failed: %d\n", err); + } + + if (err == 0) + dev_set_drvdata(&dev->dev, info); + /* * If we got an error, free all resources. */ - if (ret < 0) { - del_mtd_partitions(mtd); - map_destroy(mtd); - } + if (err < 0) { + if (info->mtd) { + del_mtd_partitions(info->mtd); + map_destroy(info->mtd); + } + if (info->parts) + kfree(info->parts); - return ret; -} - -static void armflash_cfi_exit(void) -{ - if (mtd) { - del_mtd_partitions(mtd); - map_destroy(mtd); + no_device: + iounmap(base); + no_mem: + release_mem_region(res->start, size); + no_resource: + if (plat && plat->exit) + plat->exit(); + kfree(info); } - if (parts) - kfree(parts); + out: + return err; } -static int __init armflash_init(void) +static int armflash_remove(struct device *_dev) { - int err = -EBUSY; - void *base; + struct platform_device *dev = to_platform_device(_dev); + struct armflash_info *info = dev_get_drvdata(&dev->dev); - if (request_mem_region(FLASH_BASE, FLASH_SIZE, "flash") == NULL) - goto out; + dev_set_drvdata(&dev->dev, NULL); - base = ioremap(FLASH_BASE, FLASH_SIZE); - err = -ENOMEM; - if (base == NULL) - goto release; + if (info) { + if (info->mtd) { + del_mtd_partitions(info->mtd); + map_destroy(info->mtd); + } + if (info->parts) + kfree(info->parts); - err = armflash_cfi_init(base, FLASH_SIZE); - if (err) { - iounmap(base); -release: - release_mem_region(FLASH_BASE, FLASH_SIZE); + iounmap((void *)info->map.virt); + release_resource(info->res); + kfree(info->res); + + if (info->plat && info->plat->exit) + info->plat->exit(); + + kfree(info); } -out: - return err; + + return 0; +} + +static struct device_driver armflash_driver = { + .name = "armflash", + .bus = &platform_bus_type, + .probe = armflash_probe, + .remove = armflash_remove, +}; + +static int __init armflash_init(void) +{ + return driver_register(&armflash_driver); } static void __exit armflash_exit(void) { - armflash_cfi_exit(); - iounmap((void *)armflash_map.virt); - release_mem_region(FLASH_BASE, FLASH_SIZE); - armflash_flash_exit(); + driver_unregister(&armflash_driver); } module_init(armflash_init); diff -Nru a/drivers/mtd/maps/sun_uflash.c b/drivers/mtd/maps/sun_uflash.c --- a/drivers/mtd/maps/sun_uflash.c Wed Oct 8 12:24:57 2003 +++ b/drivers/mtd/maps/sun_uflash.c Wed Oct 8 12:24:57 2003 @@ -12,7 +12,6 @@ #include #include -#include #include #include #include diff -Nru a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c --- a/drivers/mtd/mtdcore.c Wed Oct 8 12:24:56 2003 +++ b/drivers/mtd/mtdcore.c Wed Oct 8 12:24:56 2003 @@ -6,6 +6,7 @@ * */ +#include #include #include #include diff -Nru a/drivers/mtd/nand/autcpu12.c b/drivers/mtd/nand/autcpu12.c --- a/drivers/mtd/nand/autcpu12.c Wed Oct 8 12:24:55 2003 +++ b/drivers/mtd/nand/autcpu12.c Wed Oct 8 12:24:55 2003 @@ -27,6 +27,7 @@ * 10-06-2002 TG 128K card support added */ +#include #include #include #include diff -Nru a/drivers/net/3c523.c b/drivers/net/3c523.c --- a/drivers/net/3c523.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/3c523.c Wed Oct 8 12:24:56 2003 @@ -102,7 +102,7 @@ #include #include #include -#include +#include #include #include diff -Nru a/drivers/net/3c527.c b/drivers/net/3c527.c --- a/drivers/net/3c527.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/3c527.c Wed Oct 8 12:24:57 2003 @@ -92,7 +92,7 @@ #include #include #include -#include +#include #include #include #include diff -Nru a/drivers/net/Kconfig b/drivers/net/Kconfig --- a/drivers/net/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/net/Kconfig Wed Oct 8 12:24:57 2003 @@ -8,32 +8,18 @@ bool "Network device support" ---help--- You can say N here if you don't intend to connect your Linux box to - any other computer at all or if all your connections will be over a - telephone line with a modem either via UUCP (UUCP is a protocol to - forward mail and news between unix hosts over telephone lines; read - the UUCP-HOWTO, available from - ) or dialing up a shell - account or a BBS, even using term (term is a program which gives you - almost full Internet connectivity if you have a regular dial up - shell account on some Internet connected Unix computer. Read - ). + any other computer at all. You'll have to say Y if your computer contains a network card that - you want to use under Linux (make sure you know its name because you - will be asked for it and read the Ethernet-HOWTO (especially if you - plan to use more than one network card under Linux)) or if you want - to use SLIP (Serial Line Internet Protocol is the protocol used to - send Internet traffic over telephone lines or null modem cables) or - CSLIP (compressed SLIP) or PPP (Point to Point Protocol, a better - and newer replacement for SLIP) or PLIP (Parallel Line Internet - Protocol is mainly used to create a mini network by connecting the - parallel ports of two local machines) or AX.25/KISS (protocol for - sending Internet traffic over amateur radio links). - - Make sure to read the NET-3-HOWTO. Eventually, you will have to read - Olaf Kirch's excellent and free book "Network Administrator's - Guide", to be found in . If - unsure, say Y. + you want to use under Linux. If you are going to run SLIP or PPP over + telephone line or null modem cable you need say Y here. Connecting + two machines with parallel ports using PLIP needs this, as well as + AX.25/KISS for sending Internet traffic over amateur radio links. + + See also "The Linux Network Administrator's Guide" by Olaf Kirch and + Terry Dawson. Available at . + + If unsure, say Y. if NETDEVICES source "drivers/net/arcnet/Kconfig" @@ -332,7 +318,7 @@ config MAC89x0 tristate "Macintosh CS89x0 based ethernet cards" - depends on NETDEVICES && MAC + depends on NETDEVICES && MAC && BROKEN ---help--- Support for CS89x0 chipset based Ethernet cards. If you have a Nubus or LC-PDS network (Ethernet) card of this type, say Y and @@ -405,7 +391,7 @@ config ATARI_BIONET tristate "BioNet-100 support" - depends on NETDEVICES && ATARI && ATARI_ACSI!=n + depends on NETDEVICES && ATARI && ATARI_ACSI!=n && BROKEN help Say Y to include support for BioData's BioNet-100 Ethernet adapter for the ACSI port. The driver works (has to work...) with a polled @@ -413,7 +399,7 @@ config ATARI_PAMSNET tristate "PAMsNet support" - depends on NETDEVICES && ATARI && ATARI_ACSI!=n + depends on NETDEVICES && ATARI && ATARI_ACSI!=n && BROKEN help Say Y to include support for the PAMsNet Ethernet adapter for the ACSI port ("ACSI node"). The driver works (has to work...) with a @@ -808,7 +794,7 @@ config SMC9194 tristate "SMC 9194 support" - depends on NET_VENDOR_SMC && (ISA || MAC) + depends on NET_VENDOR_SMC && (ISA || MAC && BROKEN) select CRC32 ---help--- This is support for the SMC9xxx based Ethernet cards. Choose this diff -Nru a/drivers/net/Space.c b/drivers/net/Space.c --- a/drivers/net/Space.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/Space.c Wed Oct 8 12:24:55 2003 @@ -67,7 +67,6 @@ extern int ac3200_probe(struct net_device *); extern int es_probe(struct net_device *); extern int lne390_probe(struct net_device *); -extern int ne3210_probe(struct net_device *); extern int e2100_probe(struct net_device *); extern int ni5010_probe(struct net_device *); extern int ni52_probe(struct net_device *); @@ -155,9 +154,6 @@ #ifdef CONFIG_LNE390 {lne390_probe, 0}, #endif -#ifdef CONFIG_NE3210 - {ne3210_probe, 0}, -#endif {NULL, 0}, }; @@ -480,3 +476,5 @@ struct net_device *dev_base; rwlock_t dev_base_lock = RW_LOCK_UNLOCKED; +EXPORT_SYMBOL(dev_base); +EXPORT_SYMBOL(dev_base_lock); diff -Nru a/drivers/net/arcnet/com20020-isa.c b/drivers/net/arcnet/com20020-isa.c --- a/drivers/net/arcnet/com20020-isa.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/arcnet/com20020-isa.c Wed Oct 8 12:24:55 2003 @@ -53,6 +53,7 @@ int ioaddr; unsigned long airqmask; struct arcnet_local *lp = dev->priv; + int err; BUGLVL(D_NORMAL) printk(VERSION); @@ -62,17 +63,20 @@ "must specify the base address!\n"); return -ENODEV; } - if (check_region(ioaddr, ARCNET_TOTAL_SIZE)) { + if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (COM20020)")) { BUGMSG(D_NORMAL, "IO region %xh-%xh already allocated.\n", ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1); return -ENXIO; } if (ASTATUS() == 0xFF) { BUGMSG(D_NORMAL, "IO address %x empty\n", ioaddr); - return -ENODEV; + err = -ENODEV; + goto out; + } + if (com20020_check(dev)) { + err = -ENODEV; + goto out; } - if (com20020_check(dev)) - return -ENODEV; if (!dev->irq) { /* if we do this, we're sure to get an IRQ since the @@ -96,13 +100,21 @@ dev->irq = probe_irq_off(airqmask); if (dev->irq <= 0) { BUGMSG(D_NORMAL, "Autoprobe IRQ failed.\n"); - return -ENODEV; + err = -ENODEV; + goto out; } } } lp->card_name = "ISA COM20020"; - return com20020_found(dev, 0); + if ((err = com20020_found(dev, 0)) != 0) + goto out; + + return 0; + +out: + release_region(ioaddr, ARCNET_TOTAL_SIZE); + return err; } @@ -170,6 +182,7 @@ void cleanup_module(void) { com20020_remove(my_dev); + release_region(my_dev->base_addr, ARCNET_TOTAL_SIZE); } #else diff -Nru a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c --- a/drivers/net/arcnet/com20020-pci.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/arcnet/com20020-pci.c Wed Oct 8 12:24:55 2003 @@ -115,20 +115,20 @@ BUGMSG(D_NORMAL, "IO address %Xh was reported by PCI BIOS, " "but seems empty!\n", ioaddr); err = -EIO; - goto out_priv; + goto out_port; } if (com20020_check(dev)) { err = -EIO; - goto out_priv; + goto out_port; } - release_region(ioaddr, ARCNET_TOTAL_SIZE); - if ((err = com20020_found(dev, SA_SHIRQ)) != 0) - goto out_priv; + goto out_port; return 0; +out_port: + release_region(ioaddr, ARCNET_TOTAL_SIZE); out_priv: kfree(dev->priv); out_dev: @@ -138,7 +138,9 @@ static void __devexit com20020pci_remove(struct pci_dev *pdev) { - com20020_remove(pci_get_drvdata(pdev)); + struct net_device *dev = pci_get_drvdata(pdev); + com20020_remove(dev); + release_region(dev->base_addr, ARCNET_TOTAL_SIZE); } static struct pci_device_id com20020pci_id_table[] = { diff -Nru a/drivers/net/arcnet/com20020.c b/drivers/net/arcnet/com20020.c --- a/drivers/net/arcnet/com20020.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/arcnet/com20020.c Wed Oct 8 12:24:56 2003 @@ -180,10 +180,6 @@ if (!dev->dev_addr[0]) dev->dev_addr[0] = inb(ioaddr + 8); /* FIXME: do this some other way! */ - /* reserve the I/O region */ - if (!request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (COM20020)")) - return -EBUSY; - SET_SUBADR(SUB_SETUP1); outb(lp->setup, _XREG); @@ -207,7 +203,6 @@ if (request_irq(dev->irq, &arcnet_interrupt, shared, "arcnet (COM20020)", dev)) { BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq); - release_region(ioaddr, ARCNET_TOTAL_SIZE); return -ENODEV; } @@ -227,7 +222,6 @@ clockrates[3 - ((lp->setup2 & 0xF0) >> 4) + ((lp->setup & 0x0F) >> 1)]); if (!dev->init && register_netdev(dev)) { - release_region(ioaddr, ARCNET_TOTAL_SIZE); free_irq(dev->irq, dev); return -EIO; } @@ -342,7 +336,6 @@ { unregister_netdev(dev); free_irq(dev->irq, dev); - release_region(dev->base_addr, ARCNET_TOTAL_SIZE); kfree(dev->priv); free_netdev(dev); } diff -Nru a/drivers/net/at1700.c b/drivers/net/at1700.c --- a/drivers/net/at1700.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/at1700.c Wed Oct 8 12:24:56 2003 @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include #include diff -Nru a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c --- a/drivers/net/bonding/bond_alb.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/bonding/bond_alb.c Wed Oct 8 12:24:57 2003 @@ -888,7 +888,6 @@ pk_type->type = __constant_htons(ETH_P_ARP); pk_type->dev = bond->device; pk_type->func = rlb_arp_recv; - pk_type->data = PKT_CAN_SHARE_SKB; dev_add_pack(pk_type); diff -Nru a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c --- a/drivers/net/bonding/bond_main.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/bonding/bond_main.c Wed Oct 8 12:24:57 2003 @@ -955,7 +955,6 @@ pk_type->type = PKT_TYPE_LACPDU; pk_type->dev = bond->device; pk_type->func = bond_3ad_lacpdu_recv; - pk_type->data = PKT_CAN_SHARE_SKB; dev_add_pack(pk_type); } diff -Nru a/drivers/net/eexpress.c b/drivers/net/eexpress.c --- a/drivers/net/eexpress.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/eexpress.c Wed Oct 8 12:24:55 2003 @@ -113,7 +113,6 @@ #include #include #include -#include #include #include diff -Nru a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c --- a/drivers/net/hamradio/bpqether.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/hamradio/bpqether.c Wed Oct 8 12:24:56 2003 @@ -171,16 +171,20 @@ { int len; char * ptr; - struct ethhdr *eth = (struct ethhdr *)skb->mac.raw; + struct ethhdr *eth; struct bpqdev *bpq; - skb->sk = NULL; /* Initially we don't know who it's for */ + if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) + return NET_RX_DROP; + + if (!pskb_may_pull(skb, sizeof(struct ethhdr))) + goto drop; rcu_read_lock(); dev = bpq_get_ax25_dev(dev); if (dev == NULL || !netif_running(dev)) - goto drop; + goto drop_unlock; /* * if we want to accept frames from just one ethernet device @@ -189,11 +193,19 @@ bpq = (struct bpqdev *)dev->priv; - if (!(bpq->acpt_addr[0] & 0x01) && memcmp(eth->h_source, bpq->acpt_addr, ETH_ALEN)) { - printk(KERN_DEBUG "bpqether: wrong dest %s\n", bpq_print_ethaddr(eth->h_source)); - goto drop; + eth = (struct ethhdr *)skb->mac.raw; + + if (!(bpq->acpt_addr[0] & 0x01) && + memcmp(eth->h_source, bpq->acpt_addr, ETH_ALEN)) { + if (net_ratelimit()) + printk(KERN_DEBUG "bpqether: wrong dest %s\n", + bpq_print_ethaddr(eth->h_source)); + goto drop_unlock; } + if (skb_cow(skb, sizeof(struct ethhdr))) + goto drop_unlock; + len = skb->data[0] + skb->data[1] * 256 - 5; skb_pull(skb, 2); /* Remove the length bytes */ @@ -212,15 +224,18 @@ netif_rx(skb); dev->last_rx = jiffies; - unlock: +unlock: rcu_read_unlock(); return 0; - drop: +drop_unlock: kfree_skb(skb); goto unlock; +drop: + kfree_skb(skb); + return 0; } /* diff -Nru a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c --- a/drivers/net/ibmlana.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/ibmlana.c Wed Oct 8 12:24:56 2003 @@ -82,7 +82,7 @@ #include #include #include -#include +#include #include #include #include diff -Nru a/drivers/net/irda/act200l.c b/drivers/net/irda/act200l.c --- a/drivers/net/irda/act200l.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/act200l.c Wed Oct 8 12:24:56 2003 @@ -84,12 +84,12 @@ #define ACT200L_OSCL 0x04 /* oscillator in low power, medium accuracy mode */ static struct dongle_reg dongle = { - Q_NULL, - IRDA_ACT200L_DONGLE, - act200l_open, - act200l_close, - act200l_reset, - act200l_change_speed, + .type = IRDA_ACT200L_DONGLE, + .open = act200l_open, + .close = act200l_close, + .reset = act200l_reset, + .change_speed = act200l_change_speed, + .owner = THIS_MODULE, }; int __init act200l_init(void) @@ -112,8 +112,6 @@ /* Set the speeds we can accept */ qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; qos->min_turn_time.bits = 0x03; - - MOD_INC_USE_COUNT; } static void act200l_close(dongle_t *self) @@ -122,8 +120,6 @@ /* Power off the dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/actisys.c b/drivers/net/irda/actisys.c --- a/drivers/net/irda/actisys.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/irda/actisys.c Wed Oct 8 12:24:57 2003 @@ -64,21 +64,21 @@ #define MAX_SPEEDS 5 static struct dongle_reg dongle = { - Q_NULL, - IRDA_ACTISYS_DONGLE, - actisys_open, - actisys_close, - actisys_reset, - actisys_change_speed, + .type = IRDA_ACTISYS_DONGLE, + .open = actisys_open, + .close = actisys_close, + .reset = actisys_reset, + .change_speed = actisys_change_speed, + .owner = THIS_MODULE, }; static struct dongle_reg dongle_plus = { - Q_NULL, - IRDA_ACTISYS_PLUS_DONGLE, - actisys_open, - actisys_close, - actisys_reset, - actisys_change_speed, + .type = IRDA_ACTISYS_PLUS_DONGLE, + .open = actisys_open, + .close = actisys_close, + .reset = actisys_reset, + .change_speed = actisys_change_speed, + .owner = THIS_MODULE, }; /* @@ -128,16 +128,12 @@ qos->baud_rate.bits &= ~IR_38400; qos->min_turn_time.bits = 0x7f; /* Needs 0.01 ms */ - - MOD_INC_USE_COUNT; } static void actisys_close(dongle_t *self) { /* Power off the dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/ali-ircc.c b/drivers/net/irda/ali-ircc.c --- a/drivers/net/irda/ali-ircc.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/ali-ircc.c Wed Oct 8 12:24:56 2003 @@ -254,7 +254,7 @@ if ((ali_ircc_setup(info)) == -1) return -1; - dev = alloc_netdev(sizeof(*self), "irda%d", irda_device_setup); + dev = alloc_irdadev(sizeof(*self)); if (dev == NULL) { ERROR("%s(), can't allocate memory for control block!\n", __FUNCTION__); return -ENOMEM; diff -Nru a/drivers/net/irda/donauboe.c b/drivers/net/irda/donauboe.c --- a/drivers/net/irda/donauboe.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/donauboe.c Wed Oct 8 12:24:56 2003 @@ -1598,8 +1598,7 @@ if ((err=pci_enable_device(pci_dev))) return err; - dev = alloc_netdev(sizeof (struct toshoboe_cb), "irda%d", - irda_device_setup); + dev = alloc_irdadev(sizeof (struct toshoboe_cb)); if (dev == NULL) { printk (KERN_ERR DRIVER_NAME ": can't allocate memory for " diff -Nru a/drivers/net/irda/ep7211_ir.c b/drivers/net/irda/ep7211_ir.c --- a/drivers/net/irda/ep7211_ir.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/irda/ep7211_ir.c Wed Oct 8 12:24:55 2003 @@ -24,12 +24,12 @@ static int ep7211_ir_reset(struct irda_task *task); static struct dongle_reg dongle = { - Q_NULL, - IRDA_EP7211_IR, - ep7211_ir_open, - ep7211_ir_close, - ep7211_ir_reset, - ep7211_ir_change_speed, + .type = IRDA_EP7211_IR, + .open = ep7211_ir_open, + .close = ep7211_ir_close, + .reset = ep7211_ir_reset, + .change_speed = ep7211_ir_change_speed, + .owner = THIS_MODULE, }; static void ep7211_ir_open(dongle_t *self, struct qos_info *qos) @@ -47,8 +47,6 @@ UART (interrupt #14). */ restore_flags(flags); - - MOD_INC_USE_COUNT; } static void ep7211_ir_close(dongle_t *self) @@ -66,8 +64,6 @@ reset them back to their original state. */ restore_flags(flags); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/esi.c b/drivers/net/irda/esi.c --- a/drivers/net/irda/esi.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/esi.c Wed Oct 8 12:24:56 2003 @@ -44,12 +44,12 @@ static int esi_reset(struct irda_task *task); static struct dongle_reg dongle = { - Q_NULL, - IRDA_ESI_DONGLE, - esi_open, - esi_close, - esi_reset, - esi_change_speed, + .type = IRDA_ESI_DONGLE, + .open = esi_open, + .close = esi_close, + .reset = esi_reset, + .change_speed = esi_change_speed, + .owner = THIS_MODULE, }; int __init esi_init(void) @@ -66,16 +66,12 @@ { qos->baud_rate.bits &= IR_9600|IR_19200|IR_115200; qos->min_turn_time.bits = 0x01; /* Needs at least 10 ms */ - - MOD_INC_USE_COUNT; } static void esi_close(dongle_t *dongle) { /* Power off dongle */ dongle->set_dtr_rts(dongle->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/girbil.c b/drivers/net/irda/girbil.c --- a/drivers/net/irda/girbil.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/irda/girbil.c Wed Oct 8 12:24:55 2003 @@ -63,12 +63,12 @@ #define GIRBIL_LOAD 0x51 /* Load the new baud rate value */ static struct dongle_reg dongle = { - Q_NULL, - IRDA_GIRBIL_DONGLE, - girbil_open, - girbil_close, - girbil_reset, - girbil_change_speed, + .type = IRDA_GIRBIL_DONGLE, + .open = girbil_open, + .close = girbil_close, + .reset = girbil_reset, + .change_speed = girbil_change_speed, + .owner = THIS_MODULE, }; int __init girbil_init(void) @@ -85,16 +85,12 @@ { qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; qos->min_turn_time.bits = 0x03; - - MOD_INC_USE_COUNT; } static void girbil_close(dongle_t *self) { /* Power off dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c --- a/drivers/net/irda/irda-usb.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/irda-usb.c Wed Oct 8 12:24:56 2003 @@ -1176,7 +1176,7 @@ memset(self->speed_buff, 0, IRDA_USB_SPEED_MTU); /* Create a network device for us */ - netdev = alloc_netdev(0, "irda%d", irda_device_setup); + netdev = alloc_irdadev(0); if (!netdev) { ERROR("%s(), alloc_net_dev() failed!\n", __FUNCTION__); return -ENOMEM; diff -Nru a/drivers/net/irda/irport.c b/drivers/net/irda/irport.c --- a/drivers/net/irda/irport.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/irda/irport.c Wed Oct 8 12:24:57 2003 @@ -78,7 +78,6 @@ static inline int irport_write(int iobase, int fifo_size, __u8 *buf, int len); static inline void irport_receive(struct irport_cb *self); -static int irport_net_init(struct net_device *dev); static int irport_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static inline int irport_is_receiving(struct irport_cb *self); @@ -136,30 +135,27 @@ { struct net_device *dev; struct irport_cb *self; - void *ret; - int err; IRDA_DEBUG(1, "%s()\n", __FUNCTION__); /* Lock the port that we need */ - ret = request_region(iobase, IO_EXTENT, driver_name); - if (!ret) { + if (!request_region(iobase, IO_EXTENT, driver_name)) { IRDA_DEBUG(0, "%s(), can't get iobase of 0x%03x\n", __FUNCTION__, iobase); - return NULL; + goto err_out1; } /* * Allocate new instance of the driver */ - self = kmalloc(sizeof(struct irport_cb), GFP_KERNEL); - if (!self) { + dev = alloc_irdadev(sizeof(struct irport_cb)); + if (!dev) { ERROR("%s(), can't allocate memory for " - "control block!\n", __FUNCTION__); - release_region(iobase, IO_EXTENT); - return NULL; + "irda device!\n", __FUNCTION__); + goto err_out2; } - memset(self, 0, sizeof(struct irport_cb)); + + self = dev->priv; spin_lock_init(&self->lock); /* Need to store self somewhere */ @@ -189,8 +185,11 @@ self->rx_buff.truesize = IRDA_SKB_MAX_MTU; self->rx_buff.skb = __dev_alloc_skb(self->rx_buff.truesize, GFP_KERNEL); - if (self->rx_buff.skb == NULL) - return NULL; + if (self->rx_buff.skb == NULL) { + ERROR("%s(), can't allocate memory for " + "receive buffer!\n", __FUNCTION__); + goto err_out3; + } skb_reserve(self->rx_buff.skb, 1); self->rx_buff.head = self->rx_buff.skb->data; /* No need to memset the buffer, unless you are really pedantic */ @@ -208,30 +207,23 @@ self->tx_buff.head = (__u8 *) kmalloc(self->tx_buff.truesize, GFP_KERNEL); if (self->tx_buff.head == NULL) { - kfree_skb(self->rx_buff.skb); - self->rx_buff.skb = NULL; - self->rx_buff.head = NULL; - return NULL; + ERROR("%s(), can't allocate memory for " + "transmit buffer!\n", __FUNCTION__); + goto err_out4; } memset(self->tx_buff.head, 0, self->tx_buff.truesize); } self->tx_buff.data = self->tx_buff.head; - if (!(dev = dev_alloc("irda%d", &err))) { - ERROR("%s(), dev_alloc() failed!\n", __FUNCTION__); - return NULL; - } self->netdev = dev; /* Keep track of module usage */ SET_MODULE_OWNER(dev); /* May be overridden by piggyback drivers */ - dev->priv = (void *) self; self->interrupt = irport_interrupt; self->change_speed = irport_change_speed; /* Override the network functions we need to use */ - dev->init = irport_net_init; dev->hard_start_xmit = irport_hard_xmit; dev->tx_timeout = irport_timeout; dev->watchdog_timeo = HZ; /* Allow time enough for speed change */ @@ -244,17 +236,25 @@ dev->base_addr = iobase; dev->irq = irq; - rtnl_lock(); - err = register_netdevice(dev); - rtnl_unlock(); - if (err) { + if (register_netdev(dev)) { ERROR("%s(), register_netdev() failed!\n", __FUNCTION__); - return NULL; + goto err_out5; } MESSAGE("IrDA: Registered device %s (irport io=0x%X irq=%d)\n", dev->name, iobase, irq); return self; + err_out5: + kfree(self->tx_buff.head); + err_out4: + kfree_skb(self->rx_buff.skb); + err_out3: + free_netdev(dev); + dev_self[i] = NULL; + err_out2: + release_region(iobase, IO_EXTENT); + err_out1: + return NULL; } int irport_close(struct irport_cb *self) @@ -267,8 +267,7 @@ self->dongle = NULL; /* Remove netdevice */ - if (self->netdev) - unregister_netdev(self->netdev); + unregister_netdev(self->netdev); /* Release the IO-port that this driver is using */ IRDA_DEBUG(0 , "%s(), Releasing Region %03x\n", @@ -284,7 +283,7 @@ /* Remove ourselves */ dev_self[self->index] = NULL; - kfree(self); + free_netdev(self->netdev); return 0; } @@ -884,16 +883,6 @@ spin_unlock(&self->lock); return IRQ_RETVAL(handled); -} - -static int irport_net_init(struct net_device *dev) -{ - /* Set up to be a normal IrDA network device driver */ - irda_device_setup(dev); - - /* Insert overrides below this line! */ - - return 0; } /* diff -Nru a/drivers/net/irda/litelink.c b/drivers/net/irda/litelink.c --- a/drivers/net/irda/litelink.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/litelink.c Wed Oct 8 12:24:56 2003 @@ -48,12 +48,12 @@ static __u32 baud_rates[] = { 115200, 57600, 38400, 19200, 9600 }; static struct dongle_reg dongle = { - Q_NULL, - IRDA_LITELINK_DONGLE, - litelink_open, - litelink_close, - litelink_reset, - litelink_change_speed, + .type = IRDA_LITELINK_DONGLE, + .open = litelink_open, + .close = litelink_close, + .reset = litelink_reset, + .change_speed = litelink_change_speed, + .owner = THIS_MODULE, }; int __init litelink_init(void) @@ -70,16 +70,12 @@ { qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; qos->min_turn_time.bits = 0x7f; /* Needs 0.01 ms */ - - MOD_INC_USE_COUNT; } static void litelink_close(dongle_t *self) { /* Power off dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/ma600.c b/drivers/net/irda/ma600.c --- a/drivers/net/irda/ma600.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/ma600.c Wed Oct 8 12:24:56 2003 @@ -74,12 +74,12 @@ #define MA600_2400 0x08 static struct dongle_reg dongle = { - Q_NULL, - IRDA_MA600_DONGLE, - ma600_open, - ma600_close, - ma600_reset, - ma600_change_speed, + .type = IRDA_MA600_DONGLE, + .open = ma600_open, + .close = ma600_close, + .reset = ma600_reset, + .change_speed = ma600_change_speed, + .owner = THIS_MODULE, }; int __init ma600_init(void) @@ -115,8 +115,6 @@ self->set_dtr_rts(self->dev, TRUE, TRUE); // should wait 1 second - - MOD_INC_USE_COUNT; } static void ma600_close(dongle_t *self) @@ -125,8 +123,6 @@ /* Power off dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } static __u8 get_control_byte(__u32 speed) diff -Nru a/drivers/net/irda/mcp2120.c b/drivers/net/irda/mcp2120.c --- a/drivers/net/irda/mcp2120.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/irda/mcp2120.c Wed Oct 8 12:24:57 2003 @@ -40,12 +40,12 @@ #define MCP2120_COMMIT 0x11 static struct dongle_reg dongle = { - Q_NULL, - IRDA_MCP2120_DONGLE, - mcp2120_open, - mcp2120_close, - mcp2120_reset, - mcp2120_change_speed, + .type = IRDA_MCP2120_DONGLE, + .open = mcp2120_open, + .close = mcp2120_close, + .reset = mcp2120_reset, + .change_speed = mcp2120_change_speed, + .owner = THIS_MODULE, }; int __init mcp2120_init(void) @@ -62,8 +62,6 @@ { qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; qos->min_turn_time.bits = 0x01; - - MOD_INC_USE_COUNT; } static void mcp2120_close(dongle_t *self) @@ -72,8 +70,6 @@ /* reset and inhibit mcp2120 */ self->set_dtr_rts(self->dev, TRUE, TRUE); //self->set_dtr_rts(self->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/nsc-ircc.c b/drivers/net/irda/nsc-ircc.c --- a/drivers/net/irda/nsc-ircc.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/irda/nsc-ircc.c Wed Oct 8 12:24:55 2003 @@ -260,8 +260,7 @@ MESSAGE("%s, driver loaded (Dag Brattli)\n", driver_name); - dev = alloc_netdev(sizeof(struct nsc_ircc_cb), "irda%d", - irda_device_setup); + dev = alloc_irdadev(sizeof(struct nsc_ircc_cb)); if (dev == NULL) { ERROR("%s(), can't allocate memory for " "control block!\n", __FUNCTION__); diff -Nru a/drivers/net/irda/old_belkin.c b/drivers/net/irda/old_belkin.c --- a/drivers/net/irda/old_belkin.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/irda/old_belkin.c Wed Oct 8 12:24:57 2003 @@ -74,12 +74,12 @@ /* static __u32 baud_rates[] = { 9600 }; */ static struct dongle_reg dongle = { - Q_NULL, - IRDA_OLD_BELKIN_DONGLE, - old_belkin_open, - old_belkin_close, - old_belkin_reset, - old_belkin_change_speed, + .type = IRDA_OLD_BELKIN_DONGLE, + .open = old_belkin_open, + .close = old_belkin_close, + .reset = old_belkin_reset, + .change_speed = old_belkin_change_speed, + .owner = THIS_MODULE, }; int __init old_belkin_init(void) @@ -98,16 +98,12 @@ qos->baud_rate.bits &= IR_9600; /* Needs at least 10 ms (totally wild guess, can do probably better) */ qos->min_turn_time.bits = 0x01; - - MOD_INC_USE_COUNT; } static void old_belkin_close(dongle_t *self) { /* Power off dongle */ self->set_dtr_rts(self->dev, FALSE, FALSE); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/sir_dev.c b/drivers/net/irda/sir_dev.c --- a/drivers/net/irda/sir_dev.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/irda/sir_dev.c Wed Oct 8 12:24:57 2003 @@ -538,28 +538,6 @@ /* ----------------------------------------------------------------------------- */ -static int sirdev_init(struct net_device *ndev) -{ - struct sir_dev *dev = ndev->priv; - - SET_MODULE_OWNER(ndev); - - /* Set up to be a normal IrDA network device driver */ - irda_device_setup(ndev); - - dev->flags = IFF_SIR | IFF_PIO; - - /* Override the network functions we need to use */ - ndev->hard_start_xmit = sirdev_hard_xmit; - ndev->open = sirdev_open; - ndev->stop = sirdev_close; - ndev->get_stats = sirdev_get_stats; - ndev->do_ioctl = sirdev_ioctl; - - return 0; -} - - struct sir_dev * sirdev_get_instance(const struct sir_driver *drv, const char *name) { struct net_device *ndev; @@ -577,12 +555,12 @@ /* * Allocate new instance of the device */ - dev = kmalloc(sizeof(*dev), GFP_KERNEL); - if (dev == NULL) { + ndev = alloc_irdadev(sizeof(*dev)); + if (ndev == NULL) { ERROR("%s - Can't allocate memory for IrDA control block!\n", __FUNCTION__); goto out; } - memset(dev, 0, sizeof(*dev)); + dev = ndev->priv; irda_init_max_qos_capabilies(&dev->qos); dev->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; @@ -591,11 +569,6 @@ strncpy(dev->hwname, name, sizeof(dev->hwname)-1); - ndev = kmalloc(sizeof(*ndev), GFP_KERNEL); - if (ndev == NULL) - goto out_freedev; - memset(ndev, 0, sizeof(*ndev)); - atomic_set(&dev->enable_rx, 0); dev->tx_skb = NULL; @@ -609,10 +582,17 @@ dev->drv = drv; dev->netdev = ndev; - ndev->priv = (void *) dev; - ndev->init = sirdev_init; + SET_MODULE_OWNER(ndev); + + dev->flags = IFF_SIR | IFF_PIO; + + /* Override the network functions we need to use */ + ndev->hard_start_xmit = sirdev_hard_xmit; + ndev->open = sirdev_open; + ndev->stop = sirdev_close; + ndev->get_stats = sirdev_get_stats; + ndev->do_ioctl = sirdev_ioctl; - strcpy(ndev->name, "irda%d"); if (register_netdev(ndev)) { ERROR("%s(), register_netdev() failed!\n", __FUNCTION__); goto out_freenetdev; @@ -621,9 +601,7 @@ return dev; out_freenetdev: - kfree(ndev); -out_freedev: - kfree(dev); + free_netdev(ndev); out: return NULL; } @@ -653,10 +631,9 @@ up(&dev->fsm.sem); /* Remove netdevice */ - if (dev->netdev) - unregister_netdev(dev->netdev); + unregister_netdev(dev->netdev); - kfree(dev); + free_netdev(dev->netdev); return 0; } diff -Nru a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c --- a/drivers/net/irda/smsc-ircc2.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/irda/smsc-ircc2.c Wed Oct 8 12:24:57 2003 @@ -140,10 +140,8 @@ static int smsc_ircc_open(unsigned int firbase, unsigned int sirbase, u8 dma, u8 irq); static int smsc_ircc_present(unsigned int fir_base, unsigned int sir_base); -static int smsc_ircc_setup_io(struct smsc_ircc_cb *self, unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq); -static int smsc_ircc_setup_buffers(struct smsc_ircc_cb *self); +static void smsc_ircc_setup_io(struct smsc_ircc_cb *self, unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq); static void smsc_ircc_setup_qos(struct smsc_ircc_cb *self); -static int smsc_ircc_setup_netdev(struct smsc_ircc_cb *self); static void smsc_ircc_init_chip(struct smsc_ircc_cb *self); static int __exit smsc_ircc_close(struct smsc_ircc_cb *self); static int smsc_ircc_dma_receive(struct smsc_ircc_cb *self, int iobase); @@ -163,7 +161,6 @@ #endif static void smsc_ircc_sir_write_wakeup(struct smsc_ircc_cb *self); static int smsc_ircc_sir_write(int iobase, int fifo_size, __u8 *buf, int len); -static int smsc_ircc_net_init(struct net_device *dev); static int smsc_ircc_net_open(struct net_device *dev); static int smsc_ircc_net_close(struct net_device *dev); static int smsc_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); @@ -366,38 +363,81 @@ static int __init smsc_ircc_open(unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq) { struct smsc_ircc_cb *self; + struct net_device *dev; int err; IRDA_DEBUG(1, "%s\n", __FUNCTION__); - err= smsc_ircc_present(fir_base, sir_base); - if(err) return -ENODEV; + err = smsc_ircc_present(fir_base, sir_base); + if(err) + goto err_out; - if (dev_count>DIM(dev_self)) { + err = -ENOMEM; + if (dev_count > DIM(dev_self)) { WARNING("%s(), too many devices!\n", __FUNCTION__); - return -ENOMEM; + goto err_out1; } /* * Allocate new instance of the driver */ - self = kmalloc(sizeof(struct smsc_ircc_cb), GFP_KERNEL); - if (self == NULL) { - ERROR("%s, Can't allocate memory for control block!\n", - driver_name); - return -ENOMEM; + dev = alloc_irdadev(sizeof(struct smsc_ircc_cb)); + if (!dev) { + WARNING("%s() can't allocate net device\n", __FUNCTION__); + goto err_out1; } - memset(self, 0, sizeof(struct smsc_ircc_cb)); + + SET_MODULE_OWNER(dev); + + dev->hard_start_xmit = smsc_ircc_hard_xmit_sir; +#if SMSC_IRCC2_C_NET_TIMEOUT + dev->tx_timeout = smsc_ircc_timeout; + dev->watchdog_timeo = HZ*2; /* Allow enough time for speed change */ +#endif + dev->open = smsc_ircc_net_open; + dev->stop = smsc_ircc_net_close; + dev->do_ioctl = smsc_ircc_net_ioctl; + dev->get_stats = smsc_ircc_net_get_stats; + + self = dev->priv; + self->netdev = dev; + + /* Make ifconfig display some details */ + dev->base_addr = self->io.fir_base = fir_base; + dev->irq = self->io.irq = irq; /* Need to store self somewhere */ dev_self[dev_count++] = self; spin_lock_init(&self->lock); - err = smsc_ircc_setup_buffers(self); - if(err) return err; + self->rx_buff.truesize = SMSC_IRCC2_RX_BUFF_TRUESIZE; + self->tx_buff.truesize = SMSC_IRCC2_TX_BUFF_TRUESIZE; + + self->rx_buff.head = (u8 *) kmalloc(self->rx_buff.truesize, + GFP_KERNEL|GFP_DMA); + if (self->rx_buff.head == NULL) { + ERROR("%s, Can't allocate memory for receive buffer!\n", + driver_name); + goto err_out2; + } + + self->tx_buff.head = (u8 *) kmalloc(self->tx_buff.truesize, + GFP_KERNEL|GFP_DMA); + if (self->tx_buff.head == NULL) { + ERROR("%s, Can't allocate memory for transmit buffer!\n", + driver_name); + goto err_out3; + } + + memset(self->rx_buff.head, 0, self->rx_buff.truesize); + memset(self->tx_buff.head, 0, self->tx_buff.truesize); + + self->rx_buff.in_frame = FALSE; + self->rx_buff.state = OUTSIDE_FRAME; + self->tx_buff.data = self->tx_buff.head; + self->rx_buff.data = self->rx_buff.head; - err= smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq); - if(err) return err; + smsc_ircc_setup_io(self, fir_base, sir_base, dma, irq); smsc_ircc_setup_qos(self); @@ -405,17 +445,38 @@ smsc_ircc_init_chip(self); - if(ircc_transceiver > 0 && ircc_transceiver < SMSC_IRCC2_C_NUMBER_OF_TRANSCEIVERS) self->transceiver = ircc_transceiver; - else smsc_ircc_probe_transceiver(self); + if(ircc_transceiver > 0 && + ircc_transceiver < SMSC_IRCC2_C_NUMBER_OF_TRANSCEIVERS) + self->transceiver = ircc_transceiver; + else + smsc_ircc_probe_transceiver(self); - err = smsc_ircc_setup_netdev(self); - if(err) return err; + err = register_netdev(self->netdev); + if(err) { + ERROR("%s, Network device registration failed!\n", + driver_name); + goto err_out4; + } self->pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, smsc_ircc_pmproc); if (self->pmdev) self->pmdev->data = self; + MESSAGE("IrDA: Registered device %s\n", dev->name); + return 0; + err_out4: + kfree(self->tx_buff.head); + err_out3: + kfree(self->rx_buff.head); + err_out2: + free_netdev(self->netdev); + dev_self[--dev_count] = NULL; + err_out1: + release_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT); + release_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT); + err_out: + return err; } /* @@ -428,18 +489,19 @@ { unsigned char low, high, chip, config, dma, irq, version; - if (check_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT) < 0) { + if (!request_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT, + driver_name)) { WARNING("%s: can't get fir_base of 0x%03x\n", __FUNCTION__, fir_base); - return -ENODEV; + goto out1; } -#if POSSIBLE_USED_BY_SERIAL_DRIVER - if (check_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT) < 0) { + + if (!request_region(sir_base, SMSC_IRCC2_SIR_CHIP_IO_EXTENT, + driver_name)) { WARNING("%s: can't get sir_base of 0x%03x\n", __FUNCTION__, sir_base); - return -ENODEV; + goto out2; } -#endif register_bank(fir_base, 3); @@ -454,54 +516,19 @@ if (high != 0x10 || low != 0xb8 || (chip != 0xf1 && chip != 0xf2)) { WARNING("%s(), addr 0x%04x - no device found!\n", __FUNCTION__, fir_base); - return -ENODEV; + goto out3; } MESSAGE("SMsC IrDA Controller found\n IrCC version %d.%d, " "firport 0x%03x, sirport 0x%03x dma=%d, irq=%d\n", chip & 0x0f, version, fir_base, sir_base, dma, irq); return 0; -} - -/* - * Function smsc_ircc_setup_buffers(self) - * - * Setup RX/TX buffers - * - */ -static int smsc_ircc_setup_buffers(struct smsc_ircc_cb *self) -{ - self->rx_buff.truesize = SMSC_IRCC2_RX_BUFF_TRUESIZE; - self->tx_buff.truesize = SMSC_IRCC2_TX_BUFF_TRUESIZE; - - self->rx_buff.head = (u8 *) kmalloc(self->rx_buff.truesize, - GFP_KERNEL|GFP_DMA); - if (self->rx_buff.head == NULL) { - ERROR("%s, Can't allocate memory for receive buffer!\n", - driver_name); - kfree(self); - return -ENOMEM; - } - - self->tx_buff.head = (u8 *) kmalloc(self->tx_buff.truesize, - GFP_KERNEL|GFP_DMA); - if (self->tx_buff.head == NULL) { - ERROR("%s, Can't allocate memory for transmit buffer!\n", - driver_name); - kfree(self->rx_buff.head); - kfree(self); - return -ENOMEM; - } - - memset(self->rx_buff.head, 0, self->rx_buff.truesize); - memset(self->tx_buff.head, 0, self->tx_buff.truesize); - - self->rx_buff.in_frame = FALSE; - self->rx_buff.state = OUTSIDE_FRAME; - self->tx_buff.data = self->tx_buff.head; - self->rx_buff.data = self->rx_buff.head; - - return 0; + out3: + release_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT); + out2: + release_region(fir_base, SMSC_IRCC2_FIR_CHIP_IO_EXTENT); + out1: + return -ENODEV; } /* @@ -510,10 +537,11 @@ * Setup I/O * */ -static int smsc_ircc_setup_io(struct smsc_ircc_cb *self, unsigned int fir_base, unsigned int sir_base, u8 dma, u8 irq) +static void smsc_ircc_setup_io(struct smsc_ircc_cb *self, + unsigned int fir_base, unsigned int sir_base, + u8 dma, u8 irq) { unsigned char config, chip_dma, chip_irq; - void *ret; register_bank(fir_base, 3); config = inb(fir_base+IRCC_INTERFACE); @@ -545,27 +573,6 @@ else self->io.dma = chip_dma; - ret = request_region(self->io.fir_base, self->io.fir_ext, driver_name); - if (!ret) { - WARNING("%s(), can't get iobase of 0x%03x\n", - __FUNCTION__, self->io.fir_base); - kfree(self->tx_buff.head); - kfree(self->rx_buff.head); - kfree(self); - return -ENODEV; - } - ret = request_region(self->io.sir_base, self->io.sir_ext, driver_name); - if (!ret) { - WARNING("%s(), can't get iobase of 0x%03x\n", - __FUNCTION__, self->io.sir_base); - release_region(self->io.fir_base, self->io.fir_ext); - kfree(self->tx_buff.head); - kfree(self->rx_buff.head); - kfree(self); - return -ENODEV; - } - - return 0; } /* @@ -635,59 +642,6 @@ } /* - * Function smsc_ircc_setup_netdev(self) - * - * Alloc and setup network device - * - */ -static int smsc_ircc_setup_netdev(struct smsc_ircc_cb *self) -{ - struct net_device *dev; - int err; - /* Alloc netdev */ - - if (!(dev = dev_alloc("irda%d", &err))) { - ERROR("%s(), dev_alloc() failed!\n", __FUNCTION__); - kfree(self->tx_buff.head); - kfree(self->rx_buff.head); - kfree(self); - return -ENOMEM; - } - - dev->priv = (void *) self; - self->netdev = dev; - - dev->init = smsc_ircc_net_init; - dev->hard_start_xmit = smsc_ircc_hard_xmit_sir; - #if SMSC_IRCC2_C_NET_TIMEOUT - dev->tx_timeout = smsc_ircc_timeout; - dev->watchdog_timeo = HZ*2; /* Allow enough time for speed change */ - #endif - dev->open = smsc_ircc_net_open; - dev->stop = smsc_ircc_net_close; - dev->do_ioctl = smsc_ircc_net_ioctl; - dev->get_stats = smsc_ircc_net_get_stats; - - /* Make ifconfig display some details */ - dev->base_addr = self->io.fir_base; - dev->irq = self->io.irq; - - rtnl_lock(); - err = register_netdevice(dev); - rtnl_unlock(); - if (err) { - ERROR("%s(), register_netdev() failed!\n", __FUNCTION__); - kfree(self->tx_buff.head); - kfree(self->rx_buff.head); - kfree(self); - return -ENODEV; - } - MESSAGE("IrDA: Registered device %s\n", dev->name); - - return 0; -} - -/* * Function smsc_ircc_net_ioctl (dev, rq, cmd) * * Process IOCTL commands for this device @@ -1571,18 +1525,6 @@ } #endif /* unused */ -static int smsc_ircc_net_init(struct net_device *dev) -{ - /* Keep track of module usage */ - SET_MODULE_OWNER(dev); - - /* Set up to be a normal IrDA network device driver */ - irda_device_setup(dev); - - /* Insert overrides below this line! */ - - return 0; -} /* * Function smsc_ircc_net_open (dev) @@ -1745,11 +1687,7 @@ pm_unregister(self->pmdev); /* Remove netdevice */ - if (self->netdev) { - rtnl_lock(); - unregister_netdevice(self->netdev); - rtnl_unlock(); - } + unregister_netdev(self->netdev); /* Make sure the irq handler is not exectuting */ spin_lock_irqsave(&self->lock, flags); @@ -1784,7 +1722,7 @@ if (self->rx_buff.head) kfree(self->rx_buff.head); - kfree(self); + free_netdev(self->netdev); return 0; } @@ -2269,32 +2207,36 @@ static int __init smsc_superio_fdc(unsigned short cfg_base) { - if (check_region(cfg_base, 2) < 0) { + int ret = -1; + + if (!request_region(cfg_base, 2, driver_name)) { WARNING("%s: can't get cfg_base of 0x%03x\n", __FUNCTION__, cfg_base); - return -1; - } + } else { + if (!smsc_superio_flat(fdc_chips_flat,cfg_base,"FDC") + ||!smsc_superio_paged(fdc_chips_paged,cfg_base,"FDC")) + ret = 0; - if (!smsc_superio_flat(fdc_chips_flat,cfg_base,"FDC")||!smsc_superio_paged(fdc_chips_paged,cfg_base,"FDC")) - return 0; + release_region(cfg_base, 2); + } - return -1; + return ret; } static int __init smsc_superio_lpc(unsigned short cfg_base) { -#if 0 - if (check_region(cfg_base, 2) < 0) { - IRDA_DEBUG(0, __FUNCTION__ ": can't get cfg_base of 0x%03x\n", - cfg_base); - return -1; - } -#endif - - if (!smsc_superio_flat(lpc_chips_flat,cfg_base,"LPC")||!smsc_superio_paged(lpc_chips_paged,cfg_base,"LPC")) - return 0; + int ret = -1; - return -1; + if (!request_region(cfg_base, 2, driver_name)) { + WARNING("%s: can't get cfg_base of 0x%03x\n", + __FUNCTION__, cfg_base); + } else { + if (!smsc_superio_flat(lpc_chips_flat,cfg_base,"LPC") + ||!smsc_superio_paged(lpc_chips_paged,cfg_base,"LPC")) + ret = 0; + release_region(cfg_base, 2); + } + return ret; } /************************************************ diff -Nru a/drivers/net/irda/tekram.c b/drivers/net/irda/tekram.c --- a/drivers/net/irda/tekram.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/tekram.c Wed Oct 8 12:24:56 2003 @@ -44,12 +44,12 @@ #define TEKRAM_PW 0x10 /* Pulse select bit */ static struct dongle_reg dongle = { - Q_NULL, - IRDA_TEKRAM_DONGLE, - tekram_open, - tekram_close, - tekram_reset, - tekram_change_speed, + .type = IRDA_TEKRAM_DONGLE, + .open = tekram_open, + .close = tekram_close, + .reset = tekram_reset, + .change_speed = tekram_change_speed, + .owner = THIS_MODULE, }; int __init tekram_init(void) @@ -69,8 +69,6 @@ qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; qos->min_turn_time.bits = 0x01; /* Needs at least 10 ms */ irda_qos_bits_to_value(qos); - - MOD_INC_USE_COUNT; } static void tekram_close(dongle_t *self) @@ -84,8 +82,6 @@ irda_task_delete(self->reset_task); if (self->speed_task) irda_task_delete(self->speed_task); - - MOD_DEC_USE_COUNT; } /* diff -Nru a/drivers/net/irda/via-ircc.c b/drivers/net/irda/via-ircc.c --- a/drivers/net/irda/via-ircc.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/irda/via-ircc.c Wed Oct 8 12:24:55 2003 @@ -335,8 +335,7 @@ return -1; /* Allocate new instance of the driver */ - dev = alloc_netdev(sizeof(struct via_ircc_cb), "irda%d", - irda_device_setup); + dev = alloc_irdadev(sizeof(struct via_ircc_cb)); if (dev == NULL) return -ENOMEM; diff -Nru a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c --- a/drivers/net/irda/vlsi_ir.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/irda/vlsi_ir.c Wed Oct 8 12:24:55 2003 @@ -1859,15 +1859,6 @@ * otherwise we might get cheated by pci-pm. */ -static int vlsi_irda_save_state(struct pci_dev *pdev, u32 state) -{ - if (state < 1 || state > 3 ) { - ERROR("%s - %s: invalid pm state request: %u\n", - __FUNCTION__, PCIDEV_NAME(pdev), state); - return -1; - } - return 0; -} static int vlsi_irda_suspend(struct pci_dev *pdev, u32 state) { @@ -1970,7 +1961,6 @@ .probe = vlsi_irda_probe, .remove = __devexit_p(vlsi_irda_remove), #ifdef CONFIG_PM - .save_state = vlsi_irda_save_state, .suspend = vlsi_irda_suspend, .resume = vlsi_irda_resume, #endif diff -Nru a/drivers/net/irda/w83977af_ir.c b/drivers/net/irda/w83977af_ir.c --- a/drivers/net/irda/w83977af_ir.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/irda/w83977af_ir.c Wed Oct 8 12:24:56 2003 @@ -170,8 +170,7 @@ /* * Allocate new instance of the driver */ - dev = alloc_netdev(sizeof(struct w83977af_ir), "irda%d", - irda_device_setup); + dev = alloc_irdadev(sizeof(struct w83977af_ir)); if (dev == NULL) { printk( KERN_ERR "IrDA: Can't allocate memory for " "IrDA control block!\n"); diff -Nru a/drivers/net/loopback.c b/drivers/net/loopback.c --- a/drivers/net/loopback.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/loopback.c Wed Oct 8 12:24:55 2003 @@ -30,6 +30,7 @@ */ #include #include +#include #include #include #include @@ -202,3 +203,5 @@ return register_netdev(&loopback_dev); }; + +EXPORT_SYMBOL(loopback_dev); diff -Nru a/drivers/net/mac8390.c b/drivers/net/mac8390.c --- a/drivers/net/mac8390.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/mac8390.c Wed Oct 8 12:24:56 2003 @@ -442,14 +442,14 @@ ei_status.tx_start_page = CABLETRON_TX_START_PG; ei_status.rx_start_page = CABLETRON_RX_START_PG; ei_status.stop_page = CABLETRON_RX_STOP_PG; - dev->rmem_start = dev->mem_start; - dev->rmem_end = dev->mem_start + CABLETRON_RX_STOP_PG*256; + ei_status.rmem_start = dev->mem_start; + ei_status.rmem_end = dev->mem_start + CABLETRON_RX_STOP_PG*256; } else { ei_status.tx_start_page = WD_START_PG; ei_status.rx_start_page = WD_START_PG + TX_PAGES; ei_status.stop_page = (dev->mem_end - dev->mem_start)/256; - dev->rmem_start = dev->mem_start + TX_PAGES*256; - dev->rmem_end = dev->mem_end; + ei_status.rmem_start = dev->mem_start + TX_PAGES*256; + ei_status.rmem_end = dev->mem_end; } /* Fill in model-specific information and functions */ @@ -621,12 +621,12 @@ unsigned long xfer_base = ring_offset - (WD_START_PG<<8); unsigned long xfer_start = xfer_base + dev->mem_start; - if (xfer_start + count > dev->rmem_end) { + if (xfer_start + count > ei_status.rmem_end) { /* We must wrap the input move. */ - int semi_count = dev->rmem_end - xfer_start; + int semi_count = ei_status.rmem_end - xfer_start; memcpy_fromio(skb->data, (char *)dev->mem_start + xfer_base, semi_count); count -= semi_count; - memcpy_toio(skb->data + semi_count, (char *)dev->rmem_start, count); + memcpy_toio(skb->data + semi_count, (char *)ei_status.rmem_start, count); } else { memcpy_fromio(skb->data, (char *)dev->mem_start + xfer_base, count); } @@ -657,15 +657,16 @@ /* Note the offset math is done in card memory space which is word per long onto our space. */ - - if (xfer_start + count > dev->rmem_end) + + if (xfer_start + count > ei_status.rmem_end) { /* We must wrap the input move. */ - int semi_count = dev->rmem_end - xfer_start; + int semi_count = ei_status.rmem_end - xfer_start; dayna_memcpy_fromcard(dev, skb->data, xfer_base, semi_count); count -= semi_count; - dayna_memcpy_fromcard(dev, skb->data + semi_count, - dev->rmem_start - dev->mem_start, count); + dayna_memcpy_fromcard(dev, skb->data + semi_count, + ei_status.rmem_start - dev->mem_start, + count); } else { @@ -697,15 +698,15 @@ unsigned long xfer_base = ring_offset - (WD_START_PG<<8); unsigned long xfer_start = xfer_base+dev->mem_start; - if (xfer_start + count > dev->rmem_end) + if (xfer_start + count > ei_status.rmem_end) { /* We must wrap the input move. */ - int semi_count = dev->rmem_end - xfer_start; + int semi_count = ei_status.rmem_end - xfer_start; word_memcpy_fromcard(skb->data, (char *)dev->mem_start + xfer_base, semi_count); count -= semi_count; word_memcpy_fromcard(skb->data + semi_count, - (char *)dev->rmem_start, count); + (char *)ei_status.rmem_start, count); } else { diff -Nru a/drivers/net/ne2.c b/drivers/net/ne2.c --- a/drivers/net/ne2.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/ne2.c Wed Oct 8 12:24:57 2003 @@ -70,7 +70,7 @@ #include #include #include -#include +#include #include #include #include diff -Nru a/drivers/net/ne3210.c b/drivers/net/ne3210.c --- a/drivers/net/ne3210.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/ne3210.c Wed Oct 8 12:24:56 2003 @@ -23,6 +23,7 @@ This driver WILL NOT WORK FOR THE NE3200 - it is completely different and does not use an 8390 at all. + Updated to EISA probing API 5/2003 by Marc Zyngier. */ static const char *version = @@ -44,9 +45,6 @@ #include "8390.h" -int ne3210_probe(struct net_device *dev); -static int ne3210_probe1(struct net_device *dev, int ioaddr); - static int ne3210_open(struct net_device *dev); static int ne3210_close(struct net_device *dev); @@ -59,7 +57,6 @@ #define NE3210_START_PG 0x00 /* First page of TX buffer */ #define NE3210_STOP_PG 0x80 /* Last page +1 of RX ring */ -#define NE3210_ID_PORT 0xc80 /* Same for all EISA cards */ #define NE3210_IO_EXTENT 0x20 #define NE3210_SA_PROM 0x16 /* Start of e'net addr. */ #define NE3210_RESET_PORT 0xc84 @@ -69,10 +66,9 @@ #define NE3210_ADDR1 0x00 #define NE3210_ADDR2 0x1b -#define NE3210_ID 0x0118cc3a /* 0x3acc = 1110 10110 01100 = nvl */ - #define NE3210_CFG1 0xc84 /* NB: 0xc84 is also "reset" port. */ #define NE3210_CFG2 0xc90 +#define NE3210_CFG_EXTENT (NE3210_CFG2 - NE3210_CFG1 + 1) /* * You can OR any of the following bits together and assign it @@ -89,152 +85,108 @@ static unsigned char irq_map[] __initdata = {15, 12, 11, 10, 9, 7, 5, 3}; static unsigned int shmem_map[] __initdata = {0xff0, 0xfe0, 0xfff0, 0xd8, 0xffe0, 0xffc0, 0xd0, 0x0}; +static const char *ifmap[] __initdata = {"UTP", "?", "BNC", "AUI"}; +static int ifmap_val[] __initdata = { + IF_PORT_10BASET, + IF_PORT_UNKNOWN, + IF_PORT_10BASE2, + IF_PORT_AUI, +}; -/* - * Probe for the card. The best way is to read the EISA ID if it - * is known. Then we can check the prefix of the station address - * PROM for a match against the value assigned to Novell. - */ - -int __init ne3210_probe(struct net_device *dev) +static int __init ne3210_eisa_probe (struct device *device) { - unsigned short ioaddr = dev->base_addr; - - SET_MODULE_OWNER(dev); + unsigned long ioaddr, phys_mem; + int i, retval, port_index; + struct eisa_device *edev = to_eisa_device (device); + struct net_device *dev; - if (ioaddr > 0x1ff) /* Check a single specified location. */ - return ne3210_probe1(dev, ioaddr); - else if (ioaddr > 0) /* Don't probe at all. */ - return -ENXIO; - - if (!EISA_bus) { -#if NE3210_DEBUG & NE3210_D_PROBE - printk("ne3210-debug: Not an EISA bus. Not probing high ports.\n"); -#endif - return -ENXIO; + /* Allocate dev->priv and fill in 8390 specific dev fields. */ + if (!(dev = alloc_ei_netdev ())) { + printk ("ne3210.c: unable to allocate memory for dev!\n"); + return -ENOMEM; } - /* EISA spec allows for up to 16 slots, but 8 is typical. */ - for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) - if (ne3210_probe1(dev, ioaddr) == 0) - return 0; - - return -ENODEV; -} - -static int __init ne3210_probe1(struct net_device *dev, int ioaddr) -{ - int i, retval; - unsigned long eisa_id; - const char *ifmap[] = {"UTP", "?", "BNC", "AUI"}; - - if (!request_region(dev->base_addr, NE3210_IO_EXTENT, dev->name)) - return -EBUSY; + SET_MODULE_OWNER(dev); + SET_NETDEV_DEV(dev, device); + device->driver_data = dev; + ioaddr = edev->base_addr; - if (inb_p(ioaddr + NE3210_ID_PORT) == 0xff) { - retval = -ENODEV; + if (ethdev_init (dev)) { + printk ("ne3210.c: unable to allocate memory for dev->priv!\n"); + retval = -ENOMEM; goto out; } -#if NE3210_DEBUG & NE3210_D_PROBE - printk("ne3210-debug: probe at %#x, ID %#8x\n", ioaddr, inl(ioaddr + NE3210_ID_PORT)); - printk("ne3210-debug: config regs: %#x %#x\n", - inb(ioaddr + NE3210_CFG1), inb(ioaddr + NE3210_CFG2)); -#endif - - -/* Check the EISA ID of the card. */ - eisa_id = inl(ioaddr + NE3210_ID_PORT); - if (eisa_id != NE3210_ID) { - retval = -ENODEV; + if (!request_region(ioaddr, NE3210_IO_EXTENT, dev->name)) { + retval = -EBUSY; goto out; } - -#if 0 -/* Check the vendor ID as well. Not really required. */ - if (inb(ioaddr + NE3210_SA_PROM + 0) != NE3210_ADDR0 - || inb(ioaddr + NE3210_SA_PROM + 1) != NE3210_ADDR1 - || inb(ioaddr + NE3210_SA_PROM + 2) != NE3210_ADDR2 ) { - printk("ne3210.c: card not found"); - for(i = 0; i < ETHER_ADDR_LEN; i++) - printk(" %02x", inb(ioaddr + NE3210_SA_PROM + i)); - printk(" (invalid prefix).\n"); - retval = -ENODEV; - goto out; + if (!request_region(ioaddr + NE3210_CFG1, + NE3210_CFG_EXTENT, dev->name)) { + retval = -EBUSY; + goto out1; } + +#if NE3210_DEBUG & NE3210_D_PROBE + printk("ne3210-debug: probe at %#x, ID %s\n", ioaddr, edev->id.sig); + printk("ne3210-debug: config regs: %#x %#x\n", + inb(ioaddr + NE3210_CFG1), inb(ioaddr + NE3210_CFG2)); #endif - /* Allocate dev->priv and fill in 8390 specific dev fields. */ - if (ethdev_init(dev)) { - printk ("ne3210.c: unable to allocate memory for dev->priv!\n"); - retval = -ENOMEM; - goto out; - } + port_index = inb(ioaddr + NE3210_CFG2) >> 6; printk("ne3210.c: NE3210 in EISA slot %d, media: %s, addr:", - ioaddr/0x1000, ifmap[inb(ioaddr + NE3210_CFG2) >> 6]); + edev->slot, ifmap[port_index]); for(i = 0; i < ETHER_ADDR_LEN; i++) printk(" %02x", (dev->dev_addr[i] = inb(ioaddr + NE3210_SA_PROM + i))); - printk(".\nne3210.c: "); + /* Snarf the interrupt now. CFG file has them all listed as `edge' with share=NO */ - if (dev->irq == 0) { - unsigned char irq_reg = inb(ioaddr + NE3210_CFG2) >> 3; - dev->irq = irq_map[irq_reg & 0x07]; - printk("using"); - } else { - /* This is useless unless we reprogram the card here too */ - if (dev->irq == 2) dev->irq = 9; /* Doh! */ - printk("assigning"); - } - printk(" IRQ %d,", dev->irq); + dev->irq = irq_map[(inb(ioaddr + NE3210_CFG2) >> 3) & 0x07]; + printk(".\nne3210.c: using IRQ %d, ", dev->irq); retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev); if (retval) { printk (" unable to get IRQ %d.\n", dev->irq); - goto out1; - } - - if (dev->mem_start == 0) { - unsigned char mem_reg = inb(ioaddr + NE3210_CFG2) & 0x07; - dev->mem_start = shmem_map[mem_reg] * 0x1000; - printk(" using "); - } else { - /* Should check for value in shmem_map and reprogram the card to use it */ - dev->mem_start &= 0xfff8000; - printk(" assigning "); + goto out2; } - printk("%dkB memory at physical address %#lx\n", - NE3210_STOP_PG/4, dev->mem_start); + phys_mem = shmem_map[inb(ioaddr + NE3210_CFG2) & 0x07] * 0x1000; /* BEWARE!! Some dain-bramaged EISA SCUs will allow you to put the card mem within the region covered by `normal' RAM !!! */ - if (dev->mem_start > 1024*1024) { /* phys addr > 1MB */ - if (dev->mem_start < virt_to_phys(high_memory)) { + if (phys_mem > 1024*1024) { /* phys addr > 1MB */ + if (phys_mem < virt_to_phys(high_memory)) { printk(KERN_CRIT "ne3210.c: Card RAM overlaps with normal memory!!!\n"); printk(KERN_CRIT "ne3210.c: Use EISA SCU to set card memory below 1MB,\n"); printk(KERN_CRIT "ne3210.c: or to an address above 0x%lx.\n", virt_to_phys(high_memory)); printk(KERN_CRIT "ne3210.c: Driver NOT installed.\n"); retval = -EINVAL; - goto out2; + goto out3; } - dev->mem_start = (unsigned long)ioremap(dev->mem_start, NE3210_STOP_PG*0x100); - if (dev->mem_start == 0) { - printk(KERN_ERR "ne3210.c: Unable to remap card memory above 1MB !!\n"); - printk(KERN_ERR "ne3210.c: Try using EISA SCU to set memory below 1MB.\n"); - printk(KERN_ERR "ne3210.c: Driver NOT installed.\n"); - retval = -EAGAIN; - goto out2; - } - ei_status.reg0 = 1; /* Use as remap flag */ - printk("ne3210.c: remapped %dkB card memory to virtual address %#lx\n", - NE3210_STOP_PG/4, dev->mem_start); } + + if (!request_mem_region (phys_mem, NE3210_STOP_PG*0x100, dev->name)) { + printk ("ne3210.c: Unable to request shared memory at physical address %#lx\n", + phys_mem); + goto out3; + } + + printk("%dkB memory at physical address %#lx\n", + NE3210_STOP_PG/4, phys_mem); + dev->mem_start = (unsigned long)ioremap(phys_mem, NE3210_STOP_PG*0x100); + if (dev->mem_start == 0) { + printk(KERN_ERR "ne3210.c: Unable to remap card memory !!\n"); + printk(KERN_ERR "ne3210.c: Driver NOT installed.\n"); + retval = -EAGAIN; + goto out4; + } + printk("ne3210.c: remapped %dkB card memory to virtual address %#lx\n", + NE3210_STOP_PG/4, dev->mem_start); dev->mem_end = ei_status.rmem_end = dev->mem_start + (NE3210_STOP_PG - NE3210_START_PG)*256; ei_status.rmem_start = dev->mem_start + TX_PAGES*256; @@ -247,6 +199,7 @@ ei_status.rx_start_page = NE3210_START_PG + TX_PAGES; ei_status.stop_page = NE3210_STOP_PG; ei_status.word16 = 1; + ei_status.priv = phys_mem; if (ei_debug > 0) printk(version); @@ -258,18 +211,46 @@ dev->open = &ne3210_open; dev->stop = &ne3210_close; + dev->if_port = ifmap_val[port_index]; + + if ((retval = register_netdev (dev))) + goto out5; + NS8390_init(dev, 0); return 0; -out2: - free_irq(dev->irq, dev); -out1: - kfree(dev->priv); - dev->priv = NULL; -out: - release_region(ioaddr, NE3210_IO_EXTENT); + + out5: + iounmap((void *)dev->mem_start); + out4: + release_mem_region (phys_mem, NE3210_STOP_PG*0x100); + out3: + free_irq (dev->irq, dev); + out2: + release_region (ioaddr + NE3210_CFG1, NE3210_CFG_EXTENT); + out1: + release_region (ioaddr, NE3210_IO_EXTENT); + out: + free_netdev (dev); + return retval; } +static int __devexit ne3210_eisa_remove (struct device *device) +{ + struct net_device *dev = device->driver_data; + unsigned long ioaddr = to_eisa_device (device)->base_addr; + + unregister_netdev (dev); + iounmap((void *)dev->mem_start); + release_mem_region (ei_status.priv, NE3210_STOP_PG*0x100); + free_irq (dev->irq, dev); + release_region (ioaddr + NE3210_CFG1, NE3210_CFG_EXTENT); + release_region (ioaddr, NE3210_IO_EXTENT); + free_netdev (dev); + + return 0; +} + /* * Reset by toggling the "Board Enable" bits (bit 2 and 0). */ @@ -309,7 +290,7 @@ ne3210_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page) { unsigned long hdr_start = dev->mem_start + ((ring_page - NE3210_START_PG)<<8); - isa_memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr)); + memcpy_fromio(hdr, hdr_start, sizeof(struct e8390_pkt_hdr)); hdr->count = (hdr->count + 3) & ~3; /* Round up allocation. */ } @@ -327,12 +308,12 @@ if (xfer_start + count > ei_status.rmem_end) { /* Packet wraps over end of ring buffer. */ int semi_count = ei_status.rmem_end - xfer_start; - isa_memcpy_fromio(skb->data, xfer_start, semi_count); + memcpy_fromio(skb->data, xfer_start, semi_count); count -= semi_count; - isa_memcpy_fromio(skb->data + semi_count, ei_status.rmem_start, count); + memcpy_fromio(skb->data + semi_count, ei_status.rmem_start, count); } else { /* Packet is in one chunk. */ - isa_memcpy_fromio(skb->data, xfer_start, count); + memcpy_fromio(skb->data, xfer_start, count); } } @@ -342,7 +323,7 @@ unsigned long shmem = dev->mem_start + ((start_page - NE3210_START_PG)<<8); count = (count + 3) & ~3; /* Round up to doubleword */ - isa_memcpy_toio(shmem, buf, count); + memcpy_toio(shmem, buf, count); } static int ne3210_open(struct net_device *dev) @@ -361,7 +342,23 @@ return 0; } +static struct eisa_device_id ne3210_ids[] = { + { "EGL0101" }, + { "NVL1801" }, + { "" }, +}; + +static struct eisa_driver ne3210_eisa_driver = { + .id_table = ne3210_ids, + .driver = { + .name = "ne3210", + .probe = ne3210_eisa_probe, + .remove = __devexit_p (ne3210_eisa_remove), + }, +}; + #ifdef MODULE +#if 0 #define MAX_NE3210_CARDS 4 /* Max number of NE3210 cards per module */ static struct net_device dev_ne3210[MAX_NE3210_CARDS]; static int io[MAX_NE3210_CARDS]; @@ -374,50 +371,22 @@ MODULE_PARM_DESC(io, "I/O base address(es)"); MODULE_PARM_DESC(irq, "IRQ number(s)"); MODULE_PARM_DESC(mem, "memory base address(es)"); +#endif +#endif /* MODULE */ + + MODULE_DESCRIPTION("NE3210 EISA Ethernet driver"); MODULE_LICENSE("GPL"); -int init_module(void) +int ne3210_init(void) { - int this_dev, found = 0; - - for (this_dev = 0; this_dev < MAX_NE3210_CARDS; this_dev++) { - struct net_device *dev = &dev_ne3210[this_dev]; - dev->irq = irq[this_dev]; - dev->base_addr = io[this_dev]; - dev->mem_start = mem[this_dev]; - dev->init = ne3210_probe; - /* Default is to only install one card. */ - if (io[this_dev] == 0 && this_dev != 0) break; - if (register_netdev(dev) != 0) { - printk(KERN_WARNING "ne3210.c: No NE3210 card found (i/o = 0x%x).\n", io[this_dev]); - if (found != 0) { /* Got at least one. */ - return 0; - } - return -ENXIO; - } - found++; - } - return 0; + return eisa_driver_register (&ne3210_eisa_driver); } -void cleanup_module(void) +void ne3210_cleanup(void) { - int this_dev; - - for (this_dev = 0; this_dev < MAX_NE3210_CARDS; this_dev++) { - struct net_device *dev = &dev_ne3210[this_dev]; - if (dev->priv != NULL) { - free_irq(dev->irq, dev); - release_region(dev->base_addr, NE3210_IO_EXTENT); - if (ei_status.reg0) - iounmap((void *)dev->mem_start); - unregister_netdev(dev); - kfree(dev->priv); - dev->priv = NULL; - } - } + eisa_driver_unregister (&ne3210_eisa_driver); } -#endif /* MODULE */ - +module_init (ne3210_init); +module_exit (ne3210_cleanup); diff -Nru a/drivers/net/pppoe.c b/drivers/net/pppoe.c --- a/drivers/net/pppoe.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/pppoe.c Wed Oct 8 12:24:57 2003 @@ -468,13 +468,11 @@ static struct packet_type pppoes_ptype = { .type = __constant_htons(ETH_P_PPP_SES), .func = pppoe_rcv, - .data = PKT_CAN_SHARE_SKB, }; static struct packet_type pppoed_ptype = { .type = __constant_htons(ETH_P_PPP_DISC), .func = pppoe_disc_rcv, - .data = PKT_CAN_SHARE_SKB, }; /*********************************************************************** diff -Nru a/drivers/net/sk98lin/skdim.c b/drivers/net/sk98lin/skdim.c --- a/drivers/net/sk98lin/skdim.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/sk98lin/skdim.c Wed Oct 8 12:24:56 2003 @@ -327,9 +327,7 @@ ** ** struct kernel_stat kstat ** - ** is not marked as an exported symbol in the file - ** - ** kernel/ksyms.c + ** is not marked as an exported symbol ** ** As a consequence, using this driver as KLM is not possible ** and any access of the structure kernel_stat via the diff -Nru a/drivers/net/sk_mca.c b/drivers/net/sk_mca.c --- a/drivers/net/sk_mca.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/sk_mca.c Wed Oct 8 12:24:57 2003 @@ -89,7 +89,7 @@ #include #include #include -#include +#include #include #include #include diff -Nru a/drivers/net/slip.c b/drivers/net/slip.c --- a/drivers/net/slip.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/slip.c Wed Oct 8 12:24:57 2003 @@ -1307,7 +1307,7 @@ /* Resolve race condition, when ioctl'ing hanged up and opened by another process device. */ - if (sl->tty != current->tty && sl->pid != current->pid) { + if (sl->tty != process_tty(current) && sl->pid != current->pid) { spin_unlock_bh(&sl->lock); return -EPERM; } diff -Nru a/drivers/net/tokenring/madgemc.c b/drivers/net/tokenring/madgemc.c --- a/drivers/net/tokenring/madgemc.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/tokenring/madgemc.c Wed Oct 8 12:24:57 2003 @@ -20,7 +20,7 @@ static const char version[] = "madgemc.c: v0.91 23/01/2000 by Adam Fritzler\n"; #include -#include +#include #include #include #include diff -Nru a/drivers/net/tokenring/smctr.c b/drivers/net/tokenring/smctr.c --- a/drivers/net/tokenring/smctr.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/tokenring/smctr.c Wed Oct 8 12:24:56 2003 @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include #include diff -Nru a/drivers/net/wan/comx-hw-munich.c b/drivers/net/wan/comx-hw-munich.c --- a/drivers/net/wan/comx-hw-munich.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/wan/comx-hw-munich.c Wed Oct 8 12:24:56 2003 @@ -1849,7 +1849,7 @@ if (board->isx21) { init_timer(&board->modemline_timer); - board->modemline_timer.data = (unsigned int)board; + board->modemline_timer.data = (unsigned long)board; board->modemline_timer.function = pcicom_modemline; board->modemline_timer.expires = jiffies + HZ; add_timer((struct timer_list *)&board->modemline_timer); diff -Nru a/drivers/net/wan/comx-proto-lapb.c b/drivers/net/wan/comx-proto-lapb.c --- a/drivers/net/wan/comx-proto-lapb.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/wan/comx-proto-lapb.c Wed Oct 8 12:24:55 2003 @@ -372,6 +372,10 @@ if (ch->dev->type == ARPHRD_X25) { skb_push(skb, 1); + + if (skb_cow(skb, 1)) + return NET_RX_DROP; + skb->data[0] = 0; // indicate data for X25 skb->protocol = htons(ETH_P_X25); } else { diff -Nru a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c --- a/drivers/net/wan/cosa.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/wan/cosa.c Wed Oct 8 12:24:55 2003 @@ -519,7 +519,6 @@ current->state = TASK_INTERRUPTIBLE; cosa_putstatus(cosa, SR_TX_INT_ENA); schedule_timeout(30); - current->state = TASK_RUNNING; irq = probe_irq_off(irqs); /* Disable all IRQs from the card */ cosa_putstatus(cosa, 0); @@ -1532,7 +1531,6 @@ #ifdef MODULE current->state = TASK_INTERRUPTIBLE; schedule_timeout(HZ/2); - current->state = TASK_RUNNING; #else udelay(5*100000); #endif diff -Nru a/drivers/net/wan/dscc4.c b/drivers/net/wan/dscc4.c --- a/drivers/net/wan/dscc4.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/wan/dscc4.c Wed Oct 8 12:24:56 2003 @@ -107,7 +107,7 @@ #include /* Version */ -static const char version[] = "$Id: dscc4.c,v 1.159 2002/04/10 22:05:17 romieu Exp $ for Linux\n"; +static const char version[] = "$Id: dscc4.c,v 1.173 2003/09/20 23:55:34 romieu Exp $ for Linux\n"; static int debug; static int quartz; @@ -592,6 +592,7 @@ return (i >= 0 ) ? i : -EAGAIN; } +#if 0 /* dscc4_{rx/tx}_reset are both unreliable - more tweak needed */ static void dscc4_rx_reset(struct dscc4_dev_priv *dpriv, struct net_device *dev) { unsigned long flags; @@ -606,6 +607,9 @@ spin_unlock_irqrestore(&dpriv->pci_priv->lock, flags); } +#endif + +#if 0 static void dscc4_tx_reset(struct dscc4_dev_priv *dpriv, struct net_device *dev) { u16 i = 0; @@ -625,6 +629,7 @@ if (dscc4_do_action(dev, "Rdt") < 0) printk(KERN_ERR "%s: Tx reset failed\n", dev->name); } +#endif /* TODO: (ab)use this function to refill a completely depleted RX ring. */ static inline void dscc4_rx_skb(struct dscc4_dev_priv *dpriv, @@ -859,7 +864,7 @@ { struct dscc4_pci_priv *ppriv; struct dscc4_dev_priv *root; - int i = 0; + int i, ret = -ENOMEM; root = (struct dscc4_dev_priv *) kmalloc(dev_per_card*sizeof(*root), GFP_KERNEL); @@ -900,7 +905,8 @@ hdlc->xmit = dscc4_start_xmit; hdlc->attach = dscc4_hdlc_attach; - if (register_hdlc_device(hdlc)) { + ret = register_hdlc_device(hdlc); + if (ret < 0) { printk(KERN_ERR "%s: unable to register\n", DRV_NAME); goto err_unregister; } @@ -908,17 +914,20 @@ dscc4_init_registers(dpriv, d); dpriv->parity = PARITY_CRC16_PR0_CCITT; dpriv->encoding = ENCODING_NRZ; - if (dscc4_init_ring(d)) { + + ret = dscc4_init_ring(d); + if (ret < 0) { unregister_hdlc_device(hdlc); goto err_unregister; } } - if (dscc4_set_quartz(root, quartz) < 0) + ret = dscc4_set_quartz(root, quartz); + if (ret < 0) goto err_unregister; ppriv->root = root; spin_lock_init(&ppriv->lock); pci_set_drvdata(pdev, ppriv); - return 0; + return ret; err_unregister: while (--i >= 0) { @@ -929,7 +938,7 @@ err_free_dev: kfree(root); err_out: - return -1; + return ret; }; /* FIXME: get rid of the unneeded code */ @@ -971,7 +980,7 @@ * * This code doesn't need to be efficient. Keep It Simple */ -static void dscc4_pci_reset(struct pci_dev *pdev, u32 ioaddr) +static void dscc4_pci_reset(struct pci_dev *pdev, unsigned long ioaddr) { int i; @@ -1092,9 +1101,7 @@ err_disable_scc_events: scc_writel(0xffffffff, dpriv, dev, IMR); -err_free_ring: scc_patchl(PowerUp | Vis, 0, dpriv, dev, CCR0); - dscc4_release_ring(dpriv); err_out: hdlc_close(hdlc); err: @@ -1160,7 +1167,6 @@ dpriv->flags |= FakeReset; hdlc_close(hdlc); - dscc4_release_ring(dpriv); return 0; } @@ -1455,7 +1461,8 @@ struct dscc4_dev_priv *root = token; struct dscc4_pci_priv *priv; struct net_device *dev; - u32 ioaddr, state; + unsigned long ioaddr; + u32 state; unsigned long flags; int i, handled = 1; @@ -1607,7 +1614,7 @@ goto try; } if (state & Xpr) { - u32 scc_addr, ring; + unsigned long scc_addr, ring; int i; /* @@ -1948,7 +1955,7 @@ { struct dscc4_pci_priv *ppriv; struct dscc4_dev_priv *root; - u32 ioaddr; + unsigned long ioaddr; int i; ppriv = pci_get_drvdata(pdev); @@ -2006,6 +2013,7 @@ return 0; } +#ifndef MODULE static int __init dscc4_setup(char *str) { int *args[] = { &debug, &quartz, NULL }, **p = args; @@ -2016,6 +2024,7 @@ } __setup("dscc4.setup=", dscc4_setup); +#endif static struct pci_device_id dscc4_pci_tbl[] = { { PCI_VENDOR_ID_SIEMENS, PCI_DEVICE_ID_SIEMENS_DSCC4, diff -Nru a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c --- a/drivers/net/wan/farsync.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/wan/farsync.c Wed Oct 8 12:24:57 2003 @@ -317,7 +317,7 @@ }; /* Calculate offset of a buffer object within the shared memory window */ -#define BUF_OFFSET(X) ((unsigned int)&(((struct buf_window *)BFM_BASE)->X)) +#define BUF_OFFSET(X) offsetof(struct buf_window, X) #pragma pack() diff -Nru a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c --- a/drivers/net/wan/hdlc_generic.c Wed Oct 8 12:24:55 2003 +++ b/drivers/net/wan/hdlc_generic.c Wed Oct 8 12:24:55 2003 @@ -279,11 +279,9 @@ EXPORT_SYMBOL(register_hdlc_device); EXPORT_SYMBOL(unregister_hdlc_device); -static struct packet_type hdlc_packet_type = -{ +static struct packet_type hdlc_packet_type = { .type = __constant_htons(ETH_P_HDLC), .func = hdlc_rcv, - .data = PKT_CAN_SHARE_SKB, }; diff -Nru a/drivers/net/wan/hdlc_x25.c b/drivers/net/wan/hdlc_x25.c --- a/drivers/net/wan/hdlc_x25.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/wan/hdlc_x25.c Wed Oct 8 12:24:57 2003 @@ -68,7 +68,12 @@ hdlc_device *hdlc = token; unsigned char *ptr; - ptr = skb_push(skb, 1); + skb_push(skb, 1); + + if (skb_cow(skb, 1)) + return NET_RX_DROP; + + ptr = skb->data; *ptr = 0; skb->dev = hdlc_to_dev(hdlc); diff -Nru a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c --- a/drivers/net/wan/lapbether.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/wan/lapbether.c Wed Oct 8 12:24:56 2003 @@ -89,14 +89,18 @@ int len, err; struct lapbethdev *lapbeth; - skb->sk = NULL; /* Initially we don't know who it's for */ + if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) + return NET_RX_DROP; + + if (!pskb_may_pull(skb, 2)) + goto drop; rcu_read_lock(); lapbeth = lapbeth_get_x25_dev(dev); if (!lapbeth) - goto drop; + goto drop_unlock; if (!netif_running(lapbeth->axdev)) - goto drop; + goto drop_unlock; lapbeth->stats.rx_packets++; @@ -108,14 +112,17 @@ if ((err = lapb_data_received(lapbeth, skb)) != LAPB_OK) { printk(KERN_DEBUG "lapbether: lapb_data_received err - %d\n", err); - goto drop; + goto drop_unlock; } out: rcu_read_unlock(); return 0; -drop: +drop_unlock: kfree_skb(skb); goto out; +drop: + kfree_skb(skb); + return 0; } static int lapbeth_data_indication(void *token, struct sk_buff *skb) @@ -123,7 +130,12 @@ struct lapbethdev *lapbeth = (struct lapbethdev *)token; unsigned char *ptr; - ptr = skb_push(skb, 1); + skb_push(skb, 1); + + if (skb_cow(skb, 1)) + return NET_RX_DROP; + + ptr = skb->data; *ptr = 0x00; skb->dev = lapbeth->axdev; diff -Nru a/drivers/net/wan/sbni.c b/drivers/net/wan/sbni.c --- a/drivers/net/wan/sbni.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/wan/sbni.c Wed Oct 8 12:24:56 2003 @@ -1300,12 +1300,9 @@ switch( cmd ) { case SIOCDEVGETINSTATS : - error = verify_area( VERIFY_WRITE, ifr->ifr_data, - sizeof(struct sbni_in_stats) ); - if( !error ) - if (copy_to_user( ifr->ifr_data, &nl->in_stats, - sizeof(struct sbni_in_stats) )) - return -EFAULT; + if (copy_to_user( ifr->ifr_data, &nl->in_stats, + sizeof(struct sbni_in_stats) )) + error = -EFAULT; break; case SIOCDEVRESINSTATS : @@ -1321,11 +1318,8 @@ flags.rxl = nl->cur_rxl_index; flags.fixed_rxl = nl->delta_rxl == 0; - error = verify_area( VERIFY_WRITE, ifr->ifr_data, - sizeof flags ); - if( !error ) - if (copy_to_user( ifr->ifr_data, &flags, sizeof flags )) - return -EFAULT; + if (copy_to_user( ifr->ifr_data, &flags, sizeof flags )) + error = -EFAULT; break; case SIOCDEVSHWSTATE : @@ -1352,10 +1346,6 @@ case SIOCDEVENSLAVE : if( current->euid != 0 ) /* root only */ return -EPERM; - - if( (error = verify_area( VERIFY_READ, ifr->ifr_data, - sizeof slave_name )) != 0 ) - return error; if (copy_from_user( slave_name, ifr->ifr_data, sizeof slave_name )) return -EFAULT; diff -Nru a/drivers/net/wan/syncppp.c b/drivers/net/wan/syncppp.c --- a/drivers/net/wan/syncppp.c Wed Oct 8 12:24:56 2003 +++ b/drivers/net/wan/syncppp.c Wed Oct 8 12:24:56 2003 @@ -236,7 +236,7 @@ sp->ipkts++; } - if (skb->len <= PPP_HEADER_LEN) { + if (!pskb_may_pull(skb, PPP_HEADER_LEN)) { /* Too small packet, drop it. */ if (sp->pp_flags & PP_DEBUG) printk (KERN_DEBUG "%s: input packet is too small, %d bytes\n", @@ -473,7 +473,7 @@ u8 *p, opt[6]; u32 rmagic; - if (len < 4) { + if (!pskb_may_pull(skb, sizeof(struct lcp_header))) { if (sp->pp_flags & PP_DEBUG) printk (KERN_WARNING "%s: invalid lcp packet length: %d bytes\n", dev->name, len); @@ -707,7 +707,9 @@ struct cisco_packet *h; struct net_device *dev = sp->pp_if; - if (skb->len != CISCO_PACKET_LEN && skb->len != CISCO_BIG_PACKET_LEN) { + if (!pskb_may_pull(skb, sizeof(struct cisco_packet)) + || (skb->len != CISCO_PACKET_LEN + && skb->len != CISCO_BIG_PACKET_LEN)) { if (sp->pp_flags & PP_DEBUG) printk (KERN_WARNING "%s: invalid cisco packet length: %d bytes\n", dev->name, skb->len); @@ -1211,8 +1213,7 @@ struct net_device *dev = sp->pp_if; int len = skb->len; - if (len < 4) - { + if (!pskb_may_pull(skb, sizeof(struct lcp_header))) { if (sp->pp_flags & PP_DEBUG) printk (KERN_WARNING "%s: invalid ipcp packet length: %d bytes\n", dev->name, len); @@ -1454,7 +1455,6 @@ struct packet_type sppp_packet_type = { .type = __constant_htons(ETH_P_WAN_PPP), .func = sppp_rcv, - .data = PKT_CAN_SHARE_SKB, }; static char banner[] __initdata = diff -Nru a/drivers/net/wireless/arlan-main.c b/drivers/net/wireless/arlan-main.c --- a/drivers/net/wireless/arlan-main.c Wed Oct 8 12:24:57 2003 +++ b/drivers/net/wireless/arlan-main.c Wed Oct 8 12:24:57 2003 @@ -5,7 +5,6 @@ * This module provides support for the Arlan 655 card made by Aironet */ -#include #include #include "arlan.h" @@ -721,9 +720,9 @@ else { netif_stop_queue (dev); - return -1; IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "TX TAIL & HEAD full, return, tailStart %d headEnd %d\n", tailStarts, headEnds); + return -1; } priv->out_bytes += length; priv->out_bytes10 += length; @@ -1880,6 +1879,8 @@ } #ifdef MODULE + +static int probe = probeUNKNOWN; static int __init arlan_find_devices(void) { diff -Nru a/drivers/parisc/superio.c b/drivers/parisc/superio.c --- a/drivers/parisc/superio.c Wed Oct 8 12:24:57 2003 +++ b/drivers/parisc/superio.c Wed Oct 8 12:24:57 2003 @@ -530,11 +530,6 @@ static int __init superio_modinit(void) { -#ifdef CONFIG_SERIAL_8250 - extern int serial8250_init(void); - serial8250_init(); -#endif - return pci_module_init(&superio_driver); } @@ -543,5 +538,10 @@ pci_unregister_driver(&superio_driver); } -module_init(superio_modinit); +/* Make late initcall to ensure the serial and tty layers are initialised + * before we start superio. + * + * FIXME: does this break the superio console? + */ +late_initcall(superio_modinit); module_exit(superio_exit); diff -Nru a/drivers/pci/Makefile b/drivers/pci/Makefile --- a/drivers/pci/Makefile Wed Oct 8 12:24:57 2003 +++ b/drivers/pci/Makefile Wed Oct 8 12:24:57 2003 @@ -4,7 +4,6 @@ obj-y += access.o bus.o probe.o remove.o pci.o pool.o quirks.o \ names.o pci-driver.o search.o pci-sysfs.o -obj-$(CONFIG_PM) += power.o obj-$(CONFIG_PROC_FS) += proc.o ifndef CONFIG_SPARC64 diff -Nru a/drivers/pci/hotplug/cpqphp.h b/drivers/pci/hotplug/cpqphp.h --- a/drivers/pci/hotplug/cpqphp.h Wed Oct 8 12:24:57 2003 +++ b/drivers/pci/hotplug/cpqphp.h Wed Oct 8 12:24:57 2003 @@ -766,7 +766,6 @@ set_current_state(TASK_INTERRUPTIBLE); /* Sleep for up to 1 second to wait for the LED to change. */ schedule_timeout(1*HZ); - set_current_state(TASK_RUNNING); remove_wait_queue(&ctrl->queue, &wait); if (signal_pending(current)) retval = -EINTR; diff -Nru a/drivers/pci/hotplug/pci_hotplug.h b/drivers/pci/hotplug/pci_hotplug.h --- a/drivers/pci/hotplug/pci_hotplug.h Wed Oct 8 12:24:56 2003 +++ b/drivers/pci/hotplug/pci_hotplug.h Wed Oct 8 12:24:56 2003 @@ -145,6 +145,7 @@ extern int pci_hp_deregister (struct hotplug_slot *slot); extern int pci_hp_change_slot_info (struct hotplug_slot *slot, struct hotplug_slot_info *info); +extern struct subsystem pci_hotplug_slots_subsys; #endif diff -Nru a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c --- a/drivers/pci/hotplug/pci_hotplug_core.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pci/hotplug/pci_hotplug_core.c Wed Oct 8 12:24:57 2003 @@ -69,7 +69,7 @@ static LIST_HEAD(pci_hotplug_slot_list); -static struct subsystem hotplug_slots_subsys; +struct subsystem pci_hotplug_slots_subsys; static ssize_t hotplug_slot_attr_show(struct kobject *kobj, struct attribute *attr, char *buf) @@ -104,7 +104,7 @@ .release = &hotplug_slot_release, }; -static decl_subsys(hotplug_slots, &hotplug_slot_ktype, NULL); +decl_subsys(pci_hotplug_slots, &hotplug_slot_ktype, NULL); /* these strings match up with the values in pci_bus_speed */ @@ -534,7 +534,7 @@ return -EINVAL; strlcpy(slot->kobj.name, slot->name, KOBJ_NAME_LEN); - kobj_set_kset_s(slot, hotplug_slots_subsys); + kobj_set_kset_s(slot, pci_hotplug_slots_subsys); /* this can fail if we have already registered a slot with the same name */ if (kobject_register(&slot->kobj)) { @@ -629,8 +629,8 @@ { int result; - kset_set_kset_s(&hotplug_slots_subsys, pci_bus_type.subsys); - result = subsystem_register(&hotplug_slots_subsys); + kset_set_kset_s(&pci_hotplug_slots_subsys, pci_bus_type.subsys); + result = subsystem_register(&pci_hotplug_slots_subsys); if (result) { err("Register subsys with error %d\n", result); goto exit; @@ -645,7 +645,7 @@ goto exit; err_subsys: - subsystem_unregister(&hotplug_slots_subsys); + subsystem_unregister(&pci_hotplug_slots_subsys); exit: return result; } @@ -653,7 +653,7 @@ static void __exit pci_hotplug_exit (void) { cpci_hotplug_exit(); - subsystem_unregister(&hotplug_slots_subsys); + subsystem_unregister(&pci_hotplug_slots_subsys); } module_init(pci_hotplug_init); @@ -665,6 +665,7 @@ MODULE_PARM(debug, "i"); MODULE_PARM_DESC(debug, "Debugging mode enabled or not"); +EXPORT_SYMBOL_GPL(pci_hotplug_slots_subsys); EXPORT_SYMBOL_GPL(pci_hp_register); EXPORT_SYMBOL_GPL(pci_hp_deregister); EXPORT_SYMBOL_GPL(pci_hp_change_slot_info); diff -Nru a/drivers/pci/pci.c b/drivers/pci/pci.c --- a/drivers/pci/pci.c Wed Oct 8 12:24:56 2003 +++ b/drivers/pci/pci.c Wed Oct 8 12:24:56 2003 @@ -126,11 +126,13 @@ /** * pci_bus_find_capability - query for devices' capabilities - * @dev: PCI device to query - * @cap: capability code + * @bus: the PCI bus to query + * @devfn: PCI device to query + * @cap: capability code * * Like pci_find_capability() but works for pci devices that do not have a * pci_dev structure set up yet. + * * Returns the address of the requested capability structure within the * device's PCI configuration space or 0 in case the device does not * support it. diff -Nru a/drivers/pci/pool.c b/drivers/pci/pool.c --- a/drivers/pci/pool.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pci/pool.c Wed Oct 8 12:24:57 2003 @@ -296,7 +296,6 @@ schedule_timeout (POOL_TIMEOUT_JIFFIES); - current->state = TASK_RUNNING; remove_wait_queue (&pool->waitq, &wait); goto restart; } diff -Nru a/drivers/pci/power.c b/drivers/pci/power.c --- a/drivers/pci/power.c Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,159 +0,0 @@ -#include -#include -#include - -/* - * PCI Power management.. - * - * This needs to be done centralized, so that we power manage PCI - * devices in the right order: we should not shut down PCI bridges - * before we've shut down the devices behind them, and we should - * not wake up devices before we've woken up the bridge to the - * device.. Eh? - * - * We do not touch devices that don't have a driver that exports - * a suspend/resume function. That is just too dangerous. If the default - * PCI suspend/resume functions work for a device, the driver can - * easily implement them (ie just have a suspend function that calls - * the pci_set_power_state() function). - */ - -static int pci_pm_save_state_device(struct pci_dev *dev, u32 state) -{ - int error = 0; - if (dev) { - struct pci_driver *driver = dev->driver; - if (driver && driver->save_state) - error = driver->save_state(dev,state); - } - return error; -} - -static int pci_pm_suspend_device(struct pci_dev *dev, u32 state) -{ - int error = 0; - if (dev) { - struct pci_driver *driver = dev->driver; - if (driver && driver->suspend) - error = driver->suspend(dev,state); - } - return error; -} - -static int pci_pm_resume_device(struct pci_dev *dev) -{ - int error = 0; - if (dev) { - struct pci_driver *driver = dev->driver; - if (driver && driver->resume) - error = driver->resume(dev); - } - return error; -} - -static int pci_pm_save_state_bus(struct pci_bus *bus, u32 state) -{ - struct list_head *list; - int error = 0; - - list_for_each(list, &bus->children) { - error = pci_pm_save_state_bus(pci_bus_b(list),state); - if (error) return error; - } - list_for_each(list, &bus->devices) { - error = pci_pm_save_state_device(pci_dev_b(list),state); - if (error) return error; - } - return 0; -} - -static int pci_pm_suspend_bus(struct pci_bus *bus, u32 state) -{ - struct list_head *list; - - /* Walk the bus children list */ - list_for_each(list, &bus->children) - pci_pm_suspend_bus(pci_bus_b(list),state); - - /* Walk the device children list */ - list_for_each(list, &bus->devices) - pci_pm_suspend_device(pci_dev_b(list),state); - return 0; -} - -static int pci_pm_resume_bus(struct pci_bus *bus) -{ - struct list_head *list; - - /* Walk the device children list */ - list_for_each(list, &bus->devices) - pci_pm_resume_device(pci_dev_b(list)); - - /* And then walk the bus children */ - list_for_each(list, &bus->children) - pci_pm_resume_bus(pci_bus_b(list)); - return 0; -} - -static int pci_pm_save_state(u32 state) -{ - struct pci_bus *bus = NULL; - int error = 0; - - while ((bus = pci_find_next_bus(bus)) != NULL) { - error = pci_pm_save_state_bus(bus,state); - if (!error) - error = pci_pm_save_state_device(bus->self,state); - } - return error; -} - -static int pci_pm_suspend(u32 state) -{ - struct pci_bus *bus = NULL; - - while ((bus = pci_find_next_bus(bus)) != NULL) { - pci_pm_suspend_bus(bus,state); - pci_pm_suspend_device(bus->self,state); - } - return 0; -} - -static int pci_pm_resume(void) -{ - struct pci_bus *bus = NULL; - - while ((bus = pci_find_next_bus(bus)) != NULL) { - pci_pm_resume_device(bus->self); - pci_pm_resume_bus(bus); - } - return 0; -} - -static int -pci_pm_callback(struct pm_dev *pm_device, pm_request_t rqst, void *data) -{ - int error = 0; - - switch (rqst) { - case PM_SAVE_STATE: - error = pci_pm_save_state((unsigned long)data); - break; - case PM_SUSPEND: - error = pci_pm_suspend((unsigned long)data); - break; - case PM_RESUME: - error = pci_pm_resume(); - break; - default: break; - } - return error; -} - -static int __init pci_pm_init(void) -{ - pm_register(PM_PCI_DEV, 0, pci_pm_callback); - return 0; -} - -subsys_initcall(pci_pm_init); diff -Nru a/drivers/pci/quirks.c b/drivers/pci/quirks.c --- a/drivers/pci/quirks.c Wed Oct 8 12:24:55 2003 +++ b/drivers/pci/quirks.c Wed Oct 8 12:24:55 2003 @@ -750,6 +750,9 @@ /* * The main table of quirks. + * + * Note: any hooks for hotpluggable devices in this table must _NOT_ + * be declared __init. */ static struct pci_fixup pci_fixups[] __devinitdata = { diff -Nru a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c --- a/drivers/pcmcia/au1000_generic.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pcmcia/au1000_generic.c Wed Oct 8 12:24:57 2003 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -140,7 +139,7 @@ struct pcmcia_state state; unsigned int i; - printk("\nAu1x00 PCMCIA (CS release %s)\n", CS_RELEASE); + printk("\nAu1x00 PCMCIA\n"); #ifndef CONFIG_64BIT_PHYS_ADDR printk(KERN_ERR "Au1x00 PCMCIA 36 bit IO support not enabled\n"); diff -Nru a/drivers/pcmcia/au1000_pb1x00.c b/drivers/pcmcia/au1000_pb1x00.c --- a/drivers/pcmcia/au1000_pb1x00.c Wed Oct 8 12:24:56 2003 +++ b/drivers/pcmcia/au1000_pb1x00.c Wed Oct 8 12:24:56 2003 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include diff -Nru a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c --- a/drivers/pcmcia/cs.c Wed Oct 8 12:24:56 2003 +++ b/drivers/pcmcia/cs.c Wed Oct 8 12:24:56 2003 @@ -82,7 +82,7 @@ #define OPTIONS PCI_OPT CB_OPT PM_OPT #endif -static const char *release = "Linux Kernel Card Services " CS_RELEASE; +static const char *release = "Linux Kernel Card Services"; static const char *options = "options: " OPTIONS; /*====================================================================*/ @@ -90,8 +90,7 @@ /* Module parameters */ MODULE_AUTHOR("David Hinds "); -MODULE_DESCRIPTION("Linux Kernel Card Services " CS_RELEASE - "\n options:" OPTIONS); +MODULE_DESCRIPTION("Linux Kernel Card Services\noptions:" OPTIONS); MODULE_LICENSE("Dual MPL/GPL"); #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i") @@ -450,6 +449,7 @@ s->state &= SOCKET_PRESENT|SOCKET_INUSE; s->socket = dead_socket; s->ops->init(s); + s->ops->set_socket(s, &s->socket); s->irq.AssignedIRQ = s->irq.Config = 0; s->lock_count = 0; destroy_cis_cache(s); @@ -457,15 +457,6 @@ kfree(s->fake_cis); s->fake_cis = NULL; } - /* Should not the socket be forced quiet as well? e.g. turn off Vcc */ - /* Without these changes, the socket is left hot, even though card-services */ - /* realizes that no card is in place. */ - s->socket.flags &= ~SS_OUTPUT_ENA; - s->socket.Vpp = 0; - s->socket.Vcc = 0; - s->socket.io_irq = 0; - s->ops->set_socket(s, &s->socket); - /* */ #ifdef CONFIG_CARDBUS cb_free(s); #endif @@ -485,6 +476,14 @@ } free_regions(&s->a_region); free_regions(&s->c_region); + + { + int status; + s->ops->get_status(s, &status); + if (status & SS_POWERON) { + printk(KERN_ERR "PCMCIA: socket %p: *** DANGER *** unable to remove socket power\n", s); + } + } } /* shutdown_socket */ /*====================================================================== @@ -639,6 +638,12 @@ set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(cs_to_timeout(vcc_settle)); + skt->ops->get_status(skt, &status); + if (!(status & SS_POWERON)) { + pcmcia_error(skt, "unable to apply power.\n"); + return CS_BAD_TYPE; + } + return socket_reset(skt); } @@ -698,6 +703,7 @@ skt->socket = dead_socket; skt->ops->init(skt); + skt->ops->set_socket(skt, &skt->socket); ret = socket_setup(skt, resume_delay); if (ret == CS_SUCCESS) { @@ -770,6 +776,7 @@ skt->socket = dead_socket; skt->ops->init(skt); + skt->ops->set_socket(skt, &skt->socket); /* register with the device core */ ret = class_device_register(&skt->dev); @@ -1338,7 +1345,7 @@ } else c = CONFIG(handle); if ((c != NULL) && (c->state & CONFIG_LOCKED) && - (c->IntType & INT_MEMORY_AND_IO)) { + (c->IntType & (INT_MEMORY_AND_IO | INT_ZOOMED_VIDEO))) { u_char reg; if (c->Present & PRESENT_PIN_REPLACE) { read_cis_mem(s, 1, (c->ConfigBase+CISREG_PRR)>>1, 1, ®); @@ -1749,6 +1756,8 @@ c->Attributes = req->Attributes; if (req->IntType & INT_MEMORY_AND_IO) s->socket.flags |= SS_IOCARD; + if (req->IntType & INT_ZOOMED_VIDEO) + s->socket.flags |= SS_ZVCARD | SS_IOCARD; if (req->Attributes & CONF_ENABLE_DMA) s->socket.flags |= SS_DMA_MODE; if (req->Attributes & CONF_ENABLE_SPKR) diff -Nru a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c --- a/drivers/pcmcia/ds.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pcmcia/ds.c Wed Oct 8 12:24:57 2003 @@ -64,7 +64,7 @@ /* Module parameters */ MODULE_AUTHOR("David Hinds "); -MODULE_DESCRIPTION("PCMCIA Driver Services " CS_RELEASE); +MODULE_DESCRIPTION("PCMCIA Driver Services"); MODULE_LICENSE("Dual MPL/GPL"); #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i") diff -Nru a/drivers/pcmcia/hd64465_ss.c b/drivers/pcmcia/hd64465_ss.c --- a/drivers/pcmcia/hd64465_ss.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pcmcia/hd64465_ss.c Wed Oct 8 12:24:57 2003 @@ -347,11 +347,7 @@ hs_socket_t *sp = container_of(s, struct hs_socket_t, socket); DPRINTK("hs_init(%d)\n", sp->number); - - sp->state.Vcc = 0; - sp->state.Vpp = 0; - hs_set_voltages(sp, 0, 0); - + return 0; } diff -Nru a/drivers/pcmcia/i82092.c b/drivers/pcmcia/i82092.c --- a/drivers/pcmcia/i82092.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pcmcia/i82092.c Wed Oct 8 12:24:57 2003 @@ -426,7 +426,6 @@ enter("i82092aa_init"); mem.sys_stop = 0x0fff; - i82092aa_set_socket(sock, &dead_socket); for (i = 0; i < 2; i++) { io.map = i; i82092aa_set_io_map(sock, &io); diff -Nru a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c --- a/drivers/pcmcia/i82365.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pcmcia/i82365.c Wed Oct 8 12:24:57 2003 @@ -1322,7 +1322,6 @@ pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 }; mem.sys_stop = 0x1000; - pcic_set_socket(s, &dead_socket); for (i = 0; i < 2; i++) { io.map = i; pcic_set_io_map(s, &io); diff -Nru a/drivers/pcmcia/sa11xx_core.c b/drivers/pcmcia/sa11xx_core.c --- a/drivers/pcmcia/sa11xx_core.c Wed Oct 8 12:24:56 2003 +++ b/drivers/pcmcia/sa11xx_core.c Wed Oct 8 12:24:56 2003 @@ -232,8 +232,6 @@ DEBUG(2, "%s(): initializing socket %u\n", __FUNCTION__, skt->nr); skt->ops->socket_init(skt); - sa1100_pcmcia_config_skt(skt, &dead_socket); - return 0; } @@ -946,7 +944,7 @@ { int ret; - printk(KERN_INFO "SA11xx PCMCIA (CS release %s)\n", CS_RELEASE); + printk(KERN_INFO "SA11xx PCMCIA\n"); ret = cpufreq_register_notifier(&sa1100_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER); diff -Nru a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c --- a/drivers/pcmcia/tcic.c Wed Oct 8 12:24:57 2003 +++ b/drivers/pcmcia/tcic.c Wed Oct 8 12:24:57 2003 @@ -865,7 +865,6 @@ pccard_mem_map mem = { 0, 0, 0, 0, 0, 0 }; mem.sys_stop = 0x1000; - tcic_set_socket(s, &dead_socket); for (i = 0; i < 2; i++) { io.map = i; tcic_set_io_map(s, &io); diff -Nru a/drivers/s390/Makefile b/drivers/s390/Makefile --- a/drivers/s390/Makefile Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/Makefile Wed Oct 8 12:24:56 2003 @@ -3,6 +3,6 @@ # obj-y += s390mach.o sysinfo.o -obj-y += cio/ block/ char/ net/ +obj-y += cio/ block/ char/ net/ scsi/ drivers-y += drivers/s390/built-in.o diff -Nru a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c --- a/drivers/s390/block/dasd.c Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/block/dasd.c Wed Oct 8 12:24:56 2003 @@ -7,7 +7,7 @@ * Bugreports.to..: * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 * - * $Revision: 1.110 $ + * $Revision: 1.114 $ */ #include @@ -1142,8 +1142,8 @@ req = elv_next_request(queue); if (device->ro_flag && rq_data_dir(req) == WRITE) { DBF_EVENT(DBF_ERR, - "(%04x) Rejecting write request %p", - _ccw_device_get_device_number(device->cdev), + "(%s) Rejecting write request %p", + device->cdev->dev.bus_id, req); blkdev_dequeue_request(req); dasd_end_request(req, 0); @@ -1154,8 +1154,8 @@ if (PTR_ERR(cqr) == -ENOMEM) break; /* terminate request queue loop */ DBF_EVENT(DBF_ERR, - "(%04x) CCW creation failed on request %p", - _ccw_device_get_device_number(device->cdev), + "(%s) CCW creation failed on request %p", + device->cdev->dev.bus_id, req); blkdev_dequeue_request(req); dasd_end_request(req, 0); @@ -1728,12 +1728,10 @@ dasd_generic_probe (struct ccw_device *cdev, struct dasd_discipline *discipline) { - int devno; int ret = 0; - devno = _ccw_device_get_device_number(cdev); - if (dasd_autodetect - && (ret = dasd_add_range(devno, devno, DASD_FEATURE_DEFAULT))) { + if (dasd_autodetect && + (ret = dasd_add_busid(cdev->dev.bus_id, DASD_FEATURE_DEFAULT))) { printk (KERN_WARNING "dasd_generic_probe: cannot autodetect %s\n", cdev->dev.bus_id); @@ -1830,12 +1828,6 @@ struct dasd_device *device; device = cdev->dev.driver_data; - if (atomic_read(&device->open_count) > 0) { - printk (KERN_WARNING "Can't offline dasd device with open" - " count = %i.\n", - atomic_read(&device->open_count)); - return -EBUSY; - } dasd_set_target_state(device, DASD_STATE_NEW); dasd_delete_device(device); @@ -1854,7 +1846,6 @@ struct device_driver *drv; struct device *d, *dev; struct ccw_device *cdev; - int devno; drv = get_driver(&dasd_discipline_driver->driver); down_read(&drv->bus->subsys.rwsem); @@ -1864,8 +1855,7 @@ if (!dev) continue; cdev = to_ccwdev(dev); - devno = _ccw_device_get_device_number(cdev); - if (dasd_autodetect || dasd_devno_in_range(devno) == 0) + if (dasd_autodetect || dasd_busid_known(cdev->dev.bus_id) == 0) ccw_device_set_online(cdev); put_device(dev); } @@ -1934,31 +1924,6 @@ static DEVICE_ATTR(use_diag, 0644, dasd_use_diag_show, dasd_use_diag_store); -#if 0 -/* this file shows the same information as /proc/dasd/devices using - * an inaccaptable interface */ -/* TODO: Split this up into smaller files! */ -static ssize_t -dasd_devices_show(struct device *dev, char *buf) -{ - - struct dasd_device *device; - dasd_devmap_t *devmap; - - devmap = NULL; - device = dev->driver_data; - if (device) - devmap = dasd_devmap_from_devno(device->devno); - - if (!devmap) - return sprintf(buf, "unused\n"); - - return min ((size_t) dasd_devices_print(devmap, buf), PAGE_SIZE); -} - -static DEVICE_ATTR(dasd, 0444, dasd_devices_show, 0); -#endif - static ssize_t dasd_discipline_show(struct device *dev, char *buf) { @@ -1973,7 +1938,6 @@ static DEVICE_ATTR(discipline, 0444, dasd_discipline_show, NULL); static struct attribute * dasd_attrs[] = { - //&dev_attr_dasd.attr, &dev_attr_readonly.attr, &dev_attr_discipline.attr, &dev_attr_use_diag.attr, diff -Nru a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c --- a/drivers/s390/block/dasd_devmap.c Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/block/dasd_devmap.c Wed Oct 8 12:24:56 2003 @@ -11,7 +11,7 @@ * functions may not be called from interrupt context. In particular * dasd_get_device is a no-no from interrupt context. * - * $Revision: 1.17 $ + * $Revision: 1.19 $ */ #include @@ -37,10 +37,9 @@ * to the device index. */ struct dasd_devmap { - struct list_head devindex_list; - struct list_head devno_list; + struct list_head list; + char bus_id[BUS_ID_SIZE]; unsigned int devindex; - unsigned short devno; unsigned short features; struct dasd_device *device; }; @@ -48,12 +47,15 @@ /* * Parameter parsing functions for dasd= parameter. The syntax is: * : (0x)?[0-9a-fA-F]+ + * : [0-0a-f]\.[0-9a-f]\.(0x)?[0-9a-fA-F]+ * : ro * : \((:)*\) - * : (-)?? + * : (-)?? + * : (-)?? + * : | * : dasd_diag_mod|dasd_eckd_mod|dasd_fba_mod * - * : autodetect|probeonly|(,)* + * : autodetect|probeonly|(,)* */ int dasd_probeonly = 0; /* is true, when probeonly mode is active */ @@ -74,10 +76,20 @@ /* * Hash lists for devmap structures. */ -static struct list_head dasd_devindex_hashlists[256]; -static struct list_head dasd_devno_hashlists[256]; +static struct list_head dasd_hashlists[256]; int dasd_max_devindex; +static inline int +dasd_hash_busid(char *bus_id) +{ + int hash, i; + + hash = 0; + for (i = 0; (i < BUS_ID_SIZE) && *bus_id; i++, bus_id++) + hash += *bus_id; + return hash & 0xff; +} + #ifndef MODULE /* * The parameter parsing functions for builtin-drivers are called @@ -98,27 +110,47 @@ #endif /* #ifndef MODULE */ /* - * Read a device number from a string. The number is always in hex, - * a leading 0x is accepted. + * Read a device busid/devno from a string. */ static inline int -dasd_devno(char *str, char **endp) +dasd_busid(char **str, int *id0, int *id1, int *devno) { - int val; + int val, old_style; - /* remove leading '0x' */ - if (*str == '0') { - str++; - if (*str == 'x') - str++; + /* check for leading '0x' */ + old_style = 0; + if ((*str)[0] == '0' && (*str)[1] == 'x') { + *str += 2; + old_style = 1; } - /* We require at least one hex digit */ - if (!isxdigit(*str)) + if (!isxdigit((*str)[0])) /* We require at least one hex digit */ + return -EINVAL; + val = simple_strtoul(*str, str, 16); + if (old_style || (*str)[0] != '.') { + *id0 = *id1 = 0; + if (val < 0 || val > 0xffff) + return -EINVAL; + *devno = val; + return 0; + } + /* New style x.y.z busid */ + if (val < 0 || val > 0xff) + return -EINVAL; + *id0 = val; + (*str)++; + if (!isxdigit((*str)[0])) /* We require at least one hex digit */ return -EINVAL; - val = simple_strtoul(str, endp, 16); - if ((val > 0xFFFF) || (val < 0)) + val = simple_strtoul(*str, str, 16); + if (val < 0 || val > 0xff || (*str)++[0] != '.') return -EINVAL; - return val; + *id1 = val; + if (!isxdigit((*str)[0])) /* We require at least one hex digit */ + return -EINVAL; + val = simple_strtoul(*str, str, 16); + if (val < 0 || val > 0xffff) + return -EINVAL; + *devno = val; + return 0; } /* @@ -171,18 +203,37 @@ static inline int dasd_ranges_list(char *str) { - int from, to, features, rc; + int from, from_id0, from_id1; + int to, to_id0, to_id1; + int features, rc; + char bus_id[BUS_ID_SIZE+1], *orig_str; + orig_str = str; while (1) { - to = from = dasd_devno(str, &str); - if (*str == '-') { - str++; - to = dasd_devno(str, &str); + rc = dasd_busid(&str, &from_id0, &from_id1, &from); + if (rc == 0) { + to = from; + to_id0 = from_id0; + to_id1 = from_id1; + if (*str == '-') { + str++; + rc = dasd_busid(&str, &to_id0, &to_id1, &to); + } + } + if (rc == 0 && + (from_id0 != to_id0 || from_id1 != to_id1 || from > to)) + rc = -EINVAL; + if (rc) { + MESSAGE(KERN_ERR, "Invalid device range %s", orig_str); + return rc; } features = dasd_feature_list(str, &str); - /* Negative numbers in from/to/features indicate errors */ - if (from >= 0 && to >= 0 && features >= 0) { - rc = dasd_add_range(from, to, features); + if (features < 0) + return -EINVAL; + while (from <= to) { + sprintf(bus_id, "%01x.%01x.%04x", + from_id0, from_id1, from++); + rc = dasd_add_busid(bus_id, features); if (rc) return rc; } @@ -243,77 +294,74 @@ } /* - * Add a range of devices and creates the corresponding devreg_t - * structures. The order of the ranges added through this function - * will define the kdevs for the individual devices. + * Add a devmap for the device specified by busid. It is possible that + * the devmap already exists (dasd= parameter). The order of the devices + * added through this function will define the kdevs for the individual + * devices. */ int -dasd_add_range(int from, int to, int features) +dasd_add_busid(char *bus_id, int features) { - int devindex; - int devno; + struct dasd_devmap *devmap, *new, *tmp; + int hash; - if (from > to) { - MESSAGE(KERN_ERR, - "Invalid device range %04x-%04x", from, to); - return -EINVAL; - } + new = (struct dasd_devmap *) + kmalloc(sizeof(struct dasd_devmap), GFP_KERNEL); + if (!new) + return -ENOMEM; spin_lock(&dasd_devmap_lock); - for (devno = from; devno <= to; devno++) { - struct dasd_devmap *devmap, *tmp; - - devmap = NULL; - /* Find previous devmap for device number i */ - list_for_each_entry(tmp, &dasd_devno_hashlists[devno & 255], - devno_list) { - if (tmp->devno == devno) { - devmap = tmp; - break; - } - } - if (devmap == NULL) { - /* This devno is new. */ - devmap = (struct dasd_devmap *) - kmalloc(sizeof(struct dasd_devmap),GFP_KERNEL); - if (devmap == NULL) - return -ENOMEM; - devindex = dasd_max_devindex++; - devmap->devindex = devindex; - devmap->devno = devno; - devmap->features = features; - devmap->device = NULL; - list_add(&devmap->devindex_list, - &dasd_devindex_hashlists[devindex & 255]); - list_add(&devmap->devno_list, - &dasd_devno_hashlists[devno & 255]); + devmap = 0; + hash = dasd_hash_busid(bus_id); + list_for_each_entry(tmp, &dasd_hashlists[hash], list) + if (strncmp(tmp->bus_id, bus_id, BUS_ID_SIZE) == 0) { + devmap = tmp; + break; } + if (!devmap) { + /* This bus_id is new. */ + new->devindex = dasd_max_devindex++; + strncpy(new->bus_id, bus_id, BUS_ID_SIZE); + new->features = features; + new->device = 0; + list_add(&new->list, &dasd_hashlists[hash]); + devmap = new; + new = 0; } spin_unlock(&dasd_devmap_lock); + if (new) + kfree(new); return 0; } /* - * Check if devno has been added to the list of dasd ranges. + * Find devmap for device with given bus_id. */ -int -dasd_devno_in_range(int devno) +static struct dasd_devmap * +dasd_find_busid(char *bus_id) { - struct dasd_devmap *devmap; - int ret; - - ret = -ENOENT; + struct dasd_devmap *devmap, *tmp; + int hash; + spin_lock(&dasd_devmap_lock); - /* Find devmap for device with device number devno */ - list_for_each_entry(devmap, &dasd_devno_hashlists[devno&255], - devno_list) { - if (devmap->devno == devno) { - /* Found the device. */ - ret = 0; + devmap = 0; + hash = dasd_hash_busid(bus_id); + list_for_each_entry(tmp, &dasd_hashlists[hash], list) { + if (strncmp(tmp->bus_id, bus_id, BUS_ID_SIZE) == 0) { + devmap = tmp; break; } } spin_unlock(&dasd_devmap_lock); - return ret; + return devmap; +} + +/* + * Check if busid has been added to the list of dasd ranges. + */ +int +dasd_busid_known(char *bus_id) +{ + return dasd_find_busid(bus_id) ? 0 : -ENOENT; } /* @@ -323,18 +371,15 @@ static void dasd_forget_ranges(void) { + struct dasd_devmap *devmap, *n; int i; spin_lock(&dasd_devmap_lock); for (i = 0; i < 256; i++) { - struct list_head *l, *next; - struct dasd_devmap *devmap; - list_for_each_safe(l, next, &dasd_devno_hashlists[i]) { - devmap = list_entry(l, struct dasd_devmap, devno_list); + list_for_each_entry_safe(devmap, n, &dasd_hashlists[i], list) { if (devmap->device != NULL) BUG(); - list_del(&devmap->devindex_list); - list_del(&devmap->devno_list); + list_del(&devmap->list); kfree(devmap); } } @@ -342,64 +387,28 @@ } /* - * Find the devmap structure from a devno. Can be removed as soon - * as big minors are available. + * Find the device struct by its device index. */ -static struct dasd_devmap * -dasd_devmap_from_devno(int devno) -{ - struct dasd_devmap *devmap, *tmp; - - devmap = NULL; - spin_lock(&dasd_devmap_lock); - /* Find devmap for device with device number devno */ - list_for_each_entry(tmp, &dasd_devno_hashlists[devno&255], devno_list) { - if (tmp->devno == devno) { - /* Found the device, return devmap */ - devmap = tmp; - break; - } - } - spin_unlock(&dasd_devmap_lock); - return devmap; -} - -/* - * Find the devmap for a device by its device index. Can be removed - * as soon as big minors are available. - */ -static struct dasd_devmap * -dasd_devmap_from_devindex(int devindex) -{ - struct dasd_devmap *devmap, *tmp; - - devmap = NULL; - spin_lock(&dasd_devmap_lock); - /* Find devmap for device with device index devindex */ - list_for_each_entry(tmp, &dasd_devindex_hashlists[devindex & 255], - devindex_list) { - if (tmp->devindex == devindex) { - /* Found the device, return devno */ - devmap = tmp; - break; - } - } - spin_unlock(&dasd_devmap_lock); - return devmap; -} - struct dasd_device * dasd_device_from_devindex(int devindex) { - struct dasd_devmap *devmap; + struct dasd_devmap *devmap, *tmp; struct dasd_device *device; + int i; - devmap = dasd_devmap_from_devindex(devindex); spin_lock(&dasd_devmap_lock); - device = devmap->device; - if (device) + devmap = 0; + for (i = 0; (i < 256) && !devmap; i++) + list_for_each_entry(tmp, &dasd_hashlists[i], list) + if (tmp->devindex == devindex) { + /* Found the devmap for the device. */ + devmap = tmp; + break; + } + if (devmap && devmap->device) { + device = devmap->device; dasd_get_device(device); - else + } else device = ERR_PTR(-ENODEV); spin_unlock(&dasd_devmap_lock); return device; @@ -413,16 +422,15 @@ { struct dasd_devmap *devmap; struct dasd_device *device; - int devno; int rc; - devno = _ccw_device_get_device_number(cdev); - rc = dasd_add_range(devno, devno, DASD_FEATURE_DEFAULT); + rc = dasd_add_busid(cdev->dev.bus_id, DASD_FEATURE_DEFAULT); if (rc) return ERR_PTR(rc); - if (!(devmap = dasd_devmap_from_devno (devno))) - return ERR_PTR(-ENODEV); + devmap = dasd_find_busid(cdev->dev.bus_id); + if (IS_ERR(devmap)) + return (void *) devmap; device = dasd_alloc_device(); if (IS_ERR(device)) @@ -467,11 +475,9 @@ { struct ccw_device *cdev; struct dasd_devmap *devmap; - int devno; /* First remove device pointer from devmap. */ - devno = _ccw_device_get_device_number(device->cdev); - devmap = dasd_devmap_from_devno (devno); + devmap = dasd_find_busid(device->cdev->dev.bus_id); spin_lock(&dasd_devmap_lock); devmap->device = NULL; spin_unlock(&dasd_devmap_lock); @@ -509,10 +515,8 @@ /* Initialize devmap structures. */ dasd_max_devindex = 0; - for (i = 0; i < 256; i++) { - INIT_LIST_HEAD(&dasd_devindex_hashlists[i]); - INIT_LIST_HEAD(&dasd_devno_hashlists[i]); - } + for (i = 0; i < 256; i++) + INIT_LIST_HEAD(&dasd_hashlists[i]); return 0; } diff -Nru a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c --- a/drivers/s390/block/dasd_genhd.c Wed Oct 8 12:24:57 2003 +++ b/drivers/s390/block/dasd_genhd.c Wed Oct 8 12:24:57 2003 @@ -7,9 +7,9 @@ * Bugreports.to..: * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 * - * Dealing with devices registered to multiple major numbers. + * gendisk related functions for the dasd driver. * - * $Revision: 1.38 $ + * $Revision: 1.41 $ */ #include @@ -24,116 +24,26 @@ #include "dasd_int.h" -static spinlock_t dasd_major_lock = SPIN_LOCK_UNLOCKED; -static struct list_head dasd_major_info = LIST_HEAD_INIT(dasd_major_info); - -struct major_info { - struct list_head list; - int major; -}; - -/* - * Register major number for the dasd driver. Call with DASD_MAJOR to - * setup the static dasd device major 94 or with 0 to allocated a major - * dynamically. - */ -static int -dasd_register_major(int major) -{ - struct major_info *mi; - int new_major; - - /* Allocate major info structure. */ - mi = kmalloc(sizeof(struct major_info), GFP_KERNEL); - - /* Check if one of the allocations failed. */ - if (mi == NULL) { - MESSAGE(KERN_WARNING, "%s", - "Cannot get memory to allocate another " - "major number"); - return -ENOMEM; - } - - /* Register block device. */ - new_major = register_blkdev(major, "dasd"); - if (new_major < 0) { - kfree(mi); - return new_major; - } - if (major != 0) - new_major = major; - - /* Initialize major info structure. */ - mi->major = new_major; - - /* Insert the new major info structure into dasd_major_info list. */ - spin_lock(&dasd_major_lock); - list_add_tail(&mi->list, &dasd_major_info); - spin_unlock(&dasd_major_lock); - - return 0; -} - -static void -dasd_unregister_major(struct major_info * mi) -{ - int rc; - - if (mi == NULL) - return; - - /* Delete the major info from dasd_major_info. */ - spin_lock(&dasd_major_lock); - list_del(&mi->list); - spin_unlock(&dasd_major_lock); - - rc = unregister_blkdev(mi->major, "dasd"); - if (rc < 0) - MESSAGE(KERN_WARNING, - "Cannot unregister from major no %d, rc = %d", - mi->major, rc); - - /* Free memory. */ - kfree(mi); -} - /* * Allocate and register gendisk structure for device. */ int dasd_gendisk_alloc(struct dasd_device *device) { - struct major_info *mi; struct gendisk *gdp; - int index, len, rc; + int len; + + /* Make sure the minor for this device exists. */ + if (device->devindex >= DASD_PER_MAJOR) + return -EBUSY; - /* Make sure the major for this device exists. */ - mi = NULL; - while (1) { - spin_lock(&dasd_major_lock); - index = device->devindex; - list_for_each_entry(mi, &dasd_major_info, list) { - if (index < DASD_PER_MAJOR) - break; - index -= DASD_PER_MAJOR; - } - spin_unlock(&dasd_major_lock); - if (index < DASD_PER_MAJOR) - break; - rc = dasd_register_major(0); - if (rc) { - DBF_EXC(DBF_ALERT, "%s", "out of major numbers!"); - return rc; - } - } - gdp = alloc_disk(1 << DASD_PARTN_BITS); if (!gdp) return -ENOMEM; /* Initialize gendisk structure. */ - gdp->major = mi->major; - gdp->first_minor = index << DASD_PARTN_BITS; + gdp->major = DASD_MAJOR; + gdp->first_minor = device->devindex << DASD_PARTN_BITS; gdp->fops = &dasd_device_operations; gdp->driverfs_dev = &device->cdev->dev; @@ -153,8 +63,7 @@ } len += sprintf(gdp->disk_name + len, "%c", 'a'+(device->devindex%26)); - sprintf(gdp->devfs_name, "dasd/%04x", - _ccw_device_get_device_number(device->cdev)); + sprintf(gdp->devfs_name, "dasd/%s", device->cdev->dev.bus_id); if (device->ro_flag) set_disk_ro(gdp, 1); @@ -173,6 +82,7 @@ dasd_gendisk_free(struct dasd_device *device) { del_gendisk(device->gdp); + device->gdp->queue = 0; put_disk(device->gdp); device->gdp = 0; } @@ -221,7 +131,7 @@ int rc; /* Register to static dasd major 94 */ - rc = dasd_register_major(DASD_MAJOR); + rc = register_blkdev(DASD_MAJOR, "dasd"); if (rc != 0) { MESSAGE(KERN_WARNING, "Couldn't register successfully to " @@ -234,10 +144,5 @@ void dasd_gendisk_exit(void) { - struct list_head *l, *n; - - spin_lock(&dasd_major_lock); - list_for_each_safe(l, n, &dasd_major_info) - dasd_unregister_major(list_entry(l, struct major_info, list)); - spin_unlock(&dasd_major_lock); + unregister_blkdev(DASD_MAJOR, "dasd"); } diff -Nru a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h --- a/drivers/s390/block/dasd_int.h Wed Oct 8 12:24:57 2003 +++ b/drivers/s390/block/dasd_int.h Wed Oct 8 12:24:57 2003 @@ -6,7 +6,7 @@ * Bugreports.to..: * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 * - * $Revision: 1.45 $ + * $Revision: 1.48 $ */ #ifndef DASD_INT_H @@ -15,7 +15,7 @@ #ifdef __KERNEL__ /* we keep old device allocation scheme; IOW, minors are still in 0..255 */ -#define DASD_PER_MAJOR ( 1U<<(8-DASD_PARTN_BITS)) +#define DASD_PER_MAJOR (1U << (MINORBITS - DASD_PARTN_BITS)) #define DASD_PARTN_MASK ((1 << DASD_PARTN_BITS) - 1) /* @@ -477,8 +477,8 @@ struct dasd_device *dasd_device_from_devindex(int); int dasd_parse(void); -int dasd_add_range(int, int, int); -int dasd_devno_in_range(int); +int dasd_add_busid(char *, int); +int dasd_busid_known(char *); /* externals in dasd_gendisk.c */ int dasd_gendisk_init(void); diff -Nru a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c --- a/drivers/s390/block/dasd_proc.c Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/block/dasd_proc.c Wed Oct 8 12:24:56 2003 @@ -9,7 +9,7 @@ * * /proc interface for the dasd driver. * - * $Revision: 1.22 $ + * $Revision: 1.23 $ */ #include @@ -59,7 +59,7 @@ if (IS_ERR(device)) return 0; /* Print device number. */ - seq_printf(m, "%04x", _ccw_device_get_device_number(device->cdev)); + seq_printf(m, "%s", device->cdev->dev.bus_id); /* Print discipline string. */ if (device != NULL && device->discipline != NULL) seq_printf(m, "(%s)", device->discipline->name); diff -Nru a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c --- a/drivers/s390/cio/ccwgroup.c Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/cio/ccwgroup.c Wed Oct 8 12:24:56 2003 @@ -1,7 +1,7 @@ /* * drivers/s390/cio/ccwgroup.c * bus driver for ccwgroup - * $Revision: 1.15 $ + * $Revision: 1.17 $ * * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, * IBM Corporation @@ -67,10 +67,7 @@ for (i = 0; i < gdev->count; i++) { sprintf(str, "cdev%d", i); sysfs_remove_link(&gdev->dev.kobj, str); - /* Hack: Make sure we act on still valid subdirs. */ - if (atomic_read(&gdev->cdev[i]->dev.kobj.dentry->d_count)) - sysfs_remove_link(&gdev->cdev[i]->dev.kobj, - "group_device"); + sysfs_remove_link(&gdev->cdev[i]->dev.kobj, "group_device"); } } @@ -187,7 +184,7 @@ .dev = { .bus = &ccwgroup_bus_type, .parent = root, - .release = &ccwgroup_release, + .release = ccwgroup_release, }, }; diff -Nru a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c --- a/drivers/s390/cio/chsc.c Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/cio/chsc.c Wed Oct 8 12:24:56 2003 @@ -1,7 +1,7 @@ /* * drivers/s390/cio/chsc.c * S/390 common I/O routines -- channel subsystem call - * $Revision: 1.77 $ + * $Revision: 1.78 $ * * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, * IBM Corporation @@ -843,6 +843,12 @@ static DEVICE_ATTR(status, 0644, chp_status_show, chp_status_write); + +static void +chp_release(struct device *dev) +{ +} + /* * Entries for chpids on the system bus. * This replaces /proc/chpids. @@ -863,8 +869,10 @@ /* fill in status, etc. */ chp->id = chpid; chp->state = status; - chp->dev.parent = &css_bus_device; - + chp->dev = (struct device) { + .parent = &css_bus_device, + .release = chp_release, + }; snprintf(chp->dev.bus_id, BUS_ID_SIZE, "chp0.%x", chpid); /* make it known to the system */ diff -Nru a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c --- a/drivers/s390/cio/device_ops.c Wed Oct 8 12:24:57 2003 +++ b/drivers/s390/cio/device_ops.c Wed Oct 8 12:24:57 2003 @@ -244,8 +244,7 @@ } static inline int -__ccw_device_retry_loop(struct ccw_device *cdev, struct ccw1 *ccw, long magic, - unsigned long flags) +__ccw_device_retry_loop(struct ccw_device *cdev, struct ccw1 *ccw, long magic) { int ret; struct subchannel *sch; @@ -255,7 +254,9 @@ ret = cio_start (sch, ccw, magic, 0); if ((ret == -EBUSY) || (ret == -EACCES)) { /* Try again later. */ + spin_unlock_irq(&sch->lock); schedule_timeout(1); + spin_lock_irq(&sch->lock); continue; } if (ret != 0) @@ -263,12 +264,12 @@ break; /* Wait for end of request. */ cdev->private->intparm = magic; - spin_unlock_irqrestore(&sch->lock, flags); + spin_unlock_irq(&sch->lock); wait_event(cdev->private->wait_q, (cdev->private->intparm == -EIO) || (cdev->private->intparm == -EAGAIN) || (cdev->private->intparm == 0)); - spin_lock_irqsave(&sch->lock, flags); + spin_lock_irq(&sch->lock); /* Check at least for channel end / device end */ if (cdev->private->intparm == -EIO) { /* Non-retryable error. */ @@ -279,7 +280,9 @@ /* Success. */ break; /* Try again later. */ + spin_unlock_irq(&sch->lock); schedule_timeout(1); + spin_lock_irq(&sch->lock); } while (1); return ret; @@ -300,7 +303,6 @@ { void (*handler)(struct ccw_device *, unsigned long, struct irb *); char dbf_txt[15]; - unsigned long flags; struct subchannel *sch; int ret; struct ccw1 *rdc_ccw; @@ -327,7 +329,7 @@ return ret; } - spin_lock_irqsave(&sch->lock, flags); + spin_lock_irq(&sch->lock); /* Save interrupt handler. */ handler = cdev->handler; /* Temporarily install own handler. */ @@ -338,11 +340,11 @@ ret = -EBUSY; else /* 0x00D9C4C3 == ebcdic "RDC" */ - ret = __ccw_device_retry_loop(cdev, rdc_ccw, 0x00D9C4C3, flags); + ret = __ccw_device_retry_loop(cdev, rdc_ccw, 0x00D9C4C3); /* Restore interrupt handler. */ cdev->handler = handler; - spin_unlock_irqrestore(&sch->lock, flags); + spin_unlock_irq(&sch->lock); clear_normalized_cda (rdc_ccw); kfree(rdc_ccw); @@ -360,7 +362,6 @@ char dbf_txt[15]; struct subchannel *sch; struct ciw *ciw; - unsigned long flags; char *rcd_buf; int ret; struct ccw1 *rcd_ccw; @@ -396,7 +397,7 @@ rcd_ccw->count = ciw->count; rcd_ccw->flags = CCW_FLAG_SLI; - spin_lock_irqsave(&sch->lock, flags); + spin_lock_irq(&sch->lock); /* Save interrupt handler. */ handler = cdev->handler; /* Temporarily install own handler. */ @@ -407,11 +408,11 @@ ret = -EBUSY; else /* 0x00D9C3C4 == ebcdic "RCD" */ - ret = __ccw_device_retry_loop(cdev, rcd_ccw, 0x00D9C3C4, flags); + ret = __ccw_device_retry_loop(cdev, rcd_ccw, 0x00D9C3C4); /* Restore interrupt handler. */ cdev->handler = handler; - spin_unlock_irqrestore(&sch->lock, flags); + spin_unlock_irq(&sch->lock); /* * on success we update the user input parms diff -Nru a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c --- a/drivers/s390/cio/qdio.c Wed Oct 8 12:24:57 2003 +++ b/drivers/s390/cio/qdio.c Wed Oct 8 12:24:57 2003 @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -55,7 +56,7 @@ #include "ioasm.h" #include "chsc.h" -#define VERSION_QDIO_C "$Revision: 1.61 $" +#define VERSION_QDIO_C "$Revision: 1.62 $" /****************** MODULE PARAMETER VARIABLES ********************/ MODULE_AUTHOR("Utz Bacher "); @@ -112,10 +113,7 @@ static inline volatile __u64 qdio_get_micros(void) { - __u64 time; - - asm volatile ("STCK %0" : "=m" (time)); - return time>>12; /* time>>12 is microseconds*/ + return (get_clock() >> 12); /* time>>12 is microseconds */ } /* diff -Nru a/drivers/s390/net/ctctty.c b/drivers/s390/net/ctctty.c --- a/drivers/s390/net/ctctty.c Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/net/ctctty.c Wed Oct 8 12:24:56 2003 @@ -1,5 +1,5 @@ /* - * $Id: ctctty.c,v 1.12 2003/06/17 11:36:44 mschwide Exp $ + * $Id: ctctty.c,v 1.13 2003/09/26 14:48:36 mschwide Exp $ * * CTC / ESCON network driver, tty interface. * @@ -758,7 +758,7 @@ printk(KERN_DEBUG "%s%d ioctl TIOCGSOFTCAR\n", CTC_TTY_NAME, info->line); #endif - error = verify_area(VERIFY_WRITE, (void *) arg, sizeof(long)); + error = put_user(C_CLOCAL(tty) ? 1 : 0, (ulong *) arg); if (error) return error; put_user(C_CLOCAL(tty) ? 1 : 0, (ulong *) arg); @@ -768,10 +768,9 @@ printk(KERN_DEBUG "%s%d ioctl TIOCSSOFTCAR\n", CTC_TTY_NAME, info->line); #endif - error = verify_area(VERIFY_READ, (void *) arg, sizeof(long)); + error = get_user(arg, (ulong *) arg); if (error) return error; - get_user(arg, (ulong *) arg); tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) | (arg ? CLOCAL : 0)); diff -Nru a/drivers/s390/net/cu3088.c b/drivers/s390/net/cu3088.c --- a/drivers/s390/net/cu3088.c Wed Oct 8 12:24:56 2003 +++ b/drivers/s390/net/cu3088.c Wed Oct 8 12:24:56 2003 @@ -1,5 +1,5 @@ /* - * $Id: cu3088.c,v 1.30 2003/08/28 11:14:11 cohuck Exp $ + * $Id: cu3088.c,v 1.31 2003/09/29 15:24:27 cohuck Exp $ * * CTC / LCS ccw_device driver * @@ -55,8 +55,14 @@ static struct ccw_driver cu3088_driver; +static void +cu3088_root_dev_release (struct device *dev) +{ +} + struct device cu3088_root_dev = { .bus_id = "cu3088", + .release = cu3088_root_dev_release, }; static ssize_t diff -Nru a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c --- a/drivers/s390/net/iucv.c Wed Oct 8 12:24:55 2003 +++ b/drivers/s390/net/iucv.c Wed Oct 8 12:24:55 2003 @@ -1,5 +1,5 @@ /* - * $Id: iucv.c,v 1.14 2003/09/23 16:48:17 mschwide Exp $ + * $Id: iucv.c,v 1.15 2003/10/01 09:25:15 mschwide Exp $ * * IUCV network driver * @@ -29,7 +29,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.14 $ + * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.15 $ * */ @@ -79,6 +79,11 @@ return 0; } +static void +iucv_root_release (struct device *dev) +{ +} + struct bus_type iucv_bus = { .name = "iucv", .match = iucv_bus_match, @@ -86,6 +91,7 @@ struct device iucv_root = { .bus_id = "iucv", + .release = iucv_root_release, }; /* General IUCV interrupt structure */ @@ -349,7 +355,7 @@ static void iucv_banner(void) { - char vbuf[] = "$Revision: 1.14 $"; + char vbuf[] = "$Revision: 1.15 $"; char *version = vbuf; if ((version = strchr(version, ':'))) { diff -Nru a/drivers/s390/net/qeth.c b/drivers/s390/net/qeth.c --- a/drivers/s390/net/qeth.c Wed Oct 8 12:24:57 2003 +++ b/drivers/s390/net/qeth.c Wed Oct 8 12:24:57 2003 @@ -1,6 +1,6 @@ /* * - * linux/drivers/s390/net/qeth.c ($Revision: 1.154 $) + * linux/drivers/s390/net/qeth.c ($Revision: 1.160 $) * * Linux on zSeries OSA Express and HiperSockets support * @@ -116,6 +116,7 @@ #include #include #include +#include #include #include #include @@ -164,7 +165,7 @@ "reserved for low memory situations"); /****************** MODULE STUFF **********************************/ -#define VERSION_QETH_C "$Revision: 1.154 $" +#define VERSION_QETH_C "$Revision: 1.160 $" static const char *version = "qeth S/390 OSA-Express driver (" VERSION_QETH_C "/" VERSION_QETH_H "/" VERSION_QETH_MPC_H QETH_VERSION_IPV6 QETH_VERSION_VLAN ")"; @@ -245,21 +246,15 @@ static inline unsigned int qeth_get_millis(void) { - __u64 time; - - asm volatile ("STCK %0":"=m" (time)); - return (int) (time >> 22); /* time>>12 is microseconds, we divide it - by 1024 */ + return (int) (get_clock() >> 22); /* time>>12 is microseconds, we + divide it by 1024 */ } #ifdef QETH_PERFORMANCE_STATS static inline unsigned int qeth_get_micros(void) { - __u64 time; - - asm volatile ("STCK %0":"=m" (time)); - return (int) (time >> 12); + return (int) (get_clock() >> 12); } #endif /* QETH_PERFORMANCE_STATS */ @@ -591,10 +586,8 @@ struct qeth_card *card; card = (struct qeth_card *) dev->priv; - QETH_DBF_TEXT2(0, trace, "open"); - QETH_DBF_TEXT2(0, setup, "open"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT2(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "open", card); + QETH_DBF_CARD2(0, setup, "open", card); qeth_save_dev_flag_state(card); @@ -607,9 +600,10 @@ static int qeth_set_config(struct net_device *dev, struct ifmap *map) { - QETH_DBF_TEXT3(0, trace, "nscf"); - QETH_DBF_TEXT3(0, trace, - ((struct qeth_card *)dev->priv)->rdev->dev.bus_id); + struct qeth_card *card; + + card = (struct qeth_card *)dev->priv; + QETH_DBF_CARD3(0, trace, "nscf", card); return -EOPNOTSUPP; } @@ -697,8 +691,7 @@ static void qeth_wakeup(struct qeth_card *card) { - QETH_DBF_TEXT5(0, trace, "wkup"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "wkup", card); atomic_set(&card->data_has_arrived, 1); wake_up(&card->wait_q); @@ -731,32 +724,27 @@ if (dstat & DEV_STAT_UNIT_CHECK) { if (sense[SENSE_RESETTING_EVENT_BYTE] & SENSE_RESETTING_EVENT_FLAG) { - QETH_DBF_TEXT1(0, trace, "REVN"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "REVN", card); problem = PROBLEM_RESETTING_EVENT_INDICATOR; goto out; } if (sense[SENSE_COMMAND_REJECT_BYTE] & SENSE_COMMAND_REJECT_FLAG) { - QETH_DBF_TEXT1(0, trace, "CREJ"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "CREJ", card); problem = PROBLEM_COMMAND_REJECT; goto out; } if ((sense[2] == 0xaf) && (sense[3] == 0xfe)) { - QETH_DBF_TEXT1(0, trace, "AFFE"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "AFFE", card); problem = PROBLEM_AFFE; goto out; } if ((!sense[0]) && (!sense[1]) && (!sense[2]) && (!sense[3])) { - QETH_DBF_TEXT1(0, trace, "ZSNS"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "ZSNS", card); problem = PROBLEM_ZERO_SENSE_DATA; goto out; } - QETH_DBF_TEXT1(0, trace, "GCHK"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "GCHK", card); problem = PROBLEM_GENERAL_CHECK; goto out; } @@ -764,7 +752,7 @@ SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK | SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) { QETH_DBF_TEXT1(0, trace, "GCHK"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, cdev->dev.bus_id); QETH_DBF_HEX1(0, misc, irb, __max(QETH_DBF_MISC_LEN, 64)); PRINT_WARN("check on device %s, dstat=x%x, cstat=x%x, " "rqparam=x%x\n", @@ -777,11 +765,10 @@ if (qeth_check_idx_response(buffer)) { PRINT_WARN("received an IDX TERMINATE on device %s " "with cause code 0x%02x%s\n", - card->rdev->dev.bus_id, buffer[4], + CARD_BUS_ID(card), buffer[4], (buffer[4] == 0x22) ? " -- try another portname" : ""); - QETH_DBF_TEXT1(0, trace, "RTRM"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "RTRM", card); problem = PROBLEM_RECEIVED_IDX_TERMINATE; goto out; } @@ -796,8 +783,7 @@ "pulled the cable or disabled the port." "Discarding outgoing packets.\n", card->dev_name, card->chpid); - QETH_DBF_TEXT1(0, trace, "CBOT"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "CBOT", card); qeth_set_dev_flag_norunning(card); problem = 0; goto out; @@ -809,27 +795,21 @@ } goto out; } - if (*(PDU_ENCAPSULATION(buffer)) == IPA_CMD_REGISTER_LOCAL_ADDR) { - QETH_DBF_TEXT3(0, trace, "irla"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); - } - if (*(PDU_ENCAPSULATION(buffer)) == - IPA_CMD_UNREGISTER_LOCAL_ADDR) { - QETH_DBF_TEXT3(0, trace, "irla"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); - } + if (*(PDU_ENCAPSULATION(buffer)) == IPA_CMD_REGISTER_LOCAL_ADDR) + QETH_DBF_CARD3(0, trace, "irla", card); + if (*(PDU_ENCAPSULATION(buffer)) == + IPA_CMD_UNREGISTER_LOCAL_ADDR) + QETH_DBF_CARD3(0, trace, "irla", card); PRINT_WARN("probably a problem on %s: received data is IPA, " "but not a reply: command=0x%x\n", card->dev_name, *(PDU_ENCAPSULATION(buffer) + 1)); - QETH_DBF_TEXT1(0, trace, "INRP"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "INRP", card); goto out; } /* no probs */ out: if (problem) { - QETH_DBF_TEXT3(0, trace, "gcpr"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "gcpr", card); sprintf(dbf_text, "%2x%2x%4x", dstat, cstat, problem); QETH_DBF_TEXT3(0, trace, dbf_text); sprintf(dbf_text, "%8x", rqparam); @@ -849,8 +829,7 @@ int result, result2; char dbf_text[15]; - QETH_DBF_TEXT5(0, trace, "isnr"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "isnr", card); /* set up next read ccw */ memcpy(&card->dma_stuff->read_ccw, READ_CCW, sizeof (struct ccw1)); @@ -859,21 +838,20 @@ card->dma_stuff->read_ccw.cda = QETH_GET_ADDR(card->dma_stuff->recbuf); /* - * we don't spin_lock_irqsave(get_ccwdev_lock(card->rdev),flags), as + * we don't spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)),flags), as * we are only called in the interrupt handler */ - result = ccw_device_start(card->rdev, &card->dma_stuff->read_ccw, + result = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->read_ccw, MPC_SETUP_STATE, 0, 0); if (result) { qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO); result2 = - ccw_device_start(card->rdev, &card->dma_stuff->read_ccw, + ccw_device_start(CARD_RDEV(card), &card->dma_stuff->read_ccw, MPC_SETUP_STATE, 0, 0); PRINT_WARN("read handler on device %s, read: ccw_device_start " "returned %i, next try returns %i\n", - card->rdev->dev.bus_id, result, result2); - QETH_DBF_TEXT1(0, trace, "IsNR"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + CARD_BUS_ID(card), result, result2); + QETH_DBF_CARD1(0, trace, "IsNR", card); sprintf(dbf_text, "%04x%04x", (__s16) result, (__s16) result2); QETH_DBF_TEXT1(0, trace, dbf_text); } @@ -977,8 +955,7 @@ int elements, el_m_1; char dbf_text[15]; - QETH_DBF_TEXT6(0, trace, "clib"); - QETH_DBF_TEXT6(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD6(0, trace, "clib", card); sprintf(dbf_text, "bufno%3x", bufno); QETH_DBF_TEXT6(0, trace, dbf_text); @@ -1010,8 +987,7 @@ char dbf_text[15]; int no; - QETH_DBF_TEXT5(0, trace, "qibf"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "qibf", card); sprintf(dbf_text, "%4x%4x", under_int, bufno); QETH_DBF_TEXT5(0, trace, dbf_text); atomic_inc(&card->requeue_counter); @@ -1019,8 +995,7 @@ return; if (!spin_trylock(&card->requeue_input_lock)) { - QETH_DBF_TEXT5(0, trace, "qibl"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "qibl", card); return; } requeue_counter = atomic_read(&card->requeue_counter); @@ -1046,8 +1021,7 @@ "be lost! Try increasing the bufcnt " "parameter\n", card->dev_name); - QETH_DBF_TEXT2(1, trace, "QINB"); - QETH_DBF_TEXT2(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(1, trace, "QINB", card); goto out; } card->inbound_buffer_entry_no[pos] = @@ -1065,8 +1039,7 @@ /* stop points to the position after the last element */ stop = pos; - QETH_DBF_TEXT3(0, trace, "qibi"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "qibi", card); sprintf(dbf_text, "%4x", requeue_counter); QETH_DBF_TEXT3(0, trace, dbf_text); sprintf(dbf_text, "%4x%4x", start, stop); @@ -1093,15 +1066,14 @@ for (i = start; i < start + cnt1; i++) { qeth_clear_input_buffer(card, i); } - result = do_QDIO(card->ddev, + result = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT | under_int, 0, start, cnt1, NULL); if (result) { PRINT_WARN("qeth_queue_input_buffer's " "do_QDIO returnd %i (device %s)\n", - result, card->ddev->dev.bus_id); - QETH_DBF_TEXT1(0, trace, "QIDQ"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + result, CARD_DDEV_ID(card)); + QETH_DBF_CARD1(0, trace, "QIDQ", card); sprintf(dbf_text, "%4x%4x", result, requeue_counter); QETH_DBF_TEXT1(0, trace, dbf_text); sprintf(dbf_text, "%4x%4x", start, cnt1); @@ -1112,15 +1084,14 @@ for (i = 0; i < cnt2; i++) { qeth_clear_input_buffer(card, i); } - result = do_QDIO(card->ddev, + result = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT | under_int, 0, 0, cnt2, NULL); if (result) { PRINT_WARN("qeth_queue_input_buffer's " "do_QDIO returnd %i (device %s)\n", - result, card->ddev->dev.bus_id); - QETH_DBF_TEXT1(0, trace, "QIDQ"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + result, CARD_DDEV_ID(card)); + QETH_DBF_CARD1(0, trace, "QIDQ", card); sprintf(dbf_text, "%4x%4x", result, requeue_counter); QETH_DBF_TEXT1(0, trace, dbf_text); sprintf(dbf_text, "%4x%4x", 0, cnt2); @@ -1170,9 +1141,8 @@ if (element >= max_elements) { PRINT_WARN("device %s: error in interpreting buffer (data " "too long), %i elements.\n", - card->rdev->dev.bus_id, element); - QETH_DBF_TEXT0(0, trace, "IEDL"); - QETH_DBF_TEXT0(0, trace, card->rdev->dev.bus_id); + CARD_BUS_ID(card), element); + QETH_DBF_CARD0(0, trace, "IEDL", card); sprintf(dbf_text, "%4x%4x", *element_ptr, *pos_in_el_ptr); QETH_DBF_TEXT0(1, trace, dbf_text); QETH_DBF_HEX0(0, misc, buffer, QETH_DBF_MISC_LEN); @@ -1186,9 +1156,8 @@ curr_len = SBALE_LEN(element); if (curr_len > PAGE_SIZE) { PRINT_WARN("device %s: bad element length in element %i: " - "0x%x\n", card->rdev->dev.bus_id, element, curr_len); - QETH_DBF_TEXT0(0, trace, "BELN"); - QETH_DBF_TEXT0(0, trace, card->rdev->dev.bus_id); + "0x%x\n", CARD_BUS_ID(card), element, curr_len); + QETH_DBF_CARD0(0, trace, "BELN", card); sprintf(dbf_text, "%4x", curr_len); QETH_DBF_TEXT0(0, trace, dbf_text); sprintf(dbf_text, "%4x%4x", *element_ptr, *pos_in_el_ptr); @@ -1201,8 +1170,7 @@ /* header fits in current element? */ if (curr_len < pos_in_el + QETH_HEADER_SIZE) { if (!pos_in_el) { - QETH_DBF_TEXT6(0, trace, "gnmh"); - QETH_DBF_TEXT6(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD6(0, trace, "gnmh", card); return NULL; /* no more data in buffer */ } /* set hdr to next element */ @@ -1211,8 +1179,7 @@ curr_len = SBALE_LEN(element); /* does it fit in there? */ if (curr_len < QETH_HEADER_SIZE) { - QETH_DBF_TEXT6(0, trace, "gdnf"); - QETH_DBF_TEXT6(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD6(0, trace, "gdnf", card); return NULL; } } @@ -1221,8 +1188,7 @@ length = *(__u16 *) ((char *) (*hdr_ptr) + QETH_HEADER_LEN_POS); - QETH_DBF_TEXT6(0, trace, "gdHd"); - QETH_DBF_TEXT6(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD6(0, trace, "gdHd", card); QETH_DBF_HEX6(0, trace, hdr_ptr, sizeof (void *)); pos_in_el += QETH_HEADER_SIZE; @@ -1234,9 +1200,8 @@ if (!curr_len) { PRINT_WARN("device %s: inb. buffer with more headers " "than data areas (%i elements).\n", - card->rdev->dev.bus_id, element); - QETH_DBF_TEXT0(0, trace, "IEMH"); - QETH_DBF_TEXT0(0, trace, card->rdev->dev.bus_id); + CARD_BUS_ID(card), element); + QETH_DBF_CARD0(0, trace, "IEMH", card); sprintf(dbf_text, "%2x%2x%4x", element, *element_ptr, *pos_in_el_ptr); QETH_DBF_TEXT0(1, trace, dbf_text); @@ -1254,10 +1219,6 @@ if (!skb) goto nomem; skb_pull(skb, QETH_FAKE_LL_LEN); - if (!skb) { - dev_kfree_skb_irq(skb); - goto nomem; - } } else { skb = qeth_get_skb(length); if (!skb) @@ -1274,9 +1235,8 @@ PRINT_WARN("device %s: unexpected end of buffer, " "length of element %i is 0. Discarding " "packet.\n", - card->rdev->dev.bus_id, element); - QETH_DBF_TEXT0(0, trace, "IEUE"); - QETH_DBF_TEXT0(0, trace, card->rdev->dev.bus_id); + CARD_BUS_ID(card), element); + QETH_DBF_CARD0(0, trace, "IEUE", card); sprintf(dbf_text, "%2x%2x%4x", element, *element_ptr, *pos_in_el_ptr); QETH_DBF_TEXT0(0, trace, dbf_text); @@ -1321,8 +1281,7 @@ if (net_ratelimit()) { PRINT_WARN("no memory for packet from %s\n", card->dev_name); } - QETH_DBF_TEXT0(0, trace, "NOMM"); - QETH_DBF_TEXT0(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD0(0, trace, "NOMM", card); return NULL; } @@ -1426,8 +1385,7 @@ break; case QETH_CAST_ANYCAST: case QETH_CAST_NOCAST: - QETH_DBF_TEXT2(0, trace, "ribf"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ribf", card); sprintf(dbf_text, "castan%2x", cast_type); QETH_DBF_TEXT2(1, trace, dbf_text); skb->pkt_type = PACKET_HOST; @@ -1437,8 +1395,7 @@ "of 0x%x. Using unicasting instead.\n", cast_type); skb->pkt_type = PACKET_HOST; - QETH_DBF_TEXT2(0, trace, "ribf"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ribf", card); sprintf(dbf_text, "castun%2x", cast_type); QETH_DBF_TEXT2(1, trace, dbf_text); } @@ -1518,10 +1475,10 @@ if (buffer->element[15].flags & 0xff) { PRINT_WARN("on device %s: incoming SBALF 15 on buffer " "0x%x are 0x%x\n", - card->rdev->dev.bus_id, buffer_no, + CARD_BUS_ID(card), buffer_no, buffer->element[15].flags & 0xff); sprintf(dbf_text, "SF%s%2x%2x", - card->rdev->dev.bus_id, buffer_no, + CARD_BUS_ID(card), buffer_no, buffer->element[15].flags & 0xff); QETH_DBF_HEX1(1, trace, dbf_text, QETH_DBF_TRACE_LEN); } @@ -1536,7 +1493,7 @@ card->perf_stats.bufs_rec++; #endif /* QETH_PERFORMANCE_STATS */ - sprintf(dbf_text, "ribX%s", card->rdev->dev.bus_id); + sprintf(dbf_text, "ribX%s", CARD_BUS_ID(card)); dbf_text[3] = buffer_no; QETH_DBF_HEX6(0, trace, dbf_text, QETH_DBF_TRACE_LEN); @@ -1563,8 +1520,7 @@ card->perf_stats.inbound_cnt++; #endif /* QETH_PERFORMANCE_STATS */ - QETH_DBF_TEXT6(0, trace, "rxpk"); - QETH_DBF_TEXT6(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD6(0, trace, "rxpk", card); netif_rx(skb); dev->last_rx = jiffies; @@ -1573,8 +1529,7 @@ } else { PRINT_WARN("%s: dropped packet, no buffers " "available.\n", card->dev_name); - QETH_DBF_TEXT2(1, trace, "DROP"); - QETH_DBF_TEXT2(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(1, trace, "DROP", card); card->stats->rx_dropped++; } } @@ -1792,8 +1747,7 @@ atomic_inc(&card->outbound_used_buffers[queue]); - QETH_DBF_TEXT5(0, trace, "flsp"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "flsp", card); sprintf(dbf_text, "%4x%2x%2x", position_for_do_qdio, under_int, queue); QETH_DBF_TEXT5(0, trace, dbf_text); QETH_DBF_HEX5(0, misc, buffer, QETH_DBF_MISC_LEN); @@ -1849,14 +1803,13 @@ * this has to be at the end, otherwise a buffer could be flushed * twice (see comment in qeth_do_send_packet) */ - result = do_QDIO(card->ddev, QDIO_FLAG_SYNC_OUTPUT | under_int, queue, + result = do_QDIO(CARD_DDEV(card), QDIO_FLAG_SYNC_OUTPUT | under_int, queue, position_for_do_qdio, 1, NULL); if (result) { PRINT_WARN("Outbound do_QDIO returned %i " - "(device %s)\n", result, card->ddev->dev.bus_id); - QETH_DBF_TEXT5(0, trace, "FLSP"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + "(device %s)\n", result, CARD_DDEV_ID(card)); + QETH_DBF_CARD5(0, trace, "FLSP", card); sprintf(dbf_text, "odoQ%4x", result); QETH_DBF_TEXT5(0, trace, dbf_text); sprintf(dbf_text, "%4x%2x%2x", position_for_do_qdio, @@ -1923,8 +1876,7 @@ switch (card->outbound_buffer_send_state[queue][bufno]) { case SEND_STATE_DONT_PACK: /* fallthrough */ case SEND_STATE_PACK: - QETH_DBF_TEXT5(0, trace, "frbf"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "frbf", card); sprintf(dbf_text, "%2x%2x%4x", queue, bufno, card->outbound_buffer_send_state[queue][bufno]); QETH_DBF_TEXT5(0, trace, dbf_text); @@ -1935,7 +1887,7 @@ qeth_determine_send_error(siga_error, qdio_error, sbalf15); if (error == ERROR_KICK_THAT_PUPPY) { sprintf(dbf_text, "KP%s%2x", - card->rdev->dev.bus_id, queue); + CARD_BUS_ID(card), queue); QETH_DBF_TEXT2(0, trace, dbf_text); QETH_DBF_TEXT2(0, qerr, dbf_text); QETH_DBF_TEXT2(1, setup, dbf_text); @@ -1946,7 +1898,7 @@ PRINT_ERR("Outbound queue x%x on device %s (%s); " "errs: siga: x%x, qdio: x%x, flags15: " "x%x. The device will be taken down.\n", - queue, card->rdev->dev.bus_id, card->dev_name, + queue, CARD_BUS_ID(card), card->dev_name, siga_error, qdio_error, sbalf15); netif_stop_queue(card->dev); qeth_set_dev_flag_norunning(card); @@ -1957,7 +1909,7 @@ retries = card->send_retries[queue][bufno]; sprintf(dbf_text, "Rt%s%2x", - card->rdev->dev.bus_id, queue); + CARD_BUS_ID(card), queue); QETH_DBF_TEXT4(0, trace, dbf_text); sprintf(dbf_text, "b%2x:%2x%2x", bufno, sbalf15, retries); @@ -1971,8 +1923,7 @@ } else if (error == ERROR_LINK_FAILURE) { /* we don't want to log failures resulting from * too many retries */ - QETH_DBF_TEXT3(1, trace, "Fail"); - QETH_DBF_TEXT3(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(1, trace, "Fail", card); QETH_DBF_HEX3(0, misc, buffer, QETH_DBF_MISC_LEN); QETH_DBF_HEX3(0, misc, buffer + QETH_DBF_MISC_LEN, QETH_DBF_MISC_LEN); @@ -2009,10 +1960,8 @@ "(line %i). q=%i, bufno=x%x, state=%i\n", card->dev_name, __LINE__, queue, bufno, card->outbound_buffer_send_state[queue][bufno]); - QETH_DBF_TEXT0(1, trace, "UPSf"); - QETH_DBF_TEXT0(1, qerr, "UPSf"); - QETH_DBF_TEXT0(1, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT0(1, qerr, card->rdev->dev.bus_id); + QETH_DBF_CARD0(1, trace, "UPSf", card); + QETH_DBF_CARD0(1, qerr, "UPSf", card); sprintf(dbf_text, "%2x%2x%4x", queue, bufno, card->outbound_buffer_send_state[queue][bufno]); QETH_DBF_TEXT0(1, trace, dbf_text); @@ -2038,8 +1987,7 @@ qeth_flush_buffer(struct qeth_card *card, int queue, int under_int) { char dbf_text[15]; - QETH_DBF_TEXT5(0, trace, "flsb"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "flsb", card); sprintf(dbf_text, "%2x%2x%2x", queue, under_int, card->outbound_buffer_send_state[queue] [card->outbound_first_free_buffer[queue]]); @@ -2127,8 +2075,7 @@ PRINT_STUPID("%s: not enough headroom in skb (missing: %i)\n", card->dev_name, QETH_HEADER_SIZE - skb_headroom(skb)); - QETH_DBF_TEXT3(0, trace, "NHRf"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "NHRf", card); sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb), version, multicast, queue); QETH_DBF_TEXT3(0, trace, dbf_text); @@ -2138,8 +2085,7 @@ if (!nskb) { PRINT_WARN("%s: could not realloc headroom\n", card->dev_name); - QETH_DBF_TEXT2(0, trace, "CNRf"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "CNRf", card); dev_kfree_skb_irq(skb); return; } @@ -2162,8 +2108,7 @@ card->dev_name, QETH_HEADER_SIZE + QETH_IP_HEADER_SIZE); PRINT_ERR("head=%p, data=%p\n", skb->head, skb->data); - QETH_DBF_TEXT1(0, trace, "PMAf"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "PMAf", card); sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb), version, multicast, queue); QETH_DBF_TEXT1(0, trace, dbf_text); @@ -2220,8 +2165,7 @@ PRINT_STUPID("%s: not enough headroom in skb (missing: %i)\n", card->dev_name, QETH_HEADER_SIZE - skb_headroom(skb)); - QETH_DBF_TEXT3(0, trace, "NHRp"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "NHRp", card); sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb), version, multicast, queue); QETH_DBF_TEXT3(0, trace, dbf_text); @@ -2231,8 +2175,7 @@ if (!nskb) { PRINT_WARN("%s: could not realloc headroom\n", card->dev_name); - QETH_DBF_TEXT2(0, trace, "CNRp"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "CNRp", card); dev_kfree_skb_irq(skb); return; } @@ -2257,8 +2200,7 @@ "are not in the same page. Discarding packet!\n", card->dev_name, QETH_HEADER_SIZE + QETH_IP_HEADER_SIZE); - QETH_DBF_TEXT1(0, trace, "PMAp"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "PMAp", card); sprintf(dbf_text, "%2x%2x%2x%2x", skb_headroom(skb), version, multicast, queue); QETH_DBF_TEXT1(0, trace, dbf_text); @@ -2354,8 +2296,7 @@ { char dbf_text[15]; - QETH_DBF_TEXT6(0, trace, "dsp:"); - QETH_DBF_TEXT6(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD6(0, trace, "dsp:", card); sprintf(dbf_text, "%c %c%4x", (version == 4) ? '4' : ((version == 6) ? '6' : '0'), (multicast) ? 'm' : '_', queue); @@ -2384,8 +2325,7 @@ if (atomic_read(&card->outbound_used_buffers[queue]) >= HIGH_WATERMARK_PACK) { card->send_state[queue] = SEND_STATE_PACK; - QETH_DBF_TEXT3(0, trace, "stchup"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "stchup", card); #ifdef QETH_PERFORMANCE_STATS card->perf_stats.sc_dp_p++; #endif /* QETH_PERFORMANCE_STATS */ @@ -2407,8 +2347,7 @@ if (atomic_read(&card->outbound_used_buffers[queue]) >= QDIO_MAX_BUFFERS_PER_Q - 1) { - QETH_DBF_TEXT2(1, trace, "cdbs"); - QETH_DBF_TEXT2(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(1, trace, "cdbs", card); netif_stop_queue(dev); return -EBUSY; } @@ -2420,13 +2359,11 @@ */ if (atomic_compare_and_swap(QETH_LOCK_UNLOCKED, QETH_LOCK_NORMAL, &card->outbound_ringbuffer_lock[queue])) { - QETH_DBF_TEXT2(0, trace, "SPIN"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "SPIN", card); while (atomic_compare_and_swap (QETH_LOCK_UNLOCKED, QETH_LOCK_NORMAL, &card->outbound_ringbuffer_lock[queue])) ; - QETH_DBF_TEXT2(0, trace, "spin"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "spin", card); } #ifdef QETH_PERFORMANCE_STATS card->perf_stats.skbs_sent++; @@ -2445,8 +2382,7 @@ break; default: result = -EBUSY; - QETH_DBF_TEXT0(1, trace, "UPSs"); - QETH_DBF_TEXT0(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD0(1, trace, "UPSs", card); PRINT_ALL("oops... shouldn't happen (line %i:%i).\n", __LINE__, card->send_state[queue]); } @@ -2499,8 +2435,7 @@ if (!atomic_read(&card->is_startlaned)) { card->stats->tx_carrier_errors++; - QETH_DBF_TEXT2(0, trace, "XMNS"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "XMNS", card); dst_link_failure(skb); dev_kfree_skb_irq(skb); return 0; @@ -2521,8 +2456,7 @@ card = (struct qeth_card *) (dev->priv); - QETH_DBF_TEXT3(0, trace, "gtst"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "gtst", card); return card->stats; } @@ -2535,8 +2469,7 @@ card = (struct qeth_card *) (dev->priv); - QETH_DBF_TEXT2(0, trace, "mtu"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "mtu", card); sprintf(dbf_text, "%8x", new_mtu); QETH_DBF_TEXT2(0, trace, dbf_text); @@ -2555,8 +2488,7 @@ qeth_start_softsetup_thread(struct qeth_card *card) { if (!atomic_read(&card->shutdown_phase)) { - QETH_DBF_TEXT2(0, trace, "stss"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "stss", card); up(&card->softsetup_thread_sem); } } @@ -2566,8 +2498,7 @@ { char dbf_text[15]; - QETH_DBF_TEXT5(0, trace, "slpn"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "slpn", card); sprintf(dbf_text, "%08x", timeout); QETH_DBF_TEXT5(0, trace, dbf_text); @@ -2585,8 +2516,7 @@ qeth_wakeup_ioctl(struct qeth_card *card) { - QETH_DBF_TEXT5(0, trace, "wkup"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "wkup", card); atomic_set(&card->ioctl_data_has_arrived, 1); wake_up(&card->ioctl_wait_q); @@ -2597,8 +2527,7 @@ { char dbf_text[15]; - QETH_DBF_TEXT5(0, trace, "ioctlslpn"); - QETH_DBF_TEXT5(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD5(0, trace, "ioctlslpn", card); sprintf(dbf_text, "%08x", timeout); QETH_DBF_TEXT5(0, trace, dbf_text); @@ -2656,8 +2585,7 @@ /* we lock very early to synchronize access to seqnos */ if (atomic_swap(&card->write_busy, 1)) { qeth_wait_nonbusy(QETH_IDLE_WAIT_TIME); - QETH_DBF_TEXT2(0, trace, "LSCD"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "LSCD", card); goto again; } memcpy(card->dma_stuff->sendbuf, card->send_buf, QETH_BUFSIZE); @@ -2680,19 +2608,18 @@ card->dma_stuff->write_ccw.cda = QETH_GET_ADDR(card->dma_stuff->sendbuf); - QETH_DBF_TEXT2(0, trace, "scdw"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "scdw", card); sprintf(dbf_text, "%8x", len); QETH_DBF_TEXT4(0, trace, dbf_text); QETH_DBF_HEX4(0, trace, &intparam, QETH_DBF_TRACE_LEN); QETH_DBF_HEX2(0, control, buffer, QETH_DBF_CONTROL_LEN); - spin_lock_irqsave(get_ccwdev_lock(card->wdev), flags); - result = ccw_device_start(card->wdev, &card->dma_stuff->write_ccw, + spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags); + result = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->write_ccw, intparam, 0, 0); if (result) { qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO); - result2 = ccw_device_start(card->wdev, + result2 = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->write_ccw, intparam, 0, 0); if (result2 != -ENODEV) @@ -2701,7 +2628,7 @@ result, result2); result = result2; } - spin_unlock_irqrestore(get_ccwdev_lock(card->wdev), flags); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags); if (result) { QETH_DBF_TEXT2(0, trace, "scd:doio"); @@ -2718,8 +2645,7 @@ return NULL; } rec_buf = card->ipa_buf; - QETH_DBF_TEXT2(0, trace, "scro"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "scro", card); } else { if (qeth_sleepon(card, (setip) ? QETH_IPA_TIMEOUT : QETH_MPC_TIMEOUT)) { @@ -2729,8 +2655,7 @@ return NULL; } rec_buf = card->ipa_buf; - QETH_DBF_TEXT2(0, trace, "scri"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "scri", card); } QETH_DBF_HEX2(0, control, rec_buf, QETH_DBF_CONTROL_LEN); @@ -2832,16 +2757,14 @@ int result; char dbf_text[15]; - QETH_DBF_TEXT4(0, trace, "stln"); - QETH_DBF_TEXT4(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD4(0, trace, "stln", card); result = qeth_send_startstoplan(card, IPA_CMD_STARTLAN, ip_vers); if (!result) atomic_set(&card->is_startlaned, 1); if (result) { - QETH_DBF_TEXT2(0, trace, "STRTLNFL"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "STRTLNFL", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); } @@ -2858,14 +2781,12 @@ atomic_set(&card->is_startlaned, 0); - QETH_DBF_TEXT4(0, trace, "spln"); - QETH_DBF_TEXT4(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD4(0, trace, "spln", card); result = qeth_send_startstoplan(card, IPA_CMD_STOPLAN, 4); if (result) { - QETH_DBF_TEXT2(0, trace, "STPLNFLD"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "STPLNFLD", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); } @@ -3443,8 +3364,7 @@ retries = (use_retries) ? QETH_SETIP_RETRIES : 1; if (qeth_is_ipa_covered_by_ipato_entries(ip_vers, ip, card)) { - QETH_DBF_TEXT2(0, trace, "ipto"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ipto", card); if (ip_vers == 4) { *((__u32 *) (&dbf_text[0])) = *((__u32 *) ip); *((__u32 *) (&dbf_text[4])) = *((__u32 *) netmask); @@ -3467,15 +3387,13 @@ PRINT_SETIP_ERROR(' '); if (result) { - QETH_DBF_TEXT2(0, trace, "SETIPFLD"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "SETIPFLD", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); } if (((result == -1) || (result == 0xe080)) && (retries--)) { - QETH_DBF_TEXT2(0, trace, "sipr"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "sipr", card); if (ip_vers == 4) { *((__u32 *) (&dbf_text[0])) = *((__u32 *) ip); *((__u32 *) (&dbf_text[4])) = *((__u32 *) netmask); @@ -3513,8 +3431,7 @@ retries = (use_retries) ? QETH_SETIP_RETRIES : 1; if (qeth_is_ipa_covered_by_ipato_entries(ip_vers, ip, card)) { - QETH_DBF_TEXT2(0, trace, "imto"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "imto", card); if (ip_vers == 4) { *((__u32 *) (&dbf_text[0])) = *((__u32 *) ip); QETH_DBF_HEX2(0, trace, dbf_text, QETH_DBF_TRACE_LEN); @@ -3530,15 +3447,13 @@ PRINT_SETIP_ERROR('m'); if (result) { - QETH_DBF_TEXT2(0, trace, "SETIMFLD"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "SETIMFLD", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); } if ((result == -1) && (retries--)) { - QETH_DBF_TEXT2(0, trace, "simr"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "simr", card); if (ip_vers == 4) { sprintf(dbf_text, "%08x", *((__u32 *) ip)); QETH_DBF_TEXT2(0, trace, dbf_text); @@ -3726,8 +3641,7 @@ PRINT_SETIP_ERROR('s'); if (result) { - QETH_DBF_TEXT2(0, trace, "SETSVFLD"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "SETSVFLD", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); if (priv_add_list->version == 4) { @@ -3761,8 +3675,7 @@ priv_del_list->version, priv_del_list->flag); if (result) { - QETH_DBF_TEXT2(0, trace, "DELSVFLD"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "DELSVFLD", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); if (priv_del_list->version == 4) { @@ -3943,7 +3856,7 @@ addr6->addr.s6_addr16[6], addr6->addr.s6_addr16[7], addr6->prefix_len, - card->rdev->dev.bus_id, result); + CARD_BUS_ID(card), result); sprintf(dbf_text, "std6%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); } @@ -3987,7 +3900,7 @@ addr6->addr.s6_addr16[6], addr6->addr.s6_addr16[7], addr6->prefix_len, - card->rdev->dev.bus_id, result); + CARD_BUS_ID(card), result); sprintf(dbf_text, "sts6%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); addr6 = addr6->if_next; @@ -4002,8 +3915,7 @@ int result; char dbf_text[15]; - QETH_DBF_TEXT3(0, trace, "stip"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "stip", card); addr = card->ip_current_state.ip_ifa; while (addr) { @@ -4023,7 +3935,7 @@ "(result: 0x%x), " "trying to continue\n", addr->ifa_address, addr->ifa_mask, - card->rdev->dev.bus_id, result); + CARD_BUS_ID(card), result); sprintf(dbf_text, "stdl%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); } @@ -4051,7 +3963,7 @@ PRINT_ERR("was not able to set ip " "%08x/%08x on device %s, trying to continue\n", addr->ifa_address, addr->ifa_mask, - card->rdev->dev.bus_id); + CARD_BUS_ID(card)); sprintf(dbf_text, "stst%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); addr = addr->ifa_next; @@ -4161,7 +4073,7 @@ addr->mac[0], addr->mac[1], addr->mac[2], addr->mac[3], addr->mac[4], addr->mac[5], - card->rdev->dev.bus_id, result); + CARD_BUS_ID(card), result); sprintf(dbf_text, "smd6%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); } @@ -4203,7 +4115,7 @@ addr->mac[0], addr->mac[1], addr->mac[2], addr->mac[3], addr->mac[4], addr->mac[5], - card->rdev->dev.bus_id, result); + CARD_BUS_ID(card), result); sprintf(dbf_text, "sms6%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); qeth_remove_mc_ifa_from_list @@ -4221,8 +4133,7 @@ int result; char dbf_text[15]; - QETH_DBF_TEXT3(0, trace, "stim"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "stim", card); if (!qeth_is_supported(IPA_MULTICASTING)) return 0; @@ -4252,7 +4163,7 @@ addr->mac[0], addr->mac[1], addr->mac[2], addr->mac[3], addr->mac[4], addr->mac[5], - card->rdev->dev.bus_id, result); + CARD_BUS_ID(card), result); sprintf(dbf_text, "smdl%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); } @@ -4285,7 +4196,7 @@ addr->mac[0], addr->mac[1], addr->mac[2], addr->mac[3], addr->mac[4], addr->mac[5], - card->rdev->dev.bus_id, result); + CARD_BUS_ID(card), result); sprintf(dbf_text, "smst%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); qeth_remove_mc_ifa_from_list @@ -4334,8 +4245,7 @@ PRINT_STUPID("CALL: qeth_do_ioctl called with cmd %i (=0x%x).\n", cmd, cmd); - QETH_DBF_TEXT2(0, trace, "ioct"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ioct", card); sprintf(dbf_text, "cmd=%4x", cmd); QETH_DBF_TEXT2(0, trace, dbf_text); QETH_DBF_HEX2(0, trace, &rq, sizeof (void *)); @@ -4562,8 +4472,7 @@ in6_vdev = in6_dev_get(card_group->vlan_devices[i]); if (!in6_vdev) { - QETH_DBF_TEXT2(0, trace, "id26"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "id26", card); continue; } @@ -4625,8 +4534,7 @@ in6_dev = in6_dev_get(card->dev); if (!in6_dev) { - QETH_DBF_TEXT2(0, trace, "id16"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "id16", card); return ERR_PTR(-ENODEV); } read_lock(&in6_dev->lock); @@ -4702,8 +4610,7 @@ int remove; struct inet6_dev *in6_dev; - QETH_DBF_TEXT3(0, trace, "tip6"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "tip6", card); /* unicast */ /* clear ip_current_state */ qeth_clear_ifa6_list(&card->ip_current_state.ip6_ifa); @@ -5003,8 +4910,7 @@ int remove; struct in_device *in4_dev; - QETH_DBF_TEXT3(0, trace, "tips"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "tips", card); /* unicast */ /* clear ip_current_state */ qeth_clear_ifa4_list(&card->ip_current_state.ip_ifa); @@ -5083,16 +4989,14 @@ "autoconfig on other lpars may lead to duplicate " "ip addresses. please use manually " "configured ones.\n", - card->rdev->dev.bus_id, result); - QETH_DBF_TEXT2(0, trace, "unid fld"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + CARD_BUS_ID(card), result); + QETH_DBF_CARD2(0, trace, "unid fld", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); } else { card->unique_id = *((__u16 *) & cmd.data.create_destroy_addr.unique_id[6]); - QETH_DBF_TEXT2(0, setup, "uniqueid"); - QETH_DBF_TEXT2(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, setup, "uniqueid", card); sprintf(dbf_text, "%4x", card->unique_id); QETH_DBF_TEXT2(0, setup, dbf_text); } @@ -5123,8 +5027,7 @@ result = qeth_send_ipa_cmd(card, &cmd, 1, IPA_CMD_STATE); if (result) { - QETH_DBF_TEXT2(0, trace, "unibkfld"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "unibkfld", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT2(0, trace, dbf_text); } @@ -5144,8 +5047,7 @@ (card->link_type != QETH_MPC_LINK_TYPE_LANE_TR)) return; - QETH_DBF_TEXT3(0, trace, "hstr"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "hstr", card); if (qeth_is_adp_supported(IPA_SETADP_SET_BROADCAST_MODE)) { result = qeth_send_setadapterparms_mode @@ -5154,18 +5056,16 @@ if (result) { PRINT_WARN("couldn't set broadcast mode on " "device %s: x%x\n", - card->rdev->dev.bus_id, result); - QETH_DBF_TEXT1(0, trace, "STBRDCST"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + CARD_BUS_ID(card), result); + QETH_DBF_CARD1(0, trace, "STBRDCST", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT1(1, trace, dbf_text); } } else if (card->options.broadcast_mode) { PRINT_WARN("set adapter parameters not available " "to set broadcast mode, using ALLRINGS " - "on device %s:\n", card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, trace, "NOBC"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + "on device %s:\n", CARD_BUS_ID(card)); + QETH_DBF_CARD1(0, trace, "NOBC", card); } if (qeth_is_adp_supported(IPA_SETADP_SET_BROADCAST_MODE)) { @@ -5174,19 +5074,17 @@ card->options.macaddr_mode); if (result) { PRINT_WARN("couldn't set macaddr mode on " - "device %s: x%x\n", card->rdev->dev.bus_id, + "device %s: x%x\n", CARD_BUS_ID(card), result); - QETH_DBF_TEXT1(0, trace, "STMACMOD"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "STMACMOD", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT1(1, trace, dbf_text); } } else if (card->options.macaddr_mode) { PRINT_WARN("set adapter parameters not available " "to set macaddr mode, using NONCANONICAL " - "on device %s:\n", card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, trace, "NOMA"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + "on device %s:\n", CARD_BUS_ID(card)); + QETH_DBF_CARD1(0, trace, "NOMA", card); } } @@ -5200,16 +5098,14 @@ return; } - QETH_DBF_TEXT4(0, trace, "stap"); - QETH_DBF_TEXT4(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD4(0, trace, "stap", card); result = qeth_send_setadapterparms_query(card); if (result) { PRINT_WARN("couldn't set adapter parameters on device %s: " - "x%x\n", card->rdev->dev.bus_id, result); - QETH_DBF_TEXT1(0, trace, "SETADPFL"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + "x%x\n", CARD_BUS_ID(card), result); + QETH_DBF_CARD1(0, trace, "SETADPFL", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT1(1, trace, dbf_text); return; @@ -5219,10 +5115,8 @@ QETH_DBF_TEXT2(0, trace, dbf_text); if (qeth_is_adp_supported(IPA_SETADP_ALTER_MAC_ADDRESS)) { - QETH_DBF_TEXT3(0, trace, "rdmc"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT2(0, setup, "rdmc"); - QETH_DBF_TEXT2(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "rdmc", card); + QETH_DBF_CARD2(0, setup, "rdmc", card); result = qeth_send_setadapterparms_change_addr(card, IPA_SETADP_ALTER_MAC_ADDRESS, @@ -5233,9 +5127,8 @@ if (result) { PRINT_WARN("couldn't get MAC address on " "device %s: x%x\n", - card->rdev->dev.bus_id, result); - QETH_DBF_TEXT1(0, trace, "NOMACADD"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + CARD_BUS_ID(card), result); + QETH_DBF_CARD1(0, trace, "NOMACADD", card); sprintf(dbf_text, "%4x", result); QETH_DBF_TEXT1(1, trace, dbf_text); } else { @@ -5701,8 +5594,7 @@ qeth_save_dev_flag_state(card); - QETH_DBF_TEXT1(0, trace, wait_for_lock?"sscw":"sscn"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, wait_for_lock?"sscw":"sscn", card); result = __qeth_softsetup_start_assists(card); if (result) @@ -5753,19 +5645,17 @@ struct qeth_card *card = (struct qeth_card *) param; /* set a nice name ... */ - sprintf(name, "qethsoftd%s", card->rdev->dev.bus_id); + sprintf(name, "qethsoftd%s", CARD_BUS_ID(card)); daemonize(name); - QETH_DBF_TEXT2(0, trace, "ssth"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ssth", card); atomic_set(&card->softsetup_thread_is_running, 1); for (;;) { if (atomic_read(&card->shutdown_phase)) goto out; down_interruptible(&card->softsetup_thread_sem); - QETH_DBF_TEXT2(0, trace, "ssst"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ssst", card); if (atomic_read(&card->shutdown_phase)) goto out; while (qeth_softsetup_card(card, QETH_DONT_WAIT_FOR_LOCK) @@ -5774,15 +5664,13 @@ goto out; qeth_wait_nonbusy(QETH_IDLE_WAIT_TIME); } - QETH_DBF_TEXT2(0, trace, "sssd"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "sssd", card); netif_wake_queue(card->dev); } out: atomic_set(&card->softsetup_thread_is_running, 0); - QETH_DBF_TEXT2(0, trace, "lsst"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "lsst", card); return 0; } @@ -5792,8 +5680,7 @@ { struct qeth_card *card = (struct qeth_card *) data; - QETH_DBF_TEXT4(0, trace, "ssts"); - QETH_DBF_TEXT4(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD4(0, trace, "ssts", card); sema_init(&card->softsetup_thread_sem, 0); kernel_thread(qeth_softsetup_thread, card, SIGCHLD); } @@ -5810,8 +5697,7 @@ atomic_dec(&card->reinit_counter); return; } - QETH_DBF_TEXT2(0, trace, "stri"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "stri", card); PRINT_STUPID("starting reinit-thread\n"); kernel_thread(qeth_reinit_thread, card, SIGCHLD); } @@ -5826,8 +5712,7 @@ card = (struct qeth_card *) data; - QETH_DBF_TEXT2(0, trace, "recv"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "recv", card); if (atomic_compare_and_swap(0, 1, &card->in_recovery)) return; @@ -5840,7 +5725,7 @@ if (i != PROBLEM_TX_TIMEOUT) PRINT_WARN("recovery was scheduled on device %s (%s) with " "problem 0x%x\n", - card->rdev->dev.bus_id, card->dev_name, i); + CARD_BUS_ID(card), card->dev_name, i); switch (i) { case PROBLEM_RECEIVED_IDX_TERMINATE: if (atomic_read(&card->in_recovery)) @@ -5931,8 +5816,7 @@ QETH_DBF_TEXT1(0, trace, dbf_text); sprintf(dbf_text, "%4x%4x", queue, status); QETH_DBF_TEXT1(0, trace, dbf_text); - QETH_DBF_TEXT1(1, trace, "qscd"); - QETH_DBF_TEXT1(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(1, trace, "qscd", card); qeth_schedule_recovery(card); return; } @@ -5948,10 +5832,8 @@ 'y' : 'n', siga_error, (status & QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR) ? 'y' : 'n', sbalf15, first_element); - QETH_DBF_TEXT1(0, trace, "IQTI"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, qerr, "IQTI"); - QETH_DBF_TEXT1(0, qerr, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "IQTI", card); + QETH_DBF_CARD1(0, qerr, "IQTI", card); sprintf(dbf_text, "%4x%4x", first_element, count); QETH_DBF_TEXT1(0, trace, dbf_text); QETH_DBF_TEXT1(0, qerr, dbf_text); @@ -5989,8 +5871,7 @@ /* first_element is the last buffer that we got back from hydra */ if (!switch_state && !last_pci_hit) return;; - QETH_DBF_TEXT3(0, trace, "stchcw"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "stchcw", card); if (atomic_swap(&card->outbound_ringbuffer_lock[queue], QETH_LOCK_FLUSH) == QETH_LOCK_UNLOCKED) { /* @@ -6052,8 +5933,7 @@ QETH_DBF_TEXT1(0, trace, dbf_text); sprintf(dbf_text, "%4x%4x", queue, status); QETH_DBF_TEXT1(0, trace, dbf_text); - QETH_DBF_TEXT1(1, trace, "qscd"); - QETH_DBF_TEXT1(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(1, trace, "qscd", card); qeth_schedule_recovery(card); goto out; } @@ -6069,10 +5949,8 @@ siga_error, status & QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR ? 'y' : 'n', sbalf15, first_element); - QETH_DBF_TEXT1(0, trace, "IQTO"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, qerr, "IQTO"); - QETH_DBF_TEXT1(0, qerr, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "IQTO", card); + QETH_DBF_CARD1(0, qerr, "IQTO", card); sprintf(dbf_text, "%4x%4x", first_element, count); QETH_DBF_TEXT1(0, trace, dbf_text); QETH_DBF_TEXT1(0, qerr, dbf_text); @@ -6246,8 +6124,7 @@ recover: if (qeth_is_to_recover(card, problem)) { - QETH_DBF_TEXT2(1, trace, "rscd"); - QETH_DBF_TEXT2(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(1, trace, "rscd", card); qeth_schedule_recovery(card); goto wakeup_out; } @@ -6365,8 +6242,7 @@ recover: if (qeth_is_to_recover(card, problem)) { - QETH_DBF_TEXT2(1, trace, "wscd"); - QETH_DBF_TEXT2(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(1, trace, "wscd", card); qeth_schedule_recovery(card); goto out; } @@ -6466,8 +6342,7 @@ { int result; - QETH_DBF_TEXT3(0, trace, "rgnd"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "rgnd", card); result = register_netdev(card->dev); @@ -6477,8 +6352,7 @@ static void qeth_unregister_netdev(struct qeth_card *card) { - QETH_DBF_TEXT3(0, trace, "nrgn"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "nrgn", card); unregister_netdev(card->dev); } @@ -6489,15 +6363,13 @@ struct qeth_card *card; card = (struct qeth_card *) dev->priv; - QETH_DBF_TEXT2(0, trace, "stop"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT2(0, setup, "stop"); - QETH_DBF_TEXT2(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "stop", card); + QETH_DBF_CARD2(0, setup, "stop", card); qeth_save_dev_flag_state(card); netif_stop_queue(dev); - atomic_set(&((struct qeth_card *) dev->priv)->is_open, 0); + atomic_set(&card->is_open, 0); return 0; } @@ -6505,8 +6377,7 @@ static void qeth_softshutdown(struct qeth_card *card) { - QETH_DBF_TEXT3(0, trace, "ssht"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "ssht", card); qeth_send_stoplan(card); } @@ -6521,26 +6392,26 @@ atomic_set(&card->clear_succeeded1, 0); atomic_set(&card->clear_succeeded2, 0); - spin_lock_irqsave(get_ccwdev_lock(card->rdev), flags0); + spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags0); if (halt) - ret0 = ccw_device_halt(card->rdev, CLEAR_STATE); + ret0 = ccw_device_halt(CARD_RDEV(card), CLEAR_STATE); else - ret0 = ccw_device_clear(card->rdev, CLEAR_STATE); - spin_unlock_irqrestore(get_ccwdev_lock(card->rdev), flags0); + ret0 = ccw_device_clear(CARD_RDEV(card), CLEAR_STATE); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags0); - spin_lock_irqsave(get_ccwdev_lock(card->wdev), flags1); + spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags1); if (halt) - ret1 = ccw_device_halt(card->wdev, CLEAR_STATE); + ret1 = ccw_device_halt(CARD_WDEV(card), CLEAR_STATE); else - ret1 = ccw_device_clear(card->wdev, CLEAR_STATE); - spin_unlock_irqrestore(get_ccwdev_lock(card->wdev), flags1); + ret1 = ccw_device_clear(CARD_WDEV(card), CLEAR_STATE); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags1); - spin_lock_irqsave(get_ccwdev_lock(card->ddev), flags2); + spin_lock_irqsave(get_ccwdev_lock(CARD_DDEV(card)), flags2); if (halt) - ret2 = ccw_device_halt(card->ddev, CLEAR_STATE); + ret2 = ccw_device_halt(CARD_DDEV(card), CLEAR_STATE); else - ret2 = ccw_device_clear(card->ddev, CLEAR_STATE); - spin_unlock_irqrestore(get_ccwdev_lock(card->ddev), flags2); + ret2 = ccw_device_clear(CARD_DDEV(card), CLEAR_STATE); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_DDEV(card)), flags2); /* The device owns us an interrupt. */ if ((ret0 == 0) && (atomic_read(&card->clear_succeeded0) == 0)) @@ -6557,14 +6428,12 @@ static void qeth_clear_card(struct qeth_card *card, int qdio_clean, int use_halt) { - QETH_DBF_TEXT3(0, trace, qdio_clean?"clrq":"clr"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, setup, qdio_clean?"clrq":"clr"); - QETH_DBF_TEXT1(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, qdio_clean?"clrq":"clr", card); + QETH_DBF_CARD1(0, setup, qdio_clean?"clrq":"clr", card); atomic_set(&card->write_busy, 0); if (qdio_clean) - qdio_cleanup(card->ddev, + qdio_cleanup(CARD_DDEV(card), (card->type == QETH_CARD_TYPE_IQD) ? QDIO_FLAG_CLEANUP_USING_HALT : QDIO_FLAG_CLEANUP_USING_CLEAR); @@ -6584,10 +6453,8 @@ if (!card) return; - QETH_DBF_TEXT3(0, trace, "freest"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, setup, "freest"); - QETH_DBF_TEXT1(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "freest", card); + QETH_DBF_CARD1(0, setup, "freest", card); write_lock(&card->vipa_list_lock); e = card->vipa_list; @@ -6626,10 +6493,8 @@ if (!card) return; - QETH_DBF_TEXT3(0, trace, "free"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, setup, "free"); - QETH_DBF_TEXT1(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "free", card); + QETH_DBF_CARD1(0, setup, "free", card); vfree(card); /* we checked against NULL already */ } @@ -6649,8 +6514,7 @@ return; } - QETH_DBF_TEXT3(0, trace, "rmcl"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "rmcl", card); /* check first, if card is in list */ if (!firstcard) { @@ -6661,9 +6525,9 @@ return; } - spin_lock_irqsave(get_ccwdev_lock(card->rdev), flags0); - spin_lock_irqsave(get_ccwdev_lock(card->wdev), flags1); - spin_lock_irqsave(get_ccwdev_lock(card->ddev), flags2); + spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags0); + spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags1); + spin_lock_irqsave(get_ccwdev_lock(CARD_DDEV(card)), flags2); if (firstcard == card) firstcard = card->next; @@ -6679,9 +6543,9 @@ } } - spin_unlock_irqrestore(get_ccwdev_lock(card->ddev), flags2); - spin_unlock_irqrestore(get_ccwdev_lock(card->wdev), flags1); - spin_unlock_irqrestore(get_ccwdev_lock(card->rdev), flags0); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_DDEV(card)), flags2); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags1); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags0); write_unlock(&list_lock); @@ -6718,10 +6582,8 @@ if (!card) return; - QETH_DBF_TEXT2(0, trace, "rmcd"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - QETH_DBF_TEXT1(0, setup, "rmcd"); - QETH_DBF_TEXT1(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "rmcd", card); + QETH_DBF_CARD1(0, setup, "rmcd", card); if (method == QETH_REMOVE_CARD_PROPER) { atomic_set(&card->shutdown_phase, QETH_REMOVE_CARD_PROPER); @@ -6762,7 +6624,7 @@ /* Remove sysfs symlinks. */ sysfs_remove_link(&card->gdev->dev.kobj, card->dev_name); sysfs_remove_link(&card->dev->class_dev.kobj, - card->gdev->dev.bus_id); + CARD_BUS_ID(card)); QETH_DBF_TEXT2(0, trace, "unregdev"); qeth_unregister_netdev(card); qeth_wait_nonbusy(QETH_REMOVE_WAIT_TIME); @@ -6790,8 +6652,7 @@ struct qeth_card *card; card = (struct qeth_card *) (dev->priv); - QETH_DBF_TEXT2(0, trace, "dstr"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "dstr", card); } static void @@ -6799,8 +6660,7 @@ { struct qeth_card *card = dev->priv; - QETH_DBF_TEXT2(0, trace, "smcl"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "smcl", card); qeth_start_softsetup_thread(card); } @@ -6811,8 +6671,7 @@ struct qeth_card *card; card = (struct qeth_card *) dev->priv; - QETH_DBF_TEXT2(0, trace, "stmc"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "stmc", card); return -EOPNOTSUPP; } @@ -6823,8 +6682,7 @@ struct qeth_card *card; card = (struct qeth_card *) dev->priv; - QETH_DBF_TEXT2(0, trace, "ngst"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ngst", card); return 0; } @@ -6883,23 +6741,23 @@ memcpy(QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->sendbuf), &card->func_level, 2); - temp = __raw_devno_from_bus_id(card->ddev->dev.bus_id); + temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card)); memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(card->dma_stuff->sendbuf), &temp, 2); temp = (card->cula << 8) + card->unit_addr2; memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(card->dma_stuff->sendbuf), &temp, 2); QETH_DBF_TEXT2(0, trace, "iarw"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_TEXT2(0, trace, CARD_RDEV_ID(card)); QETH_DBF_HEX2(0, control, card->dma_stuff->sendbuf, QETH_DBF_CONTROL_LEN); - spin_lock_irqsave(get_ccwdev_lock(card->rdev), flags); - result = ccw_device_start(card->rdev, &card->dma_stuff->write_ccw, + spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags); + result = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->write_ccw, IDX_ACTIVATE_WRITE_STATE, 0, 0); if (result) { qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO); - result2 = ccw_device_start(card->rdev, + result2 = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->write_ccw, IDX_ACTIVATE_WRITE_STATE, 0, 0); sprintf(dbf_text, "IRW1%4x", result); @@ -6909,7 +6767,7 @@ PRINT_WARN("qeth_idx_activate_read (write): do_IO returned " "%i, next try returns %i\n", result, result2); } - spin_unlock_irqrestore(get_ccwdev_lock(card->rdev), flags); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags); if (atomic_read(&card->break_out)) { QETH_DBF_TEXT3(0, trace, "IARWBRKO"); @@ -6918,9 +6776,9 @@ if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) { QETH_DBF_TEXT1(0, trace, "IRWT"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card)); PRINT_ERR("IDX_ACTIVATE(wr) on read channel device %s: " - "timeout\n", card->rdev->dev.bus_id); + "timeout\n", CARD_RDEV_ID(card)); return -EIO; } @@ -6929,13 +6787,13 @@ card->dma_stuff->read_ccw.count = QETH_BUFSIZE; card->dma_stuff->read_ccw.cda = QETH_GET_ADDR(card->dma_stuff->recbuf); - spin_lock_irqsave(get_ccwdev_lock(card->rdev), flags); + spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags); result2 = 0; - result = ccw_device_start(card->rdev, &card->dma_stuff->read_ccw, + result = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->read_ccw, IDX_ACTIVATE_READ_STATE, 0, 0); if (result) { qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO); - result2 = ccw_device_start(card->rdev, + result2 = ccw_device_start(CARD_RDEV(card), &card->dma_stuff->read_ccw, IDX_ACTIVATE_READ_STATE, 0, 0); sprintf(dbf_text, "IRR1%4x", result); @@ -6946,7 +6804,7 @@ "returned %i, next try returns %i\n", result, result2); } - spin_unlock_irqrestore(get_ccwdev_lock(card->rdev), flags); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags); if (result2) { result = result2; @@ -6956,21 +6814,21 @@ if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) { QETH_DBF_TEXT1(0, trace, "IRRT"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card)); PRINT_ERR("IDX_ACTIVATE(rd) on read channel device %s: " - "timeout\n", card->rdev->dev.bus_id); + "timeout\n", CARD_RDEV_ID(card)); return -EIO; } QETH_DBF_TEXT2(0, trace, "iarr"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_TEXT2(0, trace, CARD_RDEV_ID(card)); QETH_DBF_HEX2(0, control, card->dma_stuff->recbuf, QETH_DBF_CONTROL_LEN); if (!(QETH_IS_IDX_ACT_POS_REPLY(card->dma_stuff->recbuf))) { QETH_DBF_TEXT1(0, trace, "IRNR"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card)); PRINT_ERR("IDX_ACTIVATE on read channel device %s: negative " - "reply\n", card->rdev->dev.bus_id); + "reply\n", CARD_RDEV_ID(card)); return -EIO; } @@ -6987,12 +6845,12 @@ memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->recbuf), 2); if (temp != qeth_peer_func_level(card->func_level)) { QETH_DBF_TEXT1(0, trace, "IRFL"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_RDEV_ID(card)); sprintf(dbf_text, "%4x%4x", card->func_level, temp); QETH_DBF_TEXT1(0, trace, dbf_text); PRINT_WARN("IDX_ACTIVATE on read channel device %s: function " "level mismatch (sent: 0x%x, received: 0x%x)\n", - card->rdev->dev.bus_id, card->func_level, temp); + CARD_RDEV_ID(card), card->func_level, temp); result = -EIO; } @@ -7031,23 +6889,23 @@ memcpy(QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->sendbuf), &card->func_level, 2); - temp = __raw_devno_from_bus_id(card->ddev->dev.bus_id); + temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card)); memcpy(QETH_IDX_ACT_QDIO_DEV_CUA(card->dma_stuff->sendbuf), &temp, 2); temp = (card->cula << 8) + card->unit_addr2; memcpy(QETH_IDX_ACT_QDIO_DEV_REALADDR(card->dma_stuff->sendbuf), &temp, 2); QETH_DBF_TEXT2(0, trace, "iaww"); - QETH_DBF_TEXT2(0, trace, card->wdev->dev.bus_id); + QETH_DBF_TEXT2(0, trace, CARD_WDEV_ID(card)); QETH_DBF_HEX2(0, control, card->dma_stuff->sendbuf, QETH_DBF_CONTROL_LEN); - spin_lock_irqsave(get_ccwdev_lock(card->wdev), flags); - result = ccw_device_start(card->wdev, &card->dma_stuff->write_ccw, + spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags); + result = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->write_ccw, IDX_ACTIVATE_WRITE_STATE, 0, 0); if (result) { qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO); - result2 = ccw_device_start(card->wdev, + result2 = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->write_ccw, IDX_ACTIVATE_WRITE_STATE, 0, 0); sprintf(dbf_text, "IWW1%4x", result); @@ -7058,7 +6916,7 @@ "returned %i, next try returns %i\n", result, result2); } - spin_unlock_irqrestore(get_ccwdev_lock(card->wdev), flags); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags); if (atomic_read(&card->break_out)) { QETH_DBF_TEXT3(0, trace, "IAWWBRKO"); @@ -7067,9 +6925,9 @@ if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) { QETH_DBF_TEXT1(0, trace, "IWWT"); - QETH_DBF_TEXT1(0, trace, card->wdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card)); PRINT_ERR("IDX_ACTIVATE(wr) on write channel device %s: " - "timeout\n", card->wdev->dev.bus_id); + "timeout\n", CARD_WDEV_ID(card)); return -EIO; } @@ -7081,13 +6939,13 @@ read channel program */ card->dma_stuff->read_ccw.cda = QETH_GET_ADDR(card->dma_stuff->recbuf); - spin_lock_irqsave(get_ccwdev_lock(card->wdev), flags); + spin_lock_irqsave(get_ccwdev_lock(CARD_WDEV(card)), flags); result2 = 0; - result = ccw_device_start(card->wdev, &card->dma_stuff->read_ccw, + result = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->read_ccw, IDX_ACTIVATE_READ_STATE, 0, 0); if (result) { qeth_delay_millis(QETH_WAIT_BEFORE_2ND_DOIO); - result2 = ccw_device_start(card->wdev, + result2 = ccw_device_start(CARD_WDEV(card), &card->dma_stuff->read_ccw, IDX_ACTIVATE_READ_STATE, 0, 0); sprintf(dbf_text, "IWR1%4x", result); @@ -7098,7 +6956,7 @@ "%i, next try returns %i\n", result, result2); } - spin_unlock_irqrestore(get_ccwdev_lock(card->wdev), flags); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_WDEV(card)), flags); if (result2) { result = result2; @@ -7108,33 +6966,33 @@ if (qeth_sleepon(card, QETH_MPC_TIMEOUT)) { QETH_DBF_TEXT1(0, trace, "IWRT"); - QETH_DBF_TEXT1(0, trace, card->wdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card)); PRINT_ERR("IDX_ACTIVATE(rd) on write channel device %s: " - "timeout\n", card->wdev->dev.bus_id); + "timeout\n", CARD_WDEV_ID(card)); return -EIO; } QETH_DBF_TEXT2(0, trace, "iawr"); - QETH_DBF_TEXT2(0, trace, card->wdev->dev.bus_id); + QETH_DBF_TEXT2(0, trace, CARD_WDEV_ID(card)); QETH_DBF_HEX2(0, control, card->dma_stuff->recbuf, QETH_DBF_CONTROL_LEN); if (!(QETH_IS_IDX_ACT_POS_REPLY(card->dma_stuff->recbuf))) { QETH_DBF_TEXT1(0, trace, "IWNR"); - QETH_DBF_TEXT1(0, trace, card->wdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card)); PRINT_ERR("IDX_ACTIVATE on write channel device %s: negative " - "reply\n", card->wdev->dev.bus_id); + "reply\n", CARD_WDEV_ID(card)); return -EIO; } memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(card->dma_stuff->recbuf), 2); if ((temp & ~0x0100) != qeth_peer_func_level(card->func_level)) { QETH_DBF_TEXT1(0, trace, "IWFM"); - QETH_DBF_TEXT1(0, trace, card->wdev->dev.bus_id); + QETH_DBF_TEXT1(0, trace, CARD_WDEV_ID(card)); sprintf(dbf_text, "%4x%4x", card->func_level, temp); QETH_DBF_TEXT1(0, trace, dbf_text); PRINT_WARN("IDX_ACTIVATE on write channel device %s: function " "level mismatch (sent: 0x%x, received: 0x%x)\n", - card->wdev->dev.bus_id, card->func_level, temp); + CARD_WDEV_ID(card), card->func_level, temp); result = -EIO; } @@ -7249,8 +7107,7 @@ memcpy(&framesize, QETH_ULP_ENABLE_RESP_MAX_MTU(buffer), 2); mtu = qeth_get_mtu_outof_framesize(framesize); - QETH_DBF_TEXT2(0, trace, "ule"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "ule", card); sprintf(dbf_text, "mtu=%4x", mtu); QETH_DBF_TEXT2(0, trace, dbf_text); @@ -7300,7 +7157,7 @@ memcpy(QETH_ULP_SETUP_FILTER_TOKEN(card->send_buf), &card->token.ulp_filter_r, QETH_MPC_TOKEN_LENGTH); - temp = __raw_devno_from_bus_id(card->ddev->dev.bus_id); + temp = __raw_devno_from_bus_id(CARD_DDEV_ID(card)); memcpy(QETH_ULP_SETUP_CUA(card->send_buf), &temp, 2); temp = (card->cula << 8) + card->unit_addr2; memcpy(QETH_ULP_SETUP_REAL_DEVADDR(card->send_buf), &temp, 2); @@ -7375,7 +7232,7 @@ ptr++; } - init_data.cdev = card->ddev; + init_data.cdev = CARD_DDEV(card); init_data.q_format = qeth_get_q_format(card->type); init_data.qib_param_field_format = 0; init_data.qib_param_field = adapter_area; @@ -7413,7 +7270,7 @@ int result; char dbf_text[15]; - result = qdio_activate(card->ddev, 0); + result = qdio_activate(CARD_DDEV(card), 0); sprintf(dbf_text, "qda=%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); @@ -7680,8 +7537,7 @@ struct qeth_card *card; card = (struct qeth_card *) dev->priv; - QETH_DBF_TEXT2(1, trace, "XMTO"); - QETH_DBF_TEXT2(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(1, trace, "XMTO", card); card->stats->tx_errors++; atomic_set(&card->problem, PROBLEM_TX_TIMEOUT); qeth_schedule_recovery(card); @@ -7737,8 +7593,7 @@ card = (struct qeth_card *) dev->priv; - QETH_DBF_TEXT3(0, trace, "inid"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "inid", card); dev->tx_timeout = &qeth_tx_timeout; dev->watchdog_timeo = QETH_TX_TIMEOUT; @@ -7798,15 +7653,14 @@ char dbf_text[15]; int length; - QETH_DBF_TEXT3(0, trace, "gtua"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "gtua", card); - result = read_conf_data(card->ddev, (void **) &prcd, &length); + result = read_conf_data(CARD_DDEV(card), (void **) &prcd, &length); if (result) { sprintf(dbf_text, "rcd%4x", result); QETH_DBF_TEXT3(0, trace, dbf_text); PRINT_ERR("read_conf_data for device %s returned %i\n", - card->ddev->dev.bus_id, result); + CARD_DDEV_ID(card), result); return result; } @@ -7866,9 +7720,9 @@ } \ } while (0) - DO_SEND_NOP(card->rdev); - DO_SEND_NOP(card->wdev); - DO_SEND_NOP(card->ddev); + DO_SEND_NOP(CARD_RDEV(card)); + DO_SEND_NOP(CARD_WDEV(card)); + DO_SEND_NOP(CARD_DDEV(card)); exit: return result; @@ -7884,8 +7738,7 @@ return; } - QETH_DBF_TEXT3(0, trace, "clcs"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "clcs", card); atomic_set(&card->is_startlaned, 0); @@ -7955,7 +7808,7 @@ if (i < card->options.inbound_buffer_count) qeth_queue_input_buffer(card,i,0); } - qdio_synchronize(card->ddev, QDIO_FLAG_SYNC_INPUT, 0); + qdio_synchronize(CARD_DDEV(card), QDIO_FLAG_SYNC_INPUT, 0); } /* initializes all the structures for a card */ @@ -7974,8 +7827,7 @@ atomic_set(&card->shutdown_phase, 0); if (atomic_read(&card->is_hardsetup)) { - QETH_DBF_TEXT2(1, trace, "hscd"); - QETH_DBF_TEXT2(1, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(1, trace, "hscd", card); PRINT_ALL("card is already hardsetup.\n"); return 0; } @@ -7990,8 +7842,7 @@ if (in_recovery) { PRINT_STUPID("qeth: recovery: quiescing %s...\n", card->dev_name); - QETH_DBF_TEXT2(0, trace, "Rqsc"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "Rqsc", card); qeth_wait_nonbusy(QETH_QUIESCE_WAIT_BEFORE_CLEAR); } clear_laps = QETH_HARDSETUP_CLEAR_LAPS; @@ -8011,8 +7862,7 @@ if (in_recovery) { PRINT_STUPID("qeth: recovery: still quiescing %s...\n", card->dev_name); - QETH_DBF_TEXT2(0, trace, "RQsc"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "RQsc", card); qeth_wait_nonbusy(QETH_QUIESCE_WAIT_AFTER_CLEAR); } else { atomic_set(&card->shutdown_phase, 0); @@ -8100,9 +7950,9 @@ QETH_DBF_TEXT2(0, trace, "hsissurd"); /* from here, there will always be an outstanding read */ - spin_lock_irqsave(get_ccwdev_lock(card->rdev), flags); + spin_lock_irqsave(get_ccwdev_lock(CARD_RDEV(card)), flags); qeth_issue_next_read(card); - spin_unlock_irqrestore(get_ccwdev_lock(card->rdev), flags); + spin_unlock_irqrestore(get_ccwdev_lock(CARD_RDEV(card)), flags); PRINT_TOKENS; QETH_DBF_TEXT2(0, trace, "hscmenab"); @@ -8141,12 +7991,11 @@ CHECK_ERRORS; } while ((laps--) && (breakout == QETH_BREAKOUT_AGAIN)); if (breakout == QETH_BREAKOUT_AGAIN) { - QETH_DBF_TEXT2(0, trace, "hsnr"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "hsnr", card); PRINT_ERR("qeth: recovery not successful on device " "%s/%s/%s; giving up.\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, card->ddev->dev.bus_id); + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), CARD_DDEV_ID(card)); result = -EIO; goto exit; } @@ -8212,9 +8061,9 @@ QETH_DBF_TEXT1(0, trace, "RECOVSUC"); PRINT_INFO("qeth: recovered device %s/%s/%s (%s) " "successfully.\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id, card->dev_name); + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card), card->dev_name); } else { QETH_DBF_TEXT2(0, trace, "hrdsetok"); @@ -8254,9 +8103,9 @@ dbf_text[8] = 0; printk("qeth: Device %s/%s/%s is a%s card%s%s%s\n" "with link type %s (portname: %s)\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id, + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card), qeth_get_cardname(card->type, card->is_guest_lan), (card->level[0]) ? " (level: " : "", @@ -8270,9 +8119,9 @@ printk("qeth: Device %s/%s/%s is a%s " "card%s%s%s\nwith link type %s " "(no portname needed by interface).\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id, + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card), qeth_get_cardname(card->type, card->is_guest_lan), (card->level[0]) ? " (level: " : "", @@ -8283,9 +8132,9 @@ else printk("qeth: Device %s/%s/%s is a%s " "card%s%s%s\nwith link type %s.\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id, + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card), qeth_get_cardname(card->type, card->is_guest_lan), (card->level[0]) ? " (level: " : "", @@ -8311,11 +8160,10 @@ int result; char name[15]; - QETH_DBF_TEXT1(0, trace, "RINI"); - QETH_DBF_TEXT1(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, trace, "RINI", card); /* set a nice name ... */ - sprintf(name, "qethrinid%s", card->rdev->dev.bus_id); + sprintf(name, "qethrinid%s", CARD_BUS_ID(card)); daemonize(name); if (atomic_read(&card->shutdown_phase)) @@ -8391,9 +8239,9 @@ "(%s/%s/%s), GIVING UP, " "OUTGOING PACKETS WILL BE DISCARDED!\n", card->dev_name, - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id); + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card)); /* early leave hard_start_xmit! */ atomic_set(&card->is_startlaned, 0); qeth_wakeup_procfile(); @@ -8562,8 +8410,7 @@ { int i, j; - QETH_DBF_TEXT3(0, trace, "irb1"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "irb1", card); for (i = 0; i < card->no_queues; i++) { card->outbound_ringbuffer[i] = @@ -8590,8 +8437,7 @@ { int i, j; - QETH_DBF_TEXT3(0, trace, "irb2"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "irb2", card); for (i = 0; i < card->options.inbound_buffer_count; i++) { for (j = 0; j < BUFFER_MAX_ELEMENTS; j++) { @@ -8630,8 +8476,7 @@ static void qeth_insert_card_into_list(struct qeth_card *card) { - QETH_DBF_TEXT3(0, trace, "icil"); - QETH_DBF_TEXT3(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD3(0, trace, "icil", card); write_lock(&list_lock); card->next = firstcard; @@ -8646,8 +8491,8 @@ char dbf_text[15]; while (known_devices[i][4]) { - if ((card->rdev->id.dev_type == known_devices[i][2]) && - (card->rdev->id.dev_model == known_devices[i][3])) { + if ((CARD_RDEV(card)->id.dev_type == known_devices[i][2]) && + (CARD_RDEV(card)->id.dev_model == known_devices[i][3])) { card->type = known_devices[i][4]; if (card->options.ena_ipat == ENABLE_TAKEOVER) card->func_level = known_devices[i][6]; @@ -8655,7 +8500,7 @@ card->func_level = known_devices[i][7]; card->no_queues = known_devices[i][8]; card->is_multicast_different = known_devices[i][9]; - QETH_DBF_TEXT2(0, setup, card->rdev->dev.bus_id); + QETH_DBF_TEXT2(0, setup, CARD_BUS_ID(card)); sprintf(dbf_text, "ctyp%4x", card->type); QETH_DBF_TEXT2(0, setup, dbf_text); return 0; @@ -8663,10 +8508,10 @@ i++; } card->type = QETH_CARD_TYPE_UNKNOWN; - QETH_DBF_TEXT2(0, setup, card->rdev->dev.bus_id); + QETH_DBF_TEXT2(0, setup, CARD_BUS_ID(card)); sprintf(dbf_text, "ctypUNKN"); QETH_DBF_TEXT2(0, setup, dbf_text); - PRINT_ERR("unknown card type on device %s\n", card->rdev->dev.bus_id); + PRINT_ERR("unknown card type on device %s\n", CARD_BUS_ID(card)); return -ENOENT; } @@ -8815,10 +8660,8 @@ { struct qeth_card *card; struct net_device *dev = (struct net_device *) ptr; - char dbf_text[15]; - sprintf(dbf_text, "devevent"); - QETH_DBF_TEXT3(0, trace, dbf_text); + QETH_DBF_TEXT3(0, trace, "devevent"); QETH_DBF_HEX3(0, trace, &event, sizeof (unsigned long)); QETH_DBF_HEX3(0, trace, &dev, sizeof (void *)); @@ -8843,8 +8686,7 @@ struct net_device *dev = ifa->ifa_dev->dev; char dbf_text[15]; - sprintf(dbf_text, "ipevent"); - QETH_DBF_TEXT3(0, trace, dbf_text); + QETH_DBF_TEXT3(0, trace, "ipevent"); QETH_DBF_HEX3(0, trace, &event, sizeof (unsigned long)); QETH_DBF_HEX3(0, trace, &dev, sizeof (void *)); sprintf(dbf_text, "%08x", ifa->ifa_address); @@ -8869,10 +8711,8 @@ struct qeth_card *card; struct inet6_ifaddr *ifa = (struct inet6_ifaddr *) ptr; struct net_device *dev = ifa->idev->dev; - char dbf_text[15]; - sprintf(dbf_text, "ip6event"); - QETH_DBF_TEXT3(0, trace, dbf_text); + QETH_DBF_TEXT3(0, trace, "ip6event"); QETH_DBF_HEX3(0, trace, &event, sizeof (unsigned long)); QETH_DBF_HEX3(0, trace, &dev, sizeof (void *)); QETH_DBF_HEX3(0, trace, ifa->addr.s6_addr, QETH_DBF_TRACE_LEN); @@ -8900,14 +8740,14 @@ card = firstcard; clear_another_one: if (card->type == QETH_CARD_TYPE_IQD) { - ccw_device_halt(card->ddev, 0); - ccw_device_clear(card->rdev, 0); - ccw_device_clear(card->wdev, 0); - ccw_device_clear(card->ddev, 0); + ccw_device_halt(CARD_DDEV(card), 0); + ccw_device_clear(CARD_RDEV(card), 0); + ccw_device_clear(CARD_WDEV(card), 0); + ccw_device_clear(CARD_DDEV(card), 0); } else { - ccw_device_clear(card->ddev, 0); - ccw_device_clear(card->rdev, 0); - ccw_device_clear(card->wdev, 0); + ccw_device_clear(CARD_DDEV(card), 0); + ccw_device_clear(CARD_RDEV(card), 0); + ccw_device_clear(CARD_WDEV(card), 0); } if (card->next) { card = card->next; @@ -9121,9 +8961,9 @@ length += sprintf(buffer + length, "%s/%s/%s x%02X %10s %14s %2i" " +++ CABLE PULLED +++\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id, + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card), card->chpid, card->dev_name, qeth_get_cardname_short @@ -9134,9 +8974,9 @@ length += sprintf(buffer + length, "%s/%s/%s x%02X %10s %14s %2i" " %2s %10s %3s %3s %3i\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id, + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card), card->chpid, card->dev_name, qeth_get_cardname_short (card->type, card->link_type, @@ -9175,9 +9015,9 @@ while (card) { _OUTP_IT("For card with devnos %s/%s/%s (%s):\n", - card->rdev->dev.bus_id, - card->wdev->dev.bus_id, - card->ddev->dev.bus_id, card->dev_name); + CARD_RDEV_ID(card), + CARD_WDEV_ID(card), + CARD_DDEV_ID(card), card->dev_name); _OUTP_IT(" Skb's/buffers received : %i/%i\n", card->perf_stats.skbs_rec, card->perf_stats.bufs_rec); _OUTP_IT(" Skb's/buffers sent : %i/%i\n", @@ -9686,6 +9526,7 @@ }; static struct file_operations qeth_procfile_fops = { + .owner = THIS_MODULE, .ioctl = qeth_procfile_ioctl, .read = qeth_procfile_read, .open = qeth_procfile_open, @@ -9695,6 +9536,7 @@ static struct proc_dir_entry *qeth_proc_file; static struct file_operations qeth_ipato_procfile_fops = { + .owner = THIS_MODULE, .read = qeth_procfile_read, /* same as above! */ .write = qeth_ipato_procfile_write, .open = qeth_ipato_procfile_open, @@ -9937,8 +9779,14 @@ .remove = ccwgroup_remove_ccwdev, }; +static void +qeth_root_dev_release (struct device *dev) +{ +} + static struct device qeth_root_dev = { .bus_id = "qeth", + .release = qeth_root_dev_release, }; static struct ccwgroup_driver qeth_ccwgroup_driver; @@ -10099,37 +9947,27 @@ tmp = strsep((char **) &buf, "\n"); cnt = strlen(tmp); if (!strncmp(tmp, "primary_router", cnt)) { - QETH_DBF_TEXT2(0, trace, "pri4"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "pri4", card); card->options.routing_type4 = PRIMARY_ROUTER | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "secondary_router", cnt)) { - QETH_DBF_TEXT2(0, trace, "sec4"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "sec4", card); card->options.routing_type4 = SECONDARY_ROUTER | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "multicast_router", cnt)) { - QETH_DBF_TEXT2(0, trace, "mcr4"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "mcr4", card); card->options.routing_type4 = MULTICAST_ROUTER | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "primary_connector", cnt)) { - QETH_DBF_TEXT2(0, trace, "prc4"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "prc4", card); card->options.routing_type4 = PRIMARY_CONNECTOR | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "secondary_connector", cnt)) { - QETH_DBF_TEXT2(0, trace, "scc4"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "scc4", card); card->options.routing_type4 = SECONDARY_CONNECTOR | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "no_router", cnt)) { - QETH_DBF_TEXT2(0, trace, "nor4"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "nor4", card); card->options.routing_type4 = NO_ROUTER | RESET_ROUTING_FLAG; } else { PRINT_WARN("unknown command input in route4 attribute\n"); @@ -10192,37 +10030,28 @@ tmp = strsep((char **) &buf, "\n"); cnt = strlen(tmp); if (!strncmp(tmp, "primary_router", cnt)) { - QETH_DBF_TEXT2(0, trace, "pri6"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "pri6", card); card->options.routing_type6 = PRIMARY_ROUTER | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "secondary_router", cnt)) { QETH_DBF_TEXT2(0, trace, "sec6"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "sec6", card); card->options.routing_type6 = SECONDARY_ROUTER | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "multicast_router", cnt)) { - QETH_DBF_TEXT2(0, trace, "mcr6"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "mcr6", card); card->options.routing_type6 = MULTICAST_ROUTER | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "primary_connector", cnt)) { - QETH_DBF_TEXT2(0, trace, "prc6"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "prc6", card); card->options.routing_type6 = PRIMARY_CONNECTOR | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "secondary_connector", cnt)) { - QETH_DBF_TEXT2(0, trace, "scc6"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "scc6", card); card->options.routing_type6 = SECONDARY_CONNECTOR | RESET_ROUTING_FLAG; } else if (!strncmp(tmp, "no_router", cnt)) { - QETH_DBF_TEXT2(0, trace, "nor6"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); - + QETH_DBF_CARD2(0, trace, "nor6", card); card->options.routing_type6 = NO_ROUTER | RESET_ROUTING_FLAG; } else { PRINT_WARN("unknown command input in route6 attribute\n"); @@ -10663,8 +10492,7 @@ i = simple_strtoul(buf, &tmp, 16); if (i == 1) { - QETH_DBF_TEXT2(0, trace, "UTRC"); - QETH_DBF_TEXT2(0, trace, card->rdev->dev.bus_id); + QETH_DBF_CARD2(0, trace, "UTRC", card); atomic_set(&card->problem, PROBLEM_USER_TRIGGERED_RECOVERY); qeth_schedule_recovery(card); return count; @@ -10746,15 +10574,12 @@ gdev->dev.driver_data = card; card->gdev = gdev; - card->rdev = gdev->cdev[0]; gdev->cdev[0]->handler = qeth_interrupt_handler_read; gdev->cdev[0]->dev.driver_data = card; - card->wdev = gdev->cdev[1]; gdev->cdev[1]->handler = qeth_interrupt_handler_write; gdev->cdev[1]->dev.driver_data = card; - card->ddev = gdev->cdev[2]; gdev->cdev[2]->handler = qeth_interrupt_handler_qdio; gdev->cdev[2]->dev.driver_data = card; @@ -10779,16 +10604,11 @@ { int result; - PRINT_STUPID("%s: got devices %s, %s, %s\n", - __func__, - rdev->dev.bus_id, wdev->dev.bus_id, ddev->dev.bus_id); - - ccw_device_set_online(card->rdev); - ccw_device_set_online(card->wdev); - ccw_device_set_online(card->ddev); + ccw_device_set_online(CARD_RDEV(card)); + ccw_device_set_online(CARD_WDEV(card)); + ccw_device_set_online(CARD_DDEV(card)); - QETH_DBF_TEXT1(0, setup, "activ"); - QETH_DBF_TEXT1(0, setup, card->rdev->dev.bus_id); + QETH_DBF_CARD1(0, setup, "activ", card); QETH_DBF_HEX1(0, setup, &card, sizeof (void *)); QETH_DBF_HEX1(0, setup, &card->dev, sizeof (void *)); QETH_DBF_HEX1(0, setup, &card->stats, sizeof (void *)); @@ -10833,7 +10653,7 @@ goto out_remove; } if (sysfs_create_link(&card->dev->class_dev.kobj, &card->gdev->dev.kobj, - card->gdev->dev.bus_id)) { + CARD_BUS_ID(card))) { sysfs_remove_link(&card->gdev->dev.kobj, card->dev_name); qeth_unregister_netdev(card); goto out_remove; @@ -10847,9 +10667,9 @@ out: QETH_DBF_TEXT4(0, trace, "freecard"); - ccw_device_set_offline(card->ddev); - ccw_device_set_offline(card->wdev); - ccw_device_set_offline(card->rdev); + ccw_device_set_offline(CARD_DDEV(card)); + ccw_device_set_offline(CARD_WDEV(card)); + ccw_device_set_offline(CARD_RDEV(card)); return -ENODEV; } @@ -10894,9 +10714,9 @@ QETH_DBF_TEXT4(0, trace, "freecard"); - ccw_device_set_offline(card->ddev); - ccw_device_set_offline(card->wdev); - ccw_device_set_offline(card->rdev); + ccw_device_set_offline(CARD_DDEV(card)); + ccw_device_set_offline(CARD_WDEV(card)); + ccw_device_set_offline(CARD_RDEV(card)); qeth_free_card_stuff(card); diff -Nru a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h --- a/drivers/s390/net/qeth.h Wed Oct 8 12:24:55 2003 +++ b/drivers/s390/net/qeth.h Wed Oct 8 12:24:55 2003 @@ -14,7 +14,7 @@ #define QETH_NAME " qeth" -#define VERSION_QETH_H "$Revision: 1.56 $" +#define VERSION_QETH_H "$Revision: 1.58 $" /******************** CONFIG STUFF ***********************/ //#define QETH_DBF_LIKE_HELL @@ -106,6 +106,12 @@ debug_text_event(qeth_dbf_##name,level,text); \ } while (0) +#define QETH_DBF_CARD(ex,name,level,text,card) \ + do { \ + QETH_DBF_TEXT(ex,name,level,text); \ + QETH_DBF_TEXT(ex,name,level,card->gdev->dev.bus_id); \ + } while (0) + #define QETH_DBF_HEX0(ex,name,addr,len) QETH_DBF_HEX(ex,name,0,addr,len) #define QETH_DBF_HEX1(ex,name,addr,len) QETH_DBF_HEX(ex,name,1,addr,len) #define QETH_DBF_HEX2(ex,name,addr,len) QETH_DBF_HEX(ex,name,2,addr,len) @@ -136,6 +142,21 @@ #define QETH_DBF_TEXT6(ex,name,text) do {} while (0) #endif /* QETH_DBF_LIKE_HELL */ +#define QETH_DBF_CARD0(ex,name,text,card) QETH_DBF_CARD(ex,name,0,text,card) +#define QETH_DBF_CARD1(ex,name,text,card) QETH_DBF_CARD(ex,name,1,text,card) +#define QETH_DBF_CARD2(ex,name,text,card) QETH_DBF_CARD(ex,name,2,text,card) +#ifdef QETH_DBF_LIKE_HELL +#define QETH_DBF_CARD3(ex,name,text,card) QETH_DBF_CARD(ex,name,3,text,card) +#define QETH_DBF_CARD4(ex,name,text,card) QETH_DBF_CARD(ex,name,4,text,card) +#define QETH_DBF_CARD5(ex,name,text,card) QETH_DBF_CARD(ex,name,5,text,card) +#define QETH_DBF_CARD6(ex,name,text,card) QETH_DBF_CARD(ex,name,6,text,card) +#else /* QETH_DBF_LIKE_HELL */ +#define QETH_DBF_CARD3(ex,name,text,card) do {} while (0) +#define QETH_DBF_CARD4(ex,name,text,card) do {} while (0) +#define QETH_DBF_CARD5(ex,name,text,card) do {} while (0) +#define QETH_DBF_CARD6(ex,name,text,card) do {} while (0) +#endif /* QETH_DBF_LIKE_HELL */ + #define QETH_DBF_SETUP_NAME "qeth_setup" #define QETH_DBF_SETUP_LEN 8 #define QETH_DBF_SETUP_INDEX 3 @@ -662,6 +683,14 @@ #define PROBLEM_MACHINE_CHECK 11 #define PROBLEM_TX_TIMEOUT 12 +#define CARD_RDEV(card) card->gdev->cdev[0] +#define CARD_WDEV(card) card->gdev->cdev[1] +#define CARD_DDEV(card) card->gdev->cdev[2] +#define CARD_BUS_ID(card) card->gdev->dev.bus_id +#define CARD_RDEV_ID(card) card->gdev->cdev[0]->dev.bus_id +#define CARD_WDEV_ID(card) card->gdev->cdev[1]->dev.bus_id +#define CARD_DDEV_ID(card) card->gdev->cdev[2]->dev.bus_id + #define SENSE_COMMAND_REJECT_BYTE 0 #define SENSE_COMMAND_REJECT_FLAG 0x80 #define SENSE_RESETTING_EVENT_BYTE 1 @@ -926,9 +955,6 @@ /* device and I/O data */ struct ccwgroup_device *gdev; - struct ccw_device *rdev; - struct ccw_device *wdev; - struct ccw_device *ddev; unsigned short unit_addr2; unsigned short cula; unsigned short chpid; diff -Nru a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c --- a/drivers/s390/s390mach.c Wed Oct 8 12:24:57 2003 +++ b/drivers/s390/s390mach.c Wed Oct 8 12:24:57 2003 @@ -44,7 +44,7 @@ struct crw crw; int ccode; - do { + while (1) { ccode = stcrw(&crw); if (ccode != 0) break; @@ -85,7 +85,7 @@ pr_debug("unknown source\n"); break; } - } while (crw.chn); + } } /* diff -Nru a/drivers/s390/scsi/Makefile b/drivers/s390/scsi/Makefile --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/Makefile Wed Oct 8 12:24:57 2003 @@ -0,0 +1,9 @@ +# +# Makefile for the S/390 specific device drivers +# + +zfcp-objs := zfcp_aux.o zfcp_ccw.o zfcp_scsi.o zfcp_erp.o zfcp_qdio.o \ + zfcp_fsf.o zfcp_sysfs_adapter.o zfcp_sysfs_port.o \ + zfcp_sysfs_unit.o zfcp_sysfs_driver.o + +obj-$(CONFIG_ZFCP) += zfcp.o diff -Nru a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_aux.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,1651 @@ +/* + * + * linux/drivers/s390/scsi/zfcp_aux.c + * + * FCP adapter driver for IBM eServer zSeries + * + * Copyright 2002 IBM Corporation + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* this drivers version (do not edit !!! generated and updated by cvs) */ +#define ZFCP_AUX_REVISION "$Revision: 1.65 $" + +/********************** INCLUDES *********************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zfcp_ext.h" + +#include +#include +#include +#include +#include /* Debugging only */ +#include /* Debugging only */ + +/* accumulated log level (module parameter) */ +static u32 loglevel = ZFCP_LOG_LEVEL_DEFAULTS; +/*********************** FUNCTION PROTOTYPES *********************************/ + +/* written against the module interface */ +static int __init zfcp_module_init(void); +static void __exit zfcp_module_exit(void); + +int zfcp_reboot_handler(struct notifier_block *, unsigned long, void *); + +/* FCP related */ +static void zfcp_nameserver_request_handler(struct zfcp_fsf_req *); + +/* miscellaneous */ +#ifdef ZFCP_STAT_REQSIZES +static int zfcp_statistics_init_all(void); +static int zfcp_statistics_clear_all(void); +static int zfcp_statistics_clear(struct list_head *); +static int zfcp_statistics_new(struct list_head *, u32); +#endif + +/*********************** KERNEL/MODULE PARAMETERS ***************************/ + +/* declare driver module init/cleanup functions */ +module_init(zfcp_module_init); +module_exit(zfcp_module_exit); + +MODULE_AUTHOR("Heiko Carstens , " + "Martin Peschke , " + "Raimund Schroeder , " + "Wolfgang Taphorn , " + "Aron Zeh , " + "IBM Deutschland Entwicklung GmbH"); +/* what this driver module is about */ +MODULE_DESCRIPTION + ("FCP (SCSI over Fibre Channel) HBA driver for IBM eServer zSeries"); +MODULE_LICENSE("GPL"); +/* log level may be provided as a module parameter */ +module_param(loglevel, uint, 0); +/* short explaination of the previous module parameter */ +MODULE_PARM_DESC(loglevel, + "log levels, 8 nibbles: " + "(unassigned) ERP QDIO DIO Config FSF SCSI Other, " + "levels: 0=none 1=normal 2=devel 3=trace"); + +#ifdef ZFCP_PRINT_FLAGS +u32 flags_dump = 0; +module_param(flags_dump, uint, 0); +#endif + +/****************************************************************/ +/************** Functions without logging ***********************/ +/****************************************************************/ + +void +_zfcp_hex_dump(char *addr, int count) +{ + int i; + for (i = 0; i < count; i++) { + printk("%02x", addr[i]); + if ((i % 4) == 3) + printk(" "); + if ((i % 32) == 31) + printk("\n"); + } + if ((i % 32) != 31) + printk("\n"); +} + +/****************************************************************/ +/************** Uncategorised Functions *************************/ +/****************************************************************/ + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_OTHER +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_OTHER + +#ifdef ZFCP_STAT_REQSIZES + +static int +zfcp_statistics_clear(struct list_head *head) +{ + int retval = 0; + unsigned long flags; + struct zfcp_statistics *stat, *tmp; + + write_lock_irqsave(&zfcp_data.stat_lock, flags); + list_for_each_entry_safe(stat, tmp, head, list) { + list_del(&stat->list); + kfree(stat); + } + write_unlock_irqrestore(&zfcp_data.stat_lock, flags); + + return retval; +} + +/* Add new statistics entry */ +static int +zfcp_statistics_new(struct list_head *head, u32 num) +{ + int retval = 0; + struct zfcp_statistics *stat; + + stat = kmalloc(sizeof (struct zfcp_statistics), GFP_ATOMIC); + if (stat) { + memset(stat, 0, sizeof (struct zfcp_statistics)); + stat->num = num; + stat->occurrence = 1; + list_add_tail(&stat->list, head); + } else + zfcp_data.stat_errors++; + + return retval; +} + +int +zfcp_statistics_inc(struct list_head *head, u32 num) +{ + int retval = 0; + unsigned long flags; + struct zfcp_statistics *stat; + + write_lock_irqsave(&zfcp_data.stat_lock, flags); + list_for_each_entry(stat, head, list) { + if (stat->num == num) { + stat->occurrence++; + goto unlock; + } + } + /* occurrence must be initialized to 1 */ + zfcp_statistics_new(head, num); + unlock: + write_unlock_irqrestore(&zfcp_data.stat_lock, flags); + return retval; +} + +static int +zfcp_statistics_init_all(void) +{ + int retval = 0; + + rwlock_init(&zfcp_data.stat_lock); + INIT_LIST_HEAD(&zfcp_data.read_req_head); + INIT_LIST_HEAD(&zfcp_data.write_req_head); + INIT_LIST_HEAD(&zfcp_data.read_sg_head); + INIT_LIST_HEAD(&zfcp_data.write_sg_head); + INIT_LIST_HEAD(&zfcp_data.read_sguse_head); + INIT_LIST_HEAD(&zfcp_data.write_sguse_head); + return retval; +} + +static int +zfcp_statistics_clear_all(void) +{ + int retval = 0; + + zfcp_statistics_clear(&zfcp_data.read_req_head); + zfcp_statistics_clear(&zfcp_data.write_req_head); + zfcp_statistics_clear(&zfcp_data.read_sg_head); + zfcp_statistics_clear(&zfcp_data.write_sg_head); + zfcp_statistics_clear(&zfcp_data.read_sguse_head); + zfcp_statistics_clear(&zfcp_data.write_sguse_head); + return retval; +} + +#endif /* ZFCP_STAT_REQSIZES */ + +static inline int +zfcp_fsf_req_is_scsi_cmnd(struct zfcp_fsf_req *fsf_req) +{ + return ((fsf_req->fsf_command == FSF_QTCB_FCP_CMND) && + !(fsf_req->status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT)); +} + +void +zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req, + void *add_data, int add_length) +{ +#ifdef ZFCP_DEBUG_COMMANDS + struct zfcp_adapter *adapter = fsf_req->adapter; + Scsi_Cmnd *scsi_cmnd; + int level = 3; + int i; + unsigned long flags; + + write_lock_irqsave(&adapter->cmd_dbf_lock, flags); + if (zfcp_fsf_req_is_scsi_cmnd(fsf_req)) { + scsi_cmnd = fsf_req->data.send_fcp_command_task.scsi_cmnd; + debug_text_event(adapter->cmd_dbf, level, "fsferror"); + debug_text_event(adapter->cmd_dbf, level, text); + debug_event(adapter->cmd_dbf, level, &fsf_req, + sizeof (unsigned long)); + debug_event(adapter->cmd_dbf, level, &fsf_req->seq_no, + sizeof (u32)); + debug_event(adapter->cmd_dbf, level, &scsi_cmnd, + sizeof (unsigned long)); + for (i = 0; i < add_length; i += ZFCP_CMD_DBF_LENGTH) + debug_event(adapter->cmd_dbf, + level, + (char *) add_data + i, + min(ZFCP_CMD_DBF_LENGTH, add_length - i)); + } + write_unlock_irqrestore(&adapter->cmd_dbf_lock, flags); +#endif +} + +void +zfcp_cmd_dbf_event_scsi(const char *text, Scsi_Cmnd * scsi_cmnd) +{ +#ifdef ZFCP_DEBUG_COMMANDS + struct zfcp_adapter *adapter; + union zfcp_req_data *req_data; + struct zfcp_fsf_req *fsf_req; + int level = ((host_byte(scsi_cmnd->result) != 0) ? 1 : 5); + unsigned long flags; + + adapter = (struct zfcp_adapter *) scsi_cmnd->device->host->hostdata[0]; + req_data = (union zfcp_req_data *) scsi_cmnd->host_scribble; + fsf_req = (req_data ? req_data->send_fcp_command_task.fsf_req : NULL); + write_lock_irqsave(&adapter->cmd_dbf_lock, flags); + debug_text_event(adapter->cmd_dbf, level, "hostbyte"); + debug_text_event(adapter->cmd_dbf, level, text); + debug_event(adapter->cmd_dbf, level, &scsi_cmnd->result, sizeof (u32)); + debug_event(adapter->cmd_dbf, level, &scsi_cmnd, + sizeof (unsigned long)); + if (fsf_req) { + debug_event(adapter->cmd_dbf, level, &fsf_req, + sizeof (unsigned long)); + debug_event(adapter->cmd_dbf, level, &fsf_req->seq_no, + sizeof (u32)); + } else { + debug_text_event(adapter->cmd_dbf, level, ""); + debug_text_event(adapter->cmd_dbf, level, ""); + } + write_unlock_irqrestore(&adapter->cmd_dbf_lock, flags); +#endif +} + +void +zfcp_in_els_dbf_event(struct zfcp_adapter *adapter, const char *text, + struct fsf_status_read_buffer *status_buffer, int length) +{ +#ifdef ZFCP_DEBUG_INCOMING_ELS + int level = 1; + int i; + + debug_text_event(adapter->in_els_dbf, level, text); + debug_event(adapter->in_els_dbf, level, &status_buffer->d_id, 8); + for (i = 0; i < length; i += ZFCP_IN_ELS_DBF_LENGTH) + debug_event(adapter->in_els_dbf, + level, + (char *) status_buffer->payload + i, + min(ZFCP_IN_ELS_DBF_LENGTH, length - i)); +#endif +} + +static int __init +zfcp_module_init(void) +{ + + int retval = 0; + + atomic_set(&zfcp_data.loglevel, loglevel); + + ZFCP_LOG_DEBUG(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); + + ZFCP_LOG_TRACE("Start Address of module: 0x%lx\n", + (unsigned long) &zfcp_module_init); + + /* initialize adapter list */ + INIT_LIST_HEAD(&zfcp_data.adapter_list_head); + + /* initialize adapters to be removed list head */ + INIT_LIST_HEAD(&zfcp_data.adapter_remove_lh); + +#ifdef ZFCP_STAT_REQSIZES + zfcp_statistics_init_all(); +#endif + + /* Initialise proc semaphores */ + sema_init(&zfcp_data.config_sema, 1); + + /* initialise configuration rw lock */ + rwlock_init(&zfcp_data.config_lock); + + zfcp_data.reboot_notifier.notifier_call = zfcp_reboot_handler; + register_reboot_notifier(&zfcp_data.reboot_notifier); + + /* save address of data structure managing the driver module */ + zfcp_data.scsi_host_template.module = THIS_MODULE; + + /* setup dynamic I/O */ + retval = zfcp_ccw_register(); + if (retval) { + ZFCP_LOG_NORMAL("Registering with common I/O layer failed.\n"); + goto out_ccw_register; + } + goto out; + + out_ccw_register: +#ifdef ZFCP_STAT_REQSIZES + zfcp_statistics_clear_all(); +#endif + + out: + return retval; +} + +static void __exit +zfcp_module_exit(void) +{ + unregister_reboot_notifier(&zfcp_data.reboot_notifier); + zfcp_ccw_unregister(); +#ifdef ZFCP_STAT_REQSIZES + zfcp_statistics_clear_all(); +#endif + ZFCP_LOG_DEBUG("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); +} + +/* + * This function is called automatically by the kernel whenever a reboot or a + * shut-down is initiated and zfcp is still loaded + * + * locks: zfcp_data.config_sema is taken prior to shutting down the module + * and removing all structures + * returns: NOTIFY_DONE in all cases + */ +int +zfcp_reboot_handler(struct notifier_block *notifier, unsigned long code, + void *ptr) +{ + int retval = NOTIFY_DONE; + + /* block access to config (for rest of lifetime of this Linux) */ + down(&zfcp_data.config_sema); + zfcp_erp_adapter_shutdown_all(); + + return retval; +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX + +/****************************************************************/ +/****** Functions for configuration/set-up of structures ********/ +/****************************************************************/ + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_CONFIG + +#ifndef MODULE +/* zfcp_loglevel boot_parameter */ +static int __init +zfcp_loglevel_setup(char *str) +{ + loglevel = simple_strtoul(str, NULL, 0); + ZFCP_LOG_TRACE("loglevel is 0x%x\n", loglevel); + return 1; /* why just 1? */ +} + +__setup("zfcp_loglevel=", zfcp_loglevel_setup); +#endif /* not MODULE */ + +/** + * zfcp_get_unit_by_lun - find unit in unit list of port by fcp lun + * @port: pointer to port to search for unit + * @fcp_lun: lun to search for + * Traverses list of all units of a port and returns pointer to a unit + * if lun of a unit matches. + */ + +struct zfcp_unit * +zfcp_get_unit_by_lun(struct zfcp_port *port, fcp_lun_t fcp_lun) +{ + struct zfcp_unit *unit; + int found = 0; + + list_for_each_entry(unit, &port->unit_list_head, list) { + if ((unit->fcp_lun == fcp_lun) && + !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status)) + { + found = 1; + break; + } + } + return found ? unit : NULL; +} + +/** + * zfcp_get_port_by_wwpn - find unit in unit list of port by fcp lun + * @adapter: pointer to adapter to search for port + * @wwpn: wwpn to search for + * Traverses list of all ports of an adapter and returns a pointer to a port + * if wwpn of a port matches. + */ + +struct zfcp_port * +zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter, wwn_t wwpn) +{ + struct zfcp_port *port; + int found = 0; + + list_for_each_entry(port, &adapter->port_list_head, list) { + if ((port->wwpn == wwpn) && + !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status)) + { + found = 1; + break; + } + } + return found ? port : NULL; +} + +/* + * Enqueues a logical unit at the end of the unit list associated with the + * specified port. Also sets up some unit internal structures. + * + * returns: pointer to unit with a usecount of 1 if a new unit was + * successfully enqueued + * NULL otherwise + * locks: config_sema must be held to serialise changes to the unit list + */ +struct zfcp_unit * +zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun) +{ + struct zfcp_unit *unit; + + /* + * check that there is no unit with this FCP_LUN already in list + * and enqueue it. + * Note: Unlike for the adapter and the port, this is an error + */ + read_lock_irq(&zfcp_data.config_lock); + unit = zfcp_get_unit_by_lun(port, fcp_lun); + read_unlock_irq(&zfcp_data.config_lock); + if (unit) + return NULL; + + unit = kmalloc(sizeof (struct zfcp_unit), GFP_KERNEL); + if (!unit) + return NULL; + memset(unit, 0, sizeof (struct zfcp_unit)); + + /* initialise reference count stuff */ + atomic_set(&unit->refcount, 0); + init_waitqueue_head(&unit->remove_wq); + + unit->port = port; + /* + * FIXME: reuse of scsi_luns! + */ + unit->scsi_lun = port->max_scsi_lun + 1; + unit->fcp_lun = fcp_lun; + unit->common_magic = ZFCP_MAGIC; + unit->specific_magic = ZFCP_MAGIC_UNIT; + + /* setup for sysfs registration */ + snprintf(unit->sysfs_device.bus_id, BUS_ID_SIZE, "0x%016llx", fcp_lun); + unit->sysfs_device.parent = &port->sysfs_device; + unit->sysfs_device.release = zfcp_sysfs_unit_release; + dev_set_drvdata(&unit->sysfs_device, unit); + + /* mark unit unusable as long as sysfs registration is not complete */ + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); + + if (device_register(&unit->sysfs_device)) { + kfree(unit); + return NULL; + } + + if (zfcp_sysfs_unit_create_files(&unit->sysfs_device)) { + /* + * failed to create all sysfs attributes, therefore the unit + * must be put on the unit_remove listhead of the port where + * the release function expects it. + */ + write_lock_irq(&zfcp_data.config_lock); + list_add_tail(&unit->list, &port->unit_remove_lh); + write_unlock_irq(&zfcp_data.config_lock); + device_unregister(&unit->sysfs_device); + return NULL; + } + + /* + * update max SCSI LUN of logical units attached to parent remote port + */ + port->max_scsi_lun++; + + /* + * update max SCSI LUN of logical units attached to parent adapter + */ + if (port->adapter->max_scsi_lun < port->max_scsi_lun) + port->adapter->max_scsi_lun = port->max_scsi_lun; + + /* + * update max SCSI LUN of logical units attached to host (SCSI stack) + */ + if (port->adapter->scsi_host && + (port->adapter->scsi_host->max_lun < port->max_scsi_lun)) + port->adapter->scsi_host->max_lun = port->max_scsi_lun + 1; + + zfcp_unit_get(unit); + + /* unit is new and needs to be added to list */ + write_lock_irq(&zfcp_data.config_lock); + atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); + atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status); + list_add_tail(&unit->list, &port->unit_list_head); + write_unlock_irq(&zfcp_data.config_lock); + + port->units++; + + return unit; +} + +/* locks: config_sema must be held */ +void +zfcp_unit_dequeue(struct zfcp_unit *unit) +{ + /* remove specified unit data structure from list */ + write_lock_irq(&zfcp_data.config_lock); + list_del(&unit->list); + write_unlock_irq(&zfcp_data.config_lock); + + unit->port->units--; + zfcp_port_put(unit->port); + + kfree(unit); + + return; +} + +static void * +zfcp_mempool_alloc(int gfp_mask, void *size) +{ + return kmalloc((size_t) size, gfp_mask); +} + +static void +zfcp_mempool_free(void *element, void *size) +{ + kfree(element); +} + +/* + * Allocates a combined QTCB/fsf_req buffer for erp actions and fcp/SCSI + * commands. + * It also genrates fcp-nameserver request/response buffer and unsolicited + * status read fsf_req buffers. + * + * locks: must only be called with zfcp_data.config_sema taken + */ +static int +zfcp_allocate_low_mem_buffers(struct zfcp_adapter *adapter) +{ + adapter->pool.erp_fsf = mempool_create( + 1, + zfcp_mempool_alloc, + zfcp_mempool_free, + (void *) ZFCP_QTCB_AND_REQ_SIZE); + if (!adapter->pool.erp_fsf) { + ZFCP_LOG_INFO + ("error: FCP command buffer pool allocation failed\n"); + return -ENOMEM; + } + + adapter->pool.nameserver = mempool_create( + 1, + zfcp_mempool_alloc, + zfcp_mempool_free, + (void *) (2 * sizeof (struct fc_ct_iu))); + if (!adapter->pool.nameserver) { + ZFCP_LOG_INFO + ("error: Nameserver buffer pool allocation failed\n"); + return -ENOMEM; + } + + adapter->pool.status_read_fsf = mempool_create( + ZFCP_STATUS_READS_RECOM, + zfcp_mempool_alloc, + zfcp_mempool_free, + (void *) sizeof (struct zfcp_fsf_req)); + if (!adapter->pool.status_read_fsf) { + ZFCP_LOG_INFO + ("error: Status read request pool allocation failed\n"); + return -ENOMEM; + } + + adapter->pool.status_read_buf = mempool_create( + ZFCP_STATUS_READS_RECOM, + zfcp_mempool_alloc, + zfcp_mempool_free, + (void *) sizeof (struct fsf_status_read_buffer)); + if (!adapter->pool.status_read_buf) { + ZFCP_LOG_INFO + ("error: Status read buffer pool allocation failed\n"); + return -ENOMEM; + } + + adapter->pool.fcp_command_fsf = mempool_create( + 1, + zfcp_mempool_alloc, + zfcp_mempool_free, + (void *) + ZFCP_QTCB_AND_REQ_SIZE); + if (!adapter->pool.fcp_command_fsf) { + ZFCP_LOG_INFO + ("error: FCP command buffer pool allocation failed\n"); + return -ENOMEM; + } + init_timer(&adapter->pool.fcp_command_fsf_timer); + adapter->pool.fcp_command_fsf_timer.function = + zfcp_erp_scsi_low_mem_buffer_timeout_handler; + adapter->pool.fcp_command_fsf_timer.data = (unsigned long) adapter; + + return 0; +} + +/* locks: must only be called with zfcp_data.config_sema taken */ +static void +zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter) +{ + if (adapter->pool.status_read_fsf) + mempool_destroy(adapter->pool.status_read_fsf); + if (adapter->pool.status_read_buf) + mempool_destroy(adapter->pool.status_read_buf); + if (adapter->pool.nameserver) + mempool_destroy(adapter->pool.nameserver); + if (adapter->pool.erp_fsf) + mempool_destroy(adapter->pool.erp_fsf); + if (adapter->pool.fcp_command_fsf) + mempool_destroy(adapter->pool.fcp_command_fsf); +} + +/* + * Enqueues an adapter at the end of the adapter list in the driver data. + * All adapter internal structures are set up. + * Proc-fs entries are also created. + * + * returns: 0 if a new adapter was successfully enqueued + * ZFCP_KNOWN if an adapter with this devno was already present + * -ENOMEM if alloc failed + * locks: config_sema must be held to serialise changes to the adapter list + */ +struct zfcp_adapter * +zfcp_adapter_enqueue(struct ccw_device *ccw_device) +{ + int retval = 0; + struct zfcp_adapter *adapter; + char dbf_name[20]; + + /* + * Note: It is safe to release the list_lock, as any list changes + * are protected by the config_sema, which must be held to get here + */ + + /* try to allocate new adapter data structure (zeroed) */ + adapter = kmalloc(sizeof (struct zfcp_adapter), GFP_KERNEL); + if (!adapter) { + ZFCP_LOG_INFO("error: Allocation of base adapter " + "structure failed\n"); + goto out; + } + memset(adapter, 0, sizeof (struct zfcp_adapter)); + + ccw_device->handler = NULL; + + /* save ccw_device pointer */ + adapter->ccw_device = ccw_device; + + retval = zfcp_qdio_allocate_queues(adapter); + if (retval) + goto queues_alloc_failed; + + retval = zfcp_qdio_allocate(adapter); + if (retval) + goto qdio_allocate_failed; + + retval = zfcp_allocate_low_mem_buffers(adapter); + if (retval) + goto failed_low_mem_buffers; + + /* set magics */ + adapter->common_magic = ZFCP_MAGIC; + adapter->specific_magic = ZFCP_MAGIC_ADAPTER; + + /* initialise reference count stuff */ + atomic_set(&adapter->refcount, 0); + init_waitqueue_head(&adapter->remove_wq); + + /* initialise list of ports */ + INIT_LIST_HEAD(&adapter->port_list_head); + + /* initialise list of ports to be removed */ + INIT_LIST_HEAD(&adapter->port_remove_lh); + + /* initialize list of fsf requests */ + rwlock_init(&adapter->fsf_req_list_lock); + INIT_LIST_HEAD(&adapter->fsf_req_list_head); + + /* initialize abort lock */ + rwlock_init(&adapter->abort_lock); + + /* initialise scsi faking structures */ + rwlock_init(&adapter->fake_list_lock); + init_timer(&adapter->fake_scsi_timer); + + /* initialise some erp stuff */ + init_waitqueue_head(&adapter->erp_thread_wqh); + init_waitqueue_head(&adapter->erp_done_wqh); + + /* notification when there are no outstanding SCSI commands */ + init_waitqueue_head(&adapter->scsi_reqs_active_wq); + + /* initialize lock of associated request queue */ + rwlock_init(&adapter->request_queue.queue_lock); + + /* intitialise SCSI ER timer */ + init_timer(&adapter->scsi_er_timer); + + /* set FC service class used per default */ + adapter->fc_service_class = ZFCP_FC_SERVICE_CLASS_DEFAULT; + + sprintf(adapter->name, "%s", zfcp_get_busid_by_adapter(adapter)); + ASCEBC(adapter->name, strlen(adapter->name)); + + /* mark adapter unusable as long as sysfs registration is not complete */ + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); + + adapter->ccw_device = ccw_device; + dev_set_drvdata(&ccw_device->dev, adapter); + + if (zfcp_sysfs_adapter_create_files(&ccw_device->dev)) + goto sysfs_failed; + +#ifdef ZFCP_DEBUG_REQUESTS + /* debug feature area which records fsf request sequence numbers */ + sprintf(dbf_name, ZFCP_REQ_DBF_NAME "0x%s", + zfcp_get_busid_by_adapter(adapter)); + adapter->req_dbf = debug_register(dbf_name, + ZFCP_REQ_DBF_INDEX, + ZFCP_REQ_DBF_AREAS, + ZFCP_REQ_DBF_LENGTH); + if (!adapter->req_dbf) { + ZFCP_LOG_INFO + ("error: Out of resources. Request debug feature for " + "adapter %s could not be generated.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = -ENOMEM; + goto failed_req_dbf; + } + debug_register_view(adapter->req_dbf, &debug_hex_ascii_view); + debug_set_level(adapter->req_dbf, ZFCP_REQ_DBF_LEVEL); + debug_text_event(adapter->req_dbf, 1, "zzz"); +#endif /* ZFCP_DEBUG_REQUESTS */ + +#ifdef ZFCP_DEBUG_COMMANDS + /* debug feature area which records SCSI command failures (hostbyte) */ + rwlock_init(&adapter->cmd_dbf_lock); + sprintf(dbf_name, ZFCP_CMD_DBF_NAME "%s", + zfcp_get_busid_by_adapter(adapter)); + adapter->cmd_dbf = debug_register(dbf_name, + ZFCP_CMD_DBF_INDEX, + ZFCP_CMD_DBF_AREAS, + ZFCP_CMD_DBF_LENGTH); + if (!adapter->cmd_dbf) { + ZFCP_LOG_INFO + ("error: Out of resources. Command debug feature for " + "adapter %s could not be generated.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = -ENOMEM; + goto failed_cmd_dbf; + } + debug_register_view(adapter->cmd_dbf, &debug_hex_ascii_view); + debug_set_level(adapter->cmd_dbf, ZFCP_CMD_DBF_LEVEL); +#endif /* ZFCP_DEBUG_COMMANDS */ + +#ifdef ZFCP_DEBUG_ABORTS + /* debug feature area which records SCSI command aborts */ + sprintf(dbf_name, ZFCP_ABORT_DBF_NAME "%s", + zfcp_get_busid_by_adapter(adapter)); + adapter->abort_dbf = debug_register(dbf_name, + ZFCP_ABORT_DBF_INDEX, + ZFCP_ABORT_DBF_AREAS, + ZFCP_ABORT_DBF_LENGTH); + if (!adapter->abort_dbf) { + ZFCP_LOG_INFO + ("error: Out of resources. Abort debug feature for " + "adapter %s could not be generated.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = -ENOMEM; + goto failed_abort_dbf; + } + debug_register_view(adapter->abort_dbf, &debug_hex_ascii_view); + debug_set_level(adapter->abort_dbf, ZFCP_ABORT_DBF_LEVEL); +#endif /* ZFCP_DEBUG_ABORTS */ + +#ifdef ZFCP_DEBUG_INCOMING_ELS + /* debug feature area which records SCSI command aborts */ + sprintf(dbf_name, ZFCP_IN_ELS_DBF_NAME "%s", + zfcp_get_busid_by_adapter(adapter)); + adapter->in_els_dbf = debug_register(dbf_name, + ZFCP_IN_ELS_DBF_INDEX, + ZFCP_IN_ELS_DBF_AREAS, + ZFCP_IN_ELS_DBF_LENGTH); + if (!adapter->in_els_dbf) { + ZFCP_LOG_INFO("error: Out of resources. ELS debug feature for " + "adapter %s could not be generated.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = -ENOMEM; + goto failed_in_els_dbf; + } + debug_register_view(adapter->in_els_dbf, &debug_hex_ascii_view); + debug_set_level(adapter->in_els_dbf, ZFCP_IN_ELS_DBF_LEVEL); +#endif /* ZFCP_DEBUG_INCOMING_ELS */ + + sprintf(dbf_name, ZFCP_ERP_DBF_NAME "%s", + zfcp_get_busid_by_adapter(adapter)); + adapter->erp_dbf = debug_register(dbf_name, + ZFCP_ERP_DBF_INDEX, + ZFCP_ERP_DBF_AREAS, + ZFCP_ERP_DBF_LENGTH); + if (!adapter->erp_dbf) { + ZFCP_LOG_INFO("error: Out of resources. ERP debug feature for " + "adapter %s could not be generated.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = -ENOMEM; + goto failed_erp_dbf; + } + debug_register_view(adapter->erp_dbf, &debug_hex_ascii_view); + debug_set_level(adapter->erp_dbf, ZFCP_ERP_DBF_LEVEL); + + retval = zfcp_erp_thread_setup(adapter); + if (retval) { + ZFCP_LOG_INFO("error: out of resources. " + "error recovery thread for the adapter %s " + "could not be started\n", + zfcp_get_busid_by_adapter(adapter)); + goto thread_failed; + } + + /* put allocated adapter at list tail */ + write_lock_irq(&zfcp_data.config_lock); + atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); + atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &adapter->status); + list_add_tail(&adapter->list, &zfcp_data.adapter_list_head); + write_unlock_irq(&zfcp_data.config_lock); + + zfcp_data.adapters++; + + goto out; + + thread_failed: + if (qdio_free(adapter->ccw_device) != 0) + ZFCP_LOG_NORMAL + ("bug: could not free memory used by data transfer " + "mechanism for adapter %s\n", + zfcp_get_busid_by_adapter(adapter)); + + debug_unregister(adapter->erp_dbf); + + failed_erp_dbf: +#ifdef ZFCP_DEBUG_INCOMING_ELS + debug_unregister(adapter->in_els_dbf); + failed_in_els_dbf: +#endif + +#ifdef ZFCP_DEBUG_ABORTS + debug_unregister(adapter->abort_dbf); + failed_abort_dbf: +#endif + +#ifdef ZFCP_DEBUG_COMMANDS + debug_unregister(adapter->cmd_dbf); + failed_cmd_dbf: +#endif + +#ifdef ZFCP_DEBUG_REQUESTS + debug_unregister(adapter->req_dbf); + failed_req_dbf: +#endif + zfcp_sysfs_adapter_remove_files(&ccw_device->dev); + sysfs_failed: + dev_set_drvdata(&ccw_device->dev, NULL); + failed_low_mem_buffers: + zfcp_free_low_mem_buffers(adapter); + qdio_free(ccw_device); + qdio_allocate_failed: + zfcp_qdio_free_queues(adapter); + queues_alloc_failed: + kfree(adapter); + adapter = NULL; + out: + return adapter; +} + +/* + * returns: 0 - struct zfcp_adapter data structure successfully removed + * !0 - struct zfcp_adapter data structure could not be removed + * (e.g. still used) + * locks: adapter list write lock is assumed to be held by caller + * adapter->fsf_req_list_lock is taken and released within this + * function and must not be held on entry + */ +void +zfcp_adapter_dequeue(struct zfcp_adapter *adapter) +{ + int retval = 0; + unsigned long flags; + + zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); + dev_set_drvdata(&adapter->ccw_device->dev, NULL); + /* sanity check: no pending FSF requests */ + read_lock_irqsave(&adapter->fsf_req_list_lock, flags); + retval = !list_empty(&adapter->fsf_req_list_head); + read_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); + if (retval) { + ZFCP_LOG_NORMAL("bug: Adapter %s is still in use, " + "%i requests are still outstanding " + "(debug info 0x%lx)\n", + zfcp_get_busid_by_adapter(adapter), + atomic_read(&adapter->fsf_reqs_active), + (unsigned long) adapter); + retval = -EBUSY; + goto out; + } + + /* remove specified adapter data structure from list */ + write_lock_irq(&zfcp_data.config_lock); + list_del(&adapter->list); + write_unlock_irq(&zfcp_data.config_lock); + + /* decrease number of adapters in list */ + zfcp_data.adapters--; + + ZFCP_LOG_TRACE("adapter 0x%lx removed from list, " + "%i adapters still in list\n", + (unsigned long) adapter, zfcp_data.adapters); + + retval = zfcp_erp_thread_kill(adapter); + + retval |= qdio_free(adapter->ccw_device); + if (retval) + ZFCP_LOG_NORMAL + ("bug: could not free memory used by data transfer " + "mechanism for adapter %s\n", + zfcp_get_busid_by_adapter(adapter)); + + debug_unregister(adapter->erp_dbf); + +#ifdef ZFCP_DEBUG_REQUESTS + debug_unregister(adapter->req_dbf); +#endif + +#ifdef ZFCP_DEBUG_COMMANDS + debug_unregister(adapter->cmd_dbf); +#endif +#ifdef ZFCP_DEBUG_ABORTS + debug_unregister(adapter->abort_dbf); +#endif + +#ifdef ZFCP_DEBUG_INCOMING_ELS + debug_unregister(adapter->in_els_dbf); +#endif + + zfcp_free_low_mem_buffers(adapter); + /* free memory of adapter data structure and queues */ + zfcp_qdio_free_queues(adapter); + ZFCP_LOG_TRACE("Freeing adapter structure.\n"); + kfree(adapter); + out: + return; +} + +/* + * Enqueues a remote port at the end of the port list. + * All port internal structures are set-up and the proc-fs entry is also + * allocated. Some SCSI-stack structures are modified for the port. + * + * returns: 0 if a new port was successfully enqueued + * ZFCP_KNOWN if a port with the requested wwpn already exists + * -ENOMEM if allocation failed + * -EINVAL if at least one of the specified parameters was wrong + * locks: config_sema must be held to serialise changes to the port list + * within this function (must not be held on entry) + */ +struct zfcp_port * +zfcp_port_enqueue(struct zfcp_adapter *adapter, wwn_t wwpn, u32 status) +{ + struct zfcp_port *port; + int check_scsi_id; + int check_wwpn; + + check_scsi_id = !(status & ZFCP_STATUS_PORT_NO_SCSI_ID); + check_wwpn = !(status & ZFCP_STATUS_PORT_NO_WWPN); + + /* + * check that there is no port with this WWPN already in list + */ + if (check_wwpn) { + read_lock_irq(&zfcp_data.config_lock); + port = zfcp_get_port_by_wwpn(adapter, wwpn); + read_unlock_irq(&zfcp_data.config_lock); + if (port) + return NULL; + } + + port = kmalloc(sizeof (struct zfcp_port), GFP_KERNEL); + if (!port) + return NULL; + memset(port, 0, sizeof (struct zfcp_port)); + + /* initialise reference count stuff */ + atomic_set(&port->refcount, 0); + init_waitqueue_head(&port->remove_wq); + + INIT_LIST_HEAD(&port->unit_list_head); + INIT_LIST_HEAD(&port->unit_remove_lh); + + port->adapter = adapter; + + if (check_scsi_id) + port->scsi_id = adapter->max_scsi_id + 1; + + if (check_wwpn) + port->wwpn = wwpn; + + atomic_set_mask(status, &port->status); + + port->common_magic = ZFCP_MAGIC; + port->specific_magic = ZFCP_MAGIC_PORT; + + /* setup for sysfs registration */ + if (status & ZFCP_STATUS_PORT_NAMESERVER) + snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE, "nameserver"); + else + snprintf(port->sysfs_device.bus_id, + BUS_ID_SIZE, "0x%016llx", wwpn); + port->sysfs_device.parent = &adapter->ccw_device->dev; + port->sysfs_device.release = zfcp_sysfs_port_release; + dev_set_drvdata(&port->sysfs_device, port); + + /* mark port unusable as long as sysfs registration is not complete */ + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); + + if (device_register(&port->sysfs_device)) { + kfree(port); + return NULL; + } + + if (zfcp_sysfs_port_create_files(&port->sysfs_device, status)) { + /* + * failed to create all sysfs attributes, therefore the port + * must be put on the port_remove listhead of the adapter + * where the release function expects it. + */ + write_lock_irq(&zfcp_data.config_lock); + list_add_tail(&port->list, &adapter->port_remove_lh); + write_unlock_irq(&zfcp_data.config_lock); + device_unregister(&port->sysfs_device); + return NULL; + } + + if (check_scsi_id) { + /* + * update max. SCSI ID of remote ports attached to + * "parent" adapter if necessary + * (do not care about the adapters own SCSI ID) + */ + adapter->max_scsi_id++; + + /* + * update max. SCSI ID of remote ports attached to + * "parent" host (SCSI stack) if necessary + */ + if (adapter->scsi_host && + (adapter->scsi_host->max_id < adapter->max_scsi_id + 1)) + adapter->scsi_host->max_id = adapter->max_scsi_id + 1; + } + + zfcp_port_get(port); + + write_lock_irq(&zfcp_data.config_lock); + atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); + atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status); + list_add_tail(&port->list, &adapter->port_list_head); + write_unlock_irq(&zfcp_data.config_lock); + + adapter->ports++; + + return port; +} + +/* + * returns: 0 - struct zfcp_port data structure successfully removed + * !0 - struct zfcp_port data structure could not be removed + * (e.g. still used) + * locks : port list write lock is assumed to be held by caller + */ +void +zfcp_port_dequeue(struct zfcp_port *port) +{ + /* remove specified port from list */ + write_lock_irq(&zfcp_data.config_lock); + list_del(&port->list); + write_unlock_irq(&zfcp_data.config_lock); + + port->adapter->ports--; + zfcp_adapter_put(port->adapter); + + kfree(port); + + return; +} + +/* Enqueues a nameserver port */ +int +zfcp_nameserver_enqueue(struct zfcp_adapter *adapter) +{ + struct zfcp_port *port; + + /* generate port structure */ + port = zfcp_port_enqueue(adapter, 0, ZFCP_STATUS_PORT_NAMESERVER); + if (!port) { + ZFCP_LOG_INFO("error: Could not establish a connection to the " + "fabric name server connected to the " + "adapter %s\n", + zfcp_get_busid_by_adapter(adapter)); + return -ENXIO; + } + /* set special D_ID */ + port->d_id = ZFCP_DID_NAMESERVER; + adapter->nameserver_port = port; + zfcp_adapter_get(adapter); + zfcp_port_put(port); + + return 0; +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX + +/****************************************************************/ +/******* Fibre Channel Standard related Functions **************/ +/****************************************************************/ + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_FC +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_FC + +void +zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter, + struct fsf_status_read_buffer *status_buffer) +{ + struct fcp_rscn_head *fcp_rscn_head; + struct fcp_rscn_element *fcp_rscn_element; + struct zfcp_port *port; + int i; + int reopen_unknown = 0; + int no_entries; + unsigned long flags; + + fcp_rscn_head = (struct fcp_rscn_head *) status_buffer->payload; + fcp_rscn_element = (struct fcp_rscn_element *) status_buffer->payload; + + /* see FC-FS */ + no_entries = (fcp_rscn_head->payload_len / 4); + + zfcp_in_els_dbf_event(adapter, "##rscn", status_buffer, + fcp_rscn_head->payload_len); + + debug_text_event(adapter->erp_dbf, 1, "unsol_els_rscn:"); + for (i = 1; i < no_entries; i++) { + int known; + int range_mask; + int no_notifications; + + range_mask = 0; + no_notifications = 0; + known = 0; + /* skip head and start with 1st element */ + fcp_rscn_element++; + switch (fcp_rscn_element->addr_format) { + case ZFCP_PORT_ADDRESS: + ZFCP_LOG_FLAGS(1, "ZFCP_PORT_ADDRESS\n"); + range_mask = ZFCP_PORTS_RANGE_PORT; + no_notifications = 1; + break; + case ZFCP_AREA_ADDRESS: + ZFCP_LOG_FLAGS(1, "ZFCP_AREA_ADDRESS\n"); + /* skip head and start with 1st element */ + range_mask = ZFCP_PORTS_RANGE_AREA; + no_notifications = ZFCP_NO_PORTS_PER_AREA; + break; + case ZFCP_DOMAIN_ADDRESS: + ZFCP_LOG_FLAGS(1, "ZFCP_DOMAIN_ADDRESS\n"); + range_mask = ZFCP_PORTS_RANGE_DOMAIN; + no_notifications = ZFCP_NO_PORTS_PER_DOMAIN; + break; + case ZFCP_FABRIC_ADDRESS: + ZFCP_LOG_FLAGS(1, "ZFCP_FABRIC_ADDRESS\n"); + range_mask = ZFCP_PORTS_RANGE_FABRIC; + no_notifications = ZFCP_NO_PORTS_PER_FABRIC; + break; + default: + /* cannot happen */ + break; + } + read_lock_irqsave(&zfcp_data.config_lock, flags); + list_for_each_entry(port, &adapter->port_list_head, list) { + /* Do we know this port? If not skip it. */ + if (!atomic_test_mask + (ZFCP_STATUS_PORT_DID_DID, &port->status)) + continue; + /* + * FIXME: race: d_id might being invalidated + * (...DID_DID reset) + */ + if ((port->d_id & range_mask) + == (fcp_rscn_element->nport_did & range_mask)) { + known++; + ZFCP_LOG_TRACE("known=%d, reopen did 0x%x\n", + known, + fcp_rscn_element->nport_did); + /* + * Unfortunately, an RSCN does not specify the + * type of change a target underwent. We assume + * that it makes sense to reopen the link. + * FIXME: Shall we try to find out more about + * the target and link state before closing it? + * How to accomplish this? (nameserver?) + * Where would such code be put in? + * (inside or outside erp) + */ + ZFCP_LOG_INFO + ("Received state change notification." + "Trying to reopen the port with wwpn " + "0x%Lx.\n", port->wwpn); + debug_text_event(adapter->erp_dbf, 1, + "unsol_els_rscnk:"); + zfcp_erp_port_reopen(port, 0); + } + } + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + ZFCP_LOG_TRACE("known %d, no_notifications %d\n", + known, no_notifications); + if (known < no_notifications) { + ZFCP_LOG_DEBUG + ("At least one unknown port changed state. " + "Unknown ports need to be reopened.\n"); + reopen_unknown = 1; + } + } // for (i=1; i < no_entries; i++) + + if (reopen_unknown) { + ZFCP_LOG_DEBUG("At least one unknown did " + "underwent a state change.\n"); + read_lock_irqsave(&zfcp_data.config_lock, flags); + list_for_each_entry(port, &adapter->port_list_head, list) { + if (!atomic_test_mask((ZFCP_STATUS_PORT_DID_DID + | ZFCP_STATUS_PORT_NAMESERVER), + &port->status)) { + ZFCP_LOG_INFO + ("Received state change notification." + "Trying to open the port with wwpn " + "0x%Lx. Hope it's there now.\n", + port->wwpn); + debug_text_event(adapter->erp_dbf, 1, + "unsol_els_rscnu:"); + zfcp_erp_port_reopen(port, + ZFCP_STATUS_COMMON_ERP_FAILED); + } + } + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + } +} + +static void +zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter, + struct fsf_status_read_buffer *status_buffer) +{ + logi *els_logi = (logi *) status_buffer->payload; + struct zfcp_port *port; + unsigned long flags; + + zfcp_in_els_dbf_event(adapter, "##plogi", status_buffer, 28); + + read_lock_irqsave(&zfcp_data.config_lock, flags); + list_for_each_entry(port, &adapter->port_list_head, list) { + if (port->wwpn == (*(wwn_t *) & els_logi->nport_wwn)) + break; + } + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + if (!port || (port->wwpn != (*(wwn_t *) & els_logi->nport_wwn))) { + ZFCP_LOG_DEBUG("Re-open port indication received " + "for the non-existing port with D_ID " + "0x%3.3x, on the adapter " + "%s. Ignored.\n", + status_buffer->d_id, + zfcp_get_busid_by_adapter(adapter)); + } else { + debug_text_event(adapter->erp_dbf, 1, "unsol_els_plogi:"); + debug_event(adapter->erp_dbf, 1, &els_logi->nport_wwn, 8); + zfcp_erp_port_forced_reopen(port, 0); + } +} + +static void +zfcp_fsf_incoming_els_logo(struct zfcp_adapter *adapter, + struct fsf_status_read_buffer *status_buffer) +{ + struct fcp_logo *els_logo = (struct fcp_logo *) status_buffer->payload; + struct zfcp_port *port; + unsigned long flags; + + zfcp_in_els_dbf_event(adapter, "##logo", status_buffer, 16); + + read_lock_irqsave(&zfcp_data.config_lock, flags); + list_for_each_entry(port, &adapter->port_list_head, list) { + if (port->wwpn == els_logo->nport_wwpn) + break; + } + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + if (!port || (port->wwpn != els_logo->nport_wwpn)) { + ZFCP_LOG_DEBUG("Re-open port indication received " + "for the non-existing port with D_ID " + "0x%3.3x, on the adapter " + "%s. Ignored.\n", + status_buffer->d_id, + zfcp_get_busid_by_adapter(adapter)); + } else { + debug_text_event(adapter->erp_dbf, 1, "unsol_els_logo:"); + debug_event(adapter->erp_dbf, 1, &els_logo->nport_wwpn, 8); + zfcp_erp_port_forced_reopen(port, 0); + } +} + +static void +zfcp_fsf_incoming_els_unknown(struct zfcp_adapter *adapter, + struct fsf_status_read_buffer *status_buffer) +{ + zfcp_in_els_dbf_event(adapter, "##undef", status_buffer, 24); + ZFCP_LOG_NORMAL("warning: Unknown incoming ELS (0x%x) received " + "for the adapter %s\n", + *(u32 *) (status_buffer->payload), + zfcp_get_busid_by_adapter(adapter)); + +} + +void +zfcp_fsf_incoming_els(struct zfcp_fsf_req *fsf_req) +{ + struct fsf_status_read_buffer *status_buffer; + u32 els_type; + struct zfcp_adapter *adapter; + + status_buffer = fsf_req->data.status_read.buffer; + els_type = *(u32 *) (status_buffer->payload); + adapter = fsf_req->adapter; + + if (els_type == LS_PLOGI) + zfcp_fsf_incoming_els_plogi(adapter, status_buffer); + else if (els_type == LS_LOGO) + zfcp_fsf_incoming_els_logo(adapter, status_buffer); + else if ((els_type & 0xffff0000) == LS_RSCN) + /* we are only concerned with the command, not the length */ + zfcp_fsf_incoming_els_rscn(adapter, status_buffer); + else + zfcp_fsf_incoming_els_unknown(adapter, status_buffer); +} + +/* + * function: zfcp_release_nameserver_buffers + * + * purpose: + * + * returns: + */ +static void +zfcp_release_nameserver_buffers(struct zfcp_fsf_req *fsf_req) +{ + struct zfcp_adapter *adapter = fsf_req->adapter; + void *buffer = fsf_req->data.send_generic.outbuf; + + /* FIXME: not sure about appeal of this new flag (martin) */ + if (fsf_req->status & ZFCP_STATUS_FSFREQ_POOLBUF) + mempool_free(buffer, adapter->pool.nameserver); + else + kfree(buffer); +} + +/* + * function: zfcp_get_nameserver_buffers + * + * purpose: + * + * returns: + * + * locks: fsf_request_list_lock is held when doing buffer pool + * operations + */ +static int +zfcp_get_nameserver_buffers(struct zfcp_fsf_req *fsf_req) +{ + struct zfcp_send_generic *data = &fsf_req->data.send_generic; + struct zfcp_adapter *adapter = fsf_req->adapter; + int retval = 0; + + data->outbuf = kmalloc(2 * sizeof (struct fc_ct_iu), GFP_KERNEL); + if (data->outbuf) { + memset(data->outbuf, 0, 2 * sizeof (struct fc_ct_iu)); + } else { + ZFCP_LOG_DEBUG("Out of memory. Could not allocate at " + "least one of the buffers " + "required for a name-server request on the" + "adapter %s directly.. trying emergency pool\n", + zfcp_get_busid_by_adapter(adapter)); + data->outbuf = + mempool_alloc(adapter->pool.nameserver, GFP_KERNEL); + if (!data->outbuf) { + ZFCP_LOG_DEBUG + ("Out of memory. Could not get emergency " + "buffer required for a name-server request " + "on the adapter %s. All buffers are in " + "use.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = -ENOMEM; + goto out; + } + memset(data->outbuf, 0, 2 * sizeof (struct fc_ct_iu)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_POOLBUF; + } + data->outbuf_length = sizeof (struct fc_ct_iu); + data->inbuf_length = sizeof (struct fc_ct_iu); + data->inbuf = + (char *) ((unsigned long) data->outbuf + sizeof (struct fc_ct_iu)); + out: + return retval; +} + +/* + * function: zfcp_nameserver_request + * + * purpose: + * + * returns: + */ +int +zfcp_nameserver_request(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + struct fc_ct_iu *fc_ct_iu; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(erp_action->adapter, + FSF_QTCB_SEND_GENERIC, + &lock_flags, + ZFCP_WAIT_FOR_SBAL | ZFCP_REQ_AUTO_CLEANUP, + &(erp_action->fsf_req)); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create a " + "nameserver registration request for " + "adapter %s.\n", + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto failed_req; + } + retval = zfcp_get_nameserver_buffers(erp_action->fsf_req); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of memory. Could not allocate one of " + "the buffers required for a nameserver request " + "on adapter %s.\n", + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto failed_buffers; + } + + /* setup name-server request in first page */ + fc_ct_iu = + (struct fc_ct_iu *) erp_action->fsf_req->data.send_generic.outbuf; + fc_ct_iu->revision = ZFCP_CT_REVISION; + fc_ct_iu->gs_type = ZFCP_CT_DIRECTORY_SERVICE; + fc_ct_iu->gs_subtype = ZFCP_CT_NAME_SERVER; + fc_ct_iu->options = ZFCP_CT_SYNCHRONOUS; + fc_ct_iu->cmd_rsp_code = ZFCP_CT_GID_PN; + fc_ct_iu->max_res_size = ZFCP_CT_MAX_SIZE; + fc_ct_iu->data.wwpn = erp_action->port->wwpn; + + erp_action->fsf_req->data.send_generic.handler = + zfcp_nameserver_request_handler; + erp_action->fsf_req->data.send_generic.handler_data = + (unsigned long) erp_action->port; + erp_action->fsf_req->data.send_generic.port = + erp_action->adapter->nameserver_port; + erp_action->fsf_req->erp_action = erp_action; + + /* send this one */ + retval = zfcp_fsf_send_generic(erp_action->fsf_req, + ZFCP_NAMESERVER_TIMEOUT, + &lock_flags, + &erp_action->timer); + if (retval) { + ZFCP_LOG_INFO("error: Could not send a" + "nameserver request command to adapter %s\n", + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto failed_send; + } + + goto out; + + failed_send: + zfcp_release_nameserver_buffers(erp_action->fsf_req); + + failed_buffers: + zfcp_fsf_req_free(erp_action->fsf_req); + erp_action->fsf_req = NULL; + + failed_req: + out: + write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, + lock_flags); + return retval; +} + +/* + * function: zfcp_nameserver_request_handler + * + * purpose: + * + * returns: + */ +static void +zfcp_nameserver_request_handler(struct zfcp_fsf_req *fsf_req) +{ + struct fc_ct_iu *fc_ct_iu_resp = + (struct fc_ct_iu *) (fsf_req->data.send_generic.inbuf); + struct fc_ct_iu *fc_ct_iu_req = + (struct fc_ct_iu *) (fsf_req->data.send_generic.outbuf); + struct zfcp_port *port = + (struct zfcp_port *) fsf_req->data.send_generic.handler_data; + + if (fc_ct_iu_resp->revision != ZFCP_CT_REVISION) + goto failed; + if (fc_ct_iu_resp->gs_type != ZFCP_CT_DIRECTORY_SERVICE) + goto failed; + if (fc_ct_iu_resp->gs_subtype != ZFCP_CT_NAME_SERVER) + goto failed; + if (fc_ct_iu_resp->options != ZFCP_CT_SYNCHRONOUS) + goto failed; + if (fc_ct_iu_resp->cmd_rsp_code != ZFCP_CT_ACCEPT) { + /* FIXME: do we need some specific erp entry points */ + atomic_set_mask(ZFCP_STATUS_PORT_INVALID_WWPN, &port->status); + goto failed; + } + /* paranoia */ + if (fc_ct_iu_req->data.wwpn != port->wwpn) { + ZFCP_LOG_NORMAL("bug: Port WWPN returned by nameserver lookup " + "does not correspond to " + "the expected value on the adapter %s. " + "(debug info 0x%Lx, 0x%Lx)\n", + zfcp_get_busid_by_port(port), + port->wwpn, fc_ct_iu_req->data.wwpn); + goto failed; + } + + /* looks like a valid d_id */ + port->d_id = ZFCP_DID_MASK & fc_ct_iu_resp->data.d_id; + atomic_set_mask(ZFCP_STATUS_PORT_DID_DID, &port->status); + ZFCP_LOG_DEBUG("busid %s: WWPN=0x%Lx ---> D_ID=0x%6.6x\n", + zfcp_get_busid_by_port(port), + port->wwpn, (unsigned int) port->d_id); + goto out; + + failed: + ZFCP_LOG_NORMAL("warning: WWPN 0x%Lx not found by nameserver lookup " + "using the adapter %s\n", + port->wwpn, zfcp_get_busid_by_port(port)); + ZFCP_LOG_DEBUG("CT IUs do not match:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) fc_ct_iu_req, sizeof (struct fc_ct_iu)); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) fc_ct_iu_resp, sizeof (struct fc_ct_iu)); + + out: + zfcp_release_nameserver_buffers(fsf_req); +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_ccw.c Wed Oct 8 12:24:57 2003 @@ -0,0 +1,221 @@ +/* + * linux/drivers/s390/scsi/zfcp_ccw.c + * + * FCP adapter driver for IBM eServer zSeries + * + * CCW driver related routines + * + * Copyright (C) 2003 IBM Entwicklung GmbH, IBM Corporation + * Authors: + * Martin Peschke + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_CCW_C_REVISION "$Revision: 1.33 $" + +#include +#include +#include +#include "zfcp_ext.h" +#include "zfcp_def.h" + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_CONFIG + +static int zfcp_ccw_probe(struct ccw_device *); +static int zfcp_ccw_remove(struct ccw_device *); +static int zfcp_ccw_set_online(struct ccw_device *); +static int zfcp_ccw_set_offline(struct ccw_device *); + +static struct ccw_device_id zfcp_ccw_device_id[] = { + {CCW_DEVICE_DEVTYPE(ZFCP_CONTROL_UNIT_TYPE, + ZFCP_CONTROL_UNIT_MODEL, + ZFCP_DEVICE_TYPE, + ZFCP_DEVICE_MODEL)}, + {}, +}; + +static struct ccw_driver zfcp_ccw_driver = { + .name = ZFCP_NAME, + .ids = zfcp_ccw_device_id, + .probe = zfcp_ccw_probe, + .remove = zfcp_ccw_remove, + .set_online = zfcp_ccw_set_online, + .set_offline = zfcp_ccw_set_offline, +}; + +MODULE_DEVICE_TABLE(ccw, zfcp_ccw_device_id); + +/** + * zfcp_ccw_probe - probe function of zfcp driver + * @ccw_device: pointer to belonging ccw device + * + * This function gets called by the common i/o layer and sets up the initial + * data structures for each fcp adapter, which was detected by the system. + * Also the sysfs files for this adapter will be created by this function. + * In addition the nameserver port will be added to the ports of the adapter + * and its sysfs representation will be created too. + */ +static int +zfcp_ccw_probe(struct ccw_device *ccw_device) +{ + struct zfcp_adapter *adapter; + int retval = 0; + + down(&zfcp_data.config_sema); + adapter = zfcp_adapter_enqueue(ccw_device); + if (!adapter) + retval = -EINVAL; + up(&zfcp_data.config_sema); + return retval; +} + +/** + * zfcp_ccw_remove - remove function of zfcp driver + * @ccw_device: pointer to belonging ccw device + * + * This function gets called by the common i/o layer and removes an adapter + * from the system. Task of this function is to get rid of all units and + * ports that belong to this adapter. And addition all resources of this + * adapter will be freed too. + */ +static int +zfcp_ccw_remove(struct ccw_device *ccw_device) +{ + struct zfcp_adapter *adapter; + struct zfcp_port *port, *p; + struct zfcp_unit *unit, *u; + + down(&zfcp_data.config_sema); + adapter = dev_get_drvdata(&ccw_device->dev); + + write_lock_irq(&zfcp_data.config_lock); + list_for_each_entry_safe(port, p, &adapter->port_list_head, list) { + list_for_each_entry_safe(unit, u, &port->unit_list_head, list) { + list_move(&unit->list, &port->unit_remove_lh); + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, + &unit->status); + } + list_move(&port->list, &adapter->port_remove_lh); + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); + } + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); + write_unlock_irq(&zfcp_data.config_lock); + + list_for_each_entry_safe(port, p, &adapter->port_remove_lh, list) { + list_for_each_entry_safe(unit, u, &port->unit_remove_lh, list) { + zfcp_unit_wait(unit); + device_unregister(&unit->sysfs_device); + } + zfcp_port_wait(port); + device_unregister(&port->sysfs_device); + } + zfcp_adapter_wait(adapter); + zfcp_adapter_dequeue(adapter); + + up(&zfcp_data.config_sema); + return 0; +} + +/** + * zfcp_ccw_set_online - set_online function of zfcp driver + * @ccw_device: pointer to belonging ccw device + * + * This function gets called by the common i/o layer and sets an adapter + * into state online. Setting an fcp device online means that it will be + * registered with the SCSI stack, that the QDIO queues will be set up + * and that the adapter will be opened (asynchronously). + */ +static int +zfcp_ccw_set_online(struct ccw_device *ccw_device) +{ + struct zfcp_adapter *adapter; + int retval; + + down(&zfcp_data.config_sema); + adapter = dev_get_drvdata(&ccw_device->dev); + + retval = zfcp_adapter_scsi_register(adapter); + if (retval) + goto out; + zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING, + ZFCP_SET); + zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); + out: + up(&zfcp_data.config_sema); + return retval; +} + +/** + * zfcp_ccw_set_offline - set_offline function of zfcp driver + * @ccw_device: pointer to belonging ccw device + * + * This function gets called by the common i/o layer and sets an adapter + * into state offline. Setting an fcp device offline means that it will be + * unregistered from the SCSI stack and that the adapter will be shut down + * asynchronously. + */ +static int +zfcp_ccw_set_offline(struct ccw_device *ccw_device) +{ + struct zfcp_adapter *adapter; + + down(&zfcp_data.config_sema); + adapter = dev_get_drvdata(&ccw_device->dev); + zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_erp_wait(adapter); + zfcp_adapter_scsi_unregister(adapter); + up(&zfcp_data.config_sema); + return 0; +} + +/** + * zfcp_ccw_register - ccw register function + * + * Registers the driver at the common i/o layer. This function will be called + * at module load time/system start. + */ +int __init +zfcp_ccw_register(void) +{ + int retval; + + retval = ccw_driver_register(&zfcp_ccw_driver); + if (retval) + goto out; + retval = zfcp_sysfs_driver_create_files(&zfcp_ccw_driver.driver); + if (retval) + ccw_driver_unregister(&zfcp_ccw_driver); + out: + return retval; +} + +/** + * zfcp_ccw_unregister - ccw unregister function + * + * Unregisters the driver from common i/o layer. Function will be called at + * module unload/system shutdown. + */ +void __exit +zfcp_ccw_unregister(void) +{ + zfcp_sysfs_driver_remove_files(&zfcp_ccw_driver.driver); + ccw_driver_unregister(&zfcp_ccw_driver); +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_def.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,961 @@ +/* + * + * linux/drivers/s390/scsi/zfcp_def.h + * + * FCP adapter driver for IBM eServer zSeries + * + * Copyright 2002 IBM Corporation + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#ifndef ZFCP_DEF_H +#define ZFCP_DEF_H + +#ifdef __KERNEL__ + +/* this drivers version (do not edit !!! generated and updated by cvs) */ +#define ZFCP_DEF_REVISION "$Revision: 1.41 $" + +/*************************** INCLUDES *****************************************/ + +#include +#include "../../scsi/scsi.h" +#include "../../scsi/hosts.h" +#include "../../fc4/fc.h" +#include "zfcp_fsf.h" /* FSF SW Interface */ +#include +#include +#include +#include + +/************************ DEBUG FLAGS *****************************************/ + +#define ZFCP_PRINT_FLAGS +#define ZFCP_DEBUG_REQUESTS /* fsf_req tracing */ +#define ZFCP_DEBUG_COMMANDS /* host_byte tracing */ +#define ZFCP_DEBUG_ABORTS /* scsi_cmnd abort tracing */ +#define ZFCP_DEBUG_INCOMING_ELS /* incoming ELS tracing */ +#define ZFCP_STAT_REQSIZES +#define ZFCP_STAT_QUEUES + +/********************* SCSI SPECIFIC DEFINES *********************************/ + +/* 32 bit for SCSI ID and LUN as long as the SCSI stack uses this type */ +typedef u32 scsi_id_t; +typedef u32 scsi_lun_t; + +#define ZFCP_FAKE_SCSI_COMPLETION_TIME (HZ / 3) +#define ZFCP_ERP_SCSI_LOW_MEM_TIMEOUT (100*HZ) +#define ZFCP_SCSI_ER_TIMEOUT (100*HZ) +#define ZFCP_SCSI_HOST_FLUSH_TIMEOUT (1*HZ) + +/********************* CIO/QDIO SPECIFIC DEFINES *****************************/ + +/* Adapter Identification Parameters */ +#define ZFCP_CONTROL_UNIT_TYPE 0x1731 +#define ZFCP_CONTROL_UNIT_MODEL 0x03 +#define ZFCP_DEVICE_TYPE 0x1732 +#define ZFCP_DEVICE_MODEL 0x03 + +/* allow as many chained SBALs as are supported by hardware */ +#define ZFCP_MAX_SBALS_PER_REQ FSF_MAX_SBALS_PER_REQ + +/* DMQ bug workaround: don't use last SBALE */ +#define ZFCP_MAX_SBALES_PER_SBAL (QDIO_MAX_ELEMENTS_PER_BUFFER - 1) + +/* index of last SBALE (with respect to DMQ bug workaround) */ +#define ZFCP_LAST_SBALE_PER_SBAL (ZFCP_MAX_SBALES_PER_SBAL - 1) + +/* max. number of (data buffer) SBALEs in largest SBAL chain */ +#define ZFCP_MAX_SBALES_PER_REQ \ + (ZFCP_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2) + /* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */ + +/* FIXME(tune): free space should be one max. SBAL chain plus what? */ +#define ZFCP_QDIO_PCI_INTERVAL (QDIO_MAX_BUFFERS_PER_Q \ + - (ZFCP_MAX_SBALS_PER_REQ + 4)) + +#define ZFCP_SBAL_TIMEOUT (5*HZ) + +#define ZFCP_TYPE2_RECOVERY_TIME (8*HZ) + +/* queue polling (values in microseconds) */ +#define ZFCP_MAX_INPUT_THRESHOLD 5000 /* FIXME: tune */ +#define ZFCP_MAX_OUTPUT_THRESHOLD 1000 /* FIXME: tune */ +#define ZFCP_MIN_INPUT_THRESHOLD 1 /* ignored by QDIO layer */ +#define ZFCP_MIN_OUTPUT_THRESHOLD 1 /* ignored by QDIO layer */ + +#define QDIO_SCSI_QFMT 1 /* 1 for FSF */ + +/********************* FSF SPECIFIC DEFINES *********************************/ + +#define ZFCP_ULP_INFO_VERSION 26 +#define ZFCP_QTCB_VERSION FSF_QTCB_CURRENT_VERSION +/* ATTENTION: value must not be used by hardware */ +#define FSF_QTCB_UNSOLICITED_STATUS 0x6305 +#define ZFCP_STATUS_READ_FAILED_THRESHOLD 3 +#define ZFCP_STATUS_READS_RECOM FSF_STATUS_READS_RECOM +#define ZFCP_EXCHANGE_CONFIG_DATA_RETRIES 6 +#define ZFCP_EXCHANGE_CONFIG_DATA_SLEEP 50 + +#define ZFCP_QTCB_SIZE (sizeof(struct fsf_qtcb) + FSF_QTCB_LOG_SIZE) +#define ZFCP_QTCB_AND_REQ_SIZE (sizeof(struct zfcp_fsf_req) + ZFCP_QTCB_SIZE) + +/*************** FIBRE CHANNEL PROTOCOL SPECIFIC DEFINES ********************/ + +typedef unsigned long long wwn_t; +typedef unsigned int fc_id_t; +typedef unsigned long long fcp_lun_t; +/* data length field may be at variable position in FCP-2 FCP_CMND IU */ +typedef unsigned int fcp_dl_t; + +#define ZFCP_FC_SERVICE_CLASS_DEFAULT FSF_CLASS_3 + +/* timeout for name-server lookup (in seconds) */ +#define ZFCP_NAMESERVER_TIMEOUT 10 + +/* largest SCSI command we can process */ +/* FCP-2 (FCP_CMND IU) allows up to (255-3+16) */ +#define ZFCP_MAX_SCSI_CMND_LENGTH 255 +/* maximum number of commands in LUN queue (tagged queueing) */ +#define ZFCP_CMND_PER_LUN 32 + +/* task attribute values in FCP-2 FCP_CMND IU */ +#define SIMPLE_Q 0 +#define HEAD_OF_Q 1 +#define ORDERED_Q 2 +#define ACA_Q 4 +#define UNTAGGED 5 + +/* task management flags in FCP-2 FCP_CMND IU */ +#define CLEAR_ACA 0x40 +#define TARGET_RESET 0x20 +#define LOGICAL_UNIT_RESET 0x10 +#define CLEAR_TASK_SET 0x04 +#define ABORT_TASK_SET 0x02 + +#define FCP_CDB_LENGTH 16 + +#define ZFCP_DID_MASK 0x00FFFFFF + +/* FCP(-2) FCP_CMND IU */ +struct fcp_cmnd_iu { + fcp_lun_t fcp_lun; /* FCP logical unit number */ + u8 crn; /* command reference number */ + u8 reserved0:5; /* reserved */ + u8 task_attribute:3; /* task attribute */ + u8 task_management_flags; /* task management flags */ + u8 add_fcp_cdb_length:6; /* additional FCP_CDB length */ + u8 rddata:1; /* read data */ + u8 wddata:1; /* write data */ + u8 fcp_cdb[FCP_CDB_LENGTH]; +} __attribute__((packed)); + +/* FCP(-2) FCP_RSP IU */ +struct fcp_rsp_iu { + u8 reserved0[10]; + union { + struct { + u8 reserved1:3; + u8 fcp_conf_req:1; + u8 fcp_resid_under:1; + u8 fcp_resid_over:1; + u8 fcp_sns_len_valid:1; + u8 fcp_rsp_len_valid:1; + } bits; + u8 value; + } validity; + u8 scsi_status; + u32 fcp_resid; + u32 fcp_sns_len; + u32 fcp_rsp_len; +} __attribute__((packed)); + + +#define RSP_CODE_GOOD 0 +#define RSP_CODE_LENGTH_MISMATCH 1 +#define RSP_CODE_FIELD_INVALID 2 +#define RSP_CODE_RO_MISMATCH 3 +#define RSP_CODE_TASKMAN_UNSUPP 4 +#define RSP_CODE_TASKMAN_FAILED 5 + +/* see fc-fs */ +#define LS_FAN 0x60000000 +#define LS_RSCN 0x61040000 + +struct fcp_rscn_head { + u8 command; + u8 page_length; /* always 0x04 */ + u16 payload_len; +} __attribute__((packed)); + +struct fcp_rscn_element { + u8 reserved:2; + u8 event_qual:4; + u8 addr_format:2; + u32 nport_did:24; +} __attribute__((packed)); + +#define ZFCP_PORT_ADDRESS 0x0 +#define ZFCP_AREA_ADDRESS 0x1 +#define ZFCP_DOMAIN_ADDRESS 0x2 +#define ZFCP_FABRIC_ADDRESS 0x3 + +#define ZFCP_PORTS_RANGE_PORT 0xFFFFFF +#define ZFCP_PORTS_RANGE_AREA 0xFFFF00 +#define ZFCP_PORTS_RANGE_DOMAIN 0xFF0000 +#define ZFCP_PORTS_RANGE_FABRIC 0x000000 + +#define ZFCP_NO_PORTS_PER_AREA 0x100 +#define ZFCP_NO_PORTS_PER_DOMAIN 0x10000 +#define ZFCP_NO_PORTS_PER_FABRIC 0x1000000 + +struct fcp_fan { + u32 command; + u32 fport_did; + wwn_t fport_wwpn; + wwn_t fport_wwname; +} __attribute__((packed)); + +/* see fc-ph */ +struct fcp_logo { + u32 command; + u32 nport_did; + wwn_t nport_wwpn; +} __attribute__((packed)); + +struct fc_ct_iu { + u8 revision; /* 0x01 */ + u8 in_id[3]; /* 0x00 */ + u8 gs_type; /* 0xFC Directory Service */ + u8 gs_subtype; /* 0x02 Name Server */ + u8 options; /* 0x10 synchronous/single exchange */ + u8 reserved0; + u16 cmd_rsp_code; /* 0x0121 GID_PN */ + u16 max_res_size; /* <= (4096 - 16) / 4 */ + u8 reserved1; + u8 reason_code; + u8 reason_code_expl; + u8 vendor_unique; + union { + wwn_t wwpn; + fc_id_t d_id; + } data; +} __attribute__ ((packed)); + +#define ZFCP_CT_REVISION 0x01 +#define ZFCP_CT_DIRECTORY_SERVICE 0xFC +#define ZFCP_CT_NAME_SERVER 0x02 +#define ZFCP_CT_SYNCHRONOUS 0x00 +#define ZFCP_CT_GID_PN 0x0121 +#define ZFCP_CT_MAX_SIZE 0x1020 +#define ZFCP_CT_ACCEPT 0x8002 + +/***************** S390 DEBUG FEATURE SPECIFIC DEFINES ***********************/ + +/* debug feature entries per adapter */ +#define ZFCP_ERP_DBF_INDEX 1 +#define ZFCP_ERP_DBF_AREAS 2 +#define ZFCP_ERP_DBF_LENGTH 16 +#define ZFCP_ERP_DBF_LEVEL 3 +#define ZFCP_ERP_DBF_NAME "zfcperp" + +#define ZFCP_REQ_DBF_INDEX 1 +#define ZFCP_REQ_DBF_AREAS 1 +#define ZFCP_REQ_DBF_LENGTH 8 +#define ZFCP_REQ_DBF_LEVEL 1 +#define ZFCP_REQ_DBF_NAME "zfcpreq" + +#define ZFCP_CMD_DBF_INDEX 2 +#define ZFCP_CMD_DBF_AREAS 1 +#define ZFCP_CMD_DBF_LENGTH 8 +#define ZFCP_CMD_DBF_LEVEL 3 +#define ZFCP_CMD_DBF_NAME "zfcpcmd" + + +#define ZFCP_ABORT_DBF_INDEX 2 +#define ZFCP_ABORT_DBF_AREAS 1 +#define ZFCP_ABORT_DBF_LENGTH 8 +#define ZFCP_ABORT_DBF_LEVEL 6 +#define ZFCP_ABORT_DBF_NAME "zfcpabt" + +#define ZFCP_IN_ELS_DBF_INDEX 2 +#define ZFCP_IN_ELS_DBF_AREAS 1 +#define ZFCP_IN_ELS_DBF_LENGTH 8 +#define ZFCP_IN_ELS_DBF_LEVEL 6 +#define ZFCP_IN_ELS_DBF_NAME "zfcpels" + +#define ZFCP_ADAPTER_REQ_DBF_INDEX 4 +#define ZFCP_ADAPTER_REQ_DBF_AREAS 1 +#define ZFCP_ADAPTER_REQ_DBF_LENGTH 8 +#define ZFCP_ADAPTER_REQ_DBF_LEVEL 6 + +/******************** LOGGING MACROS AND DEFINES *****************************/ + +/* + * Logging may be applied on certain kinds of driver operations + * independently. Additionally, different log-levels are supported for + * each of these areas. + */ + +#define ZFCP_NAME "zfcp" + +/* independent log areas */ +#define ZFCP_LOG_AREA_OTHER 0 +#define ZFCP_LOG_AREA_SCSI 1 +#define ZFCP_LOG_AREA_FSF 2 +#define ZFCP_LOG_AREA_CONFIG 3 +#define ZFCP_LOG_AREA_CIO 4 +#define ZFCP_LOG_AREA_QDIO 5 +#define ZFCP_LOG_AREA_ERP 6 +#define ZFCP_LOG_AREA_FC 7 + +/* log level values*/ +#define ZFCP_LOG_LEVEL_NORMAL 0 +#define ZFCP_LOG_LEVEL_INFO 1 +#define ZFCP_LOG_LEVEL_DEBUG 2 +#define ZFCP_LOG_LEVEL_TRACE 3 + +/* default log levels for different log areas */ +#define ZFCP_LOG_LEVEL_DEFAULT_OTHER ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_LEVEL_DEFAULT_SCSI ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_LEVEL_DEFAULT_FSF ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_LEVEL_DEFAULT_CONFIG ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_LEVEL_DEFAULT_CIO ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_LEVEL_DEFAULT_QDIO ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_LEVEL_DEFAULT_ERP ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_LEVEL_DEFAULT_FC ZFCP_LOG_LEVEL_INFO + +/* + * this allows removal of logging code by the preprocessor + * (the most detailed log level still to be compiled in is specified, + * higher log levels are removed) + */ +#define ZFCP_LOG_LEVEL_LIMIT ZFCP_LOG_LEVEL_TRACE + +/* positional "loglevel" nibble assignment */ +#define ZFCP_LOG_VALUE(zfcp_lognibble) \ + ((atomic_read(&zfcp_data.loglevel) >> (zfcp_lognibble<<2)) & 0xF) + +#define ZFCP_LOG_VALUE_OTHER ZFCP_LOG_VALUE(ZFCP_LOG_AREA_OTHER) +#define ZFCP_LOG_VALUE_SCSI ZFCP_LOG_VALUE(ZFCP_LOG_AREA_SCSI) +#define ZFCP_LOG_VALUE_FSF ZFCP_LOG_VALUE(ZFCP_LOG_AREA_FSF) +#define ZFCP_LOG_VALUE_CONFIG ZFCP_LOG_VALUE(ZFCP_LOG_AREA_CONFIG) +#define ZFCP_LOG_VALUE_CIO ZFCP_LOG_VALUE(ZFCP_LOG_AREA_CIO) +#define ZFCP_LOG_VALUE_QDIO ZFCP_LOG_VALUE(ZFCP_LOG_AREA_QDIO) +#define ZFCP_LOG_VALUE_ERP ZFCP_LOG_VALUE(ZFCP_LOG_AREA_ERP) +#define ZFCP_LOG_VALUE_FC ZFCP_LOG_VALUE(ZFCP_LOG_AREA_FC) + +/* all log-level defaults are combined to generate initial log-level */ +#define ZFCP_LOG_LEVEL_DEFAULTS \ + ((ZFCP_LOG_LEVEL_DEFAULT_OTHER << (ZFCP_LOG_AREA_OTHER<<2)) | \ + (ZFCP_LOG_LEVEL_DEFAULT_SCSI << (ZFCP_LOG_AREA_SCSI<<2)) | \ + (ZFCP_LOG_LEVEL_DEFAULT_FSF << (ZFCP_LOG_AREA_FSF<<2)) | \ + (ZFCP_LOG_LEVEL_DEFAULT_CONFIG << (ZFCP_LOG_AREA_CONFIG<<2)) | \ + (ZFCP_LOG_LEVEL_DEFAULT_CIO << (ZFCP_LOG_AREA_CIO<<2)) | \ + (ZFCP_LOG_LEVEL_DEFAULT_QDIO << (ZFCP_LOG_AREA_QDIO<<2)) | \ + (ZFCP_LOG_LEVEL_DEFAULT_ERP << (ZFCP_LOG_AREA_ERP<<2)) | \ + (ZFCP_LOG_LEVEL_DEFAULT_FC << (ZFCP_LOG_AREA_FC<<2))) + +/* the prefix placed at the beginning of each driver message */ +#define ZFCP_LOG_PREFIX ZFCP_NAME": " + +/* log area specific prefixes */ +#define ZFCP_LOG_AREA_PREFIX_OTHER "" +#define ZFCP_LOG_AREA_PREFIX_SCSI "SCSI: " +#define ZFCP_LOG_AREA_PREFIX_FSF "FSF: " +#define ZFCP_LOG_AREA_PREFIX_CONFIG "config: " +#define ZFCP_LOG_AREA_PREFIX_CIO "common I/O: " +#define ZFCP_LOG_AREA_PREFIX_QDIO "QDIO: " +#define ZFCP_LOG_AREA_PREFIX_ERP "ERP: " +#define ZFCP_LOG_AREA_PREFIX_FC "FC: " + +/* check whether we have the right level for logging */ +#define ZFCP_LOG_CHECK(ll) (ZFCP_LOG_VALUE(ZFCP_LOG_AREA)) >= ll + +/* As we have two printks it is possible for them to be seperated by another + * message. This holds true even for printks from within this module. + * In any case there should only be a small readability hit, however. + */ +#define _ZFCP_LOG(m...) \ + { \ + printk( "%s%s: ", \ + ZFCP_LOG_PREFIX ZFCP_LOG_AREA_PREFIX, \ + __FUNCTION__); \ + printk(m); \ + } + +#define ZFCP_LOG(ll, m...) \ + if (ZFCP_LOG_CHECK(ll)) \ + _ZFCP_LOG(m) + +#if ZFCP_LOG_LEVEL_LIMIT < ZFCP_LOG_LEVEL_NORMAL +#define ZFCP_LOG_NORMAL(m...) +#else /* ZFCP_LOG_LEVEL_LIMIT >= ZFCP_LOG_LEVEL_NORMAL */ +#define ZFCP_LOG_NORMAL(m...) ZFCP_LOG(ZFCP_LOG_LEVEL_NORMAL, m) +#endif + +#if ZFCP_LOG_LEVEL_LIMIT < ZFCP_LOG_LEVEL_INFO +#define ZFCP_LOG_INFO(m...) +#else /* ZFCP_LOG_LEVEL_LIMIT >= ZFCP_LOG_LEVEL_INFO */ +#define ZFCP_LOG_INFO(m...) ZFCP_LOG(ZFCP_LOG_LEVEL_INFO, m) +#endif + +#if ZFCP_LOG_LEVEL_LIMIT < ZFCP_LOG_LEVEL_DEBUG +#define ZFCP_LOG_DEBUG(m...) +#else /* ZFCP_LOG_LEVEL_LIMIT >= ZFCP_LOG_LEVEL_DEBUG */ +#define ZFCP_LOG_DEBUG(m...) ZFCP_LOG(ZFCP_LOG_LEVEL_DEBUG, m) +#endif + +#if ZFCP_LOG_LEVEL_LIMIT < ZFCP_LOG_LEVEL_TRACE +#define ZFCP_LOG_TRACE(m...) +#else /* ZFCP_LOG_LEVEL_LIMIT >= ZFCP_LOG_LEVEL_TRACE */ +#define ZFCP_LOG_TRACE(m...) ZFCP_LOG(ZFCP_LOG_LEVEL_TRACE, m) +#endif + +#ifdef ZFCP_PRINT_FLAGS +extern u32 flags_dump; +#define ZFCP_LOG_FLAGS(ll, m...) \ + if (ll<=flags_dump) \ + _ZFCP_LOG(m) +#else +#define ZFCP_LOG_FLAGS(ll, m...) +#endif + +/*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/ + +/* + * Note, the leftmost status byte is common among adapter, port + * and unit + */ +#define ZFCP_COMMON_FLAGS 0xff000000 +#define ZFCP_SPECIFIC_FLAGS 0x00ffffff + +/* common status bits */ +#define ZFCP_STATUS_COMMON_REMOVE 0x80000000 +#define ZFCP_STATUS_COMMON_RUNNING 0x40000000 +#define ZFCP_STATUS_COMMON_ERP_FAILED 0x20000000 +#define ZFCP_STATUS_COMMON_UNBLOCKED 0x10000000 +#define ZFCP_STATUS_COMMON_OPENING 0x08000000 +#define ZFCP_STATUS_COMMON_OPEN 0x04000000 +#define ZFCP_STATUS_COMMON_CLOSING 0x02000000 +#define ZFCP_STATUS_COMMON_ERP_INUSE 0x01000000 + +/* adapter status */ +#define ZFCP_STATUS_ADAPTER_QDIOUP 0x00000002 +#define ZFCP_STATUS_ADAPTER_REGISTERED 0x00000004 +#define ZFCP_STATUS_ADAPTER_XCONFIG_OK 0x00000008 +#define ZFCP_STATUS_ADAPTER_HOST_CON_INIT 0x00000010 +#define ZFCP_STATUS_ADAPTER_ERP_THREAD_UP 0x00000020 +#define ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL 0x00000080 +#define ZFCP_STATUS_ADAPTER_ERP_PENDING 0x00000100 +#define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200 +#define ZFCP_STATUS_ADAPTER_QUEUECOMMAND_BLOCK 0x00000400 + +#define ZFCP_STATUS_ADAPTER_SCSI_UP \ + (ZFCP_STATUS_COMMON_UNBLOCKED | \ + ZFCP_STATUS_ADAPTER_REGISTERED) + + +#define ZFCP_DID_NAMESERVER 0xFFFFFC + +/* remote port status */ +#define ZFCP_STATUS_PORT_PHYS_OPEN 0x00000001 +#define ZFCP_STATUS_PORT_DID_DID 0x00000002 +#define ZFCP_STATUS_PORT_PHYS_CLOSING 0x00000004 +#define ZFCP_STATUS_PORT_NO_WWPN 0x00000008 +#define ZFCP_STATUS_PORT_NO_SCSI_ID 0x00000010 +#define ZFCP_STATUS_PORT_INVALID_WWPN 0x00000020 + +#define ZFCP_STATUS_PORT_NAMESERVER \ + (ZFCP_STATUS_PORT_NO_WWPN | \ + ZFCP_STATUS_PORT_NO_SCSI_ID) + +/* logical unit status */ +#define ZFCP_STATUS_UNIT_NOTSUPPUNITRESET 0x00000001 + + +/* FSF request status (this does not have a common part) */ +#define ZFCP_STATUS_FSFREQ_NOT_INIT 0x00000000 +#define ZFCP_STATUS_FSFREQ_POOL 0x00000001 +#define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT 0x00000002 +#define ZFCP_STATUS_FSFREQ_COMPLETED 0x00000004 +#define ZFCP_STATUS_FSFREQ_ERROR 0x00000008 +#define ZFCP_STATUS_FSFREQ_CLEANUP 0x00000010 +#define ZFCP_STATUS_FSFREQ_ABORTING 0x00000020 +#define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED 0x00000040 +#define ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED 0x00000080 +#define ZFCP_STATUS_FSFREQ_ABORTED 0x00000100 +#define ZFCP_STATUS_FSFREQ_TMFUNCFAILED 0x00000200 +#define ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP 0x00000400 +#define ZFCP_STATUS_FSFREQ_RETRY 0x00000800 +#define ZFCP_STATUS_FSFREQ_DISMISSED 0x00001000 +#define ZFCP_STATUS_FSFREQ_POOLBUF 0x00002000 + +/*********************** ERROR RECOVERY PROCEDURE DEFINES ********************/ + +#define ZFCP_MAX_ERPS 3 + +#define ZFCP_ERP_FSFREQ_TIMEOUT (100 * HZ) +#define ZFCP_ERP_MEMWAIT_TIMEOUT HZ + +#define ZFCP_STATUS_ERP_TIMEDOUT 0x10000000 +#define ZFCP_STATUS_ERP_CLOSE_ONLY 0x01000000 +#define ZFCP_STATUS_ERP_DISMISSING 0x00100000 +#define ZFCP_STATUS_ERP_DISMISSED 0x00200000 + +#define ZFCP_ERP_STEP_UNINITIALIZED 0x00000000 +#define ZFCP_ERP_STEP_FSF_XCONFIG 0x00000001 +#define ZFCP_ERP_STEP_PHYS_PORT_CLOSING 0x00000010 +#define ZFCP_ERP_STEP_PORT_CLOSING 0x00000100 +#define ZFCP_ERP_STEP_NAMESERVER_OPEN 0x00000200 +#define ZFCP_ERP_STEP_NAMESERVER_LOOKUP 0x00000400 +#define ZFCP_ERP_STEP_PORT_OPENING 0x00000800 +#define ZFCP_ERP_STEP_UNIT_CLOSING 0x00001000 +#define ZFCP_ERP_STEP_UNIT_OPENING 0x00002000 + +/* Ordered by escalation level (necessary for proper erp-code operation) */ +#define ZFCP_ERP_ACTION_REOPEN_ADAPTER 0x4 +#define ZFCP_ERP_ACTION_REOPEN_PORT_FORCED 0x3 +#define ZFCP_ERP_ACTION_REOPEN_PORT 0x2 +#define ZFCP_ERP_ACTION_REOPEN_UNIT 0x1 + +#define ZFCP_ERP_ACTION_RUNNING 0x1 +#define ZFCP_ERP_ACTION_READY 0x2 + +#define ZFCP_ERP_SUCCEEDED 0x0 +#define ZFCP_ERP_FAILED 0x1 +#define ZFCP_ERP_CONTINUES 0x2 +#define ZFCP_ERP_EXIT 0x3 +#define ZFCP_ERP_DISMISSED 0x4 +#define ZFCP_ERP_NOMEM 0x5 + +/************************* STRUCTURE DEFINITIONS *****************************/ + + +struct zfcp_fsf_req; +typedef void zfcp_send_generic_handler_t(struct zfcp_fsf_req*); + +struct zfcp_adapter_mempool { + mempool_t *status_read_fsf; + mempool_t *status_read_buf; + mempool_t *nameserver; + mempool_t *erp_fsf; + mempool_t *fcp_command_fsf; + struct timer_list fcp_command_fsf_timer; +}; + +struct zfcp_exchange_config_data{ +}; + +struct zfcp_open_port { + struct zfcp_port *port; +}; + +struct zfcp_close_port { + struct zfcp_port *port; +}; + +struct zfcp_open_unit { + struct zfcp_unit *unit; +}; + +struct zfcp_close_unit { + struct zfcp_unit *unit; +}; + +struct zfcp_close_physical_port { + struct zfcp_port *port; +}; + +struct zfcp_send_fcp_command_task { + struct zfcp_fsf_req *fsf_req; + struct zfcp_unit *unit; + Scsi_Cmnd *scsi_cmnd; + unsigned long start_jiffies; +}; + +struct zfcp_send_fcp_command_task_management { + struct zfcp_unit *unit; +}; + +struct zfcp_abort_fcp_command { + struct zfcp_fsf_req *fsf_req; + struct zfcp_unit *unit; +}; + +struct zfcp_send_generic { + struct zfcp_port *port; + char *outbuf; + char *inbuf; + int outbuf_length; + int inbuf_length; + zfcp_send_generic_handler_t *handler; + unsigned long handler_data; +}; + +struct zfcp_status_read { + struct fsf_status_read_buffer *buffer; +}; + +/* request specific data */ +union zfcp_req_data { + struct zfcp_exchange_config_data exchange_config_data; + struct zfcp_open_port open_port; + struct zfcp_close_port close_port; + struct zfcp_open_unit open_unit; + struct zfcp_close_unit close_unit; + struct zfcp_close_physical_port close_physical_port; + struct zfcp_send_fcp_command_task send_fcp_command_task; + struct zfcp_send_fcp_command_task_management + send_fcp_command_task_management; + struct zfcp_abort_fcp_command abort_fcp_command; + struct zfcp_send_generic send_generic; + struct zfcp_status_read status_read; +}; + +struct zfcp_qdio_queue { + struct qdio_buffer *buffer[QDIO_MAX_BUFFERS_PER_Q]; /* SBALs */ + u8 free_index; /* index of next free bfr + in queue (free_count>0) */ + atomic_t free_count; /* number of free buffers + in queue */ + rwlock_t queue_lock; /* lock for operations on queue */ + int distance_from_int; /* SBALs used since PCI indication + was last set */ +}; + +struct zfcp_erp_action { + struct list_head list; + int action; /* requested action code */ + struct zfcp_adapter *adapter; /* device which should be recovered */ + struct zfcp_port *port; + struct zfcp_unit *unit; + volatile u32 status; /* recovery status */ + u32 step; /* active step of this erp action */ + struct zfcp_fsf_req *fsf_req; /* fsf request currently pending + for this action */ + struct timer_list timer; +}; + + +struct zfcp_adapter { + u32 common_magic; /* driver common magic */ + u32 specific_magic; /* struct specific magic */ + struct list_head list; /* list of adapters */ + atomic_t refcount; /* reference count */ + wait_queue_head_t remove_wq; /* can be used to wait for + refcount drop to zero */ + wwn_t wwnn; /* WWNN */ + wwn_t wwpn; /* WWPN */ + fc_id_t s_id; /* N_Port ID */ + struct ccw_device *ccw_device; /* S/390 ccw device */ + u8 fc_service_class; + u32 fc_topology; /* FC topology */ + u32 fc_link_speed; /* FC interface speed */ + u32 hydra_version; /* Hydra version */ + u32 fsf_lic_version; + struct Scsi_Host *scsi_host; /* Pointer to mid-layer */ + Scsi_Cmnd *first_fake_cmnd; /* Packets in flight list */ + rwlock_t fake_list_lock; /* Lock for the above */ + struct timer_list fake_scsi_timer; /* Starts processing of + faked commands */ + unsigned char name[9]; + struct list_head port_list_head; /* remote port list */ + struct list_head port_remove_lh; /* head of ports to be + removed */ + u32 ports; /* number of remote ports */ + scsi_id_t max_scsi_id; /* largest SCSI ID */ + scsi_lun_t max_scsi_lun; /* largest SCSI LUN */ + struct timer_list scsi_er_timer; /* SCSI err recovery watch */ + struct list_head fsf_req_list_head; /* head of FSF req list */ + rwlock_t fsf_req_list_lock; /* lock for ops on list of + FSF requests */ + atomic_t fsf_reqs_active; /* # active FSF reqs */ + atomic_t scsi_reqs_active; /* # active SCSI reqs */ + wait_queue_head_t scsi_reqs_active_wq; /* can be used to wait for + fsf_reqs_active chngs */ + struct zfcp_qdio_queue request_queue; /* request queue */ + u32 fsf_req_seq_no; /* FSF cmnd seq number */ + wait_queue_head_t request_wq; /* can be used to wait for + more avaliable SBALs */ + struct zfcp_qdio_queue response_queue; /* response queue */ + rwlock_t abort_lock; /* Protects against SCSI + stack abort/command + completion races */ + u16 status_read_failed; /* # failed status reads */ + atomic_t status; /* status of this adapter */ + struct list_head erp_ready_head; /* error recovery for this + adapter/devices */ + struct list_head erp_running_head; + rwlock_t erp_lock; + struct semaphore erp_ready_sem; + wait_queue_head_t erp_thread_wqh; + wait_queue_head_t erp_done_wqh; + struct zfcp_erp_action erp_action; /* pending error recovery */ + atomic_t erp_counter; + struct zfcp_port *nameserver_port; /* adapter's nameserver */ + debug_info_t *erp_dbf; /* S/390 debug features */ + debug_info_t *abort_dbf; + debug_info_t *req_dbf; + debug_info_t *in_els_dbf; + debug_info_t *cmd_dbf; + rwlock_t cmd_dbf_lock; + struct zfcp_adapter_mempool pool; /* Adapter memory pools */ + struct qdio_initialize qdio_init_data; /* for qdio_establish */ +}; + +struct zfcp_port { + u32 common_magic; /* driver wide common magic */ + u32 specific_magic; /* structure specific magic */ + struct list_head list; /* list of remote ports */ + atomic_t refcount; /* reference count */ + wait_queue_head_t remove_wq; /* can be used to wait for + refcount drop to zero */ + struct zfcp_adapter *adapter; /* adapter used to access port */ + struct list_head unit_list_head; /* head of logical unit list */ + struct list_head unit_remove_lh; /* head of luns to be removed + list */ + u32 units; /* # of logical units in list */ + atomic_t status; /* status of this remote port */ + scsi_id_t scsi_id; /* own SCSI ID */ + wwn_t wwnn; /* WWNN if known */ + wwn_t wwpn; /* WWPN */ + fc_id_t d_id; /* D_ID */ + scsi_lun_t max_scsi_lun; /* largest SCSI LUN */ + u32 handle; /* handle assigned by FSF */ + struct zfcp_erp_action erp_action; /* pending error recovery */ + atomic_t erp_counter; + struct device sysfs_device; /* sysfs device */ +}; + +struct zfcp_unit { + u32 common_magic; /* driver wide common magic */ + u32 specific_magic; /* structure specific magic */ + struct list_head list; /* list of logical units */ + atomic_t refcount; /* reference count */ + wait_queue_head_t remove_wq; /* can be used to wait for + refcount drop to zero */ + struct zfcp_port *port; /* remote port of unit */ + atomic_t status; /* status of this logical unit */ + scsi_lun_t scsi_lun; /* own SCSI LUN */ + fcp_lun_t fcp_lun; /* own FCP_LUN */ + u32 handle; /* handle assigned by FSF */ + Scsi_Device *device; /* scsi device struct pointer */ + struct zfcp_erp_action erp_action; /* pending error recovery */ + atomic_t erp_counter; + struct device sysfs_device; /* sysfs device */ +}; + +/* FSF request */ +struct zfcp_fsf_req { + u32 common_magic; /* driver wide common magic */ + u32 specific_magic; /* structure specific magic */ + struct list_head list; /* list of FSF requests */ + struct zfcp_adapter *adapter; /* adapter request belongs to */ + u8 sbal_count; /* # of SBALs in FSF request */ + u8 sbal_index; /* position of 1st SBAL */ + wait_queue_head_t completion_wq; /* can be used by a routine + to wait for completion */ + volatile u32 status; /* status of this request */ + u32 fsf_command; /* FSF Command copy */ + struct fsf_qtcb *qtcb; /* address of associated QTCB */ + u32 seq_no; /* Sequence number of request */ + union zfcp_req_data data; /* Info fields of request */ + struct zfcp_erp_action *erp_action; /* used if this request is + issued on behalf of erp */ +}; + +typedef void zfcp_fsf_req_handler_t(struct zfcp_fsf_req*); + +/* driver data */ +struct zfcp_data { + Scsi_Host_Template scsi_host_template; + atomic_t status; /* Module status flags */ + struct list_head adapter_list_head; /* head of adapter list */ + struct list_head adapter_remove_lh; /* head of adapters to be + removed */ + rwlock_t status_read_lock; /* for status read thread */ + struct list_head status_read_receive_head; + struct list_head status_read_send_head; + struct semaphore status_read_sema; + wait_queue_head_t status_read_thread_wqh; + u16 adapters; /* # of adapters in list */ + rwlock_t config_lock; /* serialises changes + to adapter/port/unit + lists */ + struct semaphore config_sema; /* serialises configuration + changes */ + struct notifier_block reboot_notifier; /* used to register cleanup + functions */ + atomic_t loglevel; /* current loglevel */ +#ifdef ZFCP_STAT_REQSIZES /* Statistical accounting + of processed data */ + struct list_head read_req_head; + struct list_head write_req_head; + struct list_head read_sg_head; + struct list_head write_sg_head; + struct list_head read_sguse_head; + struct list_head write_sguse_head; + unsigned long stat_errors; + rwlock_t stat_lock; +#endif +#ifdef ZFCP_STAT_QUEUES + atomic_t outbound_queue_full; + atomic_t outbound_total; +#endif +}; + +#ifdef ZFCP_STAT_REQSIZES +struct zfcp_statistics { + struct list_head list; + u32 num; + u32 occurrence; +}; +#endif + +/********************** ZFCP SPECIFIC DEFINES ********************************/ + +#define ZFCP_FSFREQ_CLEANUP_TIMEOUT HZ/10 + +#define ZFCP_KNOWN 0x00000001 +#define ZFCP_REQ_AUTO_CLEANUP 0x00000002 +#define ZFCP_WAIT_FOR_SBAL 0x00000004 + +#define ZFCP_SET 0x00000100 +#define ZFCP_CLEAR 0x00000200 + +#define ZFCP_INTERRUPTIBLE 1 +#define ZFCP_UNINTERRUPTIBLE 0 + +/* some magics which may be used to authenticate data structures */ +#define ZFCP_MAGIC 0xFCFCFCFC +#define ZFCP_MAGIC_ADAPTER 0xAAAAAAAA +#define ZFCP_MAGIC_PORT 0xBBBBBBBB +#define ZFCP_MAGIC_UNIT 0xCCCCCCCC +#define ZFCP_MAGIC_FSFREQ 0xEEEEEEEE + +#ifndef atomic_test_mask +#define atomic_test_mask(mask, target) \ + (atomic_read(target) & mask) +#endif + +extern void _zfcp_hex_dump(char *, int); +#define ZFCP_HEX_DUMP(level, addr, count) \ + if (ZFCP_LOG_CHECK(level)) { \ + _zfcp_hex_dump(addr, count); \ + } +/* + * Not yet optimal but useful: + * Waits until the condition is met or the timeout occurs. + * The condition may be a function call. This allows to + * execute some additional instructions in addition + * to a simple condition check. + * The timeout is modified on exit and holds the remaining time. + * Thus it is zero if a timeout ocurred, i.e. the condition was + * not met in the specified interval. + */ +#define __ZFCP_WAIT_EVENT_TIMEOUT(timeout, condition) \ +do { \ + set_current_state(TASK_UNINTERRUPTIBLE); \ + while (!(condition) && timeout) \ + timeout = schedule_timeout(timeout); \ + current->state = TASK_RUNNING; \ +} while (0); + +#define ZFCP_WAIT_EVENT_TIMEOUT(waitqueue, timeout, condition) \ +do { \ + wait_queue_t entry; \ + init_waitqueue_entry(&entry, current); \ + add_wait_queue(&waitqueue, &entry); \ + __ZFCP_WAIT_EVENT_TIMEOUT(timeout, condition) \ + remove_wait_queue(&waitqueue, &entry); \ +} while (0); + +#define zfcp_get_busid_by_adapter(adapter) (adapter->ccw_device->dev.bus_id) +#define zfcp_get_busid_by_port(port) (zfcp_get_busid_by_adapter(port->adapter)) +#define zfcp_get_busid_by_unit(unit) (zfcp_get_busid_by_port(unit->port)) + +/* + * functions needed for reference/usage counting + */ + +static inline void +zfcp_unit_get(struct zfcp_unit *unit) +{ + atomic_inc(&unit->refcount); +} + +static inline void +zfcp_unit_put(struct zfcp_unit *unit) +{ + if (atomic_dec_return(&unit->refcount) == 0) + wake_up(&unit->remove_wq); +} + +static inline void +zfcp_unit_wait(struct zfcp_unit *unit) +{ + wait_event(unit->remove_wq, atomic_read(&unit->refcount) == 0); +} + +static inline void +zfcp_port_get(struct zfcp_port *port) +{ + atomic_inc(&port->refcount); +} + +static inline void +zfcp_port_put(struct zfcp_port *port) +{ + if (atomic_dec_return(&port->refcount) == 0) + wake_up(&port->remove_wq); +} + +static inline void +zfcp_port_wait(struct zfcp_port *port) +{ + wait_event(port->remove_wq, atomic_read(&port->refcount) == 0); +} + +static inline void +zfcp_adapter_get(struct zfcp_adapter *adapter) +{ + atomic_inc(&adapter->refcount); +} + +static inline void +zfcp_adapter_put(struct zfcp_adapter *adapter) +{ + if (atomic_dec_return(&adapter->refcount) == 0) + wake_up(&adapter->remove_wq); +} + +static inline void +zfcp_adapter_wait(struct zfcp_adapter *adapter) +{ + wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0); +} + +#endif /* __KERNEL_- */ +#endif /* ZFCP_DEF_H */ diff -Nru a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_erp.c Wed Oct 8 12:24:57 2003 @@ -0,0 +1,3305 @@ +/* + * + * linux/drivers/s390/scsi/zfcp_erp.c + * + * FCP adapter driver for IBM eServer zSeries + * + * Copyright 2002 IBM Corporation + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_ERP +/* this drivers version (do not edit !!! generated and updated by cvs) */ +#define ZFCP_ERP_REVISION "$Revision: 1.33 $" + +#include "zfcp_ext.h" + +static int zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *, int); +static int zfcp_erp_port_forced_reopen_internal(struct zfcp_port *, int); +static int zfcp_erp_port_reopen_internal(struct zfcp_port *, int); +static int zfcp_erp_unit_reopen_internal(struct zfcp_unit *, int); + +static int zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *, int); +static int zfcp_erp_unit_reopen_all_internal(struct zfcp_port *, int); + +static void zfcp_erp_adapter_block(struct zfcp_adapter *, int); +static void zfcp_erp_adapter_unblock(struct zfcp_adapter *); +static void zfcp_erp_port_block(struct zfcp_port *, int); +static void zfcp_erp_port_unblock(struct zfcp_port *); +static void zfcp_erp_unit_block(struct zfcp_unit *, int); +static void zfcp_erp_unit_unblock(struct zfcp_unit *); + +static int zfcp_erp_thread(void *); + +static int zfcp_erp_strategy(struct zfcp_erp_action *); + +static int zfcp_erp_strategy_do_action(struct zfcp_erp_action *); +static int zfcp_erp_strategy_memwait(struct zfcp_erp_action *); +static int zfcp_erp_strategy_check_target(struct zfcp_erp_action *, int); +static int zfcp_erp_strategy_check_unit(struct zfcp_unit *, int); +static int zfcp_erp_strategy_check_port(struct zfcp_port *, int); +static int zfcp_erp_strategy_check_adapter(struct zfcp_adapter *, int); +static int zfcp_erp_strategy_statechange(int, u32, struct zfcp_adapter *, + struct zfcp_port *, + struct zfcp_unit *, int); +static inline int zfcp_erp_strategy_statechange_detected(atomic_t *, u32); +static int zfcp_erp_strategy_followup_actions(int, struct zfcp_adapter *, + struct zfcp_port *, + struct zfcp_unit *, int); +static int zfcp_erp_strategy_check_queues(struct zfcp_adapter *); +static int zfcp_erp_strategy_check_action(struct zfcp_erp_action *, int); + +static int zfcp_erp_adapter_strategy(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *, int); +static int zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_close_fsf(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *); +static int zfcp_erp_adapter_strategy_open_fsf_statusread( + struct zfcp_erp_action *); + +static int zfcp_erp_port_forced_strategy(struct zfcp_erp_action *); +static int zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *); + +static int zfcp_erp_port_strategy(struct zfcp_erp_action *); +static int zfcp_erp_port_strategy_clearstati(struct zfcp_port *); +static int zfcp_erp_port_strategy_close(struct zfcp_erp_action *); +static int zfcp_erp_port_strategy_open(struct zfcp_erp_action *); +static int zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *); +static int zfcp_erp_port_strategy_open_nameserver_wakeup( + struct zfcp_erp_action *); +static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *); +static int zfcp_erp_port_strategy_open_common_lookup(struct zfcp_erp_action *); +static int zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *); + +static int zfcp_erp_unit_strategy(struct zfcp_erp_action *); +static int zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *); +static int zfcp_erp_unit_strategy_close(struct zfcp_erp_action *); +static int zfcp_erp_unit_strategy_open(struct zfcp_erp_action *); + +static int zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *); +static int zfcp_erp_action_dismiss_port(struct zfcp_port *); +static int zfcp_erp_action_dismiss_unit(struct zfcp_unit *); +static int zfcp_erp_action_dismiss(struct zfcp_erp_action *); + +static int zfcp_erp_action_enqueue(int, struct zfcp_adapter *, + struct zfcp_port *, struct zfcp_unit *); +static int zfcp_erp_action_dequeue(struct zfcp_erp_action *); + +static void zfcp_erp_action_ready(struct zfcp_erp_action *); +static int zfcp_erp_action_exists(struct zfcp_erp_action *); + +static inline void zfcp_erp_action_to_ready(struct zfcp_erp_action *); +static inline void zfcp_erp_action_to_running(struct zfcp_erp_action *); + +static void zfcp_erp_memwait_handler(unsigned long); +static void zfcp_erp_timeout_handler(unsigned long); +static inline void zfcp_erp_timeout_init(struct zfcp_erp_action *); + +/* + * function: zfcp_erp_adapter_shutdown_all + * + * purpose: recursively calls zfcp_erp_adapter_shutdown to stop all + * IO on each adapter, return all outstanding packets and + * relinquish all IRQs + * Note: This function waits for completion of all shutdowns + * + * returns: 0 in all cases + */ +int +zfcp_erp_adapter_shutdown_all(void) +{ + int retval = 0; + unsigned long flags; + struct zfcp_adapter *adapter; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + list_for_each_entry(adapter, &zfcp_data.adapter_list_head, list) + zfcp_erp_adapter_shutdown(adapter, 0); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + /* + * FIXME : need to take config_lock but cannot, since we schedule here. + */ + /* start all shutdowns first before any waiting to allow for concurreny */ + list_for_each_entry(adapter, &zfcp_data.adapter_list_head, list) + zfcp_erp_wait(adapter); + + return retval; +} + +/* + * function: zfcp_erp_scsi_low_mem_buffer_timeout_handler + * + * purpose: This function needs to be called whenever the SCSI command + * in the low memory buffer does not return. + * Re-opening the adapter means that the command can be returned + * by zfcp (it is guarranteed that it does not return via the + * adapter anymore). The buffer can then be used again. + * + * returns: sod all + */ +void +zfcp_erp_scsi_low_mem_buffer_timeout_handler(unsigned long data) +{ + struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; + + ZFCP_LOG_NORMAL("warning: Emergency buffer for SCSI I/O timed out. " + "Restarting all operations on the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(adapter->erp_dbf, 1, "scsi_lmem_tout"); + zfcp_erp_adapter_reopen(adapter, 0); + + return; +} + +/* + * function: zfcp_fsf_scsi_er_timeout_handler + * + * purpose: This function needs to be called whenever a SCSI error recovery + * action (abort/reset) does not return. + * Re-opening the adapter means that the command can be returned + * by zfcp (it is guarranteed that it does not return via the + * adapter anymore). The buffer can then be used again. + * + * returns: sod all + */ +void +zfcp_fsf_scsi_er_timeout_handler(unsigned long data) +{ + struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; + + ZFCP_LOG_NORMAL + ("warning: Emergency buffer for SCSI error handling timed out. " + "Restarting all operations on the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(adapter->erp_dbf, 1, "eh_lmem_tout"); + zfcp_erp_adapter_reopen(adapter, 0); + + return; +} + +/* + * function: + * + * purpose: called if an adapter failed, + * initiates adapter recovery which is done + * asynchronously + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +int +zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask) +{ + int retval; + + debug_text_event(adapter->erp_dbf, 5, "a_ro"); + ZFCP_LOG_DEBUG("Reopen on the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + + zfcp_erp_adapter_block(adapter, clear_mask); + + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status)) { + ZFCP_LOG_DEBUG("skipped reopen on the failed adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(adapter->erp_dbf, 5, "a_ro_f"); + /* ensure propagation of failed status to new devices */ + zfcp_erp_adapter_failed(adapter); + retval = -EIO; + goto out; + } + retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, + adapter, NULL, NULL); + + out: + return retval; +} + +/* + * function: + * + * purpose: Wrappper for zfcp_erp_adapter_reopen_internal + * used to ensure the correct locking + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +int +zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear_mask) +{ + int retval; + unsigned long flags; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + write_lock(&adapter->erp_lock); + retval = zfcp_erp_adapter_reopen_internal(adapter, clear_mask); + write_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +int +zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear_mask) +{ + int retval; + + retval = zfcp_erp_adapter_reopen(adapter, + ZFCP_STATUS_COMMON_RUNNING | + ZFCP_STATUS_COMMON_ERP_FAILED | + clear_mask); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +int +zfcp_erp_port_shutdown(struct zfcp_port *port, int clear_mask) +{ + int retval; + + retval = zfcp_erp_port_reopen(port, + ZFCP_STATUS_COMMON_RUNNING | + ZFCP_STATUS_COMMON_ERP_FAILED | + clear_mask); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +int +zfcp_erp_unit_shutdown(struct zfcp_unit *unit, int clear_mask) +{ + int retval; + + retval = zfcp_erp_unit_reopen(unit, + ZFCP_STATUS_COMMON_RUNNING | + ZFCP_STATUS_COMMON_ERP_FAILED | + clear_mask); + + return retval; +} + +/* + * function: + * + * purpose: called if a port failed to be opened normally + * initiates Forced Reopen recovery which is done + * asynchronously + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +static int +zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask) +{ + int retval; + struct zfcp_adapter *adapter = port->adapter; + + debug_text_event(adapter->erp_dbf, 5, "pf_ro"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + + ZFCP_LOG_DEBUG("Forced reopen of the port with WWPN 0x%Lx " + "on the adapter %s.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + + zfcp_erp_port_block(port, clear_mask); + + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) { + ZFCP_LOG_DEBUG("skipped forced reopen on the failed port " + "with WWPN 0x%Lx on the adapter %s.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + debug_text_event(adapter->erp_dbf, 5, "pf_ro_f"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + retval = -EIO; + goto out; + } + + retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED, + port->adapter, port, NULL); + + out: + return retval; +} + +/* + * function: + * + * purpose: Wrappper for zfcp_erp_port_forced_reopen_internal + * used to ensure the correct locking + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +int +zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask) +{ + int retval; + unsigned long flags; + struct zfcp_adapter *adapter; + + adapter = port->adapter; + read_lock_irqsave(&zfcp_data.config_lock, flags); + write_lock(&adapter->erp_lock); + retval = zfcp_erp_port_forced_reopen_internal(port, clear_mask); + write_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + return retval; +} + +/* + * function: + * + * purpose: called if a port is to be opened + * initiates Reopen recovery which is done + * asynchronously + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +static int +zfcp_erp_port_reopen_internal(struct zfcp_port *port, int clear_mask) +{ + int retval; + struct zfcp_adapter *adapter = port->adapter; + + debug_text_event(adapter->erp_dbf, 5, "p_ro"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + + ZFCP_LOG_DEBUG("Reopen of the port with WWPN 0x%Lx " + "on the adapter %s.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + + zfcp_erp_port_block(port, clear_mask); + + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) { + ZFCP_LOG_DEBUG + ("skipped reopen on the failed port with WWPN 0x%Lx " + "on the adapter %s.\n", port->wwpn, + zfcp_get_busid_by_port(port)); + debug_text_event(adapter->erp_dbf, 5, "p_ro_f"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + /* ensure propagation of failed status to new devices */ + zfcp_erp_port_failed(port); + retval = -EIO; + goto out; + } + + retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT, + port->adapter, port, NULL); + + out: + return retval; +} + +/* + * function: + * + * purpose: Wrappper for zfcp_erp_port_reopen_internal + * used to ensure the correct locking + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +int +zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask) +{ + int retval; + unsigned long flags; + struct zfcp_adapter *adapter = port->adapter; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + write_lock(&adapter->erp_lock); + retval = zfcp_erp_port_reopen_internal(port, clear_mask); + write_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + return retval; +} + +/* + * function: + * + * purpose: called if a unit is to be opened + * initiates Reopen recovery which is done + * asynchronously + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +static int +zfcp_erp_unit_reopen_internal(struct zfcp_unit *unit, int clear_mask) +{ + int retval; + struct zfcp_adapter *adapter = unit->port->adapter; + + debug_text_event(adapter->erp_dbf, 5, "u_ro"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t)); + ZFCP_LOG_DEBUG("Reopen of the unit with FCP LUN 0x%Lx on the " + "port with WWPN 0x%Lx " + "on the adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + + zfcp_erp_unit_block(unit, clear_mask); + + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &unit->status)) { + ZFCP_LOG_DEBUG + ("skipped reopen on the failed unit with FCP LUN 0x%Lx " + "on the port with WWPN 0x%Lx " "on the adapter %s.\n", + unit->fcp_lun, unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + debug_text_event(adapter->erp_dbf, 5, "u_ro_f"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, + sizeof (fcp_lun_t)); + retval = -EIO; + goto out; + } + + retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_UNIT, + unit->port->adapter, unit->port, unit); + out: + return retval; +} + +/* + * function: + * + * purpose: Wrappper for zfcp_erp_unit_reopen_internal + * used to ensure the correct locking + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +int +zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask) +{ + int retval; + unsigned long flags; + struct zfcp_adapter *adapter; + struct zfcp_port *port; + + port = unit->port; + adapter = port->adapter; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + write_lock(&adapter->erp_lock); + retval = zfcp_erp_unit_reopen_internal(unit, clear_mask); + write_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + return retval; +} + +/* + * function: + * + * purpose: disable I/O, + * return any open requests and clean them up, + * aim: no pending and incoming I/O + * + * returns: + */ +static void +zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask) +{ + debug_text_event(adapter->erp_dbf, 6, "a_bl"); + zfcp_erp_modify_adapter_status(adapter, + ZFCP_STATUS_COMMON_UNBLOCKED | + clear_mask, ZFCP_CLEAR); +} + +/* + * function: + * + * purpose: enable I/O + * + * returns: + */ +static void +zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) +{ + debug_text_event(adapter->erp_dbf, 6, "a_ubl"); + atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status); +} + +/* + * function: + * + * purpose: disable I/O, + * return any open requests and clean them up, + * aim: no pending and incoming I/O + * + * returns: + */ +static void +zfcp_erp_port_block(struct zfcp_port *port, int clear_mask) +{ + struct zfcp_adapter *adapter = port->adapter; + + debug_text_event(adapter->erp_dbf, 6, "p_bl"); + debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); + zfcp_erp_modify_port_status(port, + ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, + ZFCP_CLEAR); +} + +/* + * function: + * + * purpose: enable I/O + * + * returns: + */ +static void +zfcp_erp_port_unblock(struct zfcp_port *port) +{ + struct zfcp_adapter *adapter = port->adapter; + + debug_text_event(adapter->erp_dbf, 6, "p_ubl"); + debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); + atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status); +} + +/* + * function: + * + * purpose: disable I/O, + * return any open requests and clean them up, + * aim: no pending and incoming I/O + * + * returns: + */ +static void +zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask) +{ + struct zfcp_adapter *adapter = unit->port->adapter; + + debug_text_event(adapter->erp_dbf, 6, "u_bl"); + debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); + zfcp_erp_modify_unit_status(unit, + ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask, + ZFCP_CLEAR); +} + +/* + * function: + * + * purpose: enable I/O + * + * returns: + */ +static void +zfcp_erp_unit_unblock(struct zfcp_unit *unit) +{ + struct zfcp_adapter *adapter = unit->port->adapter; + + debug_text_event(adapter->erp_dbf, 6, "u_ubl"); + debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); + atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status); +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static void +zfcp_erp_action_ready(struct zfcp_erp_action *erp_action) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 4, "a_ar"); + debug_event(adapter->erp_dbf, 4, &erp_action->action, sizeof (int)); + + zfcp_erp_action_to_ready(erp_action); + up(&adapter->erp_ready_sem); +} + +/* + * function: + * + * purpose: + * + * returns: <0 erp_action not found in any list + * ZFCP_ERP_ACTION_READY erp_action is in ready list + * ZFCP_ERP_ACTION_RUNNING erp_action is in running list + * + * locks: erp_lock must be held + */ +static int +zfcp_erp_action_exists(struct zfcp_erp_action *erp_action) +{ + int retval = -EINVAL; + struct list_head *entry; + struct zfcp_erp_action *entry_erp_action; + struct zfcp_adapter *adapter = erp_action->adapter; + + /* search in running list */ + list_for_each(entry, &adapter->erp_running_head) { + entry_erp_action = + list_entry(entry, struct zfcp_erp_action, list); + if (entry_erp_action == erp_action) { + retval = ZFCP_ERP_ACTION_RUNNING; + goto out; + } + } + /* search in ready list */ + list_for_each(entry, &adapter->erp_ready_head) { + entry_erp_action = + list_entry(entry, struct zfcp_erp_action, list); + if (entry_erp_action == erp_action) { + retval = ZFCP_ERP_ACTION_READY; + goto out; + } + } + + out: + return retval; +} + +/* + * purpose: checks current status of action (timed out, dismissed, ...) + * and does appropriate preparations (dismiss fsf request, ...) + * + * locks: called under erp_lock (disabled interrupts) + * + * returns: 0 + */ +static int +zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + struct zfcp_fsf_req *fsf_req; + struct zfcp_adapter *adapter = erp_action->adapter; + + if (erp_action->fsf_req) { + /* take lock to ensure that request is not being deleted meanwhile */ + write_lock(&adapter->fsf_req_list_lock); + /* check whether fsf req does still exist */ + list_for_each_entry(fsf_req, &adapter->fsf_req_list_head, list) + if (fsf_req == erp_action->fsf_req) + break; + if (fsf_req == erp_action->fsf_req) { + /* fsf_req still exists */ + debug_text_event(adapter->erp_dbf, 3, "a_ca_req"); + debug_event(adapter->erp_dbf, 3, &fsf_req, + sizeof (unsigned long)); + /* dismiss fsf_req of timed out or dismissed erp_action */ + if (erp_action->status & (ZFCP_STATUS_ERP_DISMISSED | + ZFCP_STATUS_ERP_TIMEDOUT)) { + debug_text_event(adapter->erp_dbf, 3, + "a_ca_disreq"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; + } + /* + * If fsf_req is neither dismissed nor completed + * then keep it running asynchronously and don't mess with + * the association of erp_action and fsf_req. + */ + if (fsf_req->status & (ZFCP_STATUS_FSFREQ_COMPLETED | + ZFCP_STATUS_FSFREQ_DISMISSED)) { + /* forget about association between fsf_req and erp_action */ + fsf_req->erp_action = NULL; + erp_action->fsf_req = NULL; + /* some special things for time out conditions */ + if (erp_action-> status & ZFCP_STATUS_ERP_TIMEDOUT) { + ZFCP_LOG_NORMAL + ("error: Error Recovery Procedure step timed out. " + "The action flag is 0x%x. The FSF request " + "is at 0x%lx\n", erp_action->action, + (unsigned long) erp_action->fsf_req); + /* fight for low memory buffer, if required */ + if (fsf_req-> + status & ZFCP_STATUS_FSFREQ_POOL) { + debug_text_event(adapter->erp_dbf, 3, + "a_ca_lowmem"); + ZFCP_LOG_NORMAL + ("error: The error recovery action using the " + "low memory pool timed out. Restarting IO on " + "the adapter %s to free it.\n", + zfcp_get_busid_by_adapter + (adapter)); + zfcp_erp_adapter_reopen_internal(adapter, 0); + } + } + } + } else { + debug_text_event(adapter->erp_dbf, 3, "a_ca_gonereq"); + /* + * even if this fsf_req has gone, forget about + * association between erp_action and fsf_req + */ + erp_action->fsf_req = NULL; + } + write_unlock(&adapter->fsf_req_list_lock); + } else + debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq"); + + return retval; +} + +/* + * purpose: generic handler for asynchronous events related to erp_action events + * (normal completion, time-out, dismissing, retry after + * low memory condition) + * + * note: deletion of timer is not required (e.g. in case of a time-out), + * but a second try does no harm, + * we leave it in here to allow for greater simplification + * + * returns: 0 - there was an action to handle + * !0 - otherwise + */ +static int +zfcp_erp_async_handler_nolock(struct zfcp_erp_action *erp_action, + unsigned long set_mask) +{ + int retval; + struct zfcp_adapter *adapter = erp_action->adapter; + + if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING) { + debug_text_event(adapter->erp_dbf, 2, "a_asyh_ex"); + debug_event(adapter->erp_dbf, 2, &erp_action->action, + sizeof (int)); + if (!(set_mask & ZFCP_STATUS_ERP_TIMEDOUT)) + del_timer_sync(&erp_action->timer); + erp_action->status |= set_mask; + zfcp_erp_action_ready(erp_action); + retval = 0; + } else { + /* action is ready or gone - nothing to do */ + debug_text_event(adapter->erp_dbf, 3, "a_asyh_gone"); + debug_event(adapter->erp_dbf, 3, &erp_action->action, + sizeof (int)); + retval = 1; + } + + return retval; +} + +/* + * purpose: generic handler for asynchronous events related to erp_action + * events (normal completion, time-out, dismissing, retry after + * low memory condition) + * + * note: deletion of timer is not required (e.g. in case of a time-out), + * but a second try does no harm, + * we leave it in here to allow for greater simplification + * + * returns: 0 - there was an action to handle + * !0 - otherwise + */ +static int +zfcp_erp_async_handler(struct zfcp_erp_action *erp_action, + unsigned long set_mask) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + unsigned long flags; + int retval; + + write_lock_irqsave(&adapter->erp_lock, flags); + retval = zfcp_erp_async_handler_nolock(erp_action, set_mask); + write_unlock_irqrestore(&adapter->erp_lock, flags); + + return retval; +} + +/* + * purpose: is called for finished FSF requests related to erp, + * moves concerned erp action to 'ready' queue and + * signals erp thread to process it, + * besides it cancels a timeout + */ +void +zfcp_erp_fsf_req_handler(struct zfcp_fsf_req *fsf_req) +{ + struct zfcp_erp_action *erp_action = fsf_req->erp_action; + struct zfcp_adapter *adapter = fsf_req->adapter; + + debug_text_event(adapter->erp_dbf, 3, "a_frh"); + debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); + + if (erp_action) { + debug_event(adapter->erp_dbf, 3, &erp_action->action, + sizeof (int)); + zfcp_erp_async_handler(erp_action, 0); + } +} + +/* + * purpose: is called for erp_action which was slept waiting for + * memory becoming avaliable, + * will trigger that this action will be continued + */ +static void +zfcp_erp_memwait_handler(unsigned long data) +{ + struct zfcp_erp_action *erp_action = (struct zfcp_erp_action *) data; + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 2, "a_mwh"); + debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); + + zfcp_erp_async_handler(erp_action, 0); +} + +/* + * purpose: is called if an asynchronous erp step timed out, + * action gets an appropriate flag and will be processed + * accordingly + */ +static void +zfcp_erp_timeout_handler(unsigned long data) +{ + struct zfcp_erp_action *erp_action = (struct zfcp_erp_action *) data; + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 2, "a_th"); + debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); + + zfcp_erp_async_handler(erp_action, ZFCP_STATUS_ERP_TIMEDOUT); +} + +/* + * purpose: is called for an erp_action which needs to be ended + * though not being done, + * this is usually required if an higher is generated, + * action gets an appropriate flag and will be processed + * accordingly + * + * locks: erp_lock held (thus we need to call another handler variant) + */ +static int +zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 2, "a_adis"); + debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); + + zfcp_erp_async_handler_nolock(erp_action, ZFCP_STATUS_ERP_DISMISSED); + + return 0; +} + +int +zfcp_erp_thread_setup(struct zfcp_adapter *adapter) +{ + int retval = 0; + + atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status); + + rwlock_init(&adapter->erp_lock); + INIT_LIST_HEAD(&adapter->erp_ready_head); + INIT_LIST_HEAD(&adapter->erp_running_head); + sema_init(&adapter->erp_ready_sem, 0); + + retval = kernel_thread(zfcp_erp_thread, adapter, SIGCHLD); + if (retval < 0) { + ZFCP_LOG_NORMAL("error: Out of resources. Could not create an " + "error recovery procedure thread " + "for the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(adapter->erp_dbf, 5, "a_thset_fail"); + } else { + wait_event(adapter->erp_thread_wqh, + atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, + &adapter->status)); + debug_text_event(adapter->erp_dbf, 5, "a_thset_ok"); + } + + return (retval < 0); +} + +/* + * function: + * + * purpose: + * + * returns: + * + * context: process (i.e. proc-fs or rmmod/insmod) + * + * note: The caller of this routine ensures that the specified + * adapter has been shut down and that this operation + * has been completed. Thus, there are no pending erp_actions + * which would need to be handled here. + */ +int +zfcp_erp_thread_kill(struct zfcp_adapter *adapter) +{ + int retval = 0; + + atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status); + up(&adapter->erp_ready_sem); + + wait_event(adapter->erp_thread_wqh, + !atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, + &adapter->status)); + + atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, + &adapter->status); + + debug_text_event(adapter->erp_dbf, 5, "a_thki_ok"); + + return retval; +} + +/* + * purpose: is run as a kernel thread, + * goes through list of error recovery actions of associated adapter + * and delegates single action to execution + * + * returns: 0 + */ +static int +zfcp_erp_thread(void *data) +{ + struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; + struct list_head *next; + struct zfcp_erp_action *erp_action; + unsigned long flags; + + daemonize("zfcperp%s", zfcp_get_busid_by_adapter(adapter)); + /* Block all signals */ + siginitsetinv(¤t->blocked, 0); + atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status); + debug_text_event(adapter->erp_dbf, 5, "a_th_run"); + wake_up(&adapter->erp_thread_wqh); + + while (!atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, + &adapter->status)) { + + write_lock_irqsave(&adapter->erp_lock, flags); + next = adapter->erp_ready_head.prev; + write_unlock_irqrestore(&adapter->erp_lock, flags); + + if (next != &adapter->erp_ready_head) { + erp_action = + list_entry(next, struct zfcp_erp_action, list); + /* + * process action (incl. [re]moving it + * from 'ready' queue) + */ + zfcp_erp_strategy(erp_action); + } + + /* + * sleep as long as there is nothing to do, i.e. + * no action in 'ready' queue to be processed and + * thread is not to be killed + */ + down_interruptible(&adapter->erp_ready_sem); + debug_text_event(adapter->erp_dbf, 5, "a_th_woken"); + } + + atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status); + debug_text_event(adapter->erp_dbf, 5, "a_th_stop"); + wake_up(&adapter->erp_thread_wqh); + + return 0; +} + +/* + * function: + * + * purpose: drives single error recovery action and schedules higher and + * subordinate actions, if necessary + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_SUCCEEDED - action finished successfully (deqd) + * ZFCP_ERP_FAILED - action finished unsuccessfully (deqd) + * ZFCP_ERP_EXIT - action finished (dequeued), offline + * ZFCP_ERP_DISMISSED - action canceled (dequeued) + */ +static int +zfcp_erp_strategy(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_port *port = erp_action->port; + struct zfcp_unit *unit = erp_action->unit; + int action = erp_action->action; + u32 status = erp_action->status; + unsigned long flags; + + /* serialise dismissing, timing out, moving, enqueueing */ + read_lock_irqsave(&zfcp_data.config_lock, flags); + write_lock(&adapter->erp_lock); + + /* dequeue dismissed action and leave, if required */ + retval = zfcp_erp_strategy_check_action(erp_action, retval); + if (retval == ZFCP_ERP_DISMISSED) { + debug_text_event(adapter->erp_dbf, 4, "a_st_dis1"); + goto unlock; + } + + /* + * move action to 'running' queue before processing it + * (to avoid a race condition regarding moving the + * action to the 'running' queue and back) + */ + zfcp_erp_action_to_running(erp_action); + + /* + * try to process action as far as possible, + * no lock to allow for blocking operations (kmalloc, qdio, ...), + * afterwards the lock is required again for the following reasons: + * - dequeueing of finished action and enqueueing of + * follow-up actions must be atomic so that any other + * reopen-routine does not believe there is nothing to do + * and that it is safe to enqueue something else, + * - we want to force any control thread which is dismissing + * actions to finish this before we decide about + * necessary steps to be taken here further + */ + write_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + retval = zfcp_erp_strategy_do_action(erp_action); + read_lock_irqsave(&zfcp_data.config_lock, flags); + write_lock(&adapter->erp_lock); + + /* + * check for dismissed status again to avoid follow-up actions, + * failing of targets and so on for dismissed actions + */ + retval = zfcp_erp_strategy_check_action(erp_action, retval); + + switch (retval) { + case ZFCP_ERP_DISMISSED: + /* leave since this action has ridden to its ancestors */ + debug_text_event(adapter->erp_dbf, 6, "a_st_dis2"); + goto unlock; + case ZFCP_ERP_NOMEM: + /* no memory to continue immediately, let it sleep */ + debug_text_event(adapter->erp_dbf, 2, "a_st_memw"); + retval = zfcp_erp_strategy_memwait(erp_action); + /* fall through, waiting for memory means action continues */ + case ZFCP_ERP_CONTINUES: + /* leave since this action runs asynchronously */ + debug_text_event(adapter->erp_dbf, 6, "a_st_cont"); + goto unlock; + } + /* ok, finished action (whatever its result is) */ + + /* check for unrecoverable targets */ + retval = zfcp_erp_strategy_check_target(erp_action, retval); + + /* action must be dequeued (here to allow for further ones) */ + zfcp_erp_action_dequeue(erp_action); + + /* + * put this target through the erp mill again if someone has + * requested to change the status of a target being online + * to offline or the other way around + * (old retval is preserved if nothing has to be done here) + */ + retval = zfcp_erp_strategy_statechange(action, status, adapter, + port, unit, retval); + + /* + * leave if target is in permanent error state or if + * action is repeated in order to process state change + */ + if (retval == ZFCP_ERP_EXIT) { + debug_text_event(adapter->erp_dbf, 2, "a_st_exit"); + goto unlock; + } + + /* trigger follow up actions */ + zfcp_erp_strategy_followup_actions(action, adapter, port, unit, retval); + + unlock: + write_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + /* + * a few tasks remain when the erp queues are empty + * (don't do that if the last action evaluated was dismissed + * since this clearly indicates that there is more to come) : + * - close the name server port if it is open yet + * (enqueues another [probably] final action) + * - otherwise, wake up whoever wants to be woken when we are + * done with erp + */ + if (retval != ZFCP_ERP_DISMISSED) + zfcp_erp_strategy_check_queues(adapter); + + debug_text_event(adapter->erp_dbf, 6, "a_st_done"); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_DISMISSED - if action has been dismissed + * retval - otherwise + */ +static int +zfcp_erp_strategy_check_action(struct zfcp_erp_action *erp_action, int retval) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + + zfcp_erp_strategy_check_fsfreq(erp_action); + + debug_event(adapter->erp_dbf, 5, &erp_action->action, sizeof (int)); + if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED) { + debug_text_event(adapter->erp_dbf, 3, "a_stcd_dis"); + zfcp_erp_action_dequeue(erp_action); + retval = ZFCP_ERP_DISMISSED; + } else + debug_text_event(adapter->erp_dbf, 5, "a_stcd_nodis"); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_FAILED; + struct zfcp_adapter *adapter = erp_action->adapter; + + /* + * try to execute/continue action as far as possible, + * note: no lock in subsequent strategy routines + * (this allows these routine to call schedule, e.g. + * kmalloc with such flags or qdio_initialize & friends) + * Note: in case of timeout, the seperate strategies will fail + * anyhow. No need for a special action. Even worse, a nameserver + * failure would not wake up waiting ports without the call. + */ + switch (erp_action->action) { + + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + retval = zfcp_erp_adapter_strategy(erp_action); + break; + + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: + retval = zfcp_erp_port_forced_strategy(erp_action); + break; + + case ZFCP_ERP_ACTION_REOPEN_PORT: + retval = zfcp_erp_port_strategy(erp_action); + break; + + case ZFCP_ERP_ACTION_REOPEN_UNIT: + retval = zfcp_erp_unit_strategy(erp_action); + break; + + default: + debug_text_exception(adapter->erp_dbf, 1, "a_stda_bug"); + debug_event(adapter->erp_dbf, 1, &erp_action->action, + sizeof (int)); + ZFCP_LOG_NORMAL("bug: Unknown error recovery procedure " + "action requested on the adapter %s " + "(debug info %d)\n", + zfcp_get_busid_by_adapter(erp_action->adapter), + erp_action->action); + } + + return retval; +} + +/* + * function: + * + * purpose: triggers retry of this action after a certain amount of time + * by means of timer provided by erp_action + * + * returns: ZFCP_ERP_CONTINUES - erp_action sleeps in erp running queue + */ +static int +zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_CONTINUES; + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 6, "a_mwinit"); + debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int)); + init_timer(&erp_action->timer); + erp_action->timer.function = zfcp_erp_memwait_handler; + erp_action->timer.data = (unsigned long) erp_action; + erp_action->timer.expires = jiffies + ZFCP_ERP_MEMWAIT_TIMEOUT; + add_timer(&erp_action->timer); + + return retval; +} + +/* + * function: zfcp_erp_adapter_failed + * + * purpose: sets the adapter and all underlying devices to ERP_FAILED + * + */ +void +zfcp_erp_adapter_failed(struct zfcp_adapter *adapter) +{ + zfcp_erp_modify_adapter_status(adapter, + ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); + ZFCP_LOG_NORMAL("Adapter recovery failed on the " + "adapter %s.\n", zfcp_get_busid_by_adapter(adapter)); + debug_text_event(adapter->erp_dbf, 2, "a_afail"); +} + +/* + * function: zfcp_erp_port_failed + * + * purpose: sets the port and all underlying devices to ERP_FAILED + * + */ +void +zfcp_erp_port_failed(struct zfcp_port *port) +{ + zfcp_erp_modify_port_status(port, + ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); + + ZFCP_LOG_NORMAL("Port recovery failed on the " + "port with WWPN 0x%Lx at the " + "adapter %s.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + debug_text_event(port->adapter->erp_dbf, 2, "p_pfail"); + debug_event(port->adapter->erp_dbf, 2, &port->wwpn, sizeof (wwn_t)); +} + +/* + * function: zfcp_erp_unit_failed + * + * purpose: sets the unit to ERP_FAILED + * + */ +void +zfcp_erp_unit_failed(struct zfcp_unit *unit) +{ + zfcp_erp_modify_unit_status(unit, + ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET); + + ZFCP_LOG_NORMAL("Unit recovery failed on the unit with FCP LUN 0x%Lx " + "connected to the port with WWPN 0x%Lx at the " + "adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + debug_text_event(unit->port->adapter->erp_dbf, 2, "u_ufail"); + debug_event(unit->port->adapter->erp_dbf, 2, + &unit->fcp_lun, sizeof (fcp_lun_t)); +} + +/* + * function: zfcp_erp_strategy_check_target + * + * purpose: increments the erp action count on the device currently in + * recovery if the action failed or resets the count in case of + * success. If a maximum count is exceeded the device is marked + * as ERP_FAILED. + * The 'blocked' state of a target which has been recovered + * successfully is reset. + * + * returns: ZFCP_ERP_CONTINUES - action continues (not considered) + * ZFCP_ERP_SUCCEEDED - action finished successfully + * ZFCP_ERP_EXIT - action failed and will not continue + */ +static int +zfcp_erp_strategy_check_target(struct zfcp_erp_action *erp_action, int result) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_port *port = erp_action->port; + struct zfcp_unit *unit = erp_action->unit; + + debug_text_event(adapter->erp_dbf, 5, "a_stct_norm"); + debug_event(adapter->erp_dbf, 5, &erp_action->action, sizeof (int)); + debug_event(adapter->erp_dbf, 5, &result, sizeof (int)); + + switch (erp_action->action) { + + case ZFCP_ERP_ACTION_REOPEN_UNIT: + result = zfcp_erp_strategy_check_unit(unit, result); + break; + + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: + case ZFCP_ERP_ACTION_REOPEN_PORT: + result = zfcp_erp_strategy_check_port(port, result); + break; + + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + result = zfcp_erp_strategy_check_adapter(adapter, result); + break; + } + + return result; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_strategy_statechange(int action, + u32 status, + struct zfcp_adapter *adapter, + struct zfcp_port *port, + struct zfcp_unit *unit, int retval) +{ + debug_text_event(adapter->erp_dbf, 3, "a_stsc"); + debug_event(adapter->erp_dbf, 3, &action, sizeof (int)); + + switch (action) { + + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + if (zfcp_erp_strategy_statechange_detected(&adapter->status, + status)) { + zfcp_erp_adapter_reopen_internal(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); + retval = ZFCP_ERP_EXIT; + } + break; + + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: + case ZFCP_ERP_ACTION_REOPEN_PORT: + if (zfcp_erp_strategy_statechange_detected(&port->status, + status)) { + zfcp_erp_port_reopen_internal(port, ZFCP_STATUS_COMMON_ERP_FAILED); + retval = ZFCP_ERP_EXIT; + } + break; + + case ZFCP_ERP_ACTION_REOPEN_UNIT: + if (zfcp_erp_strategy_statechange_detected(&unit->status, + status)) { + zfcp_erp_unit_reopen_internal(unit, ZFCP_STATUS_COMMON_ERP_FAILED); + retval = ZFCP_ERP_EXIT; + } + break; + } + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static inline int +zfcp_erp_strategy_statechange_detected(atomic_t * target_status, u32 erp_status) +{ + return + /* take it online */ + (atomic_test_mask(ZFCP_STATUS_COMMON_RUNNING, target_status) && + (ZFCP_STATUS_ERP_CLOSE_ONLY & erp_status)) || + /* take it offline */ + (!atomic_test_mask(ZFCP_STATUS_COMMON_RUNNING, target_status) && + !(ZFCP_STATUS_ERP_CLOSE_ONLY & erp_status)); +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result) +{ + debug_text_event(unit->port->adapter->erp_dbf, 5, "u_stct"); + debug_event(unit->port->adapter->erp_dbf, 5, &unit->fcp_lun, + sizeof (fcp_lun_t)); + + if (result == ZFCP_ERP_SUCCEEDED) { + atomic_set(&unit->erp_counter, 0); + zfcp_erp_unit_unblock(unit); + /* register unit with scsi stack */ + if (!unit->device) + scsi_add_device(unit->port->adapter->scsi_host, + 0, unit->port->scsi_id, unit->scsi_lun); + } else { + /* ZFCP_ERP_FAILED or ZFCP_ERP_EXIT */ + atomic_inc(&unit->erp_counter); + if (atomic_read(&unit->erp_counter) > ZFCP_MAX_ERPS) { + zfcp_erp_unit_failed(unit); + result = ZFCP_ERP_EXIT; + } + } + + return result; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_strategy_check_port(struct zfcp_port *port, int result) +{ + debug_text_event(port->adapter->erp_dbf, 5, "p_stct"); + debug_event(port->adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + + if (result == ZFCP_ERP_SUCCEEDED) { + atomic_set(&port->erp_counter, 0); + zfcp_erp_port_unblock(port); + } else { + /* ZFCP_ERP_FAILED or ZFCP_ERP_EXIT */ + atomic_inc(&port->erp_counter); + if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS) { + zfcp_erp_port_failed(port); + result = ZFCP_ERP_EXIT; + } + } + + return result; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter, int result) +{ + debug_text_event(adapter->erp_dbf, 5, "a_stct"); + + if (result == ZFCP_ERP_SUCCEEDED) { + atomic_set(&adapter->erp_counter, 0); + zfcp_erp_adapter_unblock(adapter); + } else { + /* ZFCP_ERP_FAILED or ZFCP_ERP_EXIT */ + atomic_inc(&adapter->erp_counter); + if (atomic_read(&adapter->erp_counter) > ZFCP_MAX_ERPS) { + zfcp_erp_adapter_failed(adapter); + result = ZFCP_ERP_EXIT; + } + } + + return result; +} + +/* + * function: + * + * purpose: remaining things in good cases, + * escalation in bad cases + * + * returns: + */ +static int +zfcp_erp_strategy_followup_actions(int action, + struct zfcp_adapter *adapter, + struct zfcp_port *port, + struct zfcp_unit *unit, int status) +{ + debug_text_event(adapter->erp_dbf, 5, "a_stfol"); + debug_event(adapter->erp_dbf, 5, &action, sizeof (int)); + + /* initiate follow-up actions depending on success of finished action */ + switch (action) { + + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + if (status == ZFCP_ERP_SUCCEEDED) + zfcp_erp_port_reopen_all_internal(adapter, 0); + else + zfcp_erp_adapter_reopen_internal(adapter, 0); + break; + + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: + if (status == ZFCP_ERP_SUCCEEDED) + zfcp_erp_port_reopen_internal(port, 0); + else + zfcp_erp_adapter_reopen_internal(adapter, 0); + break; + + case ZFCP_ERP_ACTION_REOPEN_PORT: + if (status == ZFCP_ERP_SUCCEEDED) + zfcp_erp_unit_reopen_all_internal(port, 0); + else + zfcp_erp_port_forced_reopen_internal(port, 0); + break; + + case ZFCP_ERP_ACTION_REOPEN_UNIT: + if (status == ZFCP_ERP_SUCCEEDED) ; /* no further action */ + else + zfcp_erp_port_reopen_internal(unit->port, 0); + break; + } + + return 0; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_strategy_check_queues(struct zfcp_adapter *adapter) +{ + int retval = 0; + unsigned long flags; + struct zfcp_port *nport = adapter->nameserver_port; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + read_lock(&adapter->erp_lock); + if (list_empty(&adapter->erp_ready_head) && + list_empty(&adapter->erp_running_head)) { + if (nport + && atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, + &nport->status)) { + debug_text_event(adapter->erp_dbf, 4, "a_cq_nspsd"); + /* taking down nameserver port */ + zfcp_erp_port_reopen_internal(nport, + ZFCP_STATUS_COMMON_RUNNING | + ZFCP_STATUS_COMMON_ERP_FAILED); + } else { + debug_text_event(adapter->erp_dbf, 4, "a_cq_wake"); + atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, + &adapter->status); + wake_up(&adapter->erp_done_wqh); + } + } else + debug_text_event(adapter->erp_dbf, 5, "a_cq_notempty"); + read_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +int +zfcp_erp_wait(struct zfcp_adapter *adapter) +{ + int retval = 0; + + wait_event(adapter->erp_done_wqh, + !atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, + &adapter->status)); + + return retval; +} + +/* + * function: zfcp_erp_modify_adapter_status + * + * purpose: + * + */ +void +zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter, + u32 mask, int set_or_clear) +{ + struct zfcp_port *port; + u32 common_mask = mask & ZFCP_COMMON_FLAGS; + + if (set_or_clear == ZFCP_SET) { + atomic_set_mask(mask, &adapter->status); + debug_text_event(adapter->erp_dbf, 3, "a_mod_as_s"); + } else { + atomic_clear_mask(mask, &adapter->status); + if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) + atomic_set(&adapter->erp_counter, 0); + debug_text_event(adapter->erp_dbf, 3, "a_mod_as_c"); + } + debug_event(adapter->erp_dbf, 3, &mask, sizeof (u32)); + + /* Deal with all underlying devices, only pass common_mask */ + if (common_mask) + list_for_each_entry(port, &adapter->port_list_head, list) + zfcp_erp_modify_port_status(port, common_mask, + set_or_clear); +} + +/* + * function: zfcp_erp_modify_port_status + * + * purpose: sets the port and all underlying devices to ERP_FAILED + * + */ +void +zfcp_erp_modify_port_status(struct zfcp_port *port, u32 mask, int set_or_clear) +{ + struct zfcp_unit *unit; + u32 common_mask = mask & ZFCP_COMMON_FLAGS; + + if (set_or_clear == ZFCP_SET) { + atomic_set_mask(mask, &port->status); + debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_s"); + } else { + atomic_clear_mask(mask, &port->status); + if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) + atomic_set(&port->erp_counter, 0); + debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_c"); + } + debug_event(port->adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); + debug_event(port->adapter->erp_dbf, 3, &mask, sizeof (u32)); + + /* Modify status of all underlying devices, only pass common mask */ + if (common_mask) + list_for_each_entry(unit, &port->unit_list_head, list) + zfcp_erp_modify_unit_status(unit, common_mask, + set_or_clear); +} + +/* + * function: zfcp_erp_modify_unit_status + * + * purpose: sets the unit to ERP_FAILED + * + */ +void +zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear) +{ + if (set_or_clear == ZFCP_SET) { + atomic_set_mask(mask, &unit->status); + debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_s"); + } else { + atomic_clear_mask(mask, &unit->status); + if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) { + atomic_set(&unit->erp_counter, 0); + } + debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_c"); + } + debug_event(unit->port->adapter->erp_dbf, 3, &unit->fcp_lun, + sizeof (fcp_lun_t)); + debug_event(unit->port->adapter->erp_dbf, 3, &mask, sizeof (u32)); +} + +/* + * function: + * + * purpose: Wrappper for zfcp_erp_port_reopen_all_internal + * used to ensure the correct locking + * + * returns: 0 - initiated action succesfully + * <0 - failed to initiate action + */ +int +zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, int clear_mask) +{ + int retval; + unsigned long flags; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + write_lock(&adapter->erp_lock); + retval = zfcp_erp_port_reopen_all_internal(adapter, clear_mask); + write_unlock(&adapter->erp_lock); + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, int clear_mask) +{ + int retval = 0; + struct zfcp_port *port; + + list_for_each_entry(port, &adapter->port_list_head, list) + if (atomic_test_mask(ZFCP_STATUS_PORT_NAMESERVER, &port->status) + != ZFCP_STATUS_PORT_NAMESERVER) + zfcp_erp_port_reopen_internal(port, clear_mask); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +zfcp_erp_unit_reopen_all_internal(struct zfcp_port *port, int clear_mask) +{ + int retval = 0; + struct zfcp_unit *unit; + + list_for_each_entry(unit, &port->unit_list_head, list) + zfcp_erp_unit_reopen_internal(unit, clear_mask); + + return retval; +} + +/* + * function: + * + * purpose: this routine executes the 'Reopen Adapter' action + * (the entire action is processed synchronously, since + * there are no actions which might be run concurrently + * per definition) + * + * returns: ZFCP_ERP_SUCCEEDED - action finished successfully + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_adapter_strategy(struct zfcp_erp_action *erp_action) +{ + int retval; + unsigned long timeout; + struct zfcp_adapter *adapter = erp_action->adapter; + + retval = zfcp_erp_adapter_strategy_close(erp_action); + if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY) + retval = ZFCP_ERP_EXIT; + else + retval = zfcp_erp_adapter_strategy_open(erp_action); + + debug_text_event(adapter->erp_dbf, 3, "a_ast/ret"); + debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); + debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); + + if (retval == ZFCP_ERP_FAILED) { + ZFCP_LOG_INFO("Waiting to allow the adapter %s " + "to recover itself\n.", + zfcp_get_busid_by_adapter(adapter)); + /* + * SUGGESTION: substitute by + * timeout = ZFCP_TYPE2_RECOVERY_TIME; + * __ZFCP_WAIT_EVENT_TIMEOUT(timeout, 0); + */ + timeout = ZFCP_TYPE2_RECOVERY_TIME; + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(timeout); + } + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_SUCCEEDED - action finished successfully + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *erp_action) +{ + int retval; + + atomic_set_mask(ZFCP_STATUS_COMMON_CLOSING, + &erp_action->adapter->status); + retval = zfcp_erp_adapter_strategy_generic(erp_action, 1); + atomic_clear_mask(ZFCP_STATUS_COMMON_CLOSING, + &erp_action->adapter->status); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_SUCCEEDED - action finished successfully + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *erp_action) +{ + int retval; + + atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, + &erp_action->adapter->status); + retval = zfcp_erp_adapter_strategy_generic(erp_action, 0); + atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING, + &erp_action->adapter->status); + + return retval; +} + +/* + * function: zfcp_register_adapter + * + * purpose: allocate the irq associated with this devno and register + * the FSF adapter with the SCSI stack + * + * returns: + */ +static int +zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *erp_action, int close) +{ + int retval = ZFCP_ERP_SUCCEEDED; + + if (close) + goto close_only; + + retval = zfcp_erp_adapter_strategy_open_qdio(erp_action); + if (retval != ZFCP_ERP_SUCCEEDED) + goto failed_qdio; + + retval = zfcp_erp_adapter_strategy_open_fsf(erp_action); + if (retval != ZFCP_ERP_SUCCEEDED) + goto failed_openfcp; + + atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &erp_action->adapter->status); + goto out; + + close_only: + atomic_clear_mask(ZFCP_STATUS_COMMON_OPEN, + &erp_action->adapter->status); + + failed_openfcp: + zfcp_erp_adapter_strategy_close_qdio(erp_action); + zfcp_erp_adapter_strategy_close_fsf(erp_action); + failed_qdio: + out: + return retval; +} + +/* + * function: zfcp_qdio_init + * + * purpose: setup QDIO operation for specified adapter + * + * returns: 0 - successful setup + * !0 - failed setup + */ +int +zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + struct zfcp_adapter *adapter = erp_action->adapter; + int i; + volatile struct qdio_buffer_element *buffere; + int retval_cleanup = 0; + + if (atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)) { + ZFCP_LOG_NORMAL + ("bug: QDIO (data transfer mechanism) start-up on " + "adapter %s attempted twice. Second attempt ignored.\n", + zfcp_get_busid_by_adapter(adapter)); + goto failed_sanity; + } + + if (qdio_establish(&adapter->qdio_init_data) != 0) { + ZFCP_LOG_INFO + ("error: Could not establish queues for QDIO (data " + "transfer mechanism) operation on adapter %s\n.", + zfcp_get_busid_by_adapter(adapter)); + goto failed_qdio_establish; + } + ZFCP_LOG_DEBUG("queues established\n"); + + if (qdio_activate(adapter->ccw_device, 0) != 0) { + ZFCP_LOG_INFO("error: Could not activate queues for QDIO (data " + "transfer mechanism) operation on adapter %s\n.", + zfcp_get_busid_by_adapter(adapter)); + goto failed_qdio_activate; + } + ZFCP_LOG_DEBUG("queues activated\n"); + + /* + * put buffers into response queue, + */ + for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) { + buffere = &(adapter->response_queue.buffer[i]->element[0]); + buffere->length = 0; + buffere->flags = SBAL_FLAGS_LAST_ENTRY; + buffere->addr = 0; + } + + ZFCP_LOG_TRACE("Calling do QDIO busid=%s, flags=0x%x, queue_no=%i, " + "index_in_queue=%i, count=%i\n", + zfcp_get_busid_by_adapter(adapter), + QDIO_FLAG_SYNC_INPUT, 0, 0, QDIO_MAX_BUFFERS_PER_Q); + + retval = do_QDIO(adapter->ccw_device, + QDIO_FLAG_SYNC_INPUT, + 0, 0, QDIO_MAX_BUFFERS_PER_Q, NULL); + + if (retval) { + ZFCP_LOG_NORMAL + ("bug: QDIO (data transfer mechanism) inobund transfer " + "structures could not be set-up (debug info %d)\n", + retval); + goto failed_do_qdio; + } else { + adapter->response_queue.free_index = 0; + atomic_set(&adapter->response_queue.free_count, 0); + ZFCP_LOG_DEBUG + ("%i buffers successfully enqueued to response queue\n", + QDIO_MAX_BUFFERS_PER_Q); + } + /* set index of first avalable SBALS / number of available SBALS */ + adapter->request_queue.free_index = 0; + atomic_set(&adapter->request_queue.free_count, QDIO_MAX_BUFFERS_PER_Q); + adapter->request_queue.distance_from_int = 0; + + /* initialize waitqueue used to wait for free SBALs in requests queue */ + init_waitqueue_head(&adapter->request_wq); + + /* ok, we did it - skip all cleanups for different failures */ + atomic_set_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status); + retval = ZFCP_ERP_SUCCEEDED; + goto out; + + failed_do_qdio: + /* NOP */ + + failed_qdio_activate: + /* DEBUG */ + //__ZFCP_WAIT_EVENT_TIMEOUT(timeout, 0); + /* cleanup queues previously established */ + retval_cleanup = qdio_shutdown(adapter->ccw_device, + QDIO_FLAG_CLEANUP_USING_CLEAR); + if (retval_cleanup) { + ZFCP_LOG_NORMAL + ("bug: Could not clean QDIO (data transfer mechanism) " + "queues. (debug info %i).\n", retval_cleanup); + } +#ifdef ZFCP_DEBUG_REQUESTS + else + debug_text_event(adapter->req_dbf, 1, "q_clean"); +#endif /* ZFCP_DEBUG_REQUESTS */ + + failed_qdio_establish: + atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status); + + failed_sanity: + retval = ZFCP_ERP_FAILED; + + out: + return retval; +} + +/* + * function: zfcp_qdio_cleanup + * + * purpose: cleans up QDIO operation for the specified adapter + * + * returns: 0 - successful cleanup + * !0 - failed cleanup + */ +int +zfcp_erp_adapter_strategy_close_qdio(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_SUCCEEDED; + int first_used; + int used_count; + struct zfcp_adapter *adapter = erp_action->adapter; + + if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)) { + ZFCP_LOG_DEBUG("Termination of QDIO (data transfer operation) " + "attempted for an inactive qdio on the " + "adapter %s....ignored.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = ZFCP_ERP_FAILED; + goto out; + } + + /* cleanup queues previously established */ + + /* + * MUST NOT LOCK - qdio_cleanup might call schedule + * FIXME: need another way to make cleanup safe + */ + /* Note: + * We need the request_queue lock here, otherwise there exists the + * following race: + * + * queuecommand calls create_fcp_commmand_task...calls req_create, + * gets sbal x to x+y - meanwhile adapter reopen is called, completes + * - req_send calls do_QDIO for sbal x to x+y, i.e. wrong indices. + * + * with lock: + * queuecommand calls create_fcp_commmand_task...calls req_create, + * gets sbal x to x+y - meanwhile adapter reopen is called, waits + * - req_send calls do_QDIO for sbal x to x+y, i.e. wrong indices + * but do_QDIO fails as adapter_reopen is still waiting for the lock + * OR + * queuecommand calls create_fcp_commmand_task...calls req_create + * - meanwhile adapter reopen is called...completes, + * - gets sbal 0 to 0+y, - req_send calls do_QDIO for sbal 0 to 0+y, + * i.e. correct indices...though an fcp command is called before + * exchange config data...that should be fine, however + */ + if (qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR)) { + /* + * FIXME(design): + * What went wrong? What to do best? Proper retval? + */ + ZFCP_LOG_NORMAL + ("error: Clean-up of QDIO (data transfer mechanism) " + "structures failed for adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + } else { + ZFCP_LOG_DEBUG("queues cleaned up\n"); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 1, "q_clean"); +#endif /* ZFCP_DEBUG_REQUESTS */ + } + + /* + * First we had to stop QDIO operation. + * Now it is safe to take the following actions. + */ + + /* Cleanup only necessary when there are unacknowledged buffers */ + if (atomic_read(&adapter->request_queue.free_count) + < QDIO_MAX_BUFFERS_PER_Q) { + first_used = (adapter->request_queue.free_index + + atomic_read(&adapter->request_queue.free_count)) + % QDIO_MAX_BUFFERS_PER_Q; + used_count = QDIO_MAX_BUFFERS_PER_Q - + atomic_read(&adapter->request_queue.free_count); + zfcp_qdio_zero_sbals(adapter->request_queue.buffer, + first_used, used_count); + } + adapter->response_queue.free_index = 0; + atomic_set(&adapter->response_queue.free_count, 0); + adapter->request_queue.free_index = 0; + atomic_set(&adapter->request_queue.free_count, 0); + adapter->request_queue.distance_from_int = 0; + + atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status); + out: + return retval; +} + +/* + * function: zfcp_fsf_init + * + * purpose: initializes FSF operation for the specified adapter + * + * returns: 0 - succesful initialization of FSF operation + * !0 - failed to initialize FSF operation + */ +static int +zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *erp_action) +{ + int retval; + + /* do 'exchange configuration data' */ + retval = zfcp_erp_adapter_strategy_open_fsf_xconfig(erp_action); + if (retval == ZFCP_ERP_FAILED) + return retval; + + /* start the desired number of Status Reads */ + retval = zfcp_erp_adapter_strategy_open_fsf_statusread(erp_action); + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_SUCCEEDED; + int retries; + struct zfcp_adapter *adapter = erp_action->adapter; + + atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status); + retries = ZFCP_EXCHANGE_CONFIG_DATA_RETRIES; + + do { + atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT, + &adapter->status); + ZFCP_LOG_DEBUG("Doing exchange config data\n"); + zfcp_erp_timeout_init(erp_action); + if (zfcp_fsf_exchange_config_data(erp_action)) { + retval = ZFCP_ERP_FAILED; + debug_text_event(adapter->erp_dbf, 5, "a_fstx_xf"); + ZFCP_LOG_INFO("error: Out of resources. Could not " + "start exchange of configuration data " + "between the adapter %s " + "and the device driver.\n", + zfcp_get_busid_by_adapter(adapter)); + break; + } + debug_text_event(adapter->erp_dbf, 6, "a_fstx_xok"); + ZFCP_LOG_DEBUG("Xchange underway\n"); + + /* + * Why this works: + * Both the normal completion handler as well as the timeout + * handler will do an 'up' when the 'exchange config data' + * request completes or times out. Thus, the signal to go on + * won't be lost utilizing this semaphore. + * Furthermore, this 'adapter_reopen' action is + * guaranteed to be the only action being there (highest action + * which prevents other actions from being created). + * Resulting from that, the wake signal recognized here + * _must_ be the one belonging to the 'exchange config + * data' request. + */ + down_interruptible(&adapter->erp_ready_sem); + if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { + ZFCP_LOG_INFO + ("error: Exchange of configuration data between " + "the adapter with %s and the device " + "driver timed out\n", + zfcp_get_busid_by_adapter(adapter)); + break; + } + if (atomic_test_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT, + &adapter->status)) { + ZFCP_LOG_DEBUG("Host connection still initialising... " + "waiting and retrying....\n"); + /* sleep a little bit before retry */ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(ZFCP_EXCHANGE_CONFIG_DATA_SLEEP); + } + } while ((retries--) && + atomic_test_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT, + &adapter->status)); + + if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, + &adapter->status)) { + ZFCP_LOG_INFO("error: Exchange of configuration data between " + "the adapter %s and the device driver failed.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = ZFCP_ERP_FAILED;; + } + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action + *erp_action) +{ + int retval = ZFCP_ERP_SUCCEEDED; + int temp_ret; + struct zfcp_adapter *adapter = erp_action->adapter; + int i; + + adapter->status_read_failed = 0; + for (i = 0; i < ZFCP_STATUS_READS_RECOM; i++) { + temp_ret = zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL); + if (temp_ret < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not " + "set-up the infrastructure for " + "unsolicited status presentation " + "for the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = ZFCP_ERP_FAILED; + i--; + break; + } + } + + return retval; +} + +/* + * function: zfcp_fsf_cleanup + * + * purpose: cleanup FSF operation for specified adapter + * + * returns: 0 - FSF operation successfully cleaned up + * !0 - failed to cleanup FSF operation for this adapter + */ +static int +zfcp_erp_adapter_strategy_close_fsf(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_SUCCEEDED; + struct zfcp_adapter *adapter = erp_action->adapter; + + /* + * wake waiting initiators of requests, + * return SCSI commands (with error status), + * clean up all requests (synchronously) + */ + zfcp_fsf_req_dismiss_all(adapter); + /* reset FSF request sequence number */ + adapter->fsf_req_seq_no = 0; + /* all ports and units are closed */ + zfcp_erp_modify_adapter_status(adapter, + ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); + + return retval; +} + +/* + * function: + * + * purpose: this routine executes the 'Reopen Physical Port' action + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_SUCCEEDED - action finished successfully + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_FAILED; + struct zfcp_port *port = erp_action->port; + struct zfcp_adapter *adapter = erp_action->adapter; + + switch (erp_action->step) { + + /* + * FIXME: + * the ULP spec. begs for waiting for oustanding commands + */ + case ZFCP_ERP_STEP_UNINITIALIZED: + zfcp_erp_port_strategy_clearstati(port); + /* + * it would be sufficient to test only the normal open flag + * since the phys. open flag cannot be set if the normal + * open flag is unset - however, this is for readabilty ... + */ + if (atomic_test_mask((ZFCP_STATUS_PORT_PHYS_OPEN | + ZFCP_STATUS_COMMON_OPEN), &port->status) + == (ZFCP_STATUS_PORT_PHYS_OPEN | ZFCP_STATUS_COMMON_OPEN)) { + ZFCP_LOG_DEBUG("Port wwpn=0x%Lx is open -> trying " + " close physical\n", + port->wwpn); + retval = + zfcp_erp_port_forced_strategy_close(erp_action); + } else + retval = ZFCP_ERP_FAILED; + break; + + case ZFCP_ERP_STEP_PHYS_PORT_CLOSING: + if (atomic_test_mask(ZFCP_STATUS_PORT_PHYS_OPEN, + &port->status)) { + ZFCP_LOG_DEBUG + ("failed to close physical port wwpn=0x%Lx\n", + port->wwpn); + retval = ZFCP_ERP_FAILED; + } else + retval = ZFCP_ERP_SUCCEEDED; + break; + } + + debug_text_event(adapter->erp_dbf, 3, "p_pfst/ret"); + debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); + debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); + debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); + + return retval; +} + +/* + * function: + * + * purpose: this routine executes the 'Reopen Port' action + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_SUCCEEDED - action finished successfully + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_FAILED; + struct zfcp_port *port = erp_action->port; + struct zfcp_adapter *adapter = erp_action->adapter; + + switch (erp_action->step) { + + /* + * FIXME: + * the ULP spec. begs for waiting for oustanding commands + */ + case ZFCP_ERP_STEP_UNINITIALIZED: + zfcp_erp_port_strategy_clearstati(port); + if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) { + ZFCP_LOG_DEBUG + ("port wwpn=0x%Lx is open -> trying close\n", + port->wwpn); + retval = zfcp_erp_port_strategy_close(erp_action); + goto out; + } /* else it's already closed, open it */ + break; + + case ZFCP_ERP_STEP_PORT_CLOSING: + if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) { + ZFCP_LOG_DEBUG("failed to close port wwpn=0x%Lx\n", + port->wwpn); + retval = ZFCP_ERP_FAILED; + goto out; + } /* else it's closed now, open it */ + break; + } + if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY) + retval = ZFCP_ERP_EXIT; + else + retval = zfcp_erp_port_strategy_open(erp_action); + + out: + debug_text_event(adapter->erp_dbf, 3, "p_pst/ret"); + debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t)); + debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); + debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_port_strategy_open(struct zfcp_erp_action *erp_action) +{ + int retval; + + if (atomic_test_mask(ZFCP_STATUS_PORT_NAMESERVER, + &erp_action->port->status) + == ZFCP_STATUS_PORT_NAMESERVER) + retval = zfcp_erp_port_strategy_open_nameserver(erp_action); + else + retval = zfcp_erp_port_strategy_open_common(erp_action); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + * + * FIXME(design): currently only prepared for fabric (nameserver!) + */ +static int +zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_port *port = erp_action->port; + + switch (erp_action->step) { + + case ZFCP_ERP_STEP_UNINITIALIZED: + case ZFCP_ERP_STEP_PHYS_PORT_CLOSING: + case ZFCP_ERP_STEP_PORT_CLOSING: + if (!(adapter->nameserver_port)) { + retval = zfcp_nameserver_enqueue(adapter); + if (retval != 0) { + ZFCP_LOG_NORMAL + ("error: nameserver port not available " + "(adapter with busid %s)\n", + zfcp_get_busid_by_adapter(adapter)); + retval = ZFCP_ERP_FAILED; + break; + } + } + if (!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, + &adapter->nameserver_port->status)) { + ZFCP_LOG_DEBUG + ("nameserver port is not open -> open " + "nameserver port\n"); + /* nameserver port may live again */ + atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, + &adapter->nameserver_port->status); + zfcp_erp_port_reopen(adapter->nameserver_port, 0); + erp_action->step = ZFCP_ERP_STEP_NAMESERVER_OPEN; + retval = ZFCP_ERP_CONTINUES; + break; + } + /* else nameserver port is already open, fall through */ + case ZFCP_ERP_STEP_NAMESERVER_OPEN: + if (!atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, + &adapter->nameserver_port->status)) { + ZFCP_LOG_DEBUG("failed to open nameserver port\n"); + retval = ZFCP_ERP_FAILED; + } else { + ZFCP_LOG_DEBUG("nameserver port is open -> " + "ask nameserver for current D_ID of " + "port with WWPN 0x%Lx\n", + port->wwpn); + retval = zfcp_erp_port_strategy_open_common_lookup + (erp_action); + } + break; + + case ZFCP_ERP_STEP_NAMESERVER_LOOKUP: + if (!atomic_test_mask(ZFCP_STATUS_PORT_DID_DID, &port->status)) { + if (atomic_test_mask + (ZFCP_STATUS_PORT_INVALID_WWPN, &port->status)) { + ZFCP_LOG_DEBUG + ("failed to look up the D_ID of the port wwpn=0x%Lx " + "(misconfigured WWPN?)\n", port->wwpn); + zfcp_erp_port_failed(port); + retval = ZFCP_ERP_EXIT; + } else { + ZFCP_LOG_DEBUG + ("failed to look up the D_ID of the port wwpn=0x%Lx\n", + port->wwpn); + retval = ZFCP_ERP_FAILED; + } + } else { + ZFCP_LOG_DEBUG + ("port wwpn=0x%Lx has D_ID=0x%6.6x -> trying open\n", + port->wwpn, (unsigned int) port->d_id); + retval = zfcp_erp_port_strategy_open_port(erp_action); + } + break; + + case ZFCP_ERP_STEP_PORT_OPENING: + /* D_ID might have changed during open */ + if (atomic_test_mask((ZFCP_STATUS_COMMON_OPEN | + ZFCP_STATUS_PORT_DID_DID), + &port->status)) { + ZFCP_LOG_DEBUG("port wwpn=0x%Lx is open ", port->wwpn); + retval = ZFCP_ERP_SUCCEEDED; + } else { + ZFCP_LOG_DEBUG("failed to open port wwpn=0x%Lx\n", + port->wwpn); + retval = ZFCP_ERP_FAILED; + } + break; + + default: + ZFCP_LOG_NORMAL("bug: unkown erp step 0x%x\n", + erp_action->step); + retval = ZFCP_ERP_FAILED; + } + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *erp_action) +{ + int retval; + struct zfcp_port *port = erp_action->port; + + switch (erp_action->step) { + + case ZFCP_ERP_STEP_UNINITIALIZED: + case ZFCP_ERP_STEP_PHYS_PORT_CLOSING: + case ZFCP_ERP_STEP_PORT_CLOSING: + ZFCP_LOG_DEBUG + ("port wwpn=0x%Lx has D_ID=0x%6.6x -> trying open\n", + port->wwpn, (unsigned int) port->d_id); + retval = zfcp_erp_port_strategy_open_port(erp_action); + break; + + case ZFCP_ERP_STEP_PORT_OPENING: + if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) { + ZFCP_LOG_DEBUG("nameserver port is open\n"); + retval = ZFCP_ERP_SUCCEEDED; + } else { + ZFCP_LOG_DEBUG("failed to open nameserver port\n"); + retval = ZFCP_ERP_FAILED; + } + /* this is needed anyway (dont care for retval of wakeup) */ + ZFCP_LOG_DEBUG("continue other open port operations\n"); + zfcp_erp_port_strategy_open_nameserver_wakeup(erp_action); + break; + + default: + ZFCP_LOG_NORMAL("bug: unkown erp step 0x%x\n", + erp_action->step); + retval = ZFCP_ERP_FAILED; + } + + return retval; +} + +/* + * function: + * + * purpose: makes the erp thread continue with reopen (physical) port + * actions which have been paused until the name server port + * is opened (or failed) + * + * returns: 0 (a kind of void retval, its not used) + */ +static int +zfcp_erp_port_strategy_open_nameserver_wakeup(struct zfcp_erp_action + *ns_erp_action) +{ + int retval = 0; + unsigned long flags; + struct zfcp_adapter *adapter = ns_erp_action->adapter; + struct zfcp_erp_action *erp_action, *tmp; + + read_lock_irqsave(&adapter->erp_lock, flags); + list_for_each_entry_safe(erp_action, tmp, &adapter->erp_running_head, + list) { + debug_text_event(adapter->erp_dbf, 4, "p_pstnsw_n"); + debug_event(adapter->erp_dbf, 4, &erp_action->port->wwpn, + sizeof (wwn_t)); + if (erp_action->step == ZFCP_ERP_STEP_NAMESERVER_OPEN) { + debug_text_event(adapter->erp_dbf, 3, "p_pstnsw_w"); + debug_event(adapter->erp_dbf, 3, + &erp_action->port->wwpn, sizeof (wwn_t)); + zfcp_erp_action_ready(erp_action); + } + } + read_unlock_irqrestore(&adapter->erp_lock, flags); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *erp_action) +{ + int retval; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_port *port = erp_action->port; + + zfcp_erp_timeout_init(erp_action); + retval = zfcp_fsf_close_physical_port(erp_action); + if (retval == -ENOMEM) { + debug_text_event(adapter->erp_dbf, 5, "o_pfstc_nomem"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_NOMEM; + goto out; + } + erp_action->step = ZFCP_ERP_STEP_PHYS_PORT_CLOSING; + if (retval != 0) { + debug_text_event(adapter->erp_dbf, 5, "o_pfstc_cpf"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + /* could not send 'open', fail */ + retval = ZFCP_ERP_FAILED; + goto out; + } + debug_text_event(adapter->erp_dbf, 6, "o_pfstc_cpok"); + debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_CONTINUES; + out: + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_port_strategy_clearstati(struct zfcp_port *port) +{ + int retval = 0; + struct zfcp_adapter *adapter = port->adapter; + + debug_text_event(adapter->erp_dbf, 5, "p_pstclst"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + + atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING | + ZFCP_STATUS_COMMON_CLOSING | + ZFCP_STATUS_PORT_DID_DID | + ZFCP_STATUS_PORT_PHYS_CLOSING | + ZFCP_STATUS_PORT_INVALID_WWPN, &port->status); + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_port_strategy_close(struct zfcp_erp_action *erp_action) +{ + int retval; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_port *port = erp_action->port; + + zfcp_erp_timeout_init(erp_action); + retval = zfcp_fsf_close_port(erp_action); + if (retval == -ENOMEM) { + debug_text_event(adapter->erp_dbf, 5, "p_pstc_nomem"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_NOMEM; + goto out; + } + erp_action->step = ZFCP_ERP_STEP_PORT_CLOSING; + if (retval != 0) { + debug_text_event(adapter->erp_dbf, 5, "p_pstc_cpf"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + /* could not send 'close', fail */ + retval = ZFCP_ERP_FAILED; + goto out; + } + debug_text_event(adapter->erp_dbf, 6, "p_pstc_cpok"); + debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_CONTINUES; + out: + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *erp_action) +{ + int retval; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_port *port = erp_action->port; + + zfcp_erp_timeout_init(erp_action); + retval = zfcp_fsf_open_port(erp_action); + if (retval == -ENOMEM) { + debug_text_event(adapter->erp_dbf, 5, "p_psto_nomem"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_NOMEM; + goto out; + } + erp_action->step = ZFCP_ERP_STEP_PORT_OPENING; + if (retval != 0) { + debug_text_event(adapter->erp_dbf, 5, "p_psto_opf"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + /* could not send 'open', fail */ + retval = ZFCP_ERP_FAILED; + goto out; + } + debug_text_event(adapter->erp_dbf, 6, "p_psto_opok"); + debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_CONTINUES; + out: + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_port_strategy_open_common_lookup(struct zfcp_erp_action *erp_action) +{ + int retval; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_port *port = erp_action->port; + + zfcp_erp_timeout_init(erp_action); + retval = zfcp_nameserver_request(erp_action); + if (retval == -ENOMEM) { + debug_text_event(adapter->erp_dbf, 5, "p_pstn_nomem"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_NOMEM; + goto out; + } + erp_action->step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP; + if (retval != 0) { + debug_text_event(adapter->erp_dbf, 5, "p_pstn_ref"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + /* could not send nameserver request, fail */ + retval = ZFCP_ERP_FAILED; + goto out; + } + debug_text_event(adapter->erp_dbf, 6, "p_pstn_reok"); + debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t)); + retval = ZFCP_ERP_CONTINUES; + out: + return retval; +} + +/* + * function: + * + * purpose: this routine executes the 'Reopen Unit' action + * currently no retries + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_SUCCEEDED - action finished successfully + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_unit_strategy(struct zfcp_erp_action *erp_action) +{ + int retval = ZFCP_ERP_FAILED; + struct zfcp_unit *unit = erp_action->unit; + struct zfcp_adapter *adapter = erp_action->adapter; + + switch (erp_action->step) { + + /* + * FIXME: + * the ULP spec. begs for waiting for oustanding commands + */ + case ZFCP_ERP_STEP_UNINITIALIZED: + zfcp_erp_unit_strategy_clearstati(unit); + if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) { + ZFCP_LOG_DEBUG + ("unit fcp_lun=0x%Lx is open -> trying close\n", + unit->fcp_lun); + retval = zfcp_erp_unit_strategy_close(erp_action); + break; + } + /* else it's already closed, fall through */ + case ZFCP_ERP_STEP_UNIT_CLOSING: + if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) { + ZFCP_LOG_DEBUG("failed to close unit fcp_lun=0x%Lx\n", + unit->fcp_lun); + retval = ZFCP_ERP_FAILED; + } else { + if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY) + retval = ZFCP_ERP_EXIT; + else { + ZFCP_LOG_DEBUG("unit fcp_lun=0x%Lx is not " + "open -> trying open\n", + unit->fcp_lun); + retval = + zfcp_erp_unit_strategy_open(erp_action); + } + } + break; + + case ZFCP_ERP_STEP_UNIT_OPENING: + if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) { + ZFCP_LOG_DEBUG("unit fcp_lun=0x%Lx is open\n", + unit->fcp_lun); + retval = ZFCP_ERP_SUCCEEDED; + } else { + ZFCP_LOG_DEBUG("failed to open unit fcp_lun=0x%Lx\n", + unit->fcp_lun); + retval = ZFCP_ERP_FAILED; + } + break; + } + + debug_text_event(adapter->erp_dbf, 3, "u_ust/ret"); + debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof (fcp_lun_t)); + debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int)); + debug_event(adapter->erp_dbf, 3, &retval, sizeof (int)); + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit) +{ + int retval = 0; + struct zfcp_adapter *adapter = unit->port->adapter; + + debug_text_event(adapter->erp_dbf, 5, "u_ustclst"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t)); + + atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING | + ZFCP_STATUS_COMMON_CLOSING, &unit->status); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_unit_strategy_close(struct zfcp_erp_action *erp_action) +{ + int retval; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_unit *unit = erp_action->unit; + + zfcp_erp_timeout_init(erp_action); + retval = zfcp_fsf_close_unit(erp_action); + if (retval == -ENOMEM) { + debug_text_event(adapter->erp_dbf, 5, "u_ustc_nomem"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, + sizeof (fcp_lun_t)); + retval = ZFCP_ERP_NOMEM; + goto out; + } + erp_action->step = ZFCP_ERP_STEP_UNIT_CLOSING; + if (retval != 0) { + debug_text_event(adapter->erp_dbf, 5, "u_ustc_cuf"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, + sizeof (fcp_lun_t)); + /* could not send 'close', fail */ + retval = ZFCP_ERP_FAILED; + goto out; + } + debug_text_event(adapter->erp_dbf, 6, "u_ustc_cuok"); + debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); + retval = ZFCP_ERP_CONTINUES; + + out: + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) + * ZFCP_ERP_FAILED - action finished unsuccessfully + */ +static int +zfcp_erp_unit_strategy_open(struct zfcp_erp_action *erp_action) +{ + int retval; + struct zfcp_adapter *adapter = erp_action->adapter; + struct zfcp_unit *unit = erp_action->unit; + + zfcp_erp_timeout_init(erp_action); + retval = zfcp_fsf_open_unit(erp_action); + if (retval == -ENOMEM) { + debug_text_event(adapter->erp_dbf, 5, "u_usto_nomem"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, + sizeof (fcp_lun_t)); + retval = ZFCP_ERP_NOMEM; + goto out; + } + erp_action->step = ZFCP_ERP_STEP_UNIT_OPENING; + if (retval != 0) { + debug_text_event(adapter->erp_dbf, 5, "u_usto_ouf"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, + sizeof (fcp_lun_t)); + /* could not send 'open', fail */ + retval = ZFCP_ERP_FAILED; + goto out; + } + debug_text_event(adapter->erp_dbf, 6, "u_usto_ouok"); + debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t)); + retval = ZFCP_ERP_CONTINUES; + out: + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static inline void +zfcp_erp_timeout_init(struct zfcp_erp_action *erp_action) +{ + init_timer(&erp_action->timer); + erp_action->timer.function = zfcp_erp_timeout_handler; + erp_action->timer.data = (unsigned long) erp_action; + /* jiffies will be added in zfcp_fsf_req_send */ + erp_action->timer.expires = ZFCP_ERP_FSFREQ_TIMEOUT; +} + +/* + * function: + * + * purpose: enqueue the specified error recovery action, if needed + * + * returns: + */ +static int +zfcp_erp_action_enqueue(int action, + struct zfcp_adapter *adapter, + struct zfcp_port *port, struct zfcp_unit *unit) +{ + int retval = -1; + struct zfcp_erp_action *erp_action = NULL; + int stronger_action = 0; + u32 status = 0; + + /* + * We need some rules here which check whether we really need + * this action or whether we should just drop it. + * E.g. if there is a unfinished 'Reopen Port' request then we drop a + * 'Reopen Unit' request for an associated unit since we can't + * satisfy this request now. A 'Reopen Port' action will trigger + * 'Reopen Unit' actions when it completes. + * Thus, there are only actions in the queue which can immediately be + * executed. This makes the processing of the action queue more + * efficient. + */ + + debug_event(adapter->erp_dbf, 4, &action, sizeof (int)); + /* check whether we really need this */ + switch (action) { + case ZFCP_ERP_ACTION_REOPEN_UNIT: + if (atomic_test_mask + (ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)) { + debug_text_event(adapter->erp_dbf, 4, "u_actenq_drp"); + debug_event(adapter->erp_dbf, 4, &port->wwpn, + sizeof (wwn_t)); + debug_event(adapter->erp_dbf, 4, &unit->fcp_lun, + sizeof (fcp_lun_t)); + goto out; + } + if (!atomic_test_mask + (ZFCP_STATUS_COMMON_UNBLOCKED, &port->status)) { + stronger_action = ZFCP_ERP_ACTION_REOPEN_PORT; + unit = NULL; + } + /* fall through !!! */ + + case ZFCP_ERP_ACTION_REOPEN_PORT: + if (atomic_test_mask + (ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)) { + debug_text_event(adapter->erp_dbf, 4, "p_actenq_drp"); + debug_event(adapter->erp_dbf, 4, &port->wwpn, + sizeof (wwn_t)); + goto out; + } + /* fall through !!! */ + + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: + if (atomic_test_mask + (ZFCP_STATUS_COMMON_ERP_INUSE, &port->status) + && port->erp_action.action == + ZFCP_ERP_ACTION_REOPEN_PORT_FORCED) { + debug_text_event(adapter->erp_dbf, 4, "pf_actenq_drp"); + debug_event(adapter->erp_dbf, 4, &port->wwpn, + sizeof (wwn_t)); + goto out; + } + if (!atomic_test_mask + (ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status)) { + stronger_action = ZFCP_ERP_ACTION_REOPEN_ADAPTER; + port = NULL; + } + /* fall through !!! */ + + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + if (atomic_test_mask + (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)) { + debug_text_event(adapter->erp_dbf, 4, "a_actenq_drp"); + goto out; + } + break; + + default: + debug_text_exception(adapter->erp_dbf, 1, "a_actenq_bug"); + debug_event(adapter->erp_dbf, 1, &action, sizeof (int)); + ZFCP_LOG_NORMAL("bug: Unknown error recovery procedure " + "action requested on the adapter %s " + "(debug info %d)\n", + zfcp_get_busid_by_adapter(adapter), action); + goto out; + } + + /* check whether we need something stronger first */ + if (stronger_action) { + debug_text_event(adapter->erp_dbf, 4, "a_actenq_str"); + debug_event(adapter->erp_dbf, 4, &stronger_action, + sizeof (int)); + ZFCP_LOG_DEBUG("shortcut: need erp action %i before " + "erp action %i (adapter busid=%s)\n", + stronger_action, action, + zfcp_get_busid_by_adapter(adapter)); + action = stronger_action; + } + + /* mark adapter to have some error recovery pending */ + atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, &adapter->status); + + /* setup error recovery action */ + switch (action) { + + case ZFCP_ERP_ACTION_REOPEN_UNIT: + zfcp_unit_get(unit); + atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status); + erp_action = &unit->erp_action; + if (!atomic_test_mask + (ZFCP_STATUS_COMMON_RUNNING, &unit->status)) + status = ZFCP_STATUS_ERP_CLOSE_ONLY; + break; + + case ZFCP_ERP_ACTION_REOPEN_PORT: + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: + zfcp_port_get(port); + zfcp_erp_action_dismiss_port(port); + atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status); + erp_action = &port->erp_action; + if (!atomic_test_mask + (ZFCP_STATUS_COMMON_RUNNING, &port->status)) + status = ZFCP_STATUS_ERP_CLOSE_ONLY; + break; + + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + zfcp_adapter_get(adapter); + zfcp_erp_action_dismiss_adapter(adapter); + atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status); + erp_action = &adapter->erp_action; + if (!atomic_test_mask + (ZFCP_STATUS_COMMON_RUNNING, &adapter->status)) + status = ZFCP_STATUS_ERP_CLOSE_ONLY; + break; + } + + debug_text_event(adapter->erp_dbf, 4, "a_actenq"); + + memset(erp_action, 0, sizeof (struct zfcp_erp_action)); + erp_action->adapter = adapter; + erp_action->port = port; + erp_action->unit = unit; + erp_action->action = action; + erp_action->status = status; + + /* finally put it into 'ready' queue and kick erp thread */ + list_add(&erp_action->list, &adapter->erp_ready_head); + up(&adapter->erp_ready_sem); + retval = 0; + out: + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static int +zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 4, "a_actdeq"); + debug_event(adapter->erp_dbf, 4, &erp_action->action, sizeof (int)); + list_del(&erp_action->list); + switch (erp_action->action) { + case ZFCP_ERP_ACTION_REOPEN_UNIT: + atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE, + &erp_action->unit->status); + zfcp_unit_put(erp_action->unit); + break; + case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: + case ZFCP_ERP_ACTION_REOPEN_PORT: + atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE, + &erp_action->port->status); + zfcp_port_put(erp_action->port); + break; + case ZFCP_ERP_ACTION_REOPEN_ADAPTER: + atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE, + &erp_action->adapter->status); + zfcp_adapter_put(adapter); + break; + default: + /* bug */ + break; + } + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter) +{ + int retval = 0; + struct zfcp_port *port; + + debug_text_event(adapter->erp_dbf, 5, "a_actab"); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)) + zfcp_erp_action_dismiss(&adapter->erp_action); + else + list_for_each_entry(port, &adapter->port_list_head, list) + zfcp_erp_action_dismiss_port(port); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +zfcp_erp_action_dismiss_port(struct zfcp_port *port) +{ + int retval = 0; + struct zfcp_unit *unit; + struct zfcp_adapter *adapter = port->adapter; + + debug_text_event(adapter->erp_dbf, 5, "p_actab"); + debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t)); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)) + zfcp_erp_action_dismiss(&port->erp_action); + else + list_for_each_entry(unit, &port->unit_list_head, list) + zfcp_erp_action_dismiss_unit(unit); + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: FIXME + */ +static int +zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit) +{ + int retval = 0; + struct zfcp_adapter *adapter = unit->port->adapter; + + debug_text_event(adapter->erp_dbf, 5, "u_actab"); + debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t)); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)) + zfcp_erp_action_dismiss(&unit->erp_action); + + return retval; +} + +/* + * function: + * + * purpose: moves erp_action to 'erp running list' + * + * returns: + */ +static inline void +zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 6, "a_toru"); + debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int)); + list_move(&erp_action->list, &erp_action->adapter->erp_running_head); +} + +/* + * function: + * + * purpose: moves erp_action to 'erp ready list' + * + * returns: + */ +static inline void +zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action) +{ + struct zfcp_adapter *adapter = erp_action->adapter; + + debug_text_event(adapter->erp_dbf, 6, "a_tore"); + debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int)); + list_move(&erp_action->list, &erp_action->adapter->erp_ready_head); +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_ext.h Wed Oct 8 12:24:57 2003 @@ -0,0 +1,163 @@ +/* + * + * linux/drivers/s390/scsi/zfcp_ext.h + * + * FCP adapter driver for IBM eServer zSeries + * + * Copyright 2002 IBM Corporation + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef ZFCP_EXT_H +#define ZFCP_EXT_H +/* this drivers version (do not edit !!! generated and updated by cvs) */ +#define ZFCP_EXT_REVISION "$Revision: 1.33 $" + +#ifdef __KERNEL__ + +#include "zfcp_def.h" + +extern struct zfcp_data zfcp_data; + +/******************************** SYSFS *************************************/ +extern int zfcp_sysfs_driver_create_files(struct device_driver *); +extern void zfcp_sysfs_driver_remove_files(struct device_driver *); +extern int zfcp_sysfs_adapter_create_files(struct device *); +extern void zfcp_sysfs_adapter_remove_files(struct device *); +extern int zfcp_sysfs_port_create_files(struct device *, u32); +extern int zfcp_sysfs_unit_create_files(struct device *); +extern void zfcp_sysfs_port_release(struct device *); +extern int zfcp_sysfs_port_shutdown(struct zfcp_port *); +extern void zfcp_sysfs_unit_release(struct device *); + +/**************************** CONFIGURATION *********************************/ +extern struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *, + fcp_lun_t fcp_lun); +extern struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *, + wwn_t wwpn); +extern struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *); +extern void zfcp_adapter_dequeue(struct zfcp_adapter *); +extern struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *, wwn_t, u32); +extern void zfcp_port_dequeue(struct zfcp_port *); +extern struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *, fcp_lun_t); +extern void zfcp_unit_dequeue(struct zfcp_unit *); + +/******************************* S/390 IO ************************************/ +extern int zfcp_ccw_register(void); +extern void zfcp_ccw_unregister(void); + +extern int zfcp_initialize_with_0copy(struct zfcp_adapter *); +extern void zfcp_qdio_zero_sbals(struct qdio_buffer **, int, int); +extern int zfcp_qdio_allocate(struct zfcp_adapter *); +extern int zfcp_qdio_allocate_queues(struct zfcp_adapter *); +extern void zfcp_qdio_free_queues(struct zfcp_adapter *); +extern int zfcp_qdio_determine_pci(struct zfcp_qdio_queue *, + struct zfcp_fsf_req *); +extern int zfcp_qdio_reqid_check(struct zfcp_adapter *, void *); + +/******************************** FSF ****************************************/ +extern int zfcp_fsf_open_port(struct zfcp_erp_action *); +extern int zfcp_fsf_close_port(struct zfcp_erp_action *); +extern int zfcp_fsf_close_physical_port(struct zfcp_erp_action *); + +extern int zfcp_fsf_open_unit(struct zfcp_erp_action *); +extern int zfcp_fsf_close_unit(struct zfcp_erp_action *); + +extern int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *); +extern void zfcp_fsf_scsi_er_timeout_handler(unsigned long); +extern int zfcp_fsf_req_dismiss_all(struct zfcp_adapter *); +extern int zfcp_fsf_status_read(struct zfcp_adapter *, int); +extern int zfcp_fsf_req_create(struct zfcp_adapter *,u32, unsigned long *, + int, struct zfcp_fsf_req **); +extern void zfcp_fsf_req_free(struct zfcp_fsf_req *); +extern int zfcp_fsf_send_generic(struct zfcp_fsf_req *, unsigned char, + unsigned long *, struct timer_list *); +extern int zfcp_fsf_req_wait_and_cleanup(struct zfcp_fsf_req *, int, u32 *); +extern int zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *, + struct zfcp_unit *, Scsi_Cmnd *, + int); +extern int zfcp_fsf_req_complete(struct zfcp_fsf_req *); +extern void zfcp_fsf_incoming_els(struct zfcp_fsf_req *); +extern void zfcp_fsf_req_cleanup(struct zfcp_fsf_req *); +extern struct zfcp_fsf_req *zfcp_fsf_send_fcp_command_task_management( + struct zfcp_adapter *, struct zfcp_unit *, u8, int); +extern struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command( + unsigned long, struct zfcp_adapter *, struct zfcp_unit *, int); + +/******************************** FCP ****************************************/ +extern int zfcp_nameserver_enqueue(struct zfcp_adapter *); +extern int zfcp_nameserver_request(struct zfcp_erp_action *); +extern void zfcp_fsf_els_processing(struct zfcp_fsf_req *); + +/******************************* SCSI ****************************************/ +extern int zfcp_adapter_scsi_register(struct zfcp_adapter *); +extern void zfcp_adapter_scsi_unregister(struct zfcp_adapter *); +extern void zfcp_scsi_block_requests(struct Scsi_Host *); +extern void zfcp_scsi_insert_into_fake_queue(struct zfcp_adapter *, + Scsi_Cmnd *); +extern void zfcp_scsi_process_and_clear_fake_queue(unsigned long); +extern int zfcp_create_sbals_from_sg(struct zfcp_fsf_req *, + Scsi_Cmnd *, char, int, int); +extern void zfcp_set_fcp_dl(struct fcp_cmnd_iu *, fcp_dl_t); +extern char *zfcp_get_fcp_rsp_info_ptr(struct fcp_rsp_iu *); +extern void set_host_byte(u32 *, char); +extern void set_driver_byte(u32 *, char); +extern char *zfcp_get_fcp_sns_info_ptr(struct fcp_rsp_iu *); +extern void zfcp_fsf_start_scsi_er_timer(struct zfcp_adapter *); +extern fcp_dl_t zfcp_get_fcp_dl(struct fcp_cmnd_iu *); + +/******************************** ERP ****************************************/ +extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u32, int); +extern int zfcp_erp_adapter_reopen(struct zfcp_adapter *, int); +extern int zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int); +extern int zfcp_erp_adapter_shutdown_all(void); +extern void zfcp_erp_adapter_failed(struct zfcp_adapter *); + +extern void zfcp_erp_modify_port_status(struct zfcp_port *, u32, int); +extern int zfcp_erp_port_reopen(struct zfcp_port *, int); +extern int zfcp_erp_port_shutdown(struct zfcp_port *, int); +extern int zfcp_erp_port_forced_reopen(struct zfcp_port *, int); +extern void zfcp_erp_port_failed(struct zfcp_port *); +extern int zfcp_erp_port_reopen_all(struct zfcp_adapter *, int); + +extern void zfcp_erp_modify_unit_status(struct zfcp_unit *, u32, int); +extern int zfcp_erp_unit_reopen(struct zfcp_unit *, int); +extern int zfcp_erp_unit_shutdown(struct zfcp_unit *, int); +extern void zfcp_erp_unit_failed(struct zfcp_unit *); + +extern void zfcp_erp_scsi_low_mem_buffer_timeout_handler(unsigned long); +extern int zfcp_erp_thread_setup(struct zfcp_adapter *); +extern int zfcp_erp_thread_kill(struct zfcp_adapter *); +extern int zfcp_erp_wait(struct zfcp_adapter *); +extern void zfcp_erp_fsf_req_handler(struct zfcp_fsf_req *); + +/******************************** AUX ****************************************/ +extern void zfcp_cmd_dbf_event_fsf(const char *, struct zfcp_fsf_req *, + void *, int); +extern void zfcp_cmd_dbf_event_scsi(const char *, Scsi_Cmnd *); +extern void zfcp_in_els_dbf_event(struct zfcp_adapter *, const char *, + struct fsf_status_read_buffer *, int); +#ifdef ZFCP_STAT_REQSIZES +extern int zfcp_statistics_inc(struct list_head *, u32); +#endif +#endif /* __KERNEL__ */ +#endif /* ZFCP_EXT_H */ diff -Nru a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_fsf.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,4284 @@ +/* + * + * linux/drivers/s390/scsi/zfcp_fsf.c + * + * FCP adapter driver for IBM eServer zSeries + * + * Copyright 2002 IBM Corporation + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* this drivers version (do not edit !!! generated and updated by cvs) */ +#define ZFCP_FSF_C_REVISION "$Revision: 1.12 $" + +#include "zfcp_ext.h" + +static int zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_open_port_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_close_port_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_send_fcp_command_task_management_handler( + struct zfcp_fsf_req *); +static int zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_send_generic_handler(struct zfcp_fsf_req *); +static int zfcp_fsf_status_read_handler(struct zfcp_fsf_req *); +static inline int zfcp_fsf_req_create_sbal_check( + unsigned long *, struct zfcp_qdio_queue *, int); +static struct zfcp_fsf_req *zfcp_fsf_req_get(int, mempool_t *); +static struct zfcp_fsf_req *zfcp_fsf_req_alloc(struct zfcp_adapter *, u32, int); +static int zfcp_fsf_req_send(struct zfcp_fsf_req *, struct timer_list *); +static int zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *); +static int zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *); +static int zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *); +static int zfcp_fsf_req_dispatch(struct zfcp_fsf_req *); +static void zfcp_fsf_req_dismiss(struct zfcp_fsf_req *); + +/* association between FSF command and FSF QTCB type */ +static u32 fsf_qtcb_type[] = { + [FSF_QTCB_FCP_CMND] = FSF_IO_COMMAND, + [FSF_QTCB_ABORT_FCP_CMND] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_OPEN_PORT_WITH_DID] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_OPEN_LUN] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_CLOSE_LUN] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_CLOSE_PORT] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_CLOSE_PHYSICAL_PORT] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_SEND_ELS] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_SEND_GENERIC] = FSF_SUPPORT_COMMAND, + [FSF_QTCB_EXCHANGE_CONFIG_DATA] = FSF_CONFIG_COMMAND +}; + +/****************************************************************/ +/*************** FSF related Functions *************************/ +/****************************************************************/ + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_FSF +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_FSF + +/* + * function: zfcp_fsf_req_alloc + * + * purpose: Obtains an fsf_req and potentially a qtcb (for all but + * unsolicited requests) via helper functions + * Does some initial fsf request set-up. + * + * returns: pointer to allocated fsf_req if successfull + * NULL otherwise + * + * locks: none + * + */ +static struct zfcp_fsf_req * +zfcp_fsf_req_alloc(struct zfcp_adapter *adapter, u32 fsf_cmd, int kmalloc_flags) +{ + struct zfcp_fsf_req *fsf_req = NULL; + + switch (fsf_cmd) { + + case FSF_QTCB_FCP_CMND: + case FSF_QTCB_ABORT_FCP_CMND: + fsf_req = zfcp_fsf_req_get(kmalloc_flags, + adapter->pool.fcp_command_fsf); + if (fsf_req && (fsf_req->status & ZFCP_STATUS_FSFREQ_POOL)) { + /* + * watch low mem buffer + * Note: If the command is reset or aborted, two + * timeouts (this and the SCSI ER one) will be started + * for the command. There is no problem however as + * the first expired timer will call adapter_reopen + * which will delete the other + */ + adapter->pool.fcp_command_fsf_timer.expires = + jiffies + ZFCP_ERP_SCSI_LOW_MEM_TIMEOUT; + add_timer(&adapter->pool.fcp_command_fsf_timer); + } +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 5, "fsfa_fcp"); + if (fsf_req && (fsf_req->status & ZFCP_STATUS_FSFREQ_POOL)) + debug_text_event(adapter->req_dbf, 5, "fsfa_pl"); +#endif /* ZFCP_DEBUG_REQUESTS */ + break; + + case FSF_QTCB_OPEN_PORT_WITH_DID: + case FSF_QTCB_OPEN_LUN: + case FSF_QTCB_CLOSE_LUN: + case FSF_QTCB_CLOSE_PORT: + case FSF_QTCB_CLOSE_PHYSICAL_PORT: + case FSF_QTCB_SEND_ELS: + case FSF_QTCB_EXCHANGE_CONFIG_DATA: + case FSF_QTCB_SEND_GENERIC: + fsf_req = + zfcp_fsf_req_get(kmalloc_flags, adapter->pool.erp_fsf); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 5, "fsfa_erp"); + if (fsf_req && (fsf_req->status & ZFCP_STATUS_FSFREQ_POOL)) + debug_text_event(adapter->req_dbf, 5, "fsfa_pl"); +#endif /* ZFCP_DEBUG_REQUESTS */ + break; + + case FSF_QTCB_UNSOLICITED_STATUS: + fsf_req = + mempool_alloc(adapter->pool.status_read_fsf, GFP_ATOMIC); + if (fsf_req) { + memset(fsf_req, 0, sizeof (struct zfcp_fsf_req)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_POOL; + } else + ZFCP_LOG_NORMAL("bug: could not find free fsf_req\n"); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 5, "fsfa_sr"); + debug_text_event(adapter->req_dbf, 5, "fsfa_pl"); +#endif /* ZFCP_DEBUG_REQUESTS */ + break; + + default: + ZFCP_LOG_NORMAL("bug: An attempt to send an unsupported " + "command has been detected. " + "(debug info 0x%x)\n", fsf_cmd); + } //switch(fsf_cmd) + + if (!fsf_req) { + ZFCP_LOG_DEBUG("error: Out of memory. Allocation of FSF " + "request structure failed\n"); + } else { + ZFCP_LOG_TRACE("FSF request allocated at 0x%lx, " + "adapter 0x%lx (%s)\n", + (unsigned long) fsf_req, + (unsigned long) adapter, + zfcp_get_busid_by_adapter(adapter)); + } + +#ifdef ZFCP_DEBUG_REQUESTS + debug_event(adapter->req_dbf, 5, &fsf_req, sizeof (unsigned long)); + if (fsf_req->qtcb) + debug_event(adapter->req_dbf, 5, &fsf_req->qtcb, + sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + + return fsf_req; +} + +/* + * function: zfcp_fsf_req_free + * + * purpose: Frees the memory of an fsf_req (and potentially a qtcb) or + * returns it into the pool via helper functions. + * + * returns: sod all + * + * locks: none + */ +void +zfcp_fsf_req_free(struct zfcp_fsf_req *fsf_req) +{ + struct zfcp_adapter *adapter = fsf_req->adapter; + + switch (fsf_req->fsf_command) { + + case FSF_QTCB_FCP_CMND: + case FSF_QTCB_ABORT_FCP_CMND: + if (fsf_req->status & ZFCP_STATUS_FSFREQ_POOL) { + del_timer(&adapter->pool.fcp_command_fsf_timer); + mempool_free(fsf_req, adapter->pool.fcp_command_fsf); + } else + kfree(fsf_req); + break; + + case FSF_QTCB_OPEN_PORT_WITH_DID: + case FSF_QTCB_OPEN_LUN: + case FSF_QTCB_CLOSE_LUN: + case FSF_QTCB_CLOSE_PORT: + case FSF_QTCB_CLOSE_PHYSICAL_PORT: + case FSF_QTCB_SEND_ELS: + case FSF_QTCB_EXCHANGE_CONFIG_DATA: + case FSF_QTCB_SEND_GENERIC: + if (fsf_req->status & ZFCP_STATUS_FSFREQ_POOL) + mempool_free(fsf_req, adapter->pool.erp_fsf); + else + kfree(fsf_req); + break; + + case FSF_QTCB_UNSOLICITED_STATUS: + mempool_free(fsf_req, adapter->pool.status_read_fsf); + break; + } +} + +/* + * function: + * + * purpose: + * + * returns: + * + * note: qdio queues shall be down (no ongoing inbound processing) + */ +int +zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) +{ + int retval = 0; + struct zfcp_fsf_req *fsf_req, *tmp; + + list_for_each_entry_safe(fsf_req, tmp, &adapter->fsf_req_list_head, + list) + zfcp_fsf_req_dismiss(fsf_req); + /* wait_event_timeout? */ + while (!list_empty(&adapter->fsf_req_list_head)) { + ZFCP_LOG_DEBUG("fsf req list of adapter %s not yet empty\n", + zfcp_get_busid_by_adapter(adapter)); + /* wait for woken intiators to clean up their requests */ + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(ZFCP_FSFREQ_CLEANUP_TIMEOUT); + } + + /* consistency check */ + if (atomic_read(&adapter->fsf_reqs_active)) { + ZFCP_LOG_NORMAL("bug: There are still %d FSF requests pending " + "on adapter %s after cleanup.\n", + atomic_read(&adapter->fsf_reqs_active), + zfcp_get_busid_by_adapter(adapter)); + atomic_set(&adapter->fsf_reqs_active, 0); + } + + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +static void +zfcp_fsf_req_dismiss(struct zfcp_fsf_req *fsf_req) +{ + fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; + zfcp_fsf_req_complete(fsf_req); +} + +/* + * function: zfcp_fsf_req_complete + * + * purpose: Updates active counts and timers for openfcp-reqs + * May cleanup request after req_eval returns + * + * returns: 0 - success + * !0 - failure + * + * context: + */ +int +zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + int cleanup; + struct zfcp_adapter *adapter = fsf_req->adapter; + + /* do some statistics */ + atomic_dec(&adapter->fsf_reqs_active); + + if (fsf_req->fsf_command == FSF_QTCB_UNSOLICITED_STATUS) { + ZFCP_LOG_DEBUG("Status read response received\n"); + /* + * Note: all cleanup handling is done in the callchain of + * the function call-chain below. + */ + zfcp_fsf_status_read_handler(fsf_req); + goto out; + } else + zfcp_fsf_protstatus_eval(fsf_req); + + /* + * fsf_req may be deleted due to waking up functions, so + * cleanup is saved here and used later + */ + if (fsf_req->status & ZFCP_STATUS_FSFREQ_CLEANUP) + cleanup = 1; + else + cleanup = 0; + + fsf_req->status |= ZFCP_STATUS_FSFREQ_COMPLETED; + + /* cleanup request if requested by initiator */ + if (cleanup) { + ZFCP_LOG_TRACE("removing FSF request 0x%lx\n", + (unsigned long) fsf_req); + /* + * lock must not be held here since it will be + * grabed by the called routine, too + */ + zfcp_fsf_req_cleanup(fsf_req); + } else { + /* notify initiator waiting for the requests completion */ + ZFCP_LOG_TRACE("waking initiator of FSF request 0x%lx\n", + (unsigned long) fsf_req); + wake_up(&fsf_req->completion_wq); + } + + out: + return retval; +} + +/* + * function: zfcp_fsf_protstatus_eval + * + * purpose: evaluates the QTCB of the finished FSF request + * and initiates appropriate actions + * (usually calling FSF command specific handlers) + * + * returns: + * + * context: + * + * locks: + */ +static int +zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + struct zfcp_adapter *adapter = fsf_req->adapter; + + ZFCP_LOG_DEBUG("QTCB is at 0x%lx\n", (unsigned long) fsf_req->qtcb); + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_DISMISSED) { + ZFCP_LOG_DEBUG("fsf_req 0x%lx has been dismissed\n", + (unsigned long) fsf_req); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | + ZFCP_STATUS_FSFREQ_RETRY; /* only for SCSI cmnds. */ + zfcp_cmd_dbf_event_fsf("dismiss", fsf_req, NULL, 0); + goto skip_protstatus; + } + + /* log additional information provided by FSF (if any) */ + if (fsf_req->qtcb->header.log_length) { + /* do not trust them ;-) */ + if (fsf_req->qtcb->header.log_start > ZFCP_QTCB_SIZE) { + ZFCP_LOG_NORMAL + ("bug: ULP (FSF logging) log data starts " + "beyond end of packet header. Ignored. " + "(start=%i, size=%li)\n", + fsf_req->qtcb->header.log_start, ZFCP_QTCB_SIZE); + goto forget_log; + } + if ((fsf_req->qtcb->header.log_start + + fsf_req->qtcb->header.log_length) + > ZFCP_QTCB_SIZE) { + ZFCP_LOG_NORMAL("bug: ULP (FSF logging) log data ends " + "beyond end of packet header. Ignored. " + "(start=%i, length=%i, size=%li)\n", + fsf_req->qtcb->header.log_start, + fsf_req->qtcb->header.log_length, + ZFCP_QTCB_SIZE); + goto forget_log; + } + ZFCP_LOG_TRACE("ULP log data: \n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, + (char *) fsf_req->qtcb + + fsf_req->qtcb->header.log_start, + fsf_req->qtcb->header.log_length); + } + forget_log: + + /* evaluate FSF Protocol Status */ + switch (fsf_req->qtcb->prefix.prot_status) { + + case FSF_PROT_GOOD: + ZFCP_LOG_TRACE("FSF_PROT_GOOD\n"); + break; + + case FSF_PROT_FSF_STATUS_PRESENTED: + ZFCP_LOG_TRACE("FSF_PROT_FSF_STATUS_PRESENTED\n"); + break; + + case FSF_PROT_QTCB_VERSION_ERROR: + ZFCP_LOG_FLAGS(0, "FSF_PROT_QTCB_VERSION_ERROR\n"); + /* DEBUG */ + ZFCP_LOG_NORMAL("fsf_req=0x%lx, qtcb=0x%lx (0x%lx, 0x%lx)\n", + (unsigned long) fsf_req, + (unsigned long) fsf_req->qtcb, + ((unsigned long) fsf_req) & 0xFFFFFF00, + (unsigned + long) ((struct zfcp_fsf_req + *) (((unsigned long) fsf_req) & + 0xFFFFFF00))->qtcb); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) (((unsigned long) fsf_req) & 0xFFFFFF00), + sizeof (struct zfcp_fsf_req)); + ZFCP_LOG_NORMAL("error: The adapter %s contains " + "microcode of version 0x%x, the device driver " + "only supports 0x%x. Aborting.\n", + zfcp_get_busid_by_adapter(adapter), + fsf_req->qtcb->prefix.prot_status_qual. + version_error.fsf_version, ZFCP_QTCB_VERSION); + /* stop operation for this adapter */ + debug_text_exception(adapter->erp_dbf, 0, "prot_ver_err"); + zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_cmd_dbf_event_fsf("qverserr", fsf_req, + &fsf_req->qtcb->prefix.prot_status_qual, + sizeof (union fsf_prot_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PROT_SEQ_NUMB_ERROR: + ZFCP_LOG_FLAGS(0, "FSF_PROT_SEQ_NUMB_ERROR\n"); + ZFCP_LOG_NORMAL("bug: Sequence number mismatch between " + "driver (0x%x) and adapter %s (0x%x). " + "Restarting all operations on this adapter.\n", + fsf_req->qtcb->prefix.req_seq_no, + zfcp_get_busid_by_adapter(adapter), + fsf_req->qtcb->prefix.prot_status_qual. + sequence_error.exp_req_seq_no); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 1, "exp_seq!"); + debug_event(adapter->req_dbf, 1, + &fsf_req->qtcb->prefix.prot_status_qual. + sequence_error.exp_req_seq_no, 4); + debug_text_event(adapter->req_dbf, 1, "qtcb_seq!"); + debug_exception(adapter->req_dbf, 1, + &fsf_req->qtcb->prefix.req_seq_no, 4); +#endif /* ZFCP_DEBUG_REQUESTS */ + debug_text_exception(adapter->erp_dbf, 0, "prot_seq_err"); + /* restart operation on this adapter */ + zfcp_erp_adapter_reopen(adapter, 0); + zfcp_cmd_dbf_event_fsf("seqnoerr", fsf_req, + &fsf_req->qtcb->prefix.prot_status_qual, + sizeof (union fsf_prot_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_RETRY; + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PROT_UNSUPP_QTCB_TYPE: + ZFCP_LOG_FLAGS(0, "FSF_PROT_UNSUP_QTCB_TYPE\n"); + ZFCP_LOG_NORMAL("error: Packet header type used by the " + "device driver is incompatible with " + "that used on adapter %s. " + "Stopping all operations on this adapter.\n", + zfcp_get_busid_by_adapter(adapter)); + ZFCP_LOG_NORMAL("fsf_req=0x%lx, qtcb=0x%lx (0x%lx, 0x%lx)\n", + (unsigned long) fsf_req, + (unsigned long) fsf_req->qtcb, + ((unsigned long) fsf_req) & 0xFFFFFF00, + (unsigned long) ( + (struct zfcp_fsf_req *) ( + ((unsigned long) + fsf_req) & 0xFFFFFF00))->qtcb); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) (((unsigned long) fsf_req) & 0xFFFFFF00), + sizeof (struct zfcp_fsf_req)); + debug_text_exception(adapter->erp_dbf, 0, "prot_unsup_qtcb"); + zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_cmd_dbf_event_fsf("unsqtcbt", fsf_req, + &fsf_req->qtcb->prefix.prot_status_qual, + sizeof (union fsf_prot_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PROT_HOST_CONNECTION_INITIALIZING: + ZFCP_LOG_FLAGS(1, "FSF_PROT_HOST_CONNECTION_INITIALIZING\n"); + zfcp_cmd_dbf_event_fsf("hconinit", fsf_req, + &fsf_req->qtcb->prefix.prot_status_qual, + sizeof (union fsf_prot_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + atomic_set_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT, + &(adapter->status)); + debug_text_event(adapter->erp_dbf, 4, "prot_con_init"); + break; + + case FSF_PROT_DUPLICATE_REQUEST_ID: + ZFCP_LOG_FLAGS(0, "FSF_PROT_DUPLICATE_REQUEST_IDS\n"); + if (fsf_req->qtcb) { + ZFCP_LOG_NORMAL("bug: The request identifier 0x%Lx " + "to the adapter %s is ambiguous. " + "Stopping all operations on this " + "adapter.\n", + *(unsigned long long *) + (&fsf_req->qtcb->bottom.support. + req_handle), + zfcp_get_busid_by_adapter(adapter)); + } else { + ZFCP_LOG_NORMAL("bug: The request identifier 0x%lx " + "to the adapter %s is ambiguous. " + "Stopping all operations on this " + "adapter. " + "(bug: got this for an unsolicited " + "status read request)\n", + (unsigned long) fsf_req, + zfcp_get_busid_by_adapter(adapter)); + } + debug_text_exception(adapter->erp_dbf, 0, "prot_dup_id"); + zfcp_erp_adapter_shutdown(adapter, 0); + zfcp_cmd_dbf_event_fsf("dupreqid", fsf_req, + &fsf_req->qtcb->prefix.prot_status_qual, + sizeof (union fsf_prot_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PROT_LINK_DOWN: + ZFCP_LOG_FLAGS(1, "FSF_PROT_LINK_DOWN\n"); + /* + * 'test and set' is not atomic here - + * it's ok as long as calls to our response queue handler + * (and thus execution of this code here) are serialized + * by the qdio module + */ + if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, + &adapter->status)) { + switch (fsf_req->qtcb->prefix.prot_status_qual. + locallink_error.code) { + case FSF_PSQ_LINK_NOLIGHT: + ZFCP_LOG_INFO("The local link to adapter %s " + "is down (no light detected).\n", + zfcp_get_busid_by_adapter( + adapter)); + break; + case FSF_PSQ_LINK_WRAPPLUG: + ZFCP_LOG_INFO("The local link to adapter %s " + "is down (wrap plug detected).\n", + zfcp_get_busid_by_adapter( + adapter)); + break; + case FSF_PSQ_LINK_NOFCP: + ZFCP_LOG_INFO("The local link to adapter %s " + "is down (adjacent node on " + "link does not support FCP).\n", + zfcp_get_busid_by_adapter( + adapter)); + break; + default: + ZFCP_LOG_INFO("The local link to adapter %s " + "is down " + "(warning: unknown reason " + "code).\n", + zfcp_get_busid_by_adapter( + adapter)); + break; + + } + /* + * Due to the 'erp failed' flag the adapter won't + * be recovered but will be just set to 'blocked' + * state. All subordinary devices will have state + * 'blocked' and 'erp failed', too. + * Thus the adapter is still able to provide + * 'link up' status without being flooded with + * requests. + * (note: even 'close port' is not permitted) + */ + ZFCP_LOG_INFO("Stopping all operations for adapter " + "%s.\n", + zfcp_get_busid_by_adapter(adapter)); + atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | + ZFCP_STATUS_COMMON_ERP_FAILED, + &adapter->status); + zfcp_erp_adapter_reopen(adapter, 0); + debug_text_event(adapter->erp_dbf, 1, "prot_link_down"); + } + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PROT_REEST_QUEUE: + ZFCP_LOG_FLAGS(1, "FSF_PROT_REEST_QUEUE\n"); + debug_text_event(adapter->erp_dbf, 1, "prot_reest_queue"); + ZFCP_LOG_INFO("The local link to adapter with " + "%s was re-plugged. " + "Re-starting operations on this adapter.\n", + zfcp_get_busid_by_adapter(adapter)); + /* All ports should be marked as ready to run again */ + zfcp_erp_modify_adapter_status(adapter, + ZFCP_STATUS_COMMON_RUNNING, + ZFCP_SET); + zfcp_erp_adapter_reopen(adapter, + ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED + | ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_cmd_dbf_event_fsf("reestque", fsf_req, + &fsf_req->qtcb->prefix.prot_status_qual, + sizeof (union fsf_prot_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PROT_ERROR_STATE: + ZFCP_LOG_FLAGS(0, "FSF_PROT_ERROR_STATE\n"); + ZFCP_LOG_NORMAL("error: The adapter %s " + "has entered the error state. " + "Restarting all operations on this " + "adapter.\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(adapter->erp_dbf, 0, "prot_err_sta"); + /* restart operation on this adapter */ + zfcp_erp_adapter_reopen(adapter, 0); + zfcp_cmd_dbf_event_fsf("proterrs", fsf_req, + &fsf_req->qtcb->prefix.prot_status_qual, + sizeof (union fsf_prot_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_RETRY; + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + default: + ZFCP_LOG_NORMAL("bug: Transfer protocol status information " + "provided by the adapter %s " + "is not compatible with the device driver. " + "Stopping all operations on this adapter. " + "(debug info 0x%x).\n", + zfcp_get_busid_by_adapter(adapter), + fsf_req->qtcb->prefix.prot_status); + ZFCP_LOG_NORMAL("fsf_req=0x%lx, qtcb=0x%lx (0x%lx, 0x%lx)\n", + (unsigned long) fsf_req, + (unsigned long) fsf_req->qtcb, + ((unsigned long) fsf_req) & 0xFFFFFF00, + (unsigned + long) ((struct zfcp_fsf_req + *) (((unsigned long) fsf_req) & + 0xFFFFFF00))->qtcb); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) (((unsigned long) fsf_req) & 0xFFFFFF00), + sizeof (struct zfcp_fsf_req)); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, (char *) fsf_req->qtcb, + ZFCP_QTCB_SIZE); + debug_text_event(adapter->erp_dbf, 0, "prot_inval:"); + debug_exception(adapter->erp_dbf, 0, + &fsf_req->qtcb->prefix.prot_status, + sizeof (u32)); + zfcp_erp_adapter_shutdown(adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + } + + skip_protstatus: + /* + * always call specific handlers to give them a chance to do + * something meaningful even in error cases + */ + zfcp_fsf_fsfstatus_eval(fsf_req); + return retval; +} + +/* + * function: zfcp_fsf_fsfstatus_eval + * + * purpose: evaluates FSF status of completed FSF request + * and acts accordingly + * + * returns: + */ +static int +zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + goto skip_fsfstatus; + } + + /* evaluate FSF Status */ + switch (fsf_req->qtcb->header.fsf_status) { + case FSF_UNKNOWN_COMMAND: + ZFCP_LOG_FLAGS(0, "FSF_UNKNOWN_COMMAND\n"); + ZFCP_LOG_NORMAL("bug: Command issued by the device driver is " + "not known by the adapter %s " + "Stopping all operations on this adapter. " + "(debug info 0x%x).\n", + zfcp_get_busid_by_adapter(fsf_req->adapter), + fsf_req->qtcb->header.fsf_command); + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_s_unknown"); + zfcp_erp_adapter_shutdown(fsf_req->adapter, 0); + zfcp_cmd_dbf_event_fsf("unknownc", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_FCP_RSP_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_FCP_RSP_AVAILABLE\n"); + ZFCP_LOG_DEBUG("FCP Sense data will be presented to the " + "SCSI stack.\n"); + debug_text_event(fsf_req->adapter->erp_dbf, 3, "fsf_s_rsp"); + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_astatus"); + zfcp_fsf_fsfstatus_qual_eval(fsf_req); + break; + + default: + break; + } + + skip_fsfstatus: + /* + * always call specific handlers to give them a chance to do + * something meaningful even in error cases + */ + zfcp_fsf_req_dispatch(fsf_req); + + return retval; +} + +/* + * function: zfcp_fsf_fsfstatus_qual_eval + * + * purpose: evaluates FSF status-qualifier of completed FSF request + * and acts accordingly + * + * returns: + */ +static int +zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + + switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_FCP_RSP_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_SQ_FCP_RSP_AVAILABLE\n"); + debug_text_event(fsf_req->adapter->erp_dbf, 4, "fsf_sq_rsp"); + break; + case FSF_SQ_RETRY_IF_POSSIBLE: + ZFCP_LOG_FLAGS(2, "FSF_SQ_RETRY_IF_POSSIBLE\n"); + /* The SCSI-stack may now issue retries or escalate */ + debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_sq_retry"); + zfcp_cmd_dbf_event_fsf("sqretry", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_COMMAND_ABORTED: + ZFCP_LOG_FLAGS(2, "FSF_SQ_COMMAND_ABORTED\n"); + /* Carry the aborted state on to upper layer */ + debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_sq_abort"); + zfcp_cmd_dbf_event_fsf("sqabort", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTED; + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_NO_RECOM: + ZFCP_LOG_FLAGS(0, "FSF_SQ_NO_RECOM\n"); + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_no_rec"); + ZFCP_LOG_NORMAL("bug: No recommendation could be given for a" + "problem on the adapter %s " + "Stopping all operations on this adapter. ", + zfcp_get_busid_by_adapter(fsf_req->adapter)); + zfcp_erp_adapter_shutdown(fsf_req->adapter, 0); + zfcp_cmd_dbf_event_fsf("sqnrecom", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_PROGRAMMING_ERROR: + ZFCP_LOG_FLAGS(0, "FSF_SQ_ULP_PROGRAMMING_ERROR\n"); + ZFCP_LOG_NORMAL("bug: An illegal amount of data was attempted " + "to be sent to the adapter %s " + "Stopping all operations on this adapter. ", + zfcp_get_busid_by_adapter(fsf_req->adapter)); + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_ulp_err"); + zfcp_erp_adapter_shutdown(fsf_req->adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + case FSF_SQ_NO_RETRY_POSSIBLE: + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + /* dealt with in the respective functions */ + break; + default: + ZFCP_LOG_NORMAL("bug: Additional status info could " + "not be interpreted properly.\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_sq_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status_qual.word[0], + sizeof (u32)); + zfcp_cmd_dbf_event_fsf("squndef", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + } + + return retval; +} + +/* + * function: zfcp_fsf_req_dispatch + * + * purpose: calls the appropriate command specific handler + * + * returns: + */ +static int +zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + ZFCP_LOG_TRACE("fsf_req=0x%lx, QTCB=0x%lx\n", + (unsigned long) fsf_req, + (unsigned long) (fsf_req->qtcb)); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, + (char *) fsf_req->qtcb, ZFCP_QTCB_SIZE); + } + + switch (fsf_req->fsf_command) { + + case FSF_QTCB_FCP_CMND: + ZFCP_LOG_FLAGS(3, "FSF_QTCB_FCP_CMND\n"); + zfcp_fsf_send_fcp_command_handler(fsf_req); + break; + + case FSF_QTCB_ABORT_FCP_CMND: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_ABORT_FCP_CMND\n"); + zfcp_fsf_abort_fcp_command_handler(fsf_req); + break; + + case FSF_QTCB_SEND_GENERIC: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_SEND_GENERIC\n"); + zfcp_fsf_send_generic_handler(fsf_req); + zfcp_erp_fsf_req_handler(fsf_req); + break; + + case FSF_QTCB_OPEN_PORT_WITH_DID: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_OPEN_PORT_WITH_DID\n"); + zfcp_fsf_open_port_handler(fsf_req); + zfcp_erp_fsf_req_handler(fsf_req); + break; + + case FSF_QTCB_OPEN_LUN: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_OPEN_LUN\n"); + zfcp_fsf_open_unit_handler(fsf_req); + zfcp_erp_fsf_req_handler(fsf_req); + break; + + case FSF_QTCB_CLOSE_LUN: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_CLOSE_LUN\n"); + zfcp_fsf_close_unit_handler(fsf_req); + zfcp_erp_fsf_req_handler(fsf_req); + break; + + case FSF_QTCB_CLOSE_PORT: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_CLOSE_PORT\n"); + zfcp_fsf_close_port_handler(fsf_req); + zfcp_erp_fsf_req_handler(fsf_req); + break; + + case FSF_QTCB_CLOSE_PHYSICAL_PORT: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_CLOSE_PHYSICAL_PORT\n"); + zfcp_fsf_close_physical_port_handler(fsf_req); + zfcp_erp_fsf_req_handler(fsf_req); + break; + + case FSF_QTCB_EXCHANGE_CONFIG_DATA: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_EXCHANGE_CONFIG_DATA\n"); + zfcp_fsf_exchange_config_data_handler(fsf_req); + zfcp_erp_fsf_req_handler(fsf_req); + break; + + default: + ZFCP_LOG_FLAGS(2, "FSF_QTCB_UNKNOWN\n"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + ZFCP_LOG_NORMAL("bug: Command issued by the device driver is " + "not supported by the adapter %s " + "(debug info 0x%lx 0x%x).\n", + zfcp_get_busid_by_adapter(fsf_req->adapter), + (unsigned long) fsf_req, fsf_req->fsf_command); + if (fsf_req->fsf_command != fsf_req->qtcb->header.fsf_command) + ZFCP_LOG_NORMAL + ("bug: Command issued by the device driver differs " + "from the command returned by the adapter %s " + "(debug info 0x%x, 0x%x).\n", + zfcp_get_busid_by_adapter(fsf_req->adapter), + fsf_req->fsf_command, + fsf_req->qtcb->header.fsf_command); + } + + return retval; +} + +/* + * function: zfcp_fsf_status_read + * + * purpose: initiates a Status Read command at the specified adapter + * + * returns: + */ +int +zfcp_fsf_status_read(struct zfcp_adapter *adapter, int req_flags) +{ + struct zfcp_fsf_req *fsf_req; + struct fsf_status_read_buffer *status_buffer; + unsigned long lock_flags; + volatile struct qdio_buffer_element *buffere; + struct zfcp_qdio_queue *req_queue = &adapter->request_queue; + int retval = 0; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(adapter, + FSF_QTCB_UNSOLICITED_STATUS, + &lock_flags, req_flags, &fsf_req); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create an " + "unsolicited status buffer for " + "the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + goto failed_req_create; + } + + status_buffer = + mempool_alloc(adapter->pool.status_read_buf, GFP_ATOMIC); + if (!status_buffer) { + ZFCP_LOG_NORMAL("bug: could not get some buffer\n"); + goto failed_buf; + } + memset(status_buffer, 0, sizeof (struct fsf_status_read_buffer)); + fsf_req->data.status_read.buffer = status_buffer; + + /* insert pointer to respective buffer */ + buffere = req_queue->buffer[fsf_req->sbal_index]->element; + buffere[2].addr = (void *) status_buffer; + buffere[2].length = sizeof (struct fsf_status_read_buffer); + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(fsf_req, NULL); + if (retval) { + ZFCP_LOG_DEBUG("error: Could not set-up unsolicited status " + "environment.\n"); + goto failed_req_send; + } + + ZFCP_LOG_TRACE("Status Read request initiated " + "(adapter busid=%s)\n", + zfcp_get_busid_by_adapter(adapter)); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 1, "unso"); +#endif + goto out; + + failed_req_send: + mempool_free(status_buffer, adapter->pool.status_read_buf); + + failed_buf: + zfcp_fsf_req_free(fsf_req); + failed_req_create: + out: + write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); + return retval; +} + +static int +zfcp_fsf_status_read_port_closed(struct zfcp_fsf_req *fsf_req) +{ + struct fsf_status_read_buffer *status_buffer; + struct zfcp_adapter *adapter; + struct zfcp_port *port; + unsigned long flags; + + status_buffer = fsf_req->data.status_read.buffer; + adapter = fsf_req->adapter; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + list_for_each_entry(port, &adapter->port_list_head, list) + if (port->d_id == (status_buffer->d_id & ZFCP_DID_MASK)) + break; + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + + if (!port || (port->d_id != (status_buffer->d_id & ZFCP_DID_MASK))) { + ZFCP_LOG_NORMAL("bug: Re-open port indication received for the " + "non-existing port with DID 0x%3.3x, on " + "the adapter %s. Ignored.\n", + status_buffer->d_id & ZFCP_DID_MASK, + zfcp_get_busid_by_adapter(adapter)); + goto out; + } + + switch (status_buffer->status_subtype) { + + case FSF_STATUS_READ_SUB_CLOSE_PHYS_PORT: + ZFCP_LOG_FLAGS(2, "FSF_STATUS_READ_SUB_CLOSE_PHYS_PORT\n"); + debug_text_event(adapter->erp_dbf, 3, "unsol_pc_phys:"); + zfcp_erp_port_reopen(port, 0); + break; + + case FSF_STATUS_READ_SUB_ERROR_PORT: + ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_SUB_ERROR_PORT\n"); + debug_text_event(adapter->erp_dbf, 1, "unsol_pc_err:"); + zfcp_erp_port_shutdown(port, 0); + break; + + default: + debug_text_event(adapter->erp_dbf, 0, "unsol_unk_sub:"); + debug_exception(adapter->erp_dbf, 0, + &status_buffer->status_subtype, sizeof (u32)); + ZFCP_LOG_NORMAL("bug: Undefined status subtype received " + "for a re-open indication on the port with " + "DID 0x%3.3x, on the adapter " + "%s. Ignored. (debug info 0x%x)\n", + status_buffer->d_id, + zfcp_get_busid_by_adapter(adapter), + status_buffer->status_subtype); + } + out: + return 0; +} + +/* + * function: zfcp_fsf_status_read_handler + * + * purpose: is called for finished Open Port command + * + * returns: + */ +static int +zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + struct zfcp_adapter *adapter = fsf_req->adapter; + struct fsf_status_read_buffer *status_buffer = + fsf_req->data.status_read.buffer; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_DISMISSED) { + mempool_free(status_buffer, adapter->pool.status_read_buf); + zfcp_fsf_req_cleanup(fsf_req); + goto out; + } + + switch (status_buffer->status_type) { + + case FSF_STATUS_READ_PORT_CLOSED: + ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_PORT_CLOSED\n"); + debug_text_event(adapter->erp_dbf, 3, "unsol_pclosed:"); + debug_event(adapter->erp_dbf, 3, + &status_buffer->d_id, sizeof (u32)); + zfcp_fsf_status_read_port_closed(fsf_req); + break; + + case FSF_STATUS_READ_INCOMING_ELS: + ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_INCOMING_ELS\n"); + debug_text_event(adapter->erp_dbf, 3, "unsol_els:"); + zfcp_fsf_incoming_els(fsf_req); + break; + + case FSF_STATUS_READ_BIT_ERROR_THRESHOLD: + ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_BIT_ERROR_THRESHOLD\n"); + debug_text_event(adapter->erp_dbf, 3, "unsol_bit_err:"); + ZFCP_LOG_NORMAL("Bit error threshold data received:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) status_buffer, + sizeof (struct fsf_status_read_buffer)); + break; + + case FSF_STATUS_READ_LINK_DOWN: + ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_LINK_DOWN\n"); + /* Unneccessary, ignoring.... */ + break; + + case FSF_STATUS_READ_LINK_UP: + ZFCP_LOG_FLAGS(1, "FSF_STATUS_READ_LINK_UP\n"); + debug_text_event(adapter->erp_dbf, 2, "unsol_link_up:"); + ZFCP_LOG_INFO("The local link to the adapter %s " + "was re-plugged. " + "Re-starting operations on this adapter..\n", + zfcp_get_busid_by_adapter(adapter)); + /* All ports should be marked as ready to run again */ + zfcp_erp_modify_adapter_status(adapter, + ZFCP_STATUS_COMMON_RUNNING, + ZFCP_SET); + zfcp_erp_adapter_reopen(adapter, + ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED + | ZFCP_STATUS_COMMON_ERP_FAILED); + break; + + default: + debug_text_event(adapter->erp_dbf, 0, "unsol_unknown:"); + debug_exception(adapter->erp_dbf, 0, + &status_buffer->status_type, sizeof (u32)); + ZFCP_LOG_NORMAL("bug: An unsolicited status packet of unknown " + "type was received by the zfcp-driver " + "(debug info 0x%x)\n", + status_buffer->status_type); + ZFCP_LOG_DEBUG("Dump of status_read_buffer 0x%lx:\n", + (unsigned long) status_buffer); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) status_buffer, + sizeof (struct fsf_status_read_buffer)); + break; + } + mempool_free(status_buffer, adapter->pool.status_read_buf); + zfcp_fsf_req_cleanup(fsf_req); + /* + * recycle buffer and start new request repeat until outbound + * queue is empty or adapter shutdown is requested + */ + /* + * FIXME(qdio): + * we may wait in the req_create for 5s during shutdown, so + * qdio_cleanup will have to wait at least that long before returning + * with failure to allow us a proper cleanup under all circumstances + */ + /* + * FIXME: + * allocation failure possible? (Is this code needed?) + */ + retval = zfcp_fsf_status_read(adapter, 0); + if (retval < 0) { + ZFCP_LOG_INFO("Outbound queue busy. " + "Could not create use an " + "unsolicited status read request for " + "the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + /* temporary fix to avoid status read buffer shortage */ + adapter->status_read_failed++; + if ((ZFCP_STATUS_READS_RECOM - adapter->status_read_failed) + < ZFCP_STATUS_READ_FAILED_THRESHOLD) { + ZFCP_LOG_INFO("restart adapter due to status read " + "buffer shortage (busid %s)\n", + zfcp_get_busid_by_adapter(adapter)); + zfcp_erp_adapter_reopen(adapter, 0); + } + } + out: + return retval; +} + +/* + * function: zfcp_fsf_abort_fcp_command + * + * purpose: tells FSF to abort a running SCSI command + * + * returns: address of initiated FSF request + * NULL - request could not be initiated + * + * FIXME(design): should be watched by a timeout !!! + * FIXME(design) shouldn't this be modified to return an int + * also...don't know how though + */ +struct zfcp_fsf_req * +zfcp_fsf_abort_fcp_command(unsigned long old_req_id, + struct zfcp_adapter *adapter, + struct zfcp_unit *unit, int req_flags) +{ + struct zfcp_fsf_req *new_fsf_req = NULL; + int retval = 0; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND, + &lock_flags, req_flags, &new_fsf_req); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create an " + "abort command request on the device with " + "the FCP-LUN 0x%Lx connected to " + "the port with WWPN 0x%Lx connected to " + "the adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_adapter(adapter)); + goto out; + } + + new_fsf_req->data.abort_fcp_command.unit = unit; + + /* set handles of unit and its parent port in QTCB */ + new_fsf_req->qtcb->header.lun_handle = unit->handle; + new_fsf_req->qtcb->header.port_handle = unit->port->handle; + + /* set handle of request which should be aborted */ + new_fsf_req->qtcb->bottom.support.req_handle = (u64) old_req_id; + + /* start QDIO request for this FSF request */ + + zfcp_fsf_start_scsi_er_timer(adapter); + retval = zfcp_fsf_req_send(new_fsf_req, NULL); + if (retval) { + del_timer(&adapter->scsi_er_timer); + ZFCP_LOG_INFO("error: Could not send an abort command request " + "for a command on the adapter %s, " + "port WWPN 0x%Lx and unit LUN 0x%Lx\n", + zfcp_get_busid_by_adapter(adapter), + unit->port->wwpn, unit->fcp_lun); + zfcp_fsf_req_free(new_fsf_req); + new_fsf_req = NULL; + goto out; + } + + ZFCP_LOG_DEBUG("Abort FCP Command request initiated " + "(adapter busid=%s, port d_id=0x%x, " + "unit fcp_lun=0x%Lx, old_req_id=0x%lx)\n", + zfcp_get_busid_by_adapter(adapter), + (unsigned int) unit->port->d_id, + unit->fcp_lun, old_req_id); + out: + write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); + return new_fsf_req; +} + +/* + * function: zfcp_fsf_abort_fcp_command_handler + * + * purpose: is called for finished Abort FCP Command request + * + * returns: + */ +static int +zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) +{ + int retval = -EINVAL; + struct zfcp_unit *unit = new_fsf_req->data.abort_fcp_command.unit; + unsigned char status_qual = + new_fsf_req->qtcb->header.fsf_status_qual.word[0]; + + del_timer(&new_fsf_req->adapter->scsi_er_timer); + + if (new_fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* do not set ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (new_fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_HANDLE_NOT_VALID: + if (status_qual >> 4 != status_qual % 0xf) { + ZFCP_LOG_FLAGS(2, "FSF_PORT_HANDLE_NOT_VALID\n"); + debug_text_event(new_fsf_req->adapter->erp_dbf, 3, + "fsf_s_phand_nv0"); + /* + * In this case a command that was sent prior to a port + * reopen was aborted (handles are different). This is + * fine. + */ + } else { + ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x " + "for the port with WWPN 0x%Lx connected " + "to the adapter %s is not valid. This " + "may happen occasionally.\n", + unit->port->handle, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_INFO("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO, + (char *) &new_fsf_req->qtcb->header. + fsf_status_qual, + sizeof (union fsf_status_qual)); + /* Let's hope this sorts out the mess */ + debug_text_event(new_fsf_req->adapter->erp_dbf, 1, + "fsf_s_phand_nv1"); + zfcp_erp_adapter_reopen(unit->port->adapter, 0); + new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + } + break; + + case FSF_LUN_HANDLE_NOT_VALID: + if (status_qual >> 4 != status_qual % 0xf) { + /* 2 */ + ZFCP_LOG_FLAGS(0, "FSF_LUN_HANDLE_NOT_VALID\n"); + debug_text_event(new_fsf_req->adapter->erp_dbf, 3, + "fsf_s_lhand_nv0"); + /* + * In this case a command that was sent prior to a unit + * reopen was aborted (handles are different). + * This is fine. + */ + } else { + ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO + ("Warning: Temporary LUN identifier (handle) 0x%x " + "of the logical unit with FCP-LUN 0x%Lx at " + "the remote port with WWPN 0x%Lx connected " + "to the adapter %s is " + "not valid. This may happen in rare cases." + "Trying to re-establish link.\n", + unit->handle, + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_DEBUG("Status qualifier data:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &new_fsf_req->qtcb->header. + fsf_status_qual, + sizeof (union fsf_status_qual)); + /* Let's hope this sorts out the mess */ + debug_text_event(new_fsf_req->adapter->erp_dbf, 1, + "fsf_s_lhand_nv1"); + zfcp_erp_port_reopen(unit->port, 0); + new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + } + break; + + case FSF_FCP_COMMAND_DOES_NOT_EXIST: + ZFCP_LOG_FLAGS(2, "FSF_FCP_COMMAND_DOES_NOT_EXIST\n"); + retval = 0; +#ifdef ZFCP_DEBUG_REQUESTS + /* + * debug feature area which records + * fsf request sequence numbers + */ + debug_text_event(new_fsf_req->adapter->req_dbf, 3, "no_exist"); + debug_event(new_fsf_req->adapter->req_dbf, 3, + &new_fsf_req->qtcb->bottom.support.req_handle, + sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + debug_text_event(new_fsf_req->adapter->erp_dbf, 3, + "fsf_s_no_exist"); + new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED; + break; + + case FSF_PORT_BOXED: + /* 2 */ + ZFCP_LOG_FLAGS(0, "FSF_PORT_BOXED\n"); + ZFCP_LOG_DEBUG("The remote port " + "with WWPN 0x%Lx on the adapter %s " + "needs to be reopened\n", + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + debug_text_event(new_fsf_req->adapter->erp_dbf, 2, + "fsf_s_pboxed"); + zfcp_erp_port_reopen(unit->port, 0); + new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR + | ZFCP_STATUS_FSFREQ_RETRY; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + /* 2 */ + ZFCP_LOG_FLAGS(0, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + switch (new_fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); + debug_text_event(new_fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ltest"); + /* reopening link to port */ + zfcp_erp_port_reopen(unit->port, 0); + new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n"); + /* SCSI stack will escalate */ + debug_text_event(new_fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ulp"); + new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + default: + ZFCP_LOG_NORMAL + ("bug: Wrong status qualifier 0x%x arrived.\n", + new_fsf_req->qtcb->header.fsf_status_qual.word[0]); + debug_text_event(new_fsf_req->adapter->erp_dbf, 0, + "fsf_sq_inval:"); + debug_exception(new_fsf_req->adapter->erp_dbf, 0, + &new_fsf_req->qtcb->header. + fsf_status_qual.word[0], sizeof (u32)); + break; + } + break; + + case FSF_GOOD: + /* 3 */ + ZFCP_LOG_FLAGS(0, "FSF_GOOD\n"); + retval = 0; + new_fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED; + break; + + default: + ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " + "(debug info 0x%x)\n", + new_fsf_req->qtcb->header.fsf_status); + debug_text_event(new_fsf_req->adapter->erp_dbf, 0, + "fsf_s_inval:"); + debug_exception(new_fsf_req->adapter->erp_dbf, 0, + &new_fsf_req->qtcb->header.fsf_status, + sizeof (u32)); + break; + } + skip_fsfstatus: + return retval; +} + +/* + * function: zfcp_fsf_send_generic + * + * purpose: sends a FC request according to FC-GS-3 + * + * returns: address of initiated FSF request + * NULL - request could not be initiated + */ +int +zfcp_fsf_send_generic(struct zfcp_fsf_req *fsf_req, unsigned char timeout, + unsigned long *lock_flags, struct timer_list *timer) +{ + int retval = 0; + struct qdio_buffer *buffer; + volatile struct qdio_buffer_element *buffer_element = NULL; + struct zfcp_port *port = fsf_req->data.send_generic.port; + struct zfcp_adapter *adapter = port->adapter; + + /* put buffers to the 2 SBALEs after the QTCB */ + buffer = (adapter->request_queue.buffer[fsf_req->sbal_index]); + buffer_element = &(buffer->element[2]); + buffer_element->addr = fsf_req->data.send_generic.outbuf; + buffer_element->length = fsf_req->data.send_generic.outbuf_length; + buffer_element++; + buffer_element->addr = fsf_req->data.send_generic.inbuf; + buffer_element->length = fsf_req->data.send_generic.inbuf_length; + buffer_element->flags |= SBAL_FLAGS_LAST_ENTRY; + + /* settings in QTCB */ + fsf_req->qtcb->header.port_handle = port->handle; + fsf_req->qtcb->bottom.support.service_class = adapter->fc_service_class; + fsf_req->qtcb->bottom.support.timeout = timeout; + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(fsf_req, timer); + if (retval) { + ZFCP_LOG_DEBUG("error: Out of resources. could not send a " + "generic services " + "command via the adapter %s, port " + "WWPN 0x%Lx\n", + zfcp_get_busid_by_adapter(adapter), port->wwpn); + /* + * fsf_req structure will be cleaned up by higher layer handler + */ + goto out; + } + + ZFCP_LOG_DEBUG("Send Generic request initiated " + "(adapter busido=%s, port d_id=0x%x)\n", + zfcp_get_busid_by_adapter(adapter), + (unsigned int) port->d_id); + out: + return retval; +} + +/* + * function: zfcp_fsf_send_generic_handler + * + * purpose: is called for finished Send Generic request + * + * returns: + */ +static int +zfcp_fsf_send_generic_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = -EINVAL; + struct zfcp_port *port = fsf_req->data.send_generic.port; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* do not set ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n"); + ZFCP_LOG_DEBUG("Temporary port identifier (handle) 0x%x " + "for the port with WWPN 0x%Lx connected to " + "the adapter %s is " + "not valid. This may happen occasionally.\n", + port->handle, + port->wwpn, zfcp_get_busid_by_port(port)); + ZFCP_LOG_INFO("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_phandle_nv"); + zfcp_erp_adapter_reopen(port->adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_SERVICE_CLASS_NOT_SUPPORTED: + ZFCP_LOG_FLAGS(0, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n"); + if (fsf_req->adapter->fc_service_class <= 3) { + ZFCP_LOG_NORMAL("error: The adapter %s does " + "not support fibre-channel class %d.\n", + zfcp_get_busid_by_port(port), + fsf_req->adapter->fc_service_class); + } else { + ZFCP_LOG_NORMAL + ("bug: The fibre channel class at the adapter " + "%s is invalid. " "(debug info %d)\n", + zfcp_get_busid_by_port(port), + fsf_req->adapter->fc_service_class); + } + /* stop operation for this adapter */ + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_s_class_nsup"); + zfcp_erp_adapter_shutdown(port->adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_GENERIC_COMMAND_REJECTED: + ZFCP_LOG_FLAGS(1, "FSF_GENERIC_COMMAND_REJECTED\n"); + ZFCP_LOG_INFO("warning: The port with WWPN 0x%Lx connected to " + "the adapter %s is" + "rejected a generic services command.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + ZFCP_LOG_INFO("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_gcom_rej"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_REQUEST_BUF_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_REQUEST_BUF_NOT_VALID\n"); + ZFCP_LOG_NORMAL("error: The port with WWPN 0x%Lx connected to " + "the adapter %s is" + "rejected a generic services command " + "due to invalid request buffer.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_reqiv"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_RESPONSE_BUF_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_RESPONSE_BUF_NOT_VALID\n"); + ZFCP_LOG_NORMAL("error: The port with WWPN 0x%Lx connected to " + "the adapter %s is" + "rejected a generic services command " + "due to invalid response buffer.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_resiv"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PORT_BOXED: + ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n"); + ZFCP_LOG_DEBUG("The remote port " + "with WWPN 0x%Lx on the adapter %s " + "needs to be reopened\n", + port->wwpn, zfcp_get_busid_by_port(port)); + debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); + zfcp_erp_port_reopen(port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR + | ZFCP_STATUS_FSFREQ_RETRY; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); + /* reopening link to port */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ltest"); + zfcp_erp_port_forced_reopen(port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + /* ERP strategy will escalate */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ulp"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + default: + ZFCP_LOG_NORMAL + ("bug: Wrong status qualifier 0x%x arrived.\n", + fsf_req->qtcb->header.fsf_status_qual.word[0]); + break; + } + break; + + case FSF_GOOD: + ZFCP_LOG_FLAGS(2, "FSF_GOOD\n"); + retval = 0; + break; + + default: + ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " + "(debug info 0x%x)\n", + fsf_req->qtcb->header.fsf_status); + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_sq_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status_qual.word[0], + sizeof (u32)); + break; + } + skip_fsfstatus: + /* callback */ + (fsf_req->data.send_generic.handler)(fsf_req); + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: address of initiated FSF request + * NULL - request could not be initiated + */ +int +zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(erp_action->adapter, + FSF_QTCB_EXCHANGE_CONFIG_DATA, + &lock_flags, + ZFCP_REQ_AUTO_CLEANUP, + &(erp_action->fsf_req)); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create an " + "exchange configuration data request for" + "the adapter %s.\n", + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto out; + } + + erp_action->fsf_req->erp_action = erp_action; + /* no information from us to adapter, set nothing */ + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer); + if (retval) { + ZFCP_LOG_INFO + ("error: Could not send an exchange configuration data " + "command on the adapter %s\n", + zfcp_get_busid_by_adapter(erp_action->adapter)); + zfcp_fsf_req_free(erp_action->fsf_req); + erp_action->fsf_req = NULL; + goto out; + } + + ZFCP_LOG_DEBUG("Exchange Configuration Data request initiated " + "(adapter busid=%s)\n", + zfcp_get_busid_by_adapter(erp_action->adapter)); + + out: + write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, + lock_flags); + return retval; +} + +/* + * function: zfcp_fsf_exchange_config_data_handler + * + * purpose: is called for finished Exchange Configuration Data command + * + * returns: + */ +static int +zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) { + int retval = -EIO; + struct fsf_qtcb_bottom_config *bottom; + struct zfcp_adapter *adapter = fsf_req->adapter; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* don't set any value, stay with the old (unitialized) ones */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_GOOD: + ZFCP_LOG_FLAGS(2, "FSF_GOOD\n"); + bottom = &fsf_req->qtcb->bottom.config; + /* only log QTCB versions for now */ + ZFCP_LOG_DEBUG("low QTCB version 0x%x of FSF, " + "high QTCB version 0x%x of FSF, \n", + bottom->low_qtcb_version, + bottom->high_qtcb_version); + adapter->wwnn = bottom->nport_serv_param.wwnn; + adapter->wwpn = bottom->nport_serv_param.wwpn; + adapter->s_id = bottom->s_id & ZFCP_DID_MASK; + adapter->hydra_version = bottom->adapter_type; + adapter->fsf_lic_version = bottom->lic_version; + adapter->fc_topology = bottom->fc_topology; + adapter->fc_link_speed = bottom->fc_link_speed; + ZFCP_LOG_INFO("The adapter %s reported " + "the following characteristics:\n" + "WWNN 0x%16.16Lx, " + "WWPN 0x%16.16Lx, " + "S_ID 0x%6.6x,\n" + "adapter version 0x%x, " + "LIC version 0x%x, " + "FC link speed %d Gb/s\n", + zfcp_get_busid_by_adapter(adapter), + adapter->wwnn, + adapter->wwpn, + (unsigned int) adapter->s_id, + adapter->hydra_version, + adapter->fsf_lic_version, + adapter->fc_link_speed); + if (ZFCP_QTCB_VERSION < bottom->low_qtcb_version) { + ZFCP_LOG_NORMAL("error: the adapter %s " + "only supports newer control block " + "versions in comparison to this device " + "driver (try updated device driver)\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "low_qtcb_ver"); + zfcp_erp_adapter_shutdown(adapter, 0); + goto skip_fsfstatus; + } + if (ZFCP_QTCB_VERSION > bottom->high_qtcb_version) { + ZFCP_LOG_NORMAL("error: the adapter %s " + "only supports older control block " + "versions than this device driver uses" + "(consider a microcode upgrade)\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "high_qtcb_ver"); + zfcp_erp_adapter_shutdown(adapter, 0); + goto skip_fsfstatus; + } + switch (adapter->fc_topology) { + case FSF_TOPO_P2P: + ZFCP_LOG_FLAGS(1, "FSF_TOPO_P2P\n"); + ZFCP_LOG_NORMAL("error: Point-to-point fibre-channel " + "configuration detected " + "at the adapter %s, not " + "supported, shutting down adapter\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "top-p-to-p"); + zfcp_erp_adapter_shutdown(adapter, 0); + goto skip_fsfstatus; + case FSF_TOPO_AL: + ZFCP_LOG_FLAGS(1, "FSF_TOPO_AL\n"); + ZFCP_LOG_NORMAL("error: Arbitrated loop fibre-channel " + "topology detected " + "at the adapter %s, not " + "supported, shutting down adapter\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "top-al"); + zfcp_erp_adapter_shutdown(adapter, 0); + goto skip_fsfstatus; + case FSF_TOPO_FABRIC: + ZFCP_LOG_FLAGS(1, "FSF_TOPO_FABRIC\n"); + ZFCP_LOG_INFO("Switched fabric fibre-channel " + "network detected " + "at the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + break; + default: + ZFCP_LOG_NORMAL("bug: The fibre-channel topology " + "reported by the exchange " + "configuration command for " + "the adapter %s is not " + "of a type known to the zfcp " + "driver, shutting down adapter\n", + zfcp_get_busid_by_adapter(adapter)); + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "unknown-topo"); + zfcp_erp_adapter_shutdown(adapter, 0); + goto skip_fsfstatus; + } + if (bottom->max_qtcb_size < ZFCP_QTCB_SIZE) { + ZFCP_LOG_NORMAL("bug: Maximum QTCB size (%d bytes) " + "allowed by the adapter %s " + "is lower than the minimum " + "required by the driver (%ld bytes).\n", + bottom->max_qtcb_size, + zfcp_get_busid_by_adapter(adapter), + ZFCP_QTCB_SIZE); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "qtcb-size"); + debug_event(fsf_req->adapter->erp_dbf, 0, + &bottom->max_qtcb_size, sizeof (u32)); + zfcp_erp_adapter_shutdown(adapter, 0); + goto skip_fsfstatus; + } + atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, + &adapter->status); + retval = 0; + break; + default: + /* retval is -EIO by default */ + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf-stat-ng"); + debug_event(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status, sizeof (u32)); + zfcp_erp_adapter_shutdown(adapter, 0); + } + skip_fsfstatus: + return retval; +} + +/* + * function: zfcp_fsf_open_port + * + * purpose: + * + * returns: address of initiated FSF request + * NULL - request could not be initiated + */ +int +zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(erp_action->adapter, + FSF_QTCB_OPEN_PORT_WITH_DID, + &lock_flags, + ZFCP_WAIT_FOR_SBAL | ZFCP_REQ_AUTO_CLEANUP, + &(erp_action->fsf_req)); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create an " + "open port request for " + "the port with WWPN 0x%Lx connected to " + "the adapter %s.\n", + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto out; + } + + erp_action->fsf_req->qtcb->bottom.support.d_id = erp_action->port->d_id; + atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, &erp_action->port->status); + erp_action->fsf_req->data.open_port.port = erp_action->port; + erp_action->fsf_req->erp_action = erp_action; + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer); + if (retval) { + ZFCP_LOG_INFO("error: Could not send an " + "open port request for " + "the port with WWPN 0x%Lx connected to " + "the adapter %s.\n", + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + zfcp_fsf_req_free(erp_action->fsf_req); + erp_action->fsf_req = NULL; + goto out; + } + + ZFCP_LOG_DEBUG("Open Port request initiated " + "(adapter busid=%s, port wwpn=0x%Lx)\n", + zfcp_get_busid_by_adapter(erp_action->adapter), + erp_action->port->wwpn); + out: + write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, + lock_flags); + return retval; +} + +/* + * function: zfcp_fsf_open_port_handler + * + * purpose: is called for finished Open Port command + * + * returns: + */ +static int +zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = -EINVAL; + struct zfcp_port *port; + struct fsf_plogi *plogi; + + port = fsf_req->data.open_port.port; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* don't change port status in our bookkeeping */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_ALREADY_OPEN: + ZFCP_LOG_FLAGS(0, "FSF_PORT_ALREADY_OPEN\n"); + ZFCP_LOG_NORMAL("bug: The remote port with WWPN=0x%Lx " + "connected to the adapter %s " + "is already open.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_s_popen"); + /* + * This is a bug, however operation should continue normally + * if it is simply ignored + */ + break; + + case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED: + ZFCP_LOG_FLAGS(1, "FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED\n"); + ZFCP_LOG_INFO("error: The FSF adapter is out of resources. " + "The remote port with WWPN=0x%Lx " + "connected to the adapter %s " + "could not be opened. Disabling it.\n", + port->wwpn, zfcp_get_busid_by_port(port)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_max_ports"); + zfcp_erp_port_failed(port); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ltest"); + /* ERP strategy will escalate */ + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + /* ERP strategy will escalate */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ulp"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_NO_RETRY_POSSIBLE: + ZFCP_LOG_FLAGS(0, "FSF_SQ_NO_RETRY_POSSIBLE\n"); + ZFCP_LOG_NORMAL("The remote port with WWPN=0x%Lx " + "connected to the adapter %s " + "could not be opened. Disabling it.\n", + port->wwpn, + zfcp_get_busid_by_port(port)); + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_no_retry"); + zfcp_erp_port_failed(port); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + default: + ZFCP_LOG_NORMAL + ("bug: Wrong status qualifier 0x%x arrived.\n", + fsf_req->qtcb->header.fsf_status_qual.word[0]); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_inval:"); + debug_exception( + fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status_qual.word[0], + sizeof (u32)); + break; + } + break; + + case FSF_GOOD: + ZFCP_LOG_FLAGS(3, "FSF_GOOD\n"); + /* save port handle assigned by FSF */ + port->handle = fsf_req->qtcb->header.port_handle; + ZFCP_LOG_INFO("The remote port (WWPN=0x%Lx) via adapter " + "(busid=%s) was opened, it's " + "port handle is 0x%x\n", + port->wwpn, + zfcp_get_busid_by_port(port), + port->handle); + /* mark port as open */ + atomic_set_mask(ZFCP_STATUS_COMMON_OPEN | + ZFCP_STATUS_PORT_PHYS_OPEN, &port->status); + retval = 0; + /* check whether D_ID has changed during open */ + plogi = (struct fsf_plogi *) fsf_req->qtcb->bottom.support.els; + if (!atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN, &port->status)) + { + if (fsf_req->qtcb->bottom.support.els1_length < + ((((unsigned long) &plogi->serv_param.wwpn) - + ((unsigned long) plogi)) + sizeof (u64))) { + ZFCP_LOG_INFO( + "warning: insufficient length of " + "PLOGI payload (%i)\n", + fsf_req->qtcb->bottom.support.els1_length); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_s_short_plogi:"); + /* skip sanity check and assume wwpn is ok */ + } else { + if (plogi->serv_param.wwpn != port->wwpn) { + ZFCP_LOG_INFO("warning: D_ID of port " + "with WWPN 0x%Lx changed " + "during open\n", port->wwpn); + debug_text_event( + fsf_req->adapter->erp_dbf, 0, + "fsf_s_did_change:"); + atomic_clear_mask( + ZFCP_STATUS_PORT_DID_DID, + &port->status); + } else + port->wwnn = plogi->serv_param.wwnn; + } + } + break; + + default: + ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " + "(debug info 0x%x)\n", + fsf_req->qtcb->header.fsf_status); + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status, + sizeof (u32)); + break; + } + + skip_fsfstatus: + atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING, &port->status); + return retval; +} + +/* + * function: zfcp_fsf_close_port + * + * purpose: submit FSF command "close port" + * + * returns: address of initiated FSF request + * NULL - request could not be initiated + */ +int +zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(erp_action->adapter, + FSF_QTCB_CLOSE_PORT, + &lock_flags, + ZFCP_WAIT_FOR_SBAL | ZFCP_REQ_AUTO_CLEANUP, + &(erp_action->fsf_req)); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create a " + "close port request for WWPN 0x%Lx connected to " + "the adapter %s.\n", + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto out; + } + + atomic_set_mask(ZFCP_STATUS_COMMON_CLOSING, &erp_action->port->status); + erp_action->fsf_req->data.close_port.port = erp_action->port; + erp_action->fsf_req->erp_action = erp_action; + erp_action->fsf_req->qtcb->header.port_handle = + erp_action->port->handle; + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer); + if (retval) { + ZFCP_LOG_INFO("error: Could not send a " + "close port request for WWPN 0x%Lx connected to " + "the adapter %s.\n", + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + zfcp_fsf_req_free(erp_action->fsf_req); + erp_action->fsf_req = NULL; + goto out; + } + + ZFCP_LOG_TRACE("Close Port request initiated " + "(adapter busid=%s, port wwpn=0x%Lx)\n", + zfcp_get_busid_by_adapter(erp_action->adapter), + erp_action->port->wwpn); + out: + write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, + lock_flags); + return retval; +} + +/* + * function: zfcp_fsf_close_port_handler + * + * purpose: is called for finished Close Port FSF command + * + * returns: + */ +static int +zfcp_fsf_close_port_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = -EINVAL; + struct zfcp_port *port; + + port = fsf_req->data.close_port.port; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* don't change port status in our bookkeeping */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x " + "for the port with WWPN 0x%Lx connected to " + "the adapter %s is" + "not valid. This may happen occasionally.\n", + port->handle, + port->wwpn, zfcp_get_busid_by_port(port)); + ZFCP_LOG_DEBUG("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_phand_nv"); + zfcp_erp_adapter_reopen(port->adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + /* Note: FSF has actually closed the port in this case. + * The status code is just daft. Fingers crossed for a change + */ + retval = 0; + break; + + case FSF_GOOD: + ZFCP_LOG_FLAGS(3, "FSF_GOOD\n"); + ZFCP_LOG_TRACE("remote port (WWPN=0x%Lx) via adapter " + "(busid=%s) closed, port handle 0x%x\n", + port->wwpn, + zfcp_get_busid_by_port(port), + port->handle); + zfcp_erp_modify_port_status(port, + ZFCP_STATUS_COMMON_OPEN, + ZFCP_CLEAR); + retval = 0; + break; + + default: + ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " + "(debug info 0x%x)\n", + fsf_req->qtcb->header.fsf_status); + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status, + sizeof (u32)); + break; + } + + skip_fsfstatus: + atomic_clear_mask(ZFCP_STATUS_COMMON_CLOSING, &port->status); + return retval; +} + +/* + * function: zfcp_fsf_close_physical_port + * + * purpose: submit FSF command "close physical port" + * + * returns: address of initiated FSF request + * NULL - request could not be initiated + */ +int +zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(erp_action->adapter, + FSF_QTCB_CLOSE_PHYSICAL_PORT, + &lock_flags, + ZFCP_WAIT_FOR_SBAL | ZFCP_REQ_AUTO_CLEANUP, + &erp_action->fsf_req); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create a " + "close physical port request for " + "the port with WWPN 0x%Lx connected to " + "the adapter %s.\n", + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto out; + } + + /* mark port as being closed */ + atomic_set_mask(ZFCP_STATUS_PORT_PHYS_CLOSING, + &erp_action->port->status); + /* save a pointer to this port */ + erp_action->fsf_req->data.close_physical_port.port = erp_action->port; + /* port to be closeed */ + erp_action->fsf_req->qtcb->header.port_handle = + erp_action->port->handle; + erp_action->fsf_req->erp_action = erp_action; + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer); + if (retval) { + ZFCP_LOG_INFO("error: Could not send an close physical port " + "request for the port with WWPN 0x%Lx connected " + "to the adapter %s.\n", + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + zfcp_fsf_req_free(erp_action->fsf_req); + erp_action->fsf_req = NULL; + goto out; + } + + ZFCP_LOG_TRACE("Close Physical Port request initiated " + "(adapter busid=%s, port wwpn=0x%Lx)\n", + zfcp_get_busid_by_adapter(erp_action->adapter), + erp_action->port->wwpn); + out: + write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, + lock_flags); + return retval; +} + +/* + * function: zfcp_fsf_close_physical_port_handler + * + * purpose: is called for finished Close Physical Port FSF command + * + * returns: + */ +static int +zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = -EINVAL; + struct zfcp_port *port; + struct zfcp_unit *unit; + + port = fsf_req->data.close_physical_port.port; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* don't change port status in our bookkeeping */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x " + "for the port with WWPN 0x%Lx connected to " + "the adapter %s is not valid. This may happen " + "occasionally.\n", + port->handle, + port->wwpn, + zfcp_get_busid_by_port(port)); + ZFCP_LOG_DEBUG("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_phand_nv"); + zfcp_erp_adapter_reopen(port->adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PORT_BOXED: + ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n"); + ZFCP_LOG_DEBUG("The remote port with WWPN 0x%Lx on the adapter " + "%s needs to be reopened but it was attempted " + "to close it physically.\n", + port->wwpn, + zfcp_get_busid_by_port(port)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_pboxed"); + zfcp_erp_port_reopen(port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | + ZFCP_STATUS_FSFREQ_RETRY; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ltest"); + /* This will now be escalated by ERP */ + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n"); + /* ERP strategy will escalate */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ulp"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + default: + ZFCP_LOG_NORMAL + ("bug: Wrong status qualifier 0x%x arrived.\n", + fsf_req->qtcb->header.fsf_status_qual.word[0]); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_inval:"); + debug_exception( + fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status_qual.word[0], + sizeof (u32)); + break; + } + break; + + case FSF_GOOD: + ZFCP_LOG_FLAGS(3, "FSF_GOOD\n"); + ZFCP_LOG_DEBUG("Remote port (WWPN=0x%Lx) via adapter " + "(busid=%s) physically closed, " + "port handle 0x%x\n", + port->wwpn, + zfcp_get_busid_by_port(port), port->handle); + /* can't use generic zfcp_erp_modify_port_status because + * ZFCP_STATUS_COMMON_OPEN must not be reset for the port + */ + atomic_clear_mask(ZFCP_STATUS_PORT_PHYS_OPEN, &port->status); + list_for_each_entry(unit, &port->unit_list_head, list) + atomic_clear_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status); + retval = 0; + break; + + default: + ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " + "(debug info 0x%x)\n", + fsf_req->qtcb->header.fsf_status); + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status, + sizeof (u32)); + break; + } + + skip_fsfstatus: + atomic_clear_mask(ZFCP_STATUS_PORT_PHYS_CLOSING, &port->status); + return retval; +} + +/* + * function: zfcp_fsf_open_unit + * + * purpose: + * + * returns: + * + * assumptions: This routine does not check whether the associated + * remote port has already been opened. This should be + * done by calling routines. Otherwise some status + * may be presented by FSF + */ +int +zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(erp_action->adapter, + FSF_QTCB_OPEN_LUN, + &lock_flags, + ZFCP_WAIT_FOR_SBAL | ZFCP_REQ_AUTO_CLEANUP, + &(erp_action->fsf_req)); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create an " + "open unit request for FCP-LUN 0x%Lx connected " + "to the port with WWPN 0x%Lx connected to " + "the adapter %s.\n", + erp_action->unit->fcp_lun, + erp_action->unit->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto out; + } + + erp_action->fsf_req->qtcb->header.port_handle = + erp_action->port->handle; + *(fcp_lun_t *) & (erp_action->fsf_req->qtcb->bottom.support.fcp_lun) + = erp_action->unit->fcp_lun; + atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, &erp_action->unit->status); + erp_action->fsf_req->data.open_unit.unit = erp_action->unit; + erp_action->fsf_req->erp_action = erp_action; + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer); + if (retval) { + ZFCP_LOG_INFO("error: Could not send an open unit request " + "on the adapter %s, port WWPN 0x%Lx for " + "unit LUN 0x%Lx\n", + zfcp_get_busid_by_adapter(erp_action->adapter), + erp_action->port->wwpn, + erp_action->unit->fcp_lun); + zfcp_fsf_req_free(erp_action->fsf_req); + erp_action->fsf_req = NULL; + goto out; + } + + ZFCP_LOG_TRACE("Open LUN request initiated (adapter busid=%s, " + "port wwpn=0x%Lx, unit fcp_lun=0x%Lx)\n", + zfcp_get_busid_by_adapter(erp_action->adapter), + erp_action->port->wwpn, erp_action->unit->fcp_lun); + out: + write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, + lock_flags); + return retval; +} + +/* + * function: zfcp_fsf_open_unit_handler + * + * purpose: is called for finished Open LUN command + * + * returns: + */ +static int +zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = -EINVAL; + struct zfcp_unit *unit; + + unit = fsf_req->data.open_unit.unit; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* don't change unit status in our bookkeeping */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x " + "for the port with WWPN 0x%Lx connected to " + "the adapter %s is" + "not valid. This may happen occasionally.\n", + unit->port->handle, + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_DEBUG("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, "fsf_s_ph_nv"); + zfcp_erp_adapter_reopen(unit->port->adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_LUN_ALREADY_OPEN: + ZFCP_LOG_FLAGS(0, "FSF_LUN_ALREADY_OPEN\n"); + ZFCP_LOG_NORMAL("bug: Attempted to open the logical unit " + "with FCP-LUN 0x%Lx at " + "the remote port with WWPN 0x%Lx connected " + "to the adapter %s twice.\n", + unit->fcp_lun, + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_s_uopen"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PORT_BOXED: + ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n"); + ZFCP_LOG_DEBUG("The remote port " + "with WWPN 0x%Lx on the adapter %s " + "needs to be reopened\n", + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); + zfcp_erp_port_reopen(unit->port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | + ZFCP_STATUS_FSFREQ_RETRY; + break; + + case FSF_LUN_IN_USE: + ZFCP_LOG_FLAGS(0, "FSF_LUN_IN_USE\n"); + ZFCP_LOG_NORMAL("error: FCP-LUN 0x%Lx at " + "the remote port with WWPN 0x%Lx connected " + "to the adapter %s " + "is already owned by another operating system " + "instance (LPAR or VM guest)\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_NORMAL("Additional sense data is presented:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 2, + "fsf_s_l_in_use"); + zfcp_erp_unit_failed(unit); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED: + ZFCP_LOG_FLAGS(1, "FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED\n"); + ZFCP_LOG_INFO("error: The adapter ran out of resources. " + "There is no handle (temporary port identifier) " + "available for the unit with FCP-LUN 0x%Lx " + "at the remote port with WWPN 0x%Lx connected " + "to the adapter %s\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_max_units"); + zfcp_erp_unit_failed(unit); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); + /* Re-establish link to port */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ltest"); + zfcp_erp_port_reopen(unit->port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n"); + /* ERP strategy will escalate */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ulp"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + default: + ZFCP_LOG_NORMAL + ("bug: Wrong status qualifier 0x%x arrived.\n", + fsf_req->qtcb->header.fsf_status_qual.word[0]); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_inval:"); + debug_exception( + fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status_qual.word[0], + sizeof (u32)); + } + break; + + case FSF_GOOD: + ZFCP_LOG_FLAGS(3, "FSF_GOOD\n"); + /* save LUN handle assigned by FSF */ + unit->handle = fsf_req->qtcb->header.lun_handle; + ZFCP_LOG_TRACE("unit (FCP_LUN=0x%Lx) of remote port " + "(WWPN=0x%Lx) via adapter (busid=%s) opened, " + "port handle 0x%x \n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + unit->handle); + /* mark unit as open */ + atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status); + retval = 0; + break; + + default: + ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " + "(debug info 0x%x)\n", + fsf_req->qtcb->header.fsf_status); + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status, + sizeof (u32)); + break; + } + + skip_fsfstatus: + atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING, &unit->status); + return retval; +} + +/* + * function: zfcp_fsf_close_unit + * + * purpose: + * + * returns: address of fsf_req - request successfully initiated + * NULL - + * + * assumptions: This routine does not check whether the associated + * remote port/lun has already been opened. This should be + * done by calling routines. Otherwise some status + * may be presented by FSF + */ +int +zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) +{ + int retval = 0; + unsigned long lock_flags; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(erp_action->adapter, + FSF_QTCB_CLOSE_LUN, + &lock_flags, + ZFCP_WAIT_FOR_SBAL | ZFCP_REQ_AUTO_CLEANUP, + &(erp_action->fsf_req)); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create a " + "close unit request for FCP-LUN 0x%Lx " + "connected to the port with WWPN 0x%Lx connected " + "to the adapter %s.\n", + erp_action->unit->fcp_lun, + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + goto out; + } + + erp_action->fsf_req->qtcb->header.port_handle = + erp_action->port->handle; + erp_action->fsf_req->qtcb->header.lun_handle = erp_action->unit->handle; + atomic_set_mask(ZFCP_STATUS_COMMON_CLOSING, &erp_action->unit->status); + erp_action->fsf_req->data.close_unit.unit = erp_action->unit; + erp_action->fsf_req->erp_action = erp_action; + + /* start QDIO request for this FSF request */ + retval = zfcp_fsf_req_send(erp_action->fsf_req, &erp_action->timer); + if (retval) { + ZFCP_LOG_INFO("error: Could not send a close unit request for " + "FCP-LUN 0x%Lx connected to the port with " + "WWPN 0x%Lx connected to the adapter %s.\n", + erp_action->unit->fcp_lun, + erp_action->port->wwpn, + zfcp_get_busid_by_adapter(erp_action->adapter)); + zfcp_fsf_req_free(erp_action->fsf_req); + erp_action->fsf_req = NULL; + goto out; + } + + ZFCP_LOG_TRACE("Close LUN request initiated (adapter busid=%s, " + "port wwpn=0x%Lx, unit fcp_lun=0x%Lx)\n", + zfcp_get_busid_by_adapter(erp_action->adapter), + erp_action->port->wwpn, erp_action->unit->fcp_lun); + out: + write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, + lock_flags); + return retval; +} + +/* + * function: zfcp_fsf_close_unit_handler + * + * purpose: is called for finished Close LUN FSF command + * + * returns: + */ +static int +zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = -EINVAL; + struct zfcp_unit *unit; + + unit = fsf_req->data.close_unit.unit; /* restore unit */ + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* don't change unit status in our bookkeeping */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x " + "for the port with WWPN 0x%Lx connected to " + "the adapter %s is not valid. This may " + "happen in rare circumstances\n", + unit->port->handle, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_DEBUG("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_phand_nv"); + zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_cmd_dbf_event_fsf("porthinv", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_LUN_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary LUN identifier (handle) 0x%x " + "of the logical unit with FCP-LUN 0x%Lx at " + "the remote port with WWPN 0x%Lx connected " + "to the adapter %s is " + "not valid. This may happen occasionally.\n", + unit->handle, + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_DEBUG("Status qualifier data:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_lhand_nv"); + zfcp_erp_port_reopen(unit->port, 0); + zfcp_cmd_dbf_event_fsf("lunhinv", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PORT_BOXED: + ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n"); + ZFCP_LOG_DEBUG("The remote port " + "with WWPN 0x%Lx on the adapter %s " + "needs to be reopened\n", + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); + zfcp_erp_port_reopen(unit->port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | + ZFCP_STATUS_FSFREQ_RETRY; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); + /* re-establish link to port */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ltest"); + zfcp_erp_port_reopen(unit->port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n"); + /* ERP strategy will escalate */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ulp"); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + default: + ZFCP_LOG_NORMAL + ("bug: Wrong status qualifier 0x%x arrived.\n", + fsf_req->qtcb->header.fsf_status_qual.word[0]); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_inval:"); + debug_exception( + fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status_qual.word[0], + sizeof (u32)); + break; + } + break; + + case FSF_GOOD: + ZFCP_LOG_FLAGS(3, "FSF_GOOD\n"); + ZFCP_LOG_TRACE("unit (FCP_LUN=0x%Lx) of remote port " + "(WWPN=0x%Lx) via adapter (busid=%s) closed, " + "port handle 0x%x \n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + unit->handle); + /* mark unit as closed */ + atomic_clear_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status); + retval = 0; + break; + + default: + ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " + "(debug info 0x%x)\n", + fsf_req->qtcb->header.fsf_status); + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status, + sizeof (u32)); + break; + } + + skip_fsfstatus: + atomic_clear_mask(ZFCP_STATUS_COMMON_CLOSING, &unit->status); + return retval; +} + +/* + * function: zfcp_fsf_send_fcp_command_task + * + * purpose: + * + * returns: + * + * note: we do not employ linked commands (not supported by HBA anyway) + */ +int +zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter, + struct zfcp_unit *unit, + Scsi_Cmnd * scsi_cmnd, int req_flags) +{ + struct zfcp_fsf_req *fsf_req = NULL; + struct fcp_cmnd_iu *fcp_cmnd_iu; + volatile struct qdio_buffer_element *buffere; + unsigned int sbtype; + unsigned long lock_flags; + int real_bytes = 0; + int retval = 0; + + /* setup new FSF request */ + + retval = zfcp_fsf_req_create(adapter, + FSF_QTCB_FCP_CMND, + &lock_flags, req_flags, &(fsf_req)); + if (retval < 0) { + ZFCP_LOG_DEBUG("error: Out of resources. Could not create an " + "FCP command request for FCP-LUN 0x%Lx " + "connected to the port with WWPN 0x%Lx " + "connected to the adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_adapter(adapter)); + goto failed_req_create; + } + + /* + * associate FSF request with SCSI request + * (need this for look up on abort) + */ + fsf_req->data.send_fcp_command_task.fsf_req = fsf_req; + scsi_cmnd->host_scribble = (char *) &(fsf_req->data); + + /* + * associate SCSI command with FSF request + * (need this for look up on normal command completion) + */ + fsf_req->data.send_fcp_command_task.scsi_cmnd = scsi_cmnd; +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 3, "fsf/sc"); + debug_event(adapter->req_dbf, 3, &fsf_req, sizeof (unsigned long)); + debug_event(adapter->req_dbf, 3, &scsi_cmnd, sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ +#ifdef ZFCP_DEBUG_ABORTS + fsf_req->data.send_fcp_command_task.start_jiffies = jiffies; +#endif + + fsf_req->data.send_fcp_command_task.unit = unit; + ZFCP_LOG_DEBUG("unit=0x%lx, unit_fcp_lun=0x%Lx\n", + (unsigned long) unit, unit->fcp_lun); + + /* set handles of unit and its parent port in QTCB */ + fsf_req->qtcb->header.lun_handle = unit->handle; + fsf_req->qtcb->header.port_handle = unit->port->handle; + + /* FSF does not define the structure of the FCP_CMND IU */ + fcp_cmnd_iu = (struct fcp_cmnd_iu *) + &(fsf_req->qtcb->bottom.io.fcp_cmnd); + + /* + * set depending on data direction: + * data direction bits in SBALE (SB Type) + * data direction bits in QTCB + * data direction bits in FCP_CMND IU + */ + switch (scsi_cmnd->sc_data_direction) { + case SCSI_DATA_NONE: + ZFCP_LOG_FLAGS(3, "SCSI_DATA_NONE\n"); + fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_CMND; + /* + * FIXME(qdio): + * what is the correct type for commands + * without 'real' data buffers? + */ + sbtype = SBAL_FLAGS0_TYPE_READ; + break; + case SCSI_DATA_READ: + ZFCP_LOG_FLAGS(3, "SCSI_DATA_READ\n"); + fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_READ; + sbtype = SBAL_FLAGS0_TYPE_READ; + fcp_cmnd_iu->rddata = 1; + break; + case SCSI_DATA_WRITE: + ZFCP_LOG_FLAGS(3, "SCSI_DATA_WRITE\n"); + fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_WRITE; + sbtype = SBAL_FLAGS0_TYPE_WRITE; + fcp_cmnd_iu->wddata = 1; + break; + case SCSI_DATA_UNKNOWN: + ZFCP_LOG_FLAGS(0, "SCSI_DATA_UNKNOWN not supported\n"); + default: + /* + * dummy, catch this condition earlier + * in zfcp_scsi_queuecommand + */ + goto failed_scsi_cmnd; + } + buffere = + &(adapter->request_queue.buffer[fsf_req->sbal_index]->element[0]); + buffere->flags |= sbtype; + + /* set FC service class in QTCB (3 per default) */ + fsf_req->qtcb->bottom.io.service_class = adapter->fc_service_class; + + /* set FCP_LUN in FCP_CMND IU in QTCB */ + fcp_cmnd_iu->fcp_lun = unit->fcp_lun; + + /* set task attributes in FCP_CMND IU in QTCB */ + if (scsi_cmnd->device->simple_tags) { + fcp_cmnd_iu->task_attribute = SIMPLE_Q; + ZFCP_LOG_TRACE("setting SIMPLE_Q task attribute\n"); + } else { + fcp_cmnd_iu->task_attribute = UNTAGGED; + ZFCP_LOG_TRACE("setting UNTAGGED task attribute\n"); + } + + /* set additional length of FCP_CDB in FCP_CMND IU in QTCB, if needed */ + if (scsi_cmnd->cmd_len > FCP_CDB_LENGTH) { + fcp_cmnd_iu->add_fcp_cdb_length + = (scsi_cmnd->cmd_len - FCP_CDB_LENGTH) >> 2; + ZFCP_LOG_TRACE("SCSI CDB length is 0x%x, " + "additional FCP_CDB length is 0x%x " + "(shifted right 2 bits)\n", + scsi_cmnd->cmd_len, + fcp_cmnd_iu->add_fcp_cdb_length); + } + /* + * copy SCSI CDB (including additional length, if any) to + * FCP_CDB in FCP_CMND IU in QTCB + */ + memcpy(fcp_cmnd_iu->fcp_cdb, scsi_cmnd->cmnd, scsi_cmnd->cmd_len); + + /* FCP CMND IU length in QTCB */ + fsf_req->qtcb->bottom.io.fcp_cmnd_length = + sizeof (struct fcp_cmnd_iu) + + fcp_cmnd_iu->add_fcp_cdb_length + sizeof (fcp_dl_t); + + /* generate SBALEs from data buffer */ + real_bytes = zfcp_create_sbals_from_sg(fsf_req, + scsi_cmnd, + sbtype, + 0, ZFCP_MAX_SBALS_PER_REQ); + /* Note: >= and not = because the combined scatter-gather entries + * may be larger than request_bufflen according to the mailing list + */ + if (real_bytes >= scsi_cmnd->request_bufflen) { + ZFCP_LOG_TRACE("Data fits\n"); + } else if (real_bytes == 0) { + ZFCP_LOG_DEBUG("Data did not fit into available buffer(s), " + "waiting for more...\n"); + retval = -EIO; + goto no_fit; + } else { + ZFCP_LOG_NORMAL("error: No truncation implemented but " + "required. Shutting down unit (busid=%s, " + "WWPN=0x%16.16Lx, FCP_LUN=0x%16.16Lx)\n", + zfcp_get_busid_by_unit(unit), + unit->port->wwpn, + unit->fcp_lun); + zfcp_erp_unit_shutdown(unit, 0); + retval = -EINVAL; + goto no_fit; + } + + /* set length of FCP data length in FCP_CMND IU in QTCB */ + zfcp_set_fcp_dl(fcp_cmnd_iu, real_bytes); + + ZFCP_LOG_DEBUG("Sending SCSI command:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) scsi_cmnd->cmnd, scsi_cmnd->cmd_len); + + /* + * start QDIO request for this FSF request + * covered by an SBALE) + */ + retval = zfcp_fsf_req_send(fsf_req, NULL); + if (retval < 0) { + ZFCP_LOG_INFO("error: Could not send an FCP command request " + "for a command on the adapter %s, " + "port WWPN 0x%Lx and unit LUN 0x%Lx\n", + zfcp_get_busid_by_adapter(adapter), + unit->port->wwpn, + unit->fcp_lun); + goto send_failed; + } + + ZFCP_LOG_TRACE("Send FCP Command initiated (adapter busid=%s, " + "port wwpn=0x%Lx, unit fcp_lun=0x%Lx)\n", + zfcp_get_busid_by_adapter(adapter), + unit->port->wwpn, + unit->fcp_lun); + goto success; + + send_failed: + no_fit: + failed_scsi_cmnd: + /* dequeue new FSF request previously enqueued */ +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 3, "fail_sc"); + debug_event(adapter->req_dbf, 3, &scsi_cmnd, sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + + zfcp_fsf_req_free(fsf_req); + fsf_req = NULL; + success: + failed_req_create: + write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); + return retval; +} + +/* + * function: zfcp_fsf_send_fcp_command_task_management + * + * purpose: + * + * returns: + * + * FIXME(design): should be watched by a timeout!!! + * FIXME(design) shouldn't this be modified to return an int + * also...don't know how though + * + */ +struct zfcp_fsf_req * +zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter, + struct zfcp_unit *unit, + u8 tm_flags, int req_flags) +{ + struct zfcp_fsf_req *fsf_req = NULL; + int retval = 0; + struct fcp_cmnd_iu *fcp_cmnd_iu; + unsigned long lock_flags; + volatile struct qdio_buffer_element *buffere; + + /* setup new FSF request */ + retval = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, + &lock_flags, req_flags, &(fsf_req)); + if (retval < 0) { + ZFCP_LOG_INFO("error: Out of resources. Could not create an " + "FCP command (task management) request for " + "the adapter %s, port with " + "WWPN 0x%Lx and FCP_LUN 0x%Lx.\n", + zfcp_get_busid_by_adapter(adapter), + unit->port->wwpn, unit->fcp_lun); + goto out; + } + + /* + * Used to decide on proper handler in the return path, + * could be either zfcp_fsf_send_fcp_command_task_handler or + * zfcp_fsf_send_fcp_command_task_management_handler */ + + fsf_req->status |= ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT; + + /* + * hold a pointer to the unit being target of this + * task management request + */ + fsf_req->data.send_fcp_command_task_management.unit = unit; + + /* set FSF related fields in QTCB */ + fsf_req->qtcb->header.lun_handle = unit->handle; + fsf_req->qtcb->header.port_handle = unit->port->handle; + fsf_req->qtcb->bottom.io.data_direction = FSF_DATADIR_CMND; + fsf_req->qtcb->bottom.io.service_class = adapter->fc_service_class; + fsf_req->qtcb->bottom.io.fcp_cmnd_length = + sizeof (struct fcp_cmnd_iu) + sizeof (fcp_dl_t); + + buffere = + &(adapter->request_queue.buffer[fsf_req->sbal_index]->element[0]); + buffere[0].flags |= SBAL_FLAGS0_TYPE_WRITE; + buffere[1].flags |= SBAL_FLAGS_LAST_ENTRY; + + /* set FCP related fields in FCP_CMND IU in QTCB */ + fcp_cmnd_iu = (struct fcp_cmnd_iu *) + &(fsf_req->qtcb->bottom.io.fcp_cmnd); + fcp_cmnd_iu->fcp_lun = unit->fcp_lun; + fcp_cmnd_iu->task_management_flags = tm_flags; + + /* start QDIO request for this FSF request */ + zfcp_fsf_start_scsi_er_timer(adapter); + retval = zfcp_fsf_req_send(fsf_req, NULL); + if (retval) { + del_timer(&adapter->scsi_er_timer); + ZFCP_LOG_INFO("error: Could not send an FCP-command (task " + "management) on the adapter %s, port WWPN " + "0x%Lx for unit LUN 0x%Lx\n", + zfcp_get_busid_by_adapter(adapter), + unit->port->wwpn, + unit->fcp_lun); + zfcp_fsf_req_free(fsf_req); + fsf_req = NULL; + goto out; + } + + ZFCP_LOG_TRACE("Send FCP Command (task management function) initiated " + "(adapter busid=%s, port wwpn=0x%Lx, " + "unit fcp_lun=0x%Lx, tm_flags=0x%x)\n", + zfcp_get_busid_by_adapter(adapter), + unit->port->wwpn, + unit->fcp_lun, + tm_flags); + out: + write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); + return fsf_req; +} + +/* + * function: zfcp_fsf_send_fcp_command_handler + * + * purpose: is called for finished Send FCP Command + * + * returns: + */ +static int +zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = -EINVAL; + struct zfcp_unit *unit; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT) + unit = fsf_req->data.send_fcp_command_task_management.unit; + else + unit = fsf_req->data.send_fcp_command_task.unit; + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + /* go directly to calls of special handlers */ + goto skip_fsfstatus; + } + + /* evaluate FSF status in QTCB */ + switch (fsf_req->qtcb->header.fsf_status) { + + case FSF_PORT_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_PORT_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary port identifier (handle) 0x%x " + "for the port with WWPN 0x%Lx connected to " + "the adapter %s is not valid.\n", + unit->port->handle, + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_phand_nv"); + zfcp_erp_adapter_reopen(unit->port->adapter, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_LUN_HANDLE_NOT_VALID: + ZFCP_LOG_FLAGS(1, "FSF_LUN_HANDLE_NOT_VALID\n"); + ZFCP_LOG_INFO("Temporary LUN identifier (handle) 0x%x " + "of the logical unit with FCP-LUN 0x%Lx at " + "the remote port with WWPN 0x%Lx connected " + "to the adapter %s is " + "not valid. This may happen occasionally.\n", + unit->handle, + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_NORMAL("Status qualifier data:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_uhand_nv"); + zfcp_erp_port_reopen(unit->port, 0); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_HANDLE_MISMATCH: + ZFCP_LOG_FLAGS(0, "FSF_HANDLE_MISMATCH\n"); + ZFCP_LOG_NORMAL("bug: The port handle (temporary port " + "identifier) 0x%x has changed unexpectedly. " + "This was detected upon receiveing the " + "response of a command send to the unit with " + "FCP-LUN 0x%Lx at the remote port with WWPN " + "0x%Lx connected to the adapter %s.\n", + unit->port->handle, + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + ZFCP_LOG_NORMAL("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_hand_mis"); + zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_cmd_dbf_event_fsf("handmism", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_SERVICE_CLASS_NOT_SUPPORTED: + ZFCP_LOG_FLAGS(0, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n"); + if (fsf_req->adapter->fc_service_class <= 3) { + ZFCP_LOG_NORMAL("error: The adapter %s does " + "not support fibre-channel class %d.\n", + zfcp_get_busid_by_unit(unit), + fsf_req->adapter->fc_service_class); + } else { + ZFCP_LOG_NORMAL("bug: The fibre channel class at the " + "adapter %s is invalid. " + "(debug info %d)\n", + zfcp_get_busid_by_unit(unit), + fsf_req->adapter->fc_service_class); + } + /* stop operation for this adapter */ + debug_text_exception(fsf_req->adapter->erp_dbf, 0, + "fsf_s_class_nsup"); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_cmd_dbf_event_fsf("unsclass", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_FCPLUN_NOT_VALID: + ZFCP_LOG_FLAGS(0, "FSF_FCPLUN_NOT_VALID\n"); + ZFCP_LOG_NORMAL("bug: The FCP LUN 0x%Lx behind the remote port " + "of WWPN0x%Lx via the adapter %s does not have " + "the correct unit handle (temporary unit " + "identifier) 0x%x\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + unit->handle); + ZFCP_LOG_DEBUG("status qualifier:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_s_fcp_lun_nv"); + zfcp_erp_port_reopen(unit->port, 0); + zfcp_cmd_dbf_event_fsf("fluninv", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_DIRECTION_INDICATOR_NOT_VALID: + ZFCP_LOG_FLAGS(0, "FSF_DIRECTION_INDICATOR_NOT_VALID\n"); + ZFCP_LOG_INFO("bug: Invalid data direction given for the unit " + "with FCP LUN 0x%Lx at the remote port with " + "WWPN 0x%Lx via the adapter %s " + "(debug info %d)\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + fsf_req->qtcb->bottom.io.data_direction); + /* stop operation for this adapter */ + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_s_dir_ind_nv"); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_cmd_dbf_event_fsf("dirinv", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + /* FIXME: this should be obsolete, isn' it? */ + case FSF_INBOUND_DATA_LENGTH_NOT_VALID: + ZFCP_LOG_FLAGS(0, "FSF_INBOUND_DATA_LENGTH_NOT_VALID\n"); + ZFCP_LOG_NORMAL("bug: An invalid inbound data length field " + "was found in a command for the unit with " + "FCP LUN 0x%Lx of the remote port " + "with WWPN 0x%Lx via the adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + /* stop operation for this adapter */ + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_s_in_dl_nv"); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_cmd_dbf_event_fsf("idleninv", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + /* FIXME: this should be obsolete, isn' it? */ + case FSF_OUTBOUND_DATA_LENGTH_NOT_VALID: + ZFCP_LOG_FLAGS(0, "FSF_OUTBOUND_DATA_LENGTH_NOT_VALID\n"); + ZFCP_LOG_NORMAL("bug: An invalid outbound data length field " + "was found in a command for the unit with " + "FCP LUN 0x%Lx of the remote port " + "with WWPN 0x%Lx via the adapter %s\n.", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + /* stop operation for this adapter */ + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_s_out_dl_nv"); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_cmd_dbf_event_fsf("odleninv", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_CMND_LENGTH_NOT_VALID: + ZFCP_LOG_FLAGS(0, "FSF_CMND_LENGTH_NOT_VALID\n"); + ZFCP_LOG_NORMAL + ("bug: An invalid control-data-block length field " + "was found in a command for the unit with " + "FCP LUN 0x%Lx of the remote port " + "with WWPN 0x%Lx via the adapter %s " "(debug info %d)\n", + unit->fcp_lun, unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + fsf_req->qtcb->bottom.io.fcp_cmnd_length); + /* stop operation for this adapter */ + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_s_cmd_len_nv"); + zfcp_erp_adapter_shutdown(unit->port->adapter, 0); + zfcp_cmd_dbf_event_fsf("cleninv", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + + case FSF_PORT_BOXED: + ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n"); + ZFCP_LOG_DEBUG("The remote port " + "with WWPN 0x%Lx on the adapter %s " + "needs to be reopened\n", + unit->port->wwpn, zfcp_get_busid_by_unit(unit)); + debug_text_event(fsf_req->adapter->erp_dbf, 2, "fsf_s_pboxed"); + zfcp_erp_port_reopen(unit->port, 0); + zfcp_cmd_dbf_event_fsf("portbox", fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR | + ZFCP_STATUS_FSFREQ_RETRY; + break; + + case FSF_ADAPTER_STATUS_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); + switch (fsf_req->qtcb->header.fsf_status_qual.word[0]) { + case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE: + ZFCP_LOG_FLAGS(2, + "FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); + /* re-establish link to port */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ltest"); + zfcp_erp_port_reopen(unit->port, 0); + zfcp_cmd_dbf_event_fsf( + "sqltest", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED: + ZFCP_LOG_FLAGS(3, + "FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n"); + /* FIXME(hw) need proper specs for proper action */ + /* let scsi stack deal with retries and escalation */ + debug_text_event(fsf_req->adapter->erp_dbf, 1, + "fsf_sq_ulp"); + zfcp_cmd_dbf_event_fsf( + "sqdeperp", + fsf_req, + &fsf_req->qtcb->header.fsf_status_qual, + sizeof (union fsf_status_qual)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; + break; + default: + /* FIXME: shall we consider this a successful transfer? */ + ZFCP_LOG_NORMAL + ("bug: Wrong status qualifier 0x%x arrived.\n", + fsf_req->qtcb->header.fsf_status_qual.word[0]); + debug_text_event(fsf_req->adapter->erp_dbf, 0, + "fsf_sq_inval:"); + debug_exception( + fsf_req->adapter->erp_dbf, + 0, + &fsf_req->qtcb->header.fsf_status_qual.word[0], + sizeof (u32)); + break; + } + break; + + case FSF_GOOD: + ZFCP_LOG_FLAGS(3, "FSF_GOOD\n"); + break; + + case FSF_FCP_RSP_AVAILABLE: + ZFCP_LOG_FLAGS(2, "FSF_FCP_RSP_AVAILABLE\n"); + break; + + default: + debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf_s_inval:"); + debug_exception(fsf_req->adapter->erp_dbf, 0, + &fsf_req->qtcb->header.fsf_status, + sizeof (u32)); + break; + } + + skip_fsfstatus: + if (fsf_req->status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT) { + retval = + zfcp_fsf_send_fcp_command_task_management_handler(fsf_req); + } else { + retval = zfcp_fsf_send_fcp_command_task_handler(fsf_req); + } + return retval; +} + +/* + * function: zfcp_fsf_send_fcp_command_task_handler + * + * purpose: evaluates FCP_RSP IU + * + * returns: + */ +static int +zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + struct zfcp_adapter *adapter = fsf_req->adapter; + + Scsi_Cmnd *scpnt; + struct fcp_rsp_iu *fcp_rsp_iu = (struct fcp_rsp_iu *) + &(fsf_req->qtcb->bottom.io.fcp_rsp); + struct fcp_cmnd_iu *fcp_cmnd_iu = (struct fcp_cmnd_iu *) + &(fsf_req->qtcb->bottom.io.fcp_cmnd); + u32 sns_len; + char *fcp_rsp_info = zfcp_get_fcp_rsp_info_ptr(fcp_rsp_iu); + unsigned long flags; + struct zfcp_unit *unit = fsf_req->data.send_fcp_command_task.unit; + + read_lock_irqsave(&fsf_req->adapter->abort_lock, flags); + scpnt = fsf_req->data.send_fcp_command_task.scsi_cmnd; + if (!scpnt) { + ZFCP_LOG_DEBUG + ("Command with fsf_req 0x%lx is not associated to " + "a scsi command anymore. Aborted?\n", + (unsigned long) fsf_req); + goto out; + } + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTED) { + /* FIXME: (design) mid-layer should handle DID_ABORT like + * DID_SOFT_ERROR by retrying the request for devices + * that allow retries. + */ + ZFCP_LOG_DEBUG("Setting DID_SOFT_ERROR and SUGGEST_RETRY\n"); + set_host_byte(&scpnt->result, DID_SOFT_ERROR); + set_driver_byte(&scpnt->result, SUGGEST_RETRY); + goto skip_fsfstatus; + } + + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + ZFCP_LOG_DEBUG("Setting DID_ERROR\n"); + set_host_byte(&scpnt->result, DID_ERROR); + goto skip_fsfstatus; + } + + /* set message byte of result in SCSI command */ + scpnt->result |= COMMAND_COMPLETE << 8; + + /* + * copy SCSI status code of FCP_STATUS of FCP_RSP IU to status byte + * of result in SCSI command + */ + scpnt->result |= fcp_rsp_iu->scsi_status; + if (fcp_rsp_iu->scsi_status) { + /* DEBUG */ + ZFCP_LOG_NORMAL("status for SCSI Command:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + scpnt->cmnd, scpnt->cmd_len); + + ZFCP_LOG_NORMAL("SCSI status code 0x%x\n", + fcp_rsp_iu->scsi_status); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (void *) fcp_rsp_iu, sizeof (struct fcp_rsp_iu)); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + zfcp_get_fcp_sns_info_ptr(fcp_rsp_iu), + fcp_rsp_iu->fcp_sns_len); + } + + /* check FCP_RSP_INFO */ + if (fcp_rsp_iu->validity.bits.fcp_rsp_len_valid) { + ZFCP_LOG_DEBUG("rsp_len is valid\n"); + switch (fcp_rsp_info[3]) { + case RSP_CODE_GOOD: + ZFCP_LOG_FLAGS(3, "RSP_CODE_GOOD\n"); + /* ok, continue */ + ZFCP_LOG_TRACE("no failure or Task Management " + "Function complete\n"); + set_host_byte(&scpnt->result, DID_OK); + break; + case RSP_CODE_LENGTH_MISMATCH: + ZFCP_LOG_FLAGS(0, "RSP_CODE_LENGTH_MISMATCH\n"); + /* hardware bug */ + ZFCP_LOG_NORMAL("bug: FCP response code indictates " + " that the fibre-channel protocol data " + "length differs from the burst length. " + "The problem occured on the unit " + "with FCP LUN 0x%Lx connected to the " + "port with WWPN 0x%Lx at the " + "adapter %s", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + /* dump SCSI CDB as prepared by zfcp */ + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb-> + bottom.io.fcp_cmnd, FSF_FCP_CMND_SIZE); + zfcp_cmd_dbf_event_fsf("clenmis", fsf_req, NULL, 0); + set_host_byte(&scpnt->result, DID_ERROR); + goto skip_fsfstatus; + case RSP_CODE_FIELD_INVALID: + ZFCP_LOG_FLAGS(0, "RSP_CODE_FIELD_INVALID\n"); + /* driver or hardware bug */ + ZFCP_LOG_NORMAL("bug: FCP response code indictates " + "that the fibre-channel protocol data " + "fields were incorrectly set-up. " + "The problem occured on the unit " + "with FCP LUN 0x%Lx connected to the " + "port with WWPN 0x%Lx at the " + "adapter %s", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + /* dump SCSI CDB as prepared by zfcp */ + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb-> + bottom.io.fcp_cmnd, FSF_FCP_CMND_SIZE); + set_host_byte(&scpnt->result, DID_ERROR); + zfcp_cmd_dbf_event_fsf("codeinv", fsf_req, NULL, 0); + goto skip_fsfstatus; + case RSP_CODE_RO_MISMATCH: + ZFCP_LOG_FLAGS(0, "RSP_CODE_RO_MISMATCH\n"); + /* hardware bug */ + ZFCP_LOG_NORMAL("bug: The FCP response code indicates " + "that conflicting values for the " + "fibre-channel payload offset from the " + "header were found. " + "The problem occured on the unit " + "with FCP LUN 0x%Lx connected to the " + "port with WWPN 0x%Lx at the " + "adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + /* dump SCSI CDB as prepared by zfcp */ + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb-> + bottom.io.fcp_cmnd, FSF_FCP_CMND_SIZE); + zfcp_cmd_dbf_event_fsf("codemism", fsf_req, NULL, 0); + set_host_byte(&scpnt->result, DID_ERROR); + goto skip_fsfstatus; + default: + ZFCP_LOG_NORMAL("bug: An invalid FCP response " + "code was detected for a command. " + "The problem occured on the unit " + "with FCP LUN 0x%Lx connected to the " + "port with WWPN 0x%Lx at the " + "adapter %s " + "(debug info 0x%x)\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + fcp_rsp_info[3]); + /* dump SCSI CDB as prepared by zfcp */ + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) &fsf_req->qtcb-> + bottom.io.fcp_cmnd, FSF_FCP_CMND_SIZE); + zfcp_cmd_dbf_event_fsf("undeffcp", fsf_req, NULL, 0); + set_host_byte(&scpnt->result, DID_ERROR); + } + } + + /* check for sense data */ + if (fcp_rsp_iu->validity.bits.fcp_sns_len_valid) { + sns_len = FSF_FCP_RSP_SIZE - + sizeof (struct fcp_rsp_iu) + fcp_rsp_iu->fcp_rsp_len; + ZFCP_LOG_TRACE("room for %i bytes sense data in QTCB\n", + sns_len); + sns_len = min(sns_len, (u32) SCSI_SENSE_BUFFERSIZE); + ZFCP_LOG_TRACE("room for %i bytes sense data in SCSI command\n", + SCSI_SENSE_BUFFERSIZE); + sns_len = min(sns_len, fcp_rsp_iu->fcp_sns_len); + ZFCP_LOG_TRACE("scpnt->result =0x%x, command was:\n", + scpnt->result); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, + (void *) &scpnt->cmnd, scpnt->cmd_len); + + ZFCP_LOG_TRACE("%i bytes sense data provided by FCP\n", + fcp_rsp_iu->fcp_sns_len); + memcpy(&scpnt->sense_buffer, + zfcp_get_fcp_sns_info_ptr(fcp_rsp_iu), sns_len); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, + (void *) &scpnt->sense_buffer, sns_len); + } + + /* check for overrun */ + if (fcp_rsp_iu->validity.bits.fcp_resid_over) { + ZFCP_LOG_INFO("A data overrun was detected for a command. " + "This happened for a command to the unit " + "with FCP LUN 0x%Lx connected to the " + "port with WWPN 0x%Lx at the adapter %s. " + "The response data length is " + "%d, the original length was %d.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + fcp_rsp_iu->fcp_resid, + (int) zfcp_get_fcp_dl(fcp_cmnd_iu)); + } + + /* check for underrun */ + if (fcp_rsp_iu->validity.bits.fcp_resid_under) { + ZFCP_LOG_DEBUG("A data underrun was detected for a command. " + "This happened for a command to the unit " + "with FCP LUN 0x%Lx connected to the " + "port with WWPN 0x%Lx at the adapter %s. " + "The response data length is " + "%d, the original length was %d.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + fcp_rsp_iu->fcp_resid, + (int) zfcp_get_fcp_dl(fcp_cmnd_iu)); + /* + * It may not have been possible to send all data and the + * underrun on send may already be in scpnt->resid, so it's add + * not equals in the below statement. + */ + scpnt->resid += fcp_rsp_iu->fcp_resid; + ZFCP_LOG_TRACE("scpnt->resid=0x%x\n", scpnt->resid); + } + + skip_fsfstatus: +#if 0 + /* + * This nasty chop at the problem is not working anymore + * as we do not adjust the retry count anylonger in order + * to have a number of retries that avoids I/O errors. + * The manipulation of the retry count has been removed + * in favour of a safe tape device handling. We must not + * sent SCSI commands more than once to a device if no + * retries are permitted by the high level driver. Generally + * speaking, it was a mess to change retry counts. So it is + * fine that this sort of workaround is gone. + * Then, we had to face a certain number of immediate retries in case of + * busy and queue full conditions (see below). + * This is not acceptable + * for the latter. Queue full conditions are used + * by devices to indicate to a host that the host can rely + * on the completion (or timeout) of at least one outstanding + * command as a suggested trigger for command retries. + * Busy conditions require a different trigger since + * no commands are outstanding for that initiator from the + * devices perspective. + * The drawback of mapping a queue full condition to a + * busy condition is the chance of wasting all retries prior + * to the time when the device indicates that a command + * rejected due to a queue full condition should be re-driven. + * This case would lead to unnecessary I/O errors that + * have to be considered fatal if for example ext3's + * journaling would be torpedoed by such an avoidable + * I/O error. + * So, what issues are there with not mapping a queue-full + * condition to a busy condition? + * Due to the 'exclusive LUN' + * policy enforced by the zSeries FCP channel, this + * Linux instance is the only initiator with regard to + * this adapter. It is safe to rely on the information + * 'don't disturb me now ... and btw. no other commands + * pending for you' (= queue full) sent by the LU, + * since no other Linux can use this LUN via this adapter + * at the same time. If there is a potential race + * introduced by the FCP channel by not inhibiting Linux A + * to give up a LU with commands pending while Linux B + * grabs this LU and sends commands - thus providing + * an exploit at the 'exclusive LUN' policy - then this + * issue has to be considered a hardware problem. It should + * be tracked as such if it really occurs. Even if the + * FCP Channel spec. begs exploiters to wait for the + * completion of all request sent to a LU prior to + * closing this LU connection. + * This spec. statement in conjunction with + * the 'exclusive LUN' policy is not consistent design. + * Another issue is how resource constraints for SCSI commands + * might be handled by the FCP channel (just guessing for now). + * If the FCP channel would always map resource constraints, + * e.g. no free FC exchange ID due to I/O stress caused by + * other sharing Linux instances, to faked queue-full + * conditions then this would be a misinterpretation and + * violation of SCSI standards. + * If there are SCSI stack races as indicated below + * then they need to be fixed just there. + * Providing all issue above are not applicable or will + * be fixed appropriately, removing the following hack + * is the right thing to do. + */ + + /* + * Note: This is a rather nasty chop at the problem. We cannot + * risk adding to the mlqueue however as this will block the + * device. If it is the last outstanding command for this host + * it will remain blocked indefinitely. This would be quite possible + * on the zSeries FCP adapter. + * Also, there exists a race with scsi_insert_special relying on + * scsi_request_fn to recalculate some command data which may not + * happen when q->plugged is true in scsi_request_fn + */ + if (status_byte(scpnt->result) == QUEUE_FULL) { + ZFCP_LOG_DEBUG("Changing QUEUE_FULL to BUSY....\n"); + scpnt->result &= ~(QUEUE_FULL << 1); + scpnt->result |= (BUSY << 1); + } +#endif + + ZFCP_LOG_DEBUG("scpnt->result =0x%x\n", scpnt->result); + + zfcp_cmd_dbf_event_scsi("response", scpnt); + + /* cleanup pointer (need this especially for abort) */ + scpnt->host_scribble = NULL; + + /* + * NOTE: + * according to the outcome of a discussion on linux-scsi we + * don't need to grab the io_request_lock here since we use + * the new eh + */ + /* always call back */ + (scpnt->scsi_done) (scpnt); + atomic_dec(&adapter->scsi_reqs_active); + wake_up(&adapter->scsi_reqs_active_wq); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(fsf_req->adapter->req_dbf, 2, "ok_done:"); + debug_event(fsf_req->adapter->req_dbf, 2, &scpnt, + sizeof (unsigned long)); + debug_event(fsf_req->adapter->req_dbf, 2, &scpnt->scsi_done, + sizeof (unsigned long)); + debug_event(fsf_req->adapter->req_dbf, 2, &fsf_req, + sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + (scpnt->scsi_done) (scpnt); + atomic_dec(&adapter->scsi_reqs_active); + wake_up(&adapter->scsi_reqs_active_wq); + /* + * We must hold this lock until scsi_done has been called. + * Otherwise we may call scsi_done after abort regarding this + * command has completed. + * Note: scsi_done must not block! + */ + out: + read_unlock_irqrestore(&fsf_req->adapter->abort_lock, flags); + return retval; +} + +/* + * function: zfcp_fsf_send_fcp_command_task_management_handler + * + * purpose: evaluates FCP_RSP IU + * + * returns: + */ +static int +zfcp_fsf_send_fcp_command_task_management_handler(struct zfcp_fsf_req *fsf_req) +{ + int retval = 0; + struct fcp_rsp_iu *fcp_rsp_iu = (struct fcp_rsp_iu *) + &(fsf_req->qtcb->bottom.io.fcp_rsp); + char *fcp_rsp_info = zfcp_get_fcp_rsp_info_ptr(fcp_rsp_iu); + struct zfcp_unit *unit = + fsf_req->data.send_fcp_command_task_management.unit; + + del_timer(&fsf_req->adapter->scsi_er_timer); + if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { + fsf_req->status |= ZFCP_STATUS_FSFREQ_TMFUNCFAILED; + goto skip_fsfstatus; + } + + /* check FCP_RSP_INFO */ + switch (fcp_rsp_info[3]) { + case RSP_CODE_GOOD: + ZFCP_LOG_FLAGS(3, "RSP_CODE_GOOD\n"); + /* ok, continue */ + ZFCP_LOG_DEBUG("no failure or Task Management " + "Function complete\n"); + break; + case RSP_CODE_TASKMAN_UNSUPP: + ZFCP_LOG_FLAGS(0, "RSP_CODE_TASKMAN_UNSUPP\n"); + ZFCP_LOG_NORMAL("bug: A reuested task management function " + "is not supported on the target device " + "The corresponding device is the unit with " + "FCP LUN 0x%Lx at the port " + "with WWPN 0x%Lx at the adapter %s\n ", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP; + break; + case RSP_CODE_TASKMAN_FAILED: + ZFCP_LOG_FLAGS(0, "RSP_CODE_TASKMAN_FAILED\n"); + ZFCP_LOG_NORMAL("bug: A reuested task management function " + "failed to complete successfully. " + "The corresponding device is the unit with " + "FCP LUN 0x%Lx at the port " + "with WWPN 0x%Lx at the adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit)); + fsf_req->status |= ZFCP_STATUS_FSFREQ_TMFUNCFAILED; + break; + default: + ZFCP_LOG_NORMAL("bug: An invalid FCP response " + "code was detected for a command. " + "The problem occured on the unit " + "with FCP LUN 0x%Lx connected to the " + "port with WWPN 0x%Lx at the adapter %s " + "(debug info 0x%x)\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_unit(unit), + fcp_rsp_info[3]); + fsf_req->status |= ZFCP_STATUS_FSFREQ_TMFUNCFAILED; + } + + skip_fsfstatus: + return retval; +} + +/* + * function: zfcp_fsf_req_wait_and_cleanup + * + * purpose: + * + * FIXME(design): signal seems to be <0 !!! + * returns: 0 - request completed (*status is valid), cleanup succ. + * <0 - request completed (*status is valid), cleanup failed + * >0 - signal which interrupted waiting (*status invalid), + * request not completed, no cleanup + * + * *status is a copy of status of completed fsf_req + */ +int +zfcp_fsf_req_wait_and_cleanup(struct zfcp_fsf_req *fsf_req, + int interruptible, u32 * status) +{ + int retval = 0; + int signal = 0; + + if (interruptible) { + __wait_event_interruptible(fsf_req->completion_wq, + fsf_req->status & + ZFCP_STATUS_FSFREQ_COMPLETED, + signal); + if (signal) { + ZFCP_LOG_DEBUG("Caught signal %i while waiting for the " + "completion of the request at 0x%lx\n", + signal, (unsigned long) fsf_req); + retval = signal; + goto out; + } + } else { + __wait_event(fsf_req->completion_wq, + fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED); + } + + *status = fsf_req->status; + + /* cleanup request */ + zfcp_fsf_req_cleanup(fsf_req); + out: + return retval; +} + +static inline int +zfcp_fsf_req_create_sbal_check(unsigned long *flags, + struct zfcp_qdio_queue *queue, int needed) +{ + write_lock_irqsave(&queue->queue_lock, *flags); + if (atomic_read(&queue->free_count) >= needed) + return 1; + write_unlock_irqrestore(&queue->queue_lock, *flags); + return 0; +} + +/* + * function: zfcp_fsf_req_create + * + * purpose: create an FSF request at the specified adapter and + * setup common fields + * + * returns: -ENOMEM if there was insufficient memory for a request + * -EIO if no qdio buffers could be allocate to the request + * -EINVAL/-EPERM on bug conditions in req_dequeue + * 0 in success + * + * note: The created request is returned by reference. + * + * locks: lock of concerned request queue must not be held, + * but is held on completion (write, irqsave) + */ +int +zfcp_fsf_req_create(struct zfcp_adapter *adapter, + u32 fsf_cmd, + unsigned long *lock_flags, + int req_flags, + struct zfcp_fsf_req **fsf_req_p) +{ + struct zfcp_fsf_req *fsf_req = NULL; + int retval = 0; + struct zfcp_qdio_queue *req_queue = &adapter->request_queue; + volatile struct qdio_buffer_element *buffere; + unsigned long timeout; + int condition; + + /* allocate new FSF request */ + fsf_req = zfcp_fsf_req_alloc(adapter, fsf_cmd, GFP_ATOMIC); + if (!fsf_req) { + ZFCP_LOG_DEBUG("error: Could not put an FSF request into" + "the outbound (send) queue.\n"); + retval = -ENOMEM; + goto failed_fsf_req; + } + /* save pointer to "parent" adapter */ + fsf_req->adapter = adapter; + + /* initialize waitqueue which may be used to wait on + this request completion */ + init_waitqueue_head(&fsf_req->completion_wq); + + /* set magics */ + fsf_req->common_magic = ZFCP_MAGIC; + fsf_req->specific_magic = ZFCP_MAGIC_FSFREQ; + + fsf_req->fsf_command = fsf_cmd; + if (req_flags & ZFCP_REQ_AUTO_CLEANUP) + fsf_req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; + + /* initialize QTCB */ + if (fsf_cmd != FSF_QTCB_UNSOLICITED_STATUS) { + ZFCP_LOG_TRACE("fsf_req->qtcb=0x%lx\n", + (unsigned long) fsf_req->qtcb); + fsf_req->qtcb->prefix.req_id = (unsigned long) fsf_req; + fsf_req->qtcb->prefix.ulp_info = ZFCP_ULP_INFO_VERSION; + fsf_req->qtcb->prefix.qtcb_type = fsf_qtcb_type[fsf_cmd]; + fsf_req->qtcb->prefix.qtcb_version = ZFCP_QTCB_VERSION; + fsf_req->qtcb->header.req_handle = (unsigned long) fsf_req; + fsf_req->qtcb->header.fsf_command = fsf_cmd; + /* + * Request Sequence Number is set later when the request is + * actually sent. + */ + } + + /* + * try to get needed SBALs in request queue (get queue lock on success) + */ + ZFCP_LOG_TRACE("try to get free BUFFER in request queue\n"); + if (req_flags & ZFCP_WAIT_FOR_SBAL) { + timeout = ZFCP_SBAL_TIMEOUT; + ZFCP_WAIT_EVENT_TIMEOUT(adapter->request_wq, + timeout, + (condition = + (zfcp_fsf_req_create_sbal_check) + (lock_flags, req_queue, 1))); + if (!condition) { + retval = -EIO; + goto failed_sbals; + } + } else { + if (!zfcp_fsf_req_create_sbal_check(lock_flags, req_queue, 1)) { + retval = -EIO; + goto failed_sbals; + } + } + fsf_req->sbal_count = 1; + fsf_req->sbal_index = req_queue->free_index; + + ZFCP_LOG_TRACE("got %i free BUFFERs starting at index %i\n", + fsf_req->sbal_count, fsf_req->sbal_index); + buffere = req_queue->buffer[fsf_req->sbal_index]->element; + /* setup common SBALE fields */ + buffere[0].addr = fsf_req; + buffere[0].flags |= SBAL_FLAGS0_COMMAND; + if (fsf_cmd != FSF_QTCB_UNSOLICITED_STATUS) { + buffere[1].addr = (void *) fsf_req->qtcb; + buffere[1].length = ZFCP_QTCB_SIZE; + } + + /* set specific common SBALE and QTCB fields */ + switch (fsf_cmd) { + case FSF_QTCB_FCP_CMND: + ZFCP_LOG_FLAGS(3, "FSF_QTCB_FCP_CMND\n"); + /* + * storage-block type depends on actual + * SCSI command and is set by calling + * routine according to transfer direction + * of data buffers associated with SCSI + * command + */ + break; + case FSF_QTCB_ABORT_FCP_CMND: + case FSF_QTCB_OPEN_PORT_WITH_DID: + case FSF_QTCB_OPEN_LUN: + case FSF_QTCB_CLOSE_LUN: + case FSF_QTCB_CLOSE_PORT: + case FSF_QTCB_CLOSE_PHYSICAL_PORT: + case FSF_QTCB_SEND_ELS: /* FIXME: ELS needs separate case */ + ZFCP_LOG_FLAGS(3, "FSF_QTCB_*\n"); + /* + * FIXME(qdio): + * what is the correct type for commands + * without 'real' data buffers? + */ + buffere[0].flags |= SBAL_FLAGS0_TYPE_READ; + buffere[1].flags |= SBAL_FLAGS_LAST_ENTRY; + break; + case FSF_QTCB_EXCHANGE_CONFIG_DATA: + ZFCP_LOG_FLAGS(3, "FSF_QTCB_EXCHANGE_CONFIG_DATA\n"); + buffere[0].flags |= SBAL_FLAGS0_TYPE_READ; + buffere[1].flags |= SBAL_FLAGS_LAST_ENTRY; + break; + + case FSF_QTCB_SEND_GENERIC: + ZFCP_LOG_FLAGS(3, "FSF_QTCB_SEND_GENERIC\n"); + buffere[0].flags |= SBAL_FLAGS0_TYPE_WRITE_READ; + break; + + case FSF_QTCB_UNSOLICITED_STATUS: + ZFCP_LOG_FLAGS(3, "FSF_QTCB_UNSOLICITED_STATUS\n"); + buffere[0].flags |= SBAL_FLAGS0_TYPE_STATUS; + buffere[2].flags |= SBAL_FLAGS_LAST_ENTRY; + break; + + default: + ZFCP_LOG_NORMAL("bug: An attempt to send an unsupported " + "command has been detected. " + "(debug info 0x%x)\n", fsf_cmd); + goto unsupported_fsf_cmd; + } + + /* yes, we did it - skip all cleanups for different failures */ + goto out; + + unsupported_fsf_cmd: + + failed_sbals: +#ifdef ZFCP_STAT_QUEUES + atomic_inc(&zfcp_data.outbound_queue_full); +#endif +/* dequeue new FSF request previously enqueued */ + zfcp_fsf_req_free(fsf_req); + fsf_req = NULL; + + failed_fsf_req: + write_lock_irqsave(&req_queue->queue_lock, *lock_flags); + out: + *fsf_req_p = fsf_req; + return retval; +} + +/* + * function: zfcp_fsf_req_send + * + * purpose: start transfer of FSF request via QDIO + * + * returns: 0 - request transfer succesfully started + * !0 - start of request transfer failed + */ +static int +zfcp_fsf_req_send(struct zfcp_fsf_req *fsf_req, struct timer_list *timer) +{ + int retval = 0; + struct zfcp_adapter *adapter = fsf_req->adapter; + struct zfcp_qdio_queue *req_queue = &adapter->request_queue; + volatile struct qdio_buffer_element *buffere; + int inc_seq_no = 1; + int new_distance_from_int; + unsigned long flags; + + u8 sbal_index = fsf_req->sbal_index; + + /* FIXME(debug): remove it later */ + buffere = &(req_queue->buffer[sbal_index]->element[0]); + ZFCP_LOG_DEBUG("zeroeth BUFFERE flags=0x%x \n ", buffere->flags); + buffere = &(req_queue->buffer[sbal_index]->element[1]); + ZFCP_LOG_TRACE("HEX DUMP OF 0eth BUFFERE PAYLOAD:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, (char *) buffere->addr, + buffere->length); + + /* set sequence counter in QTCB */ + if (fsf_req->qtcb) { + fsf_req->qtcb->prefix.req_seq_no = adapter->fsf_req_seq_no; + fsf_req->seq_no = adapter->fsf_req_seq_no; + ZFCP_LOG_TRACE("FSF request 0x%lx of adapter 0x%lx gets " + "FSF sequence counter value of %i\n", + (unsigned long) fsf_req, + (unsigned long) adapter, + fsf_req->qtcb->prefix.req_seq_no); + } else + inc_seq_no = 0; + + /* put allocated FSF request at list tail */ + write_lock_irqsave(&adapter->fsf_req_list_lock, flags); + list_add_tail(&fsf_req->list, &adapter->fsf_req_list_head); + write_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); + + /* figure out expiration time of timeout and start timeout */ + if (timer) { + timer->expires += jiffies; + add_timer(timer); + } + + ZFCP_LOG_TRACE("request queue of adapter with busid=%s: " + "next free SBAL is %i, %i free SBALs\n", + zfcp_get_busid_by_adapter(adapter), + req_queue->free_index, + atomic_read(&req_queue->free_count)); + + ZFCP_LOG_DEBUG("Calling do QDIO busid=%s, flags=0x%x, queue_no=%i, " + "index_in_queue=%i, count=%i, buffers=0x%lx\n", + zfcp_get_busid_by_adapter(adapter), + QDIO_FLAG_SYNC_OUTPUT, + 0, + sbal_index, + fsf_req->sbal_count, + (unsigned long) &req_queue->buffer[sbal_index]); + + /* + * adjust the number of free SBALs in request queue as well as + * position of first one + */ + atomic_sub(fsf_req->sbal_count, &req_queue->free_count); + ZFCP_LOG_TRACE("free_count=%d\n", atomic_read(&req_queue->free_count)); + req_queue->free_index += fsf_req->sbal_count; /* increase */ + req_queue->free_index %= QDIO_MAX_BUFFERS_PER_Q; /* wrap if needed */ + new_distance_from_int = zfcp_qdio_determine_pci(req_queue, fsf_req); + + retval = do_QDIO(adapter->ccw_device, + QDIO_FLAG_SYNC_OUTPUT, + 0, fsf_req->sbal_index, fsf_req->sbal_count, NULL); + + if (retval) { + /* Queues are down..... */ + retval = -EIO; + /* + * FIXME(potential race): + * timer might be expired (absolutely unlikely) + */ + if (timer) + del_timer_sync(timer); + write_lock_irqsave(&adapter->fsf_req_list_lock, flags); + list_del(&fsf_req->list); + write_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); + /* + * adjust the number of free SBALs in request queue as well as + * position of first one + */ + zfcp_qdio_zero_sbals(req_queue->buffer, + fsf_req->sbal_index, fsf_req->sbal_count); + atomic_add(fsf_req->sbal_count, &req_queue->free_count); + req_queue->free_index -= fsf_req->sbal_count; /* increase */ + req_queue->free_index += QDIO_MAX_BUFFERS_PER_Q; + req_queue->free_index %= QDIO_MAX_BUFFERS_PER_Q; /* wrap */ + ZFCP_LOG_DEBUG + ("error: do_QDIO failed. Buffers could not be enqueued " + "to request queue.\n"); + } else { + req_queue->distance_from_int = new_distance_from_int; +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 1, "o:a/seq"); + debug_event(adapter->req_dbf, 1, &fsf_req, + sizeof (unsigned long)); + if (inc_seq_no) { + debug_event(adapter->req_dbf, 1, + &adapter->fsf_req_seq_no, sizeof (u32)); + } else { + debug_text_event(adapter->req_dbf, 1, "nocb"); + } +#endif /* ZFCP_DEBUG_REQUESTS */ + /* + * increase FSF sequence counter - + * this must only be done for request successfully enqueued to + * QDIO this rejected requests may be cleaned up by calling + * routines resulting in missing sequence counter values + * otherwise, + */ + /* Don't increase for unsolicited status */ + if (inc_seq_no) { + adapter->fsf_req_seq_no++; + ZFCP_LOG_TRACE + ("FSF sequence counter value of adapter 0x%lx " + "increased to %i\n", (unsigned long) adapter, + adapter->fsf_req_seq_no); + } + /* count FSF requests pending */ + atomic_inc(&adapter->fsf_reqs_active); +#ifdef ZFCP_STAT_QUEUES + atomic_inc(&zfcp_data.outbound_total); +#endif + } + return retval; +} + +/* + * function: zfcp_fsf_req_cleanup + * + * purpose: cleans up an FSF request and removes it from the specified list + * + * returns: + * + * assumption: no pending SB in SBALEs other than QTCB + */ +void +zfcp_fsf_req_cleanup(struct zfcp_fsf_req *fsf_req) +{ + struct zfcp_adapter *adapter = fsf_req->adapter; + unsigned long flags; + + write_lock_irqsave(&adapter->fsf_req_list_lock, flags); + list_del(&fsf_req->list); + write_unlock_irqrestore(&adapter->fsf_req_list_lock, flags); + zfcp_fsf_req_free(fsf_req); +} + +/* + * try to allocate fsf_req with QTCB, + * alternately try to get hold of fsf_req+QTCB provided by the specified memory + * pool element, this routine is called for all kinds of fsf requests other than + * status read since status read does neither require kmalloc involvement + * nor a QTCB + */ +static struct zfcp_fsf_req * +zfcp_fsf_req_get(int kmalloc_flags, mempool_t * pool) +{ + struct zfcp_fsf_req *fsf_req; + + fsf_req = kmalloc(ZFCP_QTCB_AND_REQ_SIZE, kmalloc_flags); + if (fsf_req) { + memset(fsf_req, 0, ZFCP_QTCB_AND_REQ_SIZE); + } else { + fsf_req = mempool_alloc(pool, kmalloc_flags); + if (fsf_req) { + memset(fsf_req, 0, ZFCP_QTCB_AND_REQ_SIZE); + fsf_req->status |= ZFCP_STATUS_FSFREQ_POOL; + } + } + if (fsf_req) + fsf_req->qtcb = + (struct fsf_qtcb *) ((unsigned long) fsf_req + + sizeof (struct zfcp_fsf_req)); + + return fsf_req; +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_fsf.h b/drivers/s390/scsi/zfcp_fsf.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_fsf.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,358 @@ +/* + * + * linux/drivers/s390/scsi/zfcp_fsf.h + * + * FCP adapter driver for IBM eServer zSeries + * + * Copyright 2002 IBM Corporation + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef FSF_H +#define FSF_H + +#ifdef __KERNEL__ + +#define FSF_QTCB_VERSION1 0x00000001 +#define FSF_QTCB_CURRENT_VERSION FSF_QTCB_VERSION1 + +/* FSF commands */ +#define FSF_QTCB_FCP_CMND 0x00000001 +#define FSF_QTCB_ABORT_FCP_CMND 0x00000002 +#define FSF_QTCB_OPEN_PORT_WITH_DID 0x00000005 +#define FSF_QTCB_OPEN_LUN 0x00000006 +#define FSF_QTCB_CLOSE_LUN 0x00000007 +#define FSF_QTCB_CLOSE_PORT 0x00000008 +#define FSF_QTCB_CLOSE_PHYSICAL_PORT 0x00000009 +#define FSF_QTCB_SEND_ELS 0x0000000B +#define FSF_QTCB_SEND_GENERIC 0x0000000C +#define FSF_QTCB_EXCHANGE_CONFIG_DATA 0x0000000D + +/* FSF QTCB types */ +#define FSF_IO_COMMAND 0x00000001 +#define FSF_SUPPORT_COMMAND 0x00000002 +#define FSF_CONFIG_COMMAND 0x00000003 + +/* FSF protocol stati */ +#define FSF_PROT_GOOD 0x00000001 +#define FSF_PROT_QTCB_VERSION_ERROR 0x00000010 +#define FSF_PROT_SEQ_NUMB_ERROR 0x00000020 +#define FSF_PROT_UNSUPP_QTCB_TYPE 0x00000040 +#define FSF_PROT_HOST_CONNECTION_INITIALIZING 0x00000080 +#define FSF_PROT_FSF_STATUS_PRESENTED 0x00000100 +#define FSF_PROT_DUPLICATE_REQUEST_ID 0x00000200 +#define FSF_PROT_LINK_DOWN 0x00000400 +#define FSF_PROT_REEST_QUEUE 0x00000800 +#define FSF_PROT_ERROR_STATE 0x01000000 + +/* FSF stati */ +#define FSF_GOOD 0x00000000 +#define FSF_PORT_ALREADY_OPEN 0x00000001 +#define FSF_LUN_ALREADY_OPEN 0x00000002 +#define FSF_PORT_HANDLE_NOT_VALID 0x00000003 +#define FSF_LUN_HANDLE_NOT_VALID 0x00000004 +#define FSF_HANDLE_MISMATCH 0x00000005 +#define FSF_SERVICE_CLASS_NOT_SUPPORTED 0x00000006 +#define FSF_FCPLUN_NOT_VALID 0x00000009 +//#define FSF_ACCESS_DENIED 0x00000010 +#define FSF_ACCESS_TYPE_NOT_VALID 0x00000011 +#define FSF_LUN_IN_USE 0x00000012 +#define FSF_COMMAND_ABORTED_ULP 0x00000020 +#define FSF_COMMAND_ABORTED_ADAPTER 0x00000021 +#define FSF_FCP_COMMAND_DOES_NOT_EXIST 0x00000022 +#define FSF_DIRECTION_INDICATOR_NOT_VALID 0x00000030 +#define FSF_INBOUND_DATA_LENGTH_NOT_VALID 0x00000031 /* FIX: obsolete? */ +#define FSF_OUTBOUND_DATA_LENGTH_NOT_VALID 0x00000032 /* FIX: obsolete? */ +#define FSF_CMND_LENGTH_NOT_VALID 0x00000033 +#define FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED 0x00000040 +#define FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED 0x00000041 +#define FSF_REQUEST_BUF_NOT_VALID 0x00000042 +#define FSF_RESPONSE_BUF_NOT_VALID 0x00000043 +#define FSF_ELS_COMMAND_REJECTED 0x00000050 +#define FSF_GENERIC_COMMAND_REJECTED 0x00000051 +//#define FSF_AUTHORIZATION_FAILURE 0x00000053 +#define FSF_PORT_BOXED 0x00000059 +//#define FSF_LUN_BOXED 0x0000005A +#define FSF_ADAPTER_STATUS_AVAILABLE 0x000000AD +#define FSF_FCP_RSP_AVAILABLE 0x000000AF +#define FSF_UNKNOWN_COMMAND 0x000000E2 +//#define FSF_ERROR 0x000000FF + +#define FSF_STATUS_QUALIFIER_SIZE 16 + +/* FSF status qualifier, recommendations */ +#define FSF_SQ_NO_RECOM 0x00 +#define FSF_SQ_FCP_RSP_AVAILABLE 0x01 +#define FSF_SQ_RETRY_IF_POSSIBLE 0x02 +#define FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED 0x03 +#define FSF_SQ_INVOKE_LINK_TEST_PROCEDURE 0x04 +#define FSF_SQ_ULP_PROGRAMMING_ERROR 0x05 +#define FSF_SQ_COMMAND_ABORTED 0x06 +#define FSF_SQ_NO_RETRY_POSSIBLE 0x07 + +/* FSF status qualifier (most significant 4 bytes), local link down */ +#define FSF_PSQ_LINK_NOLIGHT 0x00000004 +#define FSF_PSQ_LINK_WRAPPLUG 0x00000008 +#define FSF_PSQ_LINK_NOFCP 0x00000010 + +/* payload size in status read buffer */ +#define FSF_STATUS_READ_PAYLOAD_SIZE 4032 + +/* number of status read buffers that should be sent by ULP */ +#define FSF_STATUS_READS_RECOM 16 + +/* status types in status read buffer */ +#define FSF_STATUS_READ_PORT_CLOSED 0x00000001 +#define FSF_STATUS_READ_INCOMING_ELS 0x00000002 +#define FSF_STATUS_READ_BIT_ERROR_THRESHOLD 0x00000004 +#define FSF_STATUS_READ_LINK_DOWN 0x00000005 /* FIXME: really? */ +#define FSF_STATUS_READ_LINK_UP 0x00000006 + +/* status subtypes in status read buffer */ +#define FSF_STATUS_READ_SUB_CLOSE_PHYS_PORT 0x00000001 +#define FSF_STATUS_READ_SUB_ERROR_PORT 0x00000002 + +/* topologie that is detected by the adapter */ +#define FSF_TOPO_ERROR 0x00000000 +#define FSF_TOPO_P2P 0x00000001 +#define FSF_TOPO_FABRIC 0x00000002 +#define FSF_TOPO_AL 0x00000003 +#define FSF_TOPO_FABRIC_VIRT 0x00000004 + +/* data direction for FCP commands */ +#define FSF_DATADIR_WRITE 0x00000001 +#define FSF_DATADIR_READ 0x00000002 +#define FSF_DATADIR_READ_WRITE 0x00000003 +#define FSF_DATADIR_CMND 0x00000004 + +/* fc service class */ +#define FSF_CLASS_1 0x00000001 +#define FSF_CLASS_2 0x00000002 +#define FSF_CLASS_3 0x00000003 + +/* SBAL chaining */ +#define FSF_MAX_SBALS_PER_REQ 36 + +/* logging space behind QTCB */ +#define FSF_QTCB_LOG_SIZE 1024 + +struct fsf_queue_designator; +struct fsf_status_read_buffer; +struct fsf_port_closed_payload; +struct fsf_bit_error_payload; +union fsf_prot_status_qual; +struct fsf_qual_version_error; +struct fsf_qual_sequence_error; +struct fsf_qtcb_prefix; +struct fsf_qtcb_header; +struct fsf_qtcb_bottom_config; +struct fsf_qtcb_bottom_support; +struct fsf_qtcb_bottom_io; +union fsf_qtcb_bottom; + +struct fsf_queue_designator { + u8 cssid; + u8 chpid; + u8 hla; + u8 ua; + u32 res1; +} __attribute__ ((packed)); + +struct fsf_port_closed_payload { + struct fsf_queue_designator queue_designator; + u32 port_handle; +} __attribute__ ((packed)); + +struct fsf_bit_error_payload { + u32 res1; + u32 link_failure_error_count; + u32 loss_of_sync_error_count; + u32 loss_of_signal_error_count; + u32 primitive_sequence_error_count; + u32 invalid_transmission_word_error_count; + u32 crc_error_count; + u32 primitive_sequence_event_timeout_count; + u32 elastic_buffer_overrun_error_count; + u32 fcal_arbitration_timeout_count; + u32 advertised_receive_b2b_credit; + u32 current_receive_b2b_credit; + u32 advertised_transmit_b2b_credit; + u32 current_transmit_b2b_credit; +} __attribute__ ((packed)); + +struct fsf_status_read_buffer { + u32 status_type; + u32 status_subtype; + u32 length; + u32 res1; + struct fsf_queue_designator queue_designator; + u32 d_id; + u32 class; + u64 fcp_lun; + u8 res3[24]; + u8 payload[FSF_STATUS_READ_PAYLOAD_SIZE]; +} __attribute__ ((packed)); + +struct fsf_qual_version_error { + u32 fsf_version; + u32 res1[3]; +} __attribute__ ((packed)); + +struct fsf_qual_sequence_error { + u32 exp_req_seq_no; + u32 res1[3]; +} __attribute__ ((packed)); + +struct fsf_qual_locallink_error { + u32 code; + u32 res1[3]; +} __attribute__ ((packed)); + +union fsf_prot_status_qual { + struct fsf_qual_version_error version_error; + struct fsf_qual_sequence_error sequence_error; + struct fsf_qual_locallink_error locallink_error; +} __attribute__ ((packed)); + +struct fsf_qtcb_prefix { + u64 req_id; + u32 qtcb_version; + u32 ulp_info; + u32 qtcb_type; + u32 req_seq_no; + u32 prot_status; + union fsf_prot_status_qual prot_status_qual; + u8 res1[20]; +} __attribute__ ((packed)); + +union fsf_status_qual { + u8 byte[FSF_STATUS_QUALIFIER_SIZE]; + u16 halfword[FSF_STATUS_QUALIFIER_SIZE / sizeof (u16)]; + u32 word[FSF_STATUS_QUALIFIER_SIZE / sizeof (u32)]; + struct { + u32 this_cmd; + u32 aborted_cmd; + } port_handle; + struct { + u32 this_cmd; + u32 aborted_cmd; + } lun_handle; + struct { + u64 found; + u64 expected; + } fcp_lun; +} __attribute__ ((packed)); + +struct fsf_qtcb_header { + u64 req_handle; + u32 fsf_command; + u32 res1; + u32 port_handle; + u32 lun_handle; + u32 res2; + u32 fsf_status; + union fsf_status_qual fsf_status_qual; + u8 res3[28]; + u16 log_start; + u16 log_length; + u8 res4[16]; +} __attribute__ ((packed)); + +struct fsf_nport_serv_param { + u8 common_serv_param[16]; + u64 wwpn; + u64 wwnn; + u8 class1_serv_param[16]; + u8 class2_serv_param[16]; + u8 class3_serv_param[16]; + u8 class4_serv_param[16]; + u8 vendor_version_level[16]; + u8 res1[16]; +} __attribute__ ((packed)); + +struct fsf_plogi { + u32 code; + struct fsf_nport_serv_param serv_param; +} __attribute__ ((packed)); + +#define FSF_FCP_CMND_SIZE 288 +#define FSF_FCP_RSP_SIZE 128 + +struct fsf_qtcb_bottom_io { + u32 data_direction; + u32 service_class; + u8 res1[8]; + u32 fcp_cmnd_length; + u8 res2[12]; + u8 fcp_cmnd[FSF_FCP_CMND_SIZE]; + u8 fcp_rsp[FSF_FCP_RSP_SIZE]; + u8 res3[64]; +} __attribute__ ((packed)); + +struct fsf_qtcb_bottom_support { + u8 res1[16]; + u32 d_id; + u32 res2; + u64 fcp_lun; + u64 res3; + u64 req_handle; + u32 service_class; + u8 res4[3]; + u8 timeout; + u8 res5[184]; + u32 els1_length; + u32 els2_length; + u64 res6; + u8 els[256]; +} __attribute__ ((packed)); + +struct fsf_qtcb_bottom_config { + u32 lic_version; + u32 res1; + u32 high_qtcb_version; + u32 low_qtcb_version; + u32 max_qtcb_size; + u8 res2[12]; + u32 fc_topology; + u32 fc_link_speed; + u32 adapter_type; + u32 peer_d_id; + u8 res3[12]; + u32 s_id; + struct fsf_nport_serv_param nport_serv_param; + u8 res4[320]; +} __attribute__ ((packed)); + +union fsf_qtcb_bottom { + struct fsf_qtcb_bottom_io io; + struct fsf_qtcb_bottom_support support; + struct fsf_qtcb_bottom_config config; +}; + +struct fsf_qtcb { + struct fsf_qtcb_prefix prefix; + struct fsf_qtcb_header header; + union fsf_qtcb_bottom bottom; +} __attribute__ ((packed)); + +#endif /* __KERNEL__ */ +#endif /* FSF_H */ diff -Nru a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_qdio.c Wed Oct 8 12:24:57 2003 @@ -0,0 +1,557 @@ +/* + * linux/drivers/s390/scsi/zfcp_qdio.c + * + * FCP adapter driver for IBM eServer zSeries + * + * QDIO related routines + * + * Copyright (C) 2003 IBM Entwicklung GmbH, IBM Corporation + * Authors: + * Martin Peschke + * Raimund Schroeder + * Wolfgang Taphorn + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_QDIO_C_REVISION "$Revision: 1.7 $" + +#include "zfcp_ext.h" + +static qdio_handler_t zfcp_qdio_request_handler; +static qdio_handler_t zfcp_qdio_response_handler; +static int zfcp_qdio_handler_error_check(struct zfcp_adapter *, + unsigned int, + unsigned int, unsigned int); + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_QDIO +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_QDIO + +/* + * Allocates BUFFER memory to each of the pointers of the qdio_buffer_t + * array in the adapter struct. + * Cur_buf is the pointer array and count can be any number of required + * buffers, the page-fitting arithmetic is done entirely within this funciton. + * + * returns: number of buffers allocated + * locks: must only be called with zfcp_data.config_sema taken + */ +static int +zfcp_qdio_buffers_enqueue(struct qdio_buffer **cur_buf, int count) +{ + int buf_pos; + int qdio_buffers_per_page; + int page_pos = 0; + struct qdio_buffer *first_in_page = NULL; + + qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer); + ZFCP_LOG_TRACE("Buffers per page %d.\n", qdio_buffers_per_page); + + for (buf_pos = 0; buf_pos < count; buf_pos++) { + if (page_pos == 0) { + cur_buf[buf_pos] = (struct qdio_buffer *) + get_zeroed_page(GFP_KERNEL); + if (cur_buf[buf_pos] == NULL) { + ZFCP_LOG_INFO("error: Could not allocate " + "memory for qdio transfer " + "structures.\n"); + goto out; + } + first_in_page = cur_buf[buf_pos]; + } else { + cur_buf[buf_pos] = first_in_page + page_pos; + + } + /* was initialised to zero */ + page_pos++; + page_pos %= qdio_buffers_per_page; + } + out: + return buf_pos; +} + +/* + * Frees BUFFER memory for each of the pointers of the struct qdio_buffer array + * in the adapter struct cur_buf is the pointer array and count can be any + * number of buffers in the array that should be freed starting from buffer 0 + * + * locks: must only be called with zfcp_data.config_sema taken + */ +static void +zfcp_qdio_buffers_dequeue(struct qdio_buffer **cur_buf, int count) +{ + int buf_pos; + int qdio_buffers_per_page; + + qdio_buffers_per_page = PAGE_SIZE / sizeof (struct qdio_buffer); + ZFCP_LOG_TRACE("Buffers per page %d.\n", qdio_buffers_per_page); + + for (buf_pos = 0; buf_pos < count; buf_pos += qdio_buffers_per_page) + free_page((unsigned long) cur_buf[buf_pos]); + return; +} + +/* locks: must only be called with zfcp_data.config_sema taken */ +int +zfcp_qdio_allocate_queues(struct zfcp_adapter *adapter) +{ + int buffer_count; + int retval = 0; + + buffer_count = + zfcp_qdio_buffers_enqueue(&(adapter->request_queue.buffer[0]), + QDIO_MAX_BUFFERS_PER_Q); + if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) { + ZFCP_LOG_DEBUG("error: Out of memory allocating " + "request queue, only %d buffers got. " + "Binning them.\n", buffer_count); + zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]), + buffer_count); + retval = -ENOMEM; + goto out; + } + + buffer_count = + zfcp_qdio_buffers_enqueue(&(adapter->response_queue.buffer[0]), + QDIO_MAX_BUFFERS_PER_Q); + if (buffer_count < QDIO_MAX_BUFFERS_PER_Q) { + ZFCP_LOG_DEBUG("error: Out of memory allocating " + "response queue, only %d buffers got. " + "Binning them.\n", buffer_count); + zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]), + buffer_count); + ZFCP_LOG_TRACE("Deallocating request_queue Buffers.\n"); + zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]), + QDIO_MAX_BUFFERS_PER_Q); + retval = -ENOMEM; + goto out; + } + out: + return retval; +} + +/* locks: must only be called with zfcp_data.config_sema taken */ +void +zfcp_qdio_free_queues(struct zfcp_adapter *adapter) +{ + ZFCP_LOG_TRACE("Deallocating request_queue Buffers.\n"); + zfcp_qdio_buffers_dequeue(&(adapter->request_queue.buffer[0]), + QDIO_MAX_BUFFERS_PER_Q); + + ZFCP_LOG_TRACE("Deallocating response_queue Buffers.\n"); + zfcp_qdio_buffers_dequeue(&(adapter->response_queue.buffer[0]), + QDIO_MAX_BUFFERS_PER_Q); +} + +int +zfcp_qdio_allocate(struct zfcp_adapter *adapter) +{ + struct qdio_initialize *init_data; + + init_data = &adapter->qdio_init_data; + + init_data->cdev = adapter->ccw_device; + init_data->q_format = QDIO_SCSI_QFMT; + memcpy(init_data->adapter_name, &adapter->name, 8); + init_data->qib_param_field_format = 0; + init_data->qib_param_field = NULL; + init_data->input_slib_elements = NULL; + init_data->output_slib_elements = NULL; + init_data->min_input_threshold = ZFCP_MIN_INPUT_THRESHOLD; + init_data->max_input_threshold = ZFCP_MAX_INPUT_THRESHOLD; + init_data->min_output_threshold = ZFCP_MIN_OUTPUT_THRESHOLD; + init_data->max_output_threshold = ZFCP_MAX_OUTPUT_THRESHOLD; + init_data->no_input_qs = 1; + init_data->no_output_qs = 1; + init_data->input_handler = zfcp_qdio_response_handler; + init_data->output_handler = zfcp_qdio_request_handler; + init_data->int_parm = (unsigned long) adapter; + init_data->flags = QDIO_INBOUND_0COPY_SBALS | + QDIO_OUTBOUND_0COPY_SBALS | QDIO_USE_OUTBOUND_PCIS; + init_data->input_sbal_addr_array = + (void **) (adapter->response_queue.buffer); + init_data->output_sbal_addr_array = + (void **) (adapter->request_queue.buffer); + + return qdio_allocate(init_data); +} + +/* + * function: zfcp_qdio_handler_error_check + * + * purpose: called by the response handler to determine error condition + * + * returns: error flag + * + */ +static inline int +zfcp_qdio_handler_error_check(struct zfcp_adapter *adapter, + unsigned int status, + unsigned int qdio_error, unsigned int siga_error) +{ + int retval = 0; + + if (ZFCP_LOG_CHECK(ZFCP_LOG_LEVEL_TRACE)) { + if (status & QDIO_STATUS_INBOUND_INT) { + ZFCP_LOG_TRACE("status is" + " QDIO_STATUS_INBOUND_INT \n"); + } + if (status & QDIO_STATUS_OUTBOUND_INT) { + ZFCP_LOG_TRACE("status is" + " QDIO_STATUS_OUTBOUND_INT \n"); + } + } // if (ZFCP_LOG_CHECK(ZFCP_LOG_LEVEL_TRACE)) + if (status & QDIO_STATUS_LOOK_FOR_ERROR) { + retval = -EIO; + + ZFCP_LOG_FLAGS(1, "QDIO_STATUS_LOOK_FOR_ERROR \n"); + + ZFCP_LOG_INFO("A qdio problem occured. The status, qdio_error " + "and siga_error are 0x%x, 0x%x and 0x%x\n", + status, qdio_error, siga_error); + + if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) { + ZFCP_LOG_FLAGS(2, + "QDIO_STATUS_ACTIVATE_CHECK_CONDITION\n"); + } + if (status & QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR) { + ZFCP_LOG_FLAGS(2, + "QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR\n"); + } + if (status & QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR) { + ZFCP_LOG_FLAGS(2, + "QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR\n"); + } + + if (siga_error & QDIO_SIGA_ERROR_ACCESS_EXCEPTION) { + ZFCP_LOG_FLAGS(2, "QDIO_SIGA_ERROR_ACCESS_EXCEPTION\n"); + } + + if (siga_error & QDIO_SIGA_ERROR_B_BIT_SET) { + ZFCP_LOG_FLAGS(2, "QDIO_SIGA_ERROR_B_BIT_SET\n"); + } + + switch (qdio_error) { + case 0: + ZFCP_LOG_FLAGS(3, "QDIO_OK"); + break; + case SLSB_P_INPUT_ERROR: + ZFCP_LOG_FLAGS(1, "SLSB_P_INPUT_ERROR\n"); + break; + case SLSB_P_OUTPUT_ERROR: + ZFCP_LOG_FLAGS(1, "SLSB_P_OUTPUT_ERROR\n"); + break; + default: + ZFCP_LOG_NORMAL("bug: Unknown qdio error reported " + "(debug info 0x%x)\n", qdio_error); + break; + } + /* Restarting IO on the failed adapter from scratch */ + debug_text_event(adapter->erp_dbf, 1, "qdio_err"); + zfcp_erp_adapter_reopen(adapter, 0); + } + return retval; +} + +/* + * function: zfcp_qdio_request_handler + * + * purpose: is called by QDIO layer for completed SBALs in request queue + * + * returns: (void) + */ +static void +zfcp_qdio_request_handler(struct ccw_device *ccw_device, + unsigned int status, + unsigned int qdio_error, + unsigned int siga_error, + unsigned int queue_number, + int first_element, + int elements_processed, + unsigned long int_parm) +{ + struct zfcp_adapter *adapter; + struct zfcp_qdio_queue *queue; + + adapter = (struct zfcp_adapter *) int_parm; + queue = &adapter->request_queue; + + ZFCP_LOG_DEBUG("busid=%s, first=%d, count=%d\n", + zfcp_get_busid_by_adapter(adapter), + first_element, elements_processed); + + if (zfcp_qdio_handler_error_check(adapter, status, qdio_error, + siga_error)) + goto out; + /* + * we stored address of struct zfcp_adapter data structure + * associated with irq in int_parm + */ + + /* cleanup all SBALs being program-owned now */ + zfcp_qdio_zero_sbals(queue->buffer, first_element, elements_processed); + + /* increase free space in outbound queue */ + atomic_add(elements_processed, &queue->free_count); + ZFCP_LOG_DEBUG("free_count=%d\n", atomic_read(&queue->free_count)); + wake_up(&adapter->request_wq); + ZFCP_LOG_DEBUG("Elements_processed = %d, free count=%d \n", + elements_processed, atomic_read(&queue->free_count)); + out: + return; +} + +/* + * function: zfcp_qdio_response_handler + * + * purpose: is called by QDIO layer for completed SBALs in response queue + * + * returns: (void) + */ +static void +zfcp_qdio_response_handler(struct ccw_device *ccw_device, + unsigned int status, + unsigned int qdio_error, + unsigned int siga_error, + unsigned int queue_number, + int first_element, + int elements_processed, + unsigned long int_parm) +{ + struct zfcp_adapter *adapter; + struct zfcp_qdio_queue *queue; + int buffer_index; + int i; + struct qdio_buffer *buffer; + int retval = 0; + u8 count; + u8 start; + volatile struct qdio_buffer_element *buffere = NULL; + int buffere_index; + + adapter = (struct zfcp_adapter *) int_parm; + queue = &adapter->response_queue; + + if (zfcp_qdio_handler_error_check(adapter, status, qdio_error, + siga_error)) + goto out; + + /* + * we stored address of struct zfcp_adapter data structure + * associated with irq in int_parm + */ + + buffere = &(queue->buffer[first_element]->element[0]); + ZFCP_LOG_DEBUG("first BUFFERE flags=0x%x \n ", buffere->flags); + /* + * go through all SBALs from input queue currently + * returned by QDIO layer + */ + + for (i = 0; i < elements_processed; i++) { + + buffer_index = first_element + i; + buffer_index %= QDIO_MAX_BUFFERS_PER_Q; + buffer = queue->buffer[buffer_index]; + + /* go through all SBALEs of SBAL */ + for (buffere_index = 0; + buffere_index < QDIO_MAX_ELEMENTS_PER_BUFFER; + buffere_index++) { + + /* look for QDIO request identifiers in SB */ + buffere = &buffer->element[buffere_index]; + retval = zfcp_qdio_reqid_check(adapter, + (void *) buffere->addr); + + if (retval) { + ZFCP_LOG_NORMAL + ("bug: Inbound packet seems not to " + "have been sent at all. It will be " + "ignored. (debug info 0x%lx, 0x%lx, " + "%d, %d, %s)\n", + (unsigned long) buffere->addr, + (unsigned long) &(buffere->addr), + first_element, elements_processed, + zfcp_get_busid_by_adapter(adapter)); + ZFCP_LOG_NORMAL("Dump of inbound BUFFER %d " + "BUFFERE %d at address 0x%lx\n", + buffer_index, buffere_index, + (unsigned long) buffer); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) buffer, SBAL_SIZE); + } + if (buffere->flags & SBAL_FLAGS_LAST_ENTRY) + break; + }; + + if (!buffere->flags & SBAL_FLAGS_LAST_ENTRY) { + ZFCP_LOG_NORMAL("bug: End of inbound data " + "not marked!\n"); + } + } + + /* + * put range of SBALs back to response queue + * (including SBALs which have already been free before) + */ + count = atomic_read(&queue->free_count) + elements_processed; + start = queue->free_index; + + ZFCP_LOG_TRACE("Calling do QDIO busid=%s, flags=0x%x, queue_no=%i, " + "index_in_queue=%i, count=%i, buffers=0x%lx\n", + zfcp_get_busid_by_adapter(adapter), + QDIO_FLAG_SYNC_INPUT | QDIO_FLAG_UNDER_INTERRUPT, + 0, start, count, (unsigned long) &queue->buffer[start]); + + retval = do_QDIO(ccw_device, + QDIO_FLAG_SYNC_INPUT | QDIO_FLAG_UNDER_INTERRUPT, + 0, start, count, NULL); + + if (retval) { + atomic_set(&queue->free_count, count); + ZFCP_LOG_DEBUG("Inbound data regions could not be cleared " + "Transfer queues may be down. " + "(info %d, %d, %d)\n", count, start, retval); + } else { + queue->free_index += count; + queue->free_index %= QDIO_MAX_BUFFERS_PER_Q; + atomic_set(&queue->free_count, 0); + ZFCP_LOG_TRACE("%i buffers successfully enqueued to response " + "queue starting at position %i\n", count, start); + } + out: + return; +} + +/* + * function: zfcp_qdio_reqid_check + * + * purpose: checks for valid reqids or unsolicited status + * + * returns: 0 - valid request id or unsolicited status + * !0 - otherwise + */ +int +zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr) +{ + struct zfcp_fsf_req *fsf_req; + int retval = 0; + +#ifdef ZFCP_DEBUG_REQUESTS + /* Note: seq is entered later */ + debug_text_event(adapter->req_dbf, 1, "i:a/seq"); + debug_event(adapter->req_dbf, 1, &sbale_addr, sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + + /* invalid (per convention used in this driver) */ + if (!sbale_addr) { + ZFCP_LOG_NORMAL + ("bug: Inbound data faulty, contains null-pointer!\n"); + retval = -EINVAL; + goto out; + } + + /* valid request id and thus (hopefully :) valid fsf_req address */ + fsf_req = (struct zfcp_fsf_req *) sbale_addr; + + if ((fsf_req->common_magic != ZFCP_MAGIC) || + (fsf_req->specific_magic != ZFCP_MAGIC_FSFREQ)) { + ZFCP_LOG_NORMAL("bug: An inbound FSF acknowledgement was " + "faulty (debug info 0x%x, 0x%x, 0x%lx)\n", + fsf_req->common_magic, + fsf_req->specific_magic, + (unsigned long) fsf_req); + retval = -EINVAL; + goto out; + } + + if (adapter != fsf_req->adapter) { + ZFCP_LOG_NORMAL("bug: An inbound FSF acknowledgement was not " + "correct (debug info 0x%lx, 0x%lx, 0%lx) \n", + (unsigned long) fsf_req, + (unsigned long) fsf_req->adapter, + (unsigned long) adapter); + retval = -EINVAL; + goto out; + } +#ifdef ZFCP_DEBUG_REQUESTS + /* debug feature stuff (test for QTCB: remember new unsol. status!) */ + if (fsf_req->qtcb) { + debug_event(adapter->req_dbf, 1, + &fsf_req->qtcb->prefix.req_seq_no, sizeof (u32)); + } +#endif /* ZFCP_DEBUG_REQUESTS */ + + ZFCP_LOG_TRACE("fsf_req at 0x%lx, QTCB at 0x%lx\n", + (unsigned long) fsf_req, (unsigned long) fsf_req->qtcb); + if (fsf_req->qtcb) { + ZFCP_LOG_TRACE("HEX DUMP OF 1ST BUFFERE PAYLOAD (QTCB):\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, + (char *) fsf_req->qtcb, ZFCP_QTCB_SIZE); + } + + /* finish the FSF request */ + zfcp_fsf_req_complete(fsf_req); + out: + return retval; +} + +int +zfcp_qdio_determine_pci(struct zfcp_qdio_queue *req_queue, + struct zfcp_fsf_req *fsf_req) +{ + int new_distance_from_int; + int pci_pos; + + new_distance_from_int = req_queue->distance_from_int + + fsf_req->sbal_count; + if (new_distance_from_int >= ZFCP_QDIO_PCI_INTERVAL) { + new_distance_from_int %= ZFCP_QDIO_PCI_INTERVAL; + pci_pos = fsf_req->sbal_index; + pci_pos += fsf_req->sbal_count; + pci_pos -= new_distance_from_int; + pci_pos -= 1; + pci_pos %= QDIO_MAX_BUFFERS_PER_Q; + req_queue->buffer[pci_pos]->element[0].flags |= SBAL_FLAGS0_PCI; + ZFCP_LOG_TRACE("Setting PCI flag at pos %d\n", pci_pos); + } + return new_distance_from_int; +} + +/* + * function: zfcp_zero_sbals + * + * purpose: zeros specified range of SBALs + * + * returns: + */ +void +zfcp_qdio_zero_sbals(struct qdio_buffer *buf[], int first, int clean_count) +{ + int cur_pos; + int index; + + for (cur_pos = first; cur_pos < (first + clean_count); cur_pos++) { + index = cur_pos % QDIO_MAX_BUFFERS_PER_Q; + memset(buf[index], 0, sizeof (struct qdio_buffer)); + ZFCP_LOG_TRACE("zeroing BUFFER %d at address 0x%lx\n", + index, (unsigned long) buf[index]); + } +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_scsi.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,1476 @@ +/* + * + * linux/drivers/s390/scsi/zfcp_scsi.c + * + * FCP adapter driver for IBM eServer zSeries + * + * Copyright 2002 IBM Corporation + * Author(s): Martin Peschke + * Raimund Schroeder + * Aron Zeh + * Wolfgang Taphorn + * Stefan Bader + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_SCSI +/* this drivers version (do not edit !!! generated and updated by cvs) */ +#define ZFCP_SCSI_REVISION "$Revision: 1.38 $" + +#include + +#include "zfcp_ext.h" + +static void zfcp_scsi_slave_destroy(struct scsi_device *sdp); +static int zfcp_scsi_slave_alloc(struct scsi_device *sdp); +static int zfcp_scsi_slave_configure(struct scsi_device *sdp); +static int zfcp_scsi_queuecommand(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); +static int zfcp_scsi_eh_abort_handler(Scsi_Cmnd *); +static int zfcp_scsi_eh_device_reset_handler(Scsi_Cmnd *); +static int zfcp_scsi_eh_bus_reset_handler(Scsi_Cmnd *); +static int zfcp_scsi_eh_host_reset_handler(Scsi_Cmnd *); +static int zfcp_task_management_function(struct zfcp_unit *, u8); + +static int zfcp_create_sbales_from_segment(unsigned long, int, int *, + int, int, int *, int *, int, + int, struct qdio_buffer **, + char); + +static int zfcp_create_sbale(unsigned long, int, int *, int, int, int *, + int, int, int *, struct qdio_buffer **, + char); + +static struct zfcp_unit *zfcp_scsi_determine_unit(struct zfcp_adapter *, + Scsi_Cmnd *); +static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, int, int); + +static struct device_attribute *zfcp_sysfs_sdev_attrs[]; + +struct zfcp_data zfcp_data = { + .scsi_host_template = { + name: ZFCP_NAME, + proc_name: "dummy", + proc_info: NULL, + detect: NULL, + slave_alloc: zfcp_scsi_slave_alloc, + slave_configure: zfcp_scsi_slave_configure, + slave_destroy: zfcp_scsi_slave_destroy, + queuecommand: zfcp_scsi_queuecommand, + eh_abort_handler: zfcp_scsi_eh_abort_handler, + eh_device_reset_handler: zfcp_scsi_eh_device_reset_handler, + eh_bus_reset_handler: zfcp_scsi_eh_bus_reset_handler, + eh_host_reset_handler: zfcp_scsi_eh_host_reset_handler, + /* FIXME(openfcp): Tune */ + can_queue: 4096, + this_id: 0, + /* + * FIXME: + * one less? can zfcp_create_sbale cope with it? + */ + sg_tablesize: ZFCP_MAX_SBALES_PER_REQ, + cmd_per_lun: 1, + unchecked_isa_dma: 0, + use_clustering: 1, + sdev_attrs: zfcp_sysfs_sdev_attrs, + } + /* rest initialised with zeros */ +}; + +/* Find start of Response Information in FCP response unit*/ +char * +zfcp_get_fcp_rsp_info_ptr(struct fcp_rsp_iu *fcp_rsp_iu) +{ + char *fcp_rsp_info_ptr; + + fcp_rsp_info_ptr = + (unsigned char *) fcp_rsp_iu + (sizeof (struct fcp_rsp_iu)); + + return fcp_rsp_info_ptr; +} + +/* Find start of Sense Information in FCP response unit*/ +char * +zfcp_get_fcp_sns_info_ptr(struct fcp_rsp_iu *fcp_rsp_iu) +{ + char *fcp_sns_info_ptr; + + fcp_sns_info_ptr = + (unsigned char *) fcp_rsp_iu + (sizeof (struct fcp_rsp_iu)); + if (fcp_rsp_iu->validity.bits.fcp_rsp_len_valid) + fcp_sns_info_ptr = (char *) fcp_sns_info_ptr + + fcp_rsp_iu->fcp_rsp_len; + + return fcp_sns_info_ptr; +} + +fcp_dl_t * +zfcp_get_fcp_dl_ptr(struct fcp_cmnd_iu * fcp_cmd) +{ + int additional_length = fcp_cmd->add_fcp_cdb_length << 2; + fcp_dl_t *fcp_dl_addr; + + fcp_dl_addr = (fcp_dl_t *) + ((unsigned char *) fcp_cmd + + sizeof (struct fcp_cmnd_iu) + additional_length); + /* + * fcp_dl_addr = start address of fcp_cmnd structure + + * size of fixed part + size of dynamically sized add_dcp_cdb field + * SEE FCP-2 documentation + */ + return fcp_dl_addr; +} + +fcp_dl_t +zfcp_get_fcp_dl(struct fcp_cmnd_iu * fcp_cmd) +{ + return *zfcp_get_fcp_dl_ptr(fcp_cmd); +} + +void +zfcp_set_fcp_dl(struct fcp_cmnd_iu *fcp_cmd, fcp_dl_t fcp_dl) +{ + *zfcp_get_fcp_dl_ptr(fcp_cmd) = fcp_dl; +} + +/* + * note: it's a bit-or operation not an assignment + * regarding the specified byte + */ +static inline void +set_byte(u32 * result, char status, char pos) +{ + *result |= status << (pos * 8); +} + +void +set_host_byte(u32 * result, char status) +{ + set_byte(result, status, 2); +} + +void +set_driver_byte(u32 * result, char status) +{ + set_byte(result, status, 3); +} + +/* + * function: zfcp_scsi_slave_alloc + * + * purpose: + * + * returns: + */ + +static int +zfcp_scsi_slave_alloc(struct scsi_device *sdp) +{ + struct zfcp_adapter *adapter; + struct zfcp_unit *unit; + unsigned long flags; + int retval = -ENODEV; + + adapter = (struct zfcp_adapter *) sdp->host->hostdata[0]; + if (!adapter) + goto out; + + read_lock_irqsave(&zfcp_data.config_lock, flags); + unit = zfcp_unit_lookup(adapter, sdp->channel, sdp->id, sdp->lun); + if (unit) { + sdp->hostdata = unit; + unit->device = sdp; + zfcp_unit_get(unit); + retval = 0; + } + read_unlock_irqrestore(&zfcp_data.config_lock, flags); + out: + return retval; +} + +/* + * function: zfcp_scsi_slave_destroy + * + * purpose: + * + * returns: + */ + +static void +zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) +{ + struct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata; + + if (unit) { + sdpnt->hostdata = NULL; + unit->device = NULL; + zfcp_unit_put(unit); + } else { + ZFCP_LOG_INFO("no unit associated with SCSI device at " + "address 0x%lx\n", (unsigned long) sdpnt); + } +} + +/* + * function: zfcp_scsi_insert_into_fake_queue + * + * purpose: + * + * + * returns: + * + * FIXME: Is the following scenario possible and - even more interesting - + * a problem? It reminds me of the famous 'no retry for tape' fix + * (no problem for disks, but what is about tapes...) + * + * device is unaccessable, + * command A is put into the fake queue, + * device becomes accessable again, + * command B is queued to the device, + * fake queue timer expires + * command A is returned to the mid-layer + * command A is queued to the device + */ +void +zfcp_scsi_insert_into_fake_queue(struct zfcp_adapter *adapter, + Scsi_Cmnd * new_cmnd) +{ + unsigned long flags; + Scsi_Cmnd *current_cmnd; + + ZFCP_LOG_DEBUG("Faking SCSI command:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, + (char *) new_cmnd->cmnd, new_cmnd->cmd_len); + + new_cmnd->host_scribble = NULL; + + write_lock_irqsave(&adapter->fake_list_lock, flags); + if (adapter->first_fake_cmnd == NULL) { + adapter->first_fake_cmnd = new_cmnd; + adapter->fake_scsi_timer.function = + zfcp_scsi_process_and_clear_fake_queue; + adapter->fake_scsi_timer.data = (unsigned long) adapter; + adapter->fake_scsi_timer.expires = + jiffies + ZFCP_FAKE_SCSI_COMPLETION_TIME; + add_timer(&adapter->fake_scsi_timer); + } else { + for (current_cmnd = adapter->first_fake_cmnd; + current_cmnd->host_scribble != NULL; + current_cmnd = + (Scsi_Cmnd *) (current_cmnd->host_scribble)) ; + current_cmnd->host_scribble = (char *) new_cmnd; + } + write_unlock_irqrestore(&adapter->fake_list_lock, flags); +} + +/* + * function: zfcp_scsi_process_and_clear_fake_queue + * + * purpose: + * + * + * returns: + */ +void +zfcp_scsi_process_and_clear_fake_queue(unsigned long data) +{ + unsigned long flags; + struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; + Scsi_Cmnd *cur = adapter->first_fake_cmnd; + Scsi_Cmnd *next; + + /* + * We need a common lock for scsi_req on command completion + * as well as on command abort to avoid race conditions + * during completions and aborts taking place at the same time. + * It needs to be the outer lock as in the eh_abort_handler. + */ + read_lock_irqsave(&adapter->abort_lock, flags); + write_lock(&adapter->fake_list_lock); + while (cur) { + next = (Scsi_Cmnd *) cur->host_scribble; + cur->host_scribble = NULL; + zfcp_cmd_dbf_event_scsi("clrfake", cur); + cur->scsi_done(cur); + cur = next; +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 2, "fk_done:"); + debug_event(adapter->req_dbf, 2, &cur, sizeof (unsigned long)); +#endif + } + adapter->first_fake_cmnd = NULL; + write_unlock(&adapter->fake_list_lock); + read_unlock_irqrestore(&adapter->abort_lock, flags); + return; +} + +void +zfcp_scsi_block_requests(struct Scsi_Host *shpnt) +{ + scsi_block_requests(shpnt); + /* This is still somewhat racy but the best I could imagine */ + do { + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(ZFCP_SCSI_HOST_FLUSH_TIMEOUT); + + } while (shpnt->host_busy || shpnt->eh_active); +} + +/* + * Tries to associate a zfcp unit with the scsi device. + * + * returns: unit pointer if unit is found + * NULL otherwise + */ +struct zfcp_unit * +zfcp_scsi_determine_unit(struct zfcp_adapter *adapter, Scsi_Cmnd * scpnt) +{ + struct zfcp_unit *unit; + + /* + * figure out target device + * (stored there by zfcp_scsi_slave_alloc) + * ATTENTION: assumes hostdata initialized to NULL by + * mid layer (see scsi_scan.c) + */ + unit = (struct zfcp_unit *) scpnt->device->hostdata; + if (!unit) { + ZFCP_LOG_DEBUG("logical unit (%i %i %i %i) not configured\n", + scpnt->device->host->host_no, + scpnt->device->channel, + scpnt->device->id, scpnt->device->lun); + /* + * must fake SCSI command execution and scsi_done + * callback for non-configured logical unit + */ + /* return this as long as we are unable to process requests */ + set_host_byte(&scpnt->result, DID_NO_CONNECT); + zfcp_cmd_dbf_event_scsi("notconf", scpnt); + scpnt->scsi_done(scpnt); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 2, "nc_done:"); + debug_event(adapter->req_dbf, 2, &scpnt, + sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + } + return unit; +} + +/* + * called from scsi midlayer to allow finetuning of a device. + */ +static int +zfcp_scsi_slave_configure(struct scsi_device *sdp) +{ + if (sdp->tagged_supported) + scsi_adjust_queue_depth(sdp, MSG_SIMPLE_TAG, ZFCP_CMND_PER_LUN); + else + scsi_adjust_queue_depth(sdp, 0, 1); + return 0; +} + +/* Sends command on a round-trip using SCSI stack */ +static void +zfcp_scsi_queuecommand_fake(Scsi_Cmnd * scpnt, struct zfcp_adapter *adapter) +{ + ZFCP_LOG_DEBUG("Looping SCSI IO on the adapter %s.\n", + zfcp_get_busid_by_adapter(adapter)); + /* + * Reset everything for devices with retries, allow at least one retry + * for others, e.g. tape. + */ + scpnt->retries = 0; + if (scpnt->allowed == 1) { + scpnt->allowed = 2; + } + set_host_byte(&scpnt->result, DID_SOFT_ERROR); + set_driver_byte(&scpnt->result, SUGGEST_RETRY); + zfcp_scsi_insert_into_fake_queue(adapter, scpnt); +} + +/* Complete a command immediately handing back DID_ERROR */ +static void +zfcp_scsi_queuecommand_stop(Scsi_Cmnd * scpnt, + struct zfcp_adapter *adapter, + struct zfcp_unit *unit) +{ + /* Always pass through to upper layer */ + scpnt->retries = scpnt->allowed - 1; + set_host_byte(&scpnt->result, DID_ERROR); + zfcp_cmd_dbf_event_scsi("stopping", scpnt); + /* return directly */ + scpnt->scsi_done(scpnt); + if (adapter && unit) { + ZFCP_LOG_INFO("Stopping SCSI IO on the unit with FCP LUN 0x%Lx " + "connected to the port with WWPN 0x%Lx at the " + "adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_adapter(adapter)); +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 2, "de_done:"); + debug_event(adapter->req_dbf, 2, &scpnt, + sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + } else { + ZFCP_LOG_INFO("There is no adapter registered in the zfcp " + "module for the SCSI host with hostnumber %d. " + "Stopping IO.\n", scpnt->device->host->host_no); + } +} + +/* + * function: zfcp_scsi_queuecommand + * + * purpose: enqueues a SCSI command to the specified target device + * + * note: The scsi_done midlayer function may be called directly from + * within queuecommand provided queuecommand returns with + * success (0). + * If it fails, it is expected that the command could not be sent + * and is still available for processing. + * As we ensure that queuecommand never fails, we have the choice + * to call done directly wherever we please. + * Thus, any kind of send errors other than those indicating + * 'infinite' retries will be reported directly. + * Retry requests are put into a list to be processed under timer + * control once in a while to allow for other operations to + * complete in the meantime. + * + * returns: 0 - success, SCSI command enqueued + * !0 - failure, note that we never allow this to happen as the + * SCSI stack would block indefinitely should a non-zero return + * value be reported if there are no outstanding commands + * (as in when the queues are down) + */ +int +zfcp_scsi_queuecommand(Scsi_Cmnd * scpnt, void (*done) (Scsi_Cmnd *)) +{ + int temp_ret; + struct zfcp_unit *unit; + struct zfcp_adapter *adapter; + + /* reset the status for this request */ + scpnt->result = 0; + /* save address of mid layer call back function */ + scpnt->scsi_done = done; + /* + * figure out adapter + * (previously stored there by the driver when + * the adapter was registered) + */ + adapter = (struct zfcp_adapter *) scpnt->device->host->hostdata[0]; + /* NULL when the adapter was removed from the zfcp list */ + if (adapter == NULL) { + zfcp_scsi_queuecommand_stop(scpnt, NULL, NULL); + goto out; + } + + /* set when we have a unit/port list modification */ + if (atomic_test_mask(ZFCP_STATUS_ADAPTER_QUEUECOMMAND_BLOCK, + &adapter->status)) { + zfcp_scsi_queuecommand_fake(scpnt, adapter); + goto out; + } + + unit = zfcp_scsi_determine_unit(adapter, scpnt); + if (unit == NULL) + goto out; + + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &unit->status) + || !atomic_test_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status)) { + zfcp_scsi_queuecommand_stop(scpnt, adapter, unit); + goto out; + } + if (!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status)) { + ZFCP_LOG_DEBUG("adapter %s not ready or unit with LUN 0x%Lx " + "on the port with WWPN 0x%Lx in recovery.\n", + zfcp_get_busid_by_adapter(adapter), + unit->fcp_lun, unit->port->wwpn); + zfcp_scsi_queuecommand_fake(scpnt, adapter); + goto out; + } + + atomic_inc(&adapter->scsi_reqs_active); + + temp_ret = zfcp_fsf_send_fcp_command_task(adapter, + unit, + scpnt, ZFCP_REQ_AUTO_CLEANUP); + + if (temp_ret < 0) { + ZFCP_LOG_DEBUG("error: Could not send a Send FCP Command\n"); + atomic_dec(&adapter->scsi_reqs_active); + wake_up(&adapter->scsi_reqs_active_wq); + zfcp_scsi_queuecommand_fake(scpnt, adapter); + } else { +#ifdef ZFCP_DEBUG_REQUESTS + debug_text_event(adapter->req_dbf, 3, "q_scpnt"); + debug_event(adapter->req_dbf, 3, &scpnt, + sizeof (unsigned long)); +#endif /* ZFCP_DEBUG_REQUESTS */ + } + out: + return 0; +} + +/* + * function: zfcp_unit_lookup + * + * purpose: + * + * returns: + * + * context: + */ +static struct zfcp_unit * +zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, int id, int lun) +{ + struct zfcp_port *port; + struct zfcp_unit *unit, *retval = NULL; + + list_for_each_entry(port, &adapter->port_list_head, list) { + if (id != port->scsi_id) + continue; + list_for_each_entry(unit, &port->unit_list_head, list) { + if (lun == unit->scsi_lun) { + retval = unit; + goto out; + } + } + } + out: + return retval; +} + +/* + * function: zfcp_scsi_potential_abort_on_fake + * + * purpose: + * + * returns: 0 - no fake request aborted + * 1 - fake request was aborted + * + * context: both the adapter->abort_lock and the + * adapter->fake_list_lock are assumed to be held write lock + * irqsave + */ +int +zfcp_scsi_potential_abort_on_fake(struct zfcp_adapter *adapter, + Scsi_Cmnd * cmnd) +{ + Scsi_Cmnd *cur = adapter->first_fake_cmnd; + Scsi_Cmnd *pre = NULL; + int retval = 0; + + while (cur) { + if (cur == cmnd) { + if (pre) + pre->host_scribble = cur->host_scribble; + else + adapter->first_fake_cmnd = + (Scsi_Cmnd *) cur->host_scribble; + cur->host_scribble = NULL; + if (!adapter->first_fake_cmnd) + del_timer(&adapter->fake_scsi_timer); + retval = 1; + break; + } + pre = cur; + cur = (Scsi_Cmnd *) cur->host_scribble; + } + return retval; +} + +/* + * function: zfcp_scsi_eh_abort_handler + * + * purpose: tries to abort the specified (timed out) SCSI command + * + * note: We do not need to care for a SCSI command which completes + * normally but late during this abort routine runs. + * We are allowed to return late commands to the SCSI stack. + * It tracks the state of commands and will handle late commands. + * (Usually, the normal completion of late commands is ignored with + * respect to the running abort operation. Grep for 'done_late' + * in the SCSI stacks sources.) + * + * returns: SUCCESS - command has been aborted and cleaned up in internal + * bookkeeping, + * SCSI stack won't be called for aborted command + * FAILED - otherwise + */ +int +zfcp_scsi_eh_abort_handler(Scsi_Cmnd * scpnt) +{ + int retval = SUCCESS; + struct zfcp_fsf_req *new_fsf_req, *old_fsf_req; + struct zfcp_adapter *adapter; + struct zfcp_unit *unit; + struct zfcp_port *port; + struct Scsi_Host *scsi_host; + union zfcp_req_data *req_data = NULL; + unsigned long flags; + u32 status = 0; + + adapter = (struct zfcp_adapter *) scpnt->device->host->hostdata[0]; + scsi_host = scpnt->device->host; + unit = (struct zfcp_unit *) scpnt->device->hostdata; + port = unit->port; + +#ifdef ZFCP_DEBUG_ABORTS + /* the components of a abort_dbf record (fixed size record) */ + u64 dbf_scsi_cmnd = (unsigned long) scpnt; + char dbf_opcode[ZFCP_ABORT_DBF_LENGTH]; + wwn_t dbf_wwn = port->wwpn; + fcp_lun_t dbf_fcp_lun = unit->fcp_lun; + u64 dbf_retries = scpnt->retries; + u64 dbf_allowed = scpnt->allowed; + u64 dbf_timeout = 0; + u64 dbf_fsf_req = 0; + u64 dbf_fsf_status = 0; + u64 dbf_fsf_qual[2] = { 0, 0 }; + char dbf_result[ZFCP_ABORT_DBF_LENGTH] = { "##undef" }; + + memset(dbf_opcode, 0, ZFCP_ABORT_DBF_LENGTH); + memcpy(dbf_opcode, + scpnt->cmnd, + min(scpnt->cmd_len, (unsigned char) ZFCP_ABORT_DBF_LENGTH)); +#endif + + /*TRACE*/ + ZFCP_LOG_INFO + ("Aborting for adapter=0x%lx, busid=%s, scsi_cmnd=0x%lx\n", + (unsigned long) adapter, zfcp_get_busid_by_adapter(adapter), + (unsigned long) scpnt); + + spin_unlock_irq(scsi_host->host_lock); + + /* + * Race condition between normal (late) completion and abort has + * to be avoided. + * The entirity of all accesses to scsi_req have to be atomic. + * scsi_req is usually part of the fsf_req (for requests which + * are not faked) and thus we block the release of fsf_req + * as long as we need to access scsi_req. + * For faked commands we use the same lock even if they are not + * put into the fsf_req queue. This makes implementation + * easier. + */ + write_lock_irqsave(&adapter->abort_lock, flags); + + /* + * Check if we deal with a faked command, which we may just forget + * about from now on + */ + write_lock(&adapter->fake_list_lock); + /* only need to go through list if there are faked requests */ + if (adapter->first_fake_cmnd != NULL) { + if (zfcp_scsi_potential_abort_on_fake(adapter, scpnt)) { + write_unlock(&adapter->fake_list_lock); + write_unlock_irqrestore(&adapter->abort_lock, flags); + ZFCP_LOG_INFO("A faked command was aborted\n"); + retval = SUCCESS; + strncpy(dbf_result, "##faked", ZFCP_ABORT_DBF_LENGTH); + goto out; + } + } + write_unlock(&adapter->fake_list_lock); + + /* + * Check whether command has just completed and can not be aborted. + * Even if the command has just been completed late, we can access + * scpnt since the SCSI stack does not release it at least until + * this routine returns. (scpnt is parameter passed to this routine + * and must not disappear during abort even on late completion.) + */ + req_data = (union zfcp_req_data *) scpnt->host_scribble; + /* DEBUG */ + ZFCP_LOG_DEBUG("req_data=0x%lx\n", (unsigned long) req_data); + if (!req_data) { + ZFCP_LOG_DEBUG("late command completion overtook abort\n"); + /* + * That's it. + * Do not initiate abort but return SUCCESS. + */ + write_unlock_irqrestore(&adapter->abort_lock, flags); + retval = SUCCESS; + strncpy(dbf_result, "##late1", ZFCP_ABORT_DBF_LENGTH); + goto out; + } + + /* Figure out which fsf_req needs to be aborted. */ + old_fsf_req = req_data->send_fcp_command_task.fsf_req; +#ifdef ZFCP_DEBUG_ABORTS + dbf_fsf_req = (unsigned long) old_fsf_req; + dbf_timeout = + (jiffies - req_data->send_fcp_command_task.start_jiffies) / HZ; +#endif + /* DEBUG */ + ZFCP_LOG_DEBUG("old_fsf_req=0x%lx\n", (unsigned long) old_fsf_req); + if (!old_fsf_req) { + write_unlock_irqrestore(&adapter->abort_lock, flags); + ZFCP_LOG_NORMAL("bug: No old fsf request found.\n"); + ZFCP_LOG_NORMAL("req_data:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) req_data, sizeof (union zfcp_req_data)); + ZFCP_LOG_NORMAL("scsi_cmnd:\n"); + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_NORMAL, + (char *) scpnt, sizeof (struct scsi_cmnd)); + retval = FAILED; + strncpy(dbf_result, "##bug:r", ZFCP_ABORT_DBF_LENGTH); + goto out; + } + old_fsf_req->data.send_fcp_command_task.scsi_cmnd = NULL; + /* mark old request as being aborted */ + old_fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTING; + /* + * We have to collect all information (e.g. unit) needed by + * zfcp_fsf_abort_fcp_command before calling that routine + * since that routine is not allowed to access + * fsf_req which it is going to abort. + * This is because of we need to release fsf_req_list_lock + * before calling zfcp_fsf_abort_fcp_command. + * Since this lock will not be held, fsf_req may complete + * late and may be released meanwhile. + */ + ZFCP_LOG_DEBUG("unit=0x%lx, unit_fcp_lun=0x%Lx\n", + (unsigned long) unit, unit->fcp_lun); + + /* + * The 'Abort FCP Command' routine may block (call schedule) + * because it may wait for a free SBAL. + * That's why we must release the lock and enable the + * interrupts before. + * On the other hand we do not need the lock anymore since + * all critical accesses to scsi_req are done. + */ + write_unlock_irqrestore(&adapter->abort_lock, flags); + /* call FSF routine which does the abort */ + new_fsf_req = zfcp_fsf_abort_fcp_command((unsigned long) old_fsf_req, + adapter, + unit, ZFCP_WAIT_FOR_SBAL); + ZFCP_LOG_DEBUG("new_fsf_req=0x%lx\n", (unsigned long) new_fsf_req); + if (!new_fsf_req) { + retval = FAILED; + ZFCP_LOG_DEBUG("warning: Could not abort SCSI command " + "at 0x%lx\n", (unsigned long) scpnt); + strncpy(dbf_result, "##nores", ZFCP_ABORT_DBF_LENGTH); + goto out; + } + + /* wait for completion of abort */ + ZFCP_LOG_DEBUG("Waiting for cleanup....\n"); +#ifdef ZFCP_DEBUG_ABORTS + /* + * FIXME: + * copying zfcp_fsf_req_wait_and_cleanup code is not really nice + */ + __wait_event(new_fsf_req->completion_wq, + new_fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED); + status = new_fsf_req->status; + dbf_fsf_status = new_fsf_req->qtcb->header.fsf_status; + /* + * Ralphs special debug load provides timestamps in the FSF + * status qualifier. This might be specified later if being + * useful for debugging aborts. + */ + dbf_fsf_qual[0] = + *(u64 *) & new_fsf_req->qtcb->header.fsf_status_qual.word[0]; + dbf_fsf_qual[1] = + *(u64 *) & new_fsf_req->qtcb->header.fsf_status_qual.word[2]; + zfcp_fsf_req_cleanup(new_fsf_req); +#else + retval = zfcp_fsf_req_wait_and_cleanup(new_fsf_req, + ZFCP_UNINTERRUPTIBLE, &status); +#endif + ZFCP_LOG_DEBUG("Waiting for cleanup complete, status=0x%x\n", status); + /* status should be valid since signals were not permitted */ + if (status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) { + retval = SUCCESS; + strncpy(dbf_result, "##succ", ZFCP_ABORT_DBF_LENGTH); + } else if (status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED) { + retval = SUCCESS; + strncpy(dbf_result, "##late2", ZFCP_ABORT_DBF_LENGTH); + } else { + retval = FAILED; + strncpy(dbf_result, "##fail", ZFCP_ABORT_DBF_LENGTH); + } + + out: +#ifdef ZFCP_DEBUG_ABORTS + debug_event(adapter->abort_dbf, 1, &dbf_scsi_cmnd, sizeof (u64)); + debug_event(adapter->abort_dbf, 1, &dbf_opcode, ZFCP_ABORT_DBF_LENGTH); + debug_event(adapter->abort_dbf, 1, &dbf_wwn, sizeof (wwn_t)); + debug_event(adapter->abort_dbf, 1, &dbf_fcp_lun, sizeof (fcp_lun_t)); + debug_event(adapter->abort_dbf, 1, &dbf_retries, sizeof (u64)); + debug_event(adapter->abort_dbf, 1, &dbf_allowed, sizeof (u64)); + debug_event(adapter->abort_dbf, 1, &dbf_timeout, sizeof (u64)); + debug_event(adapter->abort_dbf, 1, &dbf_fsf_req, sizeof (u64)); + debug_event(adapter->abort_dbf, 1, &dbf_fsf_status, sizeof (u64)); + debug_event(adapter->abort_dbf, 1, &dbf_fsf_qual[0], sizeof (u64)); + debug_event(adapter->abort_dbf, 1, &dbf_fsf_qual[1], sizeof (u64)); + debug_text_event(adapter->abort_dbf, 1, dbf_result); +#endif + spin_lock_irq(scsi_host->host_lock); + return retval; +} + +/* + * function: zfcp_scsi_eh_device_reset_handler + * + * purpose: + * + * returns: + */ +int +zfcp_scsi_eh_device_reset_handler(Scsi_Cmnd * scpnt) +{ + int retval; + struct zfcp_unit *unit = (struct zfcp_unit *) scpnt->device->hostdata; + struct Scsi_Host *scsi_host = scpnt->device->host; + + spin_unlock_irq(scsi_host->host_lock); + + /* + * We should not be called to reset a target which we 'sent' faked SCSI + * commands since the abort of faked SCSI commands should always + * succeed (simply delete timer). + */ + if (!unit) { + ZFCP_LOG_NORMAL("bug: Tried to reset a non existant unit.\n"); + retval = SUCCESS; + goto out; + } + ZFCP_LOG_NORMAL("Resetting Device fcp_lun=0x%Lx\n", unit->fcp_lun); + + /* + * If we do not know whether the unit supports 'logical unit reset' + * then try 'logical unit reset' and proceed with 'target reset' + * if 'logical unit reset' fails. + * If the unit is known not to support 'logical unit reset' then + * skip 'logical unit reset' and try 'target reset' immediately. + */ + if (!atomic_test_mask(ZFCP_STATUS_UNIT_NOTSUPPUNITRESET, + &unit->status)) { + retval = + zfcp_task_management_function(unit, LOGICAL_UNIT_RESET); + if (retval) { + ZFCP_LOG_DEBUG + ("logical unit reset failed (unit=0x%lx)\n", + (unsigned long) unit); + if (retval == -ENOTSUPP) + atomic_set_mask + (ZFCP_STATUS_UNIT_NOTSUPPUNITRESET, + &unit->status); + /* fall through and try 'target reset' next */ + } else { + ZFCP_LOG_DEBUG + ("logical unit reset succeeded (unit=0x%lx)\n", + (unsigned long) unit); + /* avoid 'target reset' */ + retval = SUCCESS; + goto out; + } + } + retval = zfcp_task_management_function(unit, TARGET_RESET); + if (retval) { + ZFCP_LOG_DEBUG("target reset failed (unit=0x%lx)\n", + (unsigned long) unit); + retval = FAILED; + } else { + ZFCP_LOG_DEBUG("target reset succeeded (unit=0x%lx)\n", + (unsigned long) unit); + retval = SUCCESS; + } + out: + spin_lock_irq(scsi_host->host_lock); + return retval; +} + +static int +zfcp_task_management_function(struct zfcp_unit *unit, u8 tm_flags) +{ + struct zfcp_adapter *adapter = unit->port->adapter; + int retval; + int status; + struct zfcp_fsf_req *fsf_req; + + /* issue task management function */ + fsf_req = zfcp_fsf_send_fcp_command_task_management + (adapter, unit, tm_flags, ZFCP_WAIT_FOR_SBAL); + if (!fsf_req) { + ZFCP_LOG_INFO("error: Out of resources. Could not create a " + "task management (abort, reset, etc) request " + "for the unit with FCP-LUN 0x%Lx connected to " + "the port with WWPN 0x%Lx connected to " + "the adapter %s.\n", + unit->fcp_lun, + unit->port->wwpn, + zfcp_get_busid_by_adapter(adapter)); + retval = -ENOMEM; + goto out; + } + + retval = zfcp_fsf_req_wait_and_cleanup(fsf_req, + ZFCP_UNINTERRUPTIBLE, &status); + /* + * check completion status of task management function + * (status should always be valid since no signals permitted) + */ + if (status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) + retval = -EIO; + else if (status & ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP) + retval = -ENOTSUPP; + else + retval = 0; + out: + return retval; +} + +/* + * function: zfcp_scsi_eh_bus_reset_handler + * + * purpose: + * + * returns: + */ +int +zfcp_scsi_eh_bus_reset_handler(Scsi_Cmnd * scpnt) +{ + int retval = 0; + struct zfcp_unit *unit; + struct Scsi_Host *scsi_host = scpnt->device->host; + + spin_unlock_irq(scsi_host->host_lock); + + unit = (struct zfcp_unit *) scpnt->device->hostdata; + /*DEBUG*/ + ZFCP_LOG_NORMAL("Resetting because of problems with " + "unit=0x%lx, unit_fcp_lun=0x%Lx\n", + (unsigned long) unit, unit->fcp_lun); + zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_erp_wait(unit->port->adapter); + retval = SUCCESS; + + spin_lock_irq(scsi_host->host_lock); + return retval; +} + +/* + * function: zfcp_scsi_eh_host_reset_handler + * + * purpose: + * + * returns: + */ +int +zfcp_scsi_eh_host_reset_handler(Scsi_Cmnd * scpnt) +{ + int retval = 0; + struct zfcp_unit *unit; + struct Scsi_Host *scsi_host = scpnt->device->host; + + spin_unlock_irq(scsi_host->host_lock); + + unit = (struct zfcp_unit *) scpnt->device->hostdata; + /*DEBUG*/ + ZFCP_LOG_NORMAL("Resetting because of problems with " + "unit=0x%lx, unit_fcp_lun=0x%Lx\n", + (unsigned long) unit, unit->fcp_lun); + zfcp_erp_adapter_reopen(unit->port->adapter, 0); + zfcp_erp_wait(unit->port->adapter); + retval = SUCCESS; + + spin_lock_irq(scsi_host->host_lock); + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +int +zfcp_adapter_scsi_register(struct zfcp_adapter *adapter) +{ + int retval = 0; + static unsigned int unique_id = 0; + + /* register adapter as SCSI host with mid layer of SCSI stack */ + adapter->scsi_host = scsi_host_alloc(&zfcp_data.scsi_host_template, + sizeof (struct zfcp_adapter *)); + if (!adapter->scsi_host) { + ZFCP_LOG_NORMAL("error: Not enough free memory. " + "Could not register adapter %s " + "with the SCSI-stack.\n", + zfcp_get_busid_by_adapter(adapter)); + retval = -EIO; + goto out; + } + atomic_set_mask(ZFCP_STATUS_ADAPTER_REGISTERED, &adapter->status); + ZFCP_LOG_DEBUG("host registered, scsi_host at 0x%lx\n", + (unsigned long) adapter->scsi_host); + + /* tell the SCSI stack some characteristics of this adapter */ + adapter->scsi_host->max_id = adapter->max_scsi_id + 1; + adapter->scsi_host->max_lun = adapter->max_scsi_lun + 1; + adapter->scsi_host->max_channel = 0; + adapter->scsi_host->unique_id = unique_id++; /* FIXME */ + adapter->scsi_host->max_cmd_len = ZFCP_MAX_SCSI_CMND_LENGTH; + /* + * save a pointer to our own adapter data structure within + * hostdata field of SCSI host data structure + */ + adapter->scsi_host->hostdata[0] = (unsigned long) adapter; + + scsi_add_host(adapter->scsi_host, &adapter->ccw_device->dev); + out: + return retval; +} + +/* + * function: + * + * purpose: + * + * returns: + */ +void +zfcp_adapter_scsi_unregister(struct zfcp_adapter *adapter) +{ + struct Scsi_Host *shost; + + shost = adapter->scsi_host; + if (!shost) + return; + scsi_remove_host(shost); + scsi_host_put(shost); + + adapter->scsi_host = NULL; + return; +} + + +/** + * zfcp_create_sbales_from_segment - creates SBALEs + * @addr: begin of this buffer segment + * @length_seg: length of this buffer segment + * @length_total: total length of buffer + * @length_min: roll back if generated buffer smaller than this + * @length_max: sum of all SBALEs (count) not larger than this + * @buffer_index: position of current BUFFER + * @buffere_index: position of current BUFFERE + * @buffer_first: first BUFFER used for this buffer + * @buffer_last: last BUFFER in request queue allowed + * @buffer: begin of SBAL array of request queue + * @sbtype: storage-block type + */ +static int +zfcp_create_sbales_from_segment(unsigned long addr, int length_seg, + int *length_total, int length_min, + int length_max, int *buffer_index, + int *buffere_index, int buffer_first, + int buffer_last, struct qdio_buffer *buffer[], + char sbtype) +{ + int retval = 0; + int length = 0; + + ZFCP_LOG_TRACE + ("SCSI data buffer segment with %i bytes from 0x%lx to 0x%lx\n", + length_seg, addr, (addr + length_seg) - 1); + + if (!length_seg) + goto out; + + if (addr & (PAGE_SIZE - 1)) { + length = + min((int) (PAGE_SIZE - (addr & (PAGE_SIZE - 1))), + length_seg); + ZFCP_LOG_TRACE + ("address 0x%lx not on page boundary, length=0x%x\n", + (unsigned long) addr, length); + retval = + zfcp_create_sbale(addr, length, length_total, length_min, + length_max, buffer_index, buffer_first, + buffer_last, buffere_index, buffer, + sbtype); + if (retval) { + /* no resources */ + goto out; + } + addr += length; + length = length_seg - length; + } else + length = length_seg; + + while (length > 0) { + retval = zfcp_create_sbale(addr, min((int) PAGE_SIZE, length), + length_total, length_min, length_max, + buffer_index, buffer_first, + buffer_last, buffere_index, buffer, + sbtype); + if (*buffere_index > ZFCP_LAST_SBALE_PER_SBAL) + ZFCP_LOG_NORMAL("bug: Filling output buffers with SCSI " + "data failed. Index ran out of bounds. " + "(debug info %d)\n", *buffere_index); + if (retval) { + /* no resources */ + goto out; + } + length -= PAGE_SIZE; + addr += PAGE_SIZE; + } + out: + return retval; +} + +/** + * zfcp_create_sbale - creates a single SBALE + * @addr: begin of this buffer segment + * @length: length of this buffer segment + * @length_total: total length of buffer + * @length_min: roll back if generated buffer smaller than this + * @length_max: sum of all SBALEs (count) not larger than this + * @buffer_index: position of current BUFFER + * @buffer_first: first BUFFER used for this buffer + * @buffer_last: last BUFFER allowed for this buffer + * @buffere_index: position of current BUFFERE of current BUFFER + * @buffer: begin of SBAL array of request queue + * @sbtype: storage-block type + */ +static int +zfcp_create_sbale(unsigned long addr, int length, int *length_total, + int length_min, int length_max, int *buffer_index, + int buffer_first, int buffer_last, int *buffere_index, + struct qdio_buffer *buffer[], char sbtype) +{ + int retval = 0; + int length_real, residual; + int buffers_used; + + volatile struct qdio_buffer_element *buffere = + &(buffer[*buffer_index]->element[*buffere_index]); + + /* check whether we hit the limit */ + residual = length_max - *length_total; + if (residual == 0) { + ZFCP_LOG_TRACE("skip remaining %i bytes since length_max hit\n", + length); + goto out; + } + length_real = min(length, residual); + + /* + * figure out next BUFFERE + * (first BUFFERE of first BUFFER is skipped - + * this is ok since it is reserved for the QTCB) + */ + if (*buffere_index == ZFCP_LAST_SBALE_PER_SBAL) { + /* last BUFFERE in this BUFFER */ + buffere->flags |= SBAL_FLAGS_LAST_ENTRY; + /* need further BUFFER */ + if (*buffer_index == buffer_last) { + /* queue full or last allowed BUFFER */ + buffers_used = (buffer_last - buffer_first) + 1; + /* avoid modulo operation on negative value */ + buffers_used += QDIO_MAX_BUFFERS_PER_Q; + buffers_used %= QDIO_MAX_BUFFERS_PER_Q; + ZFCP_LOG_DEBUG("reached limit of number of BUFFERs " + "allowed for this request\n"); + /* FIXME (design) - This check is wrong and enforces the + * use of one SBALE less than possible + */ + if ((*length_total < length_min) + || (buffers_used < ZFCP_MAX_SBALS_PER_REQ)) { + ZFCP_LOG_DEBUG("Rolling back SCSI command as " + "there are insufficient buffers " + "to cover the minimum required " + "amount of data\n"); + /* + * roll back complete list of BUFFERs generated + * from the scatter-gather list associated + * with this SCSI command + */ + zfcp_qdio_zero_sbals(buffer, + buffer_first, + buffers_used); + *length_total = 0; + } else { + /* DEBUG */ + ZFCP_LOG_NORMAL("Not enough buffers available. " + "Can only transfer %i bytes of " + "data\n", + *length_total); + } + retval = -ENOMEM; + goto out; + } else { /* *buffer_index != buffer_last */ + /* chain BUFFERs */ + *buffere_index = 0; + buffere = + &(buffer[*buffer_index]->element[*buffere_index]); + buffere->flags |= SBAL_FLAGS0_MORE_SBALS; + (*buffer_index)++; + *buffer_index %= QDIO_MAX_BUFFERS_PER_Q; + buffere = + &(buffer[*buffer_index]->element[*buffere_index]); + buffere->flags |= sbtype; + ZFCP_LOG_DEBUG + ("Chaining previous BUFFER %i to BUFFER %i\n", + ((*buffer_index != + 0) ? *buffer_index - 1 : QDIO_MAX_BUFFERS_PER_Q - + 1), *buffer_index); + } + } else { /* *buffere_index != (QDIO_MAX_ELEMENTS_PER_BUFFER - 1) */ + (*buffere_index)++; + buffere = &(buffer[*buffer_index]->element[*buffere_index]); + } + + /* ok, found a place for this piece, put it there */ + buffere->addr = (void *) addr; + buffere->length = length_real; + +#ifdef ZFCP_STAT_REQSIZES + if (sbtype == SBAL_FLAGS0_TYPE_READ) + zfcp_statistics_inc(&zfcp_data.read_sg_head, length_real); + else + zfcp_statistics_inc(&zfcp_data.write_sg_head, length_real); +#endif + + ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, (char *) addr, length_real); + ZFCP_LOG_TRACE("BUFFER no %i (0x%lx) BUFFERE no %i (0x%lx): BUFFERE " + "data addr 0x%lx, BUFFERE length %i, BUFFER type %i\n", + *buffer_index, + (unsigned long) &buffer[*buffer_index], *buffere_index, + (unsigned long) buffere, addr, length_real, sbtype); + *length_total += length_real; + out: + return retval; +} + +/* + * function: zfcp_create_sbals_from_sg + * + * purpose: walks through scatter-gather list of specified SCSI command + * and creates a corresponding list of SBALs + * + * returns: size of generated buffer in bytes + * + * context: + */ +int +zfcp_create_sbals_from_sg(struct zfcp_fsf_req *fsf_req, Scsi_Cmnd * scpnt, + char sbtype, /* storage-block type */ + int length_min, /* roll back if generated buffer */ + int buffer_max) /* max numbers of BUFFERs */ +{ + int length_total = 0; + int buffer_index = 0; + int buffer_last = 0; + int buffere_index = 1; /* elements 0 and 1 are req-id and qtcb */ + volatile struct qdio_buffer_element *buffere = NULL; + struct zfcp_qdio_queue *req_q = NULL; + int length_max = scpnt->request_bufflen; + + req_q = &fsf_req->adapter->request_queue; + + buffer_index = req_q->free_index; + buffer_last = req_q->free_index + + min(buffer_max, atomic_read(&req_q->free_count)) - 1; + buffer_last %= QDIO_MAX_BUFFERS_PER_Q; + + ZFCP_LOG_TRACE + ("total SCSI data buffer size is (scpnt->request_bufflen) %i\n", + scpnt->request_bufflen); + ZFCP_LOG_TRACE + ("BUFFERs from (buffer_index)%i to (buffer_last)%i available\n", + buffer_index, buffer_last); + ZFCP_LOG_TRACE("buffer_max=%d, req_q->free_count=%d\n", buffer_max, + atomic_read(&req_q->free_count)); + + if (scpnt->use_sg) { + int sg_index; + struct scatterlist *list + = (struct scatterlist *) scpnt->request_buffer; + + ZFCP_LOG_DEBUG("%i (scpnt->use_sg) scatter-gather segments\n", + scpnt->use_sg); + + // length_max+=0x2100; + +#ifdef ZFCP_STAT_REQSIZES + if (sbtype == SBAL_FLAGS0_TYPE_READ) + zfcp_statistics_inc(&zfcp_data.read_sguse_head, + scpnt->use_sg); + else + zfcp_statistics_inc(&zfcp_data.write_sguse_head, + scpnt->use_sg); +#endif + + for (sg_index = 0; sg_index < scpnt->use_sg; sg_index++, list++) + { + if (zfcp_create_sbales_from_segment( + (page_to_pfn (list->page) << PAGE_SHIFT) + + list->offset, + list->length, + &length_total, + length_min, + length_max, + &buffer_index, + &buffere_index, + req_q->free_index, + buffer_last, + req_q->buffer, + sbtype)) + break; + } + } else { + ZFCP_LOG_DEBUG("no scatter-gather list\n"); +#ifdef ZFCP_STAT_REQSIZES + if (sbtype == SBAL_FLAGS0_TYPE_READ) + zfcp_statistics_inc(&zfcp_data.read_sguse_head, 1); + else + zfcp_statistics_inc(&zfcp_data.write_sguse_head, 1); +#endif + zfcp_create_sbales_from_segment( + (unsigned long) scpnt->request_buffer, + scpnt->request_bufflen, + &length_total, + length_min, + length_max, + &buffer_index, + &buffere_index, + req_q->free_index, + buffer_last, + req_q->buffer, + sbtype); + } + + fsf_req->sbal_index = req_q->free_index; + + if (buffer_index >= fsf_req->sbal_index) { + fsf_req->sbal_count = (buffer_index - fsf_req->sbal_index) + 1; + } else { + fsf_req->sbal_count = + (QDIO_MAX_BUFFERS_PER_Q - fsf_req->sbal_index) + + buffer_index + 1; + } + /* HACK */ + if ((scpnt->request_bufflen != 0) && (length_total == 0)) + goto out; + +#ifdef ZFCP_STAT_REQSIZES + if (sbtype == SBAL_FLAGS0_TYPE_READ) + zfcp_statistics_inc(&zfcp_data.read_req_head, length_total); + else + zfcp_statistics_inc(&zfcp_data.write_req_head, length_total); +#endif + + buffere = &(req_q->buffer[buffer_index]->element[buffere_index]); + buffere->flags |= SBAL_FLAGS_LAST_ENTRY; + out: + ZFCP_LOG_DEBUG("%i BUFFER(s) from %i to %i needed\n", + fsf_req->sbal_count, fsf_req->sbal_index, buffer_index); + ZFCP_LOG_TRACE("total QDIO data buffer size is %i\n", length_total); + + return length_total; +} + +void +zfcp_fsf_start_scsi_er_timer(struct zfcp_adapter *adapter) +{ + adapter->scsi_er_timer.function = zfcp_fsf_scsi_er_timeout_handler; + adapter->scsi_er_timer.data = (unsigned long) adapter; + adapter->scsi_er_timer.expires = jiffies + ZFCP_SCSI_ER_TIMEOUT; + add_timer(&adapter->scsi_er_timer); +} + +/** + * zfcp_sysfs_hba_id_show - display hba_id of scsi device + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * "hba_id" attribute of a scsi device. Displays hba_id (bus_id) + * of the adapter belonging to a scsi device. + */ +static ssize_t +zfcp_sysfs_hba_id_show(struct device *dev, char *buf) +{ + struct scsi_device *sdev; + struct zfcp_unit *unit; + + sdev = to_scsi_device(dev); + unit = (struct zfcp_unit *) sdev->hostdata; + return sprintf(buf, "%s\n", zfcp_get_busid_by_unit(unit)); +} + +static DEVICE_ATTR(hba_id, S_IRUGO, zfcp_sysfs_hba_id_show, NULL); + +/** + * zfcp_sysfs_wwpn_show - display wwpn of scsi device + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * "wwpn" attribute of a scsi device. Displays wwpn of the port + * belonging to a scsi device. + */ +static ssize_t +zfcp_sysfs_wwpn_show(struct device *dev, char *buf) +{ + struct scsi_device *sdev; + struct zfcp_unit *unit; + + sdev = to_scsi_device(dev); + unit = (struct zfcp_unit *) sdev->hostdata; + return sprintf(buf, "0x%016llx\n", unit->port->wwpn); +} + +static DEVICE_ATTR(wwpn, S_IRUGO, zfcp_sysfs_wwpn_show, NULL); + +/** + * zfcp_sysfs_fcp_lun_show - display fcp lun of scsi device + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * "fcp_lun" attribute of a scsi device. Displays fcp_lun of the unit + * belonging to a scsi device. + */ +static ssize_t +zfcp_sysfs_fcp_lun_show(struct device *dev, char *buf) +{ + struct scsi_device *sdev; + struct zfcp_unit *unit; + + sdev = to_scsi_device(dev); + unit = (struct zfcp_unit *) sdev->hostdata; + return sprintf(buf, "0x%016llx\n", unit->fcp_lun); +} + +static DEVICE_ATTR(fcp_lun, S_IRUGO, zfcp_sysfs_fcp_lun_show, NULL); + +static struct device_attribute *zfcp_sysfs_sdev_attrs[] = { + &dev_attr_fcp_lun, + &dev_attr_wwpn, + &dev_attr_hba_id, + NULL +}; + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c Wed Oct 8 12:24:57 2003 @@ -0,0 +1,346 @@ +/* + * linux/drivers/s390/scsi/zfcp_sysfs_adapter.c + * + * FCP adapter driver for IBM eServer zSeries + * + * sysfs adapter related routines + * + * Copyright (C) 2003 IBM Entwicklung GmbH, IBM Corporation + * Authors: + * Martin Peschke + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_SYSFS_ADAPTER_C_REVISION "$Revision: 1.21 $" + +#include +#include "zfcp_ext.h" +#include "zfcp_def.h" + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_CONFIG + +static const char fc_topologies[5][25] = { + {""}, + {"point-to-point"}, + {"fabric"}, + {"arbitrated loop"}, + {"fabric (virt. adapter)"} +}; + +/** + * ZFCP_DEFINE_ADAPTER_ATTR + * @_name: name of show attribute + * @_format: format string + * @_value: value to print + * + * Generates attributes for an adapter. + */ +#define ZFCP_DEFINE_ADAPTER_ATTR(_name, _format, _value) \ +static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, \ + char *buf) \ +{ \ + struct zfcp_adapter *adapter; \ + \ + adapter = dev_get_drvdata(dev); \ + return sprintf(buf, _format, _value); \ +} \ + \ +static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_adapter_##_name##_show, NULL); + +ZFCP_DEFINE_ADAPTER_ATTR(status, "0x%08x\n", atomic_read(&adapter->status)); +ZFCP_DEFINE_ADAPTER_ATTR(wwnn, "0x%016llx\n", adapter->wwnn); +ZFCP_DEFINE_ADAPTER_ATTR(wwpn, "0x%016llx\n", adapter->wwpn); +ZFCP_DEFINE_ADAPTER_ATTR(s_id, "0x%06x\n", adapter->s_id); +ZFCP_DEFINE_ADAPTER_ATTR(hw_version, "0x%04x\n", adapter->hydra_version); +ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); +ZFCP_DEFINE_ADAPTER_ATTR(fc_link_speed, "%d Gb/s\n", adapter->fc_link_speed); +ZFCP_DEFINE_ADAPTER_ATTR(fc_service_class, "%d\n", adapter->fc_service_class); +ZFCP_DEFINE_ADAPTER_ATTR(fc_topology, "%s\n", + fc_topologies[adapter->fc_topology]); + +/** + * zfcp_sysfs_adapter_in_recovery_show - recovery state of adapter + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * Show function of "in_recovery" attribute of adapter. Will be + * "0" if no error recovery is pending for adapter, otherwise "1". + */ +static ssize_t +zfcp_sysfs_adapter_in_recovery_show(struct device *dev, char *buf) +{ + struct zfcp_adapter *adapter; + + adapter = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static DEVICE_ATTR(in_recovery, S_IRUGO, + zfcp_sysfs_adapter_in_recovery_show, NULL); + +/** + * zfcp_sysfs_adapter_scsi_host_no_show - display scsi_host_no of adapter + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * "scsi_host_no" attribute of adapter. Displays the SCSI host number. + */ +static ssize_t +zfcp_sysfs_adapter_scsi_host_no_show(struct device *dev, char *buf) +{ + struct zfcp_adapter *adapter; + unsigned short host_no = 0; + + down(&zfcp_data.config_sema); + adapter = dev_get_drvdata(dev); + if (adapter->scsi_host) + host_no = adapter->scsi_host->host_no; + up(&zfcp_data.config_sema); + return sprintf(buf, "0x%x\n", host_no); +} + +static DEVICE_ATTR(scsi_host_no, S_IRUGO, zfcp_sysfs_adapter_scsi_host_no_show, + NULL); + +/** + * zfcp_sysfs_port_add_store - add a port to sysfs tree + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * @count: number of bytes in buffer + * + * Store function of the "port_add" attribute of an adapter. + */ +static ssize_t +zfcp_sysfs_port_add_store(struct device *dev, const char *buf, size_t count) +{ + wwn_t wwpn; + char *endp; + struct zfcp_adapter *adapter; + struct zfcp_port *port; + int retval = -EINVAL; + + down(&zfcp_data.config_sema); + + adapter = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status)) { + retval = -EBUSY; + goto out; + } + + wwpn = simple_strtoull(buf, &endp, 0); + if ((endp + 1) < (buf + count)) + goto out; + + port = zfcp_port_enqueue(adapter, wwpn, 0); + if (!port) + goto out; + + retval = 0; + + zfcp_adapter_get(adapter); + + /* try to open port only if adapter is online */ + if (adapter->ccw_device->online == 1) + zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_port_put(port); + out: + up(&zfcp_data.config_sema); + return retval ? retval : count; +} + +static DEVICE_ATTR(port_add, S_IWUSR, NULL, zfcp_sysfs_port_add_store); + +/** + * zfcp_sysfs_port_remove_store - remove a port from sysfs tree + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * @count: number of bytes in buffer + * + * Store function of the "port_remove" attribute of an adapter. + */ +static ssize_t +zfcp_sysfs_port_remove_store(struct device *dev, const char *buf, size_t count) +{ + struct zfcp_adapter *adapter; + struct zfcp_port *port; + wwn_t wwpn; + char *endp; + int retval = 0; + + down(&zfcp_data.config_sema); + + adapter = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status)) { + retval = -EBUSY; + goto out; + } + + wwpn = simple_strtoull(buf, &endp, 0); + if ((endp + 1) < (buf + count)) { + retval = -EINVAL; + goto out; + } + + write_lock_irq(&zfcp_data.config_lock); + port = zfcp_get_port_by_wwpn(adapter, wwpn); + if (port && (atomic_read(&port->refcount) == 0)) { + zfcp_port_get(port); + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status); + list_move(&port->list, &adapter->port_remove_lh); + } + else { + port = NULL; + } + write_unlock_irq(&zfcp_data.config_lock); + + if (!port) { + retval = -ENXIO; + goto out; + } + + zfcp_erp_port_shutdown(port, 0); + zfcp_erp_wait(adapter); + zfcp_port_put(port); + device_unregister(&port->sysfs_device); + out: + up(&zfcp_data.config_sema); + return retval ? retval : count; +} + +static DEVICE_ATTR(port_remove, S_IWUSR, NULL, zfcp_sysfs_port_remove_store); + +/** + * zfcp_sysfs_adapter_failed_store - failed state of adapter + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * @count: number of bytes in buffer + * + * Store function of the "failed" attribute of an adapter. + * If a "0" gets written to "failed", error recovery will be + * started for the belonging adapter. + */ +static ssize_t +zfcp_sysfs_adapter_failed_store(struct device *dev, + const char *buf, size_t count) +{ + struct zfcp_adapter *adapter; + unsigned int val; + char *endp; + int retval = 0; + + down(&zfcp_data.config_sema); + + adapter = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status)) { + retval = -EBUSY; + goto out; + } + + val = simple_strtoul(buf, &endp, 0); + if (((endp + 1) < (buf + count)) || (val != 0)) { + retval = -EINVAL; + goto out; + } + + /* restart error recovery only if adapter is online */ + if (adapter->ccw_device->online != 1) { + retval = -ENXIO; + goto out; + } + zfcp_erp_modify_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING, + ZFCP_SET); + zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED); + out: + up(&zfcp_data.config_sema); + return retval ? retval : count; +} + +/** + * zfcp_sysfs_adapter_failed_show - failed state of adapter + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * Show function of "failed" attribute of adapter. Will be + * "0" if adapter is working, otherwise "1". + */ +static ssize_t +zfcp_sysfs_adapter_failed_show(struct device *dev, char *buf) +{ + struct zfcp_adapter *adapter; + + adapter = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status)) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static DEVICE_ATTR(failed, S_IWUSR | S_IRUGO, zfcp_sysfs_adapter_failed_show, + zfcp_sysfs_adapter_failed_store); + +static struct attribute *zfcp_adapter_attrs[] = { + &dev_attr_failed.attr, + &dev_attr_in_recovery.attr, + &dev_attr_port_remove.attr, + &dev_attr_port_add.attr, + &dev_attr_wwnn.attr, + &dev_attr_wwpn.attr, + &dev_attr_s_id.attr, + &dev_attr_hw_version.attr, + &dev_attr_lic_version.attr, + &dev_attr_fc_link_speed.attr, + &dev_attr_fc_service_class.attr, + &dev_attr_fc_topology.attr, + &dev_attr_scsi_host_no.attr, + &dev_attr_status.attr, + NULL +}; + +static struct attribute_group zfcp_adapter_attr_group = { + .attrs = zfcp_adapter_attrs, +}; + +/** + * zfcp_sysfs_create_adapter_files - create sysfs adapter files + * @dev: pointer to belonging device + * + * Create all attributes of the sysfs representation of an adapter. + */ +int +zfcp_sysfs_adapter_create_files(struct device *dev) +{ + return sysfs_create_group(&dev->kobj, &zfcp_adapter_attr_group); +} + +/** + * zfcp_sysfs_remove_adapter_files - remove sysfs adapter files + * @dev: pointer to belonging device + * + * Remove all attributes of the sysfs representation of an adapter. + */ +void +zfcp_sysfs_adapter_remove_files(struct device *dev) +{ + sysfs_remove_group(&dev->kobj, &zfcp_adapter_attr_group); +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_sysfs_driver.c b/drivers/s390/scsi/zfcp_sysfs_driver.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_sysfs_driver.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,127 @@ +/* + * linux/drivers/s390/scsi/zfcp_sysfs_driver.c + * + * FCP adapter driver for IBM eServer zSeries + * + * sysfs driver related routines + * + * Copyright (C) 2003 IBM Entwicklung GmbH, IBM Corporation + * Authors: + * Martin Peschke + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_SYSFS_DRIVER_C_REVISION "$Revision: 1.8 $" + +#include +#include "zfcp_ext.h" +#include "zfcp_def.h" + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_CONFIG + +/** + * ZFCP_DEFINE_DRIVER_ATTR - define for all loglevels sysfs attributes + * @_name: name of attribute + * @_define: name of ZFCP loglevel define + * + * Generates store function for a sysfs loglevel attribute of zfcp driver. + */ +#define ZFCP_DEFINE_DRIVER_ATTR(_name, _define) \ +static ssize_t zfcp_sysfs_loglevel_##_name##_store(struct device_driver *drv, \ + const char *buf, \ + size_t count) \ +{ \ + unsigned int loglevel; \ + unsigned int new_loglevel; \ + char *endp; \ + \ + new_loglevel = simple_strtoul(buf, &endp, 0); \ + if ((endp + 1) < (buf + count)) \ + return -EINVAL; \ + if (new_loglevel > 3) \ + return -EINVAL; \ + down(&zfcp_data.config_sema); \ + loglevel = atomic_read(&zfcp_data.loglevel); \ + loglevel &= ~((unsigned int) 0xf << (ZFCP_LOG_AREA_##_define << 2)); \ + loglevel |= new_loglevel << (ZFCP_LOG_AREA_##_define << 2); \ + atomic_set(&zfcp_data.loglevel, loglevel); \ + up(&zfcp_data.config_sema); \ + return count; \ +} \ + \ +static ssize_t zfcp_sysfs_loglevel_##_name##_show(struct device_driver *dev, \ + char *buf) \ +{ \ + return sprintf(buf,"%d\n", ZFCP_LOG_VALUE(ZFCP_LOG_AREA_##_define)); \ +} \ + \ +static DRIVER_ATTR(loglevel_##_name, S_IWUSR | S_IRUGO, \ + zfcp_sysfs_loglevel_##_name##_show, \ + zfcp_sysfs_loglevel_##_name##_store); + +ZFCP_DEFINE_DRIVER_ATTR(other, OTHER); +ZFCP_DEFINE_DRIVER_ATTR(scsi, SCSI); +ZFCP_DEFINE_DRIVER_ATTR(fsf, FSF); +ZFCP_DEFINE_DRIVER_ATTR(config, CONFIG); +ZFCP_DEFINE_DRIVER_ATTR(cio, CIO); +ZFCP_DEFINE_DRIVER_ATTR(qdio, QDIO); +ZFCP_DEFINE_DRIVER_ATTR(erp, ERP); +ZFCP_DEFINE_DRIVER_ATTR(fc, FC); + +static struct attribute *zfcp_driver_attrs[] = { + &driver_attr_loglevel_other.attr, + &driver_attr_loglevel_scsi.attr, + &driver_attr_loglevel_fsf.attr, + &driver_attr_loglevel_config.attr, + &driver_attr_loglevel_cio.attr, + &driver_attr_loglevel_qdio.attr, + &driver_attr_loglevel_erp.attr, + &driver_attr_loglevel_fc.attr, + NULL +}; + +static struct attribute_group zfcp_driver_attr_group = { + .attrs = zfcp_driver_attrs, +}; + +/** + * zfcp_sysfs_create_driver_files - create sysfs driver files + * @dev: pointer to belonging device + * + * Create all sysfs attributes of the zfcp device driver + */ +int +zfcp_sysfs_driver_create_files(struct device_driver *drv) +{ + return sysfs_create_group(&drv->kobj, &zfcp_driver_attr_group); +} + +/** + * zfcp_sysfs_remove_driver_files - remove sysfs driver files + * @dev: pointer to belonging device + * + * Remove all sysfs attributes of the zfcp device driver + */ +void +zfcp_sysfs_driver_remove_files(struct device_driver *drv) +{ + sysfs_remove_group(&drv->kobj, &zfcp_driver_attr_group); +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_sysfs_port.c b/drivers/s390/scsi/zfcp_sysfs_port.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_sysfs_port.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,319 @@ +/* + * linux/drivers/s390/scsi/zfcp_sysfs_port.c + * + * FCP adapter driver for IBM eServer zSeries + * + * sysfs port related routines + * + * Copyright (C) 2003 IBM Entwicklung GmbH, IBM Corporation + * Authors: + * Martin Peschke + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_SYSFS_PORT_C_REVISION "$Revision: 1.26 $" + +#include +#include +#include +#include "zfcp_ext.h" +#include "zfcp_def.h" + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_CONFIG + +/** + * zfcp_sysfs_port_release - gets called when a struct device port is released + * @dev: pointer to belonging device + */ +void +zfcp_sysfs_port_release(struct device *dev) +{ + struct zfcp_port *port; + + port = dev_get_drvdata(dev); + zfcp_port_dequeue(port); + return; +} + +/** + * ZFCP_DEFINE_PORT_ATTR + * @_name: name of show attribute + * @_format: format string + * @_value: value to print + * + * Generates attributes for a port. + */ +#define ZFCP_DEFINE_PORT_ATTR(_name, _format, _value) \ +static ssize_t zfcp_sysfs_port_##_name##_show(struct device *dev, \ + char *buf) \ +{ \ + struct zfcp_port *port; \ + \ + port = dev_get_drvdata(dev); \ + return sprintf(buf, _format, _value); \ +} \ + \ +static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_port_##_name##_show, NULL); + +ZFCP_DEFINE_PORT_ATTR(status, "0x%08x\n", atomic_read(&port->status)); +ZFCP_DEFINE_PORT_ATTR(wwnn, "0x%016llx\n", port->wwnn); +ZFCP_DEFINE_PORT_ATTR(d_id, "0x%06x\n", port->d_id); +ZFCP_DEFINE_PORT_ATTR(scsi_id, "0x%x\n", port->scsi_id); + +/** + * zfcp_sysfs_unit_add_store - add a unit to sysfs tree + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * @count: number of bytes in buffer + * + * Store function of the "unit_add" attribute of a port. + */ +static ssize_t +zfcp_sysfs_unit_add_store(struct device *dev, const char *buf, size_t count) +{ + fcp_lun_t fcp_lun; + char *endp; + struct zfcp_port *port; + struct zfcp_unit *unit; + int retval = -EINVAL; + + down(&zfcp_data.config_sema); + + port = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status)) { + retval = -EBUSY; + goto out; + } + + fcp_lun = simple_strtoull(buf, &endp, 0); + if ((endp + 1) < (buf + count)) + goto out; + + unit = zfcp_unit_enqueue(port, fcp_lun); + if (!unit) + goto out; + + retval = 0; + + zfcp_port_get(port); + + /* try to open unit only if adapter is online */ + if (port->adapter->ccw_device->online == 1) + zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); + zfcp_unit_put(unit); + out: + up(&zfcp_data.config_sema); + return retval ? retval : count; +} + +static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store); + +/** + * zfcp_sysfs_unit_remove_store - remove a unit from sysfs tree + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * @count: number of bytes in buffer + */ +static ssize_t +zfcp_sysfs_unit_remove_store(struct device *dev, const char *buf, size_t count) +{ + struct zfcp_port *port; + struct zfcp_unit *unit; + fcp_lun_t fcp_lun; + char *endp; + int retval = -EINVAL; + + down(&zfcp_data.config_sema); + + port = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status)) { + retval = -EBUSY; + goto out; + } + + fcp_lun = simple_strtoull(buf, &endp, 0); + if ((endp + 1) < (buf + count)) + goto out; + + write_lock_irq(&zfcp_data.config_lock); + unit = zfcp_get_unit_by_lun(port, fcp_lun); + if (unit && (atomic_read(&unit->refcount) == 0)) { + zfcp_unit_get(unit); + atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); + list_move(&unit->list, &port->unit_remove_lh); + } + else { + unit = NULL; + } + write_unlock_irq(&zfcp_data.config_lock); + + if (!unit) { + retval = -ENXIO; + goto out; + } + + zfcp_erp_unit_shutdown(unit, 0); + zfcp_erp_wait(unit->port->adapter); + zfcp_unit_put(unit); + device_unregister(&unit->sysfs_device); + out: + up(&zfcp_data.config_sema); + return retval ? retval : count; +} + +static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store); + +/** + * zfcp_sysfs_port_failed_store - failed state of port + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * @count: number of bytes in buffer + * + * Store function of the "failed" attribute of a port. + * If a "0" gets written to "failed", error recovery will be + * started for the belonging port. + */ +static ssize_t +zfcp_sysfs_port_failed_store(struct device *dev, const char *buf, size_t count) +{ + struct zfcp_port *port; + unsigned int val; + char *endp; + int retval = 0; + + down(&zfcp_data.config_sema); + + port = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status)) { + retval = -EBUSY; + goto out; + } + + val = simple_strtoul(buf, &endp, 0); + if (((endp + 1) < (buf + count)) || (val != 0)) { + retval = -EINVAL; + goto out; + } + + /* restart error recovery only if adapter is online */ + if (port->adapter->ccw_device->online != 1) { + retval = -ENXIO; + goto out; + } + zfcp_erp_modify_port_status(port, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); + zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED); + out: + up(&zfcp_data.config_sema); + return retval ? retval : count; +} + +/** + * zfcp_sysfs_port_failed_show - failed state of port + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * Show function of "failed" attribute of port. Will be + * "0" if port is working, otherwise "1". + */ +static ssize_t +zfcp_sysfs_port_failed_show(struct device *dev, char *buf) +{ + struct zfcp_port *port; + + port = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static DEVICE_ATTR(failed, S_IWUSR | S_IRUGO, zfcp_sysfs_port_failed_show, + zfcp_sysfs_port_failed_store); + +/** + * zfcp_sysfs_port_in_recovery_show - recovery state of port + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * Show function of "in_recovery" attribute of port. Will be + * "0" if no error recovery is pending for port, otherwise "1". + */ +static ssize_t +zfcp_sysfs_port_in_recovery_show(struct device *dev, char *buf) +{ + struct zfcp_port *port; + + port = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static DEVICE_ATTR(in_recovery, S_IRUGO, zfcp_sysfs_port_in_recovery_show, + NULL); + +static struct attribute *zfcp_port_common_attrs[] = { + &dev_attr_failed.attr, + &dev_attr_in_recovery.attr, + &dev_attr_status.attr, + &dev_attr_wwnn.attr, + &dev_attr_d_id.attr, + NULL +}; + +static struct attribute_group zfcp_port_common_attr_group = { + .attrs = zfcp_port_common_attrs, +}; + +static struct attribute *zfcp_port_no_ns_attrs[] = { + &dev_attr_unit_add.attr, + &dev_attr_unit_remove.attr, + &dev_attr_scsi_id.attr, + NULL +}; + +static struct attribute_group zfcp_port_no_ns_attr_group = { + .attrs = zfcp_port_no_ns_attrs, +}; + +/** + * zfcp_sysfs_create_port_files - create sysfs port files + * @dev: pointer to belonging device + * + * Create all attributes of the sysfs representation of a port. + */ +int +zfcp_sysfs_port_create_files(struct device *dev, u32 flags) +{ + int retval; + + retval = sysfs_create_group(&dev->kobj, &zfcp_port_common_attr_group); + + if ((flags & ZFCP_STATUS_PORT_NAMESERVER) || retval) + return retval; + + retval = sysfs_create_group(&dev->kobj, &zfcp_port_no_ns_attr_group); + if (retval) + sysfs_remove_group(&dev->kobj, &zfcp_port_common_attr_group); + + return retval; +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/s390/scsi/zfcp_sysfs_unit.c b/drivers/s390/scsi/zfcp_sysfs_unit.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c Wed Oct 8 12:24:57 2003 @@ -0,0 +1,190 @@ +/* + * linux/drivers/s390/scsi/zfcp_sysfs_unit.c + * + * FCP adapter driver for IBM eServer zSeries + * + * sysfs unit related routines + * + * Copyright (C) 2003 IBM Entwicklung GmbH, IBM Corporation + * Authors: + * Martin Peschke + * Heiko Carstens + * + * 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, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define ZFCP_SYSFS_UNIT_C_REVISION "$Revision: 1.17 $" + +#include +#include +#include +#include "zfcp_ext.h" +#include "zfcp_def.h" + +#define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG +#define ZFCP_LOG_AREA_PREFIX ZFCP_LOG_AREA_PREFIX_CONFIG + +/** + * zfcp_sysfs_unit_release - gets called when a struct device unit is released + * @dev: pointer to belonging device + */ +void +zfcp_sysfs_unit_release(struct device *dev) +{ + struct zfcp_unit *unit; + + unit = dev_get_drvdata(dev); + zfcp_unit_dequeue(unit); + return; +} + +/** + * ZFCP_DEFINE_UNIT_ATTR + * @_name: name of show attribute + * @_format: format string + * @_value: value to print + * + * Generates attribute for a unit. + */ +#define ZFCP_DEFINE_UNIT_ATTR(_name, _format, _value) \ +static ssize_t zfcp_sysfs_unit_##_name##_show(struct device *dev, \ + char *buf) \ +{ \ + struct zfcp_unit *unit; \ + \ + unit = dev_get_drvdata(dev); \ + return sprintf(buf, _format, _value); \ +} \ + \ +static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_unit_##_name##_show, NULL); + +ZFCP_DEFINE_UNIT_ATTR(status, "0x%08x\n", atomic_read(&unit->status)); +ZFCP_DEFINE_UNIT_ATTR(scsi_lun, "0x%x\n", unit->scsi_lun); + +/** + * zfcp_sysfs_unit_failed_store - failed state of unit + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * @count: number of bytes in buffer + * + * Store function of the "failed" attribute of a unit. + * If a "0" gets written to "failed", error recovery will be + * started for the belonging unit. + */ +static ssize_t +zfcp_sysfs_unit_failed_store(struct device *dev, const char *buf, size_t count) +{ + struct zfcp_unit *unit; + unsigned int val; + char *endp; + int retval = 0; + + down(&zfcp_data.config_sema); + unit = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status)) { + retval = -EBUSY; + goto out; + } + + val = simple_strtoul(buf, &endp, 0); + if (((endp + 1) < (buf + count)) || (val != 0)) { + retval = -EINVAL; + goto out; + } + + /* restart error recovery only if adapter is online */ + if (unit->port->adapter->ccw_device->online != 1) { + retval = -ENXIO; + goto out; + } + zfcp_erp_modify_unit_status(unit, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); + zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED); + out: + up(&zfcp_data.config_sema); + return retval ? retval : count; +} + +/** + * zfcp_sysfs_unit_failed_show - failed state of unit + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * Show function of "failed" attribute of unit. Will be + * "0" if unit is working, otherwise "1". + */ +static ssize_t +zfcp_sysfs_unit_failed_show(struct device *dev, char *buf) +{ + struct zfcp_unit *unit; + + unit = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &unit->status)) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static DEVICE_ATTR(failed, S_IWUSR | S_IRUGO, zfcp_sysfs_unit_failed_show, + zfcp_sysfs_unit_failed_store); + +/** + * zfcp_sysfs_unit_in_recovery_show - recovery state of unit + * @dev: pointer to belonging device + * @buf: pointer to input buffer + * + * Show function of "in_recovery" attribute of unit. Will be + * "0" if no error recovery is pending for unit, otherwise "1". + */ +static ssize_t +zfcp_sysfs_unit_in_recovery_show(struct device *dev, char *buf) +{ + struct zfcp_unit *unit; + + unit = dev_get_drvdata(dev); + if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)) + return sprintf(buf, "1\n"); + else + return sprintf(buf, "0\n"); +} + +static DEVICE_ATTR(in_recovery, S_IRUGO, zfcp_sysfs_unit_in_recovery_show, + NULL); + +static struct attribute *zfcp_unit_attrs[] = { + &dev_attr_scsi_lun.attr, + &dev_attr_failed.attr, + &dev_attr_in_recovery.attr, + &dev_attr_status.attr, + NULL +}; + +static struct attribute_group zfcp_unit_attr_group = { + .attrs = zfcp_unit_attrs, +}; + +/** + * zfcp_sysfs_create_unit_files - create sysfs unit files + * @dev: pointer to belonging device + * + * Create all attributes of the sysfs representation of a unit. + */ +int +zfcp_sysfs_unit_create_files(struct device *dev) +{ + return sysfs_create_group(&dev->kobj, &zfcp_unit_attr_group); +} + +#undef ZFCP_LOG_AREA +#undef ZFCP_LOG_AREA_PREFIX diff -Nru a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c --- a/drivers/sbus/char/bbc_envctrl.c Wed Oct 8 12:24:56 2003 +++ b/drivers/sbus/char/bbc_envctrl.c Wed Oct 8 12:24:56 2003 @@ -59,7 +59,7 @@ * before the hardware based power-off event is triggered. */ -/* These settings are in celcius. We use these defaults only +/* These settings are in Celsius. We use these defaults only * if we cannot interrogate the cpu-fru SEEPROM. */ struct temp_limits { @@ -469,7 +469,6 @@ current->state = TASK_INTERRUPTIBLE; schedule_timeout(POLL_INTERVAL); - current->state = TASK_RUNNING; if (signal_pending(current)) break; diff -Nru a/drivers/sbus/char/cpwatchdog.c b/drivers/sbus/char/cpwatchdog.c --- a/drivers/sbus/char/cpwatchdog.c Wed Oct 8 12:24:57 2003 +++ b/drivers/sbus/char/cpwatchdog.c Wed Oct 8 12:24:57 2003 @@ -539,7 +539,7 @@ static void wd_pingtimer(struct wd_timer* pTimer) { if(wd_readb(&pTimer->regs->status) & WD_S_RUNNING) { - wd_readb(&pTimer->regs->dcntr); + wd_readw(&pTimer->regs->dcntr); } } diff -Nru a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c --- a/drivers/sbus/char/envctrl.c Wed Oct 8 12:24:55 2003 +++ b/drivers/sbus/char/envctrl.c Wed Oct 8 12:24:55 2003 @@ -1036,7 +1036,6 @@ for (;;) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(poll_interval); - current->state = TASK_RUNNING; if(signal_pending(current)) break; @@ -1141,7 +1140,7 @@ } err = kernel_thread(kenvctrld, NULL, CLONE_FS | CLONE_FILES); - if (err) + if (err < 0) goto out_deregister; return 0; @@ -1184,7 +1183,6 @@ current->state = TASK_INTERRUPTIBLE; schedule_timeout(HZ); - current->state = TASK_RUNNING; } kenvctrld_task = NULL; } diff -Nru a/drivers/sbus/char/jsflash.c b/drivers/sbus/char/jsflash.c --- a/drivers/sbus/char/jsflash.c Wed Oct 8 12:24:56 2003 +++ b/drivers/sbus/char/jsflash.c Wed Oct 8 12:24:56 2003 @@ -37,6 +37,7 @@ #include #include #include +#include #define MAJOR_NR JSFD_MAJOR @@ -187,7 +188,7 @@ static void jsfd_do_request(request_queue_t *q) { struct request *req; - + while ((req = elv_next_request(q)) != NULL) { struct jsfd_part *jdp = req->rq_disk->private_data; unsigned long offset = req->sector << 9; @@ -198,16 +199,11 @@ continue; } - if (req->cmd == WRITE) { + if (rq_data_dir(req) != READ) { printk(KERN_ERR "jsfd: write\n"); end_request(req, 0); continue; } - if (req->cmd != READ) { - printk(KERN_ERR "jsfd: bad req->cmd %d\n", req->cmd); - end_request(req, 0); - continue; - } if ((jdp->dbase & 0xff000000) != 0x20000000) { printk(KERN_ERR "jsfd: bad base %x\n", (int)jdp->dbase); @@ -215,7 +211,6 @@ continue; } -/* printk("%s: read buf %p off %x len %x\n", req->rq_disk->disk_name, req->buffer, (int)offset, (int)len); */ /* P3 */ jsfd_read(req->buffer, jdp->dbase + offset, len); end_request(req, 1); @@ -265,9 +260,6 @@ unsigned int n; } b; - if (verify_area(VERIFY_WRITE, buf, togo)) - return -EFAULT; - if (p < JSF_BASE_ALL || p >= JSF_BASE_TOP) { return 0; } @@ -298,7 +290,8 @@ while (togo >= 4) { togo -= 4; b.n = jsf_inl(p); - copy_to_user(tmp, b.s, 4); + if (copy_to_user(tmp, b.s, 4)) + return -EFAULT; tmp += 4; p += 4; } @@ -374,19 +367,17 @@ char s[4]; } b; - if (verify_area(VERIFY_READ, (void *)arg, JSFPRGSZ)) + if (copy_from_user(&abuf, (char *)arg, JSFPRGSZ)) return -EFAULT; - copy_from_user(&abuf, (char *)arg, JSFPRGSZ); p = abuf.off; togo = abuf.size; if ((togo & 3) || (p & 3)) return -EINVAL; uptr = (char *) (unsigned long) abuf.data; - if (verify_area(VERIFY_READ, uptr, togo)) - return -EFAULT; while (togo != 0) { togo -= 4; - copy_from_user(&b.s[0], uptr, 4); + if (copy_from_user(&b.s[0], uptr, 4)) + return -EFAULT; jsf_write4(p, b.n); p += 4; uptr += 4; @@ -404,10 +395,8 @@ return -EPERM; switch (cmd) { case JSFLASH_IDENT: - if (verify_area(VERIFY_WRITE, (void *)arg, JSFIDSZ)) - return -EFAULT; - copy_to_user(arg, &jsf0.id, JSFIDSZ); - error = 0; + if (copy_to_user((void *)arg, &jsf0.id, JSFIDSZ)) + return -EFAULT; break; case JSFLASH_ERASE: error = jsf_ioctl_erase(arg); diff -Nru a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig --- a/drivers/scsi/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/Kconfig Wed Oct 8 12:24:57 2003 @@ -556,7 +556,7 @@ Formerly called GDT SCSI Disk Array Controller Support. This is a driver for RAID/SCSI Disk Array Controllers (EISA/ISA/PCI) - manufactured by Intel/ICP vortex (an Intel Company). It is documented + manufactured by Intel Corporation/ICP vortex GmbH. It is documented in the kernel source in and @@ -1148,16 +1148,6 @@ To compile this driver as a module, choose M here: the module will be called qla1280. -config SCSI_QLOGIC_1280_PIO - bool "Use PIO instead of MMIO" if !X86_VISWS - depends on SCSI_QLOGIC_1280 - default y if X86_VISWS - help - This instructs the driver to use programmed I/O ports (PIO) instead - of PCI shared memory (MMIO). This can possibly solve some problems - in case your mainboard has memory consistency issues. If unsure, - say N. - config SCSI_QLOGICPTI tristate "PTI Qlogic, ISP Driver" depends on SBUS && SCSI @@ -1435,7 +1425,7 @@ config A4000T_SCSI bool "A4000T SCSI support (EXPERIMENTAL)" - depends on AMIGA && SCSI && EXPERIMENTAL + depends on AMIGA && SCSI && EXPERIMENTAL && BROKEN help Support for the NCR53C710 SCSI controller on the Amiga 4000T. @@ -1503,7 +1493,7 @@ config A4091_SCSI bool "A4091 SCSI support (EXPERIMENTAL)" - depends on ZORRO && SCSI && EXPERIMENTAL + depends on ZORRO && SCSI && EXPERIMENTAL && BROKEN help Support for the NCR53C710 chip on the Amiga 4091 Z3 SCSI2 controller (1993). Very obscure -- the 4091 was part of an Amiga 4000 upgrade @@ -1511,7 +1501,7 @@ config WARPENGINE_SCSI bool "WarpEngine SCSI support (EXPERIMENTAL)" - depends on ZORRO && SCSI && EXPERIMENTAL + depends on ZORRO && SCSI && EXPERIMENTAL && BROKEN help Support for MacroSystem Development's WarpEngine Amiga SCSI-2 controller. Info at @@ -1519,7 +1509,7 @@ config BLZ603EPLUS_SCSI bool "Blizzard PowerUP 603e+ SCSI (EXPERIMENTAL)" - depends on ZORRO && SCSI && EXPERIMENTAL + depends on ZORRO && SCSI && EXPERIMENTAL && BROKEN help If you have an Amiga 1200 with a Phase5 Blizzard PowerUP 603e+ accelerator, say Y. Otherwise, say N. @@ -1535,7 +1525,7 @@ config ATARI_SCSI tristate "Atari native SCSI support" - depends on ATARI && SCSI + depends on ATARI && SCSI && BROKEN ---help--- If you have an Atari with built-in NCR5380 SCSI controller (TT, Falcon, ...) say Y to get it supported. Of course also, if you have @@ -1604,7 +1594,7 @@ config MVME16x_SCSI bool "NCR53C710 SCSI driver for MVME16x" - depends on MVME16x && SCSI + depends on MVME16x && SCSI && BROKEN help The Motorola MVME162, 166, 167, 172 and 177 boards use the NCR53C710 SCSI controller chip. Almost everyone using one of these boards @@ -1612,7 +1602,7 @@ config BVME6000_SCSI bool "NCR53C710 SCSI driver for BVME6000" - depends on BVME6000 && SCSI + depends on BVME6000 && SCSI && BROKEN help The BVME4000 and BVME6000 boards from BVM Ltd use the NCR53C710 SCSI controller chip. Almost everyone using one of these boards @@ -1667,6 +1657,11 @@ # bool 'Cyberstorm Mk III SCSI support (EXPERIMENTAL)' CONFIG_CYBERSTORMIII_SCSI # bool 'GVP Turbo 040/060 SCSI support (EXPERIMENTAL)' CONFIG_GVP_TURBO_SCSI + +config ZFCP + tristate "IBM z900 OpenFCP/SCSI support" + depends on ARCH_S390 && SCSI + endmenu source "drivers/scsi/pcmcia/Kconfig" diff -Nru a/drivers/scsi/a2091.c b/drivers/scsi/a2091.c --- a/drivers/scsi/a2091.c Wed Oct 8 12:24:56 2003 +++ b/drivers/scsi/a2091.c Wed Oct 8 12:24:56 2003 @@ -25,31 +25,20 @@ #define DMA(ptr) ((a2091_scsiregs *)((ptr)->base)) #define HDATA(ptr) ((struct WD33C93_hostdata *)((ptr)->hostdata)) -static struct Scsi_Host *first_instance = NULL; -static Scsi_Host_Template *a2091_template; - -static irqreturn_t a2091_intr (int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t a2091_intr (int irq, void *_instance, struct pt_regs *fp) { unsigned long flags; unsigned int status; - struct Scsi_Host *instance; - int handled = 0; + struct Scsi_Host *instance = (struct Scsi_Host *)_instance; - for (instance = first_instance; instance && - instance->hostt == a2091_template; instance = instance->next) - { - status = DMA(instance)->ISTR; - if (!(status & (ISTR_INT_F|ISTR_INT_P))) - continue; - - if (status & ISTR_INTS) { - spin_lock_irqsave(instance->host_lock, flags); - wd33c93_intr (instance); - spin_unlock_irqrestore(instance->host_lock, flags); - handled = 1; - } - } - return IRQ_RETVAL(handled); + status = DMA(instance)->ISTR; + if (!(status & (ISTR_INT_F|ISTR_INT_P)) || !(status & ISTR_INTS)) + return IRQ_NONE; + + spin_lock_irqsave(instance->host_lock, flags); + wd33c93_intr(instance); + spin_unlock_irqrestore(instance->host_lock, flags); + return IRQ_HANDLED; } static int dma_setup (Scsi_Cmnd *cmd, int dir_in) @@ -184,8 +173,6 @@ } } -static int num_a2091 = 0; - int __init a2091_detect(Scsi_Host_Template *tpnt) { static unsigned char called = 0; @@ -193,6 +180,7 @@ unsigned long address; struct zorro_dev *z = NULL; wd33c93_regs regs; + int num_a2091 = 0; if (!MACH_IS_AMIGA || called) return 0; @@ -221,13 +209,10 @@ regs.SASR = &(DMA(instance)->SASR); regs.SCMD = &(DMA(instance)->SCMD); wd33c93_init(instance, regs, dma_setup, dma_stop, WD33C93_FS_8_10); - if (num_a2091++ == 0) { - first_instance = instance; - a2091_template = instance->hostt; - request_irq(IRQ_AMIGA_PORTS, a2091_intr, SA_SHIRQ, "A2091 SCSI", - a2091_intr); - } + request_irq(IRQ_AMIGA_PORTS, a2091_intr, SA_SHIRQ, "A2091 SCSI", + instance); DMA(instance)->CNTR = CNTR_PDMD | CNTR_INTEN; + num_a2091++; } return num_a2091; @@ -266,8 +251,7 @@ #ifdef MODULE DMA(instance)->CNTR = 0; release_mem_region(ZTWO_PADDR(instance->base), 256); - if (--num_a2091 == 0) - free_irq(IRQ_AMIGA_PORTS, a2091_intr); + free_irq(IRQ_AMIGA_PORTS, instance); wd33c93_release(); #endif return 1; diff -Nru a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c --- a/drivers/scsi/g_NCR5380.c Wed Oct 8 12:24:56 2003 +++ b/drivers/scsi/g_NCR5380.c Wed Oct 8 12:24:56 2003 @@ -527,8 +527,9 @@ * Locks: none */ -int generic_NCR5380_biosparam(struct scsi_device *sdev, - struct block_device *bdev, sector_t capacity, int *ip) +static int +generic_NCR5380_biosparam(struct scsi_device *sdev, struct block_device *bdev, + sector_t capacity, int *ip) { ip[0] = 64; ip[1] = 32; diff -Nru a/drivers/scsi/g_NCR5380.h b/drivers/scsi/g_NCR5380.h --- a/drivers/scsi/g_NCR5380.h Wed Oct 8 12:24:55 2003 +++ b/drivers/scsi/g_NCR5380.h Wed Oct 8 12:24:55 2003 @@ -52,7 +52,6 @@ static int generic_NCR5380_host_reset(Scsi_Cmnd *); static int generic_NCR5380_device_reset(Scsi_Cmnd *); static const char* generic_NCR5380_info(struct Scsi_Host *); -static int generic_NCR5380_biosparam(struct scsi_device *, struct block_device *, sector_t, int *); #ifndef CMD_PER_LUN #define CMD_PER_LUN 2 diff -Nru a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c --- a/drivers/scsi/gdth.c Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/gdth.c Wed Oct 8 12:24:57 2003 @@ -4,11 +4,14 @@ * Intel Corporation: Storage RAID Controllers * * * * gdth.c * - * Copyright (C) 1995-03 ICP vortex, an Intel company, Achim Leubner * - * * + * Copyright (C) 1995-03 ICP vortex GmbH, Achim Leubner * + * Copyright (C) 2002-03 Intel Corporation * + * Copyright (C) 2003 Adaptec Inc. * + * * * * - * Additions/Fixes: Boji Tony Kannanthanam * - * * + * Additions/Fixes: * + * Boji Tony Kannanthanam * + * Johannes Dinner * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published * @@ -24,9 +27,13 @@ * along with this kernel; if not, write to the Free Software * * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * * - * Tested with Linux 1.2.13, ..., 2.2.20, ..., 2.4.20 * + * Tested with Linux 1.2.13, ..., 2.2.20, ..., 2.4.22 * * * * $Log: gdth.c,v $ + * Revision 1.64 2003/09/17 08:30:26 achim + * EISA/ISA controller scan disabled + * Command line switch probe_eisa_isa added + * * Revision 1.63 2003/07/12 14:01:00 Daniele Bellucci * Minor cleanups in gdth_ioctl. * @@ -257,7 +264,7 @@ * Initial revision * ************************************************************************/ -#ident "$Id: gdth.c,v 1.62 2003/02/27 15:01:59 achim Exp $" +#ident "$Id: gdth.c,v 1.64 2003/09/17 08:30:26 achim Exp $" /* All GDT Disk Array Controllers are fully supported by this driver. * This includes the PCI/EISA/ISA SCSI Disk Array Controllers and the @@ -291,10 +298,12 @@ * access a shared resource from several nodes, * appropiate controller firmware required * shared_access:N enable driver reserve/release protocol + * probe_eisa_isa:Y scan for EISA/ISA controllers + * probe_eisa_isa:N do not scan for EISA/ISA controllers * * The default values are: "gdth=disable:N,reserve_mode:1,reverse_scan:N, * max_ids:127,rescan:N,virt_ctr:N,hdr_channel:0, - * shared_access:Y". + * shared_access:Y,probe_eisa_isa:N". * Here is another example: "gdth=reserve_list:0,1,2,0,0,1,3,0,rescan:Y". * * When loading the gdth driver as a module, the same options are available. @@ -304,7 +313,8 @@ * '1' in place of 'Y' and '0' in place of 'N'. * * Default: "modprobe gdth disable=0 reserve_mode=1 reverse_scan=0 - * max_ids=127 rescan=0 virt_ctr=0 hdr_channel=0 shared_access=0" + * max_ids=127 rescan=0 virt_ctr=0 hdr_channel=0 shared_access=0 + * probe_eisa_isa=0" * The other example: "modprobe gdth reserve_list=0,1,2,0,0,1,3,0 rescan=1". */ @@ -719,6 +729,8 @@ static int virt_ctr = 0; /* shared access */ static int shared_access = 1; +/* enable support for EISA and ISA controllers */ +static int probe_eisa_isa = 0; #ifdef MODULE #if LINUX_VERSION_CODE >= 0x02011A @@ -733,6 +745,7 @@ MODULE_PARM(rescan, "i"); MODULE_PARM(virt_ctr, "i"); MODULE_PARM(shared_access, "i"); +MODULE_PARM(probe_eisa_isa, "i"); MODULE_AUTHOR("Achim Leubner"); #endif #if LINUX_VERSION_CODE >= 0x02040B @@ -4133,6 +4146,8 @@ virt_ctr = val; else if (!strncmp(argv, "shared_access:", 14)) shared_access = val; + else if (!strncmp(argv, "probe_eisa_isa:", 15)) + probe_eisa_isa = val; else if (!strncmp(argv, "reserve_list:", 13)) { reserve_list[0] = val; for (i = 1; i < MAX_RES_ARGS; i++) { @@ -4213,249 +4228,250 @@ gdth_polling = TRUE; b = 0; gdth_clear_events(); - /* scanning for controllers, at first: ISA controller */ - for (isa_bios=0xc8000UL; isa_bios<=0xd8000UL; isa_bios+=0x8000UL) { - - dma_addr_t scratch_dma_handle; - - if (gdth_ctr_count >= MAXHA) - break; - if (gdth_search_isa(isa_bios)) { /* controller found */ - shp = scsi_register(shtp,sizeof(gdth_ext_str)); - if (shp == NULL) - continue; + /* As default we do not probe for EISA or ISA controllers */ + if (probe_eisa_isa) { + /* scanning for controllers, at first: ISA controller */ + for (isa_bios=0xc8000UL; isa_bios<=0xd8000UL; isa_bios+=0x8000UL) { + dma_addr_t scratch_dma_handle; - ha = HADATA(shp); - if (!gdth_init_isa(isa_bios,ha)) { - scsi_unregister(shp); - continue; - } + if (gdth_ctr_count >= MAXHA) + break; + if (gdth_search_isa(isa_bios)) { /* controller found */ + shp = scsi_register(shtp,sizeof(gdth_ext_str)); + if (shp == NULL) + continue; + + ha = HADATA(shp); + if (!gdth_init_isa(isa_bios,ha)) { + scsi_unregister(shp); + continue; + } #ifdef __ia64__ - break; + break; #else - /* controller found and initialized */ - printk("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n", - isa_bios,ha->irq,ha->drq); + /* controller found and initialized */ + printk("Configuring GDT-ISA HA at BIOS 0x%05X IRQ %u DRQ %u\n", + isa_bios,ha->irq,ha->drq); #if LINUX_VERSION_CODE >= 0x010346 - if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) + if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) #else - if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth")) + if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth")) #endif - { - printk("GDT-ISA: Unable to allocate IRQ\n"); - scsi_unregister(shp); - continue; - } - if (request_dma(ha->drq,"gdth")) { - printk("GDT-ISA: Unable to allocate DMA channel\n"); + { + printk("GDT-ISA: Unable to allocate IRQ\n"); + scsi_unregister(shp); + continue; + } + if (request_dma(ha->drq,"gdth")) { + printk("GDT-ISA: Unable to allocate DMA channel\n"); #if LINUX_VERSION_CODE >= 0x010346 - free_irq(ha->irq,ha); + free_irq(ha->irq,ha); #else - free_irq(ha->irq); + free_irq(ha->irq); #endif - scsi_unregister(shp); - continue; - } - set_dma_mode(ha->drq,DMA_MODE_CASCADE); - enable_dma(ha->drq); - shp->unchecked_isa_dma = 1; - shp->irq = ha->irq; - shp->dma_channel = ha->drq; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; + scsi_unregister(shp); + continue; + } + set_dma_mode(ha->drq,DMA_MODE_CASCADE); + enable_dma(ha->drq); + shp->unchecked_isa_dma = 1; + shp->irq = ha->irq; + shp->dma_channel = ha->drq; + hanum = gdth_ctr_count; + gdth_ctr_tab[gdth_ctr_count++] = shp; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; - NUMDATA(shp)->hanum = (ushort)hanum; - NUMDATA(shp)->busnum= 0; + NUMDATA(shp)->hanum = (ushort)hanum; + NUMDATA(shp)->busnum= 0; - ha->pccb = CMDDATA(shp); - ha->ccb_phys = 0L; + ha->pccb = CMDDATA(shp); + ha->ccb_phys = 0L; #if LINUX_VERSION_CODE >= 0x020400 - ha->pdev = NULL; - ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, - &scratch_dma_handle); - ha->scratch_phys = (ulong32)scratch_dma_handle; + ha->pdev = NULL; + ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, + &scratch_dma_handle); + ha->scratch_phys = (ulong32)scratch_dma_handle; #else - ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA); - if (ha->pscratch) - ha->scratch_phys = virt_to_bus(ha->pscratch); -#endif - ha->scratch_busy = FALSE; - ha->req_first = NULL; - ha->tid_cnt = MAX_HDRIVES; - if (max_ids > 0 && max_ids < ha->tid_cnt) - ha->tid_cnt = max_ids; - for (i=0; icmd_tab[i].cmnd = UNUSED_CMND; - ha->scan_mode = rescan ? 0x10 : 0; - - if (ha->pscratch == NULL || !gdth_search_drives(hanum)) { - printk("GDT-ISA: Error during device scan\n"); - --gdth_ctr_count; - --gdth_ctr_vcount; - if (ha->pscratch != NULL) { + ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA); + if (ha->pscratch) + ha->scratch_phys = virt_to_bus(ha->pscratch); +#endif + ha->scratch_busy = FALSE; + ha->req_first = NULL; + ha->tid_cnt = MAX_HDRIVES; + if (max_ids > 0 && max_ids < ha->tid_cnt) + ha->tid_cnt = max_ids; + for (i=0; icmd_tab[i].cmnd = UNUSED_CMND; + ha->scan_mode = rescan ? 0x10 : 0; + + if (ha->pscratch == NULL || !gdth_search_drives(hanum)) { + printk("GDT-ISA: Error during device scan\n"); + --gdth_ctr_count; + --gdth_ctr_vcount; + if (ha->pscratch != NULL) { #if LINUX_VERSION_CODE >= 0x020400 - pci_free_consistent(ha->pdev, GDTH_SCRATCH, - ha->pscratch, ha->scratch_phys); + pci_free_consistent(ha->pdev, GDTH_SCRATCH, + ha->pscratch, ha->scratch_phys); #else - scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH); + scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH); #endif - } + } #if LINUX_VERSION_CODE >= 0x010346 - free_irq(ha->irq,ha); + free_irq(ha->irq,ha); #else - free_irq(ha->irq); + free_irq(ha->irq); #endif - scsi_unregister(shp); - continue; - } - if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) - hdr_channel = ha->bus_cnt; - ha->virt_bus = hdr_channel; + scsi_unregister(shp); + continue; + } + if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) + hdr_channel = ha->bus_cnt; + ha->virt_bus = hdr_channel; #if LINUX_VERSION_CODE >= 0x020000 - shp->max_id = ha->tid_cnt; - shp->max_lun = MAXLUN; - shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; - if (virt_ctr) + shp->max_id = ha->tid_cnt; + shp->max_lun = MAXLUN; + shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; + if (virt_ctr) #endif - { - virt_ctr = 1; - /* register addit. SCSI channels as virtual controllers */ - for (b = 1; b < ha->bus_cnt + 1; ++b) { - shp = scsi_register(shtp,sizeof(gdth_num_str)); - shp->unchecked_isa_dma = 1; - shp->irq = ha->irq; - shp->dma_channel = ha->drq; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; - NUMDATA(shp)->hanum = (ushort)hanum; - NUMDATA(shp)->busnum = b; - } - } + { + virt_ctr = 1; + /* register addit. SCSI channels as virtual controllers */ + for (b = 1; b < ha->bus_cnt + 1; ++b) { + shp = scsi_register(shtp,sizeof(gdth_num_str)); + shp->unchecked_isa_dma = 1; + shp->irq = ha->irq; + shp->dma_channel = ha->drq; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; + NUMDATA(shp)->hanum = (ushort)hanum; + NUMDATA(shp)->busnum = b; + } + } - GDTH_INIT_LOCK_HA(ha); - gdth_enable_int(hanum); + GDTH_INIT_LOCK_HA(ha); + gdth_enable_int(hanum); #endif /* !__ia64__ */ + } } - } - - /* scanning for EISA controllers */ - for (eisa_slot=0x1000; eisa_slot<=0x8000; eisa_slot+=0x1000) { - dma_addr_t scratch_dma_handle; - - if (gdth_ctr_count >= MAXHA) - break; - if (gdth_search_eisa(eisa_slot)) { /* controller found */ - shp = scsi_register(shtp,sizeof(gdth_ext_str)); - if (shp == NULL) - continue; + /* scanning for EISA controllers */ + for (eisa_slot=0x1000; eisa_slot<=0x8000; eisa_slot+=0x1000) { + dma_addr_t scratch_dma_handle; - ha = HADATA(shp); - if (!gdth_init_eisa(eisa_slot,ha)) { - scsi_unregister(shp); - continue; - } - /* controller found and initialized */ - printk("Configuring GDT-EISA HA at Slot %d IRQ %u\n", - eisa_slot>>12,ha->irq); + if (gdth_ctr_count >= MAXHA) + break; + if (gdth_search_eisa(eisa_slot)) { /* controller found */ + shp = scsi_register(shtp,sizeof(gdth_ext_str)); + if (shp == NULL) + continue; + + ha = HADATA(shp); + if (!gdth_init_eisa(eisa_slot,ha)) { + scsi_unregister(shp); + continue; + } + /* controller found and initialized */ + printk("Configuring GDT-EISA HA at Slot %d IRQ %u\n", + eisa_slot>>12,ha->irq); #if LINUX_VERSION_CODE >= 0x010346 - if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) + if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth",ha)) #else - if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth")) + if (request_irq(ha->irq,gdth_interrupt,SA_INTERRUPT,"gdth")) #endif - { - printk("GDT-EISA: Unable to allocate IRQ\n"); - scsi_unregister(shp); - continue; - } - shp->unchecked_isa_dma = 0; - shp->irq = ha->irq; - shp->dma_channel = 0xff; - hanum = gdth_ctr_count; - gdth_ctr_tab[gdth_ctr_count++] = shp; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; - - NUMDATA(shp)->hanum = (ushort)hanum; - NUMDATA(shp)->busnum= 0; - TRACE2(("EISA detect Bus 0: hanum %d\n", - NUMDATA(shp)->hanum)); + { + printk("GDT-EISA: Unable to allocate IRQ\n"); + scsi_unregister(shp); + continue; + } + shp->unchecked_isa_dma = 0; + shp->irq = ha->irq; + shp->dma_channel = 0xff; + hanum = gdth_ctr_count; + gdth_ctr_tab[gdth_ctr_count++] = shp; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; + + NUMDATA(shp)->hanum = (ushort)hanum; + NUMDATA(shp)->busnum= 0; + TRACE2(("EISA detect Bus 0: hanum %d\n", + NUMDATA(shp)->hanum)); - ha->pccb = CMDDATA(shp); - ha->ccb_phys = 0L; + ha->pccb = CMDDATA(shp); + ha->ccb_phys = 0L; #if LINUX_VERSION_CODE >= 0x020400 - ha->pdev = NULL; - ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, - &scratch_dma_handle); - ha->scratch_phys = (ulong32) scratch_dma_handle; - ha->ccb_phys = - pci_map_single(ha->pdev,ha->pccb, - sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL); + ha->pdev = NULL; + ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, + &scratch_dma_handle); + ha->scratch_phys = (ulong32) scratch_dma_handle; + ha->ccb_phys = + pci_map_single(ha->pdev,ha->pccb, + sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL); #else - ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA); - if (ha->pscratch) - ha->scratch_phys = virt_to_bus(ha->pscratch); - ha->ccb_phys = virt_to_bus(ha->pccb); -#endif - ha->scratch_busy = FALSE; - ha->req_first = NULL; - ha->tid_cnt = MAX_HDRIVES; - if (max_ids > 0 && max_ids < ha->tid_cnt) - ha->tid_cnt = max_ids; - for (i=0; icmd_tab[i].cmnd = UNUSED_CMND; - ha->scan_mode = rescan ? 0x10 : 0; - - if (ha->pscratch == NULL || !gdth_search_drives(hanum)) { - printk("GDT-EISA: Error during device scan\n"); - --gdth_ctr_count; - --gdth_ctr_vcount; - if (ha->pscratch != NULL) { + ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA); + if (ha->pscratch) + ha->scratch_phys = virt_to_bus(ha->pscratch); + ha->ccb_phys = virt_to_bus(ha->pccb); +#endif + ha->scratch_busy = FALSE; + ha->req_first = NULL; + ha->tid_cnt = MAX_HDRIVES; + if (max_ids > 0 && max_ids < ha->tid_cnt) + ha->tid_cnt = max_ids; + for (i=0; icmd_tab[i].cmnd = UNUSED_CMND; + ha->scan_mode = rescan ? 0x10 : 0; + + if (ha->pscratch == NULL || !gdth_search_drives(hanum)) { + printk("GDT-EISA: Error during device scan\n"); + --gdth_ctr_count; + --gdth_ctr_vcount; + if (ha->pscratch != NULL) { #if LINUX_VERSION_CODE >= 0x020400 - pci_free_consistent(ha->pdev, GDTH_SCRATCH, - ha->pscratch, ha->scratch_phys); - pci_unmap_single(ha->pdev,ha->ccb_phys, - sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL); + pci_free_consistent(ha->pdev, GDTH_SCRATCH, + ha->pscratch, ha->scratch_phys); + pci_unmap_single(ha->pdev,ha->ccb_phys, + sizeof(gdth_cmd_str),PCI_DMA_BIDIRECTIONAL); #else - scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH); + scsi_init_free((void *)ha->pscratch, GDTH_SCRATCH); #endif - } + } #if LINUX_VERSION_CODE >= 0x010346 - free_irq(ha->irq,ha); + free_irq(ha->irq,ha); #else - free_irq(ha->irq); + free_irq(ha->irq); #endif - scsi_unregister(shp); - continue; - } - if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) - hdr_channel = ha->bus_cnt; - ha->virt_bus = hdr_channel; + scsi_unregister(shp); + continue; + } + if (hdr_channel < 0 || hdr_channel > ha->bus_cnt) + hdr_channel = ha->bus_cnt; + ha->virt_bus = hdr_channel; #if LINUX_VERSION_CODE >= 0x020000 - shp->max_id = ha->tid_cnt; - shp->max_lun = MAXLUN; - shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; - if (virt_ctr) + shp->max_id = ha->tid_cnt; + shp->max_lun = MAXLUN; + shp->max_channel = virt_ctr ? 0 : ha->bus_cnt; + if (virt_ctr) #endif - { - virt_ctr = 1; - /* register addit. SCSI channels as virtual controllers */ - for (b = 1; b < ha->bus_cnt + 1; ++b) { - shp = scsi_register(shtp,sizeof(gdth_num_str)); - shp->unchecked_isa_dma = 0; - shp->irq = ha->irq; - shp->dma_channel = 0xff; - gdth_ctr_vtab[gdth_ctr_vcount++] = shp; - NUMDATA(shp)->hanum = (ushort)hanum; - NUMDATA(shp)->busnum = b; - } - } + { + virt_ctr = 1; + /* register addit. SCSI channels as virtual controllers */ + for (b = 1; b < ha->bus_cnt + 1; ++b) { + shp = scsi_register(shtp,sizeof(gdth_num_str)); + shp->unchecked_isa_dma = 0; + shp->irq = ha->irq; + shp->dma_channel = 0xff; + gdth_ctr_vtab[gdth_ctr_vcount++] = shp; + NUMDATA(shp)->hanum = (ushort)hanum; + NUMDATA(shp)->busnum = b; + } + } - GDTH_INIT_LOCK_HA(ha); - gdth_enable_int(hanum); + GDTH_INIT_LOCK_HA(ha); + gdth_enable_int(hanum); + } } } @@ -4470,8 +4486,7 @@ printk("GDT: Found %d PCI Storage RAID Controllers\n",cnt); gdth_sort_pci(pcistr,cnt); for (ctr = 0; ctr < cnt; ++ctr) { - - dma_addr_t scratch_dma_handle; + dma_addr_t scratch_dma_handle; if (gdth_ctr_count >= MAXHA) break; @@ -4514,7 +4529,7 @@ ha->ccb_phys = 0L; #if LINUX_VERSION_CODE >= 0x020400 ha->pscratch = pci_alloc_consistent(ha->pdev, GDTH_SCRATCH, - &scratch_dma_handle); + &scratch_dma_handle); ha->scratch_phys = (ulong32)scratch_dma_handle; #else ha->pscratch = scsi_init_malloc(GDTH_SCRATCH, GFP_ATOMIC | GFP_DMA); diff -Nru a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h --- a/drivers/scsi/gdth.h Wed Oct 8 12:24:56 2003 +++ b/drivers/scsi/gdth.h Wed Oct 8 12:24:56 2003 @@ -4,13 +4,13 @@ /* * Header file for the GDT Disk Array/Storage RAID controllers driver for Linux * - * gdth.h Copyright (C) 1995-02 ICP vortex, an Intel company, Achim Leubner + * gdth.h Copyright (C) 1995-03 ICP vortex, Achim Leubner * See gdth.c for further informations and * below for supported controller types * - * + * * - * $Id: gdth.h,v 1.48 2003/02/27 14:58:22 achim Exp $ + * $Id: gdth.h,v 1.50 2003/09/17 08:29:58 achim Exp $ */ #include @@ -26,9 +26,9 @@ /* defines, macros */ /* driver version */ -#define GDTH_VERSION_STR "2.07" +#define GDTH_VERSION_STR "2.08" #define GDTH_VERSION 2 -#define GDTH_SUBVERSION 7 +#define GDTH_SUBVERSION 8 /* protocol version */ #define PROTOCOL_VERSION 1 diff -Nru a/drivers/scsi/gdth_proc.c b/drivers/scsi/gdth_proc.c --- a/drivers/scsi/gdth_proc.c Wed Oct 8 12:24:56 2003 +++ b/drivers/scsi/gdth_proc.c Wed Oct 8 12:24:56 2003 @@ -1,5 +1,5 @@ /* gdth_proc.c - * $Id: gdth_proc.c,v 1.35 2003/02/27 15:00:44 achim Exp $ + * $Id: gdth_proc.c,v 1.37 2003/09/17 08:31:53 achim Exp $ */ #if LINUX_VERSION_CODE >= 0x020407 diff -Nru a/drivers/scsi/gdth_proc.h b/drivers/scsi/gdth_proc.h --- a/drivers/scsi/gdth_proc.h Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/gdth_proc.h Wed Oct 8 12:24:57 2003 @@ -2,7 +2,7 @@ #define _GDTH_PROC_H /* gdth_proc.h - * $Id: gdth_proc.h,v 1.13 2003/02/27 14:59:25 achim Exp $ + * $Id: gdth_proc.h,v 1.14 2003/08/27 11:37:35 achim Exp $ */ static int gdth_set_info(char *buffer,int length,int hanum,int busnum); diff -Nru a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c --- a/drivers/scsi/gvp11.c Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/gvp11.c Wed Oct 8 12:24:57 2003 @@ -25,29 +25,20 @@ #define DMA(ptr) ((gvp11_scsiregs *)((ptr)->base)) #define HDATA(ptr) ((struct WD33C93_hostdata *)((ptr)->hostdata)) -static struct Scsi_Host *first_instance = NULL; -static Scsi_Host_Template *gvp11_template; - -static irqreturn_t gvp11_intr (int irq, void *dummy, struct pt_regs *fp) +static irqreturn_t gvp11_intr (int irq, void *_instance, struct pt_regs *fp) { unsigned long flags; unsigned int status; - struct Scsi_Host *instance; - int handled = 0; - - for (instance = first_instance; instance && - instance->hostt == gvp11_template; instance = instance->next) - { - status = DMA(instance)->CNTR; - if (!(status & GVP11_DMAC_INT_PENDING)) - continue; + struct Scsi_Host *instance = (struct Scsi_Host *)_instance; - spin_lock_irqsave(instance->host_lock, flags); - wd33c93_intr (instance); - spin_unlock_irqrestore(instance->host_lock, flags); - handled = 1; - } - return IRQ_RETVAL(handled); + status = DMA(instance)->CNTR; + if (!(status & GVP11_DMAC_INT_PENDING)) + return IRQ_NONE; + + spin_lock_irqsave(instance->host_lock, flags); + wd33c93_intr(instance); + spin_unlock_irqrestore(instance->host_lock, flags); + return IRQ_HANDLED; } static int gvp11_xfer_mask = 0; @@ -177,8 +168,6 @@ } } -static int num_gvp11 = 0; - #define CHECK_WD33C93 int __init gvp11_detect(Scsi_Host_Template *tpnt) @@ -190,6 +179,7 @@ struct zorro_dev *z = NULL; unsigned int default_dma_xfer_mask; wd33c93_regs regs; + int num_gvp11 = 0; #ifdef CHECK_WD33C93 volatile unsigned char *sasr_3393, *scmd_3393; unsigned char save_sasr; @@ -339,13 +329,10 @@ (epc & GVP_SCSICLKMASK) ? WD33C93_FS_8_10 : WD33C93_FS_12_15); - if (num_gvp11++ == 0) { - first_instance = instance; - gvp11_template = instance->hostt; - request_irq(IRQ_AMIGA_PORTS, gvp11_intr, SA_SHIRQ, - "GVP11 SCSI", gvp11_intr); - } + request_irq(IRQ_AMIGA_PORTS, gvp11_intr, SA_SHIRQ, "GVP11 SCSI", + instance); DMA(instance)->CNTR = GVP11_DMAC_INT_ENABLE; + num_gvp11++; continue; release: @@ -391,8 +378,7 @@ #ifdef MODULE DMA(instance)->CNTR = 0; release_mem_region(ZTWO_PADDR(instance->base), 256); - if (--num_gvp11 == 0) - free_irq(IRQ_AMIGA_PORTS, gvp11_intr); + free_irq(IRQ_AMIGA_PORTS, instance); wd33c93_release(); #endif return 1; diff -Nru a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c --- a/drivers/scsi/megaraid.c Wed Oct 8 12:24:55 2003 +++ b/drivers/scsi/megaraid.c Wed Oct 8 12:24:55 2003 @@ -586,7 +586,7 @@ /* Set the Mode of addressing to 64 bit if we can */ if((adapter->flag & BOARD_64BIT)&&(sizeof(dma_addr_t) == 8)) { - pci_set_dma_mask(pdev, 0xffffffffffffffff); + pci_set_dma_mask(pdev, 0xffffffffffffffffULL); adapter->has_64bit_addr = 1; } else { diff -Nru a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c --- a/drivers/scsi/ncr53c8xx.c Wed Oct 8 12:24:56 2003 +++ b/drivers/scsi/ncr53c8xx.c Wed Oct 8 12:24:56 2003 @@ -7757,7 +7757,7 @@ cp->start.schedule.l_cmd = cpu_to_scr(SCR_JUMP); cp->start.p_phys = cpu_to_scr(CCB_PHYS(cp, phys)); - bcopy(&cp->start, &cp->restart, sizeof(cp->restart)); + memcpy(&cp->restart, &cp->start, sizeof(cp->restart)); cp->start.schedule.l_paddr = cpu_to_scr(NCB_SCRIPT_PHYS (np, idle)); cp->restart.schedule.l_paddr = cpu_to_scr(NCB_SCRIPTH_PHYS (np, abort)); diff -Nru a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c --- a/drivers/scsi/nsp32.c Wed Oct 8 12:24:56 2003 +++ b/drivers/scsi/nsp32.c Wed Oct 8 12:24:56 2003 @@ -3435,15 +3435,6 @@ * Power Management */ #ifdef CONFIG_PM -/* Save Device Context */ -static int nsp32_save_state(struct pci_dev *pdev, u32 state) -{ - struct Scsi_Host *host = pci_get_drvdata(pdev); - - nsp32_msg(KERN_INFO, "pci-save_state: stub, pdev=0x%p, state=%ld, slot=%s, host=0x%p", pdev, state, pci_name(pdev), host); - - return 0; -} /* Device suspended */ static int nsp32_suspend(struct pci_dev *pdev, u32 state) @@ -3573,7 +3564,6 @@ .probe = nsp32_probe, .remove = __devexit_p(nsp32_remove), #ifdef CONFIG_PM - .save_state = nsp32_save_state, .suspend = nsp32_suspend, .resume = nsp32_resume, .enable_wake = nsp32_enable_wake, diff -Nru a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c --- a/drivers/scsi/qla1280.c Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/qla1280.c Wed Oct 8 12:24:57 2003 @@ -16,10 +16,15 @@ * General Public License for more details. * ******************************************************************************/ -#define QLA1280_VERSION "3.23.36" +#define QLA1280_VERSION "3.23.37" /***************************************************************************** Revision History: - Rev 3.23.36 September 19, 2003, Christoph Hellwig + Rev 3.23.37 October 1, 2003, Jes Sorensen + - Make MMIO depend on CONFIG_X86_VISWS instead of yet another + random CONFIG option + - Clean up locking in probe path + Rev 3.23.36 October 1, 2003, Christoph Hellwig + - queuecommand only ever receives new commands - clear flags - Reintegrate lost fixes from Linux 2.5 Rev 3.23.35 August 14, 2003, Jes Sorensen - Build against 2.6 @@ -315,14 +320,14 @@ #if LINUX_VERSION_CODE >= 0x020545 #include +#include "scsi.h" #else #include +#include "scsi.h" #include "hosts.h" #include "sd.h" #endif -#include "scsi.h" - #if LINUX_VERSION_CODE < 0x020407 #error "Kernels older than 2.4.7 are no longer supported" #endif @@ -339,7 +344,10 @@ #define DEBUG_PRINT_NVRAM 0 #define DEBUG_QLA1280 0 -#ifdef CONFIG_SCSI_QLOGIC_1280_PIO +/* + * The SGI VISWS is broken and doesn't support MMIO ;-( + */ +#ifdef CONFIG_X86_VISWS #define MEMORY_MAPPED_IO 0 #else #define MEMORY_MAPPED_IO 1 @@ -414,6 +422,11 @@ #else #define HOST_LOCK ha->host->host_lock #endif +#if LINUX_VERSION_CODE < 0x020600 +#define DEV_SIMPLE_TAGS(device) device->tagged_queue +#else +#define DEV_SIMPLE_TAGS(device) device->simple_tags +#endif #if defined(__ia64__) && !defined(ia64_platform_is) #define ia64_platform_is(foo) (!strcmp(x, platform_name)) #endif @@ -647,11 +660,11 @@ #define PROC_BUF &qla1280_buffer[len] #if LINUX_VERSION_CODE < 0x020600 -static int qla1280_proc_info(char *buffer, char **start, off_t offset, int length, - int hostno, int inout) +static int qla1280_proc_info(char *buffer, char **start, off_t offset, + int length, int hostno, int inout) #else -static int qla1280_proc_info(struct Scsi_Host *host, char *buffer, char **start, - off_t offset, int length, int inout) +static int qla1280_proc_info(struct Scsi_Host *host, char *buffer, + char **start, off_t offset, int length, int inout) #endif { struct scsi_qla_host *ha; @@ -955,8 +968,8 @@ host->io_port, host->io_port + 0xff); goto error_free_irq; } - #endif + /* load the F/W, read paramaters, and init the H/W */ if (qla1280_initialize_adapter(ha)) { printk(KERN_INFO "qla1x160: Failed to initialize adapter\n"); @@ -1598,6 +1611,7 @@ return IRQ_RETVAL(handled); } + static int qla12160_set_target_parameters(struct scsi_qla_host *ha, int bus, int target) { @@ -1666,9 +1680,7 @@ int target = device->id; int status = 0; struct nvram *nv; -#if LINUX_VERSION_CODE < 0x020500 unsigned long flags; -#endif ha = (struct scsi_qla_host *)device->host->hostdata; nv = &ha->nvram; @@ -1706,17 +1718,13 @@ nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr = 0; } -#if LINUX_VERSION_CODE < 0x020500 spin_lock_irqsave(HOST_LOCK, flags); -#endif if (nv->bus[bus].target[target].parameter.f.enable_sync) { status = qla12160_set_target_parameters(ha, bus, target); } qla12160_get_target_parameters(ha, device); -#if LINUX_VERSION_CODE < 0x020500 spin_unlock_irqrestore(HOST_LOCK, flags); -#endif return status; } @@ -1995,7 +2003,7 @@ if (ha->request_ring) pci_free_consistent(ha->pdev, ((REQUEST_ENTRY_CNT + 1) * - (sizeof(request_t))), + (sizeof(request_t))), ha->request_ring, ha->request_dma); finish: LEAVE("qla1280_mem_alloc"); @@ -2088,6 +2096,9 @@ struct device_reg *reg; int status; int bus; +#if LINUX_VERSION_CODE > 0x020500 + unsigned long flags; +#endif ENTER("qla1280_initialize_adapter"); @@ -2131,6 +2142,15 @@ "NVRAM\n"); } +#if LINUX_VERSION_CODE >= 0x020500 + /* + * It's necessary to grab the spin here as qla1280_mailbox_command + * needs to be able to drop the lock unconditionally to wait + * for completion. + * In 2.4 ->detect is called with the io_request_lock held. + */ + spin_lock_irqsave(HOST_LOCK, flags); +#endif /* If firmware needs to be loaded */ if (qla1280_isp_firmware(ha)) { if (!(status = qla1280_chip_diag (ha))) { @@ -2183,6 +2203,9 @@ status = 1; out: +#if LINUX_VERSION_CODE >= 0x020500 + spin_unlock_irqrestore(HOST_LOCK, flags); +#endif if (status) dprintk(2, "qla1280_initialize_adapter: **** FAILED ****\n"); @@ -3208,18 +3231,14 @@ timer.function = qla1280_mailbox_timeout; add_timer(&timer); -#if LINUX_VERSION_CODE < 0x020500 spin_unlock_irq(HOST_LOCK); -#endif WRT_REG_WORD(®->host_cmd, HC_SET_HOST_INT); data = qla1280_debounce_register(®->istatus); wait_for_completion(&wait); del_timer_sync(&timer); -#if LINUX_VERSION_CODE < 0x020500 spin_lock_irq(HOST_LOCK); -#endif ha->mailbox_wait = NULL; @@ -3636,7 +3655,7 @@ (SCSI_TCN_32(cmd) | BIT_7) : SCSI_TCN_32(cmd); /* Enable simple tag queuing if device supports it. */ - if (cmd->device->simple_tags) + if (DEV_SIMPLE_TAGS(cmd->device)) pkt->control_flags |= cpu_to_le16(BIT_3); /* Load SCSI command packet. */ @@ -3936,7 +3955,7 @@ (SCSI_TCN_32(cmd) | BIT_7) : SCSI_TCN_32(cmd); /* Enable simple tag queuing if device supports it. */ - if (cmd->device->simple_tags) + if (DEV_SIMPLE_TAGS(cmd->device)) pkt->control_flags |= cpu_to_le16(BIT_3); /* Load SCSI command packet. */ @@ -4823,6 +4842,7 @@ return ret; } + /************************************************************************ * qla1280_check_for_dead_scsi_bus * * * @@ -4891,7 +4911,7 @@ } else printk(" Async"); - if (device->simple_tags) + if (DEV_SIMPLE_TAGS(device)) printk(", Tagged queuing: depth %d", device->queue_depth); printk("\n"); } @@ -5105,6 +5125,7 @@ return ret; } + static Scsi_Host_Template driver_template = { .proc_info = qla1280_proc_info, .name = "Qlogic ISP 1280/12160", @@ -5131,6 +5152,7 @@ }; #include "scsi_module.c" + /* * Overrides for Emacs so that we almost follow Linus's tabbing style. diff -Nru a/drivers/scsi/qlogicfc.c b/drivers/scsi/qlogicfc.c --- a/drivers/scsi/qlogicfc.c Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/qlogicfc.c Wed Oct 8 12:24:57 2003 @@ -718,8 +718,8 @@ continue; /* Try to configure DMA attributes. */ - if (pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff) && - pci_set_dma_mask(pdev, (u64) 0xffffffff)) + if (pci_set_dma_mask(pdev, 0xffffffffffffffffULL) && + pci_set_dma_mask(pdev, 0xffffffffULL)) continue; host = scsi_register(tmpt, sizeof(struct isp2x00_hostdata)); diff -Nru a/drivers/scsi/sun3_scsi.c b/drivers/scsi/sun3_scsi.c --- a/drivers/scsi/sun3_scsi.c Wed Oct 8 12:24:55 2003 +++ b/drivers/scsi/sun3_scsi.c Wed Oct 8 12:24:55 2003 @@ -308,7 +308,6 @@ return 1; } -#ifdef MODULE int sun3scsi_release (struct Scsi_Host *shpnt) { if (shpnt->irq != SCSI_IRQ_NONE) @@ -318,7 +317,6 @@ return 0; } -#endif #ifdef RESET_BOOT /* diff -Nru a/drivers/scsi/sun3_scsi.h b/drivers/scsi/sun3_scsi.h --- a/drivers/scsi/sun3_scsi.h Wed Oct 8 12:24:55 2003 +++ b/drivers/scsi/sun3_scsi.h Wed Oct 8 12:24:55 2003 @@ -52,11 +52,7 @@ static const char *sun3scsi_info (struct Scsi_Host *); static int sun3scsi_bus_reset(Scsi_Cmnd *); static int sun3scsi_queue_command (Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); -#ifdef MODULE static int sun3scsi_release (struct Scsi_Host *); -#else -#define sun3scsi_release NULL -#endif #ifndef CMD_PER_LUN #define CMD_PER_LUN 2 diff -Nru a/drivers/scsi/sun3_scsi_vme.c b/drivers/scsi/sun3_scsi_vme.c --- a/drivers/scsi/sun3_scsi_vme.c Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/sun3_scsi_vme.c Wed Oct 8 12:24:57 2003 @@ -140,7 +140,7 @@ static int sun3scsi_detect(Scsi_Host_Template * tpnt) { - unsigned long ioaddr, irq; + unsigned long ioaddr, irq = 0; static int called = 0; struct Scsi_Host *instance; int i; @@ -277,17 +277,15 @@ return 1; } -#ifdef MODULE int sun3scsi_release (struct Scsi_Host *shpnt) { if (shpnt->irq != SCSI_IRQ_NONE) free_irq (shpnt->irq, NULL); - iounmap(sun3_scsi_regp); + iounmap((void *)sun3_scsi_regp); return 0; } -#endif #ifdef RESET_BOOT /* diff -Nru a/drivers/scsi/sym53c8xx_2/sym_glue.h b/drivers/scsi/sym53c8xx_2/sym_glue.h --- a/drivers/scsi/sym53c8xx_2/sym_glue.h Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/sym53c8xx_2/sym_glue.h Wed Oct 8 12:24:57 2003 @@ -70,10 +70,6 @@ #include #include "../scsi.h" /* XXX: DID_* */ -#ifndef bcopy -#define bcopy(s, d, n) memcpy((d), (s), (n)) -#endif - #ifndef bzero #define bzero(d, n) memset((d), 0, (n)) #endif diff -Nru a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c Wed Oct 8 12:24:55 2003 +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c Wed Oct 8 12:24:55 2003 @@ -5889,9 +5889,9 @@ /* * Copy scripts to controller instance. */ - bcopy(fw->a_base, np->scripta0, np->scripta_sz); - bcopy(fw->b_base, np->scriptb0, np->scriptb_sz); - bcopy(fw->z_base, np->scriptz0, np->scriptz_sz); + memcpy(np->scripta0, fw->a_base, np->scripta_sz); + memcpy(np->scriptb0, fw->b_base, np->scriptb_sz); + memcpy(np->scriptz0, fw->z_base, np->scriptz_sz); /* * Setup variable parts in scripts and compute diff -Nru a/drivers/scsi/sym53c8xx_2/sym_misc.c b/drivers/scsi/sym53c8xx_2/sym_misc.c --- a/drivers/scsi/sym53c8xx_2/sym_misc.c Wed Oct 8 12:24:57 2003 +++ b/drivers/scsi/sym53c8xx_2/sym_misc.c Wed Oct 8 12:24:57 2003 @@ -225,7 +225,7 @@ */ void sym_update_trans_settings(hcb_p np, tcb_p tp) { - bcopy(&tp->tinfo.user, &tp->tinfo.goal, sizeof(tp->tinfo.goal)); + memcpy(&tp->tinfo.goal, &tp->tinfo.user, sizeof(tp->tinfo.goal)); if (tp->inq_version >= 4) { switch(tp->inq_byte56 & INQ56_CLOCKING) { diff -Nru a/drivers/scsi/sym53c8xx_comm.h b/drivers/scsi/sym53c8xx_comm.h --- a/drivers/scsi/sym53c8xx_comm.h Wed Oct 8 12:24:56 2003 +++ b/drivers/scsi/sym53c8xx_comm.h Wed Oct 8 12:24:56 2003 @@ -88,10 +88,6 @@ #define u_int unsigned int #define u_long unsigned long -#ifndef bcopy -#define bcopy(s, d, n) memcpy((d), (s), (n)) -#endif - #ifndef bcmp #define bcmp(s, d, n) memcmp((d), (s), (n)) #endif diff -Nru a/drivers/serial/8250.c b/drivers/serial/8250.c --- a/drivers/serial/8250.c Wed Oct 8 12:24:55 2003 +++ b/drivers/serial/8250.c Wed Oct 8 12:24:55 2003 @@ -105,11 +105,20 @@ #include +/* + * SERIAL_PORT_DFNS tells us about built-in ports that have no + * standard enumeration mechanism. Platforms that can find all + * serial ports via mechanisms like ACPI or PCI need not supply it. + */ +#ifndef SERIAL_PORT_DFNS +#define SERIAL_PORT_DFNS +#endif + static struct old_serial_port old_serial_port[] = { SERIAL_PORT_DFNS /* defined in asm/serial.h */ }; -#define UART_NR ARRAY_SIZE(old_serial_port) +#define UART_NR (ARRAY_SIZE(old_serial_port) + CONFIG_SERIAL_8250_NR_UARTS) #if defined(CONFIG_SERIAL_8250_RSA) && defined(MODULE) @@ -469,8 +478,14 @@ */ serial_outp(up, UART_LCR, UART_LCR_DLAB); if (serial_in(up, UART_EFR) == 0) { - DEBUG_AUTOCONF("EFRv1 "); - up->port.type = PORT_16650; + serial_outp(up, UART_EFR, 0xA8); + if (serial_in(up, UART_EFR) != 0) { + DEBUG_AUTOCONF("EFRv1 "); + up->port.type = PORT_16650; + } else { + DEBUG_AUTOCONF("Motorola 8xxx DUART "); + } + serial_outp(up, UART_EFR, 0); return; } @@ -490,7 +505,9 @@ * Attempt to switch to bank 2, read the value of the LOOP bit * from EXCR1. Switch back to bank 0, change it in MCR. Then * switch back to bank 2, read it from EXCR1 again and check - * it's changed. If so, set baud_base in EXCR2 to 921600. + * it's changed. If so, set baud_base in EXCR2 to 921600. -- dwmw2 + * On PowerPC we don't want to change baud_base, as we have + * a number of different divisors. -- Tom Rini */ serial_outp(up, UART_LCR, 0); status1 = serial_in(up, UART_MCR); @@ -506,12 +523,14 @@ serial_outp(up, UART_MCR, status1); if ((status2 ^ status1) & UART_MCR_LOOP) { +#ifndef CONFIG_PPC serial_outp(up, UART_LCR, 0xE0); status1 = serial_in(up, 0x04); /* EXCR1 */ status1 &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */ status1 |= 0x10; /* 1.625 divisor for baud_base --> 921600 */ serial_outp(up, 0x04, status1); serial_outp(up, UART_LCR, 0); +#endif up->port.type = PORT_NS16550A; up->port.uartclk = 921600*16; @@ -2101,7 +2120,8 @@ /** * serial8250_suspend_port - suspend one serial port - * @line: serial line number + * @line: serial line number + * @level: the level of port suspension, as per uart_suspend_port * * Suspend one serial port. */ @@ -2112,7 +2132,8 @@ /** * serial8250_resume_port - resume one serial port - * @line: serial line number + * @line: serial line number + * @level: the level of port resumption, as per uart_resume_port * * Resume one serial port. */ @@ -2126,7 +2147,8 @@ int ret, i; printk(KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ " - "IRQ sharing %sabled\n", share_irqs ? "en" : "dis"); + "%d ports, IRQ sharing %sabled\n", (int) UART_NR, + share_irqs ? "en" : "dis"); for (i = 0; i < NR_IRQS; i++) spin_lock_init(&irq_lists[i].lock); diff -Nru a/drivers/serial/8250_acpi.c b/drivers/serial/8250_acpi.c --- a/drivers/serial/8250_acpi.c Wed Oct 8 12:24:57 2003 +++ b/drivers/serial/8250_acpi.c Wed Oct 8 12:24:57 2003 @@ -18,19 +18,33 @@ #include #include -static void acpi_serial_address(struct serial_struct *req, - struct acpi_resource_address32 *addr32) +static acpi_status acpi_serial_mmio(struct serial_struct *req, + struct acpi_resource_address64 *addr) { unsigned long size; - size = addr32->max_address_range - addr32->min_address_range + 1; - req->iomap_base = addr32->min_address_range; + size = addr->max_address_range - addr->min_address_range + 1; + req->iomap_base = addr->min_address_range; req->iomem_base = ioremap(req->iomap_base, size); + if (!req->iomem_base) { + printk(KERN_ERR "%s: couldn't ioremap 0x%lx-0x%lx\n", + __FUNCTION__, req->iomap_base, req->iomap_base + size); + return AE_ERROR; + } req->io_type = SERIAL_IO_MEM; + return AE_OK; +} + +static acpi_status acpi_serial_port(struct serial_struct *req, + struct acpi_resource_io *io) +{ + req->port = io->min_base_address; + req->io_type = SERIAL_IO_PORT; + return AE_OK; } -static void acpi_serial_irq(struct serial_struct *req, - struct acpi_resource_ext_irq *ext_irq) +static acpi_status acpi_serial_ext_irq(struct serial_struct *req, + struct acpi_resource_ext_irq *ext_irq) { if (ext_irq->number_of_interrupts > 0) { #ifdef CONFIG_IA64 @@ -40,45 +54,71 @@ req->irq = ext_irq->interrupts[0]; #endif } + return AE_OK; +} + +static acpi_status acpi_serial_irq(struct serial_struct *req, + struct acpi_resource_irq *irq) +{ + if (irq->number_of_interrupts > 0) { +#ifdef CONFIG_IA64 + req->irq = acpi_register_irq(irq->interrupts[0], + irq->active_high_low, irq->edge_level); +#else + req->irq = irq->interrupts[0]; +#endif + } + return AE_OK; +} + +static acpi_status acpi_serial_resource(struct acpi_resource *res, void *data) +{ + struct serial_struct *serial_req = (struct serial_struct *) data; + struct acpi_resource_address64 addr; + acpi_status status; + + status = acpi_resource_to_address64(res, &addr); + if (ACPI_SUCCESS(status)) + return acpi_serial_mmio(serial_req, &addr); + else if (res->id == ACPI_RSTYPE_IO) + return acpi_serial_port(serial_req, &res->data.io); + else if (res->id == ACPI_RSTYPE_EXT_IRQ) + return acpi_serial_ext_irq(serial_req, &res->data.extended_irq); + else if (res->id == ACPI_RSTYPE_IRQ) + return acpi_serial_irq(serial_req, &res->data.irq); + return AE_OK; } static int acpi_serial_add(struct acpi_device *device) { - acpi_status result; - struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + acpi_status status; struct serial_struct serial_req; - int line, offset = 0; + int line; memset(&serial_req, 0, sizeof(serial_req)); - result = acpi_get_current_resources(device->handle, &buffer); - if (ACPI_FAILURE(result)) { - result = -ENODEV; - goto out; - } - while (offset <= buffer.length) { - struct acpi_resource *res = buffer.pointer + offset; - if (res->length == 0) - break; - offset += res->length; - if (res->id == ACPI_RSTYPE_ADDRESS32) { - acpi_serial_address(&serial_req, &res->data.address32); - } else if (res->id == ACPI_RSTYPE_EXT_IRQ) { - acpi_serial_irq(&serial_req, &res->data.extended_irq); - } + status = acpi_walk_resources(device->handle, METHOD_NAME__CRS, + acpi_serial_resource, &serial_req); + if (ACPI_FAILURE(status)) + return -ENODEV; + + if (!serial_req.iomem_base && !serial_req.port) { + printk(KERN_ERR "%s: no iomem or port address in %s _CRS\n", + __FUNCTION__, device->pnp.bus_id); + return -ENODEV; } serial_req.baud_base = BASE_BAUD; serial_req.flags = ASYNC_SKIP_TEST|ASYNC_BOOT_AUTOCONF|ASYNC_AUTO_IRQ; - result = 0; line = register_serial(&serial_req); - if (line < 0) - result = -ENODEV; + if (line < 0) { + printk(KERN_WARNING "Couldn't register serial port %s: %d", + device->pnp.bus_id, line); + return -ENODEV; + } - out: - acpi_os_free(buffer.pointer); - return result; + return 0; } static int acpi_serial_remove(struct acpi_device *device, int type) diff -Nru a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c --- a/drivers/serial/8250_pci.c Wed Oct 8 12:24:57 2003 +++ b/drivers/serial/8250_pci.c Wed Oct 8 12:24:57 2003 @@ -1552,8 +1552,10 @@ #endif priv->line[i] = register_serial(&serial_req); - if (priv->line[i] < 0) + if (priv->line[i] < 0) { + printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]); break; + } } priv->nr = i; diff -Nru a/drivers/serial/Kconfig b/drivers/serial/Kconfig --- a/drivers/serial/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/serial/Kconfig Wed Oct 8 12:24:57 2003 @@ -93,6 +93,16 @@ purpose port, say Y here. See . +config SERIAL_8250_NR_UARTS + int "Maximum number of non-legacy 8250/16550 serial ports" + depends on SERIAL_8250 + default "4" + ---help--- + Set this to the number of non-legacy serial ports you want + the driver to support. This includes any ports discovered + via ACPI or PCI enumeration and any ports that may be added + at run-time via hot-plug. + config SERIAL_8250_EXTENDED bool "Extended 8250/16550 serial driver options" depends on SERIAL_8250 @@ -107,8 +117,8 @@ the questions about serial driver options. If unsure, say N. config SERIAL_8250_MANY_PORTS - bool "Support more than 4 serial ports" - depends on SERIAL_8250_EXTENDED + bool "Support more than 4 legacy serial ports" + depends on SERIAL_8250_EXTENDED && !IA64 help Say Y here if you have dumb serial boards other than the four standard COM 1/2/3/4 ports. This may happen if you have an AST diff -Nru a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c --- a/drivers/serial/serial_core.c Wed Oct 8 12:24:56 2003 +++ b/drivers/serial/serial_core.c Wed Oct 8 12:24:56 2003 @@ -263,9 +263,9 @@ /** * uart_update_timeout - update per-port FIFO timeout. - * @port: uart_port structure describing the port. + * @port: uart_port structure describing the port * @cflag: termios cflag value - * @quot: uart clock divisor quotient + * @baud: speed of the port * * Set the port FIFO timeout value. The @cflag value should * reflect the actual hardware settings. @@ -1277,7 +1277,6 @@ if (state->close_delay) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(state->close_delay); - set_current_state(TASK_RUNNING); } } else if (!uart_console(port)) { uart_change_pm(state, 3); diff -Nru a/drivers/telephony/ixj.h b/drivers/telephony/ixj.h --- a/drivers/telephony/ixj.h Wed Oct 8 12:24:57 2003 +++ b/drivers/telephony/ixj.h Wed Oct 8 12:24:57 2003 @@ -42,6 +42,7 @@ #define IXJ_VERSION 3031 +#include #include #include diff -Nru a/drivers/telephony/phonedev.c b/drivers/telephony/phonedev.c --- a/drivers/telephony/phonedev.c Wed Oct 8 12:24:57 2003 +++ b/drivers/telephony/phonedev.c Wed Oct 8 12:24:57 2003 @@ -14,7 +14,6 @@ * phone_register_device now works with unit!=PHONE_UNIT_ANY */ -#include #include #include #include diff -Nru a/drivers/usb/core/file.c b/drivers/usb/core/file.c --- a/drivers/usb/core/file.c Wed Oct 8 12:24:57 2003 +++ b/drivers/usb/core/file.c Wed Oct 8 12:24:57 2003 @@ -98,7 +98,7 @@ static ssize_t show_dev(struct class_device *class_dev, char *buf) { - int minor = (int)class_get_devdata(class_dev); + int minor = (int)(long)class_get_devdata(class_dev); return print_dev_t(buf, MKDEV(USB_MAJOR, minor)); } static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL); @@ -182,7 +182,7 @@ else temp = name; snprintf(class_dev->class_id, BUS_ID_SIZE, "%s", temp); - class_set_devdata(class_dev, (void *)intf->minor); + class_set_devdata(class_dev, (void *)(long)intf->minor); class_device_register(class_dev); class_device_create_file(class_dev, &class_device_attr_dev); intf->class_dev = class_dev; diff -Nru a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c --- a/drivers/usb/core/inode.c Wed Oct 8 12:24:55 2003 +++ b/drivers/usb/core/inode.c Wed Oct 8 12:24:55 2003 @@ -38,6 +38,7 @@ #include #include #include +#include #include static struct super_operations usbfs_ops; @@ -62,85 +63,93 @@ static umode_t busmode = S_IXUGO | S_IRUGO; static umode_t listmode = S_IRUGO; +enum { + Opt_devuid, Opt_devgid, Opt_devmode, + Opt_busuid, Opt_busgid, Opt_busmode, + Opt_listuid, Opt_listgid, Opt_listmode, + Opt_err, +}; + +static match_table_t tokens = { + {Opt_devuid, "devuid=%u"}, + {Opt_devgid, "devgid=%u"}, + {Opt_devmode, "devmode=%o"}, + {Opt_busuid, "busuid=%u"}, + {Opt_busgid, "busgid=%u"}, + {Opt_busmode, "busmode=%o"}, + {Opt_listuid, "listuid=%u"}, + {Opt_listgid, "listgid=%u"}, + {Opt_listmode, "listmode=%o"}, + {Opt_err, NULL} +}; + static int parse_options(struct super_block *s, char *data) { - char *curopt = NULL, *value; + char *p; + int option; - while ((curopt = strsep(&data, ",")) != NULL) { - if (!*curopt) + while ((p = strsep(&data, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + if (!*p) continue; - if ((value = strchr(curopt, '=')) != NULL) - *value++ = 0; - if (!strcmp(curopt, "devuid")) { - if (!value || !value[0]) - return -EINVAL; - devuid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "devgid")) { - if (!value || !value[0]) - return -EINVAL; - devgid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "devmode")) { - if (!value || !value[0]) - return -EINVAL; - devmode = simple_strtoul(value, &value, 0) & S_IRWXUGO; - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "busuid")) { - if (!value || !value[0]) - return -EINVAL; - busuid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "busgid")) { - if (!value || !value[0]) - return -EINVAL; - busgid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "busmode")) { - if (!value || !value[0]) - return -EINVAL; - busmode = simple_strtoul(value, &value, 0) & S_IRWXUGO; - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "listuid")) { - if (!value || !value[0]) - return -EINVAL; - listuid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "listgid")) { - if (!value || !value[0]) - return -EINVAL; - listgid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } - if (!strcmp(curopt, "listmode")) { - if (!value || !value[0]) - return -EINVAL; - listmode = simple_strtoul(value, &value, 0) & S_IRWXUGO; - if (*value) - return -EINVAL; + + token = match_token(p, tokens, args); + switch (token) { + case Opt_devuid: + if (match_int(&args[0], &option)) + return -EINVAL; + devuid = option; + break; + case Opt_devgid: + if (match_int(&args[0], &option)) + return -EINVAL; + devgid = option; + break; + case Opt_devmode: + if (match_octal(&args[0], &option)) + return -EINVAL; + devmode = option & S_IRWXUGO; + break; + case Opt_busuid: + if (match_int(&args[0], &option)) + return -EINVAL; + busuid = option; + break; + case Opt_busgid: + if (match_int(&args[0], &option)) + return -EINVAL; + busgid = option; + break; + case Opt_busmode: + if (match_octal(&args[0], &option)) + return -EINVAL; + busmode = option & S_IRWXUGO; + break; + case Opt_listuid: + if (match_int(&args[0], &option)) + return -EINVAL; + listuid = option; + break; + case Opt_listgid: + if (match_int(&args[0], &option)) + return -EINVAL; + listgid = option; + break; + case Opt_listmode: + if (match_octal(&args[0], &option)) + return -EINVAL; + listmode = option & S_IRWXUGO; + break; + default: + err("usbfs: unrecognised mount option \"%s\" " + "or missing value\n", p); + return -EINVAL; } } return 0; } - - -/* --------------------------------------------------------------------- */ static struct inode *usbfs_get_inode (struct super_block *sb, int mode, dev_t dev) { diff -Nru a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c --- a/drivers/usb/host/uhci-debug.c Wed Oct 8 12:24:55 2003 +++ b/drivers/usb/host/uhci-debug.c Wed Oct 8 12:24:55 2003 @@ -99,82 +99,6 @@ return out - buf; } -static int uhci_show_sc(int port, unsigned short status, char *buf, int len) -{ - char *out = buf; - - /* Try to make sure there's enough memory */ - if (len < 80) - return 0; - - out += sprintf(out, " stat%d = %04x %s%s%s%s%s%s%s%s\n", - port, - status, - (status & USBPORTSC_SUSP) ? "PortSuspend " : "", - (status & USBPORTSC_PR) ? "PortReset " : "", - (status & USBPORTSC_LSDA) ? "LowSpeed " : "", - (status & USBPORTSC_RD) ? "ResumeDetect " : "", - (status & USBPORTSC_PEC) ? "EnableChange " : "", - (status & USBPORTSC_PE) ? "PortEnabled " : "", - (status & USBPORTSC_CSC) ? "ConnectChange " : "", - (status & USBPORTSC_CCS) ? "PortConnected " : ""); - - return out - buf; -} - -static int uhci_show_status(struct uhci_hcd *uhci, char *buf, int len) -{ - char *out = buf; - unsigned int io_addr = uhci->io_addr; - unsigned short usbcmd, usbstat, usbint, usbfrnum; - unsigned int flbaseadd; - unsigned char sof; - unsigned short portsc1, portsc2; - - /* Try to make sure there's enough memory */ - if (len < 80 * 6) - return 0; - - usbcmd = inw(io_addr + 0); - usbstat = inw(io_addr + 2); - usbint = inw(io_addr + 4); - usbfrnum = inw(io_addr + 6); - flbaseadd = inl(io_addr + 8); - sof = inb(io_addr + 12); - portsc1 = inw(io_addr + 16); - portsc2 = inw(io_addr + 18); - - out += sprintf(out, " usbcmd = %04x %s%s%s%s%s%s%s%s\n", - usbcmd, - (usbcmd & USBCMD_MAXP) ? "Maxp64 " : "Maxp32 ", - (usbcmd & USBCMD_CF) ? "CF " : "", - (usbcmd & USBCMD_SWDBG) ? "SWDBG " : "", - (usbcmd & USBCMD_FGR) ? "FGR " : "", - (usbcmd & USBCMD_EGSM) ? "EGSM " : "", - (usbcmd & USBCMD_GRESET) ? "GRESET " : "", - (usbcmd & USBCMD_HCRESET) ? "HCRESET " : "", - (usbcmd & USBCMD_RS) ? "RS " : ""); - - out += sprintf(out, " usbstat = %04x %s%s%s%s%s%s\n", - usbstat, - (usbstat & USBSTS_HCH) ? "HCHalted " : "", - (usbstat & USBSTS_HCPE) ? "HostControllerProcessError " : "", - (usbstat & USBSTS_HSE) ? "HostSystemError " : "", - (usbstat & USBSTS_RD) ? "ResumeDetect " : "", - (usbstat & USBSTS_ERROR) ? "USBError " : "", - (usbstat & USBSTS_USBINT) ? "USBINT " : ""); - - out += sprintf(out, " usbint = %04x\n", usbint); - out += sprintf(out, " usbfrnum = (%d)%03x\n", (usbfrnum >> 10) & 1, - 0xfff & (4*(unsigned int)usbfrnum)); - out += sprintf(out, " flbaseadd = %08x\n", flbaseadd); - out += sprintf(out, " sof = %02x\n", sof); - out += uhci_show_sc(1, portsc1, out, len - (out - buf)); - out += uhci_show_sc(2, portsc2, out, len - (out - buf)); - - return out - buf; -} - static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) { char *out = buf; @@ -274,6 +198,13 @@ return out - buf; } +#define show_frame_num() \ + if (!shown) { \ + shown = 1; \ + out += sprintf(out, "- Frame %d\n", i); \ + } + +#ifdef CONFIG_PROC_FS static const char *qh_names[] = { "skel_int128_qh", "skel_int64_qh", "skel_int32_qh", "skel_int16_qh", @@ -283,18 +214,88 @@ "skel_bulk_qh", "skel_term_qh" }; -#define show_frame_num() \ - if (!shown) { \ - shown = 1; \ - out += sprintf(out, "- Frame %d\n", i); \ - } - #define show_qh_name() \ if (!shown) { \ shown = 1; \ out += sprintf(out, "- %s\n", qh_names[i]); \ } +static int uhci_show_sc(int port, unsigned short status, char *buf, int len) +{ + char *out = buf; + + /* Try to make sure there's enough memory */ + if (len < 80) + return 0; + + out += sprintf(out, " stat%d = %04x %s%s%s%s%s%s%s%s\n", + port, + status, + (status & USBPORTSC_SUSP) ? "PortSuspend " : "", + (status & USBPORTSC_PR) ? "PortReset " : "", + (status & USBPORTSC_LSDA) ? "LowSpeed " : "", + (status & USBPORTSC_RD) ? "ResumeDetect " : "", + (status & USBPORTSC_PEC) ? "EnableChange " : "", + (status & USBPORTSC_PE) ? "PortEnabled " : "", + (status & USBPORTSC_CSC) ? "ConnectChange " : "", + (status & USBPORTSC_CCS) ? "PortConnected " : ""); + + return out - buf; +} + +static int uhci_show_status(struct uhci_hcd *uhci, char *buf, int len) +{ + char *out = buf; + unsigned int io_addr = uhci->io_addr; + unsigned short usbcmd, usbstat, usbint, usbfrnum; + unsigned int flbaseadd; + unsigned char sof; + unsigned short portsc1, portsc2; + + /* Try to make sure there's enough memory */ + if (len < 80 * 6) + return 0; + + usbcmd = inw(io_addr + 0); + usbstat = inw(io_addr + 2); + usbint = inw(io_addr + 4); + usbfrnum = inw(io_addr + 6); + flbaseadd = inl(io_addr + 8); + sof = inb(io_addr + 12); + portsc1 = inw(io_addr + 16); + portsc2 = inw(io_addr + 18); + + out += sprintf(out, " usbcmd = %04x %s%s%s%s%s%s%s%s\n", + usbcmd, + (usbcmd & USBCMD_MAXP) ? "Maxp64 " : "Maxp32 ", + (usbcmd & USBCMD_CF) ? "CF " : "", + (usbcmd & USBCMD_SWDBG) ? "SWDBG " : "", + (usbcmd & USBCMD_FGR) ? "FGR " : "", + (usbcmd & USBCMD_EGSM) ? "EGSM " : "", + (usbcmd & USBCMD_GRESET) ? "GRESET " : "", + (usbcmd & USBCMD_HCRESET) ? "HCRESET " : "", + (usbcmd & USBCMD_RS) ? "RS " : ""); + + out += sprintf(out, " usbstat = %04x %s%s%s%s%s%s\n", + usbstat, + (usbstat & USBSTS_HCH) ? "HCHalted " : "", + (usbstat & USBSTS_HCPE) ? "HostControllerProcessError " : "", + (usbstat & USBSTS_HSE) ? "HostSystemError " : "", + (usbstat & USBSTS_RD) ? "ResumeDetect " : "", + (usbstat & USBSTS_ERROR) ? "USBError " : "", + (usbstat & USBSTS_USBINT) ? "USBINT " : ""); + + out += sprintf(out, " usbint = %04x\n", usbint); + out += sprintf(out, " usbfrnum = (%d)%03x\n", (usbfrnum >> 10) & 1, + 0xfff & (4*(unsigned int)usbfrnum)); + out += sprintf(out, " flbaseadd = %08x\n", flbaseadd); + out += sprintf(out, " sof = %02x\n", sof); + out += uhci_show_sc(1, portsc1, out, len - (out - buf)); + out += uhci_show_sc(2, portsc2, out, len - (out - buf)); + + return out - buf; +} + static int uhci_show_urbp(struct uhci_hcd *uhci, struct urb_priv *urbp, char *buf, int len) { struct list_head *tmp; @@ -512,7 +513,6 @@ return out - buf; } -#ifdef CONFIG_PROC_FS #define MAX_OUTPUT (64 * 1024) static struct proc_dir_entry *uhci_proc_root = NULL; diff -Nru a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c --- a/drivers/usb/host/uhci-hcd.c Wed Oct 8 12:24:57 2003 +++ b/drivers/usb/host/uhci-hcd.c Wed Oct 8 12:24:57 2003 @@ -2185,8 +2185,8 @@ /* Maybe kick BIOS off this hardware. Then reset, so we won't get * interrupts from any previous setup. */ - pci_write_config_word(hcd->pdev, USBLEGSUP, USBLEGSUP_DEFAULT); reset_hc(uhci); + pci_write_config_word(hcd->pdev, USBLEGSUP, USBLEGSUP_DEFAULT); return 0; } diff -Nru a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig --- a/drivers/usb/input/Kconfig Wed Oct 8 12:24:57 2003 +++ b/drivers/usb/input/Kconfig Wed Oct 8 12:24:57 2003 @@ -186,8 +186,5 @@ For information about how to connect the X-Box pad to USB, see Documentation/input/xpad.txt. - This driver is also available as a module ( = code which can be - inserted in and removed from the running kernel whenever you want). - The module will be called xpad. If you want to compile it as a - module, say M here and read . - + To compile this driver as a module, choose M here: the + module will be called xpad. diff -Nru a/drivers/usb/misc/brlvger.c b/drivers/usb/misc/brlvger.c --- a/drivers/usb/misc/brlvger.c Wed Oct 8 12:24:56 2003 +++ b/drivers/usb/misc/brlvger.c Wed Oct 8 12:24:56 2003 @@ -591,14 +591,14 @@ int firstpart = 6 - off; #ifdef WRITE_DEBUG - dbg3("off: %d, rs: %d, count: %d, firstpart: %d", + dbg3("off: %lld, rs: %d, count: %d, firstpart: %d", off, rs, count, firstpart); #endif firstpart = (firstpart < count) ? firstpart : count; #ifdef WRITE_DEBUG - dbg3("off: %d", off); + dbg3("off: %lld", off); dbg3("firstpart: %d", firstpart); #endif @@ -618,7 +618,7 @@ off +=2; #ifdef WRITE_DEBUG - dbg3("off: %d, rs: %d, count: %d, firstpart: %d, " + dbg3("off: %lld, rs: %d, count: %d, firstpart: %d, " "written: %d", off, rs, count, firstpart, written); #endif } diff -Nru a/drivers/usb/misc/speedtch.c b/drivers/usb/misc/speedtch.c --- a/drivers/usb/misc/speedtch.c Wed Oct 8 12:24:57 2003 +++ b/drivers/usb/misc/speedtch.c Wed Oct 8 12:24:57 2003 @@ -189,8 +189,7 @@ struct atm_vcc *vcc; /* raw cell reassembly */ - struct sk_buff *skb; - unsigned int max_pdu; + struct sk_buff *sarb; }; /* send */ @@ -264,7 +263,7 @@ /* ATM */ static void udsl_atm_dev_close (struct atm_dev *dev); -static int udsl_atm_open (struct atm_vcc *vcc, short vpi, int vci); +static int udsl_atm_open (struct atm_vcc *vcc); static void udsl_atm_close (struct atm_vcc *vcc); static int udsl_atm_ioctl (struct atm_dev *dev, unsigned int cmd, void *arg); static int udsl_atm_send (struct atm_vcc *vcc, struct sk_buff *skb); @@ -314,12 +313,10 @@ { struct udsl_vcc_data *cached_vcc = NULL; struct atm_vcc *vcc; - struct sk_buff *skb; + struct sk_buff *sarb; struct udsl_vcc_data *vcc_data; int cached_vci = 0; unsigned int i; - unsigned int length; - unsigned int pdu_length; int pti; int vci; short cached_vpi = 0; @@ -344,74 +341,73 @@ } vcc = vcc_data->vcc; + sarb = vcc_data->sarb; - if (!vcc_data->skb && !(vcc_data->skb = dev_alloc_skb (vcc_data->max_pdu))) { - dbg ("udsl_extract_cells: no memory for skb (vcc: 0x%p)!", vcc); - if (pti) - atomic_inc (&vcc->stats->rx_err); - continue; - } - - skb = vcc_data->skb; - - if (skb->len + ATM_CELL_PAYLOAD > vcc_data->max_pdu) { - dbg ("udsl_extract_cells: buffer overrun (max_pdu: %u, skb->len %u, vcc: 0x%p)", vcc_data->max_pdu, skb->len, vcc); + if (sarb->tail + ATM_CELL_PAYLOAD > sarb->end) { + dbg ("udsl_extract_cells: buffer overrun (sarb->len %u, vcc: 0x%p)!", sarb->len, vcc); /* discard cells already received */ - skb_trim (skb, 0); - DEBUG_ON (vcc_data->max_pdu < ATM_CELL_PAYLOAD); + skb_trim (sarb, 0); } - memcpy (skb->tail, source + ATM_CELL_HEADER, ATM_CELL_PAYLOAD); - __skb_put (skb, ATM_CELL_PAYLOAD); + memcpy (sarb->tail, source + ATM_CELL_HEADER, ATM_CELL_PAYLOAD); + __skb_put (sarb, ATM_CELL_PAYLOAD); if (pti) { + struct sk_buff *skb; + unsigned int length; + unsigned int pdu_length; + length = (source [ATM_CELL_SIZE - 6] << 8) + source [ATM_CELL_SIZE - 5]; /* guard against overflow */ if (length > ATM_MAX_AAL5_PDU) { - dbg ("udsl_extract_cells: bogus length %u (vcc: 0x%p)", length, vcc); - goto drop; + dbg ("udsl_extract_cells: bogus length %u (vcc: 0x%p)!", length, vcc); + atomic_inc (&vcc->stats->rx_err); + goto out; } pdu_length = UDSL_NUM_CELLS (length) * ATM_CELL_PAYLOAD; - if (skb->len < pdu_length) { - dbg ("udsl_extract_cells: bogus pdu_length %u (skb->len: %u, vcc: 0x%p)", pdu_length, skb->len, vcc); - goto drop; + if (sarb->len < pdu_length) { + dbg ("udsl_extract_cells: bogus pdu_length %u (sarb->len: %u, vcc: 0x%p)!", pdu_length, sarb->len, vcc); + atomic_inc (&vcc->stats->rx_err); + goto out; } - if (crc32_be (~0, skb->tail - pdu_length, pdu_length) != 0xc704dd7b) { - dbg ("udsl_extract_cells: packet failed crc check (vcc: 0x%p)", vcc); - goto drop; + if (crc32_be (~0, sarb->tail - pdu_length, pdu_length) != 0xc704dd7b) { + dbg ("udsl_extract_cells: packet failed crc check (vcc: 0x%p)!", vcc); + atomic_inc (&vcc->stats->rx_err); + goto out; } - if (!atm_charge (vcc, skb->truesize)) { - dbg ("udsl_extract_cells: failed atm_charge (skb->truesize: %u)", skb->truesize); - goto drop_no_stats; /* atm_charge increments rx_drop */ - } + vdbg ("udsl_extract_cells: got packet (length: %u, pdu_length: %u, vcc: 0x%p)", length, pdu_length, vcc); - /* now that we are sure to send the skb, it is ok to change skb->data */ - if (skb->len > pdu_length) - skb_pull (skb, skb->len - pdu_length); /* discard initial junk */ + if (!(skb = dev_alloc_skb (length))) { + dbg ("udsl_extract_cells: no memory for skb (length: %u)!", length); + atomic_inc (&vcc->stats->rx_drop); + goto out; + } - skb_trim (skb, length); /* drop zero padding and trailer */ + vdbg ("udsl_extract_cells: allocated new sk_buff (skb: 0x%p, skb->truesize: %u)", skb, skb->truesize); - atomic_inc (&vcc->stats->rx); + if (!atm_charge (vcc, skb->truesize)) { + dbg ("udsl_extract_cells: failed atm_charge (skb->truesize: %u)!", skb->truesize); + dev_kfree_skb (skb); + goto out; /* atm_charge increments rx_drop */ + } - PACKETDEBUG (skb->data, skb->len); + memcpy (skb->data, sarb->tail - pdu_length, length); + __skb_put (skb, length); vdbg ("udsl_extract_cells: sending skb 0x%p, skb->len %u, skb->truesize %u", skb, skb->len, skb->truesize); - vcc->push (vcc, skb); - - vcc_data->skb = NULL; + PACKETDEBUG (skb->data, skb->len); - continue; + vcc->push (vcc, skb); -drop: - atomic_inc (&vcc->stats->rx_err); -drop_no_stats: - skb_trim (skb, 0); + atomic_inc (&vcc->stats->rx); +out: + skb_trim (sarb, 0); } } } @@ -867,10 +863,13 @@ return 0; } -static int udsl_atm_open (struct atm_vcc *vcc, short vpi, int vci) +static int udsl_atm_open (struct atm_vcc *vcc) { struct udsl_instance_data *instance = vcc->dev->dev_data; struct udsl_vcc_data *new; + unsigned int max_pdu; + int vci = vcc->vci; + short vpi = vcc->vpi; dbg ("udsl_atm_open: vpi %hd, vci %d", vpi, vci); @@ -879,12 +878,11 @@ return -ENODEV; } - if ((vpi == ATM_VPI_ANY) || (vci == ATM_VCI_ANY)) - return -EINVAL; - /* only support AAL5 */ - if ((vcc->qos.aal != ATM_AAL5) || (vcc->qos.rxtp.max_sdu < 0) || (vcc->qos.rxtp.max_sdu > ATM_MAX_AAL5_PDU)) + if ((vcc->qos.aal != ATM_AAL5) || (vcc->qos.rxtp.max_sdu < 0) || (vcc->qos.rxtp.max_sdu > ATM_MAX_AAL5_PDU)) { + dbg ("udsl_atm_open: unsupported ATM type %d!", vcc->qos.aal); return -EINVAL; + } if (!instance->firmware_loaded) { dbg ("udsl_atm_open: firmware not loaded!"); @@ -894,11 +892,13 @@ down (&instance->serialize); /* vs self, udsl_atm_close */ if (udsl_find_vcc (instance, vpi, vci)) { + dbg ("udsl_atm_open: %hd/%d already in use!", vpi, vci); up (&instance->serialize); return -EADDRINUSE; } if (!(new = kmalloc (sizeof (struct udsl_vcc_data), GFP_KERNEL))) { + dbg ("udsl_atm_open: no memory for vcc_data!"); up (&instance->serialize); return -ENOMEM; } @@ -907,11 +907,17 @@ new->vcc = vcc; new->vpi = vpi; new->vci = vci; - new->max_pdu = max (1, UDSL_NUM_CELLS (vcc->qos.rxtp.max_sdu)) * ATM_CELL_PAYLOAD; + + /* udsl_extract_cells requires at least one cell */ + max_pdu = max (1, UDSL_NUM_CELLS (vcc->qos.rxtp.max_sdu)) * ATM_CELL_PAYLOAD; + if (!(new->sarb = alloc_skb (max_pdu, GFP_KERNEL))) { + dbg ("udsl_atm_open: no memory for SAR buffer!"); + kfree (new); + up (&instance->serialize); + return -ENOMEM; + } vcc->dev_data = new; - vcc->vpi = vpi; - vcc->vci = vci; tasklet_disable (&instance->receive_tasklet); list_add (&new->list, &instance->vcc_list); @@ -925,7 +931,7 @@ tasklet_schedule (&instance->receive_tasklet); - dbg ("udsl_atm_open: allocated vcc data 0x%p (max_pdu: %u)", new, new->max_pdu); + dbg ("udsl_atm_open: allocated vcc data 0x%p (max_pdu: %u)", new, max_pdu); return 0; } @@ -952,9 +958,8 @@ list_del (&vcc_data->list); tasklet_enable (&instance->receive_tasklet); - if (vcc_data->skb) - dev_kfree_skb (vcc_data->skb); - vcc_data->skb = NULL; + kfree_skb (vcc_data->sarb); + vcc_data->sarb = NULL; kfree (vcc_data); vcc->dev_data = NULL; @@ -1216,7 +1221,7 @@ for (i = 0; i < num_rcv_urbs; i++) if ((result = usb_unlink_urb (instance->receivers [i].urb)) < 0) - dbg ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d returned %d", i, result); + dbg ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d returned %d!", i, result); /* wait for completion handlers to finish */ do { @@ -1252,7 +1257,7 @@ for (i = 0; i < num_snd_urbs; i++) if ((result = usb_unlink_urb (instance->senders [i].urb)) < 0) - dbg ("udsl_usb_disconnect: usb_unlink_urb on send urb %d returned %d", i, result); + dbg ("udsl_usb_disconnect: usb_unlink_urb on send urb %d returned %d!", i, result); /* wait for completion handlers to finish */ do { @@ -1298,11 +1303,9 @@ static int __init udsl_usb_init (void) { - struct sk_buff *skb; /* dummy for sizeof */ - dbg ("udsl_usb_init: driver version " DRIVER_VERSION); - if (sizeof (struct udsl_control) > sizeof (skb->cb)) { + if (sizeof (struct udsl_control) > sizeof (((struct sk_buff *)0)->cb)) { printk (KERN_ERR __FILE__ ": unusable with this kernel!\n"); return -EIO; } diff -Nru a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c --- a/drivers/usb/serial/keyspan.c Wed Oct 8 12:24:55 2003 +++ b/drivers/usb/serial/keyspan.c Wed Oct 8 12:24:55 2003 @@ -28,6 +28,9 @@ Change History + 2003sep04 LPM (Keyspan) add support for new single port product USA19HS. + Improve setup message handling for all devices. + Wed Feb 19 22:00:00 PST 2003 (Jeffrey S. Laing ) Merged the current (1/31/03) Keyspan code with the current (2.4.21-pre4) Linux source tree. The Linux tree lacked support for the 49WLC and @@ -172,6 +175,7 @@ int baud; int old_baud; unsigned int cflag; + unsigned int old_cflag; enum {flow_none, flow_cts, flow_xon} flow_control; int rts_state; /* Handshaking pins (outputs) */ int dtr_state; @@ -187,11 +191,12 @@ /* Include Keyspan message headers. All current Keyspan Adapters - make use of one of three message formats which are referred - to as USA-26, USA-28 and USA-49 by Keyspan and within this driver. */ + make use of one of four message formats which are referred + to as USA-26, USA-28 and USA-49, USA-90 by Keyspan and within this driver. */ #include "keyspan_usa26msg.h" #include "keyspan_usa28msg.h" #include "keyspan_usa49msg.h" +#include "keyspan_usa90msg.h" /* Functions used by new usb-serial code. */ @@ -346,8 +351,8 @@ return -ENOIOCTLCMD; } - /* Write function is generic for the three protocols used - with only a minor change for usa49 required */ + /* Write function is similar for the four protocols used + with only a minor change for usa90 (usa19hs) required */ static int keyspan_write(struct usb_serial_port *port, int from_user, const unsigned char *buf, int count) { @@ -356,18 +361,26 @@ int flip; int left, todo; struct urb *this_urb; - int err; + int err, maxDataLen, dataOffset; p_priv = usb_get_serial_port_data(port); d_details = p_priv->device_details; + if (d_details->msg_format == msg_usa90) { + maxDataLen = 64; + dataOffset = 0; + } else { + maxDataLen = 63; + dataOffset = 1; + } + dbg("%s - for port %d (%d chars), flip=%d", __FUNCTION__, port->number, count, p_priv->out_flip); for (left = count; left > 0; left -= todo) { todo = left; - if (todo > 63) - todo = 63; + if (todo > maxDataLen) + todo = maxDataLen; flip = p_priv->out_flip; @@ -390,20 +403,20 @@ break; } - /* First byte in buffer is "last flag" - unused so + /* First byte in buffer is "last flag" (except for usa19hx) - unused so for now so set to zero */ ((char *)this_urb->transfer_buffer)[0] = 0; if (from_user) { - if (copy_from_user(this_urb->transfer_buffer + 1, buf, todo)) + if (copy_from_user(this_urb->transfer_buffer + dataOffset, buf, todo)) return -EFAULT; } else { - memcpy (this_urb->transfer_buffer + 1, buf, todo); + memcpy (this_urb->transfer_buffer + dataOffset, buf, todo); } buf += todo; /* send the data out the bulk port */ - this_urb->transfer_buffer_length = todo + 1; + this_urb->transfer_buffer_length = todo + dataOffset; this_urb->transfer_flags &= ~URB_ASYNC_UNLINK; this_urb->dev = port->serial->dev; @@ -443,9 +456,12 @@ if (urb->actual_length) { /* 0x80 bit is error flag */ if ((data[0] & 0x80) == 0) { - /* no error on any byte */ + /* no errors on individual bytes, only possible overrun err*/ + if (data[0] & RXERROR_OVERRUN) + err = TTY_OVERRUN; + else err = 0; for (i = 1; i < urb->actual_length ; ++i) { - tty_insert_flip_char(tty, data[i], 0); + tty_insert_flip_char(tty, data[i], err); } } else { /* some bytes had errors, every byte has status */ @@ -474,7 +490,7 @@ return; } - /* Outdat handling is common for usa26, usa28 and usa49 messages */ + /* Outdat handling is common for all devices */ static void usa2x_outdat_callback(struct urb *urb, struct pt_regs *regs) { struct usb_serial_port *port; @@ -577,7 +593,7 @@ } -static void usa28_indat_callback(struct urb *urb, struct pt_regs *regs) +static void usa28_indat_callback(struct urb *urb, struct pt_regs *regs) { int i, err; struct usb_serial_port *port; @@ -861,29 +877,172 @@ dbg ("%s", __FUNCTION__); } +static void usa90_indat_callback(struct urb *urb, struct pt_regs *regs) +{ + int i, err; + int endpoint; + struct usb_serial_port *port; + struct keyspan_port_private *p_priv; + struct tty_struct *tty; + unsigned char *data = urb->transfer_buffer; + + dbg ("%s", __FUNCTION__); + + endpoint = usb_pipeendpoint(urb->pipe); + + if (urb->status) { + dbg("%s - nonzero status: %x on endpoint %d.", + __FUNCTION__, urb->status, endpoint); + return; + } + + port = (struct usb_serial_port *) urb->context; + p_priv = usb_get_serial_port_data(port); + + tty = port->tty; + if (urb->actual_length) { + + /* if current mode is DMA, looks like usa28 format + otherwise looks like usa26 data format */ + + if (p_priv->baud > 57600) { + for (i = 0; i < urb->actual_length ; ++i) + tty_insert_flip_char(tty, data[i], 0); + } + else { + + /* 0x80 bit is error flag */ + if ((data[0] & 0x80) == 0) { + /* no errors on individual bytes, only possible overrun err*/ + if (data[0] & RXERROR_OVERRUN) + err = TTY_OVERRUN; + else err = 0; + for (i = 1; i < urb->actual_length ; ++i) + tty_insert_flip_char(tty, data[i], err); + + } + else { + /* some bytes had errors, every byte has status */ + dbg("%s - RX error!!!!", __FUNCTION__); + for (i = 0; i + 1 < urb->actual_length; i += 2) { + int stat = data[i], flag = 0; + if (stat & RXERROR_OVERRUN) + flag |= TTY_OVERRUN; + if (stat & RXERROR_FRAMING) + flag |= TTY_FRAME; + if (stat & RXERROR_PARITY) + flag |= TTY_PARITY; + /* XXX should handle break (0x10) */ + tty_insert_flip_char(tty, data[i+1], flag); + } + } + } + tty_flip_buffer_push(tty); + } + + /* Resubmit urb so we continue receiving */ + urb->dev = port->serial->dev; + if (port->open_count) + if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { + dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err); + } + return; +} + + +static void usa90_instat_callback(struct urb *urb, struct pt_regs *regs) +{ + unsigned char *data = urb->transfer_buffer; + struct keyspan_usa90_portStatusMessage *msg; + struct usb_serial *serial; + struct usb_serial_port *port; + struct keyspan_port_private *p_priv; + int old_dcd_state, err; + + serial = (struct usb_serial *) urb->context; + + if (urb->status) { + dbg("%s - nonzero status: %x", __FUNCTION__, urb->status); + return; + } + if (urb->actual_length < 14) { + dbg("%s - %d byte report??", __FUNCTION__, urb->actual_length); + goto exit; + } + + msg = (struct keyspan_usa90_portStatusMessage *)data; + + /* Now do something useful with the data */ + + port = serial->port[0]; + p_priv = usb_get_serial_port_data(port); + + /* Update handshaking pin state information */ + old_dcd_state = p_priv->dcd_state; + p_priv->cts_state = ((msg->cts) ? 1 : 0); + p_priv->dsr_state = ((msg->dsr) ? 1 : 0); + p_priv->dcd_state = ((msg->dcd) ? 1 : 0); + p_priv->ri_state = ((msg->ri) ? 1 : 0); + + if (port->tty && !C_CLOCAL(port->tty) + && old_dcd_state != p_priv->dcd_state) { + if (old_dcd_state) + tty_hangup(port->tty); + /* else */ + /* wake_up_interruptible(&p_priv->open_wait); */ + } + + /* Resubmit urb so we continue receiving */ + urb->dev = serial->dev; + if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) { + dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err); + } +exit: + ; +} + +static void usa90_outcont_callback(struct urb *urb, struct pt_regs *regs) +{ + struct usb_serial_port *port; + struct keyspan_port_private *p_priv; + + port = (struct usb_serial_port *) urb->context; + p_priv = usb_get_serial_port_data(port); + + if (p_priv->resend_cont) { + dbg ("%s - sending setup", __FUNCTION__); + keyspan_usa90_send_setup(port->serial, port, p_priv->resend_cont - 1); + } +} static int keyspan_write_room (struct usb_serial_port *port) { struct keyspan_port_private *p_priv; const struct keyspan_device_details *d_details; int flip; + int data_len; struct urb *this_urb; dbg("%s", __FUNCTION__); p_priv = usb_get_serial_port_data(port); d_details = p_priv->device_details; + if (d_details->msg_format == msg_usa90) + data_len = 64; + else + data_len = 63; + flip = p_priv->out_flip; /* Check both endpoints to see if any are available. */ if ((this_urb = p_priv->out_urbs[flip]) != 0) { if (this_urb->status != -EINPROGRESS) - return (63); + return (data_len); flip = (flip + 1) & d_details->outdat_endp_flip; if ((this_urb = p_priv->out_urbs[flip]) != 0) if (this_urb->status != -EINPROGRESS) - return (63); + return (data_len); } return (0); } @@ -902,17 +1061,24 @@ struct usb_serial *serial = port->serial; const struct keyspan_device_details *d_details; int i, err; + int baud_rate, device_port; struct urb *urb; + unsigned int cflag; s_priv = usb_get_serial_data(serial); p_priv = usb_get_serial_port_data(port); - d_details = s_priv->device_details; + d_details = p_priv->device_details; dbg("%s - port%d.", __FUNCTION__, port->number); /* Set some sane defaults */ p_priv->rts_state = 1; p_priv->dtr_state = 1; + p_priv->baud = 9600; + + /* force baud and lcr to be set on open */ + p_priv->old_baud = 0; + p_priv->old_cflag = 0; p_priv->out_flip = 0; p_priv->in_flip = 0; @@ -922,7 +1088,10 @@ if ((urb = p_priv->in_urbs[i]) == NULL) continue; urb->dev = serial->dev; - usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); + + /* make sure endpoint data toggle is synchronized with the device */ + + usb_clear_halt(urb->dev, urb->pipe); if ((err = usb_submit_urb(urb, GFP_KERNEL)) != 0) { dbg("%s - submit urb %d failed (%d)", __FUNCTION__, i, err); @@ -937,12 +1106,29 @@ /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */ } - // if the device is a USA49x, determine whether it is an W or WLC model - // and set the baud clock accordingly + /* get the terminal config for the setup message now so we don't + * need to send 2 of them */ + + cflag = port->tty->termios->c_cflag; + device_port = port->number - port->serial->minor; + + /* Baud rate calculation takes baud rate as an integer + so other rates can be generated if desired. */ + baud_rate = tty_get_baud_rate(port->tty); + /* If no match or invalid, leave as default */ + if (baud_rate >= 0 + && d_details->calculate_baud_rate(baud_rate, d_details->baudclk, + NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) { + p_priv->baud = baud_rate; + } + + /* set CTS/RTS handshake etc. */ + p_priv->cflag = cflag; + p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none; keyspan_send_setup(port, 1); //mdelay(100); - keyspan_set_termios(port, NULL); + //keyspan_set_termios(port, NULL); return (0); } @@ -977,7 +1163,7 @@ keyspan_send_setup(port, 2); /* pilot-xfer seems to work best with this delay */ mdelay(100); - keyspan_set_termios(port, NULL); + // keyspan_set_termios(port, NULL); } /*while (p_priv->outcont_urb->status == -EINPROGRESS) { @@ -1172,6 +1358,14 @@ .outdat_callback = usa2x_outdat_callback, .inack_callback = usa49_inack_callback, .outcont_callback = usa49_outcont_callback, + }, { + /* msg_usa90 callbacks */ + .instat_callback = usa90_instat_callback, + .glocont_callback = usa28_glocont_callback, + .indat_callback = usa90_indat_callback, + .outdat_callback = usa2x_outdat_callback, + .inack_callback = usa28_inack_callback, + .outcont_callback = usa90_outcont_callback, } }; @@ -1295,6 +1489,41 @@ return (KEYSPAN_BAUD_RATE_OK); } +/* usa19hs function doesn't require prescaler */ +static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, + u8 *rate_low, u8 *prescaler, int portnum) +{ + u32 b16, /* baud rate times 16 (actual rate used internally) */ + div; /* divisor */ + + dbg ("%s - %d.", __FUNCTION__, baud_rate); + + /* prevent divide by zero... */ + if( (b16 = (baud_rate * 16L)) == 0) + return (KEYSPAN_INVALID_BAUD_RATE); + + + + /* calculate the divisor */ + if( (div = (baudclk / b16)) == 0) + return (KEYSPAN_INVALID_BAUD_RATE); + + if(div > 0xffff) + return (KEYSPAN_INVALID_BAUD_RATE); + + /* return the counter values if non-null */ + if (rate_low) + *rate_low = (u8) (div & 0xff); + + if (rate_hi) + *rate_hi = (u8) ((div >> 8) & 0xff); + + if (rate_low && rate_hi) + dbg ("%s - %d %02x %02x.", __FUNCTION__, baud_rate, *rate_hi, *rate_low); + + return (KEYSPAN_BAUD_RATE_OK); +} + static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, u8 *rate_low, u8 *prescaler, int portnum) { @@ -1447,6 +1676,7 @@ p_priv->resend_cont = reset_port + 1; if (this_urb->status == -EINPROGRESS) { /* dbg ("%s - already writing", __FUNCTION__); */ + mdelay(5); return(-1); } @@ -1597,6 +1827,7 @@ p_priv->resend_cont = reset_port + 1; if (this_urb->status == -EINPROGRESS) { dbg ("%s already writing", __FUNCTION__); + mdelay(5); return(-1); } @@ -1729,6 +1960,7 @@ p_priv->resend_cont = reset_port + 1; if (this_urb->status == -EINPROGRESS) { /* dbg ("%s - already writing", __FUNCTION__); */ + mdelay(5); return(-1); } @@ -1857,6 +2089,144 @@ return (0); } +static int keyspan_usa90_send_setup(struct usb_serial *serial, + struct usb_serial_port *port, + int reset_port) +{ + struct keyspan_usa90_portControlMessage msg; + struct keyspan_serial_private *s_priv; + struct keyspan_port_private *p_priv; + const struct keyspan_device_details *d_details; + struct urb *this_urb; + int err; + u8 prescaler; + + dbg ("%s", __FUNCTION__); + + s_priv = usb_get_serial_data(serial); + p_priv = usb_get_serial_port_data(port); + d_details = s_priv->device_details; + + /* only do something if we have a bulk out endpoint */ + if ((this_urb = p_priv->outcont_urb) == NULL) { + dbg("%s - oops no urb.", __FUNCTION__); + return -1; + } + + /* Save reset port val for resend. + Don't overwrite resend for open/close condition. */ + if ((reset_port + 1) > p_priv->resend_cont) + p_priv->resend_cont = reset_port + 1; + if (this_urb->status == -EINPROGRESS) { + dbg ("%s already writing", __FUNCTION__); + mdelay(5); + return(-1); + } + + memset(&msg, 0, sizeof (struct keyspan_usa90_portControlMessage)); + + /* Only set baud rate if it's changed */ + if (p_priv->old_baud != p_priv->baud) { + p_priv->old_baud = p_priv->baud; + msg.setClocking = 0x01; + if (d_details->calculate_baud_rate + (p_priv->baud, d_details->baudclk, &msg.baudHi, + &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE ) { + dbg("%s - Invalid baud rate %d requested, using 9600.", __FUNCTION__, + p_priv->baud); + p_priv->baud = 9600; + d_details->calculate_baud_rate (p_priv->baud, d_details->baudclk, + &msg.baudHi, &msg.baudLo, &prescaler, 0); + } + msg.setRxMode = 1; + msg.setTxMode = 1; + } + + /* modes must always be correctly specified */ + if (p_priv->baud > 57600) + { + msg.rxMode = RXMODE_DMA; + msg.txMode = TXMODE_DMA; + } + else + { + msg.rxMode = RXMODE_BYHAND; + msg.txMode = TXMODE_BYHAND; + } + + msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1; + switch (p_priv->cflag & CSIZE) { + case CS5: + msg.lcr |= USA_DATABITS_5; + break; + case CS6: + msg.lcr |= USA_DATABITS_6; + break; + case CS7: + msg.lcr |= USA_DATABITS_7; + break; + case CS8: + msg.lcr |= USA_DATABITS_8; + break; + } + if (p_priv->cflag & PARENB) { + /* note USA_PARITY_NONE == 0 */ + msg.lcr |= (p_priv->cflag & PARODD)? + USA_PARITY_ODD: USA_PARITY_EVEN; + } + if (p_priv->old_cflag != p_priv->cflag) { + p_priv->old_cflag = p_priv->cflag; + msg.setLcr = 0x01; + } + + if (p_priv->flow_control == flow_cts) + msg.txFlowControl = TXFLOW_CTS; + msg.setTxFlowControl = 0x01; + msg.setRxFlowControl = 0x01; + + msg.rxForwardingLength = 16; + msg.rxForwardingTimeout = 16; + msg.txAckSetting = 0; + msg.xonChar = 17; + msg.xoffChar = 19; + + /* Opening port */ + if (reset_port == 1) { + msg.portEnabled = 1; + msg.rxFlush = 1; + msg.txBreak = (p_priv->break_on); + } + /* Closing port */ + else if (reset_port == 2) { + msg.portEnabled = 0; + } + /* Sending intermediate configs */ + else { + if (port->open_count) + msg.portEnabled = 1; + msg.txBreak = (p_priv->break_on); + } + + /* Do handshaking outputs */ + msg.setRts = 0x01; + msg.rts = p_priv->rts_state; + + msg.setDtr = 0x01; + msg.dtr = p_priv->dtr_state; + + p_priv->resend_cont = 0; + memcpy (this_urb->transfer_buffer, &msg, sizeof(msg)); + + /* send the data out the device on control endpoint */ + this_urb->transfer_buffer_length = sizeof(msg); + + this_urb->dev = serial->dev; + if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { + dbg("%s - usb_submit_urb(setup) failed (%d)", __FUNCTION__, err); + } + return (0); +} + static void keyspan_send_setup(struct usb_serial_port *port, int reset_port) { struct usb_serial *serial = port->serial; @@ -1878,8 +2248,12 @@ case msg_usa49: keyspan_usa49_send_setup(serial, port, reset_port); break; + case msg_usa90: + keyspan_usa90_send_setup(serial, port, reset_port); + break; } } + /* Gets called by the "real" driver (ie once firmware is loaded and renumeration has taken place. */ diff -Nru a/drivers/usb/serial/keyspan.h b/drivers/usb/serial/keyspan.h --- a/drivers/usb/serial/keyspan.h Wed Oct 8 12:24:57 2003 +++ b/drivers/usb/serial/keyspan.h Wed Oct 8 12:24:57 2003 @@ -82,6 +82,10 @@ u8 *rate_hi, u8 *rate_low, u8 *prescaler, int portnum); +static int keyspan_usa19hs_calc_baud (u32 baud_rate, u32 baudclk, + u8 *rate_hi, u8 *rate_low, + u8 *prescaler, int portnum); + static int keyspan_usa28_send_setup (struct usb_serial *serial, struct usb_serial_port *port, int reset_port); @@ -92,6 +96,9 @@ struct usb_serial_port *port, int reset_port); +static int keyspan_usa90_send_setup (struct usb_serial *serial, + struct usb_serial_port *port, + int reset_port); /* Struct used for firmware - increased size of data section to allow Keyspan's 'C' firmware struct to be used unmodified */ @@ -183,6 +190,7 @@ #define KEYSPAN_USA18X_BAUDCLK (12000000L) /* a guess */ #define KEYSPAN_USA19_BAUDCLK (12000000L) #define KEYSPAN_USA19W_BAUDCLK (24000000L) +#define KEYSPAN_USA19HS_BAUDCLK (14769231L) #define KEYSPAN_USA28_BAUDCLK (1843200L) #define KEYSPAN_USA28X_BAUDCLK (12000000L) #define KEYSPAN_USA49W_BAUDCLK (48000000L) @@ -215,6 +223,7 @@ #define keyspan_usa18x_product_id 0x0112 #define keyspan_usa19_product_id 0x0107 #define keyspan_usa19qi_product_id 0x010c +#define keyspan_usa19hs_product_id 0x0121 #define keyspan_mpr_product_id 0x011c #define keyspan_usa19qw_product_id 0x0119 #define keyspan_usa19w_product_id 0x0108 @@ -230,7 +239,7 @@ /* product ID value */ int product_id; - enum {msg_usa26, msg_usa28, msg_usa49} msg_format; + enum {msg_usa26, msg_usa28, msg_usa49, msg_usa90} msg_format; /* Number of physical ports */ int num_ports; @@ -349,6 +358,22 @@ .baudclk = KEYSPAN_USA19W_BAUDCLK, }; +static const struct keyspan_device_details usa19hs_device_details = { + product_id: keyspan_usa19hs_product_id, + msg_format: msg_usa90, + num_ports: 1, + indat_endp_flip: 0, + outdat_endp_flip: 0, + indat_endpoints: {0x81}, + outdat_endpoints: {0x01}, + inack_endpoints: {-1}, + outcont_endpoints: {0x02}, + instat_endpoint: 0x82, + glocont_endpoint: -1, + calculate_baud_rate: keyspan_usa19hs_calc_baud, + baudclk: KEYSPAN_USA19HS_BAUDCLK, +}; + static const struct keyspan_device_details usa28_device_details = { .product_id = keyspan_usa28_product_id, .msg_format = msg_usa28, @@ -437,6 +462,7 @@ &usa19qi_device_details, &usa19qw_device_details, &usa19w_device_details, + &usa19hs_device_details, &usa28_device_details, &usa28x_device_details, &usa28xa_device_details, @@ -464,6 +490,7 @@ { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) }, + { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) }, { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) }, @@ -544,8 +571,8 @@ .short_name = "keyspan_1", .id_table = keyspan_1port_ids, .num_interrupt_in = NUM_DONT_CARE, - .num_bulk_in = 3, - .num_bulk_out = 4, + .num_bulk_in = NUM_DONT_CARE, + .num_bulk_out = NUM_DONT_CARE, .num_ports = 1, .open = keyspan_open, .close = keyspan_close, diff -Nru a/drivers/usb/serial/keyspan_usa26msg.h b/drivers/usb/serial/keyspan_usa26msg.h --- a/drivers/usb/serial/keyspan_usa26msg.h Wed Oct 8 12:24:56 2003 +++ b/drivers/usb/serial/keyspan_usa26msg.h Wed Oct 8 12:24:56 2003 @@ -4,7 +4,7 @@ Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - Keyspan USB Async Firmware to run on Anchor EZ-USB + Keyspan USB Async Message Formats for the USA28X Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -19,11 +19,7 @@ This file is available under a BSD-style copyright - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of InnoSys Incorporated may not be used to endorse or promote + 2. The name of InnoSys Incorporated may not be used to endorse or promote products derived from this software without specific prior written permission. diff -Nru a/drivers/usb/serial/keyspan_usa28msg.h b/drivers/usb/serial/keyspan_usa28msg.h --- a/drivers/usb/serial/keyspan_usa28msg.h Wed Oct 8 12:24:55 2003 +++ b/drivers/usb/serial/keyspan_usa28msg.h Wed Oct 8 12:24:55 2003 @@ -4,7 +4,7 @@ Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - Keyspan USB Async Firmware to run on Anchor EZ-USB + Keyspan USB Async Message Formats for the USA26X Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -19,11 +19,7 @@ This file is available under a BSD-style copyright - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of InnoSys Incorporated may not be used to endorse or promote + 2. The name of InnoSys Incorporated may not be used to endorse or promote products derived from this software without specific prior written permission. diff -Nru a/drivers/usb/serial/keyspan_usa49msg.h b/drivers/usb/serial/keyspan_usa49msg.h --- a/drivers/usb/serial/keyspan_usa49msg.h Wed Oct 8 12:24:56 2003 +++ b/drivers/usb/serial/keyspan_usa49msg.h Wed Oct 8 12:24:56 2003 @@ -4,7 +4,7 @@ Copyright (C) 1998-2000 InnoSys Incorporated. All Rights Reserved This file is available under a BSD-style copyright - Keyspan USB Async Firmware to run on Anchor EZ-USB + Keyspan USB Async Message Formats for the USA49W Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -19,11 +19,7 @@ This file is available under a BSD-style copyright - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. The name of InnoSys Incorporated may not be used to endorse or promote + 2. The name of InnoSys Incorporated may not be used to endorse or promote products derived from this software without specific prior written permission. diff -Nru a/drivers/usb/serial/keyspan_usa90msg.h b/drivers/usb/serial/keyspan_usa90msg.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/drivers/usb/serial/keyspan_usa90msg.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,198 @@ +/* + usa90msg.h + + Copyright (c) 1998-2003 InnoSys Incorporated. All Rights Reserved + This file is available under a BSD-style copyright + + Keyspan USB Async Message Formats for the USA19HS + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + 1. Redistributions of source code must retain this licence text + without modification, this list of conditions, and the following + disclaimer. The following copyright notice must appear immediately at + the beginning of all source files: + + Copyright (c) 1998-2003 InnoSys Incorporated. All Rights Reserved + + This file is available under a BSD-style copyright + + 2. The name of InnoSys Incorprated may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY INNOSYS CORP. ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + Revisions: + + 2003feb14 add setTxMode/txMode and cancelRxXoff to portControl + 2003mar21 change name of PARITY_0/1 to add MARK/SPACE +*/ + +#ifndef __USA90MSG__ +#define __USA90MSG__ + +struct keyspan_usa90_portControlMessage +{ + /* + there are three types of "commands" sent in the control message: + + 1. configuration changes which must be requested by setting + the corresponding "set" flag (and should only be requested + when necessary, to reduce overhead on the device): + */ + + u8 setClocking, // host requests baud rate be set + baudLo, // host does baud divisor calculation + baudHi, // host does baud divisor calculation + + setLcr, // host requests lcr be set + lcr, // use PARITY, STOPBITS, DATABITS below + + setRxMode, // set receive mode + rxMode, // RXMODE_DMA or RXMODE_BYHAND + + setTxMode, // set transmit mode + txMode, // TXMODE_DMA or TXMODE_BYHAND + + setTxFlowControl, // host requests tx flow control be set + txFlowControl , // use TX_FLOW... bits below + setRxFlowControl, // host requests rx flow control be set + rxFlowControl, // use RX_FLOW... bits below + sendXoff, // host requests XOFF transmitted immediately + sendXon, // host requests XON char transmitted + xonChar, // specified in current character format + xoffChar, // specified in current character format + + sendChar, // host requests char transmitted immediately + txChar, // character to send + + setRts, // host requests RTS output be set + rts, // 1=on, 0=off + setDtr, // host requests DTR output be set + dtr; // 1=on, 0=off + + + /* + 2. configuration data which is simply used as is + and must be specified correctly in every host message. + */ + + u8 rxForwardingLength, // forward when this number of chars available + rxForwardingTimeout, // (1-31 in ms) + txAckSetting; // 0=don't ack, 1=normal, 2-255 TBD... + /* + 3. Firmware states which cause actions if they change + and must be specified correctly in every host message. + */ + + u8 portEnabled, // 0=disabled, 1=enabled + txFlush, // 0=normal, 1=toss outbound data + txBreak, // 0=break off, 1=break on + loopbackMode; // 0=no loopback, 1=loopback enabled + + /* + 4. commands which are flags only; these are processed in order + (so that, e.g., if rxFlush and rxForward flags are set, the + port will have no data to forward); any non-zero value + is respected + */ + + u8 rxFlush, // toss inbound data + rxForward, // forward all inbound data, NOW (as if fwdLen==1) + cancelRxXoff, // cancel any receive XOFF state (_txXoff) + returnStatus; // return current status NOW +}; + +// defines for bits in lcr +#define USA_DATABITS_5 0x00 +#define USA_DATABITS_6 0x01 +#define USA_DATABITS_7 0x02 +#define USA_DATABITS_8 0x03 +#define STOPBITS_5678_1 0x00 // 1 stop bit for all byte sizes +#define STOPBITS_5_1p5 0x04 // 1.5 stop bits for 5-bit byte +#define STOPBITS_678_2 0x04 // 2 stop bits for 6-8 bit byte +#define USA_PARITY_NONE 0x00 +#define USA_PARITY_ODD 0x08 +#define USA_PARITY_EVEN 0x18 +#define PARITY_MARK_1 0x28 // force parity MARK +#define PARITY_SPACE_0 0x38 // force parity SPACE + +#define TXFLOW_CTS 0x04 +#define TXFLOW_DSR 0x08 +#define TXFLOW_XOFF 0x01 +#define TXFLOW_XOFF_ANY 0x02 +#define TXFLOW_XOFF_BITS (TXFLOW_XOFF | TXFLOW_XOFF_ANY) + +#define RXFLOW_XOFF 0x10 +#define RXFLOW_RTS 0x20 +#define RXFLOW_DTR 0x40 +#define RXFLOW_DSR_SENSITIVITY 0x80 + +#define RXMODE_BYHAND 0x00 +#define RXMODE_DMA 0x02 + +#define TXMODE_BYHAND 0x00 +#define TXMODE_DMA 0x02 + + +// all things called "StatusMessage" are sent on the status endpoint + +struct keyspan_usa90_portStatusMessage +{ + u8 msr, // reports the actual MSR register + cts, // reports CTS pin + dcd, // reports DCD pin + dsr, // reports DSR pin + ri, // reports RI pin + _txXoff, // port is in XOFF state (we received XOFF) + rxBreak, // reports break state + rxOverrun, // count of overrun errors (since last reported) + rxParity, // count of parity errors (since last reported) + rxFrame, // count of frame errors (since last reported) + portState, // PORTSTATE_xxx bits (useful for debugging) + messageAck, // message acknowledgement + charAck, // character acknowledgement + controlResponse; // (value = returnStatus) a control message has been processed +}; + +// bits in RX data message when STAT byte is included + +#define RXERROR_OVERRUN 0x02 +#define RXERROR_PARITY 0x04 +#define RXERROR_FRAMING 0x08 +#define RXERROR_BREAK 0x10 + +#define PORTSTATE_ENABLED 0x80 +#define PORTSTATE_TXFLUSH 0x01 +#define PORTSTATE_TXBREAK 0x02 +#define PORTSTATE_LOOPBACK 0x04 + +// MSR bits + +#define MSR_dCTS 0x01 // CTS has changed since last report +#define MSR_dDSR 0x02 +#define MSR_dRI 0x04 +#define MSR_dDCD 0x08 + +#define MSR_CTS 0x10 // current state of CTS +#define MSR_DSR 0x20 +#define MSR_RI 0x40 +#define MSR_DCD 0x80 + +// ie: the maximum length of an endpoint buffer +#define MAX_DATA_LEN 64 + +#endif diff -Nru a/drivers/usb/storage/freecom.c b/drivers/usb/storage/freecom.c --- a/drivers/usb/storage/freecom.c Wed Oct 8 12:24:57 2003 +++ b/drivers/usb/storage/freecom.c Wed Oct 8 12:24:57 2003 @@ -101,7 +101,8 @@ #define FCM_PACKET_IDE_READ 0xC0 /* All packets (except for status) are 64 bytes long. */ -#define FCM_PACKET_LENGTH 64 +#define FCM_PACKET_LENGTH 64 +#define FCM_STATUS_PACKET_LENGTH 4 static int freecom_readdata (Scsi_Cmnd *srb, struct us_data *us, @@ -216,7 +217,7 @@ /* There are times we can optimize out this status read, but it * doesn't hurt us to always do it now. */ result = usb_stor_bulk_transfer_buf (us, ipipe, fst, - FCM_PACKET_LENGTH, &partial); + FCM_STATUS_PACKET_LENGTH, &partial); US_DEBUGP("foo Status result %d %u\n", result, partial); if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; @@ -256,10 +257,10 @@ /* get the data */ result = usb_stor_bulk_transfer_buf (us, ipipe, fst, - FCM_PACKET_LENGTH, &partial); + FCM_STATUS_PACKET_LENGTH, &partial); US_DEBUGP("bar Status result %d %u\n", result, partial); - if (result > USB_STOR_XFER_SHORT) + if (result != USB_STOR_XFER_GOOD) return USB_STOR_TRANSPORT_ERROR; US_DEBUG(pdump ((void *) fst, partial)); @@ -302,6 +303,9 @@ switch (us->srb->sc_data_direction) { case SCSI_DATA_READ: + /* catch bogus "read 0 length" case */ + if (!length) + break; /* Make sure that the status indicates that the device * wants data as well. */ if ((fst->Status & DRQ_STAT) == 0 || (fst->Reason & 3) != 2) { @@ -331,6 +335,9 @@ break; case SCSI_DATA_WRITE: + /* catch bogus "write 0 length" case */ + if (!length) + break; /* Make sure the status indicates that the device wants to * send us data. */ /* !!IMPLEMENT!! */ @@ -362,6 +369,7 @@ break; default: + /* should never hit here -- filtered in usb.c */ US_DEBUGP ("freecom unimplemented direction: %d\n", us->srb->sc_data_direction); // Return fail, SCSI seems to handle this better. diff -Nru a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h --- a/drivers/usb/storage/unusual_devs.h Wed Oct 8 12:24:57 2003 +++ b/drivers/usb/storage/unusual_devs.h Wed Oct 8 12:24:57 2003 @@ -394,6 +394,12 @@ "Dimage F300", US_SC_SCSI, US_PR_BULK, NULL, 0 ), +/* Reported by Miguel A. Fosas */ +UNUSUAL_DEV( 0x0686, 0x4017, 0x0001, 0x0001, + "Minolta", + "DIMAGE E223", + US_SC_SCSI, US_PR_DEVICE, NULL, 0 ), + UNUSUAL_DEV( 0x0693, 0x0002, 0x0100, 0x0100, "Hagiwara", "FlashGate SmartMedia", @@ -542,7 +548,7 @@ * - They don't like the INQUIRY command. So we must handle this command * of the SCSI layer ourselves. */ -UNUSUAL_DEV( 0x07cf, 0x1001, 0x1000, 0x9009, +UNUSUAL_DEV( 0x07cf, 0x1001, 0x1000, 0x5009, "Casio", "QV DigitalCamera", US_SC_8070, US_PR_CB, NULL, diff -Nru a/drivers/video/Kconfig b/drivers/video/Kconfig --- a/drivers/video/Kconfig Wed Oct 8 12:24:55 2003 +++ b/drivers/video/Kconfig Wed Oct 8 12:24:55 2003 @@ -188,19 +188,19 @@ otherwise say N. config FB_CYBER - tristate "Amiga CyberVision support" - depends on FB && ZORRO + tristate "Amiga CyberVision 64 support" + depends on FB && ZORRO && BROKEN help This enables support for the Cybervision 64 graphics card from Phase5. Please note that its use is not all that intuitive (i.e. if you have any questions, be sure to ask!). Say N unless you have a Cybervision 64 or plan to get one before you next recompile the kernel. Please note that this driver DOES NOT support the - Cybervision 64 3D card, as they use incompatible video chips. + Cybervision 64/3D card, as they use incompatible video chips. config FB_VIRGE - bool "Amiga CyberVision3D support " - depends on FB && ZORRO + bool "Amiga CyberVision 64/3D support " + depends on FB && ZORRO && BROKEN help This enables support for the Cybervision 64/3D graphics card from Phase5. Please note that its use is not all that intuitive (i.e. if @@ -210,8 +210,8 @@ Cybervision 64 card, as they use incompatible video chips. config FB_RETINAZ3 - tristate "Amiga RetinaZ3 support" - depends on FB && ZORRO + tristate "Amiga Retina Z3 support" + depends on FB && ZORRO && BROKEN help This enables support for the Retina Z3 graphics card. Say N unless you have a Retina Z3 or plan to get one before you next recompile @@ -226,7 +226,7 @@ config FB_ATARI bool "Atari native chipset support" - depends on FB && ATARI + depends on FB && ATARI && BROKEN help This is the frame buffer device driver for the builtin graphics chipset found in Ataris. @@ -367,7 +367,7 @@ config FB_SUN3 bool "Sun3 framebuffer support" - depends on FB && (SUN3 || SUN3X) + depends on FB && (SUN3 || SUN3X) && BROKEN config FB_BW2 bool "BWtwo support" diff -Nru a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c --- a/drivers/video/console/sticore.c Wed Oct 8 12:24:56 2003 +++ b/drivers/video/console/sticore.c Wed Oct 8 12:24:56 2003 @@ -988,7 +988,7 @@ if (!sti) { printk(KERN_WARNING "Unable to handle STI device '%s'\n", - pd->dev.name); + pci_name(pd)); return -ENODEV; } #endif /* CONFIG_PCI */ diff -Nru a/drivers/video/pm3fb.c b/drivers/video/pm3fb.c --- a/drivers/video/pm3fb.c Wed Oct 8 12:24:56 2003 +++ b/drivers/video/pm3fb.c Wed Oct 8 12:24:56 2003 @@ -54,7 +54,6 @@ #include #include -#include #include #include #include diff -Nru a/drivers/video/sa1100fb.c b/drivers/video/sa1100fb.c --- a/drivers/video/sa1100fb.c Wed Oct 8 12:24:56 2003 +++ b/drivers/video/sa1100fb.c Wed Oct 8 12:24:56 2003 @@ -1388,7 +1388,6 @@ LCCR0 &= ~LCCR0_LEN; /* Disable LCD Controller */ schedule_timeout(20 * HZ / 1000); - set_current_state(TASK_RUNNING); remove_wait_queue(&fbi->ctrlr_wait, &wait); } diff -Nru a/drivers/video/sstfb.c b/drivers/video/sstfb.c --- a/drivers/video/sstfb.c Wed Oct 8 12:24:57 2003 +++ b/drivers/video/sstfb.c Wed Oct 8 12:24:57 2003 @@ -94,7 +94,6 @@ #include #include #include -#include #include #include #include diff -Nru a/drivers/video/stifb.c b/drivers/video/stifb.c --- a/drivers/video/stifb.c Wed Oct 8 12:24:57 2003 +++ b/drivers/video/stifb.c Wed Oct 8 12:24:57 2003 @@ -1238,7 +1238,7 @@ /* get framebuffer physical and virtual base addr & len (64bit ready) */ - fix->smem_start = fb->sti->regions_phys[1] | 0xffffffff00000000; + fix->smem_start = F_EXTEND(fb->sti->regions_phys[1]); fix->smem_len = fb->sti->regions[1].region_desc.length * 4096; fix->line_length = (fb->sti->glob_cfg->total_x * bpp) / 8; diff -Nru a/fs/Kconfig b/fs/Kconfig --- a/fs/Kconfig Wed Oct 8 12:24:57 2003 +++ b/fs/Kconfig Wed Oct 8 12:24:57 2003 @@ -874,6 +874,7 @@ config HUGETLBFS bool "HugeTLB file system support" + depends X86 || IA64 || PPC64 || SPARC64 || X86_64 || BROKEN config HUGETLB_PAGE def_bool HUGETLBFS @@ -1254,6 +1255,8 @@ config NFS_FS tristate "NFS file system support" depends on INET + select LOCKD + select SUNRPC help If you are connected to some other (usually local) Unix computer (using SLIP, PLIP, PPP or Ethernet) and want to mount files residing @@ -1309,6 +1312,8 @@ config NFSD tristate "NFS server support" depends on INET + select LOCKD + select SUNRPC help If you want your Linux box to act as an NFS *server*, so that other computers on your local network which support NFS can access certain @@ -1371,8 +1376,6 @@ config LOCKD tristate - default m if NFS_FS!=y && NFSD!=y && (NFS_FS=m || NFSD=m) - default y if NFS_FS=y || NFSD=y config LOCKD_V4 bool @@ -1385,8 +1388,6 @@ config SUNRPC tristate - default m if NFS_FS!=y && NFSD!=y && (NFS_FS=m || NFSD=m) - default y if NFS_FS=y || NFSD=y config SUNRPC_GSS tristate "Provide RPCSEC_GSS authentication (EXPERIMENTAL)" @@ -1565,6 +1566,7 @@ # for fs/nls/Config.in tristate "Andrew File System support (AFS) (Experimental)" depends on INET && EXPERIMENTAL + select RXRPC help If you say Y here, you will get an experimental Andrew File System driver. It currently only supports unsecured read-only AFS access. @@ -1575,8 +1577,6 @@ config RXRPC tristate - default m if AFS_FS=m - default y if AFS_FS=y endmenu diff -Nru a/fs/adfs/super.c b/fs/adfs/super.c --- a/fs/adfs/super.c Wed Oct 8 12:24:55 2003 +++ b/fs/adfs/super.c Wed Oct 8 12:24:55 2003 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -133,50 +134,56 @@ sb->s_fs_info = NULL; } +enum {Opt_uid, Opt_gid, Opt_ownmask, Opt_othmask, Opt_err}; + +static match_table_t tokens = { + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_ownmask, "ownmask=%o"}, + {Opt_othmask, "othmask=%o"}, + {Opt_err, NULL} +}; + static int parse_options(struct super_block *sb, char *options) { - char *value, *opt; + char *p; struct adfs_sb_info *asb = ADFS_SB(sb); + int option; if (!options) return 0; - while ((opt = strsep(&options, ",")) != NULL) { - if (!*opt) + while ((p = strsep(&options, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + if (!*p) continue; - value = strchr(opt, '='); - if (value) - *value++ = '\0'; - if (!strcmp(opt, "uid")) { /* owner of all files */ - if (!value || !*value) - return -EINVAL; - asb->s_uid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } else - if (!strcmp(opt, "gid")) { /* group owner of all files */ - if (!value || !*value) - return -EINVAL; - asb->s_gid = simple_strtoul(value, &value, 0); - if (*value) - return -EINVAL; - } else - if (!strcmp(opt, "ownmask")) { /* owner permission mask */ - if (!value || !*value) - return -EINVAL; - asb->s_owner_mask = simple_strtoul(value, &value, 8); - if (*value) - return -EINVAL; - } else - if (!strcmp(opt, "othmask")) { /* others permission mask */ - if (!value || !*value) - return -EINVAL; - asb->s_other_mask = simple_strtoul(value, &value, 8); - if (*value) - return -EINVAL; - } else { /* eh? say again. */ - printk("ADFS-fs: unrecognised mount option %s\n", opt); + token = match_token(p, tokens, args); + switch (token) { + case Opt_uid: + if (match_int(args, &option)) + return -EINVAL; + asb->s_uid = option; + break; + case Opt_gid: + if (match_int(args, &option)) + return -EINVAL; + asb->s_gid = option; + break; + case Opt_ownmask: + if (match_octal(args, &option)) + return -EINVAL; + asb->s_owner_mask = option; + break; + case Opt_othmask: + if (match_octal(args, &option)) + return -EINVAL; + asb->s_other_mask = option; + break; + default: + printk("ADFS-fs: unrecognised mount option \"%s\" " + "or missing value\n", p); return -EINVAL; } } diff -Nru a/fs/affs/file.c b/fs/affs/file.c --- a/fs/affs/file.c Wed Oct 8 12:24:56 2003 +++ b/fs/affs/file.c Wed Oct 8 12:24:56 2003 @@ -39,7 +39,7 @@ static struct buffer_head *affs_alloc_extblock(struct inode *inode, struct buffer_head *bh, u32 ext); static inline struct buffer_head *affs_get_extblock(struct inode *inode, u32 ext); static struct buffer_head *affs_get_extblock_slow(struct inode *inode, u32 ext); -static ssize_t affs_file_write(struct file *filp, const char *buf, size_t count, loff_t *ppos); +static ssize_t affs_file_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos); static int affs_file_open(struct inode *inode, struct file *filp); static int affs_file_release(struct inode *inode, struct file *filp); @@ -491,7 +491,8 @@ } static ssize_t -affs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) +affs_file_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) { ssize_t retval; diff -Nru a/fs/affs/super.c b/fs/affs/super.c --- a/fs/affs/super.c Wed Oct 8 12:24:57 2003 +++ b/fs/affs/super.c Wed Oct 8 12:24:57 2003 @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -142,12 +143,37 @@ .remount_fs = affs_remount, }; +enum { + Opt_bs, Opt_mode, Opt_mufs, Opt_prefix, Opt_protect, + Opt_reserved, Opt_root, Opt_setgid, Opt_setuid, + Opt_verbose, Opt_volume, Opt_ignore, Opt_err, +}; + +static match_table_t tokens = { + {Opt_bs, "bs=%u"}, + {Opt_mode, "mode=%o"}, + {Opt_mufs, "mufs"}, + {Opt_prefix, "prefix=%s"}, + {Opt_protect, "protect"}, + {Opt_reserved, "reserved=%u"}, + {Opt_root, "root=%u"}, + {Opt_setgid, "setgid=%u"}, + {Opt_setuid, "setuid=%u"}, + {Opt_verbose, "verbose"}, + {Opt_volume, "volume=%s"}, + {Opt_ignore, "grpquota"}, + {Opt_ignore, "noquota"}, + {Opt_ignore, "quota"}, + {Opt_ignore, "usrquota"}, + {Opt_err, NULL}, +}; + static int parse_options(char *options, uid_t *uid, gid_t *gid, int *mode, int *reserved, s32 *root, int *blocksize, char **prefix, char *volume, unsigned long *mount_opts) { - char *this_char, *value, *optn; - int f; + char *p; + substring_t args[MAX_OPT_ARGS]; /* Fill in defaults */ @@ -161,109 +187,85 @@ *mount_opts = 0; if (!options) return 1; - while ((this_char = strsep(&options, ",")) != NULL) { - if (!*this_char) + + while ((p = strsep(&options, ",")) != NULL) { + int token, n, option; + if (!*p) continue; - f = 0; - if ((value = strchr(this_char,'=')) != NULL) - *value++ = 0; - if ((optn = "protect") && !strcmp(this_char, optn)) { - if (value) - goto out_inv_arg; - *mount_opts |= SF_IMMUTABLE; - } else if ((optn = "verbose") && !strcmp(this_char, optn)) { - if (value) - goto out_inv_arg; - *mount_opts |= SF_VERBOSE; - } else if ((optn = "mufs") && !strcmp(this_char, optn)) { - if (value) - goto out_inv_arg; - *mount_opts |= SF_MUFS; - } else if ((f = !strcmp(this_char,"setuid")) || !strcmp(this_char,"setgid")) { - if (value) { - if (!*value) { - printk("AFFS: Argument for set[ug]id option missing\n"); - return 0; - } else { - (f ? *uid : *gid) = simple_strtoul(value,&value,0); - if (*value) { - printk("AFFS: Bad set[ug]id argument\n"); - return 0; - } - *mount_opts |= f ? SF_SETUID : SF_SETGID; - } + + token = match_token(p, tokens, args); + switch (token) { + case Opt_bs: + if (match_int(&args[0], &n)) + return -EINVAL; + if (n != 512 && n != 1024 && n != 2048 + && n != 4096) { + printk ("AFFS: Invalid blocksize (512, 1024, 2048, 4096 allowed)\n"); + return 0; } - } else if (!strcmp(this_char,"prefix")) { - optn = "prefix"; - if (!value || !*value) - goto out_no_arg; + *blocksize = n; + break; + case Opt_mode: + if (match_octal(&args[0], &option)) + return 1; + *mode = option & 0777; + *mount_opts |= SF_SETMODE; + break; + case Opt_mufs: + *mount_opts |= SF_MUFS; + break; + case Opt_prefix: if (*prefix) { /* Free any previous prefix */ kfree(*prefix); *prefix = NULL; } - *prefix = kmalloc(strlen(value) + 1,GFP_KERNEL); + *prefix = match_strdup(&args[0]); if (!*prefix) return 0; - strcpy(*prefix,value); *mount_opts |= SF_PREFIX; - } else if (!strcmp(this_char,"volume")) { - optn = "volume"; - if (!value || !*value) - goto out_no_arg; - strlcpy(volume,value,31); - } else if (!strcmp(this_char,"mode")) { - optn = "mode"; - if (!value || !*value) - goto out_no_arg; - *mode = simple_strtoul(value,&value,8) & 0777; - if (*value) - return 0; - *mount_opts |= SF_SETMODE; - } else if (!strcmp(this_char,"reserved")) { - optn = "reserved"; - if (!value || !*value) - goto out_no_arg; - *reserved = simple_strtoul(value,&value,0); - if (*value) - return 0; - } else if (!strcmp(this_char,"root")) { - optn = "root"; - if (!value || !*value) - goto out_no_arg; - *root = simple_strtoul(value,&value,0); - if (*value) - return 0; - } else if (!strcmp(this_char,"bs")) { - optn = "bs"; - if (!value || !*value) - goto out_no_arg; - *blocksize = simple_strtoul(value,&value,0); - if (*value) - return 0; - if (*blocksize != 512 && *blocksize != 1024 && *blocksize != 2048 - && *blocksize != 4096) { - printk ("AFFS: Invalid blocksize (512, 1024, 2048, 4096 allowed)\n"); - return 0; - } - } else if (!strcmp (this_char, "grpquota") - || !strcmp (this_char, "noquota") - || !strcmp (this_char, "quota") - || !strcmp (this_char, "usrquota")) - /* Silently ignore the quota options */ - ; - else { - printk("AFFS: Unrecognized mount option %s\n", this_char); + break; + case Opt_protect: + *mount_opts |= SF_IMMUTABLE; + break; + case Opt_reserved: + if (match_int(&args[0], reserved)) + return 1; + break; + case Opt_root: + if (match_int(&args[0], root)) + return 1; + break; + case Opt_setgid: + if (match_int(&args[0], &option)) + return 1; + *gid = option; + *mount_opts |= SF_SETGID; + break; + case Opt_setuid: + if (match_int(&args[0], &option)) + return -EINVAL; + *uid = option; + *mount_opts |= SF_SETUID; + break; + case Opt_verbose: + *mount_opts |= SF_VERBOSE; + break; + case Opt_volume: { + char *vol = match_strdup(&args[0]); + strlcpy(volume, vol, 32); + kfree(vol); + break; + } + case Opt_ignore: + /* Silently ignore the quota options */ + break; + default: + printk("AFFS: Unrecognized mount option \"%s\" " + "or missing value\n", p); return 0; } } return 1; - -out_no_arg: - printk("AFFS: The %s option requires an argument\n", optn); - return 0; -out_inv_arg: - printk("AFFS: Option %s does not take an argument\n", optn); - return 0; } /* This function definitely needs to be split up. Some fine day I'll diff -Nru a/fs/attr.c b/fs/attr.c --- a/fs/attr.c Wed Oct 8 12:24:55 2003 +++ b/fs/attr.c Wed Oct 8 12:24:55 2003 @@ -5,6 +5,7 @@ * changes by Thomas Schoebel-Theuer */ +#include #include #include #include @@ -59,6 +60,8 @@ return retval; } +EXPORT_SYMBOL(inode_change_ok); + int inode_setattr(struct inode * inode, struct iattr * attr) { unsigned int ia_valid = attr->ia_valid; @@ -100,6 +103,8 @@ return error; } +EXPORT_SYMBOL(inode_setattr); + int setattr_mask(unsigned int ia_valid) { unsigned long dn_mask = 0; @@ -184,3 +189,5 @@ } return error; } + +EXPORT_SYMBOL(notify_change); diff -Nru a/fs/autofs/inode.c b/fs/autofs/inode.c --- a/fs/autofs/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/autofs/inode.c Wed Oct 8 12:24:57 2003 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "autofs_i.h" #include @@ -45,10 +46,24 @@ .statfs = simple_statfs, }; +enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto}; + +static match_table_t autofs_tokens = { + {Opt_fd, "fd=%u"}, + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_pgrp, "pgrp=%u"}, + {Opt_minproto, "minproto=%u"}, + {Opt_maxproto, "maxproto=%u"}, + {Opt_err, NULL} +}; + static int parse_options(char *options, int *pipefd, uid_t *uid, gid_t *gid, pid_t *pgrp, int *minproto, int *maxproto) { - char *this_char, *value; - + char *p; + substring_t args[MAX_OPT_ARGS]; + int option; + *uid = current->uid; *gid = current->gid; *pgrp = process_group(current); @@ -57,55 +72,49 @@ *pipefd = -1; - if ( !options ) return 1; - while ((this_char = strsep(&options,",")) != NULL) { - if (!*this_char) + if (!options) + return 1; + + while ((p = strsep(&options, ",")) != NULL) { + int token; + if (!*p) continue; - if ((value = strchr(this_char,'=')) != NULL) - *value++ = 0; - if (!strcmp(this_char,"fd")) { - if (!value || !*value) - return 1; - *pipefd = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"uid")) { - if (!value || !*value) - return 1; - *uid = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"gid")) { - if (!value || !*value) - return 1; - *gid = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"pgrp")) { - if (!value || !*value) - return 1; - *pgrp = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"minproto")) { - if (!value || !*value) - return 1; - *minproto = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"maxproto")) { - if (!value || !*value) - return 1; - *maxproto = simple_strtoul(value,&value,0); - if (*value) - return 1; + + token = match_token(p, autofs_tokens, args); + switch (token) { + case Opt_fd: + if (match_int(&args[0], &option)) + return 1; + *pipefd = option; + break; + case Opt_uid: + if (match_int(&args[0], &option)) + return 1; + *uid = option; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 1; + *gid = option; + break; + case Opt_pgrp: + if (match_int(&args[0], &option)) + return 1; + *pgrp = option; + break; + case Opt_minproto: + if (match_int(&args[0], &option)) + return 1; + *minproto = option; + break; + case Opt_maxproto: + if (match_int(&args[0], &option)) + return 1; + *maxproto = option; + break; + default: + return 1; } - else break; } return (*pipefd < 0); } diff -Nru a/fs/autofs4/inode.c b/fs/autofs4/inode.c --- a/fs/autofs4/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/autofs4/inode.c Wed Oct 8 12:24:57 2003 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "autofs_i.h" #include @@ -94,11 +95,25 @@ .statfs = simple_statfs, }; +enum {Opt_err, Opt_fd, Opt_uid, Opt_gid, Opt_pgrp, Opt_minproto, Opt_maxproto}; + +static match_table_t tokens = { + {Opt_fd, "fd=%u"}, + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_pgrp, "pgrp=%u"}, + {Opt_minproto, "minproto=%u"}, + {Opt_maxproto, "maxproto=%u"}, + {Opt_err, NULL} +}; + static int parse_options(char *options, int *pipefd, uid_t *uid, gid_t *gid, pid_t *pgrp, int *minproto, int *maxproto) { - char *this_char, *value; - + char *p; + substring_t args[MAX_OPT_ARGS]; + int option; + *uid = current->uid; *gid = current->gid; *pgrp = process_group(current); @@ -108,55 +123,48 @@ *pipefd = -1; - if ( !options ) return 1; - while ((this_char = strsep(&options,",")) != NULL) { - if (!*this_char) + if (!options) + return 1; + + while ((p = strsep(&options, ",")) != NULL) { + int token; + if (!*p) continue; - if ((value = strchr(this_char,'=')) != NULL) - *value++ = 0; - if (!strcmp(this_char,"fd")) { - if (!value || !*value) - return 1; - *pipefd = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"uid")) { - if (!value || !*value) - return 1; - *uid = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"gid")) { - if (!value || !*value) - return 1; - *gid = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"pgrp")) { - if (!value || !*value) - return 1; - *pgrp = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"minproto")) { - if (!value || !*value) - return 1; - *minproto = simple_strtoul(value,&value,0); - if (*value) - return 1; - } - else if (!strcmp(this_char,"maxproto")) { - if (!value || !*value) - return 1; - *maxproto = simple_strtoul(value,&value,0); - if (*value) - return 1; + + token = match_token(p, tokens, args); + switch (token) { + case Opt_fd: + if (match_int(args, pipefd)) + return 1; + break; + case Opt_uid: + if (match_int(args, &option)) + return 1; + *uid = option; + break; + case Opt_gid: + if (match_int(args, &option)) + return 1; + *gid = option; + break; + case Opt_pgrp: + if (match_int(args, &option)) + return 1; + *pgrp = option; + break; + case Opt_minproto: + if (match_int(args, &option)) + return 1; + *minproto = option; + break; + case Opt_maxproto: + if (match_int(args, &option)) + return 1; + *maxproto = option; + break; + default: + return 1; } - else break; } return (*pipefd < 0); } diff -Nru a/fs/bad_inode.c b/fs/bad_inode.c --- a/fs/bad_inode.c Wed Oct 8 12:24:56 2003 +++ b/fs/bad_inode.c Wed Oct 8 12:24:56 2003 @@ -9,6 +9,7 @@ */ #include +#include #include #include #include @@ -106,6 +107,7 @@ inode->i_op = &bad_inode_ops; inode->i_fop = &bad_file_ops; } +EXPORT_SYMBOL(make_bad_inode); /* * This tests whether an inode has been flagged as bad. The test uses @@ -124,3 +126,5 @@ { return (inode->i_op == &bad_inode_ops); } + +EXPORT_SYMBOL(is_bad_inode); diff -Nru a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c --- a/fs/befs/linuxvfs.c Wed Oct 8 12:24:56 2003 +++ b/fs/befs/linuxvfs.c Wed Oct 8 12:24:56 2003 @@ -13,6 +13,7 @@ #include #include #include +#include #include "befs.h" #include "btree.h" @@ -39,7 +40,7 @@ static void befs_destroy_inode(struct inode *inode); static int befs_init_inodecache(void); static void befs_destroy_inodecache(void); -static int befs_readlink(struct dentry *, char *, int); +static int befs_readlink(struct dentry *, char __user *, int); static int befs_follow_link(struct dentry *, struct nameidata *nd); static int befs_utf2nls(struct super_block *sb, const char *in, int in_len, char **out, int *out_len); @@ -494,7 +495,7 @@ } static int -befs_readlink(struct dentry *dentry, char *buffer, int buflen) +befs_readlink(struct dentry *dentry, char __user *buffer, int buflen) { struct super_block *sb = dentry->d_sb; befs_inode_info *befs_ino = BEFS_I(dentry->d_inode); @@ -667,12 +668,27 @@ return -EILSEQ; } +/** + * Use the + * + */ +enum { + Opt_uid, Opt_gid, Opt_charset, Opt_debug, +}; + +static match_table_t befs_tokens = { + {Opt_uid, "uid=%d"}, + {Opt_gid, "gid=%d"}, + {Opt_charset, "iocharset=%s"}, + {Opt_debug, "debug"} +}; + static int parse_options(char *options, befs_mount_options * opts) { - char *this_char; - char *value; - int ret = 1; + char *p; + substring_t args[MAX_OPT_ARGS]; + int option; /* Initialize options */ opts->uid = 0; @@ -683,64 +699,56 @@ opts->debug = 0; if (!options) - return ret; - - while ((this_char = strsep(&options, ",")) != NULL) { + return 1; - if ((value = strchr(this_char, '=')) != NULL) - *value++ = 0; - - if (!strcmp(this_char, "uid")) { - if (!value || !*value) { - ret = 0; - } else { - opts->uid = simple_strtoul(value, &value, 0); - opts->use_uid = 1; - if (*value) { - printk(KERN_ERR "BEFS: Invalid uid " - "option: %s\n", value); - ret = 0; - } + while ((p = strsep(&options, ",")) != NULL) { + int token; + if (!*p) + continue; + + token = match_token(p, befs_tokens, args); + switch (token) { + case Opt_uid: + if (match_int(&args[0], &option)) + return 0; + if (option < 0) { + printk(KERN_ERR "BeFS: Invalid uid %d, " + "using default\n", option); + break; } - } else if (!strcmp(this_char, "gid")) { - if (!value || !*value) - ret = 0; - else { - opts->gid = simple_strtoul(value, &value, 0); - opts->use_gid = 1; - if (*value) { - printk(KERN_ERR - "BEFS: Invalid gid option: " - "%s\n", value); - ret = 0; - } + opts->uid = option; + opts->use_uid = 1; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + if (option < 0) { + printk(KERN_ERR "BeFS: Invalid gid %d, " + "using default\n", option); + break; } - } else if (!strcmp(this_char, "iocharset") && value) { - char *p = value; - int len; - - while (*value && *value != ',') - value++; - len = value - p; - if (len) { - char *buffer = kmalloc(len + 1, GFP_NOFS); - if (buffer) { - opts->iocharset = buffer; - memcpy(buffer, p, len); - buffer[len] = 0; - - } else { - printk(KERN_ERR "BEFS: " - "cannot allocate memory\n"); - ret = 0; - } + opts->gid = option; + opts->use_gid = 1; + break; + case Opt_charset: + kfree(opts->iocharset); + opts->iocharset = match_strdup(&args[0]); + if (!opts->iocharset) { + printk(KERN_ERR "BeFS: allocation failure for " + "iocharset string\n"); + return 0; } - } else if (!strcmp(this_char, "debug")) { + break; + case Opt_debug: opts->debug = 1; + break; + default: + printk(KERN_ERR "BeFS: Unrecognized mount option \"%s\" " + "or missing value\n", p); + return 0; } } - - return ret; + return 1; } /* This function has the responsibiltiy of getting the @@ -939,9 +947,19 @@ err = befs_init_inodecache(); if (err) - return err; + goto unaquire_none; + + err = register_filesystem(&befs_fs_type); + if (err) + goto unaquire_inodecache; + + return 0; + +unaquire_inodecache: + befs_destroy_inodecache(); - return register_filesystem(&befs_fs_type); +unaquire_none: + return err; } static void __exit diff -Nru a/fs/binfmt_elf.c b/fs/binfmt_elf.c --- a/fs/binfmt_elf.c Wed Oct 8 12:24:56 2003 +++ b/fs/binfmt_elf.c Wed Oct 8 12:24:56 2003 @@ -134,7 +134,7 @@ elf_addr_t *sp, *u_platform; const char *k_platform = ELF_PLATFORM; int items; - elf_addr_t elf_info[40]; + elf_addr_t *elf_info; int ei_index = 0; struct task_struct *tsk = current; @@ -169,6 +169,7 @@ } /* Create the ELF interpreter info */ + elf_info = (elf_addr_t *) current->mm->saved_auxv; #define NEW_AUX_ENT(id, val) \ do { elf_info[ei_index++] = id; elf_info[ei_index++] = val; } while (0) @@ -196,8 +197,13 @@ if (k_platform) { NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(long)u_platform); } - NEW_AUX_ENT(AT_NULL, 0); #undef NEW_AUX_ENT + /* AT_NULL is zero; clear the rest too */ + memset(&elf_info[ei_index], 0, + sizeof current->mm->saved_auxv - ei_index * sizeof elf_info[0]); + + /* And advance past the AT_NULL entry. */ + ei_index += 2; sp = STACK_ADD(p, ei_index); @@ -1078,7 +1084,7 @@ prstatus->pr_pid = p->pid; prstatus->pr_ppid = p->parent->pid; prstatus->pr_pgrp = process_group(p); - prstatus->pr_sid = p->session; + prstatus->pr_sid = process_session(p); jiffies_to_timeval(p->utime, &prstatus->pr_utime); jiffies_to_timeval(p->stime, &prstatus->pr_stime); jiffies_to_timeval(p->cutime, &prstatus->pr_cutime); @@ -1106,7 +1112,7 @@ psinfo->pr_pid = p->pid; psinfo->pr_ppid = p->parent->pid; psinfo->pr_pgrp = process_group(p); - psinfo->pr_sid = p->session; + psinfo->pr_sid = process_session(p); i = p->state ? ffz(~p->state) + 1 : 0; psinfo->pr_state = i; @@ -1114,8 +1120,8 @@ psinfo->pr_zomb = psinfo->pr_sname == 'Z'; psinfo->pr_nice = task_nice(p); psinfo->pr_flag = p->flags; - psinfo->pr_uid = NEW_TO_OLD_UID(p->uid); - psinfo->pr_gid = NEW_TO_OLD_GID(p->gid); + SET_UID(psinfo->pr_uid, p->uid); + SET_GID(psinfo->pr_gid, p->gid); strncpy(psinfo->pr_fname, p->comm, sizeof(psinfo->pr_fname)); return; @@ -1186,7 +1192,7 @@ */ static int elf_core_dump(long signr, struct pt_regs * regs, struct file * file) { -#define NUM_NOTES 5 +#define NUM_NOTES 6 int has_dumped = 0; mm_segment_t fs; int segs; @@ -1196,7 +1202,7 @@ struct elfhdr *elf = NULL; off_t offset = 0, dataoff; unsigned long limit = current->rlim[RLIMIT_CORE].rlim_cur; - int numnote = NUM_NOTES; + int numnote; struct memelfnote *notes = NULL; struct elf_prstatus *prstatus = NULL; /* NT_PRSTATUS */ struct elf_prpsinfo *psinfo = NULL; /* NT_PRPSINFO */ @@ -1208,6 +1214,7 @@ elf_fpxregset_t *xfpu = NULL; #endif int thread_status_size = 0; + elf_addr_t *auxv; /* * We no longer stop all VM operations. @@ -1287,18 +1294,25 @@ fill_note(notes +2, "CORE", NT_TASKSTRUCT, sizeof(*current), current); + numnote = 3; + + auxv = (elf_addr_t *) current->mm->saved_auxv; + + i = 0; + do + i += 2; + while (auxv[i - 2] != AT_NULL); + fill_note(¬es[numnote++], "CORE", NT_AUXV, + i * sizeof (elf_addr_t), auxv); + /* Try to dump the FPU. */ if ((prstatus->pr_fpvalid = elf_core_copy_task_fpregs(current, regs, fpu))) - fill_note(notes +3, "CORE", NT_PRFPREG, sizeof(*fpu), fpu); - else - --numnote; + fill_note(notes + numnote++, + "CORE", NT_PRFPREG, sizeof(*fpu), fpu); #ifdef ELF_CORE_COPY_XFPREGS if (elf_core_copy_task_xfpregs(current, xfpu)) - fill_note(notes +4, "LINUX", NT_PRXFPREG, sizeof(*xfpu), xfpu); - else - --numnote; -#else - numnote--; + fill_note(notes + numnote++, + "LINUX", NT_PRXFPREG, sizeof(*xfpu), xfpu); #endif fs = get_fs(); diff -Nru a/fs/block_dev.c b/fs/block_dev.c --- a/fs/block_dev.c Wed Oct 8 12:24:57 2003 +++ b/fs/block_dev.c Wed Oct 8 12:24:57 2003 @@ -70,6 +70,8 @@ return 0; } +EXPORT_SYMBOL(set_blocksize); + int sb_set_blocksize(struct super_block *sb, int size) { int bits; @@ -82,6 +84,8 @@ return sb->s_blocksize; } +EXPORT_SYMBOL(sb_set_blocksize); + int sb_min_blocksize(struct super_block *sb, int size) { int minsize = bdev_hardsect_size(sb->s_bdev); @@ -90,6 +94,8 @@ return sb_set_blocksize(sb, size); } +EXPORT_SYMBOL(sb_min_blocksize); + static int blkdev_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh, int create) @@ -358,6 +364,8 @@ return bdev; } +EXPORT_SYMBOL(bdget); + long nr_blockdev_pages(void) { struct list_head *p; @@ -376,6 +384,8 @@ { iput(bdev->bd_inode); } + +EXPORT_SYMBOL(bdput); int bd_acquire(struct inode *inode) { @@ -444,6 +454,8 @@ return res; } +EXPORT_SYMBOL(bd_claim); + void bd_release(struct block_device *bdev) { spin_lock(&bdev_lock); @@ -454,6 +466,8 @@ spin_unlock(&bdev_lock); } +EXPORT_SYMBOL(bd_release); + /* * Tries to open block device by device number. Use it ONLY if you * really do not have anything better - i.e. when you are behind a @@ -471,6 +485,8 @@ return err ? ERR_PTR(err) : bdev; } +EXPORT_SYMBOL(open_by_devnum); + /* * This routine checks whether a removable media has been changed, * and invalidates all buffer-cache-entries in that case. This @@ -500,6 +516,8 @@ return 1; } +EXPORT_SYMBOL(check_disk_change); + static void bd_set_size(struct block_device *bdev, loff_t size) { unsigned bsize = bdev_hardsect_size(bdev); @@ -632,6 +650,8 @@ return do_open(bdev, bdev->bd_inode, &fake_file); } +EXPORT_SYMBOL(blkdev_get); + int blkdev_open(struct inode * inode, struct file * filp) { struct block_device *bdev; @@ -662,6 +682,8 @@ return res; } +EXPORT_SYMBOL(blkdev_open); + int blkdev_put(struct block_device *bdev, int kind) { int ret = 0; @@ -710,6 +732,8 @@ return ret; } +EXPORT_SYMBOL(blkdev_put); + int blkdev_close(struct inode * inode, struct file * filp) { if (inode->i_bdev->bd_holder == filp) @@ -760,6 +784,8 @@ .sendfile = generic_file_sendfile, }; +EXPORT_SYMBOL(def_blk_fops); + int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) { int res; @@ -770,6 +796,8 @@ return res; } +EXPORT_SYMBOL(ioctl_by_bdev); + /** * lookup_bdev - lookup a struct block_device by name * @@ -854,6 +882,8 @@ return ERR_PTR(error); } +EXPORT_SYMBOL(open_bdev_excl); + /** * close_bdev_excl - release a blockdevice openen by open_bdev_excl() * @@ -867,3 +897,5 @@ bd_release(bdev); blkdev_put(bdev, kind); } + +EXPORT_SYMBOL(close_bdev_excl); diff -Nru a/fs/buffer.c b/fs/buffer.c --- a/fs/buffer.c Wed Oct 8 12:24:57 2003 +++ b/fs/buffer.c Wed Oct 8 12:24:57 2003 @@ -3035,3 +3035,31 @@ (void *)(long)smp_processor_id()); register_cpu_notifier(&buffer_nb); } + +EXPORT_SYMBOL(__bforget); +EXPORT_SYMBOL(__brelse); +EXPORT_SYMBOL(__wait_on_buffer); +EXPORT_SYMBOL(block_commit_write); +EXPORT_SYMBOL(block_prepare_write); +EXPORT_SYMBOL(block_read_full_page); +EXPORT_SYMBOL(block_sync_page); +EXPORT_SYMBOL(block_truncate_page); +EXPORT_SYMBOL(block_write_full_page); +EXPORT_SYMBOL(buffer_insert_list); +EXPORT_SYMBOL(cont_prepare_write); +EXPORT_SYMBOL(end_buffer_async_write); +EXPORT_SYMBOL(end_buffer_read_sync); +EXPORT_SYMBOL(end_buffer_write_sync); +EXPORT_SYMBOL(file_fsync); +EXPORT_SYMBOL(fsync_bdev); +EXPORT_SYMBOL(fsync_buffers_list); +EXPORT_SYMBOL(generic_block_bmap); +EXPORT_SYMBOL(generic_commit_write); +EXPORT_SYMBOL(generic_cont_expand); +EXPORT_SYMBOL(init_buffer); +EXPORT_SYMBOL(invalidate_bdev); +EXPORT_SYMBOL(ll_rw_block); +EXPORT_SYMBOL(mark_buffer_dirty); +EXPORT_SYMBOL(submit_bh); +EXPORT_SYMBOL(sync_dirty_buffer); +EXPORT_SYMBOL(unlock_buffer); diff -Nru a/fs/compat_ioctl.c b/fs/compat_ioctl.c --- a/fs/compat_ioctl.c Wed Oct 8 12:24:57 2003 +++ b/fs/compat_ioctl.c Wed Oct 8 12:24:57 2003 @@ -106,6 +106,7 @@ #include #include #include +#include #undef INCLUDES #endif @@ -576,54 +577,45 @@ static int bond_ioctl(unsigned long fd, unsigned int cmd, unsigned long arg) { - struct ifreq ifr; + struct ifreq kifr; + struct ifreq *uifr; + struct ifreq32 *ifr32 = (struct ifreq32 *) arg; mm_segment_t old_fs; - int err, len; + int err; u32 data; - - if (copy_from_user(&ifr, (struct ifreq32 *)arg, sizeof(struct ifreq32))) - return -EFAULT; - ifr.ifr_data = (__kernel_caddr_t)get_zeroed_page(GFP_KERNEL); - if (!ifr.ifr_data) - return -EAGAIN; + void *datap; switch (cmd) { case SIOCBONDENSLAVE: case SIOCBONDRELEASE: case SIOCBONDSETHWADDR: case SIOCBONDCHANGEACTIVE: - len = IFNAMSIZ * sizeof(char); - break; + if (copy_from_user(&kifr, ifr32, sizeof(struct ifreq32))) + return -EFAULT; + + old_fs = get_fs(); + set_fs (KERNEL_DS); + err = sys_ioctl (fd, cmd, (unsigned long)&kifr); + set_fs (old_fs); + + return err; case SIOCBONDSLAVEINFOQUERY: - len = sizeof(struct ifslave); - break; case SIOCBONDINFOQUERY: - len = sizeof(struct ifbond); - break; - default: - err = -EINVAL; - goto out; - }; + uifr = compat_alloc_user_space(sizeof(*uifr)); + if (copy_in_user(&uifr->ifr_name, &ifr32->ifr_name, IFNAMSIZ)) + return -EFAULT; - __get_user(data, &(((struct ifreq32 *)arg)->ifr_ifru.ifru_data)); - if (copy_from_user(ifr.ifr_data, compat_ptr(data), len)) { - err = -EFAULT; - goto out; - } + if (get_user(data, &ifr32->ifr_ifru.ifru_data)) + return -EFAULT; - old_fs = get_fs(); - set_fs (KERNEL_DS); - err = sys_ioctl (fd, cmd, (unsigned long)&ifr); - set_fs (old_fs); - if (!err) { - len = copy_to_user(compat_ptr(data), ifr.ifr_data, len); - if (len) - err = -EFAULT; - } + datap = compat_ptr(data); + if (put_user(datap, &uifr->ifr_ifru.ifru_data)) + return -EFAULT; -out: - free_page((unsigned long)ifr.ifr_data); - return err; + return sys_ioctl (fd, cmd, (unsigned long)uifr); + default: + return -EINVAL; + }; } int siocdevprivate_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) @@ -1035,6 +1027,7 @@ return -EFAULT; } + sgio->dxferp = iov; return 0; } @@ -1581,7 +1574,7 @@ * To have permissions to do most of the vt ioctls, we either have * to be the owner of the tty, or super-user. */ - if (current->tty == tty || capable(CAP_SYS_ADMIN)) + if (process_tty(current) == tty || capable(CAP_SYS_ADMIN)) return 1; return 0; } @@ -2310,6 +2303,572 @@ return err; } +#define VFAT_IOCTL_READDIR_BOTH32 _IOR('r', 1, struct compat_dirent[2]) +#define VFAT_IOCTL_READDIR_SHORT32 _IOR('r', 2, struct compat_dirent[2]) + +static long +put_dirent32 (struct dirent *d, struct compat_dirent *d32) +{ + int ret; + + if ((ret = verify_area(VERIFY_WRITE, d32, + sizeof(struct compat_dirent)))) + return ret; + + __put_user(d->d_ino, &d32->d_ino); + __put_user(d->d_off, &d32->d_off); + __put_user(d->d_reclen, &d32->d_reclen); + __copy_to_user(d32->d_name, d->d_name, d->d_reclen); + return ret; +} + +static int vfat_ioctl32(unsigned fd, unsigned cmd, void *ptr) +{ + int ret; + mm_segment_t oldfs = get_fs(); + struct dirent d[2]; + + switch(cmd) + { + case VFAT_IOCTL_READDIR_BOTH32: + cmd = VFAT_IOCTL_READDIR_BOTH; + break; + case VFAT_IOCTL_READDIR_SHORT32: + cmd = VFAT_IOCTL_READDIR_SHORT; + break; + } + + set_fs(KERNEL_DS); + ret = sys_ioctl(fd,cmd,(unsigned long)&d); + set_fs(oldfs); + if (ret >= 0) { + ret |= put_dirent32(&d[0], (struct compat_dirent *)ptr); + ret |= put_dirent32(&d[1], ((struct compat_dirent *)ptr) + 1); + } + return ret; +} + +#define REISERFS_IOC_UNPACK32 _IOW(0xCD,1,int) + +static int reiserfs_ioctl32(unsigned fd, unsigned cmd, unsigned long ptr) +{ + if (cmd == REISERFS_IOC_UNPACK32) + cmd = REISERFS_IOC_UNPACK; + + return sys_ioctl(fd,cmd,ptr); +} + +struct raw32_config_request +{ + compat_int_t raw_minor; + __u64 block_major; + __u64 block_minor; +} __attribute__((packed)); + +static int get_raw32_request(struct raw_config_request *req, struct raw32_config_request *user_req) +{ + __u32 lo_maj, hi_maj, lo_min, hi_min; + int ret; + + if ((ret = verify_area(VERIFY_READ, user_req, + sizeof(struct raw32_config_request)))) + return ret; + + __get_user(req->raw_minor, &user_req->raw_minor); + __get_user(lo_maj, (__u32*)&user_req->block_major); + __get_user(hi_maj, ((__u32*)(&user_req->block_major) + 1)); + __get_user(lo_min, (__u32*)&user_req->block_minor); + __get_user(hi_min, ((__u32*)(&user_req->block_minor) + 1)); + + req->block_major = lo_maj | (((__u64)hi_maj) << 32); + req->block_minor = lo_min | (((__u64)lo_min) << 32); + + return ret; +} + +static int set_raw32_request(struct raw_config_request *req, struct raw32_config_request *user_req) +{ + int ret; + + if ((ret = verify_area(VERIFY_WRITE, user_req, + sizeof(struct raw32_config_request)))) + return ret; + + __put_user(req->raw_minor, &user_req->raw_minor); + __put_user((__u32)(req->block_major), (__u32*)&user_req->block_major); + __put_user((__u32)(req->block_major >> 32), ((__u32*)(&user_req->block_major) + 1)); + __put_user((__u32)(req->block_minor), (__u32*)&user_req->block_minor); + __put_user((__u32)(req->block_minor >> 32), ((__u32*)(&user_req->block_minor) + 1)); + + return ret; +} + +static int raw_ioctl(unsigned fd, unsigned cmd, void *ptr) +{ + int ret; + + switch (cmd) { + case RAW_SETBIND: + case RAW_GETBIND: { + struct raw_config_request req; + struct raw32_config_request *user_req = ptr; + mm_segment_t oldfs = get_fs(); + + if ((ret = get_raw32_request(&req, user_req))) + return ret; + + set_fs(KERNEL_DS); + ret = sys_ioctl(fd,cmd,(unsigned long)&req); + set_fs(oldfs); + + if ((!ret) && (cmd == RAW_GETBIND)) { + ret = set_raw32_request(&req, user_req); + } + break; + } + default: + ret = sys_ioctl(fd,cmd,(unsigned long)ptr); + break; + } + return ret; +} + +struct serial_struct32 { + compat_int_t type; + compat_int_t line; + compat_uint_t port; + compat_int_t irq; + compat_int_t flags; + compat_int_t xmit_fifo_size; + compat_int_t custom_divisor; + compat_int_t baud_base; + unsigned short close_delay; + char io_type; + char reserved_char[1]; + compat_int_t hub6; + unsigned short closing_wait; /* time to wait before closing */ + unsigned short closing_wait2; /* no longer used... */ + compat_uint_t iomem_base; + unsigned short iomem_reg_shift; + unsigned int port_high; + compat_int_t reserved[1]; +}; + +static int serial_struct_ioctl(unsigned fd, unsigned cmd, void *ptr) +{ + typedef struct serial_struct SS; + typedef struct serial_struct32 SS32; + struct serial_struct32 *ss32 = ptr; + int err; + struct serial_struct ss; + mm_segment_t oldseg = get_fs(); + __u32 udata; + + if (cmd == TIOCSSERIAL) { + if (verify_area(VERIFY_READ, ss32, sizeof(SS32))) + return -EFAULT; + __copy_from_user(&ss, ss32, offsetof(SS32, iomem_base)); + __get_user(udata, &ss32->iomem_base); + ss.iomem_base = compat_ptr(udata); + __get_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift); + __get_user(ss.port_high, &ss32->port_high); + ss.iomap_base = 0UL; + } + set_fs(KERNEL_DS); + err = sys_ioctl(fd,cmd,(unsigned long)(&ss)); + set_fs(oldseg); + if (cmd == TIOCGSERIAL && err >= 0) { + if (verify_area(VERIFY_WRITE, ss32, sizeof(SS32))) + return -EFAULT; + __copy_to_user(ss32,&ss,offsetof(SS32,iomem_base)); + __put_user((unsigned long)ss.iomem_base >> 32 ? + 0xffffffff : (unsigned)(unsigned long)ss.iomem_base, + &ss32->iomem_base); + __put_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift); + __put_user(ss.port_high, &ss32->port_high); + + } + return err; +} + +struct usbdevfs_ctrltransfer32 { + u8 bRequestType; + u8 bRequest; + u16 wValue; + u16 wIndex; + u16 wLength; + u32 timeout; /* in milliseconds */ + compat_caddr_t data; +}; + +#define USBDEVFS_CONTROL32 _IOWR('U', 0, struct usbdevfs_ctrltransfer32) + +static int do_usbdevfs_control(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct usbdevfs_ctrltransfer kctrl; + struct usbdevfs_ctrltransfer32 *uctrl; + mm_segment_t old_fs; + __u32 udata; + void *uptr, *kptr; + int err; + + uctrl = (struct usbdevfs_ctrltransfer32 *) arg; + + if (copy_from_user(&kctrl, uctrl, + (sizeof(struct usbdevfs_ctrltransfer32) - + sizeof(compat_caddr_t)))) + return -EFAULT; + + if (get_user(udata, &uctrl->data)) + return -EFAULT; + uptr = compat_ptr(udata); + /* In usbdevice_fs, it limits the control buffer to a page, + * for simplicity so do we. + */ + if (!uptr || kctrl.wLength > PAGE_SIZE) + return -EINVAL; + + kptr = (void *)__get_free_page(GFP_KERNEL); + + if ((kctrl.bRequestType & USB_DIR_IN) == 0) { + err = -EFAULT; + if (copy_from_user(kptr, uptr, kctrl.wLength)) + goto out; + } + + kctrl.data = kptr; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + err = sys_ioctl(fd, USBDEVFS_CONTROL, (unsigned long)&kctrl); + set_fs(old_fs); + + if (err >= 0 && + ((kctrl.bRequestType & USB_DIR_IN) != 0)) { + if (copy_to_user(uptr, kptr, kctrl.wLength)) + err = -EFAULT; + } + +out: + free_page((unsigned long) kptr); + return err; +} + + +struct usbdevfs_bulktransfer32 { + compat_uint_t ep; + compat_uint_t len; + compat_uint_t timeout; /* in milliseconds */ + compat_caddr_t data; +}; + +#define USBDEVFS_BULK32 _IOWR('U', 2, struct usbdevfs_bulktransfer32) + +static int do_usbdevfs_bulk(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct usbdevfs_bulktransfer kbulk; + struct usbdevfs_bulktransfer32 *ubulk; + mm_segment_t old_fs; + __u32 udata; + void *uptr, *kptr; + int err; + + ubulk = (struct usbdevfs_bulktransfer32 *) arg; + + if (get_user(kbulk.ep, &ubulk->ep) || + get_user(kbulk.len, &ubulk->len) || + get_user(kbulk.timeout, &ubulk->timeout) || + get_user(udata, &ubulk->data)) + return -EFAULT; + + uptr = compat_ptr(udata); + + /* In usbdevice_fs, it limits the control buffer to a page, + * for simplicity so do we. + */ + if (!uptr || kbulk.len > PAGE_SIZE) + return -EINVAL; + + kptr = (void *) __get_free_page(GFP_KERNEL); + + if ((kbulk.ep & 0x80) == 0) { + err = -EFAULT; + if (copy_from_user(kptr, uptr, kbulk.len)) + goto out; + } + + kbulk.data = kptr; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + err = sys_ioctl(fd, USBDEVFS_BULK, (unsigned long) &kbulk); + set_fs(old_fs); + + if (err >= 0 && + ((kbulk.ep & 0x80) != 0)) { + if (copy_to_user(uptr, kptr, kbulk.len)) + err = -EFAULT; + } + +out: + free_page((unsigned long) kptr); + return err; +} + +/* This needs more work before we can enable it. Unfortunately + * because of the fancy asynchronous way URB status/error is written + * back to userspace, we'll need to fiddle with USB devio internals + * and/or reimplement entirely the frontend of it ourselves. -DaveM + * + * The issue is: + * + * When an URB is submitted via usbdevicefs it is put onto an + * asynchronous queue. When the URB completes, it may be reaped + * via another ioctl. During this reaping the status is written + * back to userspace along with the length of the transfer. + * + * We must translate into 64-bit kernel types so we pass in a kernel + * space copy of the usbdevfs_urb structure. This would mean that we + * must do something to deal with the async entry reaping. First we + * have to deal somehow with this transitory memory we've allocated. + * This is problematic since there are many call sites from which the + * async entries can be destroyed (and thus when we'd need to free up + * this kernel memory). One of which is the close() op of usbdevicefs. + * To handle that we'd need to make our own file_operations struct which + * overrides usbdevicefs's release op with our own which runs usbdevicefs's + * real release op then frees up the kernel memory. + * + * But how to keep track of these kernel buffers? We'd need to either + * keep track of them in some table _or_ know about usbdevicefs internals + * (ie. the exact layout of its file private, which is actually defined + * in linux/usbdevice_fs.h, the layout of the async queues are private to + * devio.c) + * + * There is one possible other solution I considered, also involving knowledge + * of usbdevicefs internals: + * + * After an URB is submitted, we "fix up" the address back to the user + * space one. This would work if the status/length fields written back + * by the async URB completion lines up perfectly in the 32-bit type with + * the 64-bit kernel type. Unfortunately, it does not because the iso + * frame descriptors, at the end of the struct, can be written back. + * + * I think we'll just need to simply duplicate the devio URB engine here. + */ +#if 0 +struct usbdevfs_urb32 { + unsigned char type; + unsigned char endpoint; + compat_int_t status; + compat_uint_t flags; + compat_caddr_t buffer; + compat_int_t buffer_length; + compat_int_t actual_length; + compat_int_t start_frame; + compat_int_t number_of_packets; + compat_int_t error_count; + compat_uint_t signr; + compat_caddr_t usercontext; /* unused */ + struct usbdevfs_iso_packet_desc iso_frame_desc[0]; +}; + +#define USBDEVFS_SUBMITURB32 _IOR('U', 10, struct usbdevfs_urb32) + +static int get_urb32(struct usbdevfs_urb *kurb, + struct usbdevfs_urb32 *uurb) +{ + if (get_user(kurb->type, &uurb->type) || + __get_user(kurb->endpoint, &uurb->endpoint) || + __get_user(kurb->status, &uurb->status) || + __get_user(kurb->flags, &uurb->flags) || + __get_user(kurb->buffer_length, &uurb->buffer_length) || + __get_user(kurb->actual_length, &uurb->actual_length) || + __get_user(kurb->start_frame, &uurb->start_frame) || + __get_user(kurb->number_of_packets, &uurb->number_of_packets) || + __get_user(kurb->error_count, &uurb->error_count) || + __get_user(kurb->signr, &uurb->signr)) + return -EFAULT; + + kurb->usercontext = 0; /* unused currently */ + + return 0; +} + +/* Just put back the values which usbdevfs actually changes. */ +static int put_urb32(struct usbdevfs_urb *kurb, + struct usbdevfs_urb32 *uurb) +{ + if (put_user(kurb->status, &uurb->status) || + __put_user(kurb->actual_length, &uurb->actual_length) || + __put_user(kurb->error_count, &uurb->error_count)) + return -EFAULT; + + if (kurb->number_of_packets != 0) { + int i; + + for (i = 0; i < kurb->number_of_packets; i++) { + if (__put_user(kurb->iso_frame_desc[i].actual_length, + &uurb->iso_frame_desc[i].actual_length) || + __put_user(kurb->iso_frame_desc[i].status, + &uurb->iso_frame_desc[i].status)) + return -EFAULT; + } + } + + return 0; +} + +static int get_urb32_isoframes(struct usbdevfs_urb *kurb, + struct usbdevfs_urb32 *uurb) +{ + unsigned int totlen; + int i; + + if (kurb->type != USBDEVFS_URB_TYPE_ISO) { + kurb->number_of_packets = 0; + return 0; + } + + if (kurb->number_of_packets < 1 || + kurb->number_of_packets > 128) + return -EINVAL; + + if (copy_from_user(&kurb->iso_frame_desc[0], + &uurb->iso_frame_desc[0], + sizeof(struct usbdevfs_iso_packet_desc) * + kurb->number_of_packets)) + return -EFAULT; + + totlen = 0; + for (i = 0; i < kurb->number_of_packets; i++) { + unsigned int this_len; + + this_len = kurb->iso_frame_desc[i].length; + if (this_len > 1023) + return -EINVAL; + + totlen += this_len; + } + + if (totlen > 32768) + return -EINVAL; + + kurb->buffer_length = totlen; + + return 0; +} + +static int do_usbdevfs_urb(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct usbdevfs_urb *kurb; + struct usbdevfs_urb32 *uurb; + mm_segment_t old_fs; + __u32 udata; + void *uptr, *kptr; + unsigned int buflen; + int err; + + uurb = (struct usbdevfs_urb32 *) arg; + + err = -ENOMEM; + kurb = kmalloc(sizeof(struct usbdevfs_urb) + + (sizeof(struct usbdevfs_iso_packet_desc) * 128), + GFP_KERNEL); + if (!kurb) + goto out; + + err = -EFAULT; + if (get_urb32(kurb, uurb)) + goto out; + + err = get_urb32_isoframes(kurb, uurb); + if (err) + goto out; + + err = -EFAULT; + if (__get_user(udata, &uurb->buffer)) + goto out; + uptr = compat_ptr(udata); + + buflen = kurb->buffer_length; + err = verify_area(VERIFY_WRITE, uptr, buflen); + if (err) + goto out; + + + old_fs = get_fs(); + set_fs(KERNEL_DS); + err = sys_ioctl(fd, USBDEVFS_SUBMITURB, (unsigned long) kurb); + set_fs(old_fs); + + if (err >= 0) { + /* RED-PEN Shit, this doesn't work for async URBs :-( XXX */ + if (put_urb32(kurb, uurb)) { + err = -EFAULT; + } + } + +out: + kfree(kurb); + return err; +} +#endif + +#define USBDEVFS_REAPURB32 _IOW('U', 12, u32) +#define USBDEVFS_REAPURBNDELAY32 _IOW('U', 13, u32) + +static int do_usbdevfs_reapurb(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + mm_segment_t old_fs; + void *kptr; + int err; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + err = sys_ioctl(fd, + (cmd == USBDEVFS_REAPURB32 ? + USBDEVFS_REAPURB : + USBDEVFS_REAPURBNDELAY), + (unsigned long) &kptr); + set_fs(old_fs); + + if (err >= 0 && + put_user((u32)(u64)kptr, (u32 *)arg)) + err = -EFAULT; + + return err; +} + +struct usbdevfs_disconnectsignal32 { + compat_int_t signr; + compat_caddr_t context; +}; + +#define USBDEVFS_DISCSIGNAL32 _IOR('U', 14, struct usbdevfs_disconnectsignal32) + +static int do_usbdevfs_discsignal(unsigned int fd, unsigned int cmd, unsigned long arg) +{ + struct usbdevfs_disconnectsignal kdis; + struct usbdevfs_disconnectsignal32 *udis; + mm_segment_t old_fs; + u32 uctx; + int err; + + udis = (struct usbdevfs_disconnectsignal32 *) arg; + + if (get_user(kdis.signr, &udis->signr) || + __get_user(uctx, &udis->context)) + return -EFAULT; + + kdis.context = (void *) (long)uctx; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + err = sys_ioctl(fd, USBDEVFS_DISCSIGNAL, (unsigned long) &kdis); + set_fs(old_fs); + + return err; +} #undef CODE #endif @@ -2451,6 +3010,22 @@ HANDLE_IOCTL(BLKBSZGET_32, do_blkbszget) HANDLE_IOCTL(BLKBSZSET_32, do_blkbszset) HANDLE_IOCTL(BLKGETSIZE64_32, do_blkgetsize64) - +/* vfat */ +HANDLE_IOCTL(VFAT_IOCTL_READDIR_BOTH32, vfat_ioctl32) +HANDLE_IOCTL(VFAT_IOCTL_READDIR_SHORT32, vfat_ioctl32) +HANDLE_IOCTL(REISERFS_IOC_UNPACK32, reiserfs_ioctl32) +/* Raw devices */ +HANDLE_IOCTL(RAW_SETBIND, raw_ioctl) +HANDLE_IOCTL(RAW_GETBIND, raw_ioctl) +/* Serial */ +HANDLE_IOCTL(TIOCGSERIAL, serial_struct_ioctl) +HANDLE_IOCTL(TIOCSSERIAL, serial_struct_ioctl) +/* Usbdevfs */ +HANDLE_IOCTL(USBDEVFS_CONTROL32, do_usbdevfs_control) +HANDLE_IOCTL(USBDEVFS_BULK32, do_usbdevfs_bulk) +/*HANDLE_IOCTL(USBDEVFS_SUBMITURB32, do_usbdevfs_urb)*/ +HANDLE_IOCTL(USBDEVFS_REAPURB32, do_usbdevfs_reapurb) +HANDLE_IOCTL(USBDEVFS_REAPURBNDELAY32, do_usbdevfs_reapurb) +HANDLE_IOCTL(USBDEVFS_DISCSIGNAL32, do_usbdevfs_discsignal) #undef DECLARES #endif diff -Nru a/fs/dcache.c b/fs/dcache.c --- a/fs/dcache.c Wed Oct 8 12:24:55 2003 +++ b/fs/dcache.c Wed Oct 8 12:24:55 2003 @@ -35,6 +35,8 @@ spinlock_t dcache_lock __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED; seqlock_t rename_lock __cacheline_aligned_in_smp = SEQLOCK_UNLOCKED; +EXPORT_SYMBOL(dcache_lock); + static kmem_cache_t *dentry_cache; /* @@ -1639,3 +1641,27 @@ bdev_cache_init(); chrdev_init(); } + +EXPORT_SYMBOL(d_alloc); +EXPORT_SYMBOL(d_alloc_anon); +EXPORT_SYMBOL(d_alloc_root); +EXPORT_SYMBOL(d_delete); +EXPORT_SYMBOL(d_find_alias); +EXPORT_SYMBOL(d_instantiate); +EXPORT_SYMBOL(d_invalidate); +EXPORT_SYMBOL(d_lookup); +EXPORT_SYMBOL(d_move); +EXPORT_SYMBOL(d_path); +EXPORT_SYMBOL(d_prune_aliases); +EXPORT_SYMBOL(d_rehash); +EXPORT_SYMBOL(d_splice_alias); +EXPORT_SYMBOL(d_validate); +EXPORT_SYMBOL(dget_locked); +EXPORT_SYMBOL(dput); +EXPORT_SYMBOL(find_inode_number); +EXPORT_SYMBOL(have_submounts); +EXPORT_SYMBOL(is_subdir); +EXPORT_SYMBOL(names_cachep); +EXPORT_SYMBOL(shrink_dcache_anon); +EXPORT_SYMBOL(shrink_dcache_parent); +EXPORT_SYMBOL(shrink_dcache_sb); diff -Nru a/fs/devfs/base.c b/fs/devfs/base.c --- a/fs/devfs/base.c Wed Oct 8 12:24:56 2003 +++ b/fs/devfs/base.c Wed Oct 8 12:24:56 2003 @@ -973,8 +973,9 @@ /** * _devfs_alloc_entry - Allocate a devfs entry. - * @name: The name of the entry. - * @namelen: The number of characters in @name. + * @name: the name of the entry + * @namelen: the number of characters in @name + * @mode: the mode for the entry * * Allocate a devfs entry and returns a pointer to the entry on success, else * %NULL. diff -Nru a/fs/direct-io.c b/fs/direct-io.c --- a/fs/direct-io.c Wed Oct 8 12:24:57 2003 +++ b/fs/direct-io.c Wed Oct 8 12:24:57 2003 @@ -20,6 +20,7 @@ */ #include +#include #include #include #include @@ -1023,3 +1024,5 @@ out: return retval; } + +EXPORT_SYMBOL(blockdev_direct_IO); diff -Nru a/fs/dnotify.c b/fs/dnotify.c --- a/fs/dnotify.c Wed Oct 8 12:24:56 2003 +++ b/fs/dnotify.c Wed Oct 8 12:24:56 2003 @@ -14,6 +14,7 @@ * General Public License for more details. */ #include +#include #include #include #include @@ -139,6 +140,8 @@ redo_inode_mask(inode); write_unlock(&dn_lock); } + +EXPORT_SYMBOL(__inode_dir_notify); /* * This is hopelessly wrong, but unfixable without API changes. At diff -Nru a/fs/dquot.c b/fs/dquot.c --- a/fs/dquot.c Wed Oct 8 12:24:57 2003 +++ b/fs/dquot.c Wed Oct 8 12:24:57 2003 @@ -668,12 +668,12 @@ if (!need_print_warning(dquot) || (flag && test_and_set_bit(flag, &dquot->dq_flags))) return; - tty_write_message(current->tty, dquot->dq_sb->s_id); + tty_write_message(process_tty(current), dquot->dq_sb->s_id); if (warntype == ISOFTWARN || warntype == BSOFTWARN) - tty_write_message(current->tty, ": warning, "); + tty_write_message(process_tty(current), ": warning, "); else - tty_write_message(current->tty, ": write failed, "); - tty_write_message(current->tty, quotatypes[dquot->dq_type]); + tty_write_message(process_tty(current), ": write failed, "); + tty_write_message(process_tty(current), quotatypes[dquot->dq_type]); switch (warntype) { case IHARDWARN: msg = " file limit reached.\n"; @@ -694,7 +694,7 @@ msg = " block quota exceeded.\n"; break; } - tty_write_message(current->tty, msg); + tty_write_message(process_tty(current), msg); } static inline void flush_warnings(struct dquot **dquots, char *warntype) diff -Nru a/fs/efs/super.c b/fs/efs/super.c --- a/fs/efs/super.c Wed Oct 8 12:24:57 2003 +++ b/fs/efs/super.c Wed Oct 8 12:24:57 2003 @@ -218,7 +218,11 @@ memset(sb, 0, sizeof(struct efs_sb_info)); s->s_magic = EFS_SUPER_MAGIC; - sb_set_blocksize(s, EFS_BLOCKSIZE); + if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) { + printk(KERN_ERR "EFS: device does not support %d byte blocks\n", + EFS_BLOCKSIZE); + goto out_no_fs_ul; + } /* read the vh (volume header) block */ bh = sb_bread(s, 0); diff -Nru a/fs/exec.c b/fs/exec.c --- a/fs/exec.c Wed Oct 8 12:24:56 2003 +++ b/fs/exec.c Wed Oct 8 12:24:56 2003 @@ -83,6 +83,8 @@ return 0; } +EXPORT_SYMBOL(register_binfmt); + int unregister_binfmt(struct linux_binfmt * fmt) { struct linux_binfmt ** tmp = &formats; @@ -100,6 +102,8 @@ return -EINVAL; } +EXPORT_SYMBOL(unregister_binfmt); + static inline void put_binfmt(struct linux_binfmt * fmt) { module_put(fmt->module); @@ -281,6 +285,8 @@ return r; } +EXPORT_SYMBOL(copy_strings_kernel); + #ifdef CONFIG_MMU /* * This routine is used to map in a page into an address space: needed by @@ -443,6 +449,8 @@ return 0; } +EXPORT_SYMBOL(setup_arg_pages); + #define free_arg_pages(bprm) do { } while (0) #else @@ -493,6 +501,8 @@ goto out; } +EXPORT_SYMBOL(open_exec); + int kernel_read(struct file *file, unsigned long offset, char *addr, unsigned long count) { @@ -508,6 +518,8 @@ return result; } +EXPORT_SYMBOL(kernel_read); + static int exec_mmap(struct mm_struct *mm) { struct task_struct *tsk; @@ -584,6 +596,11 @@ newsig->group_stop_count = 0; newsig->curr_target = NULL; init_sigpending(&newsig->shared_pending); + + newsig->pgrp = oldsig->pgrp; + newsig->session = oldsig->session; + newsig->leader = oldsig->leader; + newsig->tty_old_pgrp = oldsig->tty_old_pgrp; } if (thread_group_empty(current)) @@ -822,6 +839,8 @@ return retval; } +EXPORT_SYMBOL(flush_old_exec); + /* * We mustn't allow tracing of suid binaries, unless * the tracer has the capability to trace anything.. @@ -878,6 +897,8 @@ return kernel_read(bprm->file,0,bprm->buf,BINPRM_BUF_SIZE); } +EXPORT_SYMBOL(prepare_binprm); + /* * This function is used to produce the new IDs and capabilities * from the old ones and the file's capabilities. @@ -918,6 +939,8 @@ security_bprm_compute_creds(bprm); } +EXPORT_SYMBOL(compute_creds); + void remove_arg_zero(struct linux_binprm *bprm) { if (bprm->argc) { @@ -942,6 +965,8 @@ } } +EXPORT_SYMBOL(remove_arg_zero); + /* * cycle the list of binary formats handler, until one recognizes the image */ @@ -1037,6 +1062,8 @@ return retval; } +EXPORT_SYMBOL(search_binary_handler); + /* * sys_execve() executes a new program. */ @@ -1133,6 +1160,8 @@ return retval; } +EXPORT_SYMBOL(do_execve); + int set_binfmt(struct linux_binfmt *new) { struct linux_binfmt *old = current->binfmt; @@ -1146,6 +1175,8 @@ module_put(old->module); return 0; } + +EXPORT_SYMBOL(set_binfmt); #define CORENAME_MAX_SIZE 64 diff -Nru a/fs/ext2/inode.c b/fs/ext2/inode.c --- a/fs/ext2/inode.c Wed Oct 8 12:24:55 2003 +++ b/fs/ext2/inode.c Wed Oct 8 12:24:55 2003 @@ -1228,6 +1228,7 @@ raw_inode->i_block[0] = 0; raw_inode->i_block[1] = cpu_to_le32(new_encode_dev(inode->i_rdev)); + raw_inode->i_block[2] = 0; } } else for (n = 0; n < EXT2_N_BLOCKS; n++) raw_inode->i_block[n] = ei->i_data[n]; diff -Nru a/fs/ext2/super.c b/fs/ext2/super.c --- a/fs/ext2/super.c Wed Oct 8 12:24:57 2003 +++ b/fs/ext2/super.c Wed Oct 8 12:24:57 2003 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -265,149 +266,157 @@ return sb_block; } -static int want_value(char *value, char *option) -{ - if (!value || !*value) { - printk(KERN_NOTICE "EXT2-fs: the %s option needs an argument\n", - option); - return -1; - } - return 0; -} - -static int want_null_value(char *value, char *option) -{ - if (*value) { - printk(KERN_NOTICE "EXT2-fs: Invalid %s argument: %s\n", - option, value); - return -1; - } - return 0; -} +enum { + Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid, + Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro, + Opt_nouid32, Opt_check, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov, Opt_nobh, + Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, + Opt_ignore, Opt_err, +}; -static int want_numeric(char *value, char *option, unsigned long *number) -{ - if (want_value(value, option)) - return -1; - *number = simple_strtoul(value, &value, 0); - if (want_null_value(value, option)) - return -1; - return 0; -} +static match_table_t tokens = { + {Opt_bsd_df, "bsddf"}, + {Opt_minix_df, "minixdf"}, + {Opt_grpid, "grpid"}, + {Opt_grpid, "bsdgroups"}, + {Opt_nogrpid, "nogrpid"}, + {Opt_nogrpid, "sysvgroups"}, + {Opt_resgid, "resgid=%u"}, + {Opt_resuid, "resuid=%u"}, + {Opt_sb, "sb=%u"}, + {Opt_err_cont, "errors=continue"}, + {Opt_err_panic, "errors=panic"}, + {Opt_err_ro, "errors=remount-ro"}, + {Opt_nouid32, "nouid32"}, + {Opt_nocheck, "check=none"}, + {Opt_nocheck, "nocheck"}, + {Opt_check, "check"}, + {Opt_debug, "debug"}, + {Opt_oldalloc, "oldalloc"}, + {Opt_orlov, "orlov"}, + {Opt_nobh, "nobh"}, + {Opt_user_xattr, "user_xattr"}, + {Opt_nouser_xattr, "nouser_xattr"}, + {Opt_acl, "acl"}, + {Opt_noacl, "noacl"}, + {Opt_ignore, "grpquota"}, + {Opt_ignore, "noquota"}, + {Opt_ignore, "quota"}, + {Opt_ignore, "usrquota"}, + {Opt_err, NULL} +}; -/* - * This function has been shamelessly adapted from the msdos fs - */ static int parse_options (char * options, struct ext2_sb_info *sbi) { - char * this_char; - char * value; + char * p; + substring_t args[MAX_OPT_ARGS]; + unsigned long kind = EXT2_MOUNT_ERRORS_CONT; + int option; if (!options) return 1; - while ((this_char = strsep (&options, ",")) != NULL) { - if (!*this_char) + + while ((p = strsep (&options, ",")) != NULL) { + int token; + if (!*p) continue; - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; + + token = match_token(p, tokens, args); + switch (token) { + case Opt_bsd_df: + clear_opt (sbi->s_mount_opt, MINIX_DF); + break; + case Opt_minix_df: + set_opt (sbi->s_mount_opt, MINIX_DF); + break; + case Opt_grpid: + set_opt (sbi->s_mount_opt, GRPID); + break; + case Opt_nogrpid: + clear_opt (sbi->s_mount_opt, GRPID); + break; + case Opt_resuid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_resuid = option; + break; + case Opt_resgid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_resgid = option; + break; + case Opt_sb: + /* handled by get_sb_block() instead of here */ + /* *sb_block = match_int(&args[0]); */ + break; + case Opt_err_panic: + kind = EXT2_MOUNT_ERRORS_PANIC; + break; + case Opt_err_ro: + kind = EXT2_MOUNT_ERRORS_RO; + break; + case Opt_err_cont: + kind = EXT2_MOUNT_ERRORS_CONT; + break; + case Opt_nouid32: + set_opt (sbi->s_mount_opt, NO_UID32); + break; + case Opt_check: +#ifdef CONFIG_EXT2_CHECK + set_opt (sbi->s_mount_opt, CHECK); +#else + printk("EXT2 Check option not supported\n"); +#endif + break; + case Opt_nocheck: + clear_opt (sbi->s_mount_opt, CHECK); + break; + case Opt_debug: + set_opt (sbi->s_mount_opt, DEBUG); + break; + case Opt_oldalloc: + set_opt (sbi->s_mount_opt, OLDALLOC); + break; + case Opt_orlov: + clear_opt (sbi->s_mount_opt, OLDALLOC); + break; + case Opt_nobh: + set_opt (sbi->s_mount_opt, NOBH); + break; #ifdef CONFIG_EXT2_FS_XATTR - if (!strcmp (this_char, "user_xattr")) + case Opt_user_xattr: set_opt (sbi->s_mount_opt, XATTR_USER); - else if (!strcmp (this_char, "nouser_xattr")) + break; + case Opt_nouser_xattr: clear_opt (sbi->s_mount_opt, XATTR_USER); - else + break; +#else + case Opt_user_xattr: + case Opt_nouser_xattr: + printk("EXT2 (no)user_xattr options not supported\n"); + break; #endif #ifdef CONFIG_EXT2_FS_POSIX_ACL - if (!strcmp(this_char, "acl")) + case Opt_acl: set_opt(sbi->s_mount_opt, POSIX_ACL); - else if (!strcmp(this_char, "noacl")) + break; + case Opt_noacl: clear_opt(sbi->s_mount_opt, POSIX_ACL); - else -#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (sbi->s_mount_opt, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { - set_opt (sbi->s_mount_opt, NO_UID32); - } - else if (!strcmp (this_char, "check")) { - if (!value || !*value || !strcmp (value, "none")) - clear_opt (sbi->s_mount_opt, CHECK); - else -#ifdef CONFIG_EXT2_CHECK - set_opt (sbi->s_mount_opt, CHECK); + break; #else - printk("EXT2 Check option not supported\n"); + case Opt_acl: + case Opt_noacl: + printk("EXT2 (no)acl options not supported\n"); + break; #endif - } - else if (!strcmp (this_char, "debug")) - set_opt (sbi->s_mount_opt, DEBUG); - else if (!strcmp (this_char, "errors")) { - if (!value || !*value) { - printk ("EXT2-fs: the errors option requires " - "an argument\n"); - return 0; - } - if (!strcmp (value, "continue")) { - clear_opt (sbi->s_mount_opt, ERRORS_RO); - clear_opt (sbi->s_mount_opt, ERRORS_PANIC); - set_opt (sbi->s_mount_opt, ERRORS_CONT); - } - else if (!strcmp (value, "remount-ro")) { - clear_opt (sbi->s_mount_opt, ERRORS_CONT); - clear_opt (sbi->s_mount_opt, ERRORS_PANIC); - set_opt (sbi->s_mount_opt, ERRORS_RO); - } - else if (!strcmp (value, "panic")) { - clear_opt (sbi->s_mount_opt, ERRORS_CONT); - clear_opt (sbi->s_mount_opt, ERRORS_RO); - set_opt (sbi->s_mount_opt, ERRORS_PANIC); - } - else { - printk ("EXT2-fs: Invalid errors option: %s\n", - value); - return 0; - } - } - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (sbi->s_mount_opt, GRPID); - else if (!strcmp (this_char, "minixdf")) - set_opt (sbi->s_mount_opt, MINIX_DF); - else if (!strcmp (this_char, "nocheck")) - clear_opt (sbi->s_mount_opt, CHECK); - else if (!strcmp (this_char, "nogrpid") || - !strcmp (this_char, "sysvgroups")) - clear_opt (sbi->s_mount_opt, GRPID); - else if (!strcmp (this_char, "resgid")) { - unsigned long v; - if (want_numeric(value, "resgid", &v)) - return 0; - sbi->s_resgid = v; - } - else if (!strcmp (this_char, "resuid")) { - unsigned long v; - if (want_numeric(value, "resuid", &v)) - return 0; - sbi->s_resuid = v; - } - else if (!strcmp (this_char, "oldalloc")) - set_opt (sbi->s_mount_opt, OLDALLOC); - else if (!strcmp (this_char, "orlov")) - clear_opt (sbi->s_mount_opt, OLDALLOC); - else if (!strcmp (this_char, "nobh")) - set_opt(sbi->s_mount_opt, NOBH); - /* Silently ignore the quota options */ - else if (!strcmp (this_char, "grpquota") - || !strcmp (this_char, "noquota") - || !strcmp (this_char, "quota") - || !strcmp (this_char, "usrquota")) - /* Don't do anything ;-) */ ; - else { - printk ("EXT2-fs: Unrecognized mount option %s\n", this_char); + case Opt_ignore: + break; + default: return 0; } } + sbi->s_mount_opt |= kind; return 1; } diff -Nru a/fs/ext3/file.c b/fs/ext3/file.c --- a/fs/ext3/file.c Wed Oct 8 12:24:57 2003 +++ b/fs/ext3/file.c Wed Oct 8 12:24:57 2003 @@ -47,7 +47,7 @@ * the caller didn't specify O_LARGEFILE. On 64bit systems we force * on this flag in sys_open. */ -static int ext3_open_file (struct inode * inode, struct file * filp) +static int ext3_open_file (struct inode *inode, struct file *filp) { if (!(filp->f_flags & O_LARGEFILE) && inode->i_size > 0x7FFFFFFFLL) @@ -56,7 +56,7 @@ } static ssize_t -ext3_file_write(struct kiocb *iocb, const char *buf, size_t count, loff_t pos) +ext3_file_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos) { struct file *file = iocb->ki_filp; struct inode *inode = file->f_dentry->d_inode; @@ -117,8 +117,8 @@ .llseek = generic_file_llseek, .read = do_sync_read, .write = do_sync_write, - .aio_read = generic_file_aio_read, - .aio_write = ext3_file_write, + .aio_read = generic_file_aio_read, + .aio_write = ext3_file_write, .readv = generic_file_readv, .writev = generic_file_writev, .ioctl = ext3_ioctl, diff -Nru a/fs/ext3/inode.c b/fs/ext3/inode.c --- a/fs/ext3/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/ext3/inode.c Wed Oct 8 12:24:57 2003 @@ -812,15 +812,17 @@ if (err == -EAGAIN) goto changed; - if (ext3_find_goal(inode, iblock, chain, partial, &goal) < 0) + down(&ei->truncate_sem); + if (ext3_find_goal(inode, iblock, chain, partial, &goal) < 0) { + up(&ei->truncate_sem); goto changed; + } left = (chain + depth) - partial; /* * Block out ext3_truncate while we alter the tree */ - down_read(&ei->truncate_sem); err = ext3_alloc_branch(handle, inode, left, goal, offsets+(partial-chain), partial); @@ -832,7 +834,7 @@ if (!err) err = ext3_splice_branch(handle, inode, iblock, chain, partial, left); - up_read(&ei->truncate_sem); + up(&ei->truncate_sem); if (err == -EAGAIN) goto changed; if (err) @@ -2205,7 +2207,7 @@ * From here we block out all ext3_get_block() callers who want to * modify the block allocation tree. */ - down_write(&ei->truncate_sem); + down(&ei->truncate_sem); if (n == 1) { /* direct blocks */ ext3_free_data(handle, inode, NULL, i_data+offsets[0], @@ -2269,7 +2271,7 @@ case EXT3_TIND_BLOCK: ; } - up_write(&ei->truncate_sem); + up(&ei->truncate_sem); inode->i_mtime = inode->i_ctime = CURRENT_TIME; ext3_mark_inode_dirty(handle, inode); @@ -2679,6 +2681,7 @@ raw_inode->i_block[0] = 0; raw_inode->i_block[1] = cpu_to_le32(new_encode_dev(inode->i_rdev)); + raw_inode->i_block[2] = 0; } } else for (block = 0; block < EXT3_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; diff -Nru a/fs/ext3/super.c b/fs/ext3/super.c --- a/fs/ext3/super.c Wed Oct 8 12:24:57 2003 +++ b/fs/ext3/super.c Wed Oct 8 12:24:57 2003 @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -459,7 +460,7 @@ #ifdef CONFIG_EXT3_FS_XATTR init_rwsem(&ei->xattr_sem); #endif - init_rwsem(&ei->truncate_sem); + init_MUTEX(&ei->truncate_sem); inode_init_once(&ei->vfs_inode); } } @@ -526,36 +527,54 @@ .get_parent = ext3_get_parent, }; +enum { + Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid, + Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro, + Opt_nouid32, Opt_check, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov, + Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl, Opt_noload, + Opt_commit, Opt_journal_update, Opt_journal_inum, + Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, + Opt_ignore, Opt_err, +}; -static int want_value(char *value, char *option) -{ - if (!value || !*value) { - printk(KERN_NOTICE "EXT3-fs: the %s option needs an argument\n", - option); - return -1; - } - return 0; -} - -static int want_null_value(char *value, char *option) -{ - if (*value) { - printk(KERN_NOTICE "EXT3-fs: Invalid %s argument: %s\n", - option, value); - return -1; - } - return 0; -} - -static int want_numeric(char *value, char *option, unsigned long *number) -{ - if (want_value(value, option)) - return -1; - *number = simple_strtoul(value, &value, 0); - if (want_null_value(value, option)) - return -1; - return 0; -} +static match_table_t tokens = { + {Opt_bsd_df, "bsddf"}, + {Opt_minix_df, "minixdf"}, + {Opt_grpid, "grpid"}, + {Opt_grpid, "bsdgroups"}, + {Opt_nogrpid, "nogrpid"}, + {Opt_nogrpid, "sysvgroups"}, + {Opt_resgid, "resgid=%u"}, + {Opt_resuid, "resuid=%u"}, + {Opt_sb, "sb=%u"}, + {Opt_err_cont, "errors=continue"}, + {Opt_err_panic, "errors=panic"}, + {Opt_err_ro, "errors=remount-ro"}, + {Opt_nouid32, "nouid32"}, + {Opt_nocheck, "nocheck"}, + {Opt_nocheck, "check=none"}, + {Opt_check, "check"}, + {Opt_debug, "debug"}, + {Opt_oldalloc, "oldalloc"}, + {Opt_orlov, "orlov"}, + {Opt_user_xattr, "user_xattr"}, + {Opt_nouser_xattr, "nouser_xattr"}, + {Opt_acl, "acl"}, + {Opt_noacl, "noacl"}, + {Opt_noload, "noload"}, + {Opt_commit, "commit=%u"}, + {Opt_journal_update, "journal=update"}, + {Opt_journal_inum, "journal=%u"}, + {Opt_abort, "abort"}, + {Opt_data_journal, "data=journal"}, + {Opt_data_ordered, "data=ordered"}, + {Opt_data_writeback, "data=writeback"}, + {Opt_ignore, "grpquota"}, + {Opt_ignore, "noquota"}, + {Opt_ignore, "quota"}, + {Opt_ignore, "usrquota"}, + {Opt_err, NULL} +}; static unsigned long get_sb_block(void **data) { @@ -577,175 +596,180 @@ return sb_block; } -/* - * This function has been shamelessly adapted from the msdos fs - */ static int parse_options (char * options, struct ext3_sb_info *sbi, unsigned long * inum, int is_remount) { - char * this_char; - char * value; + char * p; + substring_t args[MAX_OPT_ARGS]; + int data_opt = 0; + int option; if (!options) return 1; - while ((this_char = strsep (&options, ",")) != NULL) { - if (!*this_char) + + while ((p = strsep (&options, ",")) != NULL) { + int token; + if (!*p) continue; - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -#ifdef CONFIG_EXT3_FS_XATTR - if (!strcmp (this_char, "user_xattr")) - set_opt (sbi->s_mount_opt, XATTR_USER); - else if (!strcmp (this_char, "nouser_xattr")) - clear_opt (sbi->s_mount_opt, XATTR_USER); - else -#endif -#ifdef CONFIG_EXT3_FS_POSIX_ACL - if (!strcmp(this_char, "acl")) - set_opt (sbi->s_mount_opt, POSIX_ACL); - else if (!strcmp(this_char, "noacl")) - clear_opt (sbi->s_mount_opt, POSIX_ACL); - else -#endif - if (!strcmp (this_char, "bsddf")) + + token = match_token(p, tokens, args); + switch (token) { + case Opt_bsd_df: clear_opt (sbi->s_mount_opt, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { + break; + case Opt_minix_df: + set_opt (sbi->s_mount_opt, MINIX_DF); + break; + case Opt_grpid: + set_opt (sbi->s_mount_opt, GRPID); + break; + case Opt_nogrpid: + clear_opt (sbi->s_mount_opt, GRPID); + break; + case Opt_resuid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_resuid = option; + break; + case Opt_resgid: + if (match_int(&args[0], &option)) + return 0; + sbi->s_resgid = option; + break; + case Opt_sb: + /* handled by get_sb_block() instead of here */ + /* *sb_block = match_int(&args[0]); */ + break; + case Opt_err_panic: + clear_opt (sbi->s_mount_opt, ERRORS_CONT); + clear_opt (sbi->s_mount_opt, ERRORS_RO); + set_opt (sbi->s_mount_opt, ERRORS_PANIC); + break; + case Opt_err_ro: + clear_opt (sbi->s_mount_opt, ERRORS_CONT); + clear_opt (sbi->s_mount_opt, ERRORS_PANIC); + set_opt (sbi->s_mount_opt, ERRORS_RO); + break; + case Opt_err_cont: + clear_opt (sbi->s_mount_opt, ERRORS_RO); + clear_opt (sbi->s_mount_opt, ERRORS_PANIC); + set_opt (sbi->s_mount_opt, ERRORS_CONT); + break; + case Opt_nouid32: set_opt (sbi->s_mount_opt, NO_UID32); - } - else if (!strcmp (this_char, "abort")) - set_opt (sbi->s_mount_opt, ABORT); - else if (!strcmp (this_char, "check")) { - if (!value || !*value || !strcmp (value, "none")) - clear_opt (sbi->s_mount_opt, CHECK); - else + break; + case Opt_check: #ifdef CONFIG_EXT3_CHECK - set_opt (sbi->s_mount_opt, CHECK); + set_opt (sbi->s_mount_opt, CHECK); #else - printk(KERN_ERR - "EXT3 Check option not supported\n"); + printk(KERN_ERR + "EXT3 Check option not supported\n"); #endif - } - else if (!strcmp (this_char, "debug")) - set_opt (sbi->s_mount_opt, DEBUG); - else if (!strcmp (this_char, "errors")) { - if (want_value(value, "errors")) - return 0; - if (!strcmp (value, "continue")) { - clear_opt (sbi->s_mount_opt, ERRORS_RO); - clear_opt (sbi->s_mount_opt, ERRORS_PANIC); - set_opt (sbi->s_mount_opt, ERRORS_CONT); - } - else if (!strcmp (value, "remount-ro")) { - clear_opt (sbi->s_mount_opt, ERRORS_CONT); - clear_opt (sbi->s_mount_opt, ERRORS_PANIC); - set_opt (sbi->s_mount_opt, ERRORS_RO); - } - else if (!strcmp (value, "panic")) { - clear_opt (sbi->s_mount_opt, ERRORS_CONT); - clear_opt (sbi->s_mount_opt, ERRORS_RO); - set_opt (sbi->s_mount_opt, ERRORS_PANIC); - } - else { - printk (KERN_ERR - "EXT3-fs: Invalid errors option: %s\n", - value); - return 0; - } - } - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (sbi->s_mount_opt, GRPID); - else if (!strcmp (this_char, "minixdf")) - set_opt (sbi->s_mount_opt, MINIX_DF); - else if (!strcmp (this_char, "nocheck")) + break; + case Opt_nocheck: clear_opt (sbi->s_mount_opt, CHECK); - else if (!strcmp (this_char, "nogrpid") || - !strcmp (this_char, "sysvgroups")) - clear_opt (sbi->s_mount_opt, GRPID); - else if (!strcmp (this_char, "resgid")) { - unsigned long v; - if (want_numeric(value, "resgid", &v)) - return 0; - sbi->s_resgid = v; - } - else if (!strcmp (this_char, "resuid")) { - unsigned long v; - if (want_numeric(value, "resuid", &v)) - return 0; - sbi->s_resuid = v; - } - else if (!strcmp (this_char, "oldalloc")) + break; + case Opt_debug: + set_opt (sbi->s_mount_opt, DEBUG); + break; + case Opt_oldalloc: set_opt (sbi->s_mount_opt, OLDALLOC); - else if (!strcmp (this_char, "orlov")) + break; + case Opt_orlov: clear_opt (sbi->s_mount_opt, OLDALLOC); - /* Silently ignore the quota options */ - else if (!strcmp (this_char, "grpquota") - || !strcmp (this_char, "noquota") - || !strcmp (this_char, "quota") - || !strcmp (this_char, "usrquota")) - /* Don't do anything ;-) */ ; - else if (!strcmp (this_char, "journal")) { + break; +#ifdef CONFIG_EXT3_FS_XATTR + case Opt_user_xattr: + set_opt (sbi->s_mount_opt, XATTR_USER); + break; + case Opt_nouser_xattr: + clear_opt (sbi->s_mount_opt, XATTR_USER); + break; +#else + case Opt_user_xattr: + case Opt_nouser_xattr: + printk("EXT3 (no)user_xattr options not supported\n"); + break; +#endif +#ifdef CONFIG_EXT3_FS_POSIX_ACL + case Opt_acl: + set_opt(sbi->s_mount_opt, POSIX_ACL); + break; + case Opt_noacl: + clear_opt(sbi->s_mount_opt, POSIX_ACL); + break; +#else + case Opt_acl: + case Opt_noacl: + printk("EXT3 (no)acl options not supported\n"); + break; +#endif + case Opt_journal_update: /* @@@ FIXME */ /* Eventually we will want to be able to create - a journal file here. For now, only allow the - user to specify an existing inode to be the - journal file. */ + a journal file here. For now, only allow the + user to specify an existing inode to be the + journal file. */ if (is_remount) { printk(KERN_ERR "EXT3-fs: cannot specify " "journal on remount\n"); return 0; } - - if (want_value(value, "journal")) + set_opt (sbi->s_mount_opt, UPDATE_JOURNAL); + break; + case Opt_journal_inum: + if (is_remount) { + printk(KERN_ERR "EXT3-fs: cannot specify " + "journal on remount\n"); return 0; - if (!strcmp (value, "update")) - set_opt (sbi->s_mount_opt, UPDATE_JOURNAL); - else if (want_numeric(value, "journal", inum)) + } + if (match_int(&args[0], &option)) return 0; - } - else if (!strcmp (this_char, "noload")) + *inum = option; + break; + case Opt_noload: set_opt (sbi->s_mount_opt, NOLOAD); - else if (!strcmp (this_char, "data")) { - int data_opt = 0; - - if (want_value(value, "data")) + break; + case Opt_commit: + if (match_int(&args[0], &option)) return 0; - if (!strcmp (value, "journal")) - data_opt = EXT3_MOUNT_JOURNAL_DATA; - else if (!strcmp (value, "ordered")) - data_opt = EXT3_MOUNT_ORDERED_DATA; - else if (!strcmp (value, "writeback")) - data_opt = EXT3_MOUNT_WRITEBACK_DATA; - else { - printk (KERN_ERR - "EXT3-fs: Invalid data option: %s\n", - value); - return 0; - } + sbi->s_commit_interval = HZ * option; + break; + case Opt_data_journal: + data_opt = EXT3_MOUNT_JOURNAL_DATA; + goto datacheck; + case Opt_data_ordered: + data_opt = EXT3_MOUNT_ORDERED_DATA; + goto datacheck; + case Opt_data_writeback: + data_opt = EXT3_MOUNT_WRITEBACK_DATA; + datacheck: if (is_remount) { - if ((sbi->s_mount_opt & EXT3_MOUNT_DATA_FLAGS) != - data_opt) { + if ((sbi->s_mount_opt & EXT3_MOUNT_DATA_FLAGS) + != data_opt) { printk(KERN_ERR - "EXT3-fs: cannot change data " - "mode on remount\n"); + "EXT3-fs: cannot change data " + "mode on remount\n"); return 0; } } else { sbi->s_mount_opt &= ~EXT3_MOUNT_DATA_FLAGS; sbi->s_mount_opt |= data_opt; } - } else if (!strcmp (this_char, "commit")) { - unsigned long v; - if (want_numeric(value, "commit", &v)) - return 0; - sbi->s_commit_interval = (HZ * v); - } else { - printk (KERN_ERR - "EXT3-fs: Unrecognized mount option %s\n", - this_char); + break; + case Opt_abort: + set_opt(sbi->s_mount_opt, ABORT); + break; + case Opt_ignore: + break; + default: + printk (KERN_ERR + "EXT3-fs: Unrecognized mount option \"%s\" " + "or missing value\n", p); return 0; } } + return 1; } diff -Nru a/fs/ext3/symlink.c b/fs/ext3/symlink.c --- a/fs/ext3/symlink.c Wed Oct 8 12:24:56 2003 +++ b/fs/ext3/symlink.c Wed Oct 8 12:24:56 2003 @@ -22,7 +22,8 @@ #include #include "xattr.h" -static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) +static int +ext3_readlink(struct dentry *dentry, char __user *buffer, int buflen) { struct ext3_inode_info *ei = EXT3_I(dentry->d_inode); return vfs_readlink(dentry, buffer, buflen, (char*)ei->i_data); diff -Nru a/fs/fat/dir.c b/fs/fat/dir.c --- a/fs/fat/dir.c Wed Oct 8 12:24:55 2003 +++ b/fs/fat/dir.c Wed Oct 8 12:24:55 2003 @@ -663,7 +663,7 @@ return -EINVAL; } - d1 = (struct dirent *)arg; + d1 = (struct dirent __user *)arg; if (!access_ok(VERIFY_WRITE, d1, sizeof(struct dirent[2]))) return -EFAULT; /* diff -Nru a/fs/fat/inode.c b/fs/fat/inode.c --- a/fs/fat/inode.c Wed Oct 8 12:24:56 2003 +++ b/fs/fat/inode.c Wed Oct 8 12:24:56 2003 @@ -20,6 +20,7 @@ #include #include #include +#include #include /* @@ -183,20 +184,6 @@ kfree(sbi); } -static int simple_getbool(char *s, int *setval) -{ - if (s) { - if (!strcmp(s,"1") || !strcmp(s,"yes") || !strcmp(s,"true")) - *setval = 1; - else if (!strcmp(s,"0") || !strcmp(s,"no") || !strcmp(s,"false")) - *setval = 0; - else - return 0; - } else - *setval = 1; - return 1; -} - static int fat_show_options(struct seq_file *m, struct vfsmount *mnt) { struct msdos_sb_info *sbi = MSDOS_SB(mnt->mnt_sb); @@ -259,11 +246,91 @@ return 0; } +enum { + Opt_check_n, Opt_check_r, Opt_check_s, Opt_uid, Opt_gid, + Opt_umask, Opt_dmask, Opt_fmask, Opt_codepage, Opt_nocase, + Opt_quiet, Opt_showexec, Opt_debug, Opt_immutable, + Opt_dots, Opt_nodots, + Opt_charset, Opt_shortname_lower, Opt_shortname_win95, + Opt_shortname_winnt, Opt_shortname_mixed, Opt_utf8_no, Opt_utf8_yes, + Opt_uni_xl_no, Opt_uni_xl_yes, Opt_nonumtail_no, Opt_nonumtail_yes, + Opt_obsolate, Opt_err, +}; + +static match_table_t fat_tokens = { + {Opt_check_r, "check=relaxed"}, + {Opt_check_s, "check=strict"}, + {Opt_check_n, "check=normal"}, + {Opt_check_r, "check=r"}, + {Opt_check_s, "check=s"}, + {Opt_check_n, "check=n"}, + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_umask, "umask=%o"}, + {Opt_dmask, "dmask=%o"}, + {Opt_fmask, "fmask=%o"}, + {Opt_codepage, "codepage=%u"}, + {Opt_nocase, "nocase"}, + {Opt_quiet, "quiet"}, + {Opt_showexec, "showexec"}, + {Opt_debug, "debug"}, + {Opt_immutable, "sys_immutable"}, + {Opt_obsolate, "conv=binary"}, + {Opt_obsolate, "conv=text"}, + {Opt_obsolate, "conv=auto"}, + {Opt_obsolate, "conv=b"}, + {Opt_obsolate, "conv=t"}, + {Opt_obsolate, "conv=a"}, + {Opt_obsolate, "fat=%u"}, + {Opt_obsolate, "blocksize=%u"}, + {Opt_obsolate, "cvf_format=%20s"}, + {Opt_obsolate, "cvf_options=%100s"}, + {Opt_obsolate, "posix"}, + {Opt_err, NULL} +}; +static match_table_t msdos_tokens = { + {Opt_nodots, "nodots"}, + {Opt_nodots, "dotsOK=no"}, + {Opt_dots, "dots"}, + {Opt_dots, "dotsOK=yes"}, + {Opt_err, NULL} +}; +static match_table_t vfat_tokens = { + {Opt_charset, "iocharset=%s"}, + {Opt_shortname_lower, "shortname=lower"}, + {Opt_shortname_win95, "shortname=win95"}, + {Opt_shortname_winnt, "shortname=winnt"}, + {Opt_shortname_mixed, "shortname=mixed"}, + {Opt_utf8_no, "utf8=0"}, /* 0 or no or false */ + {Opt_utf8_no, "utf8=no"}, + {Opt_utf8_no, "utf8=false"}, + {Opt_utf8_yes, "utf8=1"}, /* empty or 1 or yes or true */ + {Opt_utf8_yes, "utf8=yes"}, + {Opt_utf8_yes, "utf8=true"}, + {Opt_utf8_yes, "utf8"}, + {Opt_uni_xl_no, "uni_xlate=0"}, /* 0 or no or false */ + {Opt_uni_xl_no, "uni_xlate=no"}, + {Opt_uni_xl_no, "uni_xlate=false"}, + {Opt_uni_xl_yes, "uni_xlate=1"}, /* empty or 1 or yes or true */ + {Opt_uni_xl_yes, "uni_xlate=yes"}, + {Opt_uni_xl_yes, "uni_xlate=true"}, + {Opt_uni_xl_yes, "uni_xlate"}, + {Opt_nonumtail_no, "nonumtail=0"}, /* 0 or no or false */ + {Opt_nonumtail_no, "nonumtail=no"}, + {Opt_nonumtail_no, "nonumtail=false"}, + {Opt_nonumtail_yes, "nonumtail=1"}, /* empty or 1 or yes or true */ + {Opt_nonumtail_yes, "nonumtail=yes"}, + {Opt_nonumtail_yes, "nonumtail=true"}, + {Opt_nonumtail_yes, "nonumtail"}, + {Opt_err, NULL} +}; + static int parse_options(char *options, int is_vfat, int *debug, struct fat_mount_options *opts) { - char *this_char, *value, *p; - int ret = 1, val, len; + char *p; + substring_t args[MAX_OPT_ARGS]; + int option; opts->isvfat = is_vfat; @@ -284,183 +351,149 @@ *debug = 0; if (!options) - goto out; - while ((this_char = strsep(&options,",")) != NULL) { - if (!*this_char) + return 1; + + while ((p = strsep(&options, ",")) != NULL) { + int token; + if (!*p) continue; - if ((value = strchr(this_char,'=')) != NULL) - *value++ = 0; - if (!strcmp(this_char,"check") && value) { - if (value[0] && !value[1] && strchr("rns",*value)) - opts->name_check = *value; - else if (!strcmp(value,"relaxed")) - opts->name_check = 'r'; - else if (!strcmp(value,"normal")) - opts->name_check = 'n'; - else if (!strcmp(value,"strict")) - opts->name_check = 's'; - else ret = 0; - } - else if (!strcmp(this_char,"conv") && value) { - printk(KERN_INFO "FAT: conv option is obsolete, " - "not supported now\n"); + token = match_token(p, fat_tokens, args); + if (token == Opt_err) { + if (is_vfat) + token = match_token(p, vfat_tokens, args); + else + token = match_token(p, msdos_tokens, args); } - else if (!strcmp(this_char,"nocase")) { + switch (token) { + case Opt_check_s: + opts->name_check = 's'; + break; + case Opt_check_r: + opts->name_check = 'r'; + break; + case Opt_check_n: + opts->name_check = 'n'; + break; + case Opt_nocase: if (!is_vfat) opts->nocase = 1; else { - /* for backward compatible */ + /* for backward compatibility */ opts->shortname = VFAT_SFN_DISPLAY_WIN95 | VFAT_SFN_CREATE_WIN95; } - } - else if (!strcmp(this_char,"showexec")) { + break; + case Opt_quiet: + opts->quiet = 1; + break; + case Opt_showexec: opts->showexec = 1; - } - else if (!strcmp(this_char,"uid")) { - if (!value || !*value) ret = 0; - else { - opts->fs_uid = simple_strtoul(value,&value,0); - if (*value) ret = 0; - } - } - else if (!strcmp(this_char,"gid")) { - if (!value || !*value) ret= 0; - else { - opts->fs_gid = simple_strtoul(value,&value,0); - if (*value) ret = 0; - } - } - else if (!strcmp(this_char,"umask")) { - if (!value || !*value) ret = 0; - else { - opts->fs_fmask = opts->fs_dmask = - simple_strtoul(value,&value,8); - if (*value) ret = 0; - } - } - else if (!strcmp(this_char,"fmask")) { - if (!value || !*value) ret = 0; - else { - opts->fs_fmask = simple_strtoul(value,&value,8); - if (*value) ret = 0; - } - } - else if (!strcmp(this_char,"dmask")) { - if (!value || !*value) ret = 0; - else { - opts->fs_dmask = simple_strtoul(value,&value,8); - if (*value) ret = 0; - } - } - else if (!strcmp(this_char,"debug")) { - if (value) ret = 0; - else *debug = 1; - } - else if (!strcmp(this_char,"fat")) { - printk(KERN_INFO "FAT: fat option is obsolete, " - "not supported now\n"); - } - else if (!strcmp(this_char,"quiet")) { - if (value) ret = 0; - else opts->quiet = 1; - } - else if (!strcmp(this_char,"blocksize")) { - printk(KERN_INFO "FAT: blocksize option is obsolete, " - "not supported now\n"); - } - else if (!strcmp(this_char,"sys_immutable")) { - if (value) ret = 0; - else opts->sys_immutable = 1; - } - else if (!strcmp(this_char,"codepage") && value) { - opts->codepage = simple_strtoul(value,&value,0); - if (*value) ret = 0; - } + break; + case Opt_debug: + *debug = 1; + break; + case Opt_immutable: + opts->sys_immutable = 1; + break; + case Opt_uid: + if (match_int(&args[0], &option)) + return 0; + opts->fs_uid = option; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + opts->fs_gid = option; + break; + case Opt_umask: + if (match_octal(&args[0], &option)) + return 0; + opts->fs_fmask = opts->fs_dmask = option; + break; + case Opt_dmask: + if (match_octal(&args[0], &option)) + return 0; + opts->fs_dmask = option; + break; + case Opt_fmask: + if (match_octal(&args[0], &option)) + return 0; + opts->fs_fmask = option; + break; + case Opt_codepage: + if (match_int(&args[0], &option)) + return 0; + opts->codepage = option; + break; /* msdos specific */ - else if (!is_vfat && !strcmp(this_char,"dots")) { + case Opt_dots: opts->dotsOK = 1; - } - else if (!is_vfat && !strcmp(this_char,"nodots")) { + break; + case Opt_nodots: opts->dotsOK = 0; - } - else if (!is_vfat && !strcmp(this_char,"dotsOK") && value) { - if (!strcmp(value,"yes")) opts->dotsOK = 1; - else if (!strcmp(value,"no")) opts->dotsOK = 0; - else ret = 0; - } + break; /* vfat specific */ - else if (is_vfat && !strcmp(this_char,"iocharset") && value) { - p = value; - while (*value && *value != ',') - value++; - len = value - p; - if (len) { - char *buffer; - - if (opts->iocharset != NULL) { - kfree(opts->iocharset); - opts->iocharset = NULL; - } - buffer = kmalloc(len + 1, GFP_KERNEL); - if (buffer != NULL) { - opts->iocharset = buffer; - memcpy(buffer, p, len); - buffer[len] = 0; - } else - ret = 0; - } - } - else if (is_vfat && !strcmp(this_char,"utf8")) { - ret = simple_getbool(value, &val); - if (ret) opts->utf8 = val; - } - else if (is_vfat && !strcmp(this_char,"uni_xlate")) { - ret = simple_getbool(value, &val); - if (ret) opts->unicode_xlate = val; - } - else if (is_vfat && !strcmp(this_char,"posix")) { - printk(KERN_INFO "FAT: posix option is obsolete, " - "not supported now\n"); - } - else if (is_vfat && !strcmp(this_char,"nonumtail")) { - ret = simple_getbool(value, &val); - if (ret) { - opts->numtail = !val; - } - } - else if (is_vfat && !strcmp(this_char, "shortname")) { - if (!strcmp(value, "lower")) - opts->shortname = VFAT_SFN_DISPLAY_LOWER - | VFAT_SFN_CREATE_WIN95; - else if (!strcmp(value, "win95")) - opts->shortname = VFAT_SFN_DISPLAY_WIN95 - | VFAT_SFN_CREATE_WIN95; - else if (!strcmp(value, "winnt")) - opts->shortname = VFAT_SFN_DISPLAY_WINNT - | VFAT_SFN_CREATE_WINNT; - else if (!strcmp(value, "mixed")) - opts->shortname = VFAT_SFN_DISPLAY_WINNT - | VFAT_SFN_CREATE_WIN95; - else - ret = 0; - } else { - printk(KERN_ERR "FAT: Unrecognized mount option %s\n", - this_char); - ret = 0; - } + case Opt_charset: + kfree(opts->iocharset); + opts->iocharset = match_strdup(&args[0]); + if (!opts->iocharset) + return 0; + break; + case Opt_shortname_lower: + opts->shortname = VFAT_SFN_DISPLAY_LOWER + | VFAT_SFN_CREATE_WIN95; + break; + case Opt_shortname_win95: + opts->shortname = VFAT_SFN_DISPLAY_WIN95 + | VFAT_SFN_CREATE_WIN95; + break; + case Opt_shortname_winnt: + opts->shortname = VFAT_SFN_DISPLAY_WINNT + | VFAT_SFN_CREATE_WINNT; + break; + case Opt_shortname_mixed: + opts->shortname = VFAT_SFN_DISPLAY_WINNT + | VFAT_SFN_CREATE_WIN95; + break; + case Opt_utf8_no: /* 0 or no or false */ + opts->utf8 = 0; + break; + case Opt_utf8_yes: /* empty or 1 or yes or true */ + opts->utf8 = 1; + break; + case Opt_uni_xl_no: /* 0 or no or false */ + opts->unicode_xlate = 0; + break; + case Opt_uni_xl_yes: /* empty or 1 or yes or true */ + opts->unicode_xlate = 1; + break; + case Opt_nonumtail_no: /* 0 or no or false */ + opts->numtail = 1; /* negated option */ + break; + case Opt_nonumtail_yes: /* empty or 1 or yes or true */ + opts->numtail = 0; /* negated option */ + break; - if (ret == 0) + /* obsolete mount options */ + case Opt_obsolate: + printk(KERN_INFO "FAT: \"%s\" option is obsolete, " + "not supported now\n", p); break; + /* unknown option */ + default: + printk(KERN_ERR "FAT: Unrecognized mount option \"%s\" " + "or missing value\n", p); + return 0; + } } -out: + if (opts->unicode_xlate) opts->utf8 = 0; - return ret; + return 1; } static int fat_calc_dir_size(struct inode *inode) diff -Nru a/fs/fcntl.c b/fs/fcntl.c --- a/fs/fcntl.c Wed Oct 8 12:24:57 2003 +++ b/fs/fcntl.c Wed Oct 8 12:24:57 2003 @@ -273,11 +273,15 @@ return 0; } +EXPORT_SYMBOL(f_setown); + void f_delown(struct file *filp) { f_modown(filp, 0, 0, 0, 1); } +EXPORT_SYMBOL(f_delown); + static long do_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg, struct file * filp) { @@ -580,6 +584,8 @@ return result; } +EXPORT_SYMBOL(fasync_helper); + void __kill_fasync(struct fasync_struct *fa, int sig, int band) { while (fa) { @@ -599,6 +605,8 @@ } } +EXPORT_SYMBOL(__kill_fasync); + void kill_fasync(struct fasync_struct **fp, int sig, int band) { read_lock(&fasync_lock); @@ -606,6 +614,8 @@ read_unlock(&fasync_lock); } +EXPORT_SYMBOL(kill_fasync); + static int __init fasync_init(void) { fasync_cache = kmem_cache_create("fasync_cache", @@ -616,6 +626,3 @@ } module_init(fasync_init) - -EXPORT_SYMBOL(f_setown); -EXPORT_SYMBOL(f_delown); diff -Nru a/fs/file_table.c b/fs/file_table.c --- a/fs/file_table.c Wed Oct 8 12:24:55 2003 +++ b/fs/file_table.c Wed Oct 8 12:24:55 2003 @@ -22,9 +22,13 @@ .max_files = NR_FILE }; +EXPORT_SYMBOL(files_stat); /* Needed by unix.o */ + /* public *and* exported. Not pretty! */ spinlock_t __cacheline_aligned_in_smp files_lock = SPIN_LOCK_UNLOCKED; +EXPORT_SYMBOL(files_lock); + static spinlock_t filp_count_lock = SPIN_LOCK_UNLOCKED; /* slab constructors and destructors are called from arbitrary @@ -100,6 +104,8 @@ return NULL; } +EXPORT_SYMBOL(get_empty_filp); + /* * Clear and initialize a (private) struct file for the given dentry, * allocate the security structure, and call the open function (if any). @@ -128,6 +134,8 @@ return error; } +EXPORT_SYMBOL(open_private_file); + /* * Release a private file by calling the release function (if any) and * freeing the security structure. @@ -141,12 +149,16 @@ security_file_free(file); } +EXPORT_SYMBOL(close_private_file); + void fput(struct file *file) { if (atomic_dec_and_test(&file->f_count)) __fput(file); } +EXPORT_SYMBOL(fput); + /* __fput is called from task context when aio completion releases the last * last use of a struct file *. Do not use otherwise. */ @@ -192,6 +204,8 @@ return file; } +EXPORT_SYMBOL(fget); + /* * Lightweight file lookup - no refcnt increment if fd table isn't shared. * You can use this only if it is guranteed that the current task already @@ -229,6 +243,8 @@ } } +EXPORT_SYMBOL(put_filp); + void file_move(struct file *file, struct list_head *list) { if (!list) @@ -284,4 +300,3 @@ if (files_stat.max_files < NR_FILE) files_stat.max_files = NR_FILE; } - diff -Nru a/fs/filesystems.c b/fs/filesystems.c --- a/fs/filesystems.c Wed Oct 8 12:24:57 2003 +++ b/fs/filesystems.c Wed Oct 8 12:24:57 2003 @@ -82,6 +82,8 @@ return res; } +EXPORT_SYMBOL(register_filesystem); + /** * unregister_filesystem - unregister a file system * @fs: filesystem to unregister @@ -113,6 +115,8 @@ return -EINVAL; } +EXPORT_SYMBOL(unregister_filesystem); + static int fs_index(const char __user * __name) { struct file_system_type * tmp; @@ -227,3 +231,5 @@ } return fs; } + +EXPORT_SYMBOL(get_fs_type); diff -Nru a/fs/freevxfs/vxfs_immed.c b/fs/freevxfs/vxfs_immed.c --- a/fs/freevxfs/vxfs_immed.c Wed Oct 8 12:24:57 2003 +++ b/fs/freevxfs/vxfs_immed.c Wed Oct 8 12:24:57 2003 @@ -39,7 +39,7 @@ #include "vxfs_inode.h" -static int vxfs_immed_readlink(struct dentry *, char *, int); +static int vxfs_immed_readlink(struct dentry *, char __user *, int); static int vxfs_immed_follow_link(struct dentry *, struct nameidata *); static int vxfs_immed_readpage(struct file *, struct page *); @@ -77,7 +77,7 @@ * Number of bytes successfully copied to userspace. */ static int -vxfs_immed_readlink(struct dentry *dp, char *bp, int buflen) +vxfs_immed_readlink(struct dentry *dp, char __user *bp, int buflen) { struct vxfs_inode_info *vip = VXFS_INO(dp->d_inode); diff -Nru a/fs/freevxfs/vxfs_olt.c b/fs/freevxfs/vxfs_olt.c --- a/fs/freevxfs/vxfs_olt.c Wed Oct 8 12:24:57 2003 +++ b/fs/freevxfs/vxfs_olt.c Wed Oct 8 12:24:57 2003 @@ -102,7 +102,7 @@ */ if (infp->vsi_oltsize > 1) { printk(KERN_NOTICE "vxfs: oltsize > 1 detected.\n"); - printk(KERN_NOTICE "vxfs: please notify hch@caldera.de\n"); + printk(KERN_NOTICE "vxfs: please notify hch@infradead.org\n"); goto fail; } diff -Nru a/fs/fs-writeback.c b/fs/fs-writeback.c --- a/fs/fs-writeback.c Wed Oct 8 12:24:57 2003 +++ b/fs/fs-writeback.c Wed Oct 8 12:24:57 2003 @@ -107,6 +107,8 @@ spin_unlock(&inode_lock); } +EXPORT_SYMBOL(__mark_inode_dirty); + static void write_inode(struct inode *inode, int sync) { if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode)) @@ -494,6 +496,8 @@ wait_on_inode(inode); } +EXPORT_SYMBOL(write_inode_now); + /** * generic_osync_inode - flush all dirty data for a given inode to disk * @inode: inode to write @@ -544,6 +548,8 @@ return err; } + +EXPORT_SYMBOL(generic_osync_inode); /** * writeback_acquire: attempt to get exclusive writeback access to a device diff -Nru a/fs/hfs/INSTALL.txt b/fs/hfs/INSTALL.txt --- a/fs/hfs/INSTALL.txt Wed Oct 8 12:24:56 2003 +++ b/fs/hfs/INSTALL.txt Wed Oct 8 12:24:56 2003 @@ -15,9 +15,7 @@ +o The kernel sources (or at least the header files) available online. +o The module utilities package current for your kernel version and an - understanding of how to use it. (The file - Documentation/modules.txt in the kernel source directory provides a - brief introduction.) + understanding of how to use it. 22.. IInnssttaallllaattiioonn diff -Nru a/fs/hfs/file.c b/fs/hfs/file.c --- a/fs/hfs/file.c Wed Oct 8 12:24:56 2003 +++ b/fs/hfs/file.c Wed Oct 8 12:24:56 2003 @@ -25,10 +25,10 @@ /*================ Forward declarations ================*/ -static hfs_rwret_t hfs_file_read(struct file *, char *, hfs_rwarg_t, +static hfs_rwret_t hfs_file_read(struct file *, char __user *, hfs_rwarg_t, loff_t *); -static hfs_rwret_t hfs_file_write(struct file *, const char *, hfs_rwarg_t, - loff_t *); +static hfs_rwret_t hfs_file_write(struct file *, const char __user *, + hfs_rwarg_t, loff_t *); static void hfs_file_truncate(struct inode *); /*================ Global variables ================*/ @@ -139,7 +139,7 @@ * user-space at the address 'buf'. Returns the number of bytes * successfully transferred. This function checks the arguments, does * some setup and then calls hfs_do_read() to do the actual transfer. */ -static hfs_rwret_t hfs_file_read(struct file * filp, char * buf, +static hfs_rwret_t hfs_file_read(struct file *filp, char __user *buf, hfs_rwarg_t count, loff_t *ppos) { struct inode *inode = filp->f_dentry->d_inode; @@ -181,7 +181,7 @@ * 'file->f_pos' from user-space at the address 'buf'. The return * value is the number of bytes actually transferred. */ -static hfs_rwret_t hfs_file_write(struct file * filp, const char * buf, +static hfs_rwret_t hfs_file_write(struct file *filp, const char __user *buf, hfs_rwarg_t count, loff_t *ppos) { struct inode *inode = filp->f_dentry->d_inode; @@ -242,7 +242,7 @@ * * Like copy_to_user() while translating CR->NL. */ -static inline void xlate_to_user(char *buf, const char *data, int count) +static inline void xlate_to_user(char __user *buf, const char *data, int count) { char ch; @@ -257,7 +257,8 @@ * * Like copy_from_user() while translating NL->CR; */ -static inline int xlate_from_user(char *data, const char *buf, int count) +static inline +int xlate_from_user(char *data, const char __user *buf, int count) { int i; @@ -290,8 +291,8 @@ * This is based on Linus's minix_file_read(). * It has been changed to take into account that HFS files have no holes. */ -hfs_s32 hfs_do_read(struct inode *inode, struct hfs_fork * fork, hfs_u32 pos, - char * buf, hfs_u32 count) +hfs_s32 hfs_do_read(struct inode *inode, struct hfs_fork *fork, hfs_u32 pos, + char __user *buf, hfs_u32 count) { hfs_s32 size, chars, offset, block, blocks, read = 0; int bhrequest, uptodate; @@ -436,8 +437,8 @@ * * This is just a minor edit of Linus's minix_file_write(). */ -hfs_s32 hfs_do_write(struct inode *inode, struct hfs_fork * fork, hfs_u32 pos, - const char * buf, hfs_u32 count) +hfs_s32 hfs_do_write(struct inode *inode, struct hfs_fork *fork, hfs_u32 pos, + const char __user *buf, hfs_u32 count) { hfs_s32 written, c; struct buffer_head * bh; diff -Nru a/fs/hfs/file_cap.c b/fs/hfs/file_cap.c --- a/fs/hfs/file_cap.c Wed Oct 8 12:24:56 2003 +++ b/fs/hfs/file_cap.c Wed Oct 8 12:24:56 2003 @@ -29,9 +29,9 @@ /*================ Forward declarations ================*/ static loff_t cap_info_llseek(struct file *, loff_t, int); -static hfs_rwret_t cap_info_read(struct file *, char *, +static hfs_rwret_t cap_info_read(struct file *, char __user *, hfs_rwarg_t, loff_t *); -static hfs_rwret_t cap_info_write(struct file *, const char *, +static hfs_rwret_t cap_info_write(struct file *, const char __user *, hfs_rwarg_t, loff_t *); /*================ Function-like macros ================*/ @@ -121,7 +121,7 @@ * 'file->f_pos' to user-space at the address 'buf'. The return value * is the number of bytes actually transferred. */ -static hfs_rwret_t cap_info_read(struct file *filp, char *buf, +static hfs_rwret_t cap_info_read(struct file *filp, char __user *buf, hfs_rwarg_t count, loff_t *ppos) { struct inode *inode = filp->f_dentry->d_inode; @@ -189,7 +189,7 @@ * '*ppos' from user-space at the address 'buf'. * The return value is the number of bytes actually transferred. */ -static hfs_rwret_t cap_info_write(struct file *filp, const char *buf, +static hfs_rwret_t cap_info_write(struct file *filp, const char __user *buf, hfs_rwarg_t count, loff_t *ppos) { struct inode *inode = filp->f_dentry->d_inode; diff -Nru a/fs/hfs/file_hdr.c b/fs/hfs/file_hdr.c --- a/fs/hfs/file_hdr.c Wed Oct 8 12:24:57 2003 +++ b/fs/hfs/file_hdr.c Wed Oct 8 12:24:57 2003 @@ -41,8 +41,9 @@ /*================ Forward declarations ================*/ static loff_t hdr_llseek(struct file *, loff_t, int); -static hfs_rwret_t hdr_read(struct file *, char *, hfs_rwarg_t, loff_t *); -static hfs_rwret_t hdr_write(struct file *, const char *, +static hfs_rwret_t hdr_read(struct file *, char __user *, + hfs_rwarg_t, loff_t *); +static hfs_rwret_t hdr_write(struct file *, const char __user *, hfs_rwarg_t, loff_t *); /*================ Global variables ================*/ @@ -382,7 +383,7 @@ * successfully transferred. */ /* XXX: what about the entry count changing on us? */ -static hfs_rwret_t hdr_read(struct file * filp, char * buf, +static hfs_rwret_t hdr_read(struct file *filp, char __user *buf, hfs_rwarg_t count, loff_t *ppos) { struct inode *inode = filp->f_dentry->d_inode; @@ -633,7 +634,7 @@ * '*ppos' from user-space at the address 'buf'. * The return value is the number of bytes actually transferred. */ -static hfs_rwret_t hdr_write(struct file *filp, const char *buf, +static hfs_rwret_t hdr_write(struct file *filp, const char __user *buf, hfs_rwarg_t count, loff_t *ppos) { struct inode *inode = filp->f_dentry->d_inode; diff -Nru a/fs/hfs/super.c b/fs/hfs/super.c --- a/fs/hfs/super.c Wed Oct 8 12:24:56 2003 +++ b/fs/hfs/super.c Wed Oct 8 12:24:56 2003 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -211,6 +212,60 @@ return 0; } +enum { + Opt_version, Opt_uid, Opt_gid, Opt_umask, Opt_part, + Opt_type, Opt_creator, Opt_quiet, Opt_afpd, + Opt_names_netatalk, Opt_names_trivial, Opt_names_alpha, Opt_names_latin, + Opt_names_7bit, Opt_names_8bit, Opt_names_cap, + Opt_fork_netatalk, Opt_fork_single, Opt_fork_double, Opt_fork_cap, + Opt_case_lower, Opt_case_asis, + Opt_conv_binary, Opt_conv_text, Opt_conv_auto, +}; + +static match_table_t tokens = { + {Opt_version, "version=%u"}, + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_umask, "umask=%o"}, + {Opt_part, "part=%u"}, + {Opt_type, "type=%s"}, + {Opt_creator, "creator=%s"}, + {Opt_quiet, "quiet"}, + {Opt_afpd, "afpd"}, + {Opt_names_netatalk, "names=netatalk"}, + {Opt_names_trivial, "names=trivial"}, + {Opt_names_alpha, "names=alpha"}, + {Opt_names_latin, "names=latin"}, + {Opt_names_7bit, "names=7bit"}, + {Opt_names_8bit, "names=8bit"}, + {Opt_names_cap, "names=cap"}, + {Opt_names_netatalk, "names=n"}, + {Opt_names_trivial, "names=t"}, + {Opt_names_alpha, "names=a"}, + {Opt_names_latin, "names=l"}, + {Opt_names_7bit, "names=7"}, + {Opt_names_8bit, "names=8"}, + {Opt_names_cap, "names=c"}, + {Opt_fork_netatalk, "fork=netatalk"}, + {Opt_fork_single, "fork=single"}, + {Opt_fork_double, "fork=double"}, + {Opt_fork_cap, "fork=cap"}, + {Opt_fork_netatalk, "fork=n"}, + {Opt_fork_single, "fork=s"}, + {Opt_fork_double, "fork=d"}, + {Opt_fork_cap, "fork=c"}, + {Opt_case_lower, "case=lower"}, + {Opt_case_asis, "case=asis"}, + {Opt_case_lower, "case=l"}, + {Opt_case_asis, "case=a"}, + {Opt_conv_binary, "conv=binary"}, + {Opt_conv_text, "conv=text"}, + {Opt_conv_auto, "conv=auto"}, + {Opt_conv_binary, "conv=b"}, + {Opt_conv_text, "conv=t"}, + {Opt_conv_auto, "conv=a"}, +}; + /* * parse_options() * @@ -219,8 +274,10 @@ */ static int parse_options(char *options, struct hfs_sb_info *hsb, int *part) { - char *this_char, *value; + char *p; char names, fork; + substring_t args[MAX_OPT_ARGS]; + int option; /* initialize the sb with defaults */ memset(hsb, 0, sizeof(*hsb)); @@ -243,117 +300,109 @@ if (!options) { goto done; } - while ((this_char = strsep(&options,",")) != NULL) { - if (!*this_char) + while ((p = strsep(&options,",")) != NULL) { + int token; + if (!*p) continue; - if ((value = strchr(this_char,'=')) != NULL) { - *value++ = 0; - } - /* Numeric-valued options */ - if (!strcmp(this_char, "version")) { - if (!value || !*value) { - return 0; - } - hsb->s_version = simple_strtoul(value,&value,0); - if (*value) { - return 0; - } - } else if (!strcmp(this_char,"uid")) { - if (!value || !*value) { - return 0; - } - hsb->s_uid = simple_strtoul(value,&value,0); - if (*value) { - return 0; - } - } else if (!strcmp(this_char,"gid")) { - if (!value || !*value) { - return 0; - } - hsb->s_gid = simple_strtoul(value,&value,0); - if (*value) { - return 0; - } - } else if (!strcmp(this_char,"umask")) { - if (!value || !*value) { - return 0; - } - hsb->s_umask = simple_strtoul(value,&value,8); - if (*value) { - return 0; - } - } else if (!strcmp(this_char,"part")) { - if (!value || !*value) { - return 0; - } - *part = simple_strtoul(value,&value,0); - if (*value) { - return 0; - } - /* String-valued options */ - } else if (!strcmp(this_char,"type") && value) { - if (strlen(value) != 4) { - return 0; - } - hsb->s_type = hfs_get_nl(value); - } else if (!strcmp(this_char,"creator") && value) { - if (strlen(value) != 4) { - return 0; - } - hsb->s_creator = hfs_get_nl(value); - /* Boolean-valued options */ - } else if (!strcmp(this_char,"quiet")) { - if (value) { - return 0; - } + + token = match_token(p, tokens, args); + switch (token) { + /* Numeric-valued options */ + case Opt_version: + if (match_int(&args[0], &option)) + return 0; + hsb->s_version = option; + break; + case Opt_uid: + if (match_int(&args[0], &option)) + return 0; + hsb->s_uid = option; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + hsb->s_gid = option; + break; + case Opt_umask: + if (match_octal(&args[0], &option)) + return 0; + hsb->s_umask = option; + break; + case Opt_part: + if (match_int(&args[0], &option)) + return 0; + *part = option; + break; + /* String-valued options */ + case Opt_type: + if (strlen(args[0].from) != 4) { + return 0; + } + hsb->s_type = hfs_get_nl(args[0].from); + break; + case Opt_creator: + if (strlen(args[0].from) != 4) { + return 0; + } + hsb->s_creator = hfs_get_nl(args[0].from); + break; + /* Boolean-valued options */ + case Opt_quiet: hsb->s_quiet = 1; - } else if (!strcmp(this_char,"afpd")) { - if (value) { - return 0; - } + break; + case Opt_afpd: hsb->s_afpd = 1; - /* Multiple choice options */ - } else if (!strcmp(this_char,"names") && value) { - if ((*value && !value[1] && strchr("ntal78c",*value)) || - !strcmp(value,"netatalk") || - !strcmp(value,"trivial") || - !strcmp(value,"alpha") || - !strcmp(value,"latin") || - !strcmp(value,"7bit") || - !strcmp(value,"8bit") || - !strcmp(value,"cap")) { - names = *value; - } else { - return 0; - } - } else if (!strcmp(this_char,"fork") && value) { - if ((*value && !value[1] && strchr("nsdc",*value)) || - !strcmp(value,"netatalk") || - !strcmp(value,"single") || - !strcmp(value,"double") || - !strcmp(value,"cap")) { - fork = *value; - } else { - return 0; - } - } else if (!strcmp(this_char,"case") && value) { - if ((*value && !value[1] && strchr("la",*value)) || - !strcmp(value,"lower") || - !strcmp(value,"asis")) { - hsb->s_lowercase = (*value == 'l'); - } else { - return 0; - } - } else if (!strcmp(this_char,"conv") && value) { - if ((*value && !value[1] && strchr("bta",*value)) || - !strcmp(value,"binary") || - !strcmp(value,"text") || - !strcmp(value,"auto")) { - hsb->s_conv = *value; - } else { - return 0; - } - } else { + break; + /* Multiple choice options */ + case Opt_names_netatalk: + names = 'n'; + break; + case Opt_names_trivial: + names = 't'; + break; + case Opt_names_alpha: + names = 'a'; + break; + case Opt_names_latin: + names = 'l'; + break; + case Opt_names_7bit: + names = '7'; + break; + case Opt_names_8bit: + names = '8'; + break; + case Opt_names_cap: + names = 'c'; + break; + case Opt_fork_netatalk: + fork = 'n'; + break; + case Opt_fork_single: + fork = 's'; + break; + case Opt_fork_double: + fork = 'd'; + break; + case Opt_fork_cap: + fork = 'c'; + break; + case Opt_case_lower: + hsb->s_lowercase = 1; + break; + case Opt_case_asis: + hsb->s_lowercase = 0; + break; + case Opt_conv_binary: + hsb->s_conv = 'b'; + break; + case Opt_conv_text: + hsb->s_conv = 't'; + break; + case Opt_conv_auto: + hsb->s_conv = 'a'; + break; + default: return 0; } } diff -Nru a/fs/hpfs/file.c b/fs/hpfs/file.c --- a/fs/hpfs/file.c Wed Oct 8 12:24:57 2003 +++ b/fs/hpfs/file.c Wed Oct 8 12:24:57 2003 @@ -124,7 +124,8 @@ .bmap = _hpfs_bmap }; -ssize_t hpfs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos) +ssize_t hpfs_file_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) { ssize_t retval; diff -Nru a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h --- a/fs/hpfs/hpfs_fn.h Wed Oct 8 12:24:57 2003 +++ b/fs/hpfs/hpfs_fn.h Wed Oct 8 12:24:57 2003 @@ -249,7 +249,7 @@ secno hpfs_bmap(struct inode *, unsigned); void hpfs_truncate(struct inode *); int hpfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create); -ssize_t hpfs_file_write(struct file *file, const char *buf, size_t count, loff_t *ppos); +ssize_t hpfs_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos); /* inode.c */ diff -Nru a/fs/hpfs/super.c b/fs/hpfs/super.c --- a/fs/hpfs/super.c Wed Oct 8 12:24:57 2003 +++ b/fs/hpfs/super.c Wed Oct 8 12:24:57 2003 @@ -10,6 +10,7 @@ #include #include "hpfs_fn.h" #include +#include #include #include @@ -219,15 +220,52 @@ /* * A tiny parser for option strings, stolen from dosfs. - * * Stolen again from read-only hpfs. + * And updated for table-driven option parsing. */ +enum { + Opt_help, Opt_uid, Opt_gid, Opt_umask, Opt_case_lower, Opt_case_asis, + Opt_conv_binary, Opt_conv_text, Opt_conv_auto, + Opt_check_none, Opt_check_normal, Opt_check_strict, + Opt_err_cont, Opt_err_ro, Opt_err_panic, + Opt_eas_no, Opt_eas_ro, Opt_eas_rw, + Opt_chkdsk_no, Opt_chkdsk_errors, Opt_chkdsk_always, + Opt_timeshift, Opt_err, +}; + +static match_table_t tokens = { + {Opt_help, "help"}, + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_umask, "umask=%o"}, + {Opt_case_lower, "case=lower"}, + {Opt_case_asis, "case=asis"}, + {Opt_conv_binary, "conv=binary"}, + {Opt_conv_text, "conv=text"}, + {Opt_conv_auto, "conv=auto"}, + {Opt_check_none, "check=none"}, + {Opt_check_normal, "check=normal"}, + {Opt_check_strict, "check=strict"}, + {Opt_err_cont, "errors=continue"}, + {Opt_err_ro, "errors=remount-ro"}, + {Opt_err_panic, "errors=panic"}, + {Opt_eas_no, "eas=no"}, + {Opt_eas_ro, "eas=ro"}, + {Opt_eas_rw, "eas=rw"}, + {Opt_chkdsk_no, "chkdsk=no"}, + {Opt_chkdsk_errors, "chkdsk=errors"}, + {Opt_chkdsk_always, "chkdsk=always"}, + {Opt_timeshift, "timeshift=%d"}, + {Opt_err, NULL}, +}; + int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, int *lowercase, int *conv, int *eas, int *chk, int *errs, int *chkdsk, int *timeshift) { - char *p, *rhs; + char *p; + int option; if (!opts) return 1; @@ -235,34 +273,85 @@ /*printk("Parsing opts: '%s'\n",opts);*/ while ((p = strsep(&opts, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; if (!*p) continue; - if ((rhs = strchr(p, '=')) != 0) - *rhs++ = '\0'; - if (!strcmp(p, "help")) return 2; - if (!strcmp(p, "uid")) { - if (!rhs || !*rhs) - return 0; - *uid = simple_strtoul(rhs, &rhs, 0); - if (*rhs) - return 0; - } - else if (!strcmp(p, "gid")) { - if (!rhs || !*rhs) - return 0; - *gid = simple_strtoul(rhs, &rhs, 0); - if (*rhs) - return 0; - } - else if (!strcmp(p, "umask")) { - if (!rhs || !*rhs) - return 0; - *umask = simple_strtoul(rhs, &rhs, 8); - if (*rhs) - return 0; - } - else if (!strcmp(p, "timeshift")) { + + token = match_token(p, tokens, args); + switch (token) { + case Opt_help: + return 2; + case Opt_uid: + if (match_int(args, &option)) + return 0; + *uid = option; + break; + case Opt_gid: + if (match_int(args, &option)) + return 0; + *gid = option; + break; + case Opt_umask: + if (match_octal(args, &option)) + return 0; + *umask = option; + break; + case Opt_case_lower: + *lowercase = 1; + break; + case Opt_case_asis: + *lowercase = 0; + break; + case Opt_conv_binary: + *conv = CONV_BINARY; + break; + case Opt_conv_text: + *conv = CONV_TEXT; + break; + case Opt_conv_auto: + *conv = CONV_AUTO; + break; + case Opt_check_none: + *chk = 0; + break; + case Opt_check_normal: + *chk = 1; + break; + case Opt_check_strict: + *chk = 2; + break; + case Opt_err_cont: + *errs = 0; + break; + case Opt_err_ro: + *errs = 1; + break; + case Opt_err_panic: + *errs = 2; + break; + case Opt_eas_no: + *eas = 0; + break; + case Opt_eas_ro: + *eas = 1; + break; + case Opt_eas_rw: + *eas = 2; + break; + case Opt_chkdsk_no: + *chkdsk = 0; + break; + case Opt_chkdsk_errors: + *chkdsk = 1; + break; + case Opt_chkdsk_always: + *chkdsk = 2; + break; + case Opt_timeshift: + { int m = 1; + char *rhs = args[0].from; if (!rhs || !*rhs) return 0; if (*rhs == '-') m = -1; @@ -270,79 +359,11 @@ *timeshift = simple_strtoul(rhs, &rhs, 0) * m; if (*rhs) return 0; + break; } - else if (!strcmp(p, "case")) { - if (!rhs || !*rhs) - return 0; - if (!strcmp(rhs, "lower")) - *lowercase = 1; - else if (!strcmp(rhs, "asis")) - *lowercase = 0; - else - return 0; - } - else if (!strcmp(p, "conv")) { - if (!rhs || !*rhs) - return 0; - if (!strcmp(rhs, "binary")) - *conv = CONV_BINARY; - else if (!strcmp(rhs, "text")) - *conv = CONV_TEXT; - else if (!strcmp(rhs, "auto")) - *conv = CONV_AUTO; - else - return 0; - } - else if (!strcmp(p, "check")) { - if (!rhs || !*rhs) - return 0; - if (!strcmp(rhs, "none")) - *chk = 0; - else if (!strcmp(rhs, "normal")) - *chk = 1; - else if (!strcmp(rhs, "strict")) - *chk = 2; - else - return 0; - } - else if (!strcmp(p, "errors")) { - if (!rhs || !*rhs) - return 0; - if (!strcmp(rhs, "continue")) - *errs = 0; - else if (!strcmp(rhs, "remount-ro")) - *errs = 1; - else if (!strcmp(rhs, "panic")) - *errs = 2; - else - return 0; - } - else if (!strcmp(p, "eas")) { - if (!rhs || !*rhs) - return 0; - if (!strcmp(rhs, "no")) - *eas = 0; - else if (!strcmp(rhs, "ro")) - *eas = 1; - else if (!strcmp(rhs, "rw")) - *eas = 2; - else - return 0; - } - else if (!strcmp(p, "chkdsk")) { - if (!rhs || !*rhs) - return 0; - if (!strcmp(rhs, "no")) - *chkdsk = 0; - else if (!strcmp(rhs, "errors")) - *chkdsk = 1; - else if (!strcmp(rhs, "always")) - *chkdsk = 2; - else - return 0; - } - else + default: return 0; + } } return 1; } diff -Nru a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c --- a/fs/hugetlbfs/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/hugetlbfs/inode.c Wed Oct 8 12:24:57 2003 @@ -648,11 +648,6 @@ struct hugetlbfs_config config; struct hugetlbfs_sb_info *sbinfo; - sbinfo = kmalloc(sizeof(struct hugetlbfs_sb_info), GFP_KERNEL); - if (!sbinfo) - return -ENOMEM; - sb->s_fs_info = sbinfo; - config.nr_blocks = -1; /* No limit on size by default */ config.nr_inodes = -1; /* No limit on number of inodes by default */ config.uid = current->fsuid; @@ -663,6 +658,10 @@ if (ret) return ret; + sbinfo = kmalloc(sizeof(struct hugetlbfs_sb_info), GFP_KERNEL); + if (!sbinfo) + return -ENOMEM; + sb->s_fs_info = sbinfo; spin_lock_init(&sbinfo->stat_lock); sbinfo->max_blocks = config.nr_blocks; sbinfo->free_blocks = config.nr_blocks; @@ -675,15 +674,18 @@ inode = hugetlbfs_get_inode(sb, config.uid, config.gid, S_IFDIR | config.mode, 0); if (!inode) - return -ENOMEM; + goto out_free; root = d_alloc_root(inode); if (!root) { iput(inode); - return -ENOMEM; + goto out_free; } sb->s_root = root; return 0; +out_free: + kfree(sbinfo); + return -ENOMEM; } int hugetlb_get_quota(struct address_space *mapping) diff -Nru a/fs/inode.c b/fs/inode.c --- a/fs/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/inode.c Wed Oct 8 12:24:57 2003 @@ -195,6 +195,8 @@ i_size_ordered_init(inode); } +EXPORT_SYMBOL(inode_init_once); + static void init_once(void * foo, kmem_cache_t * cachep, unsigned long flags) { struct inode * inode = (struct inode *) foo; @@ -229,7 +231,6 @@ * that the inode is no longer useful. We just * terminate it with extreme prejudice. */ - void clear_inode(struct inode *inode) { invalidate_inode_buffers(inode); @@ -251,7 +252,12 @@ inode->i_state = I_CLEAR; } +EXPORT_SYMBOL(clear_inode); + /* + * dispose_list - dispose of the contents of a local list + * @head: the head of the list to free + * * Dispose-list gets a local list with local inodes in it, so it doesn't * need to worry about list corruption and SMP locks. */ @@ -327,7 +333,6 @@ * fails because there are busy inodes then a non zero value is returned. * If the discard is successful all the inodes have been discarded. */ - int invalidate_inodes(struct super_block * sb) { int busy; @@ -346,6 +351,8 @@ return busy; } + +EXPORT_SYMBOL(invalidate_inodes); int __invalidate_device(struct block_device *bdev, int do_sync) { @@ -372,6 +379,8 @@ return res; } +EXPORT_SYMBOL(__invalidate_device); + static int can_unuse(struct inode *inode) { if (inode->i_state) @@ -532,7 +541,6 @@ * * Allocates a new inode for given superblock. */ - struct inode *new_inode(struct super_block *sb) { static unsigned long last_ino; @@ -552,6 +560,8 @@ return inode; } +EXPORT_SYMBOL(new_inode); + void unlock_new_inode(struct inode *inode) { /* @@ -565,6 +575,7 @@ inode->i_state &= ~(I_LOCK|I_NEW); wake_up_inode(inode); } + EXPORT_SYMBOL(unlock_new_inode); /* @@ -685,7 +696,6 @@ * With a large number of inodes live on the file system this function * currently becomes quite slow. */ - ino_t iunique(struct super_block *sb, ino_t max_reserved) { static ino_t counter; @@ -709,6 +719,8 @@ } +EXPORT_SYMBOL(iunique); + struct inode *igrab(struct inode *inode) { spin_lock(&inode_lock); @@ -725,14 +737,16 @@ return inode; } +EXPORT_SYMBOL(igrab); + /** * ifind - internal function, you want ilookup5() or iget5(). * @sb: super block of file system to search - * @hashval: hash value (usually inode number) to search for + * @head: the head of the list to search * @test: callback used for comparisons between inodes * @data: opaque data pointer to pass to @test * - * ifind() searches for the inode specified by @hashval and @data in the inode + * ifind() searches for the inode specified by @data in the inode * cache. This is a generalized version of ifind_fast() for file systems where * the inode number is not sufficient for unique identification of an inode. * @@ -764,6 +778,7 @@ /** * ifind_fast - internal function, you want ilookup() or iget(). * @sb: super block of file system to search + * @head: head of the list to search * @ino: inode number to search for * * ifind_fast() searches for the inode @ino in the inode cache. This is for @@ -818,6 +833,7 @@ return ifind(sb, head, test, data); } + EXPORT_SYMBOL(ilookup5); /** @@ -840,6 +856,7 @@ return ifind_fast(sb, head, ino); } + EXPORT_SYMBOL(ilookup); /** @@ -880,6 +897,7 @@ */ return get_new_inode(sb, head, test, set, data); } + EXPORT_SYMBOL(iget5_locked); /** @@ -913,6 +931,7 @@ */ return get_new_inode_fast(sb, head, ino); } + EXPORT_SYMBOL(iget_locked); /** @@ -923,7 +942,6 @@ * * Add an inode to the inode hash for this superblock. */ - void __insert_inode_hash(struct inode *inode, unsigned long hashval) { struct hlist_head *head = inode_hashtable + hash(inode->i_sb, hashval); @@ -932,13 +950,14 @@ spin_unlock(&inode_lock); } +EXPORT_SYMBOL(__insert_inode_hash); + /** * remove_inode_hash - remove an inode from the hash * @inode: inode to unhash * * Remove an inode from the superblock. */ - void remove_inode_hash(struct inode *inode) { spin_lock(&inode_lock); @@ -946,6 +965,8 @@ spin_unlock(&inode_lock); } +EXPORT_SYMBOL(remove_inode_hash); + /* * Tell the filesystem that this inode is no longer of any interest and should * be completely destroyed. @@ -988,6 +1009,7 @@ BUG(); destroy_inode(inode); } + EXPORT_SYMBOL(generic_delete_inode); static void generic_forget_inode(struct inode *inode) @@ -1059,7 +1081,6 @@ * Puts an inode, dropping its usage count. If the inode use count hits * zero the inode is also then freed and may be destroyed. */ - void iput(struct inode *inode) { if (inode) { @@ -1076,6 +1097,8 @@ } } +EXPORT_SYMBOL(iput); + /** * bmap - find a block number in a file * @inode: inode of file @@ -1087,7 +1110,6 @@ * disk block relative to the disk start that holds that block of the * file. */ - sector_t bmap(struct inode * inode, sector_t block) { sector_t res = 0; @@ -1096,6 +1118,8 @@ return res; } +EXPORT_SYMBOL(bmap); + /* * Return true if the filesystem which backs this inode considers the two * passed timespecs to be sufficiently different to warrant flushing the @@ -1117,7 +1141,6 @@ * This function automatically handles read only file systems and media, * as well as the "noatime" flag and inode specific "noatime" markers. */ - void update_atime(struct inode *inode) { struct timespec now; @@ -1139,6 +1162,8 @@ } } +EXPORT_SYMBOL(update_atime); + /** * inode_update_time - update mtime and ctime time * @inode: inode accessed @@ -1170,6 +1195,7 @@ if (sync_it) mark_inode_dirty_sync(inode); } + EXPORT_SYMBOL(inode_update_time); int inode_needs_sync(struct inode *inode) @@ -1180,6 +1206,7 @@ return 1; return 0; } + EXPORT_SYMBOL(inode_needs_sync); /* @@ -1375,3 +1402,5 @@ printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n", mode); } + +EXPORT_SYMBOL(init_special_inode); diff -Nru a/fs/intermezzo/cache.c b/fs/intermezzo/cache.c --- a/fs/intermezzo/cache.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/cache.c Wed Oct 8 12:24:56 2003 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include diff -Nru a/fs/intermezzo/dcache.c b/fs/intermezzo/dcache.c --- a/fs/intermezzo/dcache.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/dcache.c Wed Oct 8 12:24:57 2003 @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/dir.c b/fs/intermezzo/dir.c --- a/fs/intermezzo/dir.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/dir.c Wed Oct 8 12:24:56 2003 @@ -23,10 +23,9 @@ */ #include -#include +#include #include #include -#include #include #include @@ -55,7 +54,7 @@ { /* vfs_mkdir locks */ // down(&dir->i_zombie); - lock_kernel(); + //lock_kernel(); } static inline void presto_fulllock(struct inode *dir) @@ -64,13 +63,13 @@ down(&dir->i_sem); /* vfs_mkdir locks */ // down(&dir->i_zombie); - lock_kernel(); + //lock_kernel(); } static inline void presto_unlock(struct inode *dir) { /* vfs_mkdir locks */ - unlock_kernel(); + //unlock_kernel(); // up(&dir->i_zombie); /* the lock from sys_mkdir / lookup_create */ up(&dir->i_sem); diff -Nru a/fs/intermezzo/ext_attr.c b/fs/intermezzo/ext_attr.c --- a/fs/intermezzo/ext_attr.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/ext_attr.c Wed Oct 8 12:24:57 2003 @@ -28,14 +28,12 @@ #include #include #include -#include #include #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/file.c b/fs/intermezzo/file.c --- a/fs/intermezzo/file.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/file.c Wed Oct 8 12:24:57 2003 @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/fileset.c b/fs/intermezzo/fileset.c --- a/fs/intermezzo/fileset.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/fileset.c Wed Oct 8 12:24:56 2003 @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/inode.c b/fs/intermezzo/inode.c --- a/fs/intermezzo/inode.c Wed Oct 8 12:24:55 2003 +++ b/fs/intermezzo/inode.c Wed Oct 8 12:24:55 2003 @@ -30,7 +30,6 @@ #include #include #include -#include #include #include diff -Nru a/fs/intermezzo/journal.c b/fs/intermezzo/journal.c --- a/fs/intermezzo/journal.c Wed Oct 8 12:24:55 2003 +++ b/fs/intermezzo/journal.c Wed Oct 8 12:24:55 2003 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/journal_ext2.c b/fs/intermezzo/journal_ext2.c --- a/fs/intermezzo/journal_ext2.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/journal_ext2.c Wed Oct 8 12:24:56 2003 @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/journal_ext3.c b/fs/intermezzo/journal_ext3.c --- a/fs/intermezzo/journal_ext3.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/journal_ext3.c Wed Oct 8 12:24:56 2003 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/journal_obdfs.c b/fs/intermezzo/journal_obdfs.c --- a/fs/intermezzo/journal_obdfs.c Wed Oct 8 12:24:55 2003 +++ b/fs/intermezzo/journal_obdfs.c Wed Oct 8 12:24:55 2003 @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/journal_reiserfs.c b/fs/intermezzo/journal_reiserfs.c --- a/fs/intermezzo/journal_reiserfs.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/journal_reiserfs.c Wed Oct 8 12:24:56 2003 @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/journal_tmpfs.c b/fs/intermezzo/journal_tmpfs.c --- a/fs/intermezzo/journal_tmpfs.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/journal_tmpfs.c Wed Oct 8 12:24:57 2003 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/journal_xfs.c b/fs/intermezzo/journal_xfs.c --- a/fs/intermezzo/journal_xfs.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/journal_xfs.c Wed Oct 8 12:24:57 2003 @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/kml_utils.c b/fs/intermezzo/kml_utils.c --- a/fs/intermezzo/kml_utils.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/kml_utils.c Wed Oct 8 12:24:56 2003 @@ -1,6 +1,5 @@ #include #include -#include #include #include diff -Nru a/fs/intermezzo/methods.c b/fs/intermezzo/methods.c --- a/fs/intermezzo/methods.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/methods.c Wed Oct 8 12:24:57 2003 @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/presto.c b/fs/intermezzo/presto.c --- a/fs/intermezzo/presto.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/presto.c Wed Oct 8 12:24:57 2003 @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/psdev.c b/fs/intermezzo/psdev.c --- a/fs/intermezzo/psdev.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/psdev.c Wed Oct 8 12:24:56 2003 @@ -102,8 +102,7 @@ struct list_head *lh; struct upc_req *req; CERROR("WARNING: setpid & processing not empty!\n"); - lh = &channel->uc_processing; - while ( (lh = lh->next) != &channel->uc_processing) { + list_for_each(lh, &channel->uc_processing) { req = list_entry(lh, struct upc_req, rq_chain); /* freeing of req and data is done by the sleeper */ wake_up(&req->rq_sleep); @@ -208,8 +207,7 @@ spin_lock(&channel->uc_lock); /* Look for the message on the processing queue. */ - lh = &channel->uc_processing; - while ( (lh = lh->next) != &channel->uc_processing ) { + list_for_each(lh, &channel->uc_processing) { tmp = list_entry(lh, struct upc_req , rq_chain); if (tmp->rq_unique == hdr.unique) { req = tmp; @@ -337,8 +335,7 @@ /* Wake up clients so they can return. */ CDEBUG(D_PSDEV, "Wake up clients sleeping for pending.\n"); spin_lock(&channel->uc_lock); - lh = &channel->uc_pending; - while ( (lh = lh->next) != &channel->uc_pending) { + list_for_each(lh, &channel->uc_pending) { req = list_entry(lh, struct upc_req, rq_chain); /* Async requests stay around for a new lento */ @@ -351,8 +348,7 @@ } CDEBUG(D_PSDEV, "Wake up clients sleeping for processing\n"); - lh = &channel->uc_processing; - while ( (lh = lh->next) != &channel->uc_processing) { + list_for_each(lh, &channel->uc_processing) { req = list_entry(lh, struct upc_req, rq_chain); /* freeing of req and data is done by the sleeper */ req->rq_flags |= REQ_DEAD; @@ -419,7 +415,7 @@ for ( i = 0 ; i < MAX_CHANNEL ; i++ ) { struct upc_channel *channel = &(izo_channels[i]); - struct list_head *lh; + struct list_head *lh, *next; spin_lock(&channel->uc_lock); if ( ! list_empty(&channel->uc_pending)) { @@ -431,12 +427,10 @@ if ( ! list_empty(&channel->uc_cache_list)) { CERROR("Weird, tell Peter: module cleanup and cache listnot empty dev %d\n", i); } - lh = channel->uc_pending.next; - while ( lh != &channel->uc_pending) { + list_for_each_safe(lh, next, &channel->uc_pending) { struct upc_req *req; req = list_entry(lh, struct upc_req, rq_chain); - lh = lh->next; if ( req->rq_flags & REQ_ASYNC ) { list_del(&(req->rq_chain)); CDEBUG(D_UPCALL, "free pending upcall type %d\n", @@ -448,8 +442,7 @@ wake_up(&req->rq_sleep); } } - lh = &channel->uc_processing; - while ( (lh = lh->next) != &channel->uc_processing ) { + list_for_each(lh, &channel->uc_processing) { struct upc_req *req; req = list_entry(lh, struct upc_req, rq_chain); list_del(&(req->rq_chain)); @@ -562,6 +555,10 @@ buffer->u_uniq = req->rq_unique; buffer->u_async = async; + /* Remove potential datarace possibility*/ + if ( async ) + req->rq_flags = REQ_ASYNC; + spin_lock(&channel->uc_lock); /* Append msg to pending queue and poke Lento. */ list_add(&req->rq_chain, channel->uc_pending.prev); @@ -574,7 +571,7 @@ if ( async ) { /* req, rq_data are freed in presto_psdev_read for async */ - req->rq_flags = REQ_ASYNC; + /* req->rq_flags = REQ_ASYNC;*/ EXIT; return 0; } @@ -645,5 +642,6 @@ exit_req: PRESTO_FREE(req, sizeof(struct upc_req)); exit_buf: + PRESTO_FREE(buffer,*size); return error; } diff -Nru a/fs/intermezzo/replicator.c b/fs/intermezzo/replicator.c --- a/fs/intermezzo/replicator.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/replicator.c Wed Oct 8 12:24:57 2003 @@ -97,11 +97,10 @@ struct izo_offset_rec * izo_rep_cache_find(struct presto_file_set *fset, char *uuid) { - struct list_head *buck = izo_rep_hash(fset->fset_clients, uuid); - struct list_head *tmp = buck; + struct list_head *tmp, *buck = izo_rep_hash(fset->fset_clients, uuid); struct izo_offset_rec *rec = NULL; - while ( (tmp = tmp->next) != buck ) { + list_for_each(tmp, buck) { rec = list_entry(tmp, struct izo_offset_rec, or_list); if ( memcmp(rec->or_uuid, uuid, sizeof(rec->or_uuid)) == 0 ) return rec; diff -Nru a/fs/intermezzo/super.c b/fs/intermezzo/super.c --- a/fs/intermezzo/super.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/super.c Wed Oct 8 12:24:57 2003 @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include diff -Nru a/fs/intermezzo/upcall.c b/fs/intermezzo/upcall.c --- a/fs/intermezzo/upcall.c Wed Oct 8 12:24:57 2003 +++ b/fs/intermezzo/upcall.c Wed Oct 8 12:24:57 2003 @@ -39,7 +39,6 @@ #include #include #include -#include #include #include diff -Nru a/fs/intermezzo/vfs.c b/fs/intermezzo/vfs.c --- a/fs/intermezzo/vfs.c Wed Oct 8 12:24:56 2003 +++ b/fs/intermezzo/vfs.c Wed Oct 8 12:24:56 2003 @@ -55,7 +55,6 @@ #include #include -#include #include #include diff -Nru a/fs/isofs/inode.c b/fs/isofs/inode.c --- a/fs/isofs/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/isofs/inode.c Wed Oct 8 12:24:57 2003 @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -328,9 +329,52 @@ } #endif +enum { + Opt_block, Opt_check_r, Opt_check_s, Opt_cruft, Opt_gid, Opt_ignore, + Opt_iocharset, Opt_map_a, Opt_map_n, Opt_map_o, Opt_mode, Opt_nojoliet, + Opt_norock, Opt_sb, Opt_session, Opt_uid, Opt_unhide, Opt_utf8, Opt_err, + Opt_nocompress, +}; + +static match_table_t tokens = { + {Opt_norock, "norock"}, + {Opt_nojoliet, "nojoliet"}, + {Opt_unhide, "unhide"}, + {Opt_cruft, "cruft"}, + {Opt_utf8, "utf8"}, + {Opt_iocharset, "iocharset=%s"}, + {Opt_map_a, "map=acorn"}, + {Opt_map_a, "map=a"}, + {Opt_map_n, "map=normal"}, + {Opt_map_n, "map=n"}, + {Opt_map_o, "map=off"}, + {Opt_map_o, "map=o"}, + {Opt_session, "session=%u"}, + {Opt_sb, "sbsector=%u"}, + {Opt_check_r, "check=relaxed"}, + {Opt_check_r, "check=r"}, + {Opt_check_s, "check=strict"}, + {Opt_check_s, "check=s"}, + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_mode, "mode=%u"}, + {Opt_block, "block=%u"}, + {Opt_ignore, "conv=binary"}, + {Opt_ignore, "conv=b"}, + {Opt_ignore, "conv=text"}, + {Opt_ignore, "conv=t"}, + {Opt_ignore, "conv=mtext"}, + {Opt_ignore, "conv=m"}, + {Opt_ignore, "conv=auto"}, + {Opt_ignore, "conv=a"}, + {Opt_nocompress, "nocompress"}, + {Opt_err, NULL} +}; + static int parse_options(char *options, struct iso9660_options * popt) { - char *this_char,*value; + char *p; + int option; popt->map = 'n'; popt->rock = 'y'; @@ -350,112 +394,101 @@ popt->utf8 = 0; popt->session=-1; popt->sbsector=-1; - if (!options) return 1; - while ((this_char = strsep(&options,",")) != NULL) { - if (!*this_char) + if (!options) + return 1; + + while ((p = strsep(&options, ",")) != NULL) { + int token; + substring_t args[MAX_OPT_ARGS]; + unsigned n; + + if (!*p) continue; - if (strncmp(this_char,"norock",6) == 0) { - popt->rock = 'n'; - continue; - } - if (strncmp(this_char,"nojoliet",8) == 0) { - popt->joliet = 'n'; - continue; - } - if (strncmp(this_char,"unhide",6) == 0) { - popt->unhide = 'y'; - continue; - } - if (strncmp(this_char,"cruft",5) == 0) { - popt->cruft = 'y'; - continue; - } - if (strncmp(this_char,"utf8",4) == 0) { - popt->utf8 = 1; - continue; - } - if (strncmp(this_char,"nocompress",10) == 0) { - popt->nocompress = 1; - continue; - } - if ((value = strchr(this_char,'=')) != NULL) - *value++ = 0; + token = match_token(p, tokens, args); + switch (token) { + case Opt_norock: + popt->rock = 'n'; + break; + case Opt_nojoliet: + popt->joliet = 'n'; + break; + case Opt_unhide: + popt->unhide = 'y'; + break; + case Opt_cruft: + popt->cruft = 'y'; + break; + case Opt_utf8: + popt->utf8 = 1; + break; #ifdef CONFIG_JOLIET - if (!strcmp(this_char,"iocharset") && value) { - popt->iocharset = value; - while (*value && *value != ',') - value++; - if (value == popt->iocharset) + case Opt_iocharset: + popt->iocharset = match_strdup(&args[0]); + break; +#endif + case Opt_map_a: + popt->map = 'a'; + break; + case Opt_map_o: + popt->map = 'o'; + break; + case Opt_map_n: + popt->map = 'n'; + break; + case Opt_session: + if (match_int(&args[0], &option)) return 0; - *value = 0; - } else -#endif - if (!strcmp(this_char,"map") && value) { - if (value[0] && !value[1] && strchr("ano",*value)) - popt->map = *value; - else if (!strcmp(value,"off")) popt->map = 'o'; - else if (!strcmp(value,"normal")) popt->map = 'n'; - else if (!strcmp(value,"acorn")) popt->map = 'a'; - else return 0; - } - if (!strcmp(this_char,"session") && value) { - char * vpnt = value; - unsigned int ivalue = simple_strtoul(vpnt, &vpnt, 0); - if(ivalue < 0 || ivalue >99) return 0; - popt->session=ivalue+1; - } - if (!strcmp(this_char,"sbsector") && value) { - char * vpnt = value; - unsigned int ivalue = simple_strtoul(vpnt, &vpnt, 0); - if(ivalue < 0 || ivalue >660*512) return 0; - popt->sbsector=ivalue; - } - else if (!strcmp(this_char,"check") && value) { - if (value[0] && !value[1] && strchr("rs",*value)) - popt->check = *value; - else if (!strcmp(value,"relaxed")) popt->check = 'r'; - else if (!strcmp(value,"strict")) popt->check = 's'; - else return 0; - } - else if (!strcmp(this_char,"conv") && value) { - /* no conversion is done anymore; - we still accept the same mount options, - but ignore them */ - if (value[0] && !value[1] && strchr("btma",*value)) ; - else if (!strcmp(value,"binary")) ; - else if (!strcmp(value,"text")) ; - else if (!strcmp(value,"mtext")) ; - else if (!strcmp(value,"auto")) ; - else return 0; - } - else if (value && - (!strcmp(this_char,"block") || - !strcmp(this_char,"mode") || - !strcmp(this_char,"uid") || - !strcmp(this_char,"gid"))) { - char * vpnt = value; - unsigned int ivalue = simple_strtoul(vpnt, &vpnt, 0); - if (*vpnt) return 0; - switch(*this_char) { - case 'b': - if ( ivalue != 512 - && ivalue != 1024 - && ivalue != 2048) return 0; - popt->blocksize = ivalue; - break; - case 'u': - popt->uid = ivalue; - break; - case 'g': - popt->gid = ivalue; - break; - case 'm': - popt->mode = ivalue; - break; - } + n = option; + if (n > 99) + return 0; + popt->session = n + 1; + break; + case Opt_sb: + if (match_int(&args[0], &option)) + return 0; + n = option; + if (n > 660 * 512) + return 0; + popt->sbsector = n; + break; + case Opt_check_r: + popt->check = 'r'; + break; + case Opt_check_s: + popt->check = 's'; + break; + case Opt_ignore: + break; + case Opt_uid: + if (match_int(&args[0], &option)) + return 0; + popt->uid = option; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + popt->gid = option; + break; + case Opt_mode: + if (match_int(&args[0], &option)) + return 0; + popt->mode = option; + break; + case Opt_block: + if (match_int(&args[0], &option)) + return 0; + n = option; + if (n != 512 && n != 1024 && n != 2048) + return 0; + popt->blocksize = n; + break; + case Opt_nocompress: + popt->nocompress = 1; + break; + default: + return 0; } - else return 1; } return 1; } @@ -842,6 +875,9 @@ if (opt.check == 'r') table++; s->s_root->d_op = &isofs_dentry_ops[table]; + if (opt.iocharset) + kfree(opt.iocharset); + return 0; /* @@ -879,6 +915,8 @@ out_freebh: brelse(bh); out_freesbi: + if (opt.iocharset) + kfree(opt.iocharset); kfree(sbi); s->s_fs_info = NULL; return -EINVAL; diff -Nru a/fs/jbd/journal.c b/fs/jbd/journal.c --- a/fs/jbd/journal.c Wed Oct 8 12:24:55 2003 +++ b/fs/jbd/journal.c Wed Oct 8 12:24:55 2003 @@ -1800,7 +1800,7 @@ return ret; } -int write_jbd_debug(struct file *file, const char *buffer, +int write_jbd_debug(struct file *file, const char __user *buffer, unsigned long count, void *data) { char buf[32]; diff -Nru a/fs/jfs/jfs_debug.c b/fs/jfs/jfs_debug.c --- a/fs/jfs/jfs_debug.c Wed Oct 8 12:24:57 2003 +++ b/fs/jfs/jfs_debug.c Wed Oct 8 12:24:57 2003 @@ -81,7 +81,7 @@ return len; } -static int loglevel_write(struct file *file, const char *buffer, +static int loglevel_write(struct file *file, const char __user *buffer, unsigned long count, void *data) { char c; diff -Nru a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c --- a/fs/jfs/jfs_imap.c Wed Oct 8 12:24:55 2003 +++ b/fs/jfs/jfs_imap.c Wed Oct 8 12:24:55 2003 @@ -838,7 +838,7 @@ */ if (S_ISDIR(ip->i_mode) && (ip->i_ipmnt->i_mntflag & JFS_DASD_ENABLED)) - bcopy(&ip->i_DASD, &dp->di_DASD, sizeof(struct dasd)); + memcpy(&dp->di_DASD, &ip->i_DASD, sizeof(struct dasd)); #endif /* _JFS_FASTDASD */ /* release the buffer holding the updated on-disk inode. diff -Nru a/fs/jfs/super.c b/fs/jfs/super.c --- a/fs/jfs/super.c Wed Oct 8 12:24:56 2003 +++ b/fs/jfs/super.c Wed Oct 8 12:24:56 2003 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -164,59 +165,82 @@ kfree(sbi); } +enum { + Opt_integrity, Opt_nointegrity, Opt_iocharset, Opt_resize, + Opt_ignore, Opt_err, +}; + +static match_table_t tokens = { + {Opt_integrity, "integrity"}, + {Opt_nointegrity, "nointegrity"}, + {Opt_iocharset, "iocharset=%s"}, + {Opt_resize, "resize=%u"}, + {Opt_ignore, "noquota"}, + {Opt_ignore, "quota"}, + {Opt_ignore, "usrquota"}, + {Opt_ignore, "grpquota"}, + {Opt_err, NULL} +}; + static int parse_options(char *options, struct super_block *sb, s64 *newLVSize, int *flag) { void *nls_map = NULL; - char *this_char; - char *value; + char *p; struct jfs_sb_info *sbi = JFS_SBI(sb); *newLVSize = 0; if (!options) return 1; - while ((this_char = strsep(&options, ",")) != NULL) { - if (!*this_char) + + while ((p = strsep(&options, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + if (!*p) continue; - if ((value = strchr(this_char, '=')) != NULL) - *value++ = 0; - if (!strcmp(this_char, "integrity")) { + + token = match_token(p, tokens, args); + switch (token) { + case Opt_integrity: *flag &= ~JFS_NOINTEGRITY; - } else if (!strcmp(this_char, "nointegrity")) { + break; + case Opt_nointegrity: *flag |= JFS_NOINTEGRITY; - } else if (!strcmp(this_char, "iocharset")) { - if (!value || !*value) - goto needs_arg; + break; + case Opt_ignore: + /* Silently ignore the quota options */ + /* Don't do anything ;-) */ + break; + case Opt_iocharset: if (nls_map) /* specified iocharset twice! */ unload_nls(nls_map); - nls_map = load_nls(value); + nls_map = load_nls(args[0].from); if (!nls_map) { printk(KERN_ERR "JFS: charset not found\n"); goto cleanup; } - } else if (!strcmp(this_char, "resize")) { - if (!value || !*value) { + break; + case Opt_resize: + { + char *resize = args[0].from; + if (!resize || !*resize) { *newLVSize = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits; if (*newLVSize == 0) printk(KERN_ERR - "JFS: Cannot determine volume size\n"); + "JFS: Cannot determine volume size\n"); } else - *newLVSize = simple_strtoull(value, &value, 0); - - /* Silently ignore the quota options */ - } else if (!strcmp(this_char, "grpquota") - || !strcmp(this_char, "noquota") - || !strcmp(this_char, "quota") - || !strcmp(this_char, "usrquota")) - /* Don't do anything ;-) */ ; - else { - printk("jfs: Unrecognized mount option %s\n", - this_char); + *newLVSize = simple_strtoull(resize, &resize, 0); + break; + } + default: + printk("jfs: Unrecognized mount option \"%s\" " + " or missing value\n", p); goto cleanup; } } + if (nls_map) { /* Discard old (if remount) */ if (sbi->nls_tab) @@ -224,8 +248,7 @@ sbi->nls_tab = nls_map; } return 1; -needs_arg: - printk(KERN_ERR "JFS: %s needs an argument\n", this_char); + cleanup: if (nls_map) unload_nls(nls_map); diff -Nru a/fs/jfs/symlink.c b/fs/jfs/symlink.c --- a/fs/jfs/symlink.c Wed Oct 8 12:24:57 2003 +++ b/fs/jfs/symlink.c Wed Oct 8 12:24:57 2003 @@ -26,7 +26,7 @@ return vfs_follow_link(nd, s); } -static int jfs_readlink(struct dentry *dentry, char *buffer, int buflen) +static int jfs_readlink(struct dentry *dentry, char __user *buffer, int buflen) { char *s = JFS_IP(dentry->d_inode)->i_inline; return vfs_readlink(dentry, buffer, buflen, s); diff -Nru a/fs/libfs.c b/fs/libfs.c --- a/fs/libfs.c Wed Oct 8 12:24:55 2003 +++ b/fs/libfs.c Wed Oct 8 12:24:55 2003 @@ -429,3 +429,26 @@ spin_unlock(&pin_fs_lock); mntput(mnt); } + +EXPORT_SYMBOL(dcache_dir_close); +EXPORT_SYMBOL(dcache_dir_lseek); +EXPORT_SYMBOL(dcache_dir_open); +EXPORT_SYMBOL(dcache_readdir); +EXPORT_SYMBOL(generic_read_dir); +EXPORT_SYMBOL(simple_commit_write); +EXPORT_SYMBOL(simple_dir_inode_operations); +EXPORT_SYMBOL(simple_dir_operations); +EXPORT_SYMBOL(simple_empty); +EXPORT_SYMBOL(simple_fill_super); +EXPORT_SYMBOL(simple_getattr); +EXPORT_SYMBOL(simple_link); +EXPORT_SYMBOL(simple_lookup); +EXPORT_SYMBOL(simple_pin_fs); +EXPORT_SYMBOL(simple_prepare_write); +EXPORT_SYMBOL(simple_readpage); +EXPORT_SYMBOL(simple_release_fs); +EXPORT_SYMBOL(simple_rename); +EXPORT_SYMBOL(simple_rmdir); +EXPORT_SYMBOL(simple_statfs); +EXPORT_SYMBOL(simple_sync_file); +EXPORT_SYMBOL(simple_unlink); diff -Nru a/fs/locks.c b/fs/locks.c --- a/fs/locks.c Wed Oct 8 12:24:57 2003 +++ b/fs/locks.c Wed Oct 8 12:24:57 2003 @@ -138,6 +138,9 @@ for (lockp = &inode->i_flock; *lockp != NULL; lockp = &(*lockp)->fl_next) LIST_HEAD(file_lock_list); + +EXPORT_SYMBOL(file_lock_list); + static LIST_HEAD(blocked_list); static kmem_cache_t *filelock_cache; @@ -185,6 +188,8 @@ fl->fl_remove = NULL; } +EXPORT_SYMBOL(locks_init_lock); + /* * Initialises the fields of the file lock which are invariant for * free file_locks. @@ -218,6 +223,8 @@ new->fl_u = fl->fl_u; } +EXPORT_SYMBOL(locks_copy_lock); + static inline int flock_translate_cmd(int cmd) { if (cmd & LOCK_MAND) return cmd & (LOCK_MAND | LOCK_RW); @@ -604,6 +611,8 @@ return (cfl); } +EXPORT_SYMBOL(posix_test_lock); + /* This function tests for deadlock condition before putting a process to * sleep. The detection scheme is no longer recursive. Recursive was neat, * but dangerous - we risked stack corruption if the lock data was bad, or @@ -646,6 +655,8 @@ return 0; } +EXPORT_SYMBOL(posix_locks_deadlock); + /* Try to create a FLOCK lock on filp. We always insert new FLOCK locks * at the head of the list, but that's secret knowledge known only to * flock_lock_file and posix_lock_file. @@ -707,6 +718,8 @@ return error; } +EXPORT_SYMBOL(posix_lock_file); + static int __posix_lock_file(struct inode *inode, struct file_lock *request) { struct file_lock *fl; @@ -928,10 +941,10 @@ * locks_mandatory_area - Check for a conflicting lock * @read_write: %FLOCK_VERIFY_WRITE for exclusive access, %FLOCK_VERIFY_READ * for shared - * @inode: the file to check - * @file: how the file was opened (if it was) - * @offset: start of area to check - * @count: length of area to check + * @inode: the file to check + * @filp: how the file was opened (if it was) + * @offset: start of area to check + * @count: length of area to check * * Searches the inode's list of locks to find any POSIX locks which conflict. * This function is called from locks_verify_area() and @@ -978,6 +991,8 @@ return error; } +EXPORT_SYMBOL(locks_mandatory_area); + /* We already had a lease on this file; just change its type */ static int lease_modify(struct file_lock **before, int arg) { @@ -1116,9 +1131,12 @@ return error; } +EXPORT_SYMBOL(__break_lease); + /** * lease_get_mtime * @inode: the inode + * @time: pointer to a timespec which will contain the last modified time * * This is to force NFS clients to flush their caches for files with * exclusive leases. The justification is that if someone has an @@ -1133,6 +1151,8 @@ *time = inode->i_mtime; } +EXPORT_SYMBOL(lease_get_mtime); + /** * fcntl_getlease - Enquire what lease is currently active * @filp: the file @@ -1724,8 +1744,11 @@ locks_insert_block(blocker, waiter); } +EXPORT_SYMBOL(posix_block_lock); + /** * posix_unblock_lock - stop waiting for a file lock + * @filp: how the file was opened * @waiter: the lock which was waiting * * lockd needs to block waiting for locks. @@ -1748,6 +1771,8 @@ } } +EXPORT_SYMBOL(posix_unblock_lock); + static void lock_get_status(char* out, struct file_lock *fl, int id, char *pfx) { struct inode *inode = NULL; @@ -1918,6 +1943,8 @@ return result; } +EXPORT_SYMBOL(lock_may_read); + /** * lock_may_write - checks that the region is free of locks * @inode: the inode that is being written @@ -1954,6 +1981,8 @@ return result; } +EXPORT_SYMBOL(lock_may_write); + static int __init filelock_init(void) { filelock_cache = kmem_cache_create("file_lock_cache", @@ -1964,13 +1993,3 @@ } module_init(filelock_init) - -EXPORT_SYMBOL(file_lock_list); -EXPORT_SYMBOL(locks_init_lock); -EXPORT_SYMBOL(locks_copy_lock); -EXPORT_SYMBOL(posix_lock_file); -EXPORT_SYMBOL(posix_test_lock); -EXPORT_SYMBOL(posix_block_lock); -EXPORT_SYMBOL(posix_unblock_lock); -EXPORT_SYMBOL(posix_locks_deadlock); -EXPORT_SYMBOL(locks_mandatory_area); diff -Nru a/fs/namei.c b/fs/namei.c --- a/fs/namei.c Wed Oct 8 12:24:56 2003 +++ b/fs/namei.c Wed Oct 8 12:24:56 2003 @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -218,7 +219,7 @@ if (retval) return retval; - return security_inode_permission(inode, mask); + return security_inode_permission(inode, mask, nd); } /* @@ -302,7 +303,8 @@ * short-cut DAC fails, then call permission() to do more * complete permission check. */ -static inline int exec_permission_lite(struct inode *inode) +static inline int exec_permission_lite(struct inode *inode, + struct nameidata *nd) { umode_t mode = inode->i_mode; @@ -325,7 +327,7 @@ return -EACCES; ok: - return security_inode_permission(inode, MAY_EXEC); + return security_inode_permission(inode, MAY_EXEC, nd); } /* @@ -584,7 +586,7 @@ struct qstr this; unsigned int c; - err = exec_permission_lite(inode); + err = exec_permission_lite(inode, nd); if (err == -EAGAIN) { err = permission(inode, MAY_EXEC, nd); } @@ -2275,3 +2277,33 @@ .readlink = page_readlink, .follow_link = page_follow_link, }; + +EXPORT_SYMBOL(__user_walk); +EXPORT_SYMBOL(follow_down); +EXPORT_SYMBOL(follow_up); +EXPORT_SYMBOL(get_write_access); /* binfmt_aout */ +EXPORT_SYMBOL(getname); +EXPORT_SYMBOL(lock_rename); +EXPORT_SYMBOL(lookup_create); +EXPORT_SYMBOL(lookup_hash); +EXPORT_SYMBOL(lookup_one_len); +EXPORT_SYMBOL(page_follow_link); +EXPORT_SYMBOL(page_readlink); +EXPORT_SYMBOL(page_symlink); +EXPORT_SYMBOL(page_symlink_inode_operations); +EXPORT_SYMBOL(path_lookup); +EXPORT_SYMBOL(path_release); +EXPORT_SYMBOL(path_walk); +EXPORT_SYMBOL(permission); +EXPORT_SYMBOL(unlock_rename); +EXPORT_SYMBOL(vfs_create); +EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_link); +EXPORT_SYMBOL(vfs_mkdir); +EXPORT_SYMBOL(vfs_mknod); +EXPORT_SYMBOL(vfs_permission); +EXPORT_SYMBOL(vfs_readlink); +EXPORT_SYMBOL(vfs_rename); +EXPORT_SYMBOL(vfs_rmdir); +EXPORT_SYMBOL(vfs_symlink); +EXPORT_SYMBOL(vfs_unlink); diff -Nru a/fs/namespace.c b/fs/namespace.c --- a/fs/namespace.c Wed Oct 8 12:24:57 2003 +++ b/fs/namespace.c Wed Oct 8 12:24:57 2003 @@ -94,6 +94,8 @@ return found; } +EXPORT_SYMBOL(lookup_mnt); + static int check_mnt(struct vfsmount *mnt) { spin_lock(&vfsmount_lock); @@ -164,6 +166,8 @@ deactivate_super(sb); } +EXPORT_SYMBOL(__mntput); + /* iterator */ static void *m_start(struct seq_file *m, loff_t *pos) { @@ -259,6 +263,8 @@ return 0; } +EXPORT_SYMBOL(may_umount); + void umount_tree(struct vfsmount *mnt) { struct vfsmount *p; @@ -925,6 +931,8 @@ } } +EXPORT_SYMBOL(set_fs_root); + /* * Replace the fs->{pwdmnt,pwd} with {mnt,dentry}. Put the old values. * It can block. Requires the big lock held. @@ -947,6 +955,8 @@ mntput(old_pwdmnt); } } + +EXPORT_SYMBOL(set_fs_pwd); static void chroot_fs_refs(struct nameidata *old_nd, struct nameidata *new_nd) { diff -Nru a/fs/ncpfs/ioctl.c b/fs/ncpfs/ioctl.c --- a/fs/ncpfs/ioctl.c Wed Oct 8 12:24:56 2003 +++ b/fs/ncpfs/ioctl.c Wed Oct 8 12:24:56 2003 @@ -112,7 +112,7 @@ return -EINVAL; } /* TODO: info.addr = server->m.serv_addr; */ - info.mounted_uid = NEW_TO_OLD_UID(server->m.mounted_uid); + SET_UID(info.mounted_uid, server->m.mounted_uid); info.connection = server->connection; info.buffer_size = server->buffer_size; info.volume_number = NCP_FINFO(inode)->volNumber; @@ -637,11 +637,13 @@ /* NCP_IOC_GETMOUNTUID may be same as NCP_IOC_GETMOUNTUID2, so we have this out of switch */ if (cmd == NCP_IOC_GETMOUNTUID) { + __kernel_uid_t uid = 0; if ((permission(inode, MAY_READ, NULL) != 0) && (current->uid != server->m.mounted_uid)) { return -EACCES; } - if (put_user(NEW_TO_OLD_UID(server->m.mounted_uid), (__kernel_uid_t *) arg)) + SET_UID(uid, server->m.mounted_uid); + if (put_user(uid, (__kernel_uid_t *) arg)) return -EFAULT; return 0; } diff -Nru a/fs/nfs/dir.c b/fs/nfs/dir.c --- a/fs/nfs/dir.c Wed Oct 8 12:24:56 2003 +++ b/fs/nfs/dir.c Wed Oct 8 12:24:56 2003 @@ -688,7 +688,7 @@ goto out_unlock; } error = -EACCES; - inode = nfs_fhget(dentry, &fhandle, &fattr); + inode = nfs_fhget(dentry->d_sb, &fhandle, &fattr); if (!inode) goto out_unlock; no_entry: @@ -785,13 +785,16 @@ struct inode *inode; int error = -EACCES; + /* We may have been initialized further down */ + if (dentry->d_inode) + return 0; if (fhandle->size == 0 || !(fattr->valid & NFS_ATTR_FATTR)) { struct inode *dir = dentry->d_parent->d_inode; error = NFS_PROTO(dir)->lookup(dir, &dentry->d_name, fhandle, fattr); if (error) goto out_err; } - inode = nfs_fhget(dentry, fhandle, fattr); + inode = nfs_fhget(dentry->d_sb, fhandle, fattr); if (inode) { d_instantiate(dentry, inode); nfs_renew_times(dentry); @@ -813,8 +816,7 @@ struct nameidata *nd) { struct iattr attr; - struct nfs_fattr fattr; - struct nfs_fh fhandle; + struct inode *inode; int error; int open_flags = 0; @@ -835,12 +837,15 @@ */ lock_kernel(); nfs_zap_caches(dir); - error = NFS_PROTO(dir)->create(dir, &dentry->d_name, - &attr, open_flags, &fhandle, &fattr); - if (!error) - error = nfs_instantiate(dentry, &fhandle, &fattr); - else + inode = NFS_PROTO(dir)->create(dir, &dentry->d_name, &attr, open_flags); + if (!IS_ERR(inode)) { + d_instantiate(dentry, inode); + nfs_renew_times(dentry); + error = 0; + } else { + error = PTR_ERR(inode); d_drop(dentry); + } unlock_kernel(); return error; } diff -Nru a/fs/nfs/file.c b/fs/nfs/file.c --- a/fs/nfs/file.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfs/file.c Wed Oct 8 12:24:57 2003 @@ -35,6 +35,7 @@ #define NFSDBG_FACILITY NFSDBG_FILE static int nfs_file_open(struct inode *, struct file *); +static int nfs_file_release(struct inode *, struct file *); static int nfs_file_mmap(struct file *, struct vm_area_struct *); static ssize_t nfs_file_sendfile(struct file *, loff_t *, size_t, read_actor_t, void *); static ssize_t nfs_file_read(struct kiocb *, char *, size_t, loff_t); @@ -51,7 +52,7 @@ .mmap = nfs_file_mmap, .open = nfs_file_open, .flush = nfs_file_flush, - .release = nfs_release, + .release = nfs_file_release, .fsync = nfs_fsync, .lock = nfs_lock, .sendfile = nfs_file_sendfile, @@ -82,11 +83,14 @@ /* Do NFSv4 open() call */ if ((open = server->rpc_ops->file_open) != NULL) res = open(inode, filp); - /* Call generic open code in order to cache credentials */ - if (!res) - res = nfs_open(inode, filp); unlock_kernel(); return res; +} + +static int +nfs_file_release(struct inode *inode, struct file *filp) +{ + return NFS_PROTO(inode)->file_release(inode, filp); } /* diff -Nru a/fs/nfs/idmap.c b/fs/nfs/idmap.c --- a/fs/nfs/idmap.c Wed Oct 8 12:24:56 2003 +++ b/fs/nfs/idmap.c Wed Oct 8 12:24:56 2003 @@ -113,6 +113,7 @@ init_MUTEX(&idmap->idmap_lock); init_MUTEX(&idmap->idmap_im_lock); init_MUTEX(&idmap->idmap_hash_lock); + init_waitqueue_head(&idmap->idmap_wq); return (idmap); @@ -126,7 +127,10 @@ { struct idmap *idmap = server->idmap; + if (!idmap) + return; rpc_unlink(idmap->idmap_path); + server->idmap = NULL; kfree(idmap); } @@ -181,17 +185,17 @@ msg.data = im; msg.len = sizeof(*im); - init_waitqueue_head(&idmap->idmap_wq); add_wait_queue(&idmap->idmap_wq, &wq); - set_current_state(TASK_UNINTERRUPTIBLE); - if (rpc_queue_upcall(idmap->idmap_dentry->d_inode, &msg) < 0) { - set_current_state(TASK_RUNNING); + remove_wait_queue(&idmap->idmap_wq, &wq); goto out; } + set_current_state(TASK_UNINTERRUPTIBLE); up(&idmap->idmap_im_lock); schedule(); + current->state = TASK_RUNNING; + remove_wait_queue(&idmap->idmap_wq, &wq); down(&idmap->idmap_im_lock); /* @@ -252,20 +256,21 @@ msg.data = im; msg.len = sizeof(*im); - init_waitqueue_head(&idmap->idmap_wq); add_wait_queue(&idmap->idmap_wq, &wq); - set_current_state(TASK_UNINTERRUPTIBLE); if (rpc_queue_upcall(idmap->idmap_dentry->d_inode, &msg) < 0) { - set_current_state(TASK_RUNNING); + remove_wait_queue(&idmap->idmap_wq, &wq); goto out; } /* * XXX add timeouts here */ + set_current_state(TASK_UNINTERRUPTIBLE); up(&idmap->idmap_im_lock); schedule(); + current->state = TASK_RUNNING; + remove_wait_queue(&idmap->idmap_wq, &wq); down(&idmap->idmap_im_lock); if (im->im_status & IDMAP_STATUS_SUCCESS) { @@ -298,8 +303,14 @@ mlen = buflen; left = copy_to_user(dst, data, mlen); - - return (mlen - left); + if (left < 0) { + msg->errno = left; + return left; + } + mlen -= left; + msg->copied += mlen; + msg->errno = 0; + return mlen; } static ssize_t @@ -342,7 +353,6 @@ if (match) { memcpy(im, &im_in, sizeof(*im)); wake_up(&idmap->idmap_wq); - __rpc_purge_current_upcall(filp); } else if (!badmsg) { hashtype = im_in.im_conv == IDMAP_CONV_IDTONAME ? IDMAP_HASH_TYPE_ID : IDMAP_HASH_TYPE_NAME; @@ -361,6 +371,8 @@ struct idmap_msg *im = msg->data; struct idmap *idmap = container_of(im, struct idmap, idmap_im); + if (msg->errno >= 0) + return; down(&idmap->idmap_im_lock); im->im_status = IDMAP_STATUS_LOOKUPFAIL; wake_up(&idmap->idmap_wq); diff -Nru a/fs/nfs/inode.c b/fs/nfs/inode.c --- a/fs/nfs/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfs/inode.c Wed Oct 8 12:24:57 2003 @@ -42,7 +42,17 @@ #define NFSDBG_FACILITY NFSDBG_VFS #define NFS_PARANOIA 1 -static struct inode * __nfs_fhget(struct super_block *, struct nfs_fh *, struct nfs_fattr *); +/* Maximum number of readahead requests + * FIXME: this should really be a sysctl so that users may tune it to suit + * their needs. People that do NFS over a slow network, might for + * instance want to reduce it to something closer to 1 for improved + * interactive response. + * + * For the moment, though, we instead set it to RPC_MAXREQS, which + * is the maximum number of simultaneous RPC requests on the wire. + */ +#define NFS_MAX_READAHEAD RPC_MAXREQS + void nfs_zap_caches(struct inode *); static void nfs_invalidate_inode(struct inode *); @@ -141,10 +151,6 @@ cred = nfsi->cache_access.cred; if (cred) put_rpccred(cred); - /* Clean up the V4 state */ - nfs4_put_shareowner(inode, nfsi->wo_owner); - nfs4_put_shareowner(inode, nfsi->ro_owner); - nfs4_put_shareowner(inode, nfsi->rw_owner); } void @@ -262,7 +268,7 @@ return error; } - *rooti = __nfs_fhget(sb, rootfh, &fattr); + *rooti = nfs_fhget(sb, rootfh, &fattr); if (error == -EACCES && authflavor > RPC_AUTH_MAXFLAVOR) { if (*rooti) { NFS_FLAGS(*rooti) |= NFS_INO_FAKE_ROOT; @@ -356,7 +362,7 @@ server->acdirmin = server->acdirmax = 0; sb->s_flags |= MS_SYNCHRONOUS; } - server->backing_dev_info.ra_pages = server->rpages << 2; + server->backing_dev_info.ra_pages = server->rpages * NFS_MAX_READAHEAD; sb->s_maxbytes = fsinfo.maxfilesize; if (sb->s_maxbytes > MAX_LFS_FILESIZE) @@ -681,33 +687,15 @@ return 0; } -/* - * This is our own version of iget that looks up inodes by file handle - * instead of inode number. We use this technique instead of using - * the vfs read_inode function because there is no way to pass the - * file handle or current attributes into the read_inode function. - * - */ -struct inode * -nfs_fhget(struct dentry *dentry, struct nfs_fh *fhandle, - struct nfs_fattr *fattr) -{ - struct super_block *sb = dentry->d_sb; - - dprintk("NFS: nfs_fhget(%s/%s fileid=%Ld)\n", - dentry->d_parent->d_name.name, dentry->d_name.name, - (long long)fattr->fileid); - return __nfs_fhget(sb, fhandle, fattr); -} - /* Don't use READDIRPLUS on directories that we believe are too large */ #define NFS_LIMIT_READDIRPLUS (8*PAGE_SIZE) /* - * Look up the inode by super block and fattr->fileid. + * This is our front-end to iget that looks up inodes by file handle + * instead of inode number. */ -static struct inode * -__nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) +struct inode * +nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) { struct nfs_find_desc desc = { .fh = fh, @@ -790,7 +778,7 @@ unlock_new_inode(inode); } else nfs_refresh_inode(inode, fattr); - dprintk("NFS: __nfs_fhget(%s/%Ld ct=%d)\n", + dprintk("NFS: nfs_fhget(%s/%Ld ct=%d)\n", inode->i_sb->s_id, (long long)NFS_FILEID(inode), atomic_read(&inode->i_count)); @@ -799,7 +787,7 @@ return inode; out_no_inode: - printk("__nfs_fhget: iget failed\n"); + printk("nfs_fhget: iget failed\n"); goto out; } @@ -899,7 +887,7 @@ * Ensure that mmap has a recent RPC credential for use when writing out * shared pages */ -static inline void +void nfs_set_mmcred(struct inode *inode, struct rpc_cred *cred) { struct rpc_cred **p = &NFS_I(inode)->mm_cred, @@ -1581,9 +1569,7 @@ #define nfs4_zero_state(nfsi) \ do { \ - (nfsi)->wo_owner = NULL; \ - (nfsi)->ro_owner = NULL; \ - (nfsi)->rw_owner = NULL; \ + INIT_LIST_HEAD(&(nfsi)->open_states); \ } while(0) #define register_nfs4fs() register_filesystem(&nfs4_fs_type) #define unregister_nfs4fs() unregister_filesystem(&nfs4_fs_type) diff -Nru a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c --- a/fs/nfs/nfs3proc.c Wed Oct 8 12:24:56 2003 +++ b/fs/nfs/nfs3proc.c Wed Oct 8 12:24:56 2003 @@ -81,6 +81,18 @@ } } +static struct rpc_cred * +nfs_cred(struct inode *inode, struct file *filp) +{ + struct rpc_cred *cred = NULL; + + if (filp) + cred = (struct rpc_cred *)filp->private_data; + if (!cred) + cred = NFS_I(inode)->mm_cred; + return cred; +} + /* * Bare-bones access to getattr: this is for nfs_read_super. */ @@ -225,91 +237,63 @@ } static int -nfs3_proc_read(struct inode *inode, struct rpc_cred *cred, - struct nfs_fattr *fattr, int flags, - unsigned int base, unsigned int count, struct page *page, - int *eofp) +nfs3_proc_read(struct nfs_read_data *rdata, struct file *filp) { - u64 offset = page_offset(page) + base; - struct nfs_readargs arg = { - .fh = NFS_FH(inode), - .offset = offset, - .count = count, - .pgbase = base, - .pages = &page - }; - struct nfs_readres res = { - .fattr = fattr, - .count = count, - }; + int flags = rdata->flags; + struct inode * inode = rdata->inode; + struct nfs_fattr * fattr = rdata->res.fattr; struct rpc_message msg = { .rpc_proc = &nfs3_procedures[NFS3PROC_READ], - .rpc_argp = &arg, - .rpc_resp = &res, - .rpc_cred = cred + .rpc_argp = &rdata->args, + .rpc_resp = &rdata->res, }; int status; - dprintk("NFS call read %d @ %Ld\n", count, (long long)offset); + dprintk("NFS call read %d @ %Ld\n", rdata->args.count, + (long long) rdata->args.offset); fattr->valid = 0; + msg.rpc_cred = nfs_cred(inode, filp); status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags); if (status >= 0) nfs_refresh_inode(inode, fattr); dprintk("NFS reply read: %d\n", status); - *eofp = res.eof; return status; } static int -nfs3_proc_write(struct inode *inode, struct rpc_cred *cred, - struct nfs_fattr *fattr, int flags, - unsigned int base, unsigned int count, - struct page *page, struct nfs_writeverf *verf) +nfs3_proc_write(struct nfs_write_data *wdata, struct file *filp) { - u64 offset = page_offset(page) + base; - struct nfs_writeargs arg = { - .fh = NFS_FH(inode), - .offset = offset, - .count = count, - .stable = NFS_FILE_SYNC, - .pgbase = base, - .pages = &page - }; - struct nfs_writeres res = { - .fattr = fattr, - .verf = verf, - }; + int rpcflags = wdata->flags; + struct inode * inode = wdata->inode; + struct nfs_fattr * fattr = wdata->res.fattr; struct rpc_message msg = { .rpc_proc = &nfs3_procedures[NFS3PROC_WRITE], - .rpc_argp = &arg, - .rpc_resp = &res, - .rpc_cred = cred + .rpc_argp = &wdata->args, + .rpc_resp = &wdata->res, }; - int status, rpcflags = 0; + int status; - dprintk("NFS call write %d @ %Ld\n", count, (long long)offset); + dprintk("NFS call write %d @ %Ld\n", wdata->args.count, + (long long) wdata->args.offset); fattr->valid = 0; - if (flags & NFS_RW_SWAP) - rpcflags |= NFS_RPC_SWAPFLAGS; - arg.stable = (flags & NFS_RW_SYNC) ? NFS_FILE_SYNC : NFS_UNSTABLE; - + msg.rpc_cred = nfs_cred(inode, filp); status = rpc_call_sync(NFS_CLIENT(inode), &msg, rpcflags); - if (status >= 0) nfs3_write_refresh_inode(inode, fattr); - - dprintk("NFS reply read: %d\n", status); - return status < 0? status : res.count; + dprintk("NFS reply write: %d\n", status); + return status < 0? status : wdata->res.count; } /* * Create a regular file. * For now, we don't implement O_EXCL. */ -static int +static struct inode * nfs3_proc_create(struct inode *dir, struct qstr *name, struct iattr *sattr, - int flags, struct nfs_fh *fhandle, struct nfs_fattr *fattr) + int flags) { + struct nfs_fh fhandle; + struct nfs_fattr fattr; struct nfs_fattr dir_attr; struct nfs3_createargs arg = { .fh = NFS_FH(dir), @@ -319,8 +303,8 @@ }; struct nfs3_diropres res = { .dir_attr = &dir_attr, - .fh = fhandle, - .fattr = fattr + .fh = &fhandle, + .fattr = &fattr }; int status; @@ -334,7 +318,7 @@ again: dir_attr.valid = 0; - fattr->valid = 0; + fattr.valid = 0; status = rpc_call(NFS_CLIENT(dir), NFS3PROC_CREATE, &arg, &res, 0); nfs_refresh_inode(dir, &dir_attr); @@ -359,11 +343,19 @@ exit: dprintk("NFS reply create: %d\n", status); + if (status != 0) + goto out; + if (fhandle.size == 0 || !(fattr.valid & NFS_ATTR_FATTR)) { + status = nfs3_proc_lookup(dir, name, &fhandle, &fattr); + if (status != 0) + goto out; + } + /* When we created the file with exclusive semantics, make * sure we set the attributes afterwards. */ - if (status == 0 && arg.createmode == NFS3_CREATE_EXCLUSIVE) { + if (arg.createmode == NFS3_CREATE_EXCLUSIVE) { struct nfs3_sattrargs arg = { - .fh = fhandle, + .fh = &fhandle, .sattr = sattr, }; dprintk("NFS call setattr (post-create)\n"); @@ -371,13 +363,20 @@ /* Note: we could use a guarded setattr here, but I'm * not sure this buys us anything (and I'd have * to revamp the NFSv3 XDR code) */ - fattr->valid = 0; + fattr.valid = 0; status = rpc_call(NFS_CLIENT(dir), NFS3PROC_SETATTR, - &arg, fattr, 0); + &arg, &fattr, 0); dprintk("NFS reply setattr (post-create): %d\n", status); } - - return status; + if (status == 0) { + struct inode *inode; + inode = nfs_fhget(dir->i_sb, &fhandle, &fattr); + if (inode) + return inode; + status = -ENOMEM; + } +out: + return ERR_PTR(status); } static int @@ -853,6 +852,27 @@ rpc_call_setup(&data->task, &msg, 0); } +/* + * Set up the nfspage struct with the right credentials + */ +void +nfs3_request_init(struct nfs_page *req, struct file *filp) +{ + req->wb_cred = get_rpccred(nfs_cred(req->wb_inode, filp)); +} + +static int +nfs3_request_compatible(struct nfs_page *req, struct file *filp, struct page *page) +{ + if (req->wb_file != filp) + return 0; + if (req->wb_page != page) + return 0; + if (req->wb_cred != nfs_file_cred(filp)) + return 0; + return 1; +} + struct nfs_rpc_ops nfs_v3_clientops = { .version = 3, /* protocol version */ .getroot = nfs3_proc_get_root, @@ -881,4 +901,8 @@ .read_setup = nfs3_proc_read_setup, .write_setup = nfs3_proc_write_setup, .commit_setup = nfs3_proc_commit_setup, + .file_open = nfs_open, + .file_release = nfs_release, + .request_init = nfs3_request_init, + .request_compatible = nfs3_request_compatible, }; diff -Nru a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c --- a/fs/nfs/nfs4proc.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfs/nfs4proc.c Wed Oct 8 12:24:57 2003 @@ -54,8 +54,7 @@ extern u32 *nfs4_decode_dirent(u32 *p, struct nfs_entry *entry, int plus); extern struct rpc_procinfo nfs4_procedures[]; -static nfs4_stateid zero_stateid = - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +extern nfs4_stateid zero_stateid; static spinlock_t renew_lock = SPIN_LOCK_UNLOCKED; @@ -218,8 +217,7 @@ struct nfs_fattr *fattr, struct nfs_fsstat *fsstat, struct nfs_fsinfo *fsinfo, - struct nfs_pathconf *pathconf, - u32 *bmres) + struct nfs_pathconf *pathconf) { struct nfs4_getattr *getattr = GET_OP(cp, getattr); @@ -228,7 +226,6 @@ getattr->gt_fsstat = fsstat; getattr->gt_fsinfo = fsinfo; getattr->gt_pathconf = pathconf; - getattr->gt_bmres = bmres; OPNUM(cp) = OP_GETATTR; cp->req_nops++; @@ -236,48 +233,43 @@ static void nfs4_setup_getattr(struct nfs4_compound *cp, - struct nfs_fattr *fattr, - u32 *bmres) + struct nfs_fattr *fattr) { __nfs4_setup_getattr(cp, nfs4_fattr_bitmap, fattr, - NULL, NULL, NULL, bmres); + NULL, NULL, NULL); } static void nfs4_setup_getrootattr(struct nfs4_compound *cp, struct nfs_fattr *fattr, - struct nfs_fsinfo *fsinfo, - u32 *bmres) + struct nfs_fsinfo *fsinfo) { __nfs4_setup_getattr(cp, nfs4_mount_bitmap, - fattr, NULL, fsinfo, NULL, bmres); + fattr, NULL, fsinfo, NULL); } static void nfs4_setup_statfs(struct nfs4_compound *cp, - struct nfs_fsstat *fsstat, - u32 *bmres) + struct nfs_fsstat *fsstat) { __nfs4_setup_getattr(cp, nfs4_statfs_bitmap, - NULL, fsstat, NULL, NULL, bmres); + NULL, fsstat, NULL, NULL); } static void nfs4_setup_fsinfo(struct nfs4_compound *cp, - struct nfs_fsinfo *fsinfo, - u32 *bmres) + struct nfs_fsinfo *fsinfo) { __nfs4_setup_getattr(cp, nfs4_fsinfo_bitmap, - NULL, NULL, fsinfo, NULL, bmres); + NULL, NULL, fsinfo, NULL); } static void nfs4_setup_pathconf(struct nfs4_compound *cp, - struct nfs_pathconf *pathconf, - u32 *bmres) + struct nfs_pathconf *pathconf) { __nfs4_setup_getattr(cp, nfs4_pathconf_bitmap, - NULL, NULL, NULL, pathconf, bmres); + NULL, NULL, NULL, pathconf); } static void @@ -343,7 +335,7 @@ BUG_ON(bufsize < 80); readdir->rd_cookie = (cookie > 2) ? cookie : 0; - memcpy(readdir->rd_req_verifier, verifier, sizeof(nfs4_verifier)); + memcpy(&readdir->rd_req_verifier, verifier, sizeof(readdir->rd_req_verifier)); readdir->rd_count = bufsize; readdir->rd_bmval[0] = FATTR4_WORD0_FILEID; readdir->rd_bmval[1] = 0; @@ -471,7 +463,7 @@ u32 *p; tv = CURRENT_TIME; - p = (u32 *)setclientid->sc_verifier; + p = (u32 *)setclientid->sc_verifier.data; *p++ = tv.tv_sec; *p++ = tv.tv_nsec; setclientid->sc_name = server->ip_addr; @@ -560,17 +552,15 @@ } } -int -nfs4_do_open(struct inode *dir, struct qstr *name, int flags, - struct iattr *sattr, struct nfs_fattr *fattr, - struct nfs_fh *fhandle, struct nfs4_shareowner **spp) +struct nfs4_state * +nfs4_do_open(struct inode *dir, struct qstr *name, int flags, struct iattr *sattr, struct rpc_cred *cred) { - struct nfs4_shareowner *sp; + struct nfs4_state_owner *sp; + struct nfs4_state *state = NULL; struct nfs_server *server = NFS_SERVER(dir); + struct inode *inode = NULL; struct nfs4_change_info d_cinfo; int status; - u32 f_bmres[2]; - u32 d_bmres[2]; struct nfs_fattr d_attr = { .valid = 0, }; @@ -579,17 +569,15 @@ }; struct nfs4_getattr f_getattr = { .gt_bmval = nfs4_fattr_bitmap, - .gt_attrs = (fattr == NULL ? &f_attr: fattr), - .gt_bmres = f_bmres, + .gt_attrs = &f_attr, }; struct nfs4_getattr d_getattr = { .gt_bmval = nfs4_fattr_bitmap, .gt_attrs = &d_attr, - .gt_bmres = d_bmres, }; struct nfs_openargs o_arg = { .fh = NFS_FH(dir), - .share_access = flags & O_ACCMODE, + .share_access = flags & (FMODE_READ|FMODE_WRITE), .clientid = NFS_SERVER(dir)->nfs4_state->cl_clientid, .opentype = (flags & O_CREAT) ? NFS4_OPEN_CREATE : NFS4_OPEN_NOCREATE, .createmode = (flags & O_EXCL) ? NFS4_CREATE_EXCLUSIVE : NFS4_CREATE_UNCHECKED, @@ -608,15 +596,16 @@ .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN], .rpc_argp = &o_arg, .rpc_resp = &o_res, + .rpc_cred = cred, }; status = -ENOMEM; - if (!(sp = nfs4_get_shareowner(dir))) { - dprintk("nfs4_do_open: nfs4_get_shareowner failed!\n"); + if (!(sp = nfs4_get_state_owner(NFS_SERVER(dir), cred))) { + dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); goto out; } if (o_arg.createmode & NFS4_CREATE_EXCLUSIVE){ - u32 *p = (u32 *) o_arg.u.verifier; + u32 *p = (u32 *) o_arg.u.verifier.data; p[0] = jiffies; p[1] = current->pid; } else if (o_arg.createmode == NFS4_CREATE_UNCHECKED) { @@ -635,11 +624,13 @@ process_cinfo(&d_cinfo, &d_attr); nfs_refresh_inode(dir, &d_attr); - if (fhandle) { - memset(fhandle, 0, sizeof(*fhandle)); - fhandle->size = (o_res.fh.size < NFS_MAXFHSIZE ? o_res.fh.size : NFS_MAXFHSIZE); - memcpy(fhandle->data, o_res.fh.data, fhandle->size); - } + status = -ENOMEM; + inode = nfs_fhget(dir->i_sb, &o_res.fh, &f_attr); + if (!inode) + goto out_up; + state = nfs4_get_open_state(inode, sp); + if (!state) + goto out_up; if(o_res.rflags & NFS4_OPEN_RESULT_CONFIRM) { struct nfs_open_confirmargs oc_arg = { @@ -653,35 +644,44 @@ .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM], .rpc_argp = &oc_arg, .rpc_resp = &oc_res, + .rpc_cred = cred, }; - memcpy(oc_arg.stateid, o_res.stateid, sizeof(nfs4_stateid)); + memcpy(&oc_arg.stateid, &o_res.stateid, sizeof(oc_arg.stateid)); status = rpc_call_sync(server->client, &msg, 0); if (status) goto out_up; nfs4_increment_seqid(status, sp); - memcpy(sp->so_stateid, oc_res.stateid, sizeof(nfs4_stateid)); + memcpy(&state->stateid, &oc_res.stateid, sizeof(state->stateid)); } else - memcpy(sp->so_stateid, o_res.stateid, sizeof(nfs4_stateid)); - sp->so_flags = flags & O_ACCMODE; + memcpy(&state->stateid, &o_res.stateid, sizeof(state->stateid)); + state->state |= flags & (FMODE_READ|FMODE_WRITE); + state->pid = current->pid; + + up(&sp->so_sema); + nfs4_put_state_owner(sp); + iput(inode); + return state; out_up: up(&sp->so_sema); + nfs4_put_state_owner(sp); + if (state) + nfs4_put_open_state(state); + if (inode) + iput(inode); out: - *spp = sp; - return status; + return ERR_PTR(status); } int nfs4_do_setattr(struct nfs_server *server, struct nfs_fattr *fattr, struct nfs_fh *fhandle, struct iattr *sattr, - struct nfs4_shareowner *sp) + struct nfs4_state *state) { - u32 g_bmres[2]; struct nfs4_getattr getattr = { .gt_bmval = nfs4_fattr_bitmap, .gt_attrs = fattr, - .gt_bmres = g_bmres, }; struct nfs_setattrargs arg = { .fh = fhandle, @@ -701,10 +701,10 @@ fattr->valid = 0; - if (sp) - memcpy(arg.stateid, sp->so_stateid, sizeof(nfs4_stateid)); + if (state) + memcpy(&arg.stateid, &state->stateid, sizeof(arg.stateid)); else - memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid)); + memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid)); return(rpc_call_sync(server->client, &msg, 0)); } @@ -717,10 +717,13 @@ * NFSv4 citizens - we do not indicate to the server to update the file's * share state even when we are done with one of the three share * stateid's in the inode. + * + * NOTE: Caller must be holding the sp->so_owner semaphore! */ int -nfs4_do_close(struct inode *inode, struct nfs4_shareowner *sp) +nfs4_do_close(struct inode *inode, struct nfs4_state *state) { + struct nfs4_state_owner *sp = state->owner; int status = 0; struct nfs_closeargs arg = { .fh = NFS_FH(inode), @@ -734,17 +737,15 @@ .rpc_resp = &res, }; - memcpy(arg.stateid, sp->so_stateid, sizeof(nfs4_stateid)); + memcpy(&arg.stateid, &state->stateid, sizeof(arg.stateid)); /* Serialization for the sequence id */ - down(&sp->so_sema); arg.seqid = sp->so_seqid, status = rpc_call_sync(NFS_SERVER(inode)->client, &msg, 0); /* hmm. we are done with the inode, and in the process of freeing - * the shareowner. we keep this around to process errors + * the state_owner. we keep this around to process errors */ nfs4_increment_seqid(status, sp); - up(&sp->so_sema); return status; } @@ -753,19 +754,32 @@ nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr) { + struct nfs4_client *clp; struct nfs4_compound compound; struct nfs4_op ops[4]; struct nfs_fsinfo fsinfo; - u32 bmres[2]; unsigned char * p; struct qstr q; int status; - fattr->valid = 0; - - if (!(server->nfs4_state = nfs4_get_client())) + clp = server->nfs4_state = nfs4_get_client(&server->addr.sin_addr); + if (!clp) return -ENOMEM; + down_write(&clp->cl_sem); + /* Has the clientid already been initialized? */ + if (clp->cl_state != NFS4CLNT_NEW) { + /* Yep, so just read the root attributes and the lease time. */ + fattr->valid = 0; + nfs4_setup_compound(&compound, ops, server, "getrootfh"); + nfs4_setup_putrootfh(&compound); + nfs4_setup_getrootattr(&compound, fattr, &fsinfo); + nfs4_setup_getfh(&compound, fhandle); + if ((status = nfs4_call_compound(&compound, NULL, 0))) + goto out_unlock; + goto no_setclientid; + } + /* * SETCLIENTID. * Until delegations are imported, we don't bother setting the program @@ -774,28 +788,33 @@ nfs4_setup_compound(&compound, ops, server, "setclientid"); nfs4_setup_setclientid(&compound, 0, 0); if ((status = nfs4_call_compound(&compound, NULL, 0))) - goto out; + goto out_unlock; /* * SETCLIENTID_CONFIRM, plus root filehandle. * We also get the lease time here. */ + fattr->valid = 0; nfs4_setup_compound(&compound, ops, server, "setclientid_confirm"); nfs4_setup_setclientid_confirm(&compound); nfs4_setup_putrootfh(&compound); - nfs4_setup_getrootattr(&compound, fattr, &fsinfo, bmres); + nfs4_setup_getrootattr(&compound, fattr, &fsinfo); nfs4_setup_getfh(&compound, fhandle); if ((status = nfs4_call_compound(&compound, NULL, 0))) - goto out; - + goto out_unlock; + clp->cl_state = NFS4CLNT_OK; + +no_setclientid: /* * Now that we have instantiated the clientid and determined * the lease time, we can initialize the renew daemon for this * server. + * FIXME: we only need one renewd daemon per server. */ server->lease_time = fsinfo.lease_time * HZ; if ((status = nfs4_init_renewd(server))) - goto out; + goto out_unlock; + up_write(&clp->cl_sem); /* * Now we do a separate LOOKUP for each component of the mount path. @@ -813,10 +832,11 @@ p++; q.len = p - q.name; + fattr->valid = 0; nfs4_setup_compound(&compound, ops, server, "mount"); nfs4_setup_putfh(&compound, fhandle); nfs4_setup_lookup(&compound, &q); - nfs4_setup_getattr(&compound, fattr, bmres); + nfs4_setup_getattr(&compound, fattr); nfs4_setup_getfh(&compound, fhandle); status = nfs4_call_compound(&compound, NULL, 0); if (!status) @@ -827,8 +847,10 @@ } break; } - -out: + return status; +out_unlock: + up_write(&clp->cl_sem); + nfs4_put_client(clp); return status; } @@ -837,13 +859,12 @@ { struct nfs4_compound compound; struct nfs4_op ops[2]; - u32 bmres[2]; fattr->valid = 0; nfs4_setup_compound(&compound, ops, NFS_SERVER(inode), "getattr"); nfs4_setup_putfh(&compound, NFS_FH(inode)); - nfs4_setup_getattr(&compound, fattr, bmres); + nfs4_setup_getattr(&compound, fattr); return nfs4_call_compound(&compound, NULL, 0); } @@ -870,31 +891,29 @@ { struct inode * inode = dentry->d_inode; int size_change = sattr->ia_valid & ATTR_SIZE; - struct nfs4_shareowner *sp = NULL; + struct nfs4_state *state = NULL; int status; fattr->valid = 0; if (size_change) { - if (NFS_I(inode)->wo_owner) { - /* file is already open for O_WRONLY */ - sp = NFS_I(inode)->wo_owner; - goto no_open; - } - status = nfs4_do_open(dentry->d_parent->d_inode, - &dentry->d_name, O_WRONLY, NULL, fattr, - NULL, &sp); - if (status) - return status; + struct rpc_cred *cred = rpcauth_lookupcred(NFS_SERVER(inode)->client->cl_auth, 0); + state = nfs4_do_open(dentry->d_parent->d_inode, + &dentry->d_name, FMODE_WRITE, NULL, cred); + put_rpccred(cred); + if (IS_ERR(state)) + return PTR_ERR(state); - if (fattr->fileid != NFS_FILEID(inode)) { + if (state->inode != inode) { printk(KERN_WARNING "nfs: raced in setattr, returning -EIO\n"); + nfs4_put_open_state(state); return -EIO; } } -no_open: status = nfs4_do_setattr(NFS_SERVER(inode), fattr, - NFS_FH(inode), sattr, sp); + NFS_FH(inode), sattr, state); + if (state) + nfs4_put_open_state(state); return status; } @@ -905,8 +924,6 @@ struct nfs4_compound compound; struct nfs4_op ops[5]; struct nfs_fattr dir_attr; - u32 dir_bmres[2]; - u32 bmres[2]; int status; dir_attr.valid = 0; @@ -915,9 +932,9 @@ dprintk("NFS call lookup %s\n", name->name); nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "lookup"); nfs4_setup_putfh(&compound, NFS_FH(dir)); - nfs4_setup_getattr(&compound, &dir_attr, dir_bmres); + nfs4_setup_getattr(&compound, &dir_attr); nfs4_setup_lookup(&compound, name); - nfs4_setup_getattr(&compound, fattr, bmres); + nfs4_setup_getattr(&compound, fattr); nfs4_setup_getfh(&compound, fhandle); status = nfs4_call_compound(&compound, NULL, 0); dprintk("NFS reply lookup: %d\n", status); @@ -933,7 +950,6 @@ struct nfs4_compound compound; struct nfs4_op ops[3]; struct nfs_fattr fattr; - u32 bmres[2]; u32 req_access = 0, resp_supported, resp_access; int status; @@ -959,7 +975,7 @@ nfs4_setup_compound(&compound, ops, NFS_SERVER(inode), "access"); nfs4_setup_putfh(&compound, NFS_FH(inode)); - nfs4_setup_getattr(&compound, &fattr, bmres); + nfs4_setup_getattr(&compound, &fattr); nfs4_setup_access(&compound, req_access, &resp_supported, &resp_access); status = nfs4_call_compound(&compound, cred, 0); nfs_refresh_inode(inode, &fattr); @@ -1012,45 +1028,33 @@ } static int -nfs4_proc_read(struct inode *inode, struct rpc_cred *cred, - struct nfs_fattr *fattr, int flags, - unsigned int base, unsigned int count, - struct page *page, int *eofp) +nfs4_proc_read(struct nfs_read_data *rdata, struct file *filp) { + int flags = rdata->flags; + struct inode *inode = rdata->inode; + struct nfs_fattr *fattr = rdata->res.fattr; struct nfs_server *server = NFS_SERVER(inode); - struct nfs4_shareowner *sp; - uint64_t offset = page_offset(page) + base; - struct nfs_readargs arg = { - .fh = NFS_FH(inode), - .offset = offset, - .count = count, - .pgbase = base, - .pages = &page, - }; - struct nfs_readres res = { - .fattr = fattr, - .count = count, - }; struct rpc_message msg = { .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ], - .rpc_argp = &arg, - .rpc_resp = &res, - .rpc_cred = cred, + .rpc_argp = &rdata->args, + .rpc_resp = &rdata->res, + .rpc_cred = rdata->cred, }; unsigned long timestamp = jiffies; int status; - dprintk("NFS call read %d @ %Ld\n", count, (long long)offset); + dprintk("NFS call read %d @ %Ld\n", rdata->args.count, + (long long) rdata->args.offset); + /* - * Try first to use O_RDONLY, then O_RDWR stateid. - */ - sp = nfs4_get_inode_share(inode, O_RDONLY); - if (!sp) - sp = nfs4_get_inode_share(inode, O_RDWR); - if (sp) - memcpy(arg.stateid,sp->so_stateid, sizeof(nfs4_stateid)); - else - memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid)); + * Try first to use O_RDONLY, then O_RDWR stateid. + */ + if (filp) { + struct nfs4_state *state; + state = (struct nfs4_state *)filp->private_data; + memcpy(&rdata->args.stateid, &state->stateid, sizeof(rdata->args.stateid)); + } else + memcpy(&rdata->args.stateid, &zero_stateid, sizeof(rdata->args.stateid)); fattr->valid = 0; status = rpc_call_sync(server->client, &msg, flags); @@ -1061,56 +1065,41 @@ nfs_zap_caches(inode); } dprintk("NFS reply read: %d\n", status); - *eofp = res.eof; return status; } static int -nfs4_proc_write(struct inode *inode, struct rpc_cred *cred, - struct nfs_fattr *fattr, int flags, - unsigned int base, unsigned int count, - struct page *page, struct nfs_writeverf *verf) +nfs4_proc_write(struct nfs_write_data *wdata, struct file *filp) { + int rpcflags = wdata->flags; + struct inode *inode = wdata->inode; + struct nfs_fattr *fattr = wdata->res.fattr; struct nfs_server *server = NFS_SERVER(inode); - struct nfs4_shareowner *sp; - uint64_t offset = page_offset(page) + base; - struct nfs_writeargs arg = { - .fh = NFS_FH(inode), - .offset = offset, - .count = count, - .stable = (flags & NFS_RW_SYNC) ? NFS_FILE_SYNC : NFS_UNSTABLE, - .pgbase = base, - .pages = &page, - }; - struct nfs_writeres res = { - .fattr = fattr, - .count = count, - .verf = verf, - }; struct rpc_message msg = { .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE], - .rpc_argp = &arg, - .rpc_resp = &res, - .rpc_cred = cred, + .rpc_argp = &wdata->args, + .rpc_resp = &wdata->res, + .rpc_cred = wdata->cred, }; - int rpcflags = (flags & NFS_RW_SWAP) ? NFS_RPC_SWAPFLAGS : 0; + int status; - dprintk("NFS call write %d @ %Ld\n", count, (long long)offset); + dprintk("NFS call write %d @ %Ld\n", wdata->args.count, + (long long) wdata->args.offset); /* - * Try first to use O_WRONLY, then O_RDWR stateid. - */ - sp = nfs4_get_inode_share(inode, O_WRONLY); - if (!sp) - sp = nfs4_get_inode_share(inode, O_RDWR); - - if (sp) - memcpy(arg.stateid,sp->so_stateid, sizeof(nfs4_stateid)); - else - memcpy(arg.stateid, zero_stateid, sizeof(nfs4_stateid)); + * Try first to use O_WRONLY, then O_RDWR stateid. + */ + if (filp) { + struct nfs4_state *state; + state = (struct nfs4_state *)filp->private_data; + memcpy(&wdata->args.stateid, &state->stateid, sizeof(wdata->args.stateid)); + } else + memcpy(&wdata->args.stateid, &zero_stateid, sizeof(wdata->args.stateid)); fattr->valid = 0; - return rpc_call_sync(server->client, &msg, rpcflags); + status = rpc_call_sync(server->client, &msg, rpcflags); + dprintk("NFS reply write: %d\n", status); + return status; } /* @@ -1128,24 +1117,33 @@ * opens the file O_RDONLY. This will all be resolved with the VFS changes. */ -static int +static struct inode * nfs4_proc_create(struct inode *dir, struct qstr *name, struct iattr *sattr, - int flags, struct nfs_fh *fhandle, struct nfs_fattr *fattr) + int flags) { - int oflags; - struct nfs4_shareowner *sp = NULL; - int status; - - oflags = O_RDONLY | O_CREAT | (flags & O_EXCL); - status = nfs4_do_open(dir, name, oflags, sattr, fattr, fhandle, &sp); - if (!status) { + struct inode *inode; + struct nfs4_state *state = NULL; + struct rpc_cred *cred; + + cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0); + state = nfs4_do_open(dir, name, flags, sattr, cred); + put_rpccred(cred); + if (!IS_ERR(state)) { + inode = igrab(state->inode); if (flags & O_EXCL) { - status = nfs4_do_setattr(NFS_SERVER(dir), fattr, - fhandle, sattr, sp); - /* XXX should i bother closing the file? */ + struct nfs_fattr fattr; + int status; + status = nfs4_do_setattr(NFS_SERVER(dir), &fattr, + NFS_FH(inode), sattr, state); + if (status != 0) { + iput(inode); + inode = ERR_PTR(status); + } } - } - return status; + nfs4_put_open_state(state); + } else + inode = (struct inode *)state; + return inode; } static int @@ -1155,14 +1153,13 @@ struct nfs4_op ops[3]; struct nfs4_change_info dir_cinfo; struct nfs_fattr dir_attr; - u32 dir_bmres[2]; int status; dir_attr.valid = 0; nfs4_setup_compound(&compound, ops, NFS_SERVER(dir), "remove"); nfs4_setup_putfh(&compound, NFS_FH(dir)); nfs4_setup_remove(&compound, name, &dir_cinfo); - nfs4_setup_getattr(&compound, &dir_attr, dir_bmres); + nfs4_setup_getattr(&compound, &dir_attr); status = nfs4_call_compound(&compound, NULL, 0); if (!status) { @@ -1184,7 +1181,6 @@ { struct unlink_desc * up; struct nfs4_compound * cp; - u32 bmres[2]; up = (struct unlink_desc *) kmalloc(sizeof(*up), GFP_KERNEL); if (!up) @@ -1194,7 +1190,7 @@ nfs4_setup_compound(cp, up->ops, NFS_SERVER(dir->d_inode), "unlink_setup"); nfs4_setup_putfh(cp, NFS_FH(dir->d_inode)); nfs4_setup_remove(cp, name, &up->cinfo); - nfs4_setup_getattr(cp, &up->attrs, bmres); + nfs4_setup_getattr(cp, &up->attrs); msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMPOUND]; msg->rpc_argp = cp; @@ -1227,7 +1223,6 @@ struct nfs4_op ops[7]; struct nfs4_change_info old_cinfo, new_cinfo; struct nfs_fattr old_dir_attr, new_dir_attr; - u32 old_dir_bmres[2], new_dir_bmres[2]; int status; old_dir_attr.valid = 0; @@ -1238,9 +1233,9 @@ nfs4_setup_savefh(&compound); nfs4_setup_putfh(&compound, NFS_FH(new_dir)); nfs4_setup_rename(&compound, old_name, new_name, &old_cinfo, &new_cinfo); - nfs4_setup_getattr(&compound, &new_dir_attr, new_dir_bmres); + nfs4_setup_getattr(&compound, &new_dir_attr); nfs4_setup_restorefh(&compound); - nfs4_setup_getattr(&compound, &old_dir_attr, old_dir_bmres); + nfs4_setup_getattr(&compound, &old_dir_attr); status = nfs4_call_compound(&compound, NULL, 0); if (!status) { @@ -1259,7 +1254,6 @@ struct nfs4_op ops[7]; struct nfs4_change_info dir_cinfo; struct nfs_fattr dir_attr, fattr; - u32 dir_bmres[2], bmres[2]; int status; dir_attr.valid = 0; @@ -1270,9 +1264,9 @@ nfs4_setup_savefh(&compound); nfs4_setup_putfh(&compound, NFS_FH(dir)); nfs4_setup_link(&compound, name, &dir_cinfo); - nfs4_setup_getattr(&compound, &dir_attr, dir_bmres); + nfs4_setup_getattr(&compound, &dir_attr); nfs4_setup_restorefh(&compound); - nfs4_setup_getattr(&compound, &fattr, bmres); + nfs4_setup_getattr(&compound, &fattr); status = nfs4_call_compound(&compound, NULL, 0); if (!status) { @@ -1291,7 +1285,6 @@ struct nfs4_compound compound; struct nfs4_op ops[7]; struct nfs_fattr dir_attr; - u32 dir_bmres[2], bmres[2]; struct nfs4_change_info dir_cinfo; int status; @@ -1302,10 +1295,10 @@ nfs4_setup_putfh(&compound, NFS_FH(dir)); nfs4_setup_savefh(&compound); nfs4_setup_create_symlink(&compound, name, path, sattr, &dir_cinfo); - nfs4_setup_getattr(&compound, fattr, bmres); + nfs4_setup_getattr(&compound, fattr); nfs4_setup_getfh(&compound, fhandle); nfs4_setup_restorefh(&compound); - nfs4_setup_getattr(&compound, &dir_attr, dir_bmres); + nfs4_setup_getattr(&compound, &dir_attr); status = nfs4_call_compound(&compound, NULL, 0); if (!status) { @@ -1322,7 +1315,6 @@ struct nfs4_compound compound; struct nfs4_op ops[7]; struct nfs_fattr dir_attr; - u32 dir_bmres[2], bmres[2]; struct nfs4_change_info dir_cinfo; int status; @@ -1333,10 +1325,10 @@ nfs4_setup_putfh(&compound, NFS_FH(dir)); nfs4_setup_savefh(&compound); nfs4_setup_create_dir(&compound, name, sattr, &dir_cinfo); - nfs4_setup_getattr(&compound, fattr, bmres); + nfs4_setup_getattr(&compound, fattr); nfs4_setup_getfh(&compound, fhandle); nfs4_setup_restorefh(&compound); - nfs4_setup_getattr(&compound, &dir_attr, dir_bmres); + nfs4_setup_getattr(&compound, &dir_attr); status = nfs4_call_compound(&compound, NULL, 0); if (!status) { @@ -1373,7 +1365,6 @@ struct nfs4_compound compound; struct nfs4_op ops[7]; struct nfs_fattr dir_attr; - u32 dir_bmres[2], bmres[2]; struct nfs4_change_info dir_cinfo; int status; @@ -1384,10 +1375,10 @@ nfs4_setup_putfh(&compound, NFS_FH(dir)); nfs4_setup_savefh(&compound); nfs4_setup_create_special(&compound, name, rdev,sattr, &dir_cinfo); - nfs4_setup_getattr(&compound, fattr, bmres); + nfs4_setup_getattr(&compound, fattr); nfs4_setup_getfh(&compound, fh); nfs4_setup_restorefh(&compound); - nfs4_setup_getattr(&compound, &dir_attr, dir_bmres); + nfs4_setup_getattr(&compound, &dir_attr); status = nfs4_call_compound(&compound, NULL, 0); if (!status) { @@ -1403,12 +1394,11 @@ { struct nfs4_compound compound; struct nfs4_op ops[2]; - u32 bmres[2]; memset(fsstat, 0, sizeof(*fsstat)); nfs4_setup_compound(&compound, ops, server, "statfs"); nfs4_setup_putfh(&compound, fhandle); - nfs4_setup_statfs(&compound, fsstat, bmres); + nfs4_setup_statfs(&compound, fsstat); return nfs4_call_compound(&compound, NULL, 0); } @@ -1418,12 +1408,11 @@ { struct nfs4_compound compound; struct nfs4_op ops[2]; - u32 bmres[2]; memset(fsinfo, 0, sizeof(*fsinfo)); nfs4_setup_compound(&compound, ops, server, "statfs"); nfs4_setup_putfh(&compound, fhandle); - nfs4_setup_fsinfo(&compound, fsinfo, bmres); + nfs4_setup_fsinfo(&compound, fsinfo); return nfs4_call_compound(&compound, NULL, 0); } @@ -1433,12 +1422,11 @@ { struct nfs4_compound compound; struct nfs4_op ops[2]; - u32 bmres[2]; memset(pathconf, 0, sizeof(*pathconf)); nfs4_setup_compound(&compound, ops, server, "statfs"); nfs4_setup_putfh(&compound, fhandle); - nfs4_setup_pathconf(&compound, pathconf, bmres); + nfs4_setup_pathconf(&compound, pathconf); return nfs4_call_compound(&compound, NULL, 0); } @@ -1472,7 +1460,6 @@ }; struct inode *inode = data->inode; struct nfs_page *req = nfs_list_entry(data->pages.next); - struct nfs4_shareowner *sp; int flags; data->args.fh = NFS_FH(inode); @@ -1485,18 +1472,10 @@ data->res.eof = 0; data->timestamp = jiffies; - if(req->wb_file) { - unsigned int oflags = req->wb_file->f_flags; - sp = nfs4_get_inode_share(inode, oflags); - } else { - sp = nfs4_get_inode_share(inode, O_RDONLY); - if (!sp) - sp = nfs4_get_inode_share(inode, O_RDWR); - } - if (sp) - memcpy(data->args.stateid,sp->so_stateid, sizeof(nfs4_stateid)); + if (req->wb_state) + memcpy(&data->args.stateid, &req->wb_state->stateid, sizeof(data->args.stateid)); else - memcpy(data->args.stateid, zero_stateid, sizeof(nfs4_stateid)); + memcpy(&data->args.stateid, &zero_stateid, sizeof(data->args.stateid)); /* N.B. Do we need to test? Never called for swapfile inode */ flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0); @@ -1550,7 +1529,6 @@ }; struct inode *inode = data->inode; struct nfs_page *req = nfs_list_entry(data->pages.next); - struct nfs4_shareowner *sp; int stable; int flags; @@ -1573,19 +1551,10 @@ data->res.verf = &data->verf; data->timestamp = jiffies; - if(req->wb_file) { - unsigned int oflags = req->wb_file->f_flags; - sp = nfs4_get_inode_share(inode, oflags); - } else { - sp = nfs4_get_inode_share(inode, O_WRONLY); - if (!sp) - sp = nfs4_get_inode_share(inode, O_RDWR); - } - - if (sp) - memcpy(data->args.stateid,sp->so_stateid, sizeof(nfs4_stateid)); + if (req->wb_state) + memcpy(&data->args.stateid, &req->wb_state->stateid, sizeof(data->args.stateid)); else - memcpy(data->args.stateid, zero_stateid, sizeof(nfs4_stateid)); + memcpy(&data->args.stateid, &zero_stateid, sizeof(data->args.stateid)); /* Set the initial flags for the task. */ flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC; @@ -1699,48 +1668,99 @@ * due to the lookup, potential create, and open VFS calls from sys_open() * placed on the wire. */ -int +static int nfs4_proc_file_open(struct inode *inode, struct file *filp) { struct dentry *dentry = filp->f_dentry; struct inode *dir = dentry->d_parent->d_inode; - int flags, status = 0; + struct rpc_cred *cred; + struct nfs4_state *state; + int flags = filp->f_flags; + int status = 0; dprintk("nfs4_proc_file_open: starting on (%.*s/%.*s)\n", (int)dentry->d_parent->d_name.len, dentry->d_parent->d_name.name, (int)dentry->d_name.len, dentry->d_name.name); - lock_kernel(); - - /* isn't this done in open_namei? */ - if (!S_ISREG(inode->i_mode)) { - status = -EISDIR; - goto out; - } + if ((flags + 1) & O_ACCMODE) + flags++; - flags = filp->f_flags & O_ACCMODE; + lock_kernel(); /* -* Got race?? * We have already opened the file "O_EXCL" in nfs4_proc_create!! * This ugliness will go away with lookup-intent... */ - while (!nfs4_get_inode_share(inode, flags)) { - struct nfs4_shareowner *sp = NULL; - status = nfs4_do_open(dir, &dentry->d_name, flags, NULL, NULL, NULL, &sp); - if (status) { - nfs4_put_shareowner(inode,sp); - break; - } - if (nfs4_set_inode_share(inode, sp, flags)) - nfs4_put_shareowner(inode,sp); + cred = rpcauth_lookupcred(NFS_SERVER(inode)->client->cl_auth, 0); + state = nfs4_do_open(dir, &dentry->d_name, flags, NULL, cred); + if (IS_ERR(state)) { + status = PTR_ERR(state); + state = NULL; + } else if (filp->f_mode & FMODE_WRITE) + nfs_set_mmcred(inode, cred); + if (inode != filp->f_dentry->d_inode) { + printk(KERN_WARNING "NFS: v4 raced in function %s\n", __FUNCTION__); + status = -EIO; /* ERACE actually */ + nfs4_put_open_state(state); + state = NULL; } -out: + filp->private_data = state; + put_rpccred(cred); unlock_kernel(); return status; } +/* + * Release our state + */ +static int +nfs4_proc_file_release(struct inode *inode, struct file *filp) +{ + struct nfs4_state *state = (struct nfs4_state *)filp->private_data; + + if (state) + nfs4_put_open_state(state); + return 0; +} + +/* + * Set up the nfspage struct with the right state info and credentials + */ +static void +nfs4_request_init(struct nfs_page *req, struct file *filp) +{ + struct nfs4_state *state; + + if (!filp) { + req->wb_cred = get_rpccred(NFS_I(req->wb_inode)->mm_cred); + req->wb_state = NULL; + return; + } + state = (struct nfs4_state *)filp->private_data; + req->wb_state = state; + req->wb_cred = get_rpccred(state->owner->so_cred); +} + + +static int +nfs4_request_compatible(struct nfs_page *req, struct file *filp, struct page *page) +{ + struct nfs4_state *state = NULL; + struct rpc_cred *cred = NULL; + + if (req->wb_file != filp) + return 0; + if (req->wb_page != page) + return 0; + state = (struct nfs4_state *)filp->private_data; + if (req->wb_state != state) + return 0; + cred = state->owner->so_cred; + if (req->wb_cred != cred) + return 0; + return 1; +} struct nfs_rpc_ops nfs_v4_clientops = { .version = 4, /* protocol version */ @@ -1772,6 +1792,9 @@ .write_setup = nfs4_proc_write_setup, .commit_setup = nfs4_proc_commit_setup, .file_open = nfs4_proc_file_open, + .file_release = nfs4_proc_file_release, + .request_init = nfs4_request_init, + .request_compatible = nfs4_request_compatible, }; /* diff -Nru a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c --- a/fs/nfs/nfs4state.c Wed Oct 8 12:24:55 2003 +++ b/fs/nfs/nfs4state.c Wed Oct 8 12:24:55 2003 @@ -42,15 +42,18 @@ #include #include -/* This protects most of the client-side state. */ -static spinlock_t state_spinlock = SPIN_LOCK_UNLOCKED; +#define OPENOWNER_POOL_SIZE 8 -nfs4_stateid zero_stateid = - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +static spinlock_t state_spinlock = SPIN_LOCK_UNLOCKED; +nfs4_stateid zero_stateid; + +#if 0 nfs4_stateid one_stateid = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +#endif +static LIST_HEAD(nfs4_clientid_list); /* * nfs4_get_client(): returns an empty client structure @@ -59,169 +62,294 @@ * Since these are allocated/deallocated very rarely, we don't * bother putting them in a slab cache... */ -struct nfs4_client * -nfs4_get_client(void) +static struct nfs4_client * +nfs4_alloc_client(struct in_addr *addr) { struct nfs4_client *clp; - if ((clp = kmalloc(sizeof(*clp), GFP_KERNEL))) + if ((clp = kmalloc(sizeof(*clp), GFP_KERNEL))) { memset(clp, 0, sizeof(*clp)); + memcpy(&clp->cl_addr, addr, sizeof(clp->cl_addr)); + init_rwsem(&clp->cl_sem); + INIT_LIST_HEAD(&clp->cl_state_owners); + INIT_LIST_HEAD(&clp->cl_unused); + spin_lock_init(&clp->cl_lock); + atomic_set(&clp->cl_count, 1); + clp->cl_state = NFS4CLNT_NEW; + } + return clp; +} + +static void +nfs4_free_client(struct nfs4_client *clp) +{ + struct nfs4_state_owner *sp; + + while (!list_empty(&clp->cl_unused)) { + sp = list_entry(clp->cl_unused.next, + struct nfs4_state_owner, + so_list); + list_del(&sp->so_list); + kfree(sp); + } + BUG_ON(!list_empty(&clp->cl_state_owners)); + kfree(clp); +} + +struct nfs4_client * +nfs4_get_client(struct in_addr *addr) +{ + struct nfs4_client *new, *clp = NULL; + + new = nfs4_alloc_client(addr); + spin_lock(&state_spinlock); + list_for_each_entry(clp, &nfs4_clientid_list, cl_servers) { + if (memcmp(&clp->cl_addr, addr, sizeof(clp->cl_addr)) == 0) + goto found; + } + if (new) + list_add(&new->cl_servers, &nfs4_clientid_list); + spin_unlock(&state_spinlock); + return new; +found: + atomic_inc(&clp->cl_count); + spin_unlock(&state_spinlock); + if (new) + nfs4_free_client(new); return clp; } void nfs4_put_client(struct nfs4_client *clp) { - BUG_ON(!clp); - kfree(clp); + if (!atomic_dec_and_lock(&clp->cl_count, &state_spinlock)) + return; + list_del(&clp->cl_servers); + spin_unlock(&state_spinlock); + nfs4_free_client(clp); } static inline u32 nfs4_alloc_lockowner_id(struct nfs4_client *clp) { - u32 res; + return clp->cl_lockowner_id ++; +} + +static struct nfs4_state_owner * +nfs4_client_grab_unused(struct nfs4_client *clp, struct rpc_cred *cred) +{ + struct nfs4_state_owner *sp = NULL; - spin_lock(&state_spinlock); - res = clp->cl_lockowner_id ++; - spin_unlock(&state_spinlock); - return res; + if (!list_empty(&clp->cl_unused)) { + sp = list_entry(clp->cl_unused.next, struct nfs4_state_owner, so_list); + atomic_inc(&sp->so_count); + sp->so_cred = cred; + list_move(&sp->so_list, &clp->cl_state_owners); + clp->cl_nunused--; + } + return sp; } /* - * nfs4_get_shareowner(): this is called on the OPEN or CREATE path to - * obtain a new shareowner. - * - * There are three shareowners (open_owner4 in rfc3010) per inode, - * one for each possible combination of share lock access. Since - * Linux does not support the deny access type, there are - * three (not 9) referenced by the nfs_inode: - * - * O_WRONLY: inode->wo_owner - * O_RDONLY: inode->ro_owner - * O_RDWR: inode->rw_owner - * - * We create a new shareowner the first time a file is OPENed with - * one of the above shares. All other OPENs with a similar - * share use the single stateid associated with the inode. + * nfs4_alloc_state_owner(): this is called on the OPEN or CREATE path to + * create a new state_owner. * */ -struct nfs4_shareowner * -nfs4_get_shareowner(struct inode *dir) +static struct nfs4_state_owner * +nfs4_alloc_state_owner(void) { - struct nfs4_client *clp; - struct nfs4_shareowner *sp; + struct nfs4_state_owner *sp; sp = kmalloc(sizeof(*sp),GFP_KERNEL); if (!sp) return NULL; - clp = (NFS_SB(dir->i_sb))->nfs4_state; - BUG_ON(!clp); init_MUTEX(&sp->so_sema); sp->so_seqid = 0; /* arbitrary */ - memset(sp->so_stateid, 0, sizeof(nfs4_stateid)); - sp->so_id = nfs4_alloc_lockowner_id(clp); + INIT_LIST_HEAD(&sp->so_states); + atomic_set(&sp->so_count, 1); return sp; } -/* - * Called for each non-null inode shareowner in nfs_clear_inode, - * or if nfs4_do_open fails. - */ -void -nfs4_put_shareowner(struct inode *inode, struct nfs4_shareowner *sp) +struct nfs4_state_owner * +nfs4_get_state_owner(struct nfs_server *server, struct rpc_cred *cred) { + struct nfs4_client *clp = server->nfs4_state; + struct nfs4_state_owner *sp, *new; + + get_rpccred(cred); + new = nfs4_alloc_state_owner(); + spin_lock(&clp->cl_lock); + sp = nfs4_client_grab_unused(clp, cred); + if (sp == NULL && new != NULL) { + list_add(&new->so_list, &clp->cl_state_owners); + new->so_client = clp; + new->so_id = nfs4_alloc_lockowner_id(clp); + new->so_cred = cred; + sp = new; + new = NULL; + } + spin_unlock(&clp->cl_lock); + if (new) + kfree(new); if (!sp) - return; - if (sp->so_flags & O_ACCMODE) - nfs4_do_close(inode, sp); - kfree(sp); + put_rpccred(cred); + return sp; } -/* -* Called with sp->so_sema held. -* -* Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or -* failed with a seqid incrementing error - -* see comments nfs_fs.h:seqid_mutating_error() -*/ void -nfs4_increment_seqid(u32 status, struct nfs4_shareowner *sp) +nfs4_put_state_owner(struct nfs4_state_owner *sp) { - if (status == NFS_OK || seqid_mutating_err(status)) - sp->so_seqid++; + struct nfs4_client *clp = sp->so_client; + struct rpc_cred *cred = sp->so_cred; + + if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock)) + return; + if (clp->cl_nunused >= OPENOWNER_POOL_SIZE) + goto out_free; + list_move(&sp->so_list, &clp->cl_unused); + clp->cl_nunused++; + spin_unlock(&clp->cl_lock); + put_rpccred(cred); + cred = NULL; + return; +out_free: + list_del(&sp->so_list); + spin_unlock(&clp->cl_lock); + put_rpccred(cred); + kfree(sp); } -/* -* Called by nfs4_proc_open to set the appropriate stateid -*/ -int -nfs4_set_inode_share(struct inode * inode, struct nfs4_shareowner *sp, unsigned int open_flags) +static struct nfs4_state * +nfs4_alloc_open_state(void) +{ + struct nfs4_state *state; + + state = kmalloc(sizeof(*state), GFP_KERNEL); + if (!state) + return NULL; + state->pid = current->pid; + state->state = 0; + memset(state->stateid.data, 0, sizeof(state->stateid.data)); + atomic_set(&state->count, 1); + return state; +} + +static struct nfs4_state * +__nfs4_find_state_bypid(struct inode *inode, pid_t pid) { struct nfs_inode *nfsi = NFS_I(inode); + struct nfs4_state *state; - switch (open_flags & O_ACCMODE) { - case O_RDONLY: - if (!nfsi->ro_owner) { - nfsi->ro_owner = sp; - return 0; - } - break; - case O_WRONLY: - if (!nfsi->wo_owner) { - nfsi->wo_owner = sp; - return 0; - } - break; - case O_RDWR: - if (!nfsi->rw_owner) { - nfsi->rw_owner = sp; - return 0; - } + list_for_each_entry(state, &nfsi->open_states, inode_states) { + if (state->pid == pid) { + atomic_inc(&state->count); + return state; + } } - return -EBUSY; + return NULL; } -/* -* Boolean test to determine if an OPEN call goes on the wire. -* -* Called by nfs4_proc_open. -*/ -int -nfs4_test_shareowner(struct inode *inode, unsigned int open_flags) +static struct nfs4_state * +__nfs4_find_state_byowner(struct inode *inode, struct nfs4_state_owner *owner) +{ + struct nfs_inode *nfsi = NFS_I(inode); + struct nfs4_state *state; + + list_for_each_entry(state, &nfsi->open_states, inode_states) { + if (state->owner == owner) { + atomic_inc(&state->count); + return state; + } + } + return NULL; +} + +struct nfs4_state * +nfs4_find_state_bypid(struct inode *inode, pid_t pid) { struct nfs_inode *nfsi = NFS_I(inode); + struct nfs4_state *state; - switch (open_flags & O_ACCMODE) { - case O_RDONLY: - if(nfsi->ro_owner) - return 0; - break; - case O_WRONLY: - if(nfsi->wo_owner) - return 0; - break; - case O_RDWR: - if(nfsi->rw_owner) - return 0; - } - return 1; + spin_lock(&inode->i_lock); + state = __nfs4_find_state_bypid(inode, pid); + /* Add the state to the tail of the inode's list */ + if (state) + list_move_tail(&state->inode_states, &nfsi->open_states); + spin_unlock(&inode->i_lock); + return state; } -struct nfs4_shareowner * -nfs4_get_inode_share(struct inode * inode, unsigned int open_flags) +static void +nfs4_free_open_state(struct nfs4_state *state) { + kfree(state); +} + +struct nfs4_state * +nfs4_get_open_state(struct inode *inode, struct nfs4_state_owner *owner) +{ + struct nfs4_state *state, *new; struct nfs_inode *nfsi = NFS_I(inode); - switch (open_flags & O_ACCMODE) { - case O_RDONLY: - return nfsi->ro_owner; - case O_WRONLY: - return nfsi->wo_owner; - case O_RDWR: - return nfsi->rw_owner; + spin_lock(&inode->i_lock); + state = __nfs4_find_state_byowner(inode, owner); + spin_unlock(&inode->i_lock); + if (state) + goto out; + new = nfs4_alloc_open_state(); + spin_lock(&inode->i_lock); + state = __nfs4_find_state_byowner(inode, owner); + if (state == NULL && new != NULL) { + state = new; + /* Caller *must* be holding owner->so_sem */ + list_add(&state->open_states, &owner->so_states); + state->owner = owner; + atomic_inc(&owner->so_count); + list_add(&state->inode_states, &nfsi->open_states); + state->inode = inode; + atomic_inc(&inode->i_count); + spin_unlock(&inode->i_lock); + } else { + spin_unlock(&inode->i_lock); + if (new) + nfs4_free_open_state(new); } - /* Duh gcc warning if we don't... */ - return NULL; +out: + return state; +} + +void +nfs4_put_open_state(struct nfs4_state *state) +{ + struct inode *inode = state->inode; + struct nfs4_state_owner *owner = state->owner; + + if (!atomic_dec_and_lock(&state->count, &inode->i_lock)) + return; + list_del(&state->inode_states); + spin_unlock(&inode->i_lock); + down(&owner->so_sema); + list_del(&state->open_states); + if (state->state != 0) + nfs4_do_close(inode, state); + up(&owner->so_sema); + iput(inode); + nfs4_free_open_state(state); + nfs4_put_state_owner(owner); +} + +/* +* Called with sp->so_sema held. +* +* Increment the seqid if the OPEN/OPEN_DOWNGRADE/CLOSE succeeded, or +* failed with a seqid incrementing error - +* see comments nfs_fs.h:seqid_mutating_error() +*/ +void +nfs4_increment_seqid(u32 status, struct nfs4_state_owner *sp) +{ + if (status == NFS_OK || seqid_mutating_err(status)) + sp->so_seqid++; } /* diff -Nru a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c --- a/fs/nfs/nfs4xdr.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfs/nfs4xdr.c Wed Oct 8 12:24:57 2003 @@ -205,6 +205,7 @@ #define RESERVE_SPACE(nbytes) do { \ p = xdr_reserve_space(xdr, nbytes); \ + if (!p) printk("RESERVE_SPACE(%d) failed in function %s\n", (int) (nbytes), __FUNCTION__); \ BUG_ON(!p); \ } while (0) @@ -382,10 +383,10 @@ { uint32_t *p; - RESERVE_SPACE(8+sizeof(nfs4_stateid)); + RESERVE_SPACE(8+sizeof(arg->stateid.data)); WRITE32(OP_CLOSE); WRITE32(arg->seqid); - WRITEMEM(arg->stateid, sizeof(nfs4_stateid)); + WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); return 0; } @@ -553,14 +554,17 @@ WRITE32(OP_OPEN); WRITE32(arg->seqid); switch (arg->share_access) { - case O_RDONLY: + case FMODE_READ: WRITE32(NFS4_SHARE_ACCESS_READ); break; - case O_WRONLY: + case FMODE_WRITE: WRITE32(NFS4_SHARE_ACCESS_WRITE); break; - case O_RDWR: + case FMODE_READ|FMODE_WRITE: WRITE32(NFS4_SHARE_ACCESS_BOTH); + break; + default: + BUG(); } WRITE32(0); /* for linux, share_deny = 0 always */ WRITE64(arg->clientid); @@ -572,7 +576,7 @@ if (arg->createmode == NFS4_CREATE_EXCLUSIVE) { RESERVE_SPACE(12); WRITE32(arg->createmode); - WRITEMEM(arg->u.verifier, sizeof(nfs4_verifier)); + WRITEMEM(arg->u.verifier.data, sizeof(arg->u.verifier.data)); } else if (arg->u.attrs) { RESERVE_SPACE(4); @@ -601,9 +605,9 @@ { uint32_t *p; - RESERVE_SPACE(8+sizeof(nfs4_stateid)); + RESERVE_SPACE(8+sizeof(arg->stateid.data)); WRITE32(OP_OPEN_CONFIRM); - WRITEMEM(arg->stateid, sizeof(nfs4_stateid)); + WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); WRITE32(arg->seqid); return 0; @@ -642,7 +646,7 @@ RESERVE_SPACE(32); WRITE32(OP_READ); - WRITEMEM(args->stateid, sizeof(nfs4_stateid)); + WRITEMEM(args->stateid.data, sizeof(args->stateid.data)); WRITE64(args->offset); WRITE32(args->count); @@ -659,7 +663,7 @@ RESERVE_SPACE(32+sizeof(nfs4_verifier)); WRITE32(OP_READDIR); WRITE64(readdir->rd_cookie); - WRITEMEM(readdir->rd_req_verifier, sizeof(nfs4_verifier)); + WRITEMEM(readdir->rd_req_verifier.data, sizeof(readdir->rd_req_verifier.data)); WRITE32(readdir->rd_count >> 5); /* meaningless "dircount" field */ WRITE32(readdir->rd_count); WRITE32(2); @@ -768,9 +772,9 @@ int status; uint32_t *p; - RESERVE_SPACE(4+sizeof(nfs4_stateid)); + RESERVE_SPACE(4+sizeof(arg->stateid.data)); WRITE32(OP_SETATTR); - WRITEMEM(arg->stateid, sizeof(nfs4_stateid)); + WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); if ((status = encode_attrs(xdr, arg->iap, server))) return status; @@ -789,11 +793,11 @@ len2 = strlen(setclientid->sc_netid); len3 = strlen(setclientid->sc_uaddr); total_len = XDR_QUADLEN(len1) + XDR_QUADLEN(len2) + XDR_QUADLEN(len3); - total_len = (total_len << 2) + 24 + sizeof(nfs4_verifier); + total_len = (total_len << 2) + 24 + sizeof(setclientid->sc_verifier.data); RESERVE_SPACE(total_len); WRITE32(OP_SETCLIENTID); - WRITEMEM(setclientid->sc_verifier, sizeof(nfs4_verifier)); + WRITEMEM(setclientid->sc_verifier.data, sizeof(setclientid->sc_verifier.data)); WRITE32(len1); WRITEMEM(setclientid->sc_name, len1); WRITE32(setclientid->sc_prog); @@ -811,10 +815,10 @@ { uint32_t *p; - RESERVE_SPACE(12 + sizeof(nfs4_verifier)); + RESERVE_SPACE(12 + sizeof(client_state->cl_confirm.data)); WRITE32(OP_SETCLIENTID_CONFIRM); WRITE64(client_state->cl_clientid); - WRITEMEM(client_state->cl_confirm,sizeof(nfs4_verifier)); + WRITEMEM(client_state->cl_confirm.data, sizeof(client_state->cl_confirm.data)); return 0; } @@ -826,7 +830,7 @@ RESERVE_SPACE(36); WRITE32(OP_WRITE); - WRITEMEM(args->stateid, sizeof(nfs4_stateid)); + WRITEMEM(args->stateid.data, sizeof(args->stateid.data)); WRITE64(args->offset); WRITE32(args->stable); WRITE32(args->count); @@ -1253,8 +1257,8 @@ status = decode_op_hdr(xdr, OP_CLOSE); if (status) return status; - READ_BUF(sizeof(nfs4_stateid)); - COPYMEM(res->stateid, sizeof(nfs4_stateid)); + READ_BUF(sizeof(res->stateid.data)); + COPYMEM(res->stateid.data, sizeof(res->stateid.data)); return 0; } @@ -1333,8 +1337,10 @@ dprintk("read_attrs: server returned bad attributes!\n"); goto xdr_error; } - getattr->gt_bmres[0] = bmval0; - getattr->gt_bmres[1] = bmval1; + if (nfp) { + nfp->bitmap[0] = bmval0; + nfp->bitmap[1] = bmval1; + } /* * In case the server doesn't return some attributes, @@ -1739,8 +1745,8 @@ status = decode_op_hdr(xdr, OP_OPEN); if (status) return status; - READ_BUF(sizeof(nfs4_stateid)); - COPYMEM(res->stateid, sizeof(nfs4_stateid)); + READ_BUF(sizeof(res->stateid.data)); + COPYMEM(res->stateid.data, sizeof(res->stateid.data)); decode_change_info(xdr, res->cinfo); @@ -1767,8 +1773,8 @@ res->status = decode_op_hdr(xdr, OP_OPEN_CONFIRM); if (res->status) return res->status; - READ_BUF(sizeof(nfs4_stateid)); - COPYMEM(res->stateid, sizeof(nfs4_stateid)); + READ_BUF(sizeof(res->stateid.data)); + COPYMEM(res->stateid.data, sizeof(res->stateid.data)); return 0; } @@ -1828,7 +1834,7 @@ if (status) return status; READ_BUF(8); - COPYMEM(readdir->rd_resp_verifier, 8); + COPYMEM(readdir->rd_resp_verifier.data, 8); hdrlen = (char *) p - (char *) iov->iov_base; recvd = req->rq_received - hdrlen; @@ -2021,9 +2027,9 @@ } READ32(nfserr); if (nfserr == NFS_OK) { - READ_BUF(8 + sizeof(nfs4_verifier)); + READ_BUF(8 + sizeof(setclientid->sc_state->cl_confirm.data)); READ64(setclientid->sc_state->cl_clientid); - COPYMEM(setclientid->sc_state->cl_confirm, sizeof(nfs4_verifier)); + COPYMEM(setclientid->sc_state->cl_confirm.data, sizeof(setclientid->sc_state->cl_confirm.data)); } else if (nfserr == NFSERR_CLID_INUSE) { uint32_t len; diff -Nru a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c --- a/fs/nfs/pagelist.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfs/pagelist.c Wed Oct 8 12:24:57 2003 @@ -49,7 +49,7 @@ /** * nfs_create_request - Create an NFS read/write request. - * @cred: RPC credential to use + * @file: file descriptor to use * @inode: inode to which the request is attached * @page: page to write * @offset: starting offset within the page for the write @@ -62,7 +62,7 @@ * User should ensure it is safe to sleep in this function. */ struct nfs_page * -nfs_create_request(struct rpc_cred *cred, struct inode *inode, +nfs_create_request(struct file *file, struct inode *inode, struct page *page, unsigned int offset, unsigned int count) { @@ -93,11 +93,9 @@ req->wb_offset = offset; req->wb_pgbase = offset; req->wb_bytes = count; - - if (cred) - req->wb_cred = get_rpccred(cred); req->wb_inode = inode; req->wb_count = 1; + server->rpc_ops->request_init(req, file); return req; } @@ -111,6 +109,8 @@ */ void nfs_clear_request(struct nfs_page *req) { + if (req->wb_state) + req->wb_state = NULL; /* Release struct file or cached credential */ if (req->wb_file) { fput(req->wb_file); diff -Nru a/fs/nfs/proc.c b/fs/nfs/proc.c --- a/fs/nfs/proc.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfs/proc.c Wed Oct 8 12:24:57 2003 @@ -60,6 +60,18 @@ nfs_refresh_inode(inode, fattr); } +static struct rpc_cred * +nfs_cred(struct inode *inode, struct file *filp) +{ + struct rpc_cred *cred = NULL; + + if (filp) + cred = (struct rpc_cred *)filp->private_data; + if (!cred) + cred = NFS_I(inode)->mm_cred; + return cred; +} + /* * Bare-bones access to getattr: this is for nfs_read_super. */ @@ -149,88 +161,63 @@ } static int -nfs_proc_read(struct inode *inode, struct rpc_cred *cred, - struct nfs_fattr *fattr, int flags, - unsigned int base, unsigned int count, struct page *page, - int *eofp) +nfs_proc_read(struct nfs_read_data *rdata, struct file *filp) { - u64 offset = page_offset(page) + base; - struct nfs_readargs arg = { - .fh = NFS_FH(inode), - .offset = offset, - .count = count, - .pgbase = base, - .pages = &page - }; - struct nfs_readres res = { - .fattr = fattr, - .count = count - }; + int flags = rdata->flags; + struct inode * inode = rdata->inode; + struct nfs_fattr * fattr = rdata->res.fattr; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_READ], - .rpc_argp = &arg, - .rpc_resp = &res, - .rpc_cred = cred + .rpc_argp = &rdata->args, + .rpc_resp = &rdata->res, }; int status; - dprintk("NFS call read %d @ %Ld\n", count, (long long)offset); + dprintk("NFS call read %d @ %Ld\n", rdata->args.count, + (long long) rdata->args.offset); fattr->valid = 0; + msg.rpc_cred = nfs_cred(inode, filp); status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags); if (status >= 0) nfs_refresh_inode(inode, fattr); dprintk("NFS reply read: %d\n", status); - *eofp = res.eof; return status; } static int -nfs_proc_write(struct inode *inode, struct rpc_cred *cred, - struct nfs_fattr *fattr, int how, - unsigned int base, unsigned int count, - struct page *page, struct nfs_writeverf *verf) +nfs_proc_write(struct nfs_write_data *wdata, struct file *filp) { - u64 offset = page_offset(page) + base; - struct nfs_writeargs arg = { - .fh = NFS_FH(inode), - .offset = offset, - .count = count, - .stable = NFS_FILE_SYNC, - .pgbase = base, - .pages = &page - }; - struct nfs_writeres res = { - .fattr = fattr, - .verf = verf, - .count = count - }; + int flags = wdata->flags; + struct inode * inode = wdata->inode; + struct nfs_fattr * fattr = wdata->res.fattr; struct rpc_message msg = { .rpc_proc = &nfs_procedures[NFSPROC_WRITE], - .rpc_argp = &arg, - .rpc_resp = &res, - .rpc_cred = cred + .rpc_argp = &wdata->args, + .rpc_resp = &wdata->res, }; - int status, flags = 0; + int status; - dprintk("NFS call write %d @ %Ld\n", count, (long long)offset); + dprintk("NFS call write %d @ %Ld\n", wdata->args.count, + (long long) wdata->args.offset); fattr->valid = 0; - if (how & NFS_RW_SWAP) - flags |= NFS_RPC_SWAPFLAGS; + msg.rpc_cred = nfs_cred(inode, filp); status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags); - - if (status >= 0) + if (status >= 0) { nfs_write_refresh_inode(inode, fattr); - + wdata->res.count = wdata->args.count; + wdata->verf.committed = NFS_FILE_SYNC; + } dprintk("NFS reply write: %d\n", status); - verf->committed = NFS_FILE_SYNC; /* NFSv2 always syncs data */ - return status < 0? status : count; + return status < 0? status : wdata->res.count; } -static int +static struct inode * nfs_proc_create(struct inode *dir, struct qstr *name, struct iattr *sattr, - int flags, struct nfs_fh *fhandle, struct nfs_fattr *fattr) + int flags) { + struct nfs_fh fhandle; + struct nfs_fattr fattr; struct nfs_createargs arg = { .fh = NFS_FH(dir), .name = name->name, @@ -238,16 +225,23 @@ .sattr = sattr }; struct nfs_diropok res = { - .fh = fhandle, - .fattr = fattr + .fh = &fhandle, + .fattr = &fattr }; int status; - fattr->valid = 0; + fattr.valid = 0; dprintk("NFS call create %s\n", name->name); status = rpc_call(NFS_CLIENT(dir), NFSPROC_CREATE, &arg, &res, 0); dprintk("NFS reply create: %d\n", status); - return status; + if (status == 0) { + struct inode *inode; + inode = nfs_fhget(dir->i_sb, &fhandle, &fattr); + if (inode) + return inode; + status = -ENOMEM; + } + return ERR_PTR(status); } /* @@ -638,6 +632,28 @@ BUG(); } +/* + * Set up the nfspage struct with the right credentials + */ +static void +nfs_request_init(struct nfs_page *req, struct file *filp) +{ + req->wb_cred = get_rpccred(nfs_cred(req->wb_inode, filp)); +} + +static int +nfs_request_compatible(struct nfs_page *req, struct file *filp, struct page *page) +{ + if (req->wb_file != filp) + return 0; + if (req->wb_page != page) + return 0; + if (req->wb_cred != nfs_file_cred(filp)) + return 0; + return 1; +} + + struct nfs_rpc_ops nfs_v2_clientops = { .version = 2, /* protocol version */ .getroot = nfs_proc_get_root, @@ -667,4 +683,8 @@ .read_setup = nfs_proc_read_setup, .write_setup = nfs_proc_write_setup, .commit_setup = nfs_proc_commit_setup, + .file_open = nfs_open, + .file_release = nfs_release, + .request_init = nfs_request_init, + .request_compatible = nfs_request_compatible, }; diff -Nru a/fs/nfs/read.c b/fs/nfs/read.c --- a/fs/nfs/read.c Wed Oct 8 12:24:55 2003 +++ b/fs/nfs/read.c Wed Oct 8 12:24:55 2003 @@ -69,37 +69,45 @@ static int nfs_readpage_sync(struct file *file, struct inode *inode, struct page *page) { - struct rpc_cred *cred = NULL; - struct nfs_fattr fattr; - unsigned int offset = 0; unsigned int rsize = NFS_SERVER(inode)->rsize; unsigned int count = PAGE_CACHE_SIZE; int result; - int flags = IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0; - int eof; + struct nfs_read_data rdata = { + .flags = (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0), + .cred = NULL, + .inode = inode, + .args = { + .fh = NFS_FH(inode), + .pages = &page, + .pgbase = 0UL, + .count = rsize, + }, + .res = { + .fattr = &rdata.fattr, + } + }; dprintk("NFS: nfs_readpage_sync(%p)\n", page); - if (file) - cred = nfs_file_cred(file); - /* * This works now because the socket layer never tries to DMA * into this buffer directly. */ do { if (count < rsize) - rsize = count; + rdata.args.count = count; + rdata.res.count = rdata.args.count; + rdata.args.offset = page_offset(page) + rdata.args.pgbase; dprintk("NFS: nfs_proc_read(%s, (%s/%Ld), %Lu, %u)\n", NFS_SERVER(inode)->hostname, inode->i_sb->s_id, (long long)NFS_FILEID(inode), - (unsigned long long)offset, rsize); + (unsigned long long)rdata.args.pgbase, + rdata.args.count); lock_kernel(); - result = NFS_PROTO(inode)->read(inode, cred, &fattr, flags, - offset, rsize, page, &eof); + result = NFS_PROTO(inode)->read(&rdata, file); unlock_kernel(); /* @@ -111,14 +119,14 @@ result = -EINVAL; goto io_error; } - count -= result; - offset += result; - if (result < rsize) /* NFSv2ism */ + count -= result; + rdata.args.pgbase += result; + if (result < rdata.args.count) /* NFSv2ism */ break; } while (count); if (count) - memclear_highpage_flush(page, offset, count); + memclear_highpage_flush(page, rdata.args.pgbase, count); SetPageUptodate(page); if (PageError(page)) ClearPageError(page); @@ -135,7 +143,7 @@ LIST_HEAD(one_request); struct nfs_page *new; - new = nfs_create_request(nfs_file_cred(file), inode, page, 0, PAGE_CACHE_SIZE); + new = nfs_create_request(file, inode, page, 0, PAGE_CACHE_SIZE); if (IS_ERR(new)) { unlock_page(page); return PTR_ERR(new); @@ -352,8 +360,7 @@ struct nfs_page *new; nfs_wb_page(inode, page); - new = nfs_create_request(nfs_file_cred(desc->filp), inode, page, - 0, PAGE_CACHE_SIZE); + new = nfs_create_request(desc->filp, inode, page, 0, PAGE_CACHE_SIZE); if (IS_ERR(new)) { SetPageError(page); unlock_page(page); diff -Nru a/fs/nfs/write.c b/fs/nfs/write.c --- a/fs/nfs/write.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfs/write.c Wed Oct 8 12:24:57 2003 @@ -132,66 +132,68 @@ nfs_writepage_sync(struct file *file, struct inode *inode, struct page *page, unsigned int offset, unsigned int count) { - struct rpc_cred *cred = NULL; - loff_t base; unsigned int wsize = NFS_SERVER(inode)->wsize; - int result, refresh = 0, written = 0, flags; - u8 *buffer; - struct nfs_fattr fattr; - struct nfs_writeverf verf; - - - if (file) - cred = get_rpccred(nfs_file_cred(file)); - if (!cred) - cred = get_rpccred(NFS_I(inode)->mm_cred); + int result, written = 0; + int swapfile = IS_SWAPFILE(inode); + struct nfs_write_data wdata = { + .flags = swapfile ? NFS_RPC_SWAPFLAGS : 0, + .cred = NULL, + .inode = inode, + .args = { + .fh = NFS_FH(inode), + .pages = &page, + .stable = NFS_FILE_SYNC, + .pgbase = offset, + .count = wsize, + }, + .res = { + .fattr = &wdata.fattr, + .verf = &wdata.verf, + }, + }; dprintk("NFS: nfs_writepage_sync(%s/%Ld %d@%Ld)\n", inode->i_sb->s_id, (long long)NFS_FILEID(inode), count, (long long)(page_offset(page) + offset)); - base = page_offset(page) + offset; - - flags = ((IS_SWAPFILE(inode)) ? NFS_RW_SWAP : 0) | NFS_RW_SYNC; - do { - if (count < wsize && !IS_SWAPFILE(inode)) - wsize = count; + if (count < wsize && !swapfile) + wdata.args.count = count; + wdata.args.offset = page_offset(page) + wdata.args.pgbase; - result = NFS_PROTO(inode)->write(inode, cred, &fattr, flags, - offset, wsize, page, &verf); + result = NFS_PROTO(inode)->write(&wdata, file); if (result < 0) { /* Must mark the page invalid after I/O error */ ClearPageUptodate(page); goto io_error; } - if (result != wsize) - printk("NFS: short write, wsize=%u, result=%d\n", - wsize, result); - refresh = 1; - buffer += wsize; - base += wsize; - offset += wsize; - written += wsize; - count -= wsize; + if (result < wdata.args.count) + printk(KERN_WARNING "NFS: short write, count=%u, result=%d\n", + wdata.args.count, result); + + wdata.args.offset += result; + wdata.args.pgbase += result; + written += result; + count -= result; + /* * If we've extended the file, update the inode * now so we don't invalidate the cache. */ - if (base > i_size_read(inode)) - i_size_write(inode, base); + if (wdata.args.offset > i_size_read(inode)) + i_size_write(inode, wdata.args.offset); } while (count); if (PageError(page)) ClearPageError(page); io_error: - if (cred) - put_rpccred(cred); + if (wdata.cred) + put_rpccred(wdata.cred); - return written? written : result; + return written ? written : result; } static int @@ -206,8 +208,6 @@ status = (IS_ERR(req)) ? PTR_ERR(req) : 0; if (status < 0) goto out; - if (!req->wb_cred) - req->wb_cred = get_rpccred(NFS_I(inode)->mm_cred); nfs_unlock_request(req); nfs_strategy(inode); end = ((loff_t)page->index<mapping->host; - struct rpc_cred *cred = nfs_file_cred(file); struct nfs_page *req; int status = 0; /* @@ -643,7 +642,7 @@ */ req = nfs_find_request(inode, page->index); if (req) { - if (req->wb_file != file || req->wb_cred != cred || req->wb_page != page) + if (!NFS_PROTO(inode)->request_compatible(req, file, page)) status = nfs_wb_page(inode, page); nfs_release_request(req); } diff -Nru a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c --- a/fs/nfsd/nfs4proc.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfsd/nfs4proc.c Wed Oct 8 12:24:57 2003 @@ -78,7 +78,7 @@ status = nfsd_create_v3(rqstp, current_fh, open->op_fname.data, open->op_fname.len, &open->op_iattr, &resfh, open->op_createmode, - (u32 *)open->op_verf, &open->op_truncate); + (u32 *)open->op_verf.data, &open->op_truncate); } else { status = nfsd_lookup(rqstp, current_fh, @@ -204,7 +204,7 @@ static inline int nfsd4_commit(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_commit *commit) { - u32 *p = (u32 *)commit->co_verf; + u32 *p = (u32 *)commit->co_verf.data; *p++ = nfssvc_boot.tv_sec; *p++ = nfssvc_boot.tv_usec; @@ -522,7 +522,7 @@ nfs4_unlock_state(); write->wr_bytes_written = write->wr_buflen; write->wr_how_written = write->wr_stable_how; - p = (u32 *)write->wr_verifier; + p = (u32 *)write->wr_verifier.data; *p++ = nfssvc_boot.tv_sec; *p++ = nfssvc_boot.tv_usec; diff -Nru a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c --- a/fs/nfsd/nfs4state.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfsd/nfs4state.c Wed Oct 8 12:24:57 2003 @@ -228,8 +228,8 @@ } static void -copy_verf(struct nfs4_client *target, nfs4_verifier source) { - memcpy(&target->cl_verifier, source, sizeof(nfs4_verifier)); +copy_verf(struct nfs4_client *target, nfs4_verifier *source) { + memcpy(target->cl_verifier.data, source->data, sizeof(target->cl_verifier.data)); } static void @@ -256,8 +256,8 @@ } static int -cmp_verf(nfs4_verifier v1, nfs4_verifier v2) { - return(!memcmp(v1,v2,sizeof(nfs4_verifier))); +cmp_verf(nfs4_verifier *v1, nfs4_verifier *v2) { + return(!memcmp(v1->data,v2->data,sizeof(v1->data))); } static int @@ -286,7 +286,7 @@ u32 * p; tv = CURRENT_TIME; - p = (u32 *)clp->cl_confirm; + p = (u32 *)clp->cl_confirm.data; *p++ = tv.tv_sec; *p++ = tv.tv_nsec; } @@ -371,7 +371,7 @@ .len = setclid->se_namelen, .data = setclid->se_name, }; - char * clverifier = setclid->se_verf; + nfs4_verifier clverifier = setclid->se_verf; unsigned int strhashval; struct nfs4_client * conf, * unconf, * new, * clp; int status; @@ -439,13 +439,13 @@ expire_client(unconf); if (!(new = create_client(clname))) goto out; - copy_verf(new,clverifier); + copy_verf(new, &clverifier); new->cl_addr = ip_addr; copy_cred(&new->cl_cred,&rqstp->rq_cred); gen_clid(new); gen_confirm(new); add_to_unconfirmed(new, strhashval); - } else if (cmp_verf(conf->cl_verifier, clverifier)) { + } else if (cmp_verf(&conf->cl_verifier, &clverifier)) { /* * CASE 1: * cl_name match, confirmed, principal match @@ -460,13 +460,13 @@ * new cl_confirm */ if ((unconf) && - cmp_verf(unconf->cl_verifier, conf->cl_verifier) && + cmp_verf(&unconf->cl_verifier, &conf->cl_verifier) && cmp_clid(&unconf->cl_clientid, &conf->cl_clientid)) { expire_client(unconf); } if (!(new = create_client(clname))) goto out; - copy_verf(new,conf->cl_verifier); + copy_verf(new,&conf->cl_verifier); new->cl_addr = ip_addr; copy_cred(&new->cl_cred,&rqstp->rq_cred); copy_clid(new, conf); @@ -483,14 +483,14 @@ */ if (!(new = create_client(clname))) goto out; - copy_verf(new,clverifier); + copy_verf(new,&clverifier); new->cl_addr = ip_addr; copy_cred(&new->cl_cred,&rqstp->rq_cred); gen_clid(new); gen_confirm(new); add_to_unconfirmed(new, strhashval); } else if (!cmp_clid(&conf->cl_clientid, &unconf->cl_clientid) && - !cmp_verf(conf->cl_confirm, unconf->cl_confirm)) { + !cmp_verf(&conf->cl_confirm, &unconf->cl_confirm)) { /* * CASE3: * confirmed found (name, principal match) @@ -510,7 +510,7 @@ expire_client(unconf); if (!(new = create_client(clname))) goto out; - copy_verf(new,clverifier); + copy_verf(new,&clverifier); new->cl_addr = ip_addr; copy_cred(&new->cl_cred,&rqstp->rq_cred); gen_clid(new); @@ -524,7 +524,7 @@ } setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot; setclid->se_clientid.cl_id = new->cl_clientid.cl_id; - memcpy(&setclid->se_confirm, new->cl_confirm, sizeof(nfs4_verifier)); + memcpy(setclid->se_confirm.data, new->cl_confirm.data, sizeof(setclid->se_confirm.data)); printk(KERN_INFO "NFSD: this client will not receive delegations\n"); status = nfs_ok; out: @@ -546,7 +546,7 @@ u32 ip_addr = rqstp->rq_addr.sin_addr.s_addr; unsigned int idhashval; struct nfs4_client *clp, *conf = NULL, *unconf = NULL; - char * confirm = setclientid_confirm->sc_confirm; + nfs4_verifier confirm = setclientid_confirm->sc_confirm; clientid_t * clid = &setclientid_confirm->sc_clientid; struct list_head *pos, *next; int status; @@ -601,10 +601,10 @@ * conf and unconf records match names, verifiers */ if ((conf && unconf) && - (cmp_verf(unconf->cl_confirm, confirm)) && - (cmp_verf(conf->cl_verifier, unconf->cl_verifier)) && + (cmp_verf(&unconf->cl_confirm, &confirm)) && + (cmp_verf(&conf->cl_verifier, &unconf->cl_verifier)) && (cmp_name(&conf->cl_name,&unconf->cl_name)) && - (!cmp_verf(conf->cl_confirm, unconf->cl_confirm))) { + (!cmp_verf(&conf->cl_confirm, &unconf->cl_confirm))) { if (!cmp_creds(&conf->cl_cred, &unconf->cl_cred)) status = nfserr_clid_inuse; else { @@ -621,7 +621,7 @@ */ if ((conf && !unconf) || ((conf && unconf) && - (!cmp_verf(conf->cl_verifier, unconf->cl_verifier) || + (!cmp_verf(&conf->cl_verifier, &unconf->cl_verifier) || !cmp_name(&conf->cl_name, &unconf->cl_name)))) { if (!cmp_creds(&conf->cl_cred,&rqstp->rq_cred)) { status = nfserr_clid_inuse; @@ -635,7 +635,7 @@ * unconf record found. * unconf->cl_confirm matches input confirm */ - if (!conf && unconf && cmp_verf(unconf->cl_confirm, confirm)) { + if (!conf && unconf && cmp_verf(&unconf->cl_confirm, &confirm)) { if (!cmp_creds(&unconf->cl_cred, &rqstp->rq_cred)) { status = nfserr_clid_inuse; } else { @@ -650,8 +650,8 @@ * unconf record not found, or if unconf, then unconf->cl_confirm * does not match input confirm. */ - if ((!conf || (conf && !cmp_verf(conf->cl_confirm, confirm))) && - (!unconf || (unconf && !cmp_verf(unconf->cl_confirm, confirm)))) { + if ((!conf || (conf && !cmp_verf(&conf->cl_confirm, &confirm))) && + (!unconf || (unconf && !cmp_verf(&unconf->cl_confirm, &confirm)))) { status = nfserr_stale_clientid; goto out; } diff -Nru a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c --- a/fs/nfsd/nfs4xdr.c Wed Oct 8 12:24:57 2003 +++ b/fs/nfsd/nfs4xdr.c Wed Oct 8 12:24:57 2003 @@ -691,7 +691,7 @@ break; case NFS4_CREATE_EXCLUSIVE: READ_BUF(8); - COPYMEM(open->op_verf, 8); + COPYMEM(open->op_verf.data, 8); break; default: goto xdr_error; @@ -798,7 +798,7 @@ READ_BUF(24); READ64(readdir->rd_cookie); - COPYMEM(readdir->rd_verf, sizeof(nfs4_verifier)); + COPYMEM(readdir->rd_verf.data, sizeof(readdir->rd_verf.data)); READ32(readdir->rd_dircount); /* just in case you needed a useless field... */ READ32(readdir->rd_maxcount); if ((status = nfsd4_decode_bitmap(argp, readdir->rd_bmval))) @@ -873,7 +873,7 @@ DECODE_HEAD; READ_BUF(12); - COPYMEM(setclientid->se_verf, 8); + COPYMEM(setclientid->se_verf.data, 8); READ32(setclientid->se_namelen); READ_BUF(setclientid->se_namelen + 8); @@ -1740,7 +1740,7 @@ if (!nfserr) { RESERVE_SPACE(8); - WRITEMEM(commit->co_verf, 8); + WRITEMEM(commit->co_verf.data, 8); ADJUST_ARGS(); } } @@ -2224,7 +2224,7 @@ RESERVE_SPACE(16); WRITE32(write->wr_bytes_written); WRITE32(write->wr_how_written); - WRITEMEM(write->wr_verifier, 8); + WRITEMEM(write->wr_verifier.data, 8); ADJUST_ARGS(); } } diff -Nru a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c --- a/fs/nfsd/nfsctl.c Wed Oct 8 12:24:56 2003 +++ b/fs/nfsd/nfsctl.c Wed Oct 8 12:24:56 2003 @@ -429,6 +429,7 @@ static int __init init_nfsd(void) { + int retval; printk(KERN_INFO "Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n"); nfsd_stat_init(); /* Statistics */ @@ -441,8 +442,16 @@ if (entry) entry->proc_fops = &exports_operations; } - register_filesystem(&nfsd_fs_type); - return 0; + retval = register_filesystem(&nfsd_fs_type); + if (retval) { + nfsd_export_shutdown(); + nfsd_cache_shutdown(); + remove_proc_entry("fs/nfs/exports", NULL); + remove_proc_entry("fs/nfs", NULL); + nfsd_stat_shutdown(); + nfsd_lockd_shutdown(); + } + return retval; } static void __exit exit_nfsd(void) diff -Nru a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c --- a/fs/nfsd/vfs.c Wed Oct 8 12:24:56 2003 +++ b/fs/nfsd/vfs.c Wed Oct 8 12:24:56 2003 @@ -3,7 +3,7 @@ * linux/fs/nfsd/vfs.c * * File operations used by nfsd. Some of these have been ripped from - * other parts of the kernel because they weren't in ksyms.c, others + * other parts of the kernel because they weren't exported, others * are partial duplicates with added or changed functionality. * * Note that several functions dget() the dentry upon which they want @@ -781,7 +781,6 @@ dprintk("nfsd: write defer %d\n", current->pid); set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout((HZ+99)/100); - current->state = TASK_RUNNING; dprintk("nfsd: write resume %d\n", current->pid); } diff -Nru a/fs/open.c b/fs/open.c --- a/fs/open.c Wed Oct 8 12:24:55 2003 +++ b/fs/open.c Wed Oct 8 12:24:55 2003 @@ -42,6 +42,8 @@ return retval; } +EXPORT_SYMBOL(vfs_statfs); + static int vfs_statfs_native(struct super_block *sb, struct statfs *buf) { struct kstatfs st; @@ -753,6 +755,8 @@ return ERR_PTR(error); } +EXPORT_SYMBOL(filp_open); + struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags) { struct file * f; @@ -812,6 +816,8 @@ return ERR_PTR(error); } +EXPORT_SYMBOL(dentry_open); + /* * Find an empty file descriptor entry, and mark it busy. */ @@ -874,6 +880,8 @@ return error; } +EXPORT_SYMBOL(get_unused_fd); + static inline void __put_unused_fd(struct files_struct *files, unsigned int fd) { __FD_CLR(fd, files->open_fds); @@ -889,6 +897,8 @@ spin_unlock(&files->file_lock); } +EXPORT_SYMBOL(put_unused_fd); + /* * Install a file pointer in the fd array. * @@ -912,6 +922,8 @@ spin_unlock(&files->file_lock); } +EXPORT_SYMBOL(fd_install); + asmlinkage long sys_open(const char __user * filename, int flags, int mode) { char * tmp; @@ -985,6 +997,8 @@ return retval; } +EXPORT_SYMBOL(filp_close); + /* * Careful here! We test whether the file pointer is NULL before * releasing the fd. This ensures that one clone task can't release @@ -1012,6 +1026,8 @@ return -EBADF; } +EXPORT_SYMBOL(sys_close); + /* * This routine simulates a hangup on the tty, to arrange that users * are given clean terminals at login time. @@ -1019,7 +1035,7 @@ asmlinkage long sys_vhangup(void) { if (capable(CAP_SYS_TTY_CONFIG)) { - tty_vhangup(current->tty); + tty_vhangup(process_tty(current)); return 0; } return -EPERM; diff -Nru a/fs/partitions/check.c b/fs/partitions/check.c --- a/fs/partitions/check.c Wed Oct 8 12:24:57 2003 +++ b/fs/partitions/check.c Wed Oct 8 12:24:57 2003 @@ -111,7 +111,7 @@ }; /* - * disk_name() is used by partition check code and the md driver. + * disk_name() is used by partition check code and the genhd driver. * It formats the devicename of the indicated disk into * the supplied buffer (of size at least 32), and returns * a pointer to that same buffer (for convenience). @@ -135,6 +135,8 @@ return disk_name(bdev->bd_disk, part, buf); } +EXPORT_SYMBOL(bdevname); + /* * NOTE: this cannot be called from interrupt context. * @@ -158,6 +160,8 @@ return buffer; } +EXPORT_SYMBOL(__bdevname); + static struct parsed_partitions * check_partition(struct gendisk *hd, struct block_device *bdev) { @@ -434,6 +438,8 @@ p->v = NULL; return NULL; } + +EXPORT_SYMBOL(read_dev_sector); void del_gendisk(struct gendisk *disk) { diff -Nru a/fs/pipe.c b/fs/pipe.c --- a/fs/pipe.c Wed Oct 8 12:24:56 2003 +++ b/fs/pipe.c Wed Oct 8 12:24:56 2003 @@ -641,11 +641,10 @@ int err = register_filesystem(&pipe_fs_type); if (!err) { pipe_mnt = kern_mount(&pipe_fs_type); - err = PTR_ERR(pipe_mnt); - if (IS_ERR(pipe_mnt)) + if (IS_ERR(pipe_mnt)) { + err = PTR_ERR(pipe_mnt); unregister_filesystem(&pipe_fs_type); - else - err = 0; + } } return err; } diff -Nru a/fs/proc/array.c b/fs/proc/array.c --- a/fs/proc/array.c Wed Oct 8 12:24:57 2003 +++ b/fs/proc/array.c Wed Oct 8 12:24:57 2003 @@ -304,9 +304,9 @@ mm = task->mm; if(mm) mm = mmgrab(mm); - if (task->tty) { - tty_pgrp = task->tty->pgrp; - tty_nr = new_encode_dev(tty_devnum(task->tty)); + if (process_tty(task)) { + tty_pgrp = process_tty(task)->pgrp; + tty_nr = new_encode_dev(tty_devnum(process_tty(task))); } task_unlock(task); if (mm) { @@ -345,7 +345,7 @@ state, ppid, process_group(task), - task->session, + process_session(task), tty_nr, tty_pgrp, task->flags, diff -Nru a/fs/proc/base.c b/fs/proc/base.c --- a/fs/proc/base.c Wed Oct 8 12:24:57 2003 +++ b/fs/proc/base.c Wed Oct 8 12:24:57 2003 @@ -53,6 +53,7 @@ PROC_TGID_EXE, PROC_TGID_FD, PROC_TGID_ENVIRON, + PROC_TGID_AUXV, PROC_TGID_CMDLINE, PROC_TGID_STAT, PROC_TGID_STATM, @@ -75,6 +76,7 @@ PROC_TID_EXE, PROC_TID_FD, PROC_TID_ENVIRON, + PROC_TID_AUXV, PROC_TID_CMDLINE, PROC_TID_STAT, PROC_TID_STATM, @@ -104,6 +106,7 @@ E(PROC_TGID_TASK, "task", S_IFDIR|S_IRUGO|S_IXUGO), E(PROC_TGID_FD, "fd", S_IFDIR|S_IRUSR|S_IXUSR), E(PROC_TGID_ENVIRON, "environ", S_IFREG|S_IRUSR), + E(PROC_TGID_AUXV, "auxv", S_IFREG|S_IRUSR), E(PROC_TGID_STATUS, "status", S_IFREG|S_IRUGO), E(PROC_TGID_CMDLINE, "cmdline", S_IFREG|S_IRUGO), E(PROC_TGID_STAT, "stat", S_IFREG|S_IRUGO), @@ -125,6 +128,7 @@ static struct pid_entry tid_base_stuff[] = { E(PROC_TID_FD, "fd", S_IFDIR|S_IRUSR|S_IXUSR), E(PROC_TID_ENVIRON, "environ", S_IFREG|S_IRUSR), + E(PROC_TID_AUXV, "auxv", S_IFREG|S_IRUSR), E(PROC_TID_STATUS, "status", S_IFREG|S_IRUGO), E(PROC_TID_CMDLINE, "cmdline", S_IFREG|S_IRUGO), E(PROC_TID_STAT, "stat", S_IFREG|S_IRUGO), @@ -322,6 +326,25 @@ return res; } +static int proc_pid_auxv(struct task_struct *task, char *buffer) +{ + int res = 0; + struct mm_struct *mm = get_task_mm(task); + if (mm) { + unsigned int nwords = 0; + do + nwords += 2; + while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */ + res = nwords * sizeof(mm->saved_auxv[0]); + if (res > PAGE_SIZE) + res = PAGE_SIZE; + memcpy(buffer, mm->saved_auxv, res); + mmput(mm); + } + return res; +} + + #ifdef CONFIG_KALLSYMS /* * Provides a wchan file via kallsyms in a proper one-value-per-file format. @@ -1270,6 +1293,11 @@ case PROC_TGID_ENVIRON: inode->i_fop = &proc_info_file_operations; ei->op.proc_read = proc_pid_environ; + break; + case PROC_TID_AUXV: + case PROC_TGID_AUXV: + inode->i_fop = &proc_info_file_operations; + ei->op.proc_read = proc_pid_auxv; break; case PROC_TID_STATUS: case PROC_TGID_STATUS: diff -Nru a/fs/proc/inode.c b/fs/proc/inode.c --- a/fs/proc/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/proc/inode.c Wed Oct 8 12:24:57 2003 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -135,34 +136,47 @@ .statfs = simple_statfs, }; +enum { + Opt_uid, Opt_gid, Opt_err +}; + +static match_table_t tokens = { + {Opt_uid, "uid=%u"}, + {Opt_gid, "gid=%u"}, + {Opt_err, NULL} +}; + static int parse_options(char *options,uid_t *uid,gid_t *gid) { - char *this_char,*value; + char *p; + int option; *uid = current->uid; *gid = current->gid; if (!options) return 1; - while ((this_char = strsep(&options,",")) != NULL) { - if (!*this_char) + + while ((p = strsep(&options, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + if (!*p) continue; - if ((value = strchr(this_char,'=')) != NULL) - *value++ = 0; - if (!strcmp(this_char,"uid")) { - if (!value || !*value) - return 0; - *uid = simple_strtoul(value,&value,0); - if (*value) - return 0; - } - else if (!strcmp(this_char,"gid")) { - if (!value || !*value) + + token = match_token(p, tokens, args); + switch (token) { + case Opt_uid: + if (match_int(args, &option)) return 0; - *gid = simple_strtoul(value,&value,0); - if (*value) + *uid = option; + break; + case Opt_gid: + if (match_int(args, &option)) return 0; + *gid = option; + break; + default: + return 0; } - else return 1; } return 1; } diff -Nru a/fs/quota_v1.c b/fs/quota_v1.c --- a/fs/quota_v1.c Wed Oct 8 12:24:57 2003 +++ b/fs/quota_v1.c Wed Oct 8 12:24:57 2003 @@ -21,7 +21,7 @@ m->dqb_curinodes = d->dqb_curinodes; m->dqb_bhardlimit = d->dqb_bhardlimit; m->dqb_bsoftlimit = d->dqb_bsoftlimit; - m->dqb_curspace = d->dqb_curblocks << QUOTABLOCK_BITS; + m->dqb_curspace = ((qsize_t)d->dqb_curblocks) << QUOTABLOCK_BITS; m->dqb_itime = d->dqb_itime; m->dqb_btime = d->dqb_btime; } diff -Nru a/fs/read_write.c b/fs/read_write.c --- a/fs/read_write.c Wed Oct 8 12:24:57 2003 +++ b/fs/read_write.c Wed Oct 8 12:24:57 2003 @@ -23,6 +23,8 @@ .sendfile = generic_file_sendfile, }; +EXPORT_SYMBOL(generic_ro_fops); + loff_t generic_file_llseek(struct file *file, loff_t offset, int origin) { long long retval; @@ -48,6 +50,8 @@ return retval; } +EXPORT_SYMBOL(generic_file_llseek); + loff_t remote_llseek(struct file *file, loff_t offset, int origin) { long long retval; @@ -72,11 +76,15 @@ return retval; } +EXPORT_SYMBOL(remote_llseek); + loff_t no_llseek(struct file *file, loff_t offset, int origin) { return -ESPIPE; } +EXPORT_SYMBOL(no_llseek); + loff_t default_llseek(struct file *file, loff_t offset, int origin) { long long retval; @@ -101,6 +109,8 @@ return retval; } +EXPORT_SYMBOL(default_llseek); + static inline loff_t llseek(struct file *file, loff_t offset, int origin) { loff_t (*fn)(struct file *, loff_t, int); @@ -183,6 +193,8 @@ return ret; } +EXPORT_SYMBOL(do_sync_read); + ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos) { struct inode *inode = file->f_dentry->d_inode; @@ -209,6 +221,8 @@ return ret; } +EXPORT_SYMBOL(vfs_read); + ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos) { struct kiocb kiocb; @@ -223,6 +237,8 @@ return ret; } +EXPORT_SYMBOL(do_sync_write); + ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos) { struct inode *inode = file->f_dentry->d_inode; @@ -249,6 +265,8 @@ return ret; } +EXPORT_SYMBOL(vfs_write); + asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count) { struct file *file; @@ -337,6 +355,8 @@ return seg; } +EXPORT_SYMBOL(iov_shorten); + static ssize_t do_readv_writev(int type, struct file *file, const struct iovec __user * uvector, unsigned long nr_segs, loff_t *pos) @@ -468,6 +488,8 @@ return do_readv_writev(READ, file, vec, vlen, pos); } +EXPORT_SYMBOL(vfs_readv); + ssize_t vfs_writev(struct file *file, const struct iovec __user *vec, unsigned long vlen, loff_t *pos) { @@ -479,6 +501,7 @@ return do_readv_writev(WRITE, file, vec, vlen, pos); } +EXPORT_SYMBOL(vfs_writev); asmlinkage ssize_t sys_readv(unsigned long fd, const struct iovec __user *vec, unsigned long vlen) @@ -630,6 +653,3 @@ return do_sendfile(out_fd, in_fd, NULL, count, 0); } - -EXPORT_SYMBOL(do_sync_read); -EXPORT_SYMBOL(do_sync_write); diff -Nru a/fs/readdir.c b/fs/readdir.c --- a/fs/readdir.c Wed Oct 8 12:24:56 2003 +++ b/fs/readdir.c Wed Oct 8 12:24:56 2003 @@ -4,6 +4,7 @@ * Copyright (C) 1995 Linus Torvalds */ +#include #include #include #include @@ -36,6 +37,8 @@ out: return res; } + +EXPORT_SYMBOL(vfs_readdir); /* * Traditional linux readdir() handling.. diff -Nru a/fs/select.c b/fs/select.c --- a/fs/select.c Wed Oct 8 12:24:55 2003 +++ b/fs/select.c Wed Oct 8 12:24:55 2003 @@ -14,6 +14,7 @@ * of fds to overcome nfds < 16390 descriptors limit (Tigran Aivazian). */ +#include #include #include #include @@ -62,6 +63,8 @@ pwq->table = NULL; } +EXPORT_SYMBOL(poll_initwait); + void poll_freewait(struct poll_wqueues *pwq) { struct poll_table_page * p = pwq->table; @@ -81,6 +84,8 @@ } } +EXPORT_SYMBOL(poll_freewait); + void __pollwait(struct file *filp, wait_queue_head_t *wait_address, poll_table *_p) { struct poll_wqueues *p = container_of(_p, struct poll_wqueues, pt); @@ -265,6 +270,8 @@ *timeout = __timeout; return retval; } + +EXPORT_SYMBOL(do_select); static void *select_bits_alloc(int size) { diff -Nru a/fs/seq_file.c b/fs/seq_file.c --- a/fs/seq_file.c Wed Oct 8 12:24:57 2003 +++ b/fs/seq_file.c Wed Oct 8 12:24:57 2003 @@ -6,6 +6,7 @@ */ #include +#include #include #include @@ -37,6 +38,8 @@ return 0; } +EXPORT_SYMBOL(seq_open); + /** * seq_read - ->read() method for sequential files. * @file, @buf, @size, @ppos: see file_operations method @@ -144,6 +147,8 @@ goto Done; } +EXPORT_SYMBOL(seq_read); + static int traverse(struct seq_file *m, loff_t offset) { loff_t pos = 0; @@ -228,6 +233,8 @@ return retval; } +EXPORT_SYMBOL(seq_lseek); + /** * seq_release - free the structures associated with sequential file. * @file: file in question @@ -244,6 +251,8 @@ return 0; } +EXPORT_SYMBOL(seq_release); + /** * seq_escape - print string into buffer, escaping some characters * @m: target buffer @@ -279,6 +288,8 @@ return 0; } +EXPORT_SYMBOL(seq_escape); + int seq_printf(struct seq_file *m, const char *f, ...) { va_list args; @@ -297,9 +308,11 @@ return -1; } +EXPORT_SYMBOL(seq_printf); + int seq_path(struct seq_file *m, - struct vfsmount *mnt, struct dentry *dentry, - char *esc) + struct vfsmount *mnt, struct dentry *dentry, + char *esc) { if (m->count < m->size) { char *s = m->buf + m->count; @@ -328,6 +341,8 @@ return -1; } +EXPORT_SYMBOL(seq_path); + static void *single_start(struct seq_file *p, loff_t *pos) { return NULL + (*pos == 0); @@ -343,7 +358,8 @@ { } -int single_open(struct file *file, int (*show)(struct seq_file *, void*), void *data) +int single_open(struct file *file, int (*show)(struct seq_file *, void *), + void *data) { struct seq_operations *op = kmalloc(sizeof(*op), GFP_KERNEL); int res = -ENOMEM; @@ -362,6 +378,8 @@ return res; } +EXPORT_SYMBOL(single_open); + int single_release(struct inode *inode, struct file *file) { struct seq_operations *op = ((struct seq_file *)file->private_data)->op; @@ -370,6 +388,8 @@ return res; } +EXPORT_SYMBOL(single_release); + int seq_release_private(struct inode *inode, struct file *file) { struct seq_file *seq = file->private_data; @@ -379,3 +399,4 @@ return seq_release(inode, file); } +EXPORT_SYMBOL(seq_release_private); diff -Nru a/fs/smbfs/inode.c b/fs/smbfs/inode.c --- a/fs/smbfs/inode.c Wed Oct 8 12:24:55 2003 +++ b/fs/smbfs/inode.c Wed Oct 8 12:24:55 2003 @@ -551,8 +551,8 @@ if (ver == SMB_MOUNT_OLDVERSION) { mnt->version = oldmnt->version; - mnt->uid = low2highuid(oldmnt->uid); - mnt->gid = low2highuid(oldmnt->gid); + SET_UID(mnt->uid, oldmnt->uid); + SET_GID(mnt->gid, oldmnt->gid); mnt->file_mode = (oldmnt->file_mode & S_IRWXUGO) | S_IFREG; mnt->dir_mode = (oldmnt->dir_mode & S_IRWXUGO) | S_IFDIR; diff -Nru a/fs/smbfs/ioctl.c b/fs/smbfs/ioctl.c --- a/fs/smbfs/ioctl.c Wed Oct 8 12:24:55 2003 +++ b/fs/smbfs/ioctl.c Wed Oct 8 12:24:55 2003 @@ -31,12 +31,15 @@ int result = -EINVAL; switch (cmd) { + uid16_t uid16; + uid_t uid32; case SMB_IOC_GETMOUNTUID: - result = put_user(NEW_TO_OLD_UID(server->mnt->mounted_uid), - (uid16_t *) arg); + SET_UID(uid16, server->mnt->mounted_uid); + result = put_user(uid16, (uid16_t *) arg); break; case SMB_IOC_GETMOUNTUID32: - result = put_user(server->mnt->mounted_uid, (uid_t *) arg); + SET_UID(uid32, server->mnt->mounted_uid); + result = put_user(uid32, (uid_t *) arg); break; case SMB_IOC_NEWCONN: diff -Nru a/fs/stat.c b/fs/stat.c --- a/fs/stat.c Wed Oct 8 12:24:56 2003 +++ b/fs/stat.c Wed Oct 8 12:24:56 2003 @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -33,6 +34,8 @@ stat->blksize = inode->i_blksize; } +EXPORT_SYMBOL(generic_fillattr); + int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) { struct inode *inode = dentry->d_inode; @@ -56,6 +59,8 @@ return 0; } +EXPORT_SYMBOL(vfs_getattr); + int vfs_stat(char __user *name, struct kstat *stat) { struct nameidata nd; @@ -69,6 +74,8 @@ return error; } +EXPORT_SYMBOL(vfs_stat); + int vfs_lstat(char __user *name, struct kstat *stat) { struct nameidata nd; @@ -82,6 +89,8 @@ return error; } +EXPORT_SYMBOL(vfs_lstat); + int vfs_fstat(unsigned int fd, struct kstat *stat) { struct file *f = fget(fd); @@ -94,6 +103,8 @@ return error; } +EXPORT_SYMBOL(vfs_fstat); + #if !defined(__alpha__) && !defined(__sparc__) && !defined(__ia64__) \ && !defined(CONFIG_ARCH_S390) && !defined(__hppa__) && !defined(__x86_64__) \ && !defined(__arm__) && !defined(CONFIG_V850) && !defined(__powerpc64__) @@ -121,8 +132,8 @@ tmp.st_ino = stat->ino; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; - SET_OLDSTAT_UID(tmp, stat->uid); - SET_OLDSTAT_GID(tmp, stat->gid); + SET_UID(tmp.st_uid, stat->uid); + SET_GID(tmp.st_gid, stat->gid); tmp.st_rdev = old_encode_dev(stat->rdev); #if BITS_PER_LONG == 32 if (stat->size > MAX_NON_LFS) @@ -189,8 +200,8 @@ tmp.st_ino = stat->ino; tmp.st_mode = stat->mode; tmp.st_nlink = stat->nlink; - SET_STAT_UID(tmp, stat->uid); - SET_STAT_GID(tmp, stat->gid); + SET_UID(tmp.st_uid, stat->uid); + SET_GID(tmp.st_gid, stat->gid); #if BITS_PER_LONG == 32 tmp.st_rdev = old_encode_dev(stat->rdev); #else @@ -355,6 +366,8 @@ spin_unlock(&inode->i_lock); } +EXPORT_SYMBOL(inode_add_bytes); + void inode_sub_bytes(struct inode *inode, loff_t bytes) { spin_lock(&inode->i_lock); @@ -368,6 +381,8 @@ spin_unlock(&inode->i_lock); } +EXPORT_SYMBOL(inode_sub_bytes); + loff_t inode_get_bytes(struct inode *inode) { loff_t ret; @@ -378,8 +393,12 @@ return ret; } +EXPORT_SYMBOL(inode_get_bytes); + void inode_set_bytes(struct inode *inode, loff_t bytes) { inode->i_blocks = bytes >> 9; inode->i_bytes = bytes & 511; } + +EXPORT_SYMBOL(inode_set_bytes); diff -Nru a/fs/super.c b/fs/super.c --- a/fs/super.c Wed Oct 8 12:24:56 2003 +++ b/fs/super.c Wed Oct 8 12:24:56 2003 @@ -21,6 +21,7 @@ */ #include +#include #include #include #include @@ -134,9 +135,11 @@ } } +EXPORT_SYMBOL(deactivate_super); + /** - * grab_super - acquire an active reference - * @s - reference we are trying to make active + * grab_super - acquire an active reference + * @s: reference we are trying to make active * * Tries to acquire an active reference. grab_super() is used when we * had just found a superblock in super_blocks or fs_type->fs_supers @@ -214,6 +217,8 @@ up_write(&sb->s_umount); } +EXPORT_SYMBOL(generic_shutdown_super); + /** * sget - find or create a superblock * @type: filesystem type superblock should belong to @@ -226,13 +231,10 @@ int (*set)(struct super_block *,void *), void *data) { - struct super_block *s = alloc_super(); + struct super_block *s = NULL; struct list_head *p; int err; - if (!s) - return ERR_PTR(-ENOMEM); - retry: spin_lock(&sb_lock); if (test) list_for_each(p, &type->fs_supers) { @@ -242,9 +244,18 @@ continue; if (!grab_super(old)) goto retry; - destroy_super(s); + if (s) + destroy_super(s); return old; } + if (!s) { + spin_unlock(&sb_lock); + s = alloc_super(); + if (!s) + return ERR_PTR(-ENOMEM); + goto retry; + } + err = set(s, data); if (err) { spin_unlock(&sb_lock); @@ -259,12 +270,16 @@ return s; } +EXPORT_SYMBOL(sget); + void drop_super(struct super_block *sb) { up_read(&sb->s_umount); put_super(sb); } +EXPORT_SYMBOL(drop_super); + static inline void write_super(struct super_block *sb) { lock_super(sb); @@ -353,8 +368,8 @@ } /** - * get_super - get the superblock of a device - * @dev: device to get the superblock for + * get_super - get the superblock of a device + * @bdev: device to get the superblock for * * Scans the superblock list and finds the superblock of the file system * mounted on the device given. %NULL is returned if no match is found. @@ -382,6 +397,8 @@ spin_unlock(&sb_lock); return NULL; } + +EXPORT_SYMBOL(get_super); struct super_block * user_get_super(dev_t dev) { @@ -405,6 +422,8 @@ return NULL; } +EXPORT_SYMBOL(user_get_super); + asmlinkage long sys_ustat(unsigned dev, struct ustat __user * ubuf) { struct super_block *s; @@ -442,10 +461,11 @@ } /** - * do_remount_sb - asks filesystem to change mount options. + * do_remount_sb - asks filesystem to change mount options. * @sb: superblock in question * @flags: numeric part of options * @data: the rest of options + * @force: whether or not to force the change * * Alters the mount options of a mounted file system. */ @@ -534,6 +554,8 @@ return 0; } +EXPORT_SYMBOL(set_anon_super); + void kill_anon_super(struct super_block *sb) { int slot = MINOR(sb->s_dev); @@ -543,6 +565,8 @@ spin_unlock(&unnamed_dev_lock); } +EXPORT_SYMBOL(kill_anon_super); + void kill_litter_super(struct super_block *sb) { if (sb->s_root) @@ -550,6 +574,8 @@ kill_anon_super(sb); } +EXPORT_SYMBOL(kill_litter_super); + static int set_bdev_super(struct super_block *s, void *data) { s->s_bdev = data; @@ -608,6 +634,8 @@ return s; } +EXPORT_SYMBOL(get_sb_bdev); + void kill_block_super(struct super_block *sb) { struct block_device *bdev = sb->s_bdev; @@ -616,6 +644,8 @@ close_bdev_excl(bdev, BDEV_FS); } +EXPORT_SYMBOL(kill_block_super); + struct super_block *get_sb_nodev(struct file_system_type *fs_type, int flags, void *data, int (*fill_super)(struct super_block *, void *, int)) @@ -638,6 +668,8 @@ return s; } +EXPORT_SYMBOL(get_sb_nodev); + static int compare_single(struct super_block *s, void *p) { return 1; @@ -667,6 +699,8 @@ return s; } +EXPORT_SYMBOL(get_sb_single); + struct vfsmount * do_kern_mount(const char *fstype, int flags, const char *name, void *data) { @@ -709,3 +743,5 @@ { return do_kern_mount(type->name, 0, type->name, NULL); } + +EXPORT_SYMBOL(kern_mount); diff -Nru a/fs/sysv/namei.c b/fs/sysv/namei.c --- a/fs/sysv/namei.c Wed Oct 8 12:24:57 2003 +++ b/fs/sysv/namei.c Wed Oct 8 12:24:57 2003 @@ -42,21 +42,12 @@ static int sysv_hash(struct dentry *dentry, struct qstr *qstr) { - unsigned long hash; - int i; - const unsigned char *name; - - i = SYSV_NAMELEN; - if (i >= qstr->len) - return 0; /* Truncate the name in place, avoids having to define a compare function. */ - qstr->len = i; - name = qstr->name; - hash = init_name_hash(); - while (i--) - hash = partial_name_hash(*name++, hash); - qstr->hash = end_name_hash(hash); + if (qstr->len > SYSV_NAMELEN) { + qstr->len = SYSV_NAMELEN; + qstr->hash = full_name_hash(qstr->name, qstr->len); + } return 0; } diff -Nru a/fs/udf/inode.c b/fs/udf/inode.c --- a/fs/udf/inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/udf/inode.c Wed Oct 8 12:24:57 2003 @@ -127,6 +127,7 @@ void udf_clear_inode(struct inode *inode) { kfree(UDF_I_DATA(inode)); + UDF_I_DATA(inode) = NULL; } void udf_discard_prealloc(struct inode * inode) diff -Nru a/fs/udf/super.c b/fs/udf/super.c --- a/fs/udf/super.c Wed Oct 8 12:24:57 2003 +++ b/fs/udf/super.c Wed Oct 8 12:24:57 2003 @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -132,8 +133,10 @@ struct udf_inode_info *ei = (struct udf_inode_info *) foo; if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) == - SLAB_CTOR_CONSTRUCTOR) + SLAB_CTOR_CONSTRUCTOR) { + ei->i_ext.i_data = NULL; inode_init_once(&ei->vfs_inode); + } } static int init_inodecache(void) @@ -225,7 +228,7 @@ * gid= Set the default group. * umask= Set the default umask. * uid= Set the default user. - * bs= Set the block size. + * bs= Set the block size. * unhide Show otherwise hidden files. * undelete Show deleted files in lists. * adinicb Embed data in the inode (default) @@ -259,18 +262,53 @@ * uopts Pointer to mount options variable. * * POST-CONDITIONS - * 0 Mount options parsed okay. - * -1 Error parsing mount options. + * 1 Mount options parsed okay. + * 0 Error parsing mount options. * * HISTORY * July 1, 1997 - Andrew E. Mileski * Written, tested, and released. */ +enum { + Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete, + Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad, + Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock, + Opt_anchor, Opt_volume, Opt_partition, Opt_fileset, + Opt_rootdir, Opt_utf8, Opt_iocharset, + Opt_err +}; + +static match_table_t tokens = { + {Opt_novrs, "novrs"}, + {Opt_nostrict, "nostrict"}, + {Opt_bs, "bs=%u"}, + {Opt_unhide, "unhide"}, + {Opt_undelete, "undelete"}, + {Opt_noadinicb, "noadinicb"}, + {Opt_adinicb, "adinicb"}, + {Opt_shortad, "shortad"}, + {Opt_longad, "longad"}, + {Opt_gid, "gid=%u"}, + {Opt_uid, "uid=%u"}, + {Opt_umask, "umask=%o"}, + {Opt_session, "session=%u"}, + {Opt_lastblock, "lastblock=%u"}, + {Opt_anchor, "anchor=%u"}, + {Opt_volume, "volume=%u"}, + {Opt_partition, "partition=%u"}, + {Opt_fileset, "fileset=%u"}, + {Opt_rootdir, "rootdir=%u"}, + {Opt_utf8, "utf8"}, + {Opt_iocharset, "iocharset=%s"}, + {Opt_err, NULL} +}; + static int udf_parse_options(char *options, struct udf_options *uopt) { - char *opt, *val; + char *p; + int option; uopt->novrs = 0; uopt->blocksize = 2048; @@ -286,71 +324,106 @@ if (!options) return 1; - while ((opt = strsep(&options, ",")) != NULL) - { - if (!*opt) + while ((p = strsep(&options, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + if (!*p) continue; - /* Make "opt=val" into two strings */ - val = strchr(opt, '='); - if (val) - *(val++) = 0; - if (!strcmp(opt, "novrs") && !val) + + token = match_token(p, tokens, args); + switch (token) { + case Opt_novrs: uopt->novrs = 1; - else if (!strcmp(opt, "bs") && val) - uopt->blocksize = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "unhide") && !val) + break; + case Opt_bs: + if (match_int(&args[0], &option)) + return 0; + uopt->blocksize = option; + break; + case Opt_unhide: uopt->flags |= (1 << UDF_FLAG_UNHIDE); - else if (!strcmp(opt, "undelete") && !val) + break; + case Opt_undelete: uopt->flags |= (1 << UDF_FLAG_UNDELETE); - else if (!strcmp(opt, "noadinicb") && !val) + break; + case Opt_noadinicb: uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB); - else if (!strcmp(opt, "adinicb") && !val) + break; + case Opt_adinicb: uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB); - else if (!strcmp(opt, "shortad") && !val) + break; + case Opt_shortad: uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD); - else if (!strcmp(opt, "longad") && !val) + break; + case Opt_longad: uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD); - else if (!strcmp(opt, "gid") && val) - uopt->gid = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "umask") && val) - uopt->umask = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "nostrict") && !val) + break; + case Opt_gid: + if (match_int(args, &option)) + return 0; + uopt->gid = option; + break; + case Opt_uid: + if (match_int(args, &option)) + return 0; + uopt->uid = option; + break; + case Opt_umask: + if (match_octal(args, &option)) + return 0; + uopt->umask = option; + break; + case Opt_nostrict: uopt->flags &= ~(1 << UDF_FLAG_STRICT); - else if (!strcmp(opt, "uid") && val) - uopt->uid = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "session") && val) - uopt->session = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "lastblock") && val) - uopt->lastblock = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "anchor") && val) - uopt->anchor = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "volume") && val) - uopt->volume = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "partition") && val) - uopt->partition = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "fileset") && val) - uopt->fileset = simple_strtoul(val, NULL, 0); - else if (!strcmp(opt, "rootdir") && val) - uopt->rootdir = simple_strtoul(val, NULL, 0); + break; + case Opt_session: + if (match_int(args, &option)) + return 0; + uopt->session = option; + break; + case Opt_lastblock: + if (match_int(args, &option)) + return 0; + uopt->lastblock = option; + break; + case Opt_anchor: + if (match_int(args, &option)) + return 0; + uopt->anchor = option; + break; + case Opt_volume: + if (match_int(args, &option)) + return 0; + uopt->volume = option; + break; + case Opt_partition: + if (match_int(args, &option)) + return 0; + uopt->partition = option; + break; + case Opt_fileset: + if (match_int(args, &option)) + return 0; + uopt->fileset = option; + break; + case Opt_rootdir: + if (match_int(args, &option)) + return 0; + uopt->rootdir = option; + break; + case Opt_utf8: + uopt->flags |= (1 << UDF_FLAG_UTF8); + break; #ifdef CONFIG_NLS - else if (!strcmp(opt, "iocharset") && val) - { - uopt->nls_map = load_nls(val); + case Opt_iocharset: + uopt->nls_map = load_nls(args[0].from); uopt->flags |= (1 << UDF_FLAG_NLS_MAP); - } + break; #endif - else if (!strcmp(opt, "utf8") && !val) - uopt->flags |= (1 << UDF_FLAG_UTF8); - else if (val) - { - printk(KERN_ERR "udf: bad mount option \"%s=%s\"\n", - opt, val); - return 0; - } - else - { - printk(KERN_ERR "udf: bad mount option \"%s\"\n", - opt); + default: + printk(KERN_ERR "udf: bad mount option \"%s\" " + "or missing value\n", + p); return 0; } } diff -Nru a/fs/ufs/super.c b/fs/ufs/super.c --- a/fs/ufs/super.c Wed Oct 8 12:24:55 2003 +++ b/fs/ufs/super.c Wed Oct 8 12:24:55 2003 @@ -79,6 +79,7 @@ #include #include #include +#include #include #include #include @@ -250,64 +251,99 @@ sb->s_id, function, error_buf); } +enum { + Opt_type_old, Opt_type_sunx86, Opt_type_sun, Opt_type_44bsd, + Opt_type_hp, Opt_type_nextstepcd, Opt_type_nextstep, + Opt_type_openstep, Opt_onerror_panic, Opt_onerror_lock, + Opt_onerror_umount, Opt_onerror_repair, Opt_err +}; + +static match_table_t tokens = { + {Opt_type_old, "ufstype=old"}, + {Opt_type_sunx86, "ufstype=sunx86"}, + {Opt_type_sun, "ufstype=sun"}, + {Opt_type_44bsd, "ufstype=44bsd"}, + {Opt_type_hp, "ufstype=hp"}, + {Opt_type_nextstepcd, "ufstype=nextstep-cd"}, + {Opt_type_nextstep, "ufstype=nextstep"}, + {Opt_type_openstep, "ufstype=openstep"}, + {Opt_onerror_panic, "onerror=panic"}, + {Opt_onerror_lock, "onerror=lock"}, + {Opt_onerror_umount, "onerror=umount"}, + {Opt_onerror_repair, "onerror=repair"}, + {Opt_err, NULL} +}; + static int ufs_parse_options (char * options, unsigned * mount_options) { - char * this_char; - char * value; + char * p; UFSD(("ENTER\n")) if (!options) return 1; - while ((this_char = strsep (&options, ",")) != NULL) { - if (!*this_char) + while ((p = strsep(&options, ",")) != NULL) { + substring_t args[MAX_OPT_ARGS]; + int token; + if (!*p) continue; - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; - if (!strcmp (this_char, "ufstype")) { - ufs_clear_opt (*mount_options, UFSTYPE); - if (!strcmp (value, "old")) - ufs_set_opt (*mount_options, UFSTYPE_OLD); - else if (!strcmp (value, "sun")) - ufs_set_opt (*mount_options, UFSTYPE_SUN); - else if (!strcmp (value, "44bsd")) - ufs_set_opt (*mount_options, UFSTYPE_44BSD); - else if (!strcmp (value, "nextstep")) - ufs_set_opt (*mount_options, UFSTYPE_NEXTSTEP); - else if (!strcmp (value, "nextstep-cd")) - ufs_set_opt (*mount_options, UFSTYPE_NEXTSTEP_CD); - else if (!strcmp (value, "openstep")) - ufs_set_opt (*mount_options, UFSTYPE_OPENSTEP); - else if (!strcmp (value, "sunx86")) - ufs_set_opt (*mount_options, UFSTYPE_SUNx86); - else if (!strcmp (value, "hp")) - ufs_set_opt (*mount_options, UFSTYPE_HP); - else { - printk ("UFS-fs: Invalid type option: %s\n", value); - return 0; - } - } - else if (!strcmp (this_char, "onerror")) { + + token = match_token(p, tokens, args); + switch (token) { + case Opt_type_old: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_OLD); + break; + case Opt_type_sunx86: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_SUNx86); + break; + case Opt_type_sun: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_SUN); + break; + case Opt_type_44bsd: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_44BSD); + break; + case Opt_type_hp: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_HP); + break; + case Opt_type_nextstepcd: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_NEXTSTEP_CD); + break; + case Opt_type_nextstep: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_NEXTSTEP); + break; + case Opt_type_openstep: + ufs_clear_opt (*mount_options, UFSTYPE); + ufs_set_opt (*mount_options, UFSTYPE_OPENSTEP); + break; + case Opt_onerror_panic: + ufs_clear_opt (*mount_options, ONERROR); + ufs_set_opt (*mount_options, ONERROR_PANIC); + break; + case Opt_onerror_lock: + ufs_clear_opt (*mount_options, ONERROR); + ufs_set_opt (*mount_options, ONERROR_LOCK); + break; + case Opt_onerror_umount: + ufs_clear_opt (*mount_options, ONERROR); + ufs_set_opt (*mount_options, ONERROR_UMOUNT); + break; + case Opt_onerror_repair: + printk("UFS-fs: Unable to do repair on error, " + "will lock lock instead\n"); ufs_clear_opt (*mount_options, ONERROR); - if (!strcmp (value, "panic")) - ufs_set_opt (*mount_options, ONERROR_PANIC); - else if (!strcmp (value, "lock")) - ufs_set_opt (*mount_options, ONERROR_LOCK); - else if (!strcmp (value, "umount")) - ufs_set_opt (*mount_options, ONERROR_UMOUNT); - else if (!strcmp (value, "repair")) { - printk("UFS-fs: Unable to do repair on error, " - "will lock lock instead \n"); - ufs_set_opt (*mount_options, ONERROR_REPAIR); - } - else { - printk ("UFS-fs: Invalid action onerror: %s\n", value); - return 0; - } - } - else { - printk("UFS-fs: Invalid option: %s\n", this_char); + ufs_set_opt (*mount_options, ONERROR_REPAIR); + break; + default: + printk("UFS-fs: Invalid option: \"%s\" " + "or missing value\n", p); return 0; } } diff -Nru a/fs/vfat/namei.c b/fs/vfat/namei.c --- a/fs/vfat/namei.c Wed Oct 8 12:24:57 2003 +++ b/fs/vfat/namei.c Wed Oct 8 12:24:57 2003 @@ -82,10 +82,10 @@ */ ret = 0; else { - spin_lock(&dcache_lock); + spin_lock(&dentry->d_lock); if (dentry->d_time != dentry->d_parent->d_inode->i_version) ret = 0; - spin_unlock(&dcache_lock); + spin_unlock(&dentry->d_lock); } return ret; } @@ -714,7 +714,7 @@ PRINTK3(("vfat_fill_slots 9\n")); /* build the entry of 8.3 alias name */ (*slots)++; - strncpy(de->name, msdos_name, MSDOS_NAME); + memcpy(de->name, msdos_name, MSDOS_NAME); de->attr = is_dir ? ATTR_DIR : ATTR_ARCH; de->lcase = lcase; de->adate = de->cdate = de->date = 0; @@ -901,8 +901,7 @@ int i; /* remove the shortname */ - dir->i_mtime = CURRENT_TIME; - dir->i_atime = CURRENT_TIME; + dir->i_mtime = dir->i_atime = CURRENT_TIME; dir->i_version++; mark_inode_dirty(dir); de->name[0] = DELETED_FLAG; @@ -939,8 +938,7 @@ return res; } dentry->d_inode->i_nlink = 0; - dentry->d_inode->i_mtime = CURRENT_TIME; - dentry->d_inode->i_atime = CURRENT_TIME; + dentry->d_inode->i_mtime = dentry->d_inode->i_atime = CURRENT_TIME; fat_detach(dentry->d_inode); mark_inode_dirty(dentry->d_inode); /* releases bh */ @@ -965,8 +963,7 @@ return res; } dentry->d_inode->i_nlink = 0; - dentry->d_inode->i_mtime = CURRENT_TIME; - dentry->d_inode->i_atime = CURRENT_TIME; + dentry->d_inode->i_mtime = dentry->d_inode->i_atime = CURRENT_TIME; fat_detach(dentry->d_inode); mark_inode_dirty(dentry->d_inode); /* releases bh */ @@ -1013,8 +1010,7 @@ mkdir_failed: inode->i_nlink = 0; - inode->i_mtime = CURRENT_TIME; - inode->i_atime = CURRENT_TIME; + inode->i_mtime = inode->i_atime = CURRENT_TIME; fat_detach(inode); mark_inode_dirty(inode); /* releases bh */ diff -Nru a/fs/xfs/linux/xfs_aops.c b/fs/xfs/linux/xfs_aops.c --- a/fs/xfs/linux/xfs_aops.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/linux/xfs_aops.c Wed Oct 8 12:24:57 2003 @@ -461,7 +461,8 @@ struct page *page; tlast = i_size_read(inode) >> PAGE_CACHE_SHIFT; - tloff = min(tlast, start_page->index + pb->pb_page_count - 1); + tloff = (mp->pbm_offset + mp->pbm_bsize) >> PAGE_CACHE_SHIFT; + tloff = min(tlast, tloff); for (tindex = start_page->index + 1; tindex < tloff; tindex++) { page = probe_unwritten_page(mapping, tindex, mp, pb, PAGE_CACHE_SIZE, &bs, bbits); @@ -1041,6 +1042,8 @@ do { if (buffer_uptodate(bh) && !buffer_mapped(bh)) (*unmapped) = 1; + else if (buffer_unwritten(bh) && !buffer_delay(bh)) + clear_buffer_unwritten(bh); else if (buffer_unwritten(bh)) (*unwritten) = 1; else if (buffer_delay(bh)) diff -Nru a/fs/xfs/linux/xfs_iops.c b/fs/xfs/linux/xfs_iops.c --- a/fs/xfs/linux/xfs_iops.c Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/linux/xfs_iops.c Wed Oct 8 12:24:56 2003 @@ -386,6 +386,7 @@ uio.uio_segflg = UIO_USERSPACE; uio.uio_resid = size; uio.uio_iovcnt = 1; + uio.uio_fmode = 0; VOP_READLINK(vp, &uio, NULL, error); if (error) diff -Nru a/fs/xfs/linux/xfs_lrw.c b/fs/xfs/linux/xfs_lrw.c --- a/fs/xfs/linux/xfs_lrw.c Wed Oct 8 12:24:55 2003 +++ b/fs/xfs/linux/xfs_lrw.c Wed Oct 8 12:24:55 2003 @@ -218,7 +218,7 @@ int error; vrwlock_t locktype = VRWLOCK_READ; - error = XFS_SEND_DATA(mp, DM_EVENT_READ, bdp, *offset, size, + error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), *offset, size, FILP_DELAY_FLAG(file), &locktype); if (error) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); @@ -278,7 +278,7 @@ vrwlock_t locktype = VRWLOCK_READ; int error; - error = XFS_SEND_DATA(mp, DM_EVENT_READ, bdp, *offset, count, + error = XFS_SEND_DATA(mp, DM_EVENT_READ, BHV_TO_VNODE(bdp), *offset, count, FILP_DELAY_FLAG(filp), &locktype); if (error) { xfs_iunlock(ip, XFS_IOLOCK_SHARED); @@ -612,7 +612,7 @@ loff_t savedsize = *offset; xfs_iunlock(xip, XFS_ILOCK_EXCL); - error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, bdp, + error = XFS_SEND_DATA(xip->i_mount, DM_EVENT_WRITE, vp, *offset, size, FILP_DELAY_FLAG(file), &locktype); if (error) { diff -Nru a/fs/xfs/linux/xfs_stats.c b/fs/xfs/linux/xfs_stats.c --- a/fs/xfs/linux/xfs_stats.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/linux/xfs_stats.c Wed Oct 8 12:24:57 2003 @@ -33,7 +33,7 @@ #include "xfs.h" #include -struct xfsstats xfsstats; +DEFINE_PER_CPU(struct xfsstats, xfsstats); STATIC int xfs_read_xfsstats( @@ -44,7 +44,11 @@ int *eof, void *data) { - int i, j, len; + int c, i, j, len, val; + __uint64_t xs_xstrat_bytes = 0; + __uint64_t xs_write_bytes = 0; + __uint64_t xs_read_bytes = 0; + static struct xstats_entry { char *desc; int endpoint; @@ -65,21 +69,32 @@ { "vnodes", XFSSTAT_END_VNODE_OPS }, }; + /* Loop over all stats groups */ for (i=j=len = 0; i < sizeof(xstats)/sizeof(struct xstats_entry); i++) { len += sprintf(buffer + len, xstats[i].desc); /* inner loop does each group */ while (j < xstats[i].endpoint) { - len += sprintf(buffer + len, " %u", - *(((__u32*)&xfsstats) + j)); + val = 0; + /* sum over all cpus */ + for (c = 0; c < NR_CPUS; c++) { + if (!cpu_possible(c)) continue; + val += *(((__u32*)&per_cpu(xfsstats, c) + j)); + } + len += sprintf(buffer + len, " %u", val); j++; } buffer[len++] = '\n'; } /* extra precision counters */ + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_possible(i)) continue; + xs_xstrat_bytes += per_cpu(xfsstats, i).xs_xstrat_bytes; + xs_write_bytes += per_cpu(xfsstats, i).xs_write_bytes; + xs_read_bytes += per_cpu(xfsstats, i).xs_read_bytes; + } + len += sprintf(buffer + len, "xpc %Lu %Lu %Lu\n", - xfsstats.xs_xstrat_bytes, - xfsstats.xs_write_bytes, - xfsstats.xs_read_bytes); + xs_xstrat_bytes, xs_write_bytes, xs_read_bytes); len += sprintf(buffer + len, "debug %u\n", #if defined(XFSDEBUG) 1); diff -Nru a/fs/xfs/linux/xfs_stats.h b/fs/xfs/linux/xfs_stats.h --- a/fs/xfs/linux/xfs_stats.h Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/linux/xfs_stats.h Wed Oct 8 12:24:56 2003 @@ -35,6 +35,8 @@ #if defined(CONFIG_PROC_FS) && !defined(XFS_STATS_OFF) +#include + /* * XFS global statistics */ @@ -126,11 +128,13 @@ __uint64_t xs_read_bytes; }; -extern struct xfsstats xfsstats; +DECLARE_PER_CPU(struct xfsstats, xfsstats); -# define XFS_STATS_INC(count) ( xfsstats.count++ ) -# define XFS_STATS_DEC(count) ( xfsstats.count-- ) -# define XFS_STATS_ADD(count, inc) ( xfsstats.count += (inc) ) +/* We don't disable preempt, not too worried about poking the + * wrong cpu's stat for now */ +#define XFS_STATS_INC(count) (__get_cpu_var(xfsstats).count++) +#define XFS_STATS_DEC(count) (__get_cpu_var(xfsstats).count--) +#define XFS_STATS_ADD(count, inc) (__get_cpu_var(xfsstats).count += (inc)) extern void xfs_init_procfs(void); extern void xfs_cleanup_procfs(void); diff -Nru a/fs/xfs/linux/xfs_super.c b/fs/xfs/linux/xfs_super.c --- a/fs/xfs/linux/xfs_super.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/linux/xfs_super.c Wed Oct 8 12:24:57 2003 @@ -315,8 +315,8 @@ if (set_blocksize(btp->pbr_bdev, sectorsize)) { printk(KERN_WARNING - "XFS: Cannot set_blocksize to %u on device %u:%u\n", - sectorsize, MAJOR(btp->pbr_dev), MINOR(btp->pbr_dev)); + "XFS: Cannot set_blocksize to %u on device %s\n", + sectorsize, XFS_BUFTARG_NAME(btp)); } } diff -Nru a/fs/xfs/linux/xfs_sysctl.c b/fs/xfs/linux/xfs_sysctl.c --- a/fs/xfs/linux/xfs_sysctl.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/linux/xfs_sysctl.c Wed Oct 8 12:24:57 2003 @@ -48,17 +48,23 @@ void *buffer, size_t *lenp) { - int ret, *valp = ctl->data; + int c, ret, *valp = ctl->data; __uint32_t vn_active; ret = proc_doulongvec_minmax(ctl, write, filp, buffer, lenp); if (!ret && write && *valp) { printk("XFS Clearing xfsstats\n"); - /* save vn_active, it's a universal truth! */ - vn_active = xfsstats.vn_active; - memset(&xfsstats, 0, sizeof(xfsstats)); - xfsstats.vn_active = vn_active; + for (c = 0; c < NR_CPUS; c++) { + if (!cpu_possible(c)) continue; + preempt_disable(); + /* save vn_active, it's a universal truth! */ + vn_active = per_cpu(xfsstats, c).vn_active; + memset(&per_cpu(xfsstats, c), 0, + sizeof(struct xfsstats)); + per_cpu(xfsstats, c).vn_active = vn_active; + preempt_enable(); + } xfs_stats_clear = 0; } diff -Nru a/fs/xfs/linux/xfs_vnode.c b/fs/xfs/linux/xfs_vnode.c --- a/fs/xfs/linux/xfs_vnode.c Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/linux/xfs_vnode.c Wed Oct 8 12:24:56 2003 @@ -200,7 +200,7 @@ vn_trace_entry(vp, "vn_revalidate", (inst_t *)__return_address); ASSERT(vp->v_fbhv != NULL); - va.va_mask = XFS_AT_STAT|XFS_AT_GENCOUNT; + va.va_mask = XFS_AT_STAT|XFS_AT_XFLAGS; VOP_GETATTR(vp, &va, 0, NULL, error); if (!error) { inode = LINVFS_GET_IP(vp); diff -Nru a/fs/xfs/linux/xfs_vnode.h b/fs/xfs/linux/xfs_vnode.h --- a/fs/xfs/linux/xfs_vnode.h Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/linux/xfs_vnode.h Wed Oct 8 12:24:57 2003 @@ -28,6 +28,37 @@ * For further information regarding this notice, see: * * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + * + * Portions Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #ifndef __XFS_VNODE_H__ #define __XFS_VNODE_H__ @@ -39,19 +70,9 @@ struct attrlist_cursor_kern; /* - * Vnode types (unrelated to on-disk inodes). VNON means no type. + * Vnode types. VNON means no type. */ -typedef enum vtype { - VNON = 0, - VREG = 1, - VDIR = 2, - VBLK = 3, - VCHR = 4, - VLNK = 5, - VFIFO = 6, - VBAD = 7, - VSOCK = 8 -} vtype_t; +enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VFIFO, VBAD, VSOCK }; typedef xfs_ino_t vnumber_t; typedef struct dentry vname_t; @@ -115,14 +136,15 @@ #define LINVFS_GET_IP(vp) (&(vp)->v_inode) /* - * Conversion between vnode types/modes and encoded type/mode as - * seen by stat(2) and mknod(2). + * Convert between vnode types and inode formats (since POSIX.1 + * defines mode word of stat structure in terms of inode formats). */ -extern enum vtype iftovt_tab[]; -extern ushort vttoif_tab[]; -#define IFTOVT(M) (iftovt_tab[((M) & S_IFMT) >> 12]) -#define VTTOIF(T) (vttoif_tab[(int)(T)]) -#define MAKEIMODE(T, M) (VTTOIF(T) | ((M) & ~S_IFMT)) +extern enum vtype iftovt_tab[]; +extern u_short vttoif_tab[]; +#define IFTOVT(mode) (iftovt_tab[((mode) & S_IFMT) >> 12]) +#define VTTOIF(indx) (vttoif_tab[(int)(indx)]) +#define MAKEIMODE(indx, mode) (int)(VTTOIF(indx) | (mode)) + /* * Vnode flags. @@ -370,31 +392,29 @@ /* * Vnode attributes. va_mask indicates those attributes the caller - * wants to set (setattr) or extract (getattr). + * wants to set or extract. */ typedef struct vattr { - int va_mask; /* bit-mask of attributes */ - vtype_t va_type; /* vnode type (for create) */ - mode_t va_mode; /* file access mode */ + int va_mask; /* bit-mask of attributes present */ + enum vtype va_type; /* vnode type (for create) */ + mode_t va_mode; /* file access mode and type */ + nlink_t va_nlink; /* number of references to file */ uid_t va_uid; /* owner user id */ gid_t va_gid; /* owner group id */ - xfs_dev_t va_fsid; /* file system id (dev for now) */ - xfs_ino_t va_nodeid; /* node id */ - nlink_t va_nlink; /* number of references to file */ + xfs_ino_t va_nodeid; /* file id */ xfs_off_t va_size; /* file size in bytes */ - timespec_t va_atime; /* time of last access */ - timespec_t va_mtime; /* time of last modification */ - timespec_t va_ctime; /* time file ``created'' */ - xfs_dev_t va_rdev; /* device the file represents */ - u_long va_blksize; /* fundamental block size */ - __int64_t va_nblocks; /* # of blocks allocated */ - u_long va_vcode; /* version code */ + u_long va_blocksize; /* blocksize preferred for i/o */ + struct timespec va_atime; /* time of last access */ + struct timespec va_mtime; /* time of last modification */ + struct timespec va_ctime; /* time file changed */ + u_int va_gen; /* generation number of file */ + xfs_dev_t va_rdev; /* device the special file represents */ + __int64_t va_nblocks; /* number of blocks allocated */ u_long va_xflags; /* random extended file flags */ u_long va_extsize; /* file extent size */ u_long va_nextents; /* number of extents in file */ u_long va_anextents; /* number of attr extents in file */ int va_projid; /* project id */ - u_int va_gencount; /* object generation count */ } vattr_t; /* @@ -450,11 +470,17 @@ XFS_AT_TYPE|XFS_AT_BLKSIZE|XFS_AT_NBLOCKS|XFS_AT_VCODE|\ XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS|XFS_AT_GENCOUNT) -#define VREAD 00400 -#define VWRITE 00200 -#define VEXEC 00100 -#define VSGID 02000 /* set group id on execution */ -#define MODEMASK 07777 /* mode bits plus permission bits */ +/* + * Modes. + */ +#define VSUID S_ISUID /* set user id on execution */ +#define VSGID S_ISGID /* set group id on execution */ +#define VSVTX S_ISVTX /* save swapped text even after use */ +#define VREAD S_IRUSR /* read, write, execute permissions */ +#define VWRITE S_IWUSR +#define VEXEC S_IXUSR + +#define MODEMASK S_IALLUGO /* mode bits plus permission bits */ /* * Check whether mandatory file locking is enabled. @@ -569,13 +595,9 @@ * Flags to VOP_SETATTR/VOP_GETATTR. */ #define ATTR_UTIME 0x01 /* non-default utime(2) request */ -#define ATTR_EXEC 0x02 /* invocation from exec(2) */ -#define ATTR_COMM 0x04 /* yield common vp attributes */ #define ATTR_DMI 0x08 /* invocation from a DMI function */ #define ATTR_LAZY 0x80 /* set/get attributes lazily */ #define ATTR_NONBLOCK 0x100 /* return EAGAIN if operation would block */ -#define ATTR_NOLOCK 0x200 /* Don't grab any conflicting locks */ -#define ATTR_NOSIZETOK 0x400 /* Don't get the DVN_SIZE_READ token */ /* * Flags to VOP_FSYNC and VOP_RECLAIM. diff -Nru a/fs/xfs/pagebuf/page_buf.c b/fs/xfs/pagebuf/page_buf.c --- a/fs/xfs/pagebuf/page_buf.c Wed Oct 8 12:24:55 2003 +++ b/fs/xfs/pagebuf/page_buf.c Wed Oct 8 12:24:55 2003 @@ -141,7 +141,7 @@ * Pagebuf statistics variables */ -struct pbstats pbstats; +DEFINE_PER_CPU(struct pbstats, pbstats); /* * Pagebuf allocation / freeing. @@ -293,7 +293,7 @@ atomic_set(&pb->pb_pin_count, 0); init_waitqueue_head(&pb->pb_waiters); - PB_STATS_INC(pbstats.pb_create); + PB_STATS_INC(pb_create); PB_TRACE(pb, PB_TRACE_REC(get), target); } @@ -485,7 +485,7 @@ page = find_or_create_page(aspace, index, gfp_mask); if (!page) { if (--retry_count > 0) { - PB_STATS_INC(pbstats.pb_page_retries); + PB_STATS_INC(pb_page_retries); pagebuf_daemon_wakeup(1); current->state = TASK_UNINTERRUPTIBLE; schedule_timeout(10); @@ -495,7 +495,7 @@ all_mapped = 0; continue; } - PB_STATS_INC(pbstats.pb_page_found); + PB_STATS_INC(pb_page_found); mark_page_accessed(page); pb->pb_pages[pi] = page; } else { @@ -645,7 +645,7 @@ h->pb_count++; list_add(&new_pb->pb_hash_list, &h->pb_hash); } else { - PB_STATS_INC(pbstats.pb_miss_locked); + PB_STATS_INC(pb_miss_locked); } spin_unlock(&h->pb_hash_lock); @@ -665,7 +665,7 @@ /* wait for buffer ownership */ PB_TRACE(pb, PB_TRACE_REC(get_lk), 0); pagebuf_lock(pb); - PB_STATS_INC(pbstats.pb_get_locked_waited); + PB_STATS_INC(pb_get_locked_waited); } else { /* We asked for a trylock and failed, no need * to look at file offset and length here, we @@ -675,7 +675,7 @@ */ pagebuf_rele(pb); - PB_STATS_INC(pbstats.pb_busy_locked); + PB_STATS_INC(pb_busy_locked); return (NULL); } } else { @@ -691,7 +691,7 @@ _PBF_ADDR_ALLOCATED | \ _PBF_MEM_ALLOCATED; PB_TRACE(pb, PB_TRACE_REC(got_lk), 0); - PB_STATS_INC(pbstats.pb_get_locked); + PB_STATS_INC(pb_get_locked); return (pb); } @@ -747,7 +747,7 @@ return (NULL); } - PB_STATS_INC(pbstats.pb_get); + PB_STATS_INC(pb_get); /* fill in any missing pages */ error = _pagebuf_lookup_pages(pb, pb->pb_target->pbr_mapping, flags); @@ -766,7 +766,7 @@ if (flags & PBF_READ) { if (PBF_NOT_DONE(pb)) { PB_TRACE(pb, PB_TRACE_REC(get_read), flags); - PB_STATS_INC(pbstats.pb_get_read); + PB_STATS_INC(pb_get_read); pagebuf_iostart(pb, flags); } else if (flags & PBF_ASYNC) { /* @@ -1677,6 +1677,9 @@ break; } + pb->pb_flags &= ~PBF_DELWRI; + pb->pb_flags |= PBF_WRITE; + list_del(&pb->pb_list); list_add(&pb->pb_list, &tmp); @@ -1688,8 +1691,6 @@ while (!list_empty(&tmp)) { pb = list_entry(tmp.next, page_buf_t, pb_list); list_del_init(&pb->pb_list); - pb->pb_flags &= ~PBF_DELWRI; - pb->pb_flags |= PBF_WRITE; pagebuf_iostrategy(pb); } @@ -1720,6 +1721,7 @@ int flush_cnt = 0; pagebuf_runall_queues(pagebuf_dataio_workqueue); + pagebuf_runall_queues(pagebuf_logio_workqueue); spin_lock(&pbd_delwrite_lock); INIT_LIST_HEAD(&tmp); @@ -1742,47 +1744,32 @@ continue; } - if (flags & PBDF_TRYLOCK) { - if (!pagebuf_cond_lock(pb)) { - pincount++; - continue; - } - } - - list_del_init(&pb->pb_list); - if (flags & PBDF_WAIT) { - list_add(&pb->pb_list, &tmp); - pb->pb_flags &= ~PBF_ASYNC; - } - - spin_unlock(&pbd_delwrite_lock); - - if ((flags & PBDF_TRYLOCK) == 0) { - pagebuf_lock(pb); - } - pb->pb_flags &= ~PBF_DELWRI; pb->pb_flags |= PBF_WRITE; + list_move(&pb->pb_list, &tmp); + } + /* ok found all the items that can be worked on + * drop the lock and process the private list */ + spin_unlock(&pbd_delwrite_lock); + + list_for_each_safe(curr, next, &tmp) { + pb = list_entry(curr, page_buf_t, pb_list); + + if (flags & PBDF_WAIT) + pb->pb_flags &= ~PBF_ASYNC; + else + list_del_init(curr); + pagebuf_lock(pb); pagebuf_iostrategy(pb); if (++flush_cnt > 32) { blk_run_queues(); flush_cnt = 0; } - - spin_lock(&pbd_delwrite_lock); } - spin_unlock(&pbd_delwrite_lock); - blk_run_queues(); - if (pinptr) - *pinptr = pincount; - - if ((flags & PBDF_WAIT) == 0) - return; - while (!list_empty(&tmp)) { pb = list_entry(tmp.next, page_buf_t, pb_list); @@ -1792,6 +1779,9 @@ pagebuf_unlock(pb); pagebuf_rele(pb); } + + if (pinptr) + *pinptr = pincount; } STATIC int @@ -1846,14 +1836,18 @@ void *buffer, size_t *lenp) { - int ret; + int c, ret; int *valp = ctl->data; ret = proc_doulongvec_minmax(ctl, write, filp, buffer, lenp); if (!ret && write && *valp) { printk("XFS Clearing pbstats\n"); - memset(&pbstats, 0, sizeof(pbstats)); + for (c = 0; c < NR_CPUS; c++) { + if (!cpu_possible(c)) continue; + memset(&per_cpu(pbstats, c), 0, + sizeof(struct pbstats)); + } pb_params.stats_clear.val = 0; } @@ -1907,13 +1901,17 @@ int *eof, void *data) { - int i, len; + int c, i, len, val; len = 0; len += sprintf(buffer + len, "pagebuf"); - for (i = 0; i < sizeof(pbstats) / sizeof(u_int32_t); i++) { - len += sprintf(buffer + len, " %u", - *(((u_int32_t*)&pbstats) + i)); + for (i = 0; i < sizeof(struct pbstats) / sizeof(u_int32_t); i++) { + val = 0; + for (c = 0 ; c < NR_CPUS; c++) { + if (!cpu_possible(c)) continue; + val += *(((u_int32_t*)&per_cpu(pbstats, c) + i)); + } + len += sprintf(buffer + len, " %u", val); } buffer[len++] = '\n'; diff -Nru a/fs/xfs/pagebuf/page_buf.h b/fs/xfs/pagebuf/page_buf.h --- a/fs/xfs/pagebuf/page_buf.h Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/pagebuf/page_buf.h Wed Oct 8 12:24:57 2003 @@ -136,9 +136,6 @@ #define PBF_NOT_DONE(pb) (((pb)->pb_flags & (PBF_PARTIAL|PBF_NONE)) != 0) #define PBF_DONE(pb) (((pb)->pb_flags & (PBF_PARTIAL|PBF_NONE)) == 0) -#define PBR_SECTOR_ONLY 1 /* only use sector size buffer heads */ -#define PBR_ALIGNED_ONLY 2 /* only use aligned I/O */ - typedef struct pb_target { dev_t pbr_dev; struct block_device *pbr_bdev; @@ -371,7 +368,6 @@ /* Delayed Write Buffer Routines */ #define PBDF_WAIT 0x01 -#define PBDF_TRYLOCK 0x02 extern void pagebuf_delwri_flush( pb_target_t *, unsigned long, diff -Nru a/fs/xfs/pagebuf/page_buf_internal.h b/fs/xfs/pagebuf/page_buf_internal.h --- a/fs/xfs/pagebuf/page_buf_internal.h Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/pagebuf/page_buf_internal.h Wed Oct 8 12:24:56 2003 @@ -37,6 +37,7 @@ #ifndef __PAGE_BUF_PRIVATE_H__ #define __PAGE_BUF_PRIVATE_H__ +#include #include "page_buf.h" #define _PAGE_BUF_INTERNAL_ @@ -120,9 +121,11 @@ u_int32_t pb_get_read; }; -extern struct pbstats pbstats; +DECLARE_PER_CPU(struct pbstats, pbstats); -#define PB_STATS_INC(count) ( count ++ ) +/* We don't disable preempt, not too worried about poking the + * wrong cpu's stat for now */ +#define PB_STATS_INC(count) (__get_cpu_var(pbstats).count++) #ifndef STATIC # define STATIC static diff -Nru a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c --- a/fs/xfs/quota/xfs_dquot.c Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/quota/xfs_dquot.c Wed Oct 8 12:24:56 2003 @@ -87,9 +87,9 @@ STATIC void xfs_qm_dqflush_done(xfs_buf_t *, xfs_dq_logitem_t *); #ifdef DEBUG -dev_t xfs_dqerror_dev = 0; -int xfs_do_dqerror = 0; -int xfs_dqreq_num = 0; +xfs_buftarg_t *xfs_dqerror_target; +int xfs_do_dqerror; +int xfs_dqreq_num; int xfs_dqerror_mod = 33; #endif @@ -911,7 +911,7 @@ #ifdef DEBUG if (xfs_do_dqerror) { - if ((xfs_dqerror_dev == mp->m_dev) && + if ((xfs_dqerror_target == mp->m_ddev_targp) && (xfs_dqreq_num++ % xfs_dqerror_mod) == 0) { cmn_err(CE_DEBUG, "Returning error in dqget"); return (EIO); diff -Nru a/fs/xfs/quota/xfs_qm.h b/fs/xfs/quota/xfs_qm.h --- a/fs/xfs/quota/xfs_qm.h Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/quota/xfs_qm.h Wed Oct 8 12:24:56 2003 @@ -165,9 +165,9 @@ * Users are allowed to have a usage exceeding their softlimit for * a period this long. */ -#define XFS_QM_BTIMELIMIT DQ_BTIMELIMIT -#define XFS_QM_RTBTIMELIMIT DQ_BTIMELIMIT -#define XFS_QM_ITIMELIMIT DQ_FTIMELIMIT +#define XFS_QM_BTIMELIMIT (7 * 24*60*60) /* 1 week */ +#define XFS_QM_RTBTIMELIMIT (7 * 24*60*60) /* 1 week */ +#define XFS_QM_ITIMELIMIT (7 * 24*60*60) /* 1 week */ #define XFS_QM_BWARNLIMIT 5 #define XFS_QM_IWARNLIMIT 5 diff -Nru a/fs/xfs/support/move.c b/fs/xfs/support/move.c --- a/fs/xfs/support/move.c Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/support/move.c Wed Oct 8 12:24:56 2003 @@ -38,57 +38,37 @@ #include "debug.h" #include "move.h" -/* - * Move "n" bytes at byte address "cp"; "rw" indicates the direction - * of the move, and the I/O parameters are provided in "uio", which is - * update to reflect the data which was moved. Returns 0 on success or - * a non-zero errno on failure. +/* Read from kernel buffer at src to user/kernel buffer defined + * by the uio structure. Advance the pointer in the uio struct + * as we go. */ int -uiomove(void *cp, size_t n, enum uio_rw rw, struct uio *uio) +uio_read(caddr_t src, size_t len, struct uio *uio) { - register struct iovec *iov; + struct iovec *iov; u_int cnt; int error; - while (n > 0 && uio->uio_resid) { + if (len > 0 && uio->uio_resid) { iov = uio->uio_iov; cnt = (u_int)iov->iov_len; - if (cnt == 0) { - uio->uio_iov++; - uio->uio_iovcnt--; - continue; - } - if (cnt > n) - cnt = (u_int)n; - switch (uio->uio_segflg) { - case UIO_USERSPACE: - if (rw == UIO_READ) - error = copy_to_user(iov->iov_base, cp, cnt); - else - error = copy_from_user(cp, iov->iov_base, cnt); + if (cnt == 0) + return 0; + if (cnt > len) + cnt = (u_int)len; + if (uio->uio_segflg == UIO_USERSPACE) { + error = copy_to_user(iov->iov_base, src, cnt); if (error) return EFAULT; - break; - - - case UIO_SYSSPACE: - if (rw == UIO_READ) - memcpy(iov->iov_base, cp, cnt); - else - memcpy(cp, iov->iov_base, cnt); - break; - - default: + } else if (uio->uio_segflg == UIO_SYSSPACE) { + memcpy(iov->iov_base, src, cnt); + } else { ASSERT(0); - break; } iov->iov_base = (void *)((char *)iov->iov_base + cnt); iov->iov_len -= cnt; uio->uio_resid -= cnt; uio->uio_offset += cnt; - cp = (void *)((char *)cp + cnt); - n -= cnt; } return 0; } diff -Nru a/fs/xfs/support/move.h b/fs/xfs/support/move.h --- a/fs/xfs/support/move.h Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/support/move.h Wed Oct 8 12:24:56 2003 @@ -48,11 +48,6 @@ } uio_t; /* - * I/O direction. - */ -typedef enum uio_rw { UIO_READ, UIO_WRITE } uio_rw_t; - -/* * Segment flag values. */ typedef enum uio_seg { @@ -60,7 +55,6 @@ UIO_SYSSPACE, /* uio_iov describes system space */ } uio_seg_t; - -extern int uiomove (void *, size_t, uio_rw_t, uio_t *); +extern int uio_read (caddr_t, size_t, uio_t *); #endif /* __XFS_SUPPORT_MOVE_H__ */ diff -Nru a/fs/xfs/xfs_attr_fetch.c b/fs/xfs/xfs_attr_fetch.c --- a/fs/xfs/xfs_attr_fetch.c Wed Oct 8 12:24:57 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2000, 2002 Silicon Graphics, Inc. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, - * Mountain View, CA 94043, or: - * - * http://www.sgi.com - * - * For further information regarding this notice, see: - * - * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ - */ - -#include "xfs.h" - -#include "xfs_macros.h" -#include "xfs_types.h" -#include "xfs_inum.h" -#include "xfs_log.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_ag.h" -#include "xfs_dir.h" -#include "xfs_dir2.h" -#include "xfs_dmapi.h" -#include "xfs_mount.h" -#include "xfs_alloc_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_itable.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" -#include "xfs_alloc.h" -#include "xfs_attr_sf.h" -#include "xfs_dir_sf.h" -#include "xfs_dir2_sf.h" -#include "xfs_dinode.h" -#include "xfs_inode_item.h" -#include "xfs_inode.h" -#include "xfs_bmap.h" -#include "xfs_da_btree.h" -#include "xfs_attr.h" -#include "xfs_attr_leaf.h" - -int -xfs_attr_fetch(xfs_inode_t *ip, char *name, char *value, int valuelen) -{ - xfs_da_args_t args; - int error; - - if (XFS_IFORK_Q(ip) == 0) - return ENOATTR; - /* - * Do the argument setup for the xfs_attr routines. - */ - memset((char *)&args, 0, sizeof(args)); - args.dp = ip; - args.flags = ATTR_ROOT; - args.whichfork = XFS_ATTR_FORK; - args.name = name; - args.namelen = strlen(name); - args.value = value; - args.valuelen = valuelen; - args.hashval = xfs_da_hashname(args.name, args.namelen); - args.oknoent = 1; - - /* - * Decide on what work routines to call based on the inode size. - */ - if (args.dp->i_d.di_aformat == XFS_DINODE_FMT_LOCAL) - error = xfs_attr_shortform_getvalue(&args); - else if (xfs_bmap_one_block(args.dp, XFS_ATTR_FORK)) - error = xfs_attr_leaf_get(&args); - else - error = xfs_attr_node_get(&args); - - if (error == EEXIST) - error = 0; - - return(error); -} diff -Nru a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c --- a/fs/xfs/xfs_bmap.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_bmap.c Wed Oct 8 12:24:57 2003 @@ -5553,7 +5553,7 @@ && DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_READ) && whichfork == XFS_DATA_FORK) { - error = XFS_SEND_DATA(mp, DM_EVENT_READ, bdp, 0, 0, 0, NULL); + error = XFS_SEND_DATA(mp, DM_EVENT_READ, vp, 0, 0, 0, NULL); if (error) return XFS_ERROR(error); } diff -Nru a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h --- a/fs/xfs/xfs_buf.h Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_buf.h Wed Oct 8 12:24:57 2003 @@ -194,7 +194,10 @@ (bp)->pb_target = (target) #define XFS_BUF_TARGET(bp) ((bp)->pb_target) -#define XFS_BUF_TARGET_DEV(bp) ((bp)->pb_target->pbr_dev) + +#define XFS_BUFTARG_NAME(target) \ + ({ char __b[BDEVNAME_SIZE]; bdevname((target->pbr_bdev), __b); __b; }) + #define XFS_BUF_SET_VTYPE_REF(bp, type, ref) #define XFS_BUF_SET_VTYPE(bp, type) #define XFS_BUF_SET_REF(bp, ref) diff -Nru a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c --- a/fs/xfs/xfs_buf_item.c Wed Oct 8 12:24:55 2003 +++ b/fs/xfs/xfs_buf_item.c Wed Oct 8 12:24:55 2003 @@ -1007,7 +1007,7 @@ { xfs_log_item_t *lip; static ulong lasttime; - static dev_t lastdev; + static xfs_buftarg_t *lasttarg; xfs_mount_t *mp; ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); @@ -1045,15 +1045,15 @@ return; } - if ((XFS_BUF_TARGET_DEV(bp) != lastdev) || + if ((XFS_BUF_TARGET(bp) != lasttarg) || (time_after(jiffies, (lasttime + 5*HZ)))) { lasttime = jiffies; prdev("XFS write error in file system meta-data " "block 0x%Lx in %s", - XFS_BUF_TARGET_DEV(bp), + XFS_BUF_TARGET(bp), XFS_BUF_ADDR(bp), mp->m_fsname); } - lastdev = XFS_BUF_TARGET_DEV(bp); + lasttarg = XFS_BUF_TARGET(bp); if (XFS_BUF_ISASYNC(bp)) { /* diff -Nru a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c --- a/fs/xfs/xfs_da_btree.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_da_btree.c Wed Oct 8 12:24:57 2003 @@ -2450,7 +2450,7 @@ dabuf->dirty = 0; #ifdef XFS_DABUF_DEBUG dabuf->ra = ra; - dabuf->dev = XFS_BUF_TARGET_DEV(bps[0]); + dabuf->target = XFS_BUF_TARGET(bps[0]); dabuf->blkno = XFS_BUF_ADDR(bps[0]); #endif if (nbuf == 1) { @@ -2480,7 +2480,7 @@ s = mutex_spinlock(&xfs_dabuf_global_lock); for (p = xfs_dabuf_global_list; p; p = p->next) { ASSERT(p->blkno != dabuf->blkno || - p->dev != dabuf->dev); + p->target != dabuf->target); } dabuf->prev = NULL; if (xfs_dabuf_global_list) diff -Nru a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h --- a/fs/xfs/xfs_da_btree.h Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/xfs_da_btree.h Wed Oct 8 12:24:56 2003 @@ -212,7 +212,7 @@ inst_t *ra; /* return address of caller to make */ struct xfs_dabuf *next; /* next in global chain */ struct xfs_dabuf *prev; /* previous in global chain */ - dev_t dev; /* device for buffer */ + struct xfs_buftarg *target; /* device for buffer */ xfs_daddr_t blkno; /* daddr first in bps[0] */ #endif struct xfs_buf *bps[1]; /* actually nbuf of these */ diff -Nru a/fs/xfs/xfs_dinode.h b/fs/xfs/xfs_dinode.h --- a/fs/xfs/xfs_dinode.h Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_dinode.h Wed Oct 8 12:24:57 2003 @@ -439,25 +439,21 @@ /* * File types (mode field) */ -#define IFMT 0170000 /* type of file */ -#define IFIFO 0010000 /* named pipe (fifo) */ -#define IFCHR 0020000 /* character special */ -#define IFDIR 0040000 /* directory */ -#define IFBLK 0060000 /* block special */ -#define IFREG 0100000 /* regular */ -#define IFLNK 0120000 /* symbolic link */ -#define IFSOCK 0140000 /* socket */ -#define IFMNT 0160000 /* mount point */ +#define IFMT S_IFMT +#define IFSOCK S_IFSOCK +#define IFLNK S_IFLNK +#define IFREG S_IFREG +#define IFBLK S_IFBLK +#define IFDIR S_IFDIR +#define IFCHR S_IFCHR +#define IFIFO S_IFIFO -/* - * File execution and access modes. - */ -#define ISUID 04000 /* set user id on execution */ -#define ISGID 02000 /* set group id on execution */ -#define ISVTX 01000 /* sticky directory */ -#define IREAD 0400 /* read, write, execute permissions */ -#define IWRITE 0200 -#define IEXEC 0100 +#define ISUID S_ISUID +#define ISGID S_ISGID +#define ISVTX S_ISVTX +#define IREAD S_IRUSR +#define IWRITE S_IWUSR +#define IEXEC S_IXUSR #if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BUF_TO_DINODE) xfs_dinode_t *xfs_buf_to_dinode(struct xfs_buf *bp); diff -Nru a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c --- a/fs/xfs/xfs_dir2.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_dir2.c Wed Oct 8 12:24:57 2003 @@ -773,7 +773,7 @@ idbp->d_off = pa->cook; idbp->d_name[namelen] = '\0'; memcpy(idbp->d_name, pa->name, namelen); - rval = uiomove((caddr_t)idbp, reclen, UIO_READ, uio); + rval = uio_read((caddr_t)idbp, reclen, uio); pa->done = (rval == 0); return rval; } diff -Nru a/fs/xfs/xfs_dir_leaf.c b/fs/xfs/xfs_dir_leaf.c --- a/fs/xfs/xfs_dir_leaf.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_dir_leaf.c Wed Oct 8 12:24:57 2003 @@ -2225,7 +2225,7 @@ idbp->d_off = pa->cook.o; idbp->d_name[namelen] = '\0'; memcpy(idbp->d_name, pa->name, namelen); - retval = uiomove((caddr_t)idbp, reclen, UIO_READ, uio); + retval = uio_read((caddr_t)idbp, reclen, uio); pa->done = (retval == 0); return retval; } diff -Nru a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c --- a/fs/xfs/xfs_error.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_error.c Wed Oct 8 12:24:57 2003 @@ -329,6 +329,7 @@ int linenum, inst_t *ra) { - xfs_hex_dump(p, 16); + if (level <= xfs_error_level) + xfs_hex_dump(p, 16); xfs_error_report(tag, level, mp, fname, linenum, ra); } diff -Nru a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h --- a/fs/xfs/xfs_error.h Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_error.h Wed Oct 8 12:24:57 2003 @@ -32,8 +32,8 @@ #ifndef __XFS_ERROR_H__ #define __XFS_ERROR_H__ -#define prdev(fmt,dev,args...) \ - printk("XFS: device %u:%u- " fmt "\n", MAJOR(dev), MINOR(dev), ## args) +#define prdev(fmt,targ,args...) \ + printk("XFS: device %s- " fmt "\n", XFS_BUFTARG_NAME(targ), ## args) #define XFS_ERECOVER 1 /* Failure to recover log */ #define XFS_ELOGSTAT 2 /* Failure to stat log in user space */ diff -Nru a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h --- a/fs/xfs/xfs_fs.h Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/xfs_fs.h Wed Oct 8 12:24:56 2003 @@ -392,22 +392,17 @@ } xfs_fsop_attrmulti_handlereq_t; /* - * File system identifier. Should be unique (at least per machine). + * per machine unique filesystem identifier types. */ -typedef struct { - __u32 val[2]; /* file system id type */ -} xfs_fsid_t; +typedef struct { __u32 val[2]; } xfs_fsid_t; /* file system id type */ + -/* - * File identifier. Should be unique per filesystem on a single machine. - * This is typically called by a stateless file server in order to generate - * "file handles". - */ #ifndef HAVE_FID #define MAXFIDSZ 46 + typedef struct fid { __u16 fid_len; /* length of data in bytes */ - unsigned char fid_data[MAXFIDSZ]; /* data (variable length) */ + unsigned char fid_data[MAXFIDSZ]; /* data (fid_len worth) */ } fid_t; #endif diff -Nru a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c --- a/fs/xfs/xfs_inode.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_inode.c Wed Oct 8 12:24:57 2003 @@ -408,8 +408,9 @@ if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { #ifdef DEBUG - prdev("bad inode magic/vsn daddr 0x%llx #%d (magic=%x)", - mp->m_dev, (unsigned long long)imap.im_blkno, i, + prdev("bad inode magic/vsn daddr %lld #%d (magic=%x)", + mp->m_ddev_targp, + (unsigned long long)imap.im_blkno, i, INT_GET(dip->di_core.di_magic, ARCH_CONVERT)); #endif XFS_CORRUPTION_ERROR("xfs_itobp", XFS_ERRLEVEL_HIGH, diff -Nru a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c --- a/fs/xfs/xfs_log.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_log.c Wed Oct 8 12:24:57 2003 @@ -65,7 +65,7 @@ STATIC int xlog_commit_record(xfs_mount_t *mp, xlog_ticket_t *ticket, xlog_in_core_t **, xfs_lsn_t *); STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, - dev_t log_dev, + xfs_buftarg_t *log_target, xfs_daddr_t blk_offset, int num_bblks); STATIC int xlog_space_left(xlog_t *log, int cycle, int bytes); @@ -155,7 +155,7 @@ */ #if defined(XLOG_NOLOG) || defined(DEBUG) int xlog_debug = 1; -dev_t xlog_devt = 0; +xfs_buftarg_t *xlog_target; #endif #if defined(XFS_LOG_TRACE) @@ -274,7 +274,7 @@ xfs_lsn_t lsn = 0; #if defined(DEBUG) || defined(XLOG_NOLOG) - if (! xlog_debug && xlog_devt == log->l_dev) + if (!xlog_debug && xlog_target == log->l_targ) return 0; #endif @@ -339,7 +339,7 @@ xlog_t *log = mp->m_log; #if defined(DEBUG) || defined(XLOG_NOLOG) - if (! xlog_debug && xlog_devt == log->l_dev) + if (!xlog_debug && xlog_target == log->l_targ) return 0; #endif @@ -378,7 +378,7 @@ int abortflg, spl; #if defined(DEBUG) || defined(XLOG_NOLOG) - if (! xlog_debug && xlog_devt == log->l_dev) + if (!xlog_debug && xlog_target == log->l_targ) return 0; #endif cb->cb_next = 0; @@ -436,7 +436,7 @@ int retval; #if defined(DEBUG) || defined(XLOG_NOLOG) - if (! xlog_debug && xlog_devt == log->l_dev) + if (!xlog_debug && xlog_target == log->l_targ) return 0; #endif retval = 0; @@ -472,7 +472,7 @@ * Mount a log filesystem * * mp - ubiquitous xfs mount point structure - * log_dev - device number of on-disk log device + * log_target - buftarg of on-disk log device * blk_offset - Start block # where block size is 512 bytes (BBSIZE) * num_bblocks - Number of BBSIZE blocks in on-disk log * @@ -480,7 +480,7 @@ */ int xfs_log_mount(xfs_mount_t *mp, - dev_t log_dev, + xfs_buftarg_t *log_target, xfs_daddr_t blk_offset, int num_bblks) { @@ -493,12 +493,11 @@ ASSERT(XFS_MTOVFS(mp)->vfs_flag & VFS_RDONLY); } - mp->m_log = xlog_alloc_log(mp, log_dev, blk_offset, num_bblks); + mp->m_log = xlog_alloc_log(mp, log_target, blk_offset, num_bblks); #if defined(DEBUG) || defined(XLOG_NOLOG) - if (! xlog_debug) { - cmn_err(CE_NOTE, "log dev: %u:%u", - MAJOR(log_dev), MINOR(log_dev)); + if (!xlog_debug) { + cmn_err(CE_NOTE, "log dev: %s", XFS_BUFTARG_NAME(log_target)); return 0; } #endif @@ -606,7 +605,7 @@ } magic = { XLOG_UNMOUNT_TYPE, 0, 0 }; #if defined(DEBUG) || defined(XLOG_NOLOG) - if (! xlog_debug && xlog_devt == log->l_dev) + if (!xlog_debug && xlog_target == log->l_targ) return 0; #endif @@ -734,9 +733,9 @@ { int error; xlog_t *log = mp->m_log; -#if defined(DEBUG) || defined(XLOG_NOLOG) - if (! xlog_debug && xlog_devt == log->l_dev) { +#if defined(DEBUG) || defined(XLOG_NOLOG) + if (!xlog_debug && xlog_target == log->l_targ) { *start_lsn = 0; return 0; } @@ -761,7 +760,7 @@ SPLDECL(s); #if defined(DEBUG) || defined(XLOG_NOLOG) - if (!xlog_debug && xlog_devt == log->l_dev) + if (!xlog_debug && xlog_target == log->l_targ) return; #endif /* XXXsup tmp */ @@ -1059,14 +1058,14 @@ /* * When logbufs == 0, someone has disabled the log from the FSTAB * file. This is not a documented feature. We need to set xlog_debug - * to zero (this deactivates the log) and set xlog_devt to the + * to zero (this deactivates the log) and set xlog_target to the * appropriate dev_t. Only one filesystem may be affected as such * since this is just a performance hack to test what we might be able * to get if the log were not present. */ if (mp->m_logbufs == 0) { xlog_debug = 0; - xlog_devt = log->l_dev; + xlog_target = log->l_targ; log->l_iclog_bufs = XLOG_MIN_ICLOGS; } else #endif @@ -1089,8 +1088,8 @@ #if defined(DEBUG) || defined(XLOG_NOLOG) /* We are reactivating a filesystem after it was active */ - if (log->l_dev == xlog_devt) { - xlog_devt = 1; + if (log->l_targ == xlog_target) { + xlog_target = 1; /* XXX(hch): WTF? */ xlog_debug = 1; } #endif @@ -1176,7 +1175,7 @@ */ STATIC xlog_t * xlog_alloc_log(xfs_mount_t *mp, - dev_t log_dev, + xfs_buftarg_t *log_target, xfs_daddr_t blk_offset, int num_bblks) { @@ -1191,7 +1190,7 @@ log = (xlog_t *)kmem_zalloc(sizeof(xlog_t), KM_SLEEP); log->l_mp = mp; - log->l_dev = log_dev; + log->l_targ = log_target; log->l_logsize = BBTOB(num_bblks); log->l_logBBstart = blk_offset; log->l_logBBsize = num_bblks; diff -Nru a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h --- a/fs/xfs/xfs_log.h Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_log.h Wed Oct 8 12:24:57 2003 @@ -153,10 +153,10 @@ int xfs_log_force(struct xfs_mount *mp, xfs_lsn_t lsn, uint flags); -int xfs_log_mount(struct xfs_mount *mp, - dev_t log_dev, - xfs_daddr_t start_block, - int num_bblocks); +int xfs_log_mount(struct xfs_mount *mp, + struct xfs_buftarg *log_target, + xfs_daddr_t start_block, + int num_bblocks); int xfs_log_mount_finish(struct xfs_mount *mp, int); void xfs_log_move_tail(struct xfs_mount *mp, xfs_lsn_t tail_lsn); diff -Nru a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h --- a/fs/xfs/xfs_log_priv.h Wed Oct 8 12:24:55 2003 +++ b/fs/xfs/xfs_log_priv.h Wed Oct 8 12:24:55 2003 @@ -504,7 +504,7 @@ struct xfs_mount *l_mp; /* mount point */ struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ - dev_t l_dev; /* dev_t of log */ + struct xfs_buftarg *l_targ; /* buftarg of log */ xfs_daddr_t l_logBBstart; /* start block of log */ int l_logsize; /* size of log in bytes */ int l_logBBsize; /* size of log in BB chunks */ diff -Nru a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c --- a/fs/xfs/xfs_log_recover.c Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/xfs_log_recover.c Wed Oct 8 12:24:56 2003 @@ -2179,8 +2179,8 @@ break; default: xfs_fs_cmn_err(CE_ALERT, log->l_mp, - "xfs_log_recover: unknown buffer type 0x%x, dev %u:%u", - buf_f->blf_type, MAJOR(log->l_dev), MINOR(log->l_dev)); + "xfs_log_recover: unknown buffer type 0x%x, dev %s", + buf_f->blf_type, XFS_BUFTARG_NAME(log->l_targ)); XFS_ERROR_REPORT("xlog_recover_do_buffer_trans", XFS_ERRLEVEL_LOW, log->l_mp); return XFS_ERROR(EFSCORRUPTED); @@ -3889,9 +3889,8 @@ } cmn_err(CE_NOTE, - "Starting XFS recovery on filesystem: %s (dev: %d/%d)", - log->l_mp->m_fsname, MAJOR(log->l_dev), - MINOR(log->l_dev)); + "Starting XFS recovery on filesystem: %s (dev: %s)", + log->l_mp->m_fsname, XFS_BUFTARG_NAME(log->l_targ)); error = xlog_do_recover(log, head_blk, tail_blk); log->l_flags |= XLOG_RECOVERY_NEEDED; @@ -3939,10 +3938,8 @@ xlog_recover_check_summary(log); cmn_err(CE_NOTE, - "Ending XFS recovery on filesystem: %s (dev: %d/%d)", - log->l_mp->m_fsname, MAJOR(log->l_dev), - MINOR(log->l_dev)); - + "Ending XFS recovery on filesystem: %s (dev: %s)", + log->l_mp->m_fsname, XFS_BUFTARG_NAME(log->l_targ)); log->l_flags &= ~XLOG_RECOVERY_NEEDED; } else { cmn_err(CE_DEBUG, diff -Nru a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c --- a/fs/xfs/xfs_mount.c Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/xfs_mount.c Wed Oct 8 12:24:56 2003 @@ -285,9 +285,9 @@ #if !XFS_BIG_BLKNOS if (unlikely( (sbp->sb_dblocks << (__uint64_t)(sbp->sb_blocklog - BBSHIFT)) - > INT_MAX || + > UINT_MAX || (sbp->sb_rblocks << (__uint64_t)(sbp->sb_blocklog - BBSHIFT)) - > INT_MAX)) { + > UINT_MAX)) { cmn_err(CE_WARN, "XFS: File system is too large to be mounted on this system."); return XFS_ERROR(E2BIG); @@ -949,7 +949,7 @@ * log's mount-time initialization. Perform 1st part recovery if needed */ if (likely(sbp->sb_logblocks > 0)) { /* check for volume case */ - error = xfs_log_mount(mp, mp->m_logdev_targp->pbr_dev, + error = xfs_log_mount(mp, mp->m_logdev_targp, XFS_FSB_TO_DADDR(mp, sbp->sb_logstart), XFS_FSB_TO_BB(mp, sbp->sb_logblocks)); if (error) { @@ -980,7 +980,7 @@ if (unlikely((rip->i_d.di_mode & IFMT) != IFDIR)) { cmn_err(CE_WARN, "XFS: corrupted root inode"); prdev("Root inode %llu is not a directory", - mp->m_dev, (unsigned long long)rip->i_ino); + mp->m_ddev_targp, (unsigned long long)rip->i_ino); xfs_iunlock(rip, XFS_ILOCK_EXCL); XFS_ERROR_REPORT("xfs_mountfs_int(2)", XFS_ERRLEVEL_LOW, mp); diff -Nru a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h --- a/fs/xfs/xfs_mount.h Wed Oct 8 12:24:55 2003 +++ b/fs/xfs/xfs_mount.h Wed Oct 8 12:24:55 2003 @@ -91,10 +91,10 @@ * Prototypes and functions for the Data Migration subsystem. */ -typedef int (*xfs_send_data_t)(int, struct bhv_desc *, +typedef int (*xfs_send_data_t)(int, struct vnode *, xfs_off_t, size_t, int, vrwlock_t *); typedef int (*xfs_send_mmap_t)(struct vm_area_struct *, uint); -typedef int (*xfs_send_destroy_t)(struct bhv_desc *, dm_right_t); +typedef int (*xfs_send_destroy_t)(struct vnode *, dm_right_t); typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct vnode *, dm_right_t, struct vnode *, dm_right_t, char *, char *, mode_t, int, int); @@ -109,12 +109,12 @@ xfs_send_unmount_t xfs_send_unmount; } xfs_dmops_t; -#define XFS_SEND_DATA(mp, ev,bdp,off,len,fl,lock) \ - (*(mp)->m_dm_ops.xfs_send_data)(ev,bdp,off,len,fl,lock) +#define XFS_SEND_DATA(mp, ev,vp,off,len,fl,lock) \ + (*(mp)->m_dm_ops.xfs_send_data)(ev,vp,off,len,fl,lock) #define XFS_SEND_MMAP(mp, vma,fl) \ (*(mp)->m_dm_ops.xfs_send_mmap)(vma,fl) -#define XFS_SEND_DESTROY(mp, bdp,right) \ - (*(mp)->m_dm_ops.xfs_send_destroy)(bdp,right) +#define XFS_SEND_DESTROY(mp, vp,right) \ + (*(mp)->m_dm_ops.xfs_send_destroy)(vp,right) #define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ (*(mp)->m_dm_ops.xfs_send_namesp)(ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) #define XFS_SEND_UNMOUNT(mp, vfsp,vp,right,mode,rval,fl) \ diff -Nru a/fs/xfs/xfs_rw.c b/fs/xfs/xfs_rw.c --- a/fs/xfs/xfs_rw.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_rw.c Wed Oct 8 12:24:57 2003 @@ -260,11 +260,10 @@ xfs_daddr_t blkno) { cmn_err(CE_ALERT, - "I/O error in filesystem (\"%s\") meta-data dev %u:%u block 0x%llx" + "I/O error in filesystem (\"%s\") meta-data dev %s block 0x%llx" " (\"%s\") error %d buf count %u", (!mp || !mp->m_fsname) ? "(fs name not set)" : mp->m_fsname, - MAJOR(XFS_BUF_TARGET_DEV(bp)), - MINOR(XFS_BUF_TARGET_DEV(bp)), + XFS_BUFTARG_NAME(bp->pb_target), (__uint64_t)blkno, func, XFS_BUF_GETERROR(bp), diff -Nru a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h --- a/fs/xfs/xfs_trans.h Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_trans.h Wed Oct 8 12:24:57 2003 @@ -995,7 +995,6 @@ void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); int xfs_trans_iget(struct xfs_mount *, xfs_trans_t *, xfs_ino_t , uint, struct xfs_inode **); -void xfs_trans_iput(xfs_trans_t *, struct xfs_inode *, uint); void xfs_trans_ijoin(xfs_trans_t *, struct xfs_inode *, uint); void xfs_trans_ihold(xfs_trans_t *, struct xfs_inode *); void xfs_trans_ihold_release(xfs_trans_t *, struct xfs_inode *); diff -Nru a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c --- a/fs/xfs/xfs_trans_buf.c Wed Oct 8 12:24:55 2003 +++ b/fs/xfs/xfs_trans_buf.c Wed Oct 8 12:24:55 2003 @@ -264,7 +264,7 @@ } #ifdef DEBUG -dev_t xfs_error_dev = 0; +xfs_buftarg_t *xfs_error_target; int xfs_do_error; int xfs_req_num; int xfs_error_mod = 33; @@ -322,7 +322,7 @@ } #ifdef DEBUG if (xfs_do_error && (bp != NULL)) { - if (xfs_error_dev == target->pbr_dev) { + if (xfs_error_target == target) { if (((xfs_req_num++) % xfs_error_mod) == 0) { xfs_buf_relse(bp); printk("Returning error!\n"); @@ -425,7 +425,7 @@ } #ifdef DEBUG if (xfs_do_error && !(tp->t_flags & XFS_TRANS_DIRTY)) { - if (xfs_error_dev == target->pbr_dev) { + if (xfs_error_target == target) { if (((xfs_req_num++) % xfs_error_mod) == 0) { xfs_force_shutdown(tp->t_mountp, XFS_METADATA_IO_ERROR); diff -Nru a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c --- a/fs/xfs/xfs_trans_inode.c Wed Oct 8 12:24:55 2003 +++ b/fs/xfs/xfs_trans_inode.c Wed Oct 8 12:24:55 2003 @@ -188,106 +188,6 @@ /* - * Release the inode ip which was previously acquired with xfs_trans_iget() - * or added with xfs_trans_ijoin(). This will decrement the lock - * recursion count of the inode item. If the count goes to less than 0, - * the inode will be unlocked and disassociated from the transaction. - * - * If the inode has been modified within the transaction, it will not be - * unlocked until the transaction commits. - */ -void -xfs_trans_iput( - xfs_trans_t *tp, - xfs_inode_t *ip, - uint lock_flags) -{ - xfs_inode_log_item_t *iip; - xfs_log_item_desc_t *lidp; - - /* - * If the transaction pointer is NULL, just call xfs_iput(). - */ - if (tp == NULL) { - xfs_iput(ip, lock_flags); - } - - ASSERT(ip->i_transp == tp); - iip = ip->i_itemp; - ASSERT(iip != NULL); - - /* - * Find the item descriptor pointing to this inode's - * log item. It must be there. - */ - lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)iip); - ASSERT(lidp != NULL); - ASSERT(lidp->lid_item == (xfs_log_item_t*)iip); - - /* - * Be consistent about the bookkeeping for the inode's - * io lock, but it doesn't mean much really. - */ - ASSERT((iip->ili_flags & XFS_ILI_IOLOCKED_ANY) != XFS_ILI_IOLOCKED_ANY); - if (lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED)) { - ASSERT(iip->ili_flags & XFS_ILI_IOLOCKED_ANY); - ASSERT((!(lock_flags & XFS_IOLOCK_EXCL)) || - (iip->ili_flags & XFS_ILI_IOLOCKED_EXCL)); - ASSERT((!(lock_flags & XFS_IOLOCK_SHARED)) || - (iip->ili_flags & - (XFS_ILI_IOLOCKED_EXCL | XFS_ILI_IOLOCKED_SHARED))); - if (iip->ili_iolock_recur > 0) { - iip->ili_iolock_recur--; - } - } - - /* - * If the release is just for a recursive lock on the inode lock, - * then decrement the count and return. We can assert that - * the caller is dropping an EXCL lock on the inode, because - * inode must be locked EXCL within transactions. - */ - ASSERT(lock_flags & XFS_ILOCK_EXCL); - if (iip->ili_ilock_recur > 0) { - iip->ili_ilock_recur--; - return; - } - ASSERT(iip->ili_iolock_recur == 0); - - /* - * If the inode was dirtied within this transaction, it cannot - * be released until the transaction commits. - */ - if (lidp->lid_flags & XFS_LID_DIRTY) { - return; - } - - xfs_trans_free_item(tp, lidp); - - /* - * Clear the hold and iolocked flags in the inode log item. - * We wouldn't want the next user of the inode to - * get confused. Assert that if the iolocked flag is set - * in the item then we are unlocking it in the call to xfs_iput() - * below. - */ - ASSERT((!(iip->ili_flags & XFS_ILI_IOLOCKED_ANY)) || - (lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED))); - if (iip->ili_flags & (XFS_ILI_HOLD | XFS_ILI_IOLOCKED_ANY)) { - iip->ili_flags &= ~(XFS_ILI_HOLD | XFS_ILI_IOLOCKED_ANY); - } - - /* - * Unlike xfs_brelse() the inode log item cannot be - * freed, because it is embedded within the inode. - * All we have to do is release the inode. - */ - xfs_iput(ip, lock_flags); - return; -} - - -/* * Add the locked inode to the transaction. * The inode must be locked, and it cannot be associated with any * transaction. The caller must specify the locks already held diff -Nru a/fs/xfs/xfs_types.h b/fs/xfs/xfs_types.h --- a/fs/xfs/xfs_types.h Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/xfs_types.h Wed Oct 8 12:24:56 2003 @@ -83,7 +83,7 @@ * XFS_BIG_INUMS needs the VFS inode number to be 64 bits, as well * as requiring XFS_BIG_BLKNOS to be set. */ -#if defined(CONFIG_LBD) || (defined(HAVE_SECTOR_T) && (BITS_PER_LONG == 64)) +#if defined(CONFIG_LBD) || (BITS_PER_LONG == 64) # define XFS_BIG_BLKNOS 1 # if BITS_PER_LONG == 64 # define XFS_BIG_INUMS 1 diff -Nru a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c --- a/fs/xfs/xfs_vfsops.c Wed Oct 8 12:24:56 2003 +++ b/fs/xfs/xfs_vfsops.c Wed Oct 8 12:24:56 2003 @@ -1776,7 +1776,6 @@ }; struct proc_xfs_info *xfs_infop; struct xfs_mount *mp = XFS_BHVTOM(bhv); - char b[BDEVNAME_SIZE]; for (xfs_infop = xfs_info; xfs_infop->flag; xfs_infop++) { if (mp->m_flags & xfs_infop->flag) @@ -1792,14 +1791,13 @@ if (mp->m_logbsize > 0) seq_printf(m, "," MNTOPT_LOGBSIZE "=%d", mp->m_logbsize); - if (mp->m_ddev_targp->pbr_dev != mp->m_logdev_targp->pbr_dev) + if (mp->m_ddev_targp != mp->m_logdev_targp) seq_printf(m, "," MNTOPT_LOGDEV "=%s", - bdevname(mp->m_logdev_targp->pbr_bdev, b)); + XFS_BUFTARG_NAME(mp->m_logdev_targp)); - if (mp->m_rtdev_targp && - mp->m_ddev_targp->pbr_dev != mp->m_rtdev_targp->pbr_dev) + if (mp->m_rtdev_targp && mp->m_ddev_targp != mp->m_rtdev_targp) seq_printf(m, "," MNTOPT_RTDEV "=%s", - bdevname(mp->m_rtdev_targp->pbr_bdev, b)); + XFS_BUFTARG_NAME(mp->m_rtdev_targp)); if (mp->m_dalign > 0) seq_printf(m, "," MNTOPT_SUNIT "=%d", diff -Nru a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c --- a/fs/xfs/xfs_vnodeops.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfs_vnodeops.c Wed Oct 8 12:24:57 2003 @@ -144,14 +144,11 @@ xfs_ilock(ip, XFS_ILOCK_SHARED); vap->va_size = ip->i_d.di_size; - if (vap->va_mask == XFS_AT_SIZE) { - if (!(flags & ATTR_LAZY)) - xfs_iunlock(ip, XFS_ILOCK_SHARED); - return 0; - } + if (vap->va_mask == XFS_AT_SIZE) + goto all_done; + vap->va_nblocks = XFS_FSB_TO_BB(mp, ip->i_d.di_nblocks + ip->i_delayed_blks); - vap->va_fsid = mp->m_dev; vap->va_nodeid = ip->i_ino; #if XFS_BIG_INUMS vap->va_nodeid += mp->m_inoadd; @@ -163,11 +160,8 @@ */ if ((vap->va_mask & ~(XFS_AT_SIZE|XFS_AT_FSID|XFS_AT_NODEID| - XFS_AT_NLINK|XFS_AT_BLKSIZE)) == 0) { - if (!(flags & ATTR_LAZY)) - xfs_iunlock(ip, XFS_ILOCK_SHARED); - return 0; - } + XFS_AT_NLINK|XFS_AT_BLKSIZE)) == 0) + goto all_done; /* * Copy from in-core inode. @@ -194,7 +188,7 @@ * stripe size through is not a good * idea for now. */ - vap->va_blksize = mp->m_swidth ? + vap->va_blocksize = mp->m_swidth ? /* * If the underlying volume is a stripe, then * return the stripe width in bytes as the @@ -211,7 +205,7 @@ mp->m_writeio_log)); #else - vap->va_blksize = + vap->va_blocksize = /* * Return the largest of the preferred buffer * sizes since doing small I/Os into larger @@ -229,13 +223,13 @@ * realtime extent size or the realtime volume's * extent size. */ - vap->va_blksize = ip->i_d.di_extsize ? + vap->va_blocksize = ip->i_d.di_extsize ? (ip->i_d.di_extsize << mp->m_sb.sb_blocklog) : (mp->m_sb.sb_rextsize << mp->m_sb.sb_blocklog); } } else { vap->va_rdev = ip->i_df.if_u2.if_rdev; - vap->va_blksize = BLKDEV_IOSIZE; + vap->va_blocksize = BLKDEV_IOSIZE; } vap->va_atime.tv_sec = ip->i_d.di_atime.t_sec; @@ -251,46 +245,53 @@ */ if ((vap->va_mask & (XFS_AT_XFLAGS|XFS_AT_EXTSIZE|XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS| - XFS_AT_GENCOUNT|XFS_AT_VCODE)) == 0) { - if (!(flags & ATTR_LAZY)) - xfs_iunlock(ip, XFS_ILOCK_SHARED); - return 0; - } + XFS_AT_GENCOUNT|XFS_AT_VCODE)) == 0) + goto all_done; + /* * convert di_flags to xflags */ - vap->va_xflags = - ((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) ? - XFS_XFLAG_REALTIME : 0) | - ((ip->i_d.di_flags & XFS_DIFLAG_PREALLOC) ? - XFS_XFLAG_PREALLOC : 0) | - ((ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE) ? - XFS_XFLAG_IMMUTABLE : 0) | - ((ip->i_d.di_flags & XFS_DIFLAG_APPEND) ? - XFS_XFLAG_APPEND : 0) | - ((ip->i_d.di_flags & XFS_DIFLAG_SYNC) ? - XFS_XFLAG_SYNC : 0) | - ((ip->i_d.di_flags & XFS_DIFLAG_NOATIME) ? - XFS_XFLAG_NOATIME : 0) | - ((ip->i_d.di_flags & XFS_DIFLAG_NODUMP) ? - XFS_XFLAG_NODUMP: 0) | - (XFS_IFORK_Q(ip) ? - XFS_XFLAG_HASATTR : 0); + vap->va_xflags = 0; + if (ip->i_d.di_flags & XFS_DIFLAG_REALTIME) + vap->va_xflags |= XFS_XFLAG_REALTIME; + if (ip->i_d.di_flags & XFS_DIFLAG_PREALLOC) + vap->va_xflags |= XFS_XFLAG_PREALLOC; + if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE) + vap->va_xflags |= XFS_XFLAG_IMMUTABLE; + if (ip->i_d.di_flags & XFS_DIFLAG_APPEND) + vap->va_xflags |= XFS_XFLAG_APPEND; + if (ip->i_d.di_flags & XFS_DIFLAG_SYNC) + vap->va_xflags |= XFS_XFLAG_SYNC; + if (ip->i_d.di_flags & XFS_DIFLAG_NOATIME) + vap->va_xflags |= XFS_XFLAG_NOATIME; + if (ip->i_d.di_flags & XFS_DIFLAG_NODUMP) + vap->va_xflags |= XFS_XFLAG_NODUMP; + if (XFS_IFORK_Q(ip)) + vap->va_xflags |= XFS_XFLAG_HASATTR; + /* + * Exit for inode revalidate. See if any of the rest of + * the fields to be filled in are needed. + */ + if ((vap->va_mask & + (XFS_AT_EXTSIZE|XFS_AT_NEXTENTS|XFS_AT_ANEXTENTS| + XFS_AT_GENCOUNT|XFS_AT_VCODE)) == 0) + goto all_done; + vap->va_extsize = ip->i_d.di_extsize << mp->m_sb.sb_blocklog; vap->va_nextents = (ip->i_df.if_flags & XFS_IFEXTENTS) ? ip->i_df.if_bytes / sizeof(xfs_bmbt_rec_t) : ip->i_d.di_nextents; - if (ip->i_afp != NULL) + if (ip->i_afp) vap->va_anextents = (ip->i_afp->if_flags & XFS_IFEXTENTS) ? ip->i_afp->if_bytes / sizeof(xfs_bmbt_rec_t) : ip->i_d.di_anextents; else vap->va_anextents = 0; - vap->va_gencount = ip->i_d.di_gen; - vap->va_vcode = 0L; + vap->va_gen = ip->i_d.di_gen; + all_done: if (!(flags & ATTR_LAZY)) xfs_iunlock(ip, XFS_ILOCK_SHARED); return 0; @@ -415,7 +416,7 @@ } else { if (DM_EVENT_ENABLED (vp->v_vfsp, ip, DM_EVENT_TRUNCATE) && !(flags & ATTR_DMI)) { - code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, bdp, + code = XFS_SEND_DATA(mp, DM_EVENT_TRUNCATE, vp, vap->va_size, 0, AT_DELAY_FLAG(flags), NULL); if (code) { lock_flags = 0; @@ -1042,7 +1043,7 @@ pathlen = (int)ip->i_d.di_size; if (ip->i_df.if_flags & XFS_IFINLINE) { - error = uiomove(ip->i_df.if_u1.if_data, pathlen, UIO_READ, uiop); + error = uio_read(ip->i_df.if_u1.if_data, pathlen, uiop); } else { /* @@ -1073,8 +1074,7 @@ byte_cnt = pathlen; pathlen -= byte_cnt; - error = uiomove(XFS_BUF_PTR(bp), byte_cnt, - UIO_READ, uiop); + error = uio_read(XFS_BUF_PTR(bp), byte_cnt, uiop); xfs_buf_relse (bp); } @@ -1729,7 +1729,7 @@ if (ip->i_d.di_nlink == 0 && DM_EVENT_ENABLED(vp->v_vfsp, ip, DM_EVENT_DESTROY)) { - (void) XFS_SEND_DESTROY(mp, bdp, DM_RIGHT_NULL); + (void) XFS_SEND_DESTROY(mp, vp, DM_RIGHT_NULL); } error = 0; @@ -4163,7 +4163,7 @@ end_dmi_offset = offset+len; if (end_dmi_offset > ip->i_d.di_size) end_dmi_offset = ip->i_d.di_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOBHV(ip), + error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOV(ip), offset, end_dmi_offset - offset, 0, NULL); if (error) @@ -4410,7 +4410,7 @@ DM_EVENT_ENABLED(XFS_MTOVFS(mp), ip, DM_EVENT_WRITE)) { if (end_dmi_offset > ip->i_d.di_size) end_dmi_offset = ip->i_d.di_size; - error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOBHV(ip), + error = XFS_SEND_DATA(mp, DM_EVENT_WRITE, XFS_ITOV(ip), offset, end_dmi_offset - offset, AT_DELAY_FLAG(attr_flags), NULL); if (error) diff -Nru a/fs/xfs/xfsidbg.c b/fs/xfs/xfsidbg.c --- a/fs/xfs/xfsidbg.c Wed Oct 8 12:24:57 2003 +++ b/fs/xfs/xfsidbg.c Wed Oct 8 12:24:57 2003 @@ -3739,9 +3739,9 @@ kdb_printf(" %d:0x%p", i, dabuf->bps[i]); kdb_printf("\n"); #ifdef XFS_DABUF_DEBUG - kdb_printf(" ra 0x%x prev 0x%x next 0x%x dev %u:%u blkno 0x%x\n", + kdb_printf(" ra 0x%x prev 0x%x next 0x%x dev %s blkno 0x%x\n", dabuf->ra, dabuf->prev, dabuf->next, - MAJOR(dabuf->dev), MINOR(dabuf->dev), dabuf->blkno); + XFS_BUFTARG_NAME(dabuf->dev), dabuf->blkno); #endif } @@ -4269,9 +4269,8 @@ xfsidbg_get_cstate(log->l_covered_state)); kdb_printf("flags: "); printflags(log->l_flags, t_flags,"log"); - kdb_printf(" dev: %u:%u logBBstart: %lld logsize: %d logBBsize: %d\n", - MAJOR(log->l_dev), MINOR(log->l_dev), - (long long) log->l_logBBstart, + kdb_printf(" dev: %s logBBstart: %lld logsize: %d logBBsize: %d\n", + XFS_BUFTARG_NAME(log->l_targ), (long long) log->l_logBBstart, log->l_logsize,log->l_logBBsize); kdb_printf("curr_cycle: %d prev_cycle: %d curr_block: %d prev_block: %d\n", log->l_curr_cycle, log->l_prev_cycle, log->l_curr_block, @@ -4646,14 +4645,14 @@ XFS_MTOVFS(mp), mp->m_tid, &mp->m_ail_lock, &mp->m_ail); kdb_printf("ail_gen 0x%x &sb 0x%p\n", mp->m_ail_gen, &mp->m_sb); - kdb_printf("sb_lock 0x%p sb_bp 0x%p dev %u:%u logdev %u:%u rtdev %u:%u\n", + kdb_printf("sb_lock 0x%p sb_bp 0x%p dev %s logdev %s rtdev %s\n", &mp->m_sb_lock, mp->m_sb_bp, - mp->m_ddev_targp ? MAJOR(mp->m_ddev_targp->pbr_dev) : 0, - mp->m_ddev_targp ? MINOR(mp->m_ddev_targp->pbr_dev) : 0, - mp->m_logdev_targp ? MAJOR(mp->m_logdev_targp->pbr_dev) : 0, - mp->m_logdev_targp ? MINOR(mp->m_logdev_targp->pbr_dev) : 0, - mp->m_rtdev_targp ? MAJOR(mp->m_rtdev_targp->pbr_dev) : 0, - mp->m_rtdev_targp ? MINOR(mp->m_rtdev_targp->pbr_dev) : 0); + mp->m_ddev_targp ? + XFS_BUFTARG_NAME(mp->m_ddev_targp) : "none", + mp->m_logdev_targp ? + XFS_BUFTARG_NAME(mp->m_logdev_targp) : "none", + mp->m_rtdev_targp ? + XFS_BUFTARG_NAME(mp->m_rtdev_targp) : "none"); kdb_printf("bsize %d agfrotor %d agirotor %d ihash 0x%p ihsize %d\n", mp->m_bsize, mp->m_agfrotor, mp->m_agirotor, mp->m_ihash, mp->m_ihsize); @@ -4824,9 +4823,8 @@ ip->i_mnext, ip->i_mprev, XFS_ITOV_NULL(ip)); - kdb_printf("dev %u:%u ino %s\n", - MAJOR(ip->i_mount->m_dev), - MINOR(ip->i_mount->m_dev), + kdb_printf("dev %s ino %s\n", + XFS_BUFTARG_NAME(ip->i_mount->m_ddev_targp), xfs_fmtino(ip->i_ino, ip->i_mount)); kdb_printf("blkno 0x%llx len 0x%x boffset 0x%x\n", (long long) ip->i_blkno, diff -Nru a/include/acpi/acconfig.h b/include/acpi/acconfig.h --- a/include/acpi/acconfig.h Wed Oct 8 12:24:57 2003 +++ b/include/acpi/acconfig.h Wed Oct 8 12:24:57 2003 @@ -64,7 +64,7 @@ /* Version string */ -#define ACPI_CA_VERSION 0x20030813 +#define ACPI_CA_VERSION 0x20030918 /* Maximum objects in the various object caches */ diff -Nru a/include/acpi/acdisasm.h b/include/acpi/acdisasm.h --- a/include/acpi/acdisasm.h Wed Oct 8 12:24:56 2003 +++ b/include/acpi/acdisasm.h Wed Oct 8 12:24:56 2003 @@ -152,10 +152,6 @@ acpi_dm_decode_internal_object ( union acpi_operand_object *obj_desc); -void -acpi_dm_decode_node ( - struct acpi_namespace_node *node); - u32 acpi_dm_block_type ( union acpi_parse_object *op); diff -Nru a/include/acpi/acstruct.h b/include/acpi/acstruct.h --- a/include/acpi/acstruct.h Wed Oct 8 12:24:55 2003 +++ b/include/acpi/acstruct.h Wed Oct 8 12:24:55 2003 @@ -91,11 +91,12 @@ struct acpi_namespace_node arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */ union acpi_operand_object **caller_return_desc; union acpi_generic_state *control_state; /* List of control states (nested IFs) */ + struct acpi_namespace_node *deferred_node; /* Used when executing deferred opcodes */ struct acpi_namespace_node local_variables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */ struct acpi_namespace_node *method_call_node; /* Called method Node*/ union acpi_parse_object *method_call_op; /* method_call Op if running a method */ union acpi_operand_object *method_desc; /* Method descriptor if running a method */ - struct acpi_namespace_node *method_node; /* Method Node if running a method */ + struct acpi_namespace_node *method_node; /* Method node if running a method. */ union acpi_parse_object *op; /* Current parser op */ union acpi_operand_object *operands[ACPI_OBJ_NUM_OPERANDS+1]; /* Operands passed to the interpreter (+1 for NULL terminator) */ const struct acpi_opcode_info *op_info; /* Info on current opcode */ diff -Nru a/include/asm-alpha/cacheflush.h b/include/asm-alpha/cacheflush.h --- a/include/asm-alpha/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-alpha/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -10,6 +10,8 @@ #define flush_cache_range(vma, start, end) do { } while (0) #define flush_cache_page(vma, vmaddr) do { } while (0) #define flush_dcache_page(page) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) /* Note that the following two definitions are _highly_ dependent on the contexts in which they are used in the kernel. I personally @@ -59,5 +61,12 @@ /* This is used only in do_no_page and do_swap_page. */ #define flush_icache_page(vma, page) \ flush_icache_user_range((vma), (page), 0, 0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) #endif /* _ALPHA_CACHEFLUSH_H */ diff -Nru a/include/asm-alpha/numnodes.h b/include/asm-alpha/numnodes.h --- a/include/asm-alpha/numnodes.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-alpha/numnodes.h Wed Oct 8 12:24:55 2003 @@ -1,6 +1,7 @@ #ifndef _ASM_MAX_NUMNODES_H #define _ASM_MAX_NUMNODES_H -#define MAX_NUMNODES 128 /* Marvel */ +/* Max 128 Nodes - Marvel */ +#define NODES_SHIFT 7 #endif /* _ASM_MAX_NUMNODES_H */ diff -Nru a/include/asm-alpha/pgtable.h b/include/asm-alpha/pgtable.h --- a/include/asm-alpha/pgtable.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-alpha/pgtable.h Wed Oct 8 12:24:56 2003 @@ -49,7 +49,6 @@ #else #define VMALLOC_START (-2*PGDIR_SIZE) #endif -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (-PGDIR_SIZE) /* diff -Nru a/include/asm-alpha/serial.h b/include/asm-alpha/serial.h --- a/include/asm-alpha/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-alpha/serial.h Wed Oct 8 12:24:57 2003 @@ -26,9 +26,6 @@ #define FOURPORT_FLAGS ASYNC_FOURPORT #define ACCENT_FLAGS 0 #define BOCA_FLAGS 0 -#define RS_TABLE_SIZE 64 -#else -#define RS_TABLE_SIZE 4 #endif #define STD_SERIAL_PORT_DEFNS \ diff -Nru a/include/asm-arm/arch-adifcc/serial.h b/include/asm-arm/arch-adifcc/serial.h --- a/include/asm-arm/arch-adifcc/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-adifcc/serial.h Wed Oct 8 12:24:57 2003 @@ -21,8 +21,6 @@ #ifdef CONFIG_ARCH_ADI_EVB -#define RS_TABLE_SIZE 1 - /* * One serial port, int goes to FIQ, so we run in polled mode */ diff -Nru a/include/asm-arm/arch-adifcc/vmalloc.h b/include/asm-arm/arch-adifcc/vmalloc.h --- a/include/asm-arm/arch-adifcc/vmalloc.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-adifcc/vmalloc.h Wed Oct 8 12:24:55 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (0xe8000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-anakin/serial.h b/include/asm-arm/arch-anakin/serial.h --- a/include/asm-arm/arch-anakin/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-anakin/serial.h Wed Oct 8 12:24:56 2003 @@ -20,7 +20,6 @@ /* * UART3 and UART4 are not supported yet */ -#define RS_TABLE_SIZE 3 #define STD_SERIAL_PORT_DEFNS \ { 0, 0, IO_BASE + UART0, IRQ_UART0, 0 }, \ { 0, 0, IO_BASE + UART1, IRQ_UART1, 0 }, \ diff -Nru a/include/asm-arm/arch-anakin/vmalloc.h b/include/asm-arm/arch-anakin/vmalloc.h --- a/include/asm-arm/arch-anakin/vmalloc.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-anakin/vmalloc.h Wed Oct 8 12:24:56 2003 @@ -19,8 +19,7 @@ * linux/arch/arm/kernel/traps.c) */ #define VMALLOC_ARCH_OFFSET (8 * 1024 * 1024) -#define VMALLOC_VMADDR(a) ((unsigned int) (a)) -#define VMALLOC_START ((VMALLOC_VMADDR(high_memory) + VMALLOC_ARCH_OFFSET) & ~(VMALLOC_ARCH_OFFSET - 1)) +#define VMALLOC_START (((unsigned long) (high_memory) + VMALLOC_ARCH_OFFSET) & ~(VMALLOC_ARCH_OFFSET - 1)) #define VMALLOC_END (PAGE_OFFSET + 0x10000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-cl7500/serial.h b/include/asm-arm/arch-cl7500/serial.h --- a/include/asm-arm/arch-cl7500/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-cl7500/serial.h Wed Oct 8 12:24:56 2003 @@ -22,8 +22,6 @@ */ #define BASE_BAUD (1843200 / 16) -#define RS_TABLE_SIZE 16 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* UART CLK PORT IRQ FLAGS */ diff -Nru a/include/asm-arm/arch-cl7500/vmalloc.h b/include/asm-arm/arch-cl7500/vmalloc.h --- a/include/asm-arm/arch-cl7500/vmalloc.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-cl7500/vmalloc.h Wed Oct 8 12:24:57 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x1c000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-clps711x/memory.h b/include/asm-arm/arch-clps711x/memory.h --- a/include/asm-arm/arch-clps711x/memory.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-clps711x/memory.h Wed Oct 8 12:24:55 2003 @@ -109,8 +109,6 @@ * node 3: 0xd8000000 - 0xdfffffff */ -#define NR_NODES 4 - /* * Given a kernel address, find the home node of the underlying memory. */ diff -Nru a/include/asm-arm/arch-clps711x/vmalloc.h b/include/asm-arm/arch-clps711x/vmalloc.h --- a/include/asm-arm/arch-clps711x/vmalloc.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-clps711x/vmalloc.h Wed Oct 8 12:24:55 2003 @@ -28,7 +28,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x10000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-ebsa110/serial.h b/include/asm-arm/arch-ebsa110/serial.h --- a/include/asm-arm/arch-ebsa110/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-ebsa110/serial.h Wed Oct 8 12:24:56 2003 @@ -24,8 +24,6 @@ #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) -#define RS_TABLE_SIZE 2 - /* UART CLK PORT IRQ FLAGS */ #define STD_SERIAL_PORT_DEFNS \ { 0, BASE_BAUD, 0x3F8, 1, STD_COM_FLAGS }, /* ttyS0 */ \ diff -Nru a/include/asm-arm/arch-ebsa110/vmalloc.h b/include/asm-arm/arch-ebsa110/vmalloc.h --- a/include/asm-arm/arch-ebsa110/vmalloc.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-ebsa110/vmalloc.h Wed Oct 8 12:24:56 2003 @@ -18,7 +18,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x1f000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-ebsa285/serial.h b/include/asm-arm/arch-ebsa285/serial.h --- a/include/asm-arm/arch-ebsa285/serial.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-ebsa285/serial.h Wed Oct 8 12:24:55 2003 @@ -28,8 +28,6 @@ #define _SER_IRQ0 IRQ_ISA_UART #define _SER_IRQ1 IRQ_ISA_UART2 -#define RS_TABLE_SIZE 16 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* UART CLK PORT IRQ FLAGS */ diff -Nru a/include/asm-arm/arch-ebsa285/vmalloc.h b/include/asm-arm/arch-ebsa285/vmalloc.h --- a/include/asm-arm/arch-ebsa285/vmalloc.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-ebsa285/vmalloc.h Wed Oct 8 12:24:56 2003 @@ -18,7 +18,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #ifdef CONFIG_ARCH_FOOTBRIDGE #define VMALLOC_END (PAGE_OFFSET + 0x30000000) diff -Nru a/include/asm-arm/arch-epxa10db/serial.h b/include/asm-arm/arch-epxa10db/serial.h --- a/include/asm-arm/arch-epxa10db/serial.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-epxa10db/serial.h Wed Oct 8 12:24:55 2003 @@ -36,8 +36,6 @@ #define _SER_IRQ0 IRQ_UARTINT0 #define _SER_IRQ1 IRQ_UARTINT1 -#define RS_TABLE_SIZE 2 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* UART CLK PORT IRQ FLAGS */ diff -Nru a/include/asm-arm/arch-epxa10db/vmalloc.h b/include/asm-arm/arch-epxa10db/vmalloc.h --- a/include/asm-arm/arch-epxa10db/vmalloc.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-epxa10db/vmalloc.h Wed Oct 8 12:24:55 2003 @@ -28,7 +28,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x10000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-integrator/irqs.h b/include/asm-arm/arch-integrator/irqs.h --- a/include/asm-arm/arch-integrator/irqs.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-integrator/irqs.h Wed Oct 8 12:24:55 2003 @@ -19,116 +19,39 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* Use the integrator definitions */ -#include - -/* - * IRQ interrupts definitions are the same the INT definitions - * held within platform.h - */ -#define IRQ_SOFTINT INT_SOFTINT -#define IRQ_UARTINT0 INT_UARTINT0 -#define IRQ_UARTINT1 INT_UARTINT1 -#define IRQ_KMIINT0 INT_KMIINT0 -#define IRQ_KMIINT1 INT_KMIINT1 -#define IRQ_TIMERINT0 INT_TIMERINT0 -#define IRQ_TIMERINT1 INT_TIMERINT1 -#define IRQ_TIMERINT2 INT_TIMERINT2 -#define IRQ_RTCINT INT_RTCINT -#define IRQ_EXPINT0 INT_EXPINT0 -#define IRQ_EXPINT1 INT_EXPINT1 -#define IRQ_EXPINT2 INT_EXPINT2 -#define IRQ_EXPINT3 INT_EXPINT3 -#define IRQ_PCIINT0 INT_PCIINT0 -#define IRQ_PCIINT1 INT_PCIINT1 -#define IRQ_PCIINT2 INT_PCIINT2 -#define IRQ_PCIINT3 INT_PCIINT3 -#define IRQ_V3INT INT_V3INT -#define IRQ_CPINT0 INT_CPINT0 -#define IRQ_CPINT1 INT_CPINT1 -#define IRQ_LBUSTIMEOUT INT_LBUSTIMEOUT -#define IRQ_APCINT INT_APCINT - -#define IRQMASK_SOFTINT INTMASK_SOFTINT -#define IRQMASK_UARTINT0 INTMASK_UARTINT0 -#define IRQMASK_UARTINT1 INTMASK_UARTINT1 -#define IRQMASK_KMIINT0 INTMASK_KMIINT0 -#define IRQMASK_KMIINT1 INTMASK_KMIINT1 -#define IRQMASK_TIMERINT0 INTMASK_TIMERINT0 -#define IRQMASK_TIMERINT1 INTMASK_TIMERINT1 -#define IRQMASK_TIMERINT2 INTMASK_TIMERINT2 -#define IRQMASK_RTCINT INTMASK_RTCINT -#define IRQMASK_EXPINT0 INTMASK_EXPINT0 -#define IRQMASK_EXPINT1 INTMASK_EXPINT1 -#define IRQMASK_EXPINT2 INTMASK_EXPINT2 -#define IRQMASK_EXPINT3 INTMASK_EXPINT3 -#define IRQMASK_PCIINT0 INTMASK_PCIINT0 -#define IRQMASK_PCIINT1 INTMASK_PCIINT1 -#define IRQMASK_PCIINT2 INTMASK_PCIINT2 -#define IRQMASK_PCIINT3 INTMASK_PCIINT3 -#define IRQMASK_V3INT INTMASK_V3INT -#define IRQMASK_CPINT0 INTMASK_CPINT0 -#define IRQMASK_CPINT1 INTMASK_CPINT1 -#define IRQMASK_LBUSTIMEOUT INTMASK_LBUSTIMEOUT -#define IRQMASK_APCINT INTMASK_APCINT - /* - * FIQ interrupts definitions are the same the INT definitions. + * Interrupt numbers */ -#define FIQ_SOFTINT INT_SOFTINT -#define FIQ_UARTINT0 INT_UARTINT0 -#define FIQ_UARTINT1 INT_UARTINT1 -#define FIQ_KMIINT0 INT_KMIINT0 -#define FIQ_KMIINT1 INT_KMIINT1 -#define FIQ_TIMERINT0 INT_TIMERINT0 -#define FIQ_TIMERINT1 INT_TIMERINT1 -#define FIQ_TIMERINT2 INT_TIMERINT2 -#define FIQ_RTCINT INT_RTCINT -#define FIQ_EXPINT0 INT_EXPINT0 -#define FIQ_EXPINT1 INT_EXPINT1 -#define FIQ_EXPINT2 INT_EXPINT2 -#define FIQ_EXPINT3 INT_EXPINT3 -#define FIQ_PCIINT0 INT_PCIINT0 -#define FIQ_PCIINT1 INT_PCIINT1 -#define FIQ_PCIINT2 INT_PCIINT2 -#define FIQ_PCIINT3 INT_PCIINT3 -#define FIQ_V3INT INT_V3INT -#define FIQ_CPINT0 INT_CPINT0 -#define FIQ_CPINT1 INT_CPINT1 -#define FIQ_LBUSTIMEOUT INT_LBUSTIMEOUT -#define FIQ_APCINT INT_APCINT - -#define FIQMASK_SOFTINT INTMASK_SOFTINT -#define FIQMASK_UARTINT0 INTMASK_UARTINT0 -#define FIQMASK_UARTINT1 INTMASK_UARTINT1 -#define FIQMASK_KMIINT0 INTMASK_KMIINT0 -#define FIQMASK_KMIINT1 INTMASK_KMIINT1 -#define FIQMASK_TIMERINT0 INTMASK_TIMERINT0 -#define FIQMASK_TIMERINT1 INTMASK_TIMERINT1 -#define FIQMASK_TIMERINT2 INTMASK_TIMERINT2 -#define FIQMASK_RTCINT INTMASK_RTCINT -#define FIQMASK_EXPINT0 INTMASK_EXPINT0 -#define FIQMASK_EXPINT1 INTMASK_EXPINT1 -#define FIQMASK_EXPINT2 INTMASK_EXPINT2 -#define FIQMASK_EXPINT3 INTMASK_EXPINT3 -#define FIQMASK_PCIINT0 INTMASK_PCIINT0 -#define FIQMASK_PCIINT1 INTMASK_PCIINT1 -#define FIQMASK_PCIINT2 INTMASK_PCIINT2 -#define FIQMASK_PCIINT3 INTMASK_PCIINT3 -#define FIQMASK_V3INT INTMASK_V3INT -#define FIQMASK_CPINT0 INTMASK_CPINT0 -#define FIQMASK_CPINT1 INTMASK_CPINT1 -#define FIQMASK_LBUSTIMEOUT INTMASK_LBUSTIMEOUT -#define FIQMASK_APCINT INTMASK_APCINT - -/* - * Misc. interrupt definitions - */ -#define IRQ_KEYBDINT INT_KMIINT0 -#define IRQ_MOUSEINT INT_KMIINT1 - -#define IRQMASK_KEYBDINT INTMASK_KMIINT0 -#define IRQMASK_MOUSEINT INTMASK_KMIINT1 +#define IRQ_PIC_START 0 +#define IRQ_SOFTINT 0 +#define IRQ_UARTINT0 1 +#define IRQ_UARTINT1 2 +#define IRQ_KMIINT0 3 +#define IRQ_KMIINT1 4 +#define IRQ_TIMERINT0 5 +#define IRQ_TIMERINT1 6 +#define IRQ_TIMERINT2 7 +#define IRQ_RTCINT 8 +#define IRQ_AP_EXPINT0 9 +#define IRQ_AP_EXPINT1 10 +#define IRQ_AP_EXPINT2 11 +#define IRQ_AP_EXPINT3 12 +#define IRQ_AP_PCIINT0 13 +#define IRQ_AP_PCIINT1 14 +#define IRQ_AP_PCIINT2 15 +#define IRQ_AP_PCIINT3 16 +#define IRQ_AP_V3INT 17 +#define IRQ_AP_CPINT0 18 +#define IRQ_AP_CPINT1 19 +#define IRQ_AP_LBUSTIMEOUT 20 +#define IRQ_AP_APCINT 21 +#define IRQ_PIC_END 31 + +#define IRQ_CIC_START 32 +#define IRQ_CM_SOFTINT 32 +#define IRQ_CM_COMMRX 33 +#define IRQ_CM_COMMTX 34 +#define IRQ_CIC_END 34 -#define NR_IRQS (MAXIRQNUM + 1) +#define NR_IRQS 47 diff -Nru a/include/asm-arm/arch-integrator/platform.h b/include/asm-arm/arch-integrator/platform.h --- a/include/asm-arm/arch-integrator/platform.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-integrator/platform.h Wed Oct 8 12:24:56 2003 @@ -386,85 +386,6 @@ * */ -/* - * As the interrupt bit definitions for FIQ/IRQ there is a common - * set of definitions prefixed INT/INTMASK. The FIQ/IRQ definitions - * have been left to maintain backwards compatible. - * - */ - -/* - * Interrupt numbers - * - */ -#define INT_SOFTINT 0 -#define INT_UARTINT0 1 -#define INT_UARTINT1 2 -#define INT_KMIINT0 3 -#define INT_KMIINT1 4 -#define INT_TIMERINT0 5 -#define INT_TIMERINT1 6 -#define INT_TIMERINT2 7 -#define INT_RTCINT 8 -#define INT_EXPINT0 9 -#define INT_EXPINT1 10 -#define INT_EXPINT2 11 -#define INT_EXPINT3 12 -#define INT_PCIINT0 13 -#define INT_PCIINT1 14 -#define INT_PCIINT2 15 -#define INT_PCIINT3 16 -#define INT_V3INT 17 -#define INT_CPINT0 18 -#define INT_CPINT1 19 -#define INT_LBUSTIMEOUT 20 -#define INT_APCINT 21 -#define INT_CM_SOFTINT 24 -#define INT_CM_COMMRX 25 -#define INT_CM_COMMTX 26 - -/* - * Interrupt bit positions - * - */ -#define INTMASK_SOFTINT (1 << INT_SOFTINT) -#define INTMASK_UARTINT0 (1 << INT_UARTINT0) -#define INTMASK_UARTINT1 (1 << INT_UARTINT1) -#define INTMASK_KMIINT0 (1 << INT_KMIINT0) -#define INTMASK_KMIINT1 (1 << INT_KMIINT1) -#define INTMASK_TIMERINT0 (1 << INT_TIMERINT0) -#define INTMASK_TIMERINT1 (1 << INT_TIMERINT1) -#define INTMASK_TIMERINT2 (1 << INT_TIMERINT2) -#define INTMASK_RTCINT (1 << INT_RTCINT) -#define INTMASK_EXPINT0 (1 << INT_EXPINT0) -#define INTMASK_EXPINT1 (1 << INT_EXPINT1) -#define INTMASK_EXPINT2 (1 << INT_EXPINT2) -#define INTMASK_EXPINT3 (1 << INT_EXPINT3) -#define INTMASK_PCIINT0 (1 << INT_PCIINT0) -#define INTMASK_PCIINT1 (1 << INT_PCIINT1) -#define INTMASK_PCIINT2 (1 << INT_PCIINT2) -#define INTMASK_PCIINT3 (1 << INT_PCIINT3) -#define INTMASK_V3INT (1 << INT_V3INT) -#define INTMASK_CPINT0 (1 << INT_CPINT0) -#define INTMASK_CPINT1 (1 << INT_CPINT1) -#define INTMASK_LBUSTIMEOUT (1 << INT_LBUSTIMEOUT) -#define INTMASK_APCINT (1 << INT_APCINT) -#define INTMASK_CM_SOFTINT (1 << INT_CM_SOFTINT) -#define INTMASK_CM_COMMRX (1 << INT_CM_COMMRX) -#define INTMASK_CM_COMMTX (1 << INT_CM_COMMTX) - -/* - * INTEGRATOR_CM_INT0 - Interrupt number of first CM interrupt - * INTEGRATOR_SC_VALID_INT - Mask of valid system controller interrupts - * - */ -#define INTEGRATOR_CM_INT0 INT_CM_SOFTINT -#define INTEGRATOR_SC_VALID_INT 0x003FFFFF - -#define MAXIRQNUM 31 -#define MAXFIQNUM 31 -#define MAXSWINUM 31 - /* ------------------------------------------------------------------------ * LED's - The header LED is not accessible via the uHAL API * ------------------------------------------------------------------------ diff -Nru a/include/asm-arm/arch-integrator/serial.h b/include/asm-arm/arch-integrator/serial.h --- a/include/asm-arm/arch-integrator/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-integrator/serial.h Wed Oct 8 12:24:57 2003 @@ -35,8 +35,6 @@ #define _SER_IRQ0 IRQ_UARTINT0 #define _SER_IRQ1 IRQ_UARTINT1 -#define RS_TABLE_SIZE 2 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* UART CLK PORT IRQ FLAGS */ diff -Nru a/include/asm-arm/arch-integrator/time.h b/include/asm-arm/arch-integrator/time.h --- a/include/asm-arm/arch-integrator/time.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-integrator/time.h Wed Oct 8 12:24:57 2003 @@ -86,7 +86,7 @@ /* * Interrupt pending? If so, we've reloaded once already. */ - if (status & IRQMASK_TIMERINT1) + if (status & (1 << IRQ_TIMERINT1)) ticks1 += TIMER_RELOAD; /* diff -Nru a/include/asm-arm/arch-integrator/vmalloc.h b/include/asm-arm/arch-integrator/vmalloc.h --- a/include/asm-arm/arch-integrator/vmalloc.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-integrator/vmalloc.h Wed Oct 8 12:24:55 2003 @@ -28,7 +28,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x10000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-iop3xx/serial.h b/include/asm-arm/arch-iop3xx/serial.h --- a/include/asm-arm/arch-iop3xx/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-iop3xx/serial.h Wed Oct 8 12:24:57 2003 @@ -20,8 +20,6 @@ #define IRQ_UART1 IRQ_IQ80310_UART1 #define IRQ_UART2 IRQ_IQ80310_UART2 -#define RS_TABLE_SIZE 2 - #define STD_SERIAL_PORT_DEFNS \ /* UART CLK PORT IRQ FLAGS */ \ { 0, BASE_BAUD, IQ80310_UART2, IRQ_UART2, STD_COM_FLAGS }, /* ttyS0 */ \ @@ -32,8 +30,6 @@ #ifdef CONFIG_ARCH_IQ80321 #define IRQ_UART1 IRQ_IQ80321_UART - -#define RS_TABLE_SIZE 1 #define STD_SERIAL_PORT_DEFNS \ /* UART CLK PORT IRQ FLAGS */ \ diff -Nru a/include/asm-arm/arch-iop3xx/vmalloc.h b/include/asm-arm/arch-iop3xx/vmalloc.h --- a/include/asm-arm/arch-iop3xx/vmalloc.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-iop3xx/vmalloc.h Wed Oct 8 12:24:57 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (0xe8000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-l7200/serial.h b/include/asm-arm/arch-l7200/serial.h --- a/include/asm-arm/arch-l7200/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-l7200/serial.h Wed Oct 8 12:24:56 2003 @@ -27,8 +27,6 @@ */ #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) -#define RS_TABLE_SIZE 2 - #define STD_SERIAL_PORT_DEFNS \ /* MAGIC UART CLK PORT IRQ FLAGS */ \ { 0, BASE_BAUD, UART1_BASE, IRQ_UART_1, STD_COM_FLAGS }, /* ttyLU0 */ \ diff -Nru a/include/asm-arm/arch-l7200/vmalloc.h b/include/asm-arm/arch-l7200/vmalloc.h --- a/include/asm-arm/arch-l7200/vmalloc.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-l7200/vmalloc.h Wed Oct 8 12:24:56 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x10000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-nexuspci/vmalloc.h b/include/asm-arm/arch-nexuspci/vmalloc.h --- a/include/asm-arm/arch-nexuspci/vmalloc.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-nexuspci/vmalloc.h Wed Oct 8 12:24:56 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x20000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-pxa/irqs.h b/include/asm-arm/arch-pxa/irqs.h --- a/include/asm-arm/arch-pxa/irqs.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-pxa/irqs.h Wed Oct 8 12:24:55 2003 @@ -13,7 +13,7 @@ #include #define PXA_IRQ_SKIP 7 /* The first 7 IRQs are not yet used */ -#define PXA_IRQ(x) ((x) - PXA_IRQ_SKIP) +#define PXA_IRQ(x) ((x) - PXA_IRQ_SKIP) #define IRQ_HWUART PXA_IRQ(7) /* HWUART Transmit/Receive/Error */ #define IRQ_GPIO0 PXA_IRQ(8) /* GPIO0 Edge Detect */ @@ -47,7 +47,7 @@ #define IRQ_TO_GPIO_2_80(i) \ ((i) - PXA_IRQ(32) + 2) -#define IRQ_TO_GPIO(i) ((i) - (((i) > IRQ_GPIO1) ? IRQ_GPIO(2) : IRQ_GPIO(0))) +#define IRQ_TO_GPIO(i) ((i) - (((i) > IRQ_GPIO1) ? IRQ_GPIO(2) - 2 : IRQ_GPIO(0))) /* * The next 16 interrupts are for board specific purposes. Since @@ -131,8 +131,10 @@ #define LUBBOCK_IRQ(x) (IRQ_BOARD_START + (x)) #define LUBBOCK_SD_IRQ LUBBOCK_IRQ(0) #define LUBBOCK_SA1111_IRQ LUBBOCK_IRQ(1) -#define LUBBOCK_USB_IRQ LUBBOCK_IRQ(2) +#define LUBBOCK_USB_IRQ LUBBOCK_IRQ(2) /* usb connect */ #define LUBBOCK_ETH_IRQ LUBBOCK_IRQ(3) #define LUBBOCK_UCB1400_IRQ LUBBOCK_IRQ(4) #define LUBBOCK_BB_IRQ LUBBOCK_IRQ(5) +#define LUBBOCK_USB_DISC_IRQ LUBBOCK_IRQ(6) /* usb disconnect */ +#define LUBBOCK_LAST_IRQ LUBBOCK_IRQ(6) diff -Nru a/include/asm-arm/arch-pxa/lubbock.h b/include/asm-arm/arch-pxa/lubbock.h --- a/include/asm-arm/arch-pxa/lubbock.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-pxa/lubbock.h Wed Oct 8 12:24:56 2003 @@ -12,7 +12,8 @@ #define LUBBOCK_FPGA_PHYS PXA_CS2_PHYS #define LUBBOCK_FPGA_VIRT (0xf0000000) /* phys 0x08000000 */ -#define LUBBOCK_ETH_BASE (0xf1000000) /* phys 0x0c000000 */ +#define LUBBOCK_ETH_PHYS PXA_CS3_PHYS +#define LUBBOCK_ETH_VIRT (0xf1000000) #define LUB_P2V(x) ((x) - LUBBOCK_FPGA_PHYS + LUBBOCK_FPGA_VIRT) #define LUB_V2P(x) ((x) - LUBBOCK_FPGA_VIRT + LUBBOCK_FPGA_PHYS) diff -Nru a/include/asm-arm/arch-pxa/serial.h b/include/asm-arm/arch-pxa/serial.h --- a/include/asm-arm/arch-pxa/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-pxa/serial.h Wed Oct 8 12:24:56 2003 @@ -15,8 +15,6 @@ /* Standard COM flags */ #define STD_COM_FLAGS (ASYNC_SKIP_TEST) -#define RS_TABLE_SIZE 5 - #define STD_SERIAL_PORT_DEFNS \ { \ type: PORT_PXA, \ diff -Nru a/include/asm-arm/arch-pxa/vmalloc.h b/include/asm-arm/arch-pxa/vmalloc.h --- a/include/asm-arm/arch-pxa/vmalloc.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-pxa/vmalloc.h Wed Oct 8 12:24:56 2003 @@ -19,7 +19,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (0xe8000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-rpc/serial.h b/include/asm-arm/arch-rpc/serial.h --- a/include/asm-arm/arch-rpc/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/arch-rpc/serial.h Wed Oct 8 12:24:56 2003 @@ -24,8 +24,6 @@ #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) -#define RS_TABLE_SIZE 16 - /* UART CLK PORT IRQ FLAGS */ #define STD_SERIAL_PORT_DEFNS \ { 0, BASE_BAUD, 0x3F8, 10, STD_COM_FLAGS }, /* ttyS0 */ \ diff -Nru a/include/asm-arm/arch-rpc/vmalloc.h b/include/asm-arm/arch-rpc/vmalloc.h --- a/include/asm-arm/arch-rpc/vmalloc.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-rpc/vmalloc.h Wed Oct 8 12:24:57 2003 @@ -18,7 +18,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x1c000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-sa1100/memory.h b/include/asm-arm/arch-sa1100/memory.h --- a/include/asm-arm/arch-sa1100/memory.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-sa1100/memory.h Wed Oct 8 12:24:55 2003 @@ -74,8 +74,6 @@ * node 3: 0xd8000000 - 0xdfffffff */ -#define NR_NODES 4 - /* * Given a kernel address, find the home node of the underlying memory. */ diff -Nru a/include/asm-arm/arch-sa1100/serial.h b/include/asm-arm/arch-sa1100/serial.h --- a/include/asm-arm/arch-sa1100/serial.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-sa1100/serial.h Wed Oct 8 12:24:55 2003 @@ -19,16 +19,12 @@ */ #ifdef CONFIG_SA1100_TRIZEPS -#define RS_TABLE_SIZE 2 - #define STD_SERIAL_PORT_DEFNS \ /* UART CLK PORT IRQ FLAGS */ \ { 0, 1500000, TRIZEPS_UART5, IRQ_GPIO16, STD_COM_FLAGS }, \ { 0, 1500000, TRIZEPS_UART6, IRQ_GPIO17, STD_COM_FLAGS } #else - -#define RS_TABLE_SIZE 4 /* * This assumes you have a 1.8432 MHz clock for your UART. diff -Nru a/include/asm-arm/arch-sa1100/vmalloc.h b/include/asm-arm/arch-sa1100/vmalloc.h --- a/include/asm-arm/arch-sa1100/vmalloc.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-sa1100/vmalloc.h Wed Oct 8 12:24:57 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (0xe8000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-shark/serial.h b/include/asm-arm/arch-shark/serial.h --- a/include/asm-arm/arch-shark/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/arch-shark/serial.h Wed Oct 8 12:24:57 2003 @@ -20,8 +20,6 @@ #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) -#define RS_TABLE_SIZE 2 - /* UART CLK PORT IRQ FLAGS */ #define STD_SERIAL_PORT_DEFNS \ { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS }, /* ttyS0 */ \ diff -Nru a/include/asm-arm/arch-shark/vmalloc.h b/include/asm-arm/arch-shark/vmalloc.h --- a/include/asm-arm/arch-shark/vmalloc.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-shark/vmalloc.h Wed Oct 8 12:24:55 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x10000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/arch-tbox/serial.h b/include/asm-arm/arch-tbox/serial.h --- a/include/asm-arm/arch-tbox/serial.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-tbox/serial.h Wed Oct 8 12:24:55 2003 @@ -20,8 +20,6 @@ */ #define BASE_BAUD (1843200 / 16) -#define RS_TABLE_SIZE 2 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* UART CLK PORT IRQ FLAGS */ diff -Nru a/include/asm-arm/arch-tbox/vmalloc.h b/include/asm-arm/arch-tbox/vmalloc.h --- a/include/asm-arm/arch-tbox/vmalloc.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm/arch-tbox/vmalloc.h Wed Oct 8 12:24:55 2003 @@ -12,7 +12,6 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (PAGE_OFFSET + 0x10000000) #define MODULE_START (PAGE_OFFSET - 16*1048576) diff -Nru a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h --- a/include/asm-arm/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -209,6 +209,15 @@ #endif +#define flush_cache_vmap(start, end) flush_cache_all() +#define flush_cache_vunmap(start, end) flush_cache_all() +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + /* * Convert calls to our calling convention. */ diff -Nru a/include/asm-arm/mach/flash.h b/include/asm-arm/mach/flash.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-arm/mach/flash.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,19 @@ +/* + * linux/include/asm-arm/mach/flash.h + * + * Copyright (C) 2003 Russell King, All Rights Reserved. + */ +#ifndef ASMARM_MACH_FLASH_H +#define ASMAMR_MACH_FLASH_H + +struct mtd_partition; + +struct flash_platform_data { + const char *map_name; + int width; + int (*init)(void); + void (*exit)(void); + void (*set_vpp)(int on); +}; + +#endif diff -Nru a/include/asm-arm/memory.h b/include/asm-arm/memory.h --- a/include/asm-arm/memory.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/memory.h Wed Oct 8 12:24:57 2003 @@ -84,24 +84,24 @@ #define PHYS_TO_NID(addr) (0) -#else +#else /* CONFIG_DISCONTIGMEM */ + /* * This is more complex. We have a set of mem_map arrays spread * around in memory. */ +#include + #define page_to_pfn(page) \ (( (page) - page_zone(page)->zone_mem_map) \ + page_zone(page)->zone_start_pfn) - #define pfn_to_page(pfn) \ (PFN_TO_MAPBASE(pfn) + LOCAL_MAP_NR((pfn) << PAGE_SHIFT)) - -#define pfn_valid(pfn) (PFN_TO_NID(pfn) < NR_NODES) +#define pfn_valid(pfn) (PFN_TO_NID(pfn) < MAX_NUMNODES) #define virt_to_page(kaddr) \ (ADDR_TO_MAPBASE(kaddr) + LOCAL_MAP_NR(kaddr)) - -#define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < NR_NODES) +#define virt_addr_valid(kaddr) (KVADDR_TO_NID(kaddr) < MAX_NUMNODES) /* * Common discontigmem stuff. @@ -109,7 +109,7 @@ */ #define PHYS_TO_NID(addr) PFN_TO_NID((addr) >> PAGE_SHIFT) -#endif +#endif /* !CONFIG_DISCONTIGMEM */ /* * For BIO. "will die". Kill me when bio_to_phys() and bvec_to_phys() die. diff -Nru a/include/asm-arm/numnodes.h b/include/asm-arm/numnodes.h --- a/include/asm-arm/numnodes.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm/numnodes.h Wed Oct 8 12:24:56 2003 @@ -10,8 +10,7 @@ #ifndef __ASM_ARM_NUMNODES_H #define __ASM_ARM_NUMNODES_H -#include - -#define MAX_NUMNODES NR_NODES +/* Max 4 Nodes */ +#define NODES_SHIFT 2 #endif diff -Nru a/include/asm-arm/unistd.h b/include/asm-arm/unistd.h --- a/include/asm-arm/unistd.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm/unistd.h Wed Oct 8 12:24:57 2003 @@ -32,7 +32,7 @@ #define __NR_write (__NR_SYSCALL_BASE+ 4) #define __NR_open (__NR_SYSCALL_BASE+ 5) #define __NR_close (__NR_SYSCALL_BASE+ 6) -#define __NR_waitpid (__NR_SYSCALL_BASE+ 7) /* removed */ + /* 7 was sys_waitpid */ #define __NR_creat (__NR_SYSCALL_BASE+ 8) #define __NR_link (__NR_SYSCALL_BASE+ 9) #define __NR_unlink (__NR_SYSCALL_BASE+ 10) @@ -42,7 +42,7 @@ #define __NR_mknod (__NR_SYSCALL_BASE+ 14) #define __NR_chmod (__NR_SYSCALL_BASE+ 15) #define __NR_lchown (__NR_SYSCALL_BASE+ 16) -#define __NR_break (__NR_SYSCALL_BASE+ 17) /* removed */ + /* 17 was sys_break */ /* 18 was sys_stat */ #define __NR_lseek (__NR_SYSCALL_BASE+ 19) #define __NR_getpid (__NR_SYSCALL_BASE+ 20) @@ -53,14 +53,14 @@ #define __NR_stime (__NR_SYSCALL_BASE+ 25) #define __NR_ptrace (__NR_SYSCALL_BASE+ 26) #define __NR_alarm (__NR_SYSCALL_BASE+ 27) - + /* 28 was sys_fstat */ #define __NR_pause (__NR_SYSCALL_BASE+ 29) #define __NR_utime (__NR_SYSCALL_BASE+ 30) -#define __NR_stty (__NR_SYSCALL_BASE+ 31) /* removed */ -#define __NR_gtty (__NR_SYSCALL_BASE+ 32) /* removed */ + /* 31 was sys_stty */ + /* 32 was sys_gtty */ #define __NR_access (__NR_SYSCALL_BASE+ 33) #define __NR_nice (__NR_SYSCALL_BASE+ 34) -#define __NR_ftime (__NR_SYSCALL_BASE+ 35) /* removed */ + /* 35 was sys_ftime */ #define __NR_sync (__NR_SYSCALL_BASE+ 36) #define __NR_kill (__NR_SYSCALL_BASE+ 37) #define __NR_rename (__NR_SYSCALL_BASE+ 38) @@ -69,21 +69,21 @@ #define __NR_dup (__NR_SYSCALL_BASE+ 41) #define __NR_pipe (__NR_SYSCALL_BASE+ 42) #define __NR_times (__NR_SYSCALL_BASE+ 43) -#define __NR_prof (__NR_SYSCALL_BASE+ 44) /* removed */ + /* 44 was sys_prof */ #define __NR_brk (__NR_SYSCALL_BASE+ 45) #define __NR_setgid (__NR_SYSCALL_BASE+ 46) #define __NR_getgid (__NR_SYSCALL_BASE+ 47) -#define __NR_signal (__NR_SYSCALL_BASE+ 48) /* removed */ + /* 48 was sys_signal */ #define __NR_geteuid (__NR_SYSCALL_BASE+ 49) #define __NR_getegid (__NR_SYSCALL_BASE+ 50) #define __NR_acct (__NR_SYSCALL_BASE+ 51) #define __NR_umount2 (__NR_SYSCALL_BASE+ 52) -#define __NR_lock (__NR_SYSCALL_BASE+ 53) /* removed */ + /* 53 was sys_lock */ #define __NR_ioctl (__NR_SYSCALL_BASE+ 54) #define __NR_fcntl (__NR_SYSCALL_BASE+ 55) -#define __NR_mpx (__NR_SYSCALL_BASE+ 56) /* removed */ + /* 56 was sys_mpx */ #define __NR_setpgid (__NR_SYSCALL_BASE+ 57) -#define __NR_ulimit (__NR_SYSCALL_BASE+ 58) /* removed */ + /* 58 was sys_ulimit */ /* 59 was sys_olduname */ #define __NR_umask (__NR_SYSCALL_BASE+ 60) #define __NR_chroot (__NR_SYSCALL_BASE+ 61) @@ -93,8 +93,8 @@ #define __NR_getpgrp (__NR_SYSCALL_BASE+ 65) #define __NR_setsid (__NR_SYSCALL_BASE+ 66) #define __NR_sigaction (__NR_SYSCALL_BASE+ 67) -#define __NR_sgetmask (__NR_SYSCALL_BASE+ 68) /* removed */ -#define __NR_ssetmask (__NR_SYSCALL_BASE+ 69) /* removed */ + /* 68 was sys_sgetmask */ + /* 69 was sys_ssetmask */ #define __NR_setreuid (__NR_SYSCALL_BASE+ 70) #define __NR_setregid (__NR_SYSCALL_BASE+ 71) #define __NR_sigsuspend (__NR_SYSCALL_BASE+ 72) @@ -123,10 +123,10 @@ #define __NR_fchown (__NR_SYSCALL_BASE+ 95) #define __NR_getpriority (__NR_SYSCALL_BASE+ 96) #define __NR_setpriority (__NR_SYSCALL_BASE+ 97) -#define __NR_profil (__NR_SYSCALL_BASE+ 98) /* removed */ + /* 98 was sys_profil */ #define __NR_statfs (__NR_SYSCALL_BASE+ 99) #define __NR_fstatfs (__NR_SYSCALL_BASE+100) -#define __NR_ioperm (__NR_SYSCALL_BASE+101) + /* 101 was sys_ioperm */ #define __NR_socketcall (__NR_SYSCALL_BASE+102) #define __NR_syslog (__NR_SYSCALL_BASE+103) #define __NR_setitimer (__NR_SYSCALL_BASE+104) @@ -137,7 +137,7 @@ /* 109 was sys_uname */ /* 110 was sys_iopl */ #define __NR_vhangup (__NR_SYSCALL_BASE+111) -#define __NR_idle (__NR_SYSCALL_BASE+112) + /* 112 was sys_idle */ #define __NR_syscall (__NR_SYSCALL_BASE+113) /* syscall to call a syscall! */ #define __NR_wait4 (__NR_SYSCALL_BASE+114) #define __NR_swapoff (__NR_SYSCALL_BASE+115) @@ -148,21 +148,21 @@ #define __NR_clone (__NR_SYSCALL_BASE+120) #define __NR_setdomainname (__NR_SYSCALL_BASE+121) #define __NR_uname (__NR_SYSCALL_BASE+122) -#define __NR_modify_ldt (__NR_SYSCALL_BASE+123) + /* 123 was sys_modify_ldt */ #define __NR_adjtimex (__NR_SYSCALL_BASE+124) #define __NR_mprotect (__NR_SYSCALL_BASE+125) #define __NR_sigprocmask (__NR_SYSCALL_BASE+126) -#define __NR_create_module (__NR_SYSCALL_BASE+127) /* removed */ + /* 127 was sys_create_module */ #define __NR_init_module (__NR_SYSCALL_BASE+128) #define __NR_delete_module (__NR_SYSCALL_BASE+129) -#define __NR_get_kernel_syms (__NR_SYSCALL_BASE+130) /* removed */ + /* 130 was sys_get_kernel_syms */ #define __NR_quotactl (__NR_SYSCALL_BASE+131) #define __NR_getpgid (__NR_SYSCALL_BASE+132) #define __NR_fchdir (__NR_SYSCALL_BASE+133) #define __NR_bdflush (__NR_SYSCALL_BASE+134) #define __NR_sysfs (__NR_SYSCALL_BASE+135) #define __NR_personality (__NR_SYSCALL_BASE+136) -#define __NR_afs_syscall (__NR_SYSCALL_BASE+137) /* Syscall for Andrew File System */ + /* 137 was sys_afs_syscall */ #define __NR_setfsuid (__NR_SYSCALL_BASE+138) #define __NR_setfsgid (__NR_SYSCALL_BASE+139) #define __NR__llseek (__NR_SYSCALL_BASE+140) @@ -191,8 +191,8 @@ #define __NR_mremap (__NR_SYSCALL_BASE+163) #define __NR_setresuid (__NR_SYSCALL_BASE+164) #define __NR_getresuid (__NR_SYSCALL_BASE+165) -#define __NR_vm86 (__NR_SYSCALL_BASE+166) /* removed */ -#define __NR_query_module (__NR_SYSCALL_BASE+167) /* removed */ + /* 166 was sys_vm86 */ + /* 167 was sys_query_module */ #define __NR_poll (__NR_SYSCALL_BASE+168) #define __NR_nfsservctl (__NR_SYSCALL_BASE+169) #define __NR_setresgid (__NR_SYSCALL_BASE+170) diff -Nru a/include/asm-arm26/cacheflush.h b/include/asm-arm26/cacheflush.h --- a/include/asm-arm26/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-arm26/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -25,6 +25,8 @@ #define flush_cache_range(vma,start,end) do { } while (0) #define flush_cache_page(vma,vmaddr) do { } while (0) #define flush_page_to_ram(page) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) #define invalidate_dcache_range(start,end) do { } while (0) #define clean_dcache_range(start,end) do { } while (0) @@ -36,6 +38,11 @@ #define flush_icache_user_range(start,end, bob, fred) do { } while (0) #define flush_icache_range(start,end) do { } while (0) #define flush_icache_page(vma,page) do { } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) /* DAG: ARM3 will flush cache on MEMC updates anyway? so don't bother */ /* IM : Yes, it will, but only if setup to do so (we do this). */ diff -Nru a/include/asm-arm26/pgtable.h b/include/asm-arm26/pgtable.h --- a/include/asm-arm26/pgtable.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-arm26/pgtable.h Wed Oct 8 12:24:55 2003 @@ -173,7 +173,6 @@ * area for the same reason. ;) FIXME: surely 1 page not 4k ? */ #define VMALLOC_START 0x01a00000 -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END 0x01c00000 /* Is pmd_page supposed to return a pointer to a page in some arches? ours seems to diff -Nru a/include/asm-arm26/serial.h b/include/asm-arm26/serial.h --- a/include/asm-arm26/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-arm26/serial.h Wed Oct 8 12:24:56 2003 @@ -27,8 +27,6 @@ #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) -#define RS_TABLE_SIZE 16 - #if defined(CONFIG_ARCH_A5K) /* UART CLK PORT IRQ FLAGS */ diff -Nru a/include/asm-cris/arch-v10/pgtable.h b/include/asm-cris/arch-v10/pgtable.h --- a/include/asm-cris/arch-v10/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-cris/arch-v10/pgtable.h Wed Oct 8 12:24:57 2003 @@ -7,11 +7,9 @@ #ifdef CONFIG_CRIS_LOW_MAP #define VMALLOC_START KSEG_7 -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END KSEG_8 #else #define VMALLOC_START KSEG_D -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END KSEG_E #endif diff -Nru a/include/asm-cris/cacheflush.h b/include/asm-cris/cacheflush.h --- a/include/asm-cris/cacheflush.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-cris/cacheflush.h Wed Oct 8 12:24:55 2003 @@ -16,6 +16,13 @@ #define flush_icache_range(start, end) do { } while (0) #define flush_icache_page(vma,pg) do { } while (0) #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) void global_flush_tlb(void); int change_page_attr(struct page *page, int numpages, pgprot_t prot); diff -Nru a/include/asm-h8300/cacheflush.h b/include/asm-h8300/cacheflush.h --- a/include/asm-h8300/cacheflush.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-h8300/cacheflush.h Wed Oct 8 12:24:56 2003 @@ -11,7 +11,6 @@ */ #define flush_cache_all() -#define flush_cache_all() #define flush_cache_mm(mm) #define flush_cache_range(vma,a,b) #define flush_cache_page(vma,p) @@ -20,6 +19,8 @@ #define flush_icache() #define flush_icache_page(vma,page) #define flush_icache_range(start,len) +#define flush_cache_vmap(start, end) +#define flush_cache_vunmap(start, end) #define cache_push_v(vaddr,len) #define cache_push(paddr,len) #define cache_clear(paddr,len) @@ -27,5 +28,10 @@ #define flush_dcache_range(a,b) #define flush_icache_user_range(vma,page,addr,len) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) #endif /* _ASM_H8300_CACHEFLUSH_H */ diff -Nru a/include/asm-i386/cacheflush.h b/include/asm-i386/cacheflush.h --- a/include/asm-i386/cacheflush.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-i386/cacheflush.h Wed Oct 8 12:24:56 2003 @@ -13,6 +13,13 @@ #define flush_icache_range(start, end) do { } while (0) #define flush_icache_page(vma,pg) do { } while (0) #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) void global_flush_tlb(void); int change_page_attr(struct page *page, int numpages, pgprot_t prot); diff -Nru a/include/asm-i386/elf.h b/include/asm-i386/elf.h --- a/include/asm-i386/elf.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-i386/elf.h Wed Oct 8 12:24:57 2003 @@ -127,11 +127,6 @@ #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) #define ELF_CORE_COPY_XFPREGS(tsk, elf_xfpregs) dump_task_extended_fpu(tsk, elf_xfpregs) -#ifdef CONFIG_SMP -extern void dump_smp_unlazy_fpu(void); -#define ELF_CORE_SYNC dump_smp_unlazy_fpu -#endif - #define VSYSCALL_BASE (__fix_to_virt(FIX_VSYSCALL)) #define VSYSCALL_EHDR ((const struct elfhdr *) VSYSCALL_BASE) #define VSYSCALL_ENTRY ((unsigned long) &__kernel_vsyscall) @@ -162,7 +157,10 @@ for (i = 0; i < VSYSCALL_EHDR->e_phnum; ++i) { \ struct elf_phdr phdr = vsyscall_phdrs[i]; \ if (phdr.p_type == PT_LOAD) { \ + BUG_ON(ofs != 0); \ ofs = phdr.p_offset = offset; \ + phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); \ + phdr.p_filesz = phdr.p_memsz; \ offset += phdr.p_filesz; \ } \ else \ @@ -180,7 +178,7 @@ for (i = 0; i < VSYSCALL_EHDR->e_phnum; ++i) { \ if (vsyscall_phdrs[i].p_type == PT_LOAD) \ DUMP_WRITE((void *) vsyscall_phdrs[i].p_vaddr, \ - vsyscall_phdrs[i].p_filesz); \ + PAGE_ALIGN(vsyscall_phdrs[i].p_memsz)); \ } \ } while (0) diff -Nru a/include/asm-i386/highmem.h b/include/asm-i386/highmem.h --- a/include/asm-i386/highmem.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-i386/highmem.h Wed Oct 8 12:24:55 2003 @@ -63,6 +63,8 @@ void kunmap_atomic(void *kvaddr, enum km_type type); struct page *kmap_atomic_to_page(void *ptr); +#define flush_cache_kmaps() do { } while (0) + #endif /* __KERNEL__ */ #endif /* _ASM_HIGHMEM_H */ diff -Nru a/include/asm-i386/i387.h b/include/asm-i386/i387.h --- a/include/asm-i386/i387.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-i386/i387.h Wed Oct 8 12:24:57 2003 @@ -12,7 +12,6 @@ #define __ASM_I386_I387_H #include -#include #include #include #include diff -Nru a/include/asm-i386/mman.h b/include/asm-i386/mman.h --- a/include/asm-i386/mman.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-i386/mman.h Wed Oct 8 12:24:55 2003 @@ -8,8 +8,6 @@ #define PROT_NONE 0x0 /* page can not be accessed */ #define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ #define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ -#define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ -#define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ #define MAP_SHARED 0x01 /* Share changes */ #define MAP_PRIVATE 0x02 /* Changes are private */ diff -Nru a/include/asm-i386/numaq.h b/include/asm-i386/numaq.h --- a/include/asm-i386/numaq.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-i386/numaq.h Wed Oct 8 12:24:56 2003 @@ -28,7 +28,6 @@ #ifdef CONFIG_X86_NUMAQ -#define MAX_NUMNODES 16 extern int get_memcfg_numaq(void); /* diff -Nru a/include/asm-i386/numnodes.h b/include/asm-i386/numnodes.h --- a/include/asm-i386/numnodes.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-i386/numnodes.h Wed Oct 8 12:24:56 2003 @@ -4,11 +4,15 @@ #include #ifdef CONFIG_X86_NUMAQ -#include -#elif CONFIG_ACPI_SRAT -#include -#else -#define MAX_NUMNODES 1 + +/* Max 16 Nodes */ +#define NODES_SHIFT 4 + +#elif defined(CONFIG_ACPI_SRAT) + +/* Max 8 Nodes */ +#define NODES_SHIFT 3 + #endif /* CONFIG_X86_NUMAQ */ #endif /* _ASM_MAX_NUMNODES_H */ diff -Nru a/include/asm-i386/pgtable.h b/include/asm-i386/pgtable.h --- a/include/asm-i386/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-i386/pgtable.h Wed Oct 8 12:24:57 2003 @@ -85,7 +85,6 @@ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long) high_memory + 2*VMALLOC_OFFSET-1) & \ ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #ifdef CONFIG_HIGHMEM # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) #else diff -Nru a/include/asm-i386/serial.h b/include/asm-i386/serial.h --- a/include/asm-i386/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-i386/serial.h Wed Oct 8 12:24:57 2003 @@ -27,9 +27,6 @@ #define ACCENT_FLAGS 0 #define BOCA_FLAGS 0 #define HUB6_FLAGS 0 -#define RS_TABLE_SIZE 64 -#else -#define RS_TABLE_SIZE #endif #define MCA_COM_FLAGS (STD_COM_FLAGS|ASYNC_BOOT_ONLYMCA) diff -Nru a/include/asm-i386/srat.h b/include/asm-i386/srat.h --- a/include/asm-i386/srat.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-i386/srat.h Wed Oct 8 12:24:56 2003 @@ -31,7 +31,6 @@ #error CONFIG_ACPI_SRAT not defined, and srat.h header has been included #endif -#define MAX_NUMNODES 8 extern int get_memcfg_from_srat(void); extern unsigned long *get_zholes_size(int); diff -Nru a/include/asm-i386/unistd.h b/include/asm-i386/unistd.h --- a/include/asm-i386/unistd.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-i386/unistd.h Wed Oct 8 12:24:57 2003 @@ -278,8 +278,9 @@ #define __NR_tgkill 270 #define __NR_utimes 271 #define __NR_fadvise64_64 272 +#define __NR_vserver 273 -#define NR_syscalls 273 +#define NR_syscalls 274 /* user-visible error numbers are in the range -1 - -124: see */ diff -Nru a/include/asm-ia64/acpi.h b/include/asm-ia64/acpi.h --- a/include/asm-ia64/acpi.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ia64/acpi.h Wed Oct 8 12:24:57 2003 @@ -99,7 +99,7 @@ /* Proximity bitmap length; _PXM is at most 255 (8 bit)*/ #define MAX_PXM_DOMAINS (256) extern int __initdata pxm_to_nid_map[MAX_PXM_DOMAINS]; -extern int __initdata nid_to_pxm_map[NR_NODES]; +extern int __initdata nid_to_pxm_map[MAX_NUMNODES]; #endif #endif /*__KERNEL__*/ diff -Nru a/include/asm-ia64/cacheflush.h b/include/asm-ia64/cacheflush.h --- a/include/asm-ia64/cacheflush.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-ia64/cacheflush.h Wed Oct 8 12:24:56 2003 @@ -21,6 +21,8 @@ #define flush_cache_range(vma, start, end) do { } while (0) #define flush_cache_page(vma, vmaddr) do { } while (0) #define flush_icache_page(vma,page) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) #define flush_dcache_page(page) \ do { \ @@ -34,5 +36,12 @@ unsigned long _addr = (unsigned long) page_address(page) + ((user_addr) & ~PAGE_MASK); \ flush_icache_range(_addr, _addr + (len)); \ } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) #endif /* _ASM_IA64_CACHEFLUSH_H */ diff -Nru a/include/asm-ia64/elf.h b/include/asm-ia64/elf.h --- a/include/asm-ia64/elf.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ia64/elf.h Wed Oct 8 12:24:57 2003 @@ -206,42 +206,51 @@ NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR); \ } while (0) + /* - * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out extra segments - * containing the gate DSO contents. Dumping its contents makes post-mortem fully - * interpretable later without matching up the same kernel and hardware config to see what - * IP values meant. Dumping its extra ELF program headers includes all the other - * information a debugger needs to easily find how the gate DSO was being used. + * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out + * extra segments containing the gate DSO contents. Dumping its + * contents makes post-mortem fully interpretable later without matching up + * the same kernel and hardware config to see what PC values meant. + * Dumping its extra ELF program headers includes all the other information + * a debugger needs to easily find how the gate DSO was being used. */ #define ELF_CORE_EXTRA_PHDRS (GATE_EHDR->e_phnum) #define ELF_CORE_WRITE_EXTRA_PHDRS \ do { \ - const struct elf_phdr *const gate_phdrs = \ - (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); \ + const struct elf_phdr *const gate_phdrs = \ + (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); \ int i; \ - Elf64_Off ofs = 0; \ + Elf64_Off ofs = 0; \ for (i = 0; i < GATE_EHDR->e_phnum; ++i) { \ - struct elf_phdr phdr = gate_phdrs[i]; \ + struct elf_phdr phdr = gate_phdrs[i]; \ if (phdr.p_type == PT_LOAD) { \ - ofs = phdr.p_offset = offset; \ + phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); \ + phdr.p_filesz = phdr.p_memsz; \ + if (ofs == 0) { \ + ofs = phdr.p_offset = offset; \ offset += phdr.p_filesz; \ - } else \ + } \ + else \ + phdr.p_offset = ofs; \ + } \ + else \ phdr.p_offset += ofs; \ phdr.p_paddr = 0; /* match other core phdrs */ \ DUMP_WRITE(&phdr, sizeof(phdr)); \ } \ } while (0) - #define ELF_CORE_WRITE_EXTRA_DATA \ do { \ - const struct elf_phdr *const gate_phdrs = \ - (const struct elf_phdr *) (GATE_ADDR \ - + GATE_EHDR->e_phoff); \ + const struct elf_phdr *const gate_phdrs = \ + (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); \ int i; \ for (i = 0; i < GATE_EHDR->e_phnum; ++i) { \ - if (gate_phdrs[i].p_type == PT_LOAD) \ - DUMP_WRITE((void *) gate_phdrs[i].p_vaddr, \ - gate_phdrs[i].p_filesz); \ + if (gate_phdrs[i].p_type == PT_LOAD) { \ + DUMP_WRITE((void *) gate_phdrs[i].p_vaddr, \ + PAGE_ALIGN(gate_phdrs[i].p_memsz)); \ + break; \ + } \ } \ } while (0) diff -Nru a/include/asm-ia64/mmzone.h b/include/asm-ia64/mmzone.h --- a/include/asm-ia64/mmzone.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ia64/mmzone.h Wed Oct 8 12:24:57 2003 @@ -92,14 +92,12 @@ extern unsigned long max_low_pfn; -#ifdef CONFIG_IA64_DIG +#if defined(CONFIG_IA64_DIG) /* * Platform definitions for DIG platform with contiguous memory. */ -#define MAX_PHYSNODE_ID 8 /* Maximum node number +1 */ -#define NR_NODES 8 /* Maximum number of nodes in SSI */ - +#define MAX_PHYSNODE_ID 8 /* Maximum node number +1 */ #define MAX_PHYS_MEMORY (1UL << 40) /* 1 TB */ /* @@ -119,37 +117,34 @@ # error Unsupported bank and nodesize! #endif #define BANKSIZE (1UL << BANKSHIFT) -#define BANK_OFFSET(addr) ((unsigned long)(addr) & (BANKSIZE-1)) -#define NR_BANKS (NR_BANKS_PER_NODE * NR_NODES) - -/* - * VALID_MEM_KADDR returns a boolean to indicate if a kaddr is - * potentially a valid cacheable identity mapped RAM memory address. - * Note that the RAM may or may not actually be present!! - */ -#define VALID_MEM_KADDR(kaddr) 1 - -/* - * Given a nodeid & a bank number, find the address of the mem_map - * entry for the first page of the bank. - */ -#define BANK_MEM_MAP_INDEX(kaddr) \ - (((unsigned long)(kaddr) & (MAX_PHYS_MEMORY-1)) >> BANKSHIFT) #elif defined(CONFIG_IA64_SGI_SN2) + /* * SGI SN2 discontig definitions */ #define MAX_PHYSNODE_ID 2048 /* 2048 node ids (also called nasid) */ -#define NR_NODES 128 /* Maximum number of nodes in SSI */ #define MAX_PHYS_MEMORY (1UL << 49) -#define BANKSHIFT 38 #define NR_BANKS_PER_NODE 4 +#define BANKSHIFT 38 #define SN2_NODE_SIZE (64UL*1024*1024*1024) /* 64GB per node */ #define BANKSIZE (SN2_NODE_SIZE/NR_BANKS_PER_NODE) + +#endif /* CONFIG_IA64_DIG */ + +#if defined(CONFIG_IA64_DIG) || defined (CONFIG_IA64_SGI_SN2) +/* Common defines for both platforms */ +#include #define BANK_OFFSET(addr) ((unsigned long)(addr) & (BANKSIZE-1)) -#define NR_BANKS (NR_BANKS_PER_NODE * NR_NODES) +#define NR_BANKS (NR_BANKS_PER_NODE * (1 << NODES_SHIFT)) +#define NR_MEMBLKS (NR_BANKS) + +/* + * VALID_MEM_KADDR returns a boolean to indicate if a kaddr is + * potentially a valid cacheable identity mapped RAM memory address. + * Note that the RAM may or may not actually be present!! + */ #define VALID_MEM_KADDR(kaddr) 1 /* @@ -159,5 +154,6 @@ #define BANK_MEM_MAP_INDEX(kaddr) \ (((unsigned long)(kaddr) & (MAX_PHYS_MEMORY-1)) >> BANKSHIFT) -#endif /* CONFIG_IA64_DIG */ +#endif /* CONFIG_IA64_DIG || CONFIG_IA64_SGI_SN2 */ + #endif /* _ASM_IA64_MMZONE_H */ diff -Nru a/include/asm-ia64/nodedata.h b/include/asm-ia64/nodedata.h --- a/include/asm-ia64/nodedata.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ia64/nodedata.h Wed Oct 8 12:24:57 2003 @@ -8,12 +8,10 @@ * Copyright (c) 2002 Erich Focht * Copyright (c) 2002 Kimio Suganuma */ - - #ifndef _ASM_IA64_NODEDATA_H #define _ASM_IA64_NODEDATA_H - +#include #include /* @@ -24,9 +22,9 @@ struct ia64_node_data { short active_cpu_count; short node; - struct pglist_data *pg_data_ptrs[NR_NODES]; + struct pglist_data *pg_data_ptrs[MAX_NUMNODES]; struct page *bank_mem_map_base[NR_BANKS]; - struct ia64_node_data *node_data_ptrs[NR_NODES]; + struct ia64_node_data *node_data_ptrs[MAX_NUMNODES]; short node_id_map[NR_BANKS]; }; diff -Nru a/include/asm-ia64/numa.h b/include/asm-ia64/numa.h --- a/include/asm-ia64/numa.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-ia64/numa.h Wed Oct 8 12:24:56 2003 @@ -16,17 +16,11 @@ #ifdef CONFIG_NUMA -#ifdef CONFIG_DISCONTIGMEM -# include -# define NR_MEMBLKS (NR_BANKS) -#else -# define NR_NODES (8) -# define NR_MEMBLKS (NR_NODES * 8) -#endif - +#include #include + extern volatile char cpu_to_node_map[NR_CPUS] __cacheline_aligned; -extern volatile cpumask_t node_to_cpu_mask[NR_NODES] __cacheline_aligned; +extern volatile cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned; /* Stuff below this line could be architecture independent */ @@ -60,7 +54,7 @@ * proportional to the memory access latency ratios. */ -extern u8 numa_slit[NR_NODES * NR_NODES]; +extern u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES]; #define node_distance(from,to) (numa_slit[from * numnodes + to]) extern int paddr_to_nid(unsigned long paddr); diff -Nru a/include/asm-ia64/numnodes.h b/include/asm-ia64/numnodes.h --- a/include/asm-ia64/numnodes.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ia64/numnodes.h Wed Oct 8 12:24:57 2003 @@ -1,7 +1,12 @@ #ifndef _ASM_MAX_NUMNODES_H #define _ASM_MAX_NUMNODES_H -#include -#define MAX_NUMNODES NR_NODES +#ifdef CONFIG_IA64_DIG +/* Max 8 Nodes */ +#define NODES_SHIFT 3 +#elif defined(CONFIG_IA64_SGI_SN2) +/* Max 128 Nodes */ +#define NODES_SHIFT 7 +#endif #endif /* _ASM_MAX_NUMNODES_H */ diff -Nru a/include/asm-ia64/pgtable.h b/include/asm-ia64/pgtable.h --- a/include/asm-ia64/pgtable.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-ia64/pgtable.h Wed Oct 8 12:24:56 2003 @@ -207,7 +207,6 @@ #define RGN_KERNEL 7 #define VMALLOC_START 0xa000000200000000 -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #ifdef CONFIG_VIRTUAL_MEM_MAP # define VMALLOC_END_INIT (0xa000000000000000 + (1UL << (4*PAGE_SHIFT - 9))) # define VMALLOC_END vmalloc_end diff -Nru a/include/asm-ia64/sn/pda.h b/include/asm-ia64/sn/pda.h --- a/include/asm-ia64/sn/pda.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ia64/sn/pda.h Wed Oct 8 12:24:57 2003 @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -56,7 +57,7 @@ unsigned long sn_soft_irr[4]; unsigned long sn_in_service_ivecs[4]; - short cnodeid_to_nasid_table[NR_NODES]; + short cnodeid_to_nasid_table[MAX_NUMNODES]; int sn_lb_int_war_ticks; int sn_last_irq; int sn_first_irq; diff -Nru a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h --- a/include/asm-m68k/bitops.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-m68k/bitops.h Wed Oct 8 12:24:57 2003 @@ -164,9 +164,10 @@ return ((1UL << (nr & 31)) & (((const volatile unsigned long *) vaddr)[nr >> 5])) != 0; } -extern __inline__ int find_first_zero_bit(unsigned long * vaddr, unsigned size) +extern __inline__ int find_first_zero_bit(const unsigned long *vaddr, + unsigned size) { - unsigned long *p = vaddr, *addr = vaddr; + const unsigned long *p = vaddr, *addr = vaddr; unsigned long allones = ~0UL; int res; unsigned long num; @@ -187,11 +188,11 @@ return ((p - addr) << 5) + (res ^ 31); } -extern __inline__ int find_next_zero_bit (unsigned long *vaddr, int size, +extern __inline__ int find_next_zero_bit (const unsigned long *vaddr, int size, int offset) { - unsigned long *addr = vaddr; - unsigned long *p = addr + (offset >> 5); + const unsigned long *addr = vaddr; + const unsigned long *p = addr + (offset >> 5); int set = 0, bit = offset & 31UL, res; if (offset >= size) @@ -263,7 +264,7 @@ * unlikely to be set. It's guaranteed that at least one of the 140 * bits is cleared. */ -static inline int sched_find_first_bit(unsigned long *b) +static inline int sched_find_first_bit(const unsigned long *b) { if (unlikely(b[0])) return __ffs(b[0]); diff -Nru a/include/asm-m68k/cacheflush.h b/include/asm-m68k/cacheflush.h --- a/include/asm-m68k/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-m68k/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -80,6 +80,9 @@ #define flush_cache_all() __flush_cache_all() +#define flush_cache_vmap(start, end) flush_cache_all() +#define flush_cache_vunmap(start, end) flush_cache_all() + extern inline void flush_cache_mm(struct mm_struct *mm) { if (mm == current->mm) @@ -127,6 +130,10 @@ #define flush_dcache_page(page) __flush_page_to_ram(page_address(page)) #define flush_icache_page(vma, page) __flush_page_to_ram(page_address(page)) #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) extern void flush_icache_range(unsigned long address, unsigned long endaddr); diff -Nru a/include/asm-m68k/pci.h b/include/asm-m68k/pci.h --- a/include/asm-m68k/pci.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-m68k/pci.h Wed Oct 8 12:24:56 2003 @@ -7,6 +7,8 @@ * Written by Wout Klaren. */ +#include + struct pci_ops; /* diff -Nru a/include/asm-m68k/pgtable.h b/include/asm-m68k/pgtable.h --- a/include/asm-m68k/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-m68k/pgtable.h Wed Oct 8 12:24:57 2003 @@ -79,12 +79,10 @@ */ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END KMAP_START #else extern unsigned long vmalloc_end; #define VMALLOC_START 0x0f800000 -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END vmalloc_end #endif /* CONFIG_SUN3 */ diff -Nru a/include/asm-m68k/serial.h b/include/asm-m68k/serial.h --- a/include/asm-m68k/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-m68k/serial.h Wed Oct 8 12:24:57 2003 @@ -30,9 +30,6 @@ #define FOURPORT_FLAGS ASYNC_FOURPORT #define ACCENT_FLAGS 0 #define BOCA_FLAGS 0 -#define RS_TABLE_SIZE 64 -#else -#define RS_TABLE_SIZE 4 #endif #define STD_SERIAL_PORT_DEFNS \ diff -Nru a/include/asm-m68k/zorro.h b/include/asm-m68k/zorro.h --- a/include/asm-m68k/zorro.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-m68k/zorro.h Wed Oct 8 12:24:56 2003 @@ -42,4 +42,4 @@ #define z_iounmap iounmap #define z_ioremap z_remap_nocache_ser -#endif /* _ASM_ZORRO_H */ +#endif /* _ASM_M68K_ZORRO_H */ diff -Nru a/include/asm-m68knommu/cacheflush.h b/include/asm-m68knommu/cacheflush.h --- a/include/asm-m68knommu/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-m68knommu/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -15,7 +15,13 @@ #define flush_icache_range(start,len) __flush_cache_all() #define flush_icache_page(vma,pg) do { } while (0) #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define flush_cache_vmap(start, end) flush_cache_all() +#define flush_cache_vunmap(start, end) flush_cache_all() +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) extern inline void __flush_cache_all(void) { diff -Nru a/include/asm-mips/cacheflush.h b/include/asm-mips/cacheflush.h --- a/include/asm-mips/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-mips/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -43,7 +43,15 @@ extern void (*flush_icache_range)(unsigned long start, unsigned long end); #define flush_icache_user_range(vma, page, addr, len) \ flush_icache_page(vma, page) +#define flush_cache_vmap(start, end) flush_cache_all() +#define flush_cache_vunmap(start, end) flush_cache_all() +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) extern void (*flush_cache_sigtramp)(unsigned long addr); extern void (*flush_icache_all)(void); diff -Nru a/include/asm-mips/highmem.h b/include/asm-mips/highmem.h --- a/include/asm-mips/highmem.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-mips/highmem.h Wed Oct 8 12:24:57 2003 @@ -54,6 +54,8 @@ extern void kunmap_atomic(void *kvaddr, enum km_type type); extern struct page *kmap_atomic_to_page(void *ptr); +#define flush_cache_kmaps() flush_cache_all() + #endif /* __KERNEL__ */ #endif /* _ASM_HIGHMEM_H */ diff -Nru a/include/asm-mips/pgtable-32.h b/include/asm-mips/pgtable-32.h --- a/include/asm-mips/pgtable-32.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-mips/pgtable-32.h Wed Oct 8 12:24:56 2003 @@ -79,7 +79,6 @@ #define FIRST_USER_PGD_NR 0 #define VMALLOC_START KSEG2 -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #if CONFIG_HIGHMEM # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) diff -Nru a/include/asm-mips/pgtable-64.h b/include/asm-mips/pgtable-64.h --- a/include/asm-mips/pgtable-64.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-mips/pgtable-64.h Wed Oct 8 12:24:55 2003 @@ -64,7 +64,6 @@ #define FIRST_USER_PGD_NR 0 #define VMALLOC_START XKSEG -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END \ (VMALLOC_START + ((1 << PGD_ORDER) * PTRS_PER_PTE * PAGE_SIZE)) diff -Nru a/include/asm-parisc/atomic.h b/include/asm-parisc/atomic.h --- a/include/asm-parisc/atomic.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-parisc/atomic.h Wed Oct 8 12:24:56 2003 @@ -129,8 +129,9 @@ /* It's possible to reduce all atomic operations to either - * __atomic_add_return, __atomic_set and __atomic_ret (the latter - * is there only for consistency). */ + * __atomic_add_return, atomic_set and atomic_read (the latter + * is there only for consistency). + */ static __inline__ int __atomic_add_return(int i, atomic_t *v) { @@ -144,7 +145,7 @@ return ret; } -static __inline__ void __atomic_set(atomic_t *v, int i) +static __inline__ void atomic_set(atomic_t *v, int i) { unsigned long flags; SPIN_LOCK_IRQSAVE(ATOMIC_HASH(v), flags); @@ -154,27 +155,24 @@ SPIN_UNLOCK_IRQRESTORE(ATOMIC_HASH(v), flags); } -static __inline__ int __atomic_read(atomic_t *v) +static __inline__ int atomic_read(const atomic_t *v) { return v->counter; } /* exported interface */ -#define atomic_add(i,v) ((void)(__atomic_add_return( (i),(v)))) -#define atomic_sub(i,v) ((void)(__atomic_add_return(-(i),(v)))) -#define atomic_inc(v) ((void)(__atomic_add_return( 1,(v)))) -#define atomic_dec(v) ((void)(__atomic_add_return( -1,(v)))) +#define atomic_add(i,v) ((void)(__atomic_add_return( ((int)i),(v)))) +#define atomic_sub(i,v) ((void)(__atomic_add_return(-((int)i),(v)))) +#define atomic_inc(v) ((void)(__atomic_add_return( 1,(v)))) +#define atomic_dec(v) ((void)(__atomic_add_return( -1,(v)))) -#define atomic_add_return(i,v) (__atomic_add_return( (i),(v))) -#define atomic_sub_return(i,v) (__atomic_add_return(-(i),(v))) +#define atomic_add_return(i,v) (__atomic_add_return( ((int)i),(v))) +#define atomic_sub_return(i,v) (__atomic_add_return(-((int)i),(v))) #define atomic_inc_return(v) (__atomic_add_return( 1,(v))) #define atomic_dec_return(v) (__atomic_add_return( -1,(v))) #define atomic_dec_and_test(v) (atomic_dec_return(v) == 0) - -#define atomic_set(v,i) (__atomic_set((v),i)) -#define atomic_read(v) (__atomic_read(v)) #define ATOMIC_INIT(i) { (i) } diff -Nru a/include/asm-parisc/bitops.h b/include/asm-parisc/bitops.h --- a/include/asm-parisc/bitops.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-parisc/bitops.h Wed Oct 8 12:24:55 2003 @@ -232,24 +232,24 @@ #if BITS_PER_LONG > 32 " ldi 63,%1\n" " extrd,u,*<> %0,63,32,%%r0\n" - " extrd,u,*TR %0,31,32,%0\n" + " extrd,u,*TR %0,31,32,%0\n" /* move top 32-bits down */ " addi -32,%1,%1\n" #else " ldi 31,%1\n" #endif " extru,<> %0,31,16,%%r0\n" - " extru,TR %0,15,16,%0\n" + " extru,TR %0,15,16,%0\n" /* xxxx0000 -> 0000xxxx */ " addi -16,%1,%1\n" " extru,<> %0,31,8,%%r0\n" - " extru,TR %0,23,8,%0\n" + " extru,TR %0,23,8,%0\n" /* 0000xx00 -> 000000xx */ " addi -8,%1,%1\n" " extru,<> %0,31,4,%%r0\n" - " extru,TR %0,27,4,%0\n" + " extru,TR %0,27,4,%0\n" /* 000000x0 -> 0000000x */ " addi -4,%1,%1\n" " extru,<> %0,31,2,%%r0\n" - " extru,TR %0,29,2,%0\n" + " extru,TR %0,29,2,%0\n" /* 0000000y, 1100b -> 0011b */ " addi -2,%1,%1\n" - " extru,= %0,31,1,%%r0\n" + " extru,= %0,31,1,%%r0\n" /* check last bit */ " addi -1,%1,%1\n" : "+r" (x), "=r" (ret) ); return ret; @@ -291,7 +291,7 @@ " zdep,TR %0,27,28,%0\n" /* x0000000 */ " addi 4,%1,%1\n" " extru,<> %0,1,2,%%r0\n" - " zdep,TR %0,29,30,%0\n" /* y0000000 (y&3 = 0 */ + " zdep,TR %0,29,30,%0\n" /* y0000000 (y&3 = 0) */ " addi 2,%1,%1\n" " extru,= %0,0,1,%%r0\n" " addi 1,%1,%1\n" /* if y & 8, add 1 */ diff -Nru a/include/asm-parisc/cacheflush.h b/include/asm-parisc/cacheflush.h --- a/include/asm-parisc/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-parisc/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -30,6 +30,9 @@ on_each_cpu(cacheflush_h_tmp_function, NULL, 1, 1); } +#define flush_cache_vmap(start, end) flush_cache_all() +#define flush_cache_vunmap(start, end) flush_cache_all() + /* The following value needs to be tuned and probably scaled with the * cache size. */ @@ -81,6 +84,13 @@ #define flush_icache_user_range(vma, page, addr, len) do { \ flush_user_dcache_range(addr, addr + len); \ flush_user_icache_range(addr, addr + len); } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) static inline void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) diff -Nru a/include/asm-parisc/checksum.h b/include/asm-parisc/checksum.h --- a/include/asm-parisc/checksum.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-parisc/checksum.h Wed Oct 8 12:24:55 2003 @@ -1,6 +1,8 @@ #ifndef _PARISC_CHECKSUM_H #define _PARISC_CHECKSUM_H +#include + /* * computes the checksum of a memory block at buff, length len, * and adds in "sum" (32-bit) diff -Nru a/include/asm-parisc/dma-mapping.h b/include/asm-parisc/dma-mapping.h --- a/include/asm-parisc/dma-mapping.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-parisc/dma-mapping.h Wed Oct 8 12:24:56 2003 @@ -2,6 +2,7 @@ #define _PARISC_DMA_MAPPING_H #include +#include #include /* diff -Nru a/include/asm-parisc/elf.h b/include/asm-parisc/elf.h --- a/include/asm-parisc/elf.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-parisc/elf.h Wed Oct 8 12:24:57 2003 @@ -144,6 +144,30 @@ #define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */ #define R_PARISC_HIRESERVE 255 +#define PA_PLABEL_FDESC 0x02 /* bit set if PLABEL points to + * a function descriptor, not + * an address */ + +/* The following are PA function descriptors + * + * addr: the absolute address of the function + * gp: either the data pointer (r27) for non-PIC code or the + * the PLT pointer (r19) for PIC code */ + +/* Format for the Elf32 Function descriptor */ +typedef struct elf32_fdesc { + __u32 addr; + __u32 gp; +} Elf32_Fdesc; + +/* Format for the Elf64 Function descriptor */ +typedef struct elf64_fdesc { + __u64 dummy[2]; /* FIXME: nothing uses these, why waste + * the space */ + __u64 addr; + __u64 gp; +} Elf64_Fdesc; + /* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */ #define PT_HP_TLS (PT_LOOS + 0x0) @@ -215,7 +239,10 @@ #ifdef __KERNEL__ #define SET_PERSONALITY(ex, ibcs2) \ - current->personality = PER_LINUX + current->personality = PER_LINUX; \ + current->thread.map_base = DEFAULT_MAP_BASE; \ + current->thread.task_size = DEFAULT_TASK_SIZE \ + #endif /* diff -Nru a/include/asm-parisc/ioctl.h b/include/asm-parisc/ioctl.h --- a/include/asm-parisc/ioctl.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-parisc/ioctl.h Wed Oct 8 12:24:55 2003 @@ -44,11 +44,21 @@ ((nr) << _IOC_NRSHIFT) | \ ((size) << _IOC_SIZESHIFT)) +/* provoke compile error for invalid uses of size argument */ +extern int __invalid_size_argument_for_IOC; +#define _IOC_TYPECHECK(t) \ + ((sizeof(t) == sizeof(t[1]) && \ + sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ + sizeof(t) : __invalid_size_argument_for_IOC) + /* used to create numbers */ #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) -#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) -#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) -#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) +#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) +#define _IOR_BAD(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) +#define _IOW_BAD(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) +#define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) /* used to decode ioctl numbers.. */ #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) diff -Nru a/include/asm-parisc/irq.h b/include/asm-parisc/irq.h --- a/include/asm-parisc/irq.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-parisc/irq.h Wed Oct 8 12:24:56 2003 @@ -17,6 +17,7 @@ #include #include +#include #define CPU_IRQ_REGION 1 diff -Nru a/include/asm-parisc/keyboard.h b/include/asm-parisc/keyboard.h --- a/include/asm-parisc/keyboard.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-parisc/keyboard.h Wed Oct 8 12:24:56 2003 @@ -25,8 +25,6 @@ #ifndef _PARISC_KEYBOARD_H #define _PARISC_KEYBOARD_H -#include - #ifdef __KERNEL__ #include diff -Nru a/include/asm-parisc/page.h b/include/asm-parisc/page.h --- a/include/asm-parisc/page.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-parisc/page.h Wed Oct 8 12:24:56 2003 @@ -7,6 +7,7 @@ #define PAGE_MASK (~(PAGE_SIZE-1)) #ifdef __KERNEL__ +#include #ifndef __ASSEMBLY__ #include diff -Nru a/include/asm-parisc/param.h b/include/asm-parisc/param.h --- a/include/asm-parisc/param.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-parisc/param.h Wed Oct 8 12:24:56 2003 @@ -2,6 +2,7 @@ #define _ASMPARISC_PARAM_H #ifdef __KERNEL__ +#include # ifdef CONFIG_PA20 # define HZ 1000 /* Faster machines */ # else diff -Nru a/include/asm-parisc/pci.h b/include/asm-parisc/pci.h --- a/include/asm-parisc/pci.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-parisc/pci.h Wed Oct 8 12:24:57 2003 @@ -1,6 +1,7 @@ #ifndef __ASM_PARISC_PCI_H #define __ASM_PARISC_PCI_H +#include #include /* diff -Nru a/include/asm-parisc/pdc.h b/include/asm-parisc/pdc.h --- a/include/asm-parisc/pdc.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-parisc/pdc.h Wed Oct 8 12:24:55 2003 @@ -1,6 +1,8 @@ #ifndef _PARISC_PDC_H #define _PARISC_PDC_H +#include + /* * PDC return values ... * All PDC calls return a subset of these errors. @@ -191,8 +193,8 @@ #define PDC_IO 135 /* log error info, reset IO system */ #define PDC_IO_READ_AND_CLEAR_ERRORS 0 -#define PDC_IO_READ_AND_LOG_ERRORS 1 -#define PDC_IO_SUSPEND_USB 2 +#define PDC_IO_RESET 1 +#define PDC_IO_RESET_DEVICES 2 /* sets bits 6&7 (little endian) of the HcControl Register */ #define PDC_IO_USB_SUSPEND 0xC000000000000000 #define PDC_IO_EEPROM_IO_ERR_TABLE_FULL -5 /* return value */ @@ -951,7 +953,8 @@ int pdc_do_reset(void); int pdc_soft_power_info(unsigned long *power_reg); int pdc_soft_power_button(int sw_control); -void pdc_suspend_usb(void); +void pdc_io_reset(void); +void pdc_io_reset_devices(void); int pdc_iodc_getc(void); void pdc_iodc_putc(unsigned char c); void pdc_iodc_outc(unsigned char c); diff -Nru a/include/asm-parisc/pgalloc.h b/include/asm-parisc/pgalloc.h --- a/include/asm-parisc/pgalloc.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-parisc/pgalloc.h Wed Oct 8 12:24:57 2003 @@ -1,7 +1,6 @@ #ifndef _ASM_PGALLOC_H #define _ASM_PGALLOC_H -#include #include #include #include diff -Nru a/include/asm-parisc/pgtable.h b/include/asm-parisc/pgtable.h --- a/include/asm-parisc/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-parisc/pgtable.h Wed Oct 8 12:24:57 2003 @@ -1,6 +1,7 @@ #ifndef _PARISC_PGTABLE_H #define _PARISC_PGTABLE_H +#include #include #ifndef __ASSEMBLY__ @@ -108,7 +109,6 @@ extern void *vmalloc_start; #define PCXL_DMA_MAP_SIZE (8*1024*1024) #define VMALLOC_START ((unsigned long)vmalloc_start) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) /* this is a fixmap remnant, see fixmap.h */ #define VMALLOC_END (TMPALIAS_MAP_START) #endif diff -Nru a/include/asm-parisc/processor.h b/include/asm-parisc/processor.h --- a/include/asm-parisc/processor.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-parisc/processor.h Wed Oct 8 12:24:57 2003 @@ -36,10 +36,18 @@ #define current_text_addr() ({ void *pc; __asm__("\n\tblr 0,%0\n\tnop":"=r" (pc)); pc; }) #define TASK_SIZE (current->thread.task_size) -#define DEFAULT_TASK_SIZE (0xFFF00000UL) - #define TASK_UNMAPPED_BASE (current->thread.map_base) -#define DEFAULT_MAP_BASE (0x40000000UL) + +#define DEFAULT_TASK_SIZE32 (0xFFF00000UL) +#define DEFAULT_MAP_BASE32 (0x40000000UL) + +#ifdef __LP64__ +#define DEFAULT_TASK_SIZE (MAX_ADDRESS-0xf000000) +#define DEFAULT_MAP_BASE (0x200000000UL) +#else +#define DEFAULT_TASK_SIZE DEFAULT_TASK_SIZE32 +#define DEFAULT_MAP_BASE DEFAULT_MAP_BASE32 +#endif #ifndef __ASSEMBLY__ @@ -247,8 +255,18 @@ * * Note that the S/390 people took the easy way out and hacked their * GCC to make the stack grow downwards. + * + * Final Note: For entry from syscall, the W (wide) bit of the PSW + * is stuffed into the lowest bit of the user sp (%r30), so we fill + * it in here from the current->personality */ +#ifdef __LP64__ +#define USER_WIDE_MODE (personality(current->personality) == PER_LINUX) +#else +#define USER_WIDE_MODE 0 +#endif + #define start_thread(regs, new_pc, new_sp) do { \ elf_addr_t *sp = (elf_addr_t *)new_sp; \ __u32 spaceid = (__u32)current->mm->context; \ @@ -266,12 +284,12 @@ regs->sr[5] = spaceid; \ regs->sr[6] = spaceid; \ regs->sr[7] = spaceid; \ - regs->gr[ 0] = USER_PSW; \ + regs->gr[ 0] = USER_PSW | (USER_WIDE_MODE ? PSW_W : 0); \ regs->fr[ 0] = 0LL; \ regs->fr[ 1] = 0LL; \ regs->fr[ 2] = 0LL; \ regs->fr[ 3] = 0LL; \ - regs->gr[30] = ((unsigned long)sp + 63) &~ 63; \ + regs->gr[30] = (((unsigned long)sp + 63) &~ 63) | (USER_WIDE_MODE ? 1 : 0); \ regs->gr[31] = pc; \ \ get_user(regs->gr[25], (argv - 1)); \ @@ -299,8 +317,6 @@ #define KSTK_EIP(tsk) ((tsk)->thread.regs.iaoq[0]) #define KSTK_ESP(tsk) ((tsk)->thread.regs.gr[30]) -#endif /* __ASSEMBLY__ */ - #ifdef CONFIG_PA20 #define ARCH_HAS_PREFETCH extern inline void prefetch(const void *addr) @@ -316,5 +332,7 @@ #endif #define cpu_relax() barrier() + +#endif /* __ASSEMBLY__ */ #endif /* __ASM_PARISC_PROCESSOR_H */ diff -Nru a/include/asm-parisc/rt_sigframe.h b/include/asm-parisc/rt_sigframe.h --- a/include/asm-parisc/rt_sigframe.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-parisc/rt_sigframe.h Wed Oct 8 12:24:56 2003 @@ -13,7 +13,20 @@ * which Linux/parisc uses is sp-20 for the saved return pointer...) * Then, the stack pointer must be rounded to a cache line (64 bytes). */ +#define SIGFRAME32 64 +#define FUNCTIONCALLFRAME32 48 +#define PARISC_RT_SIGFRAME_SIZE32 \ + (((sizeof(struct rt_sigframe) + FUNCTIONCALLFRAME32) + SIGFRAME32) & -SIGFRAME32) + +#ifdef __LP64__ +#define SIGFRAME 128 +#define FUNCTIONCALLFRAME 96 #define PARISC_RT_SIGFRAME_SIZE \ - (((sizeof(struct rt_sigframe) + 48) + 63) & -64) + (((sizeof(struct rt_sigframe) + FUNCTIONCALLFRAME) + SIGFRAME) & -SIGFRAME) +#else +#define SIGFRAME SIGFRAME32 +#define FUNCTIONCALLFRAME FUNCTIONCALLFRAME32 +#define PARISC_RT_SIGFRAME_SIZE PARISC_RT_SIGFRAME_SIZE32 +#endif #endif diff -Nru a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h --- a/include/asm-parisc/tlbflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-parisc/tlbflush.h Wed Oct 8 12:24:57 2003 @@ -3,6 +3,7 @@ /* TLB flushing routines.... */ +#include #include #include diff -Nru a/include/asm-ppc/cacheflush.h b/include/asm-ppc/cacheflush.h --- a/include/asm-ppc/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -24,11 +24,20 @@ #define flush_cache_range(vma, a, b) do { } while (0) #define flush_cache_page(vma, p) do { } while (0) #define flush_icache_page(vma, page) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) extern void flush_dcache_page(struct page *page); extern void flush_icache_range(unsigned long, unsigned long); extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, unsigned long addr, int len); + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) extern void __flush_dcache_icache(void *page_va); extern void __flush_dcache_icache_phys(unsigned long physaddr); diff -Nru a/include/asm-ppc/highmem.h b/include/asm-ppc/highmem.h --- a/include/asm-ppc/highmem.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc/highmem.h Wed Oct 8 12:24:57 2003 @@ -132,6 +132,8 @@ return pte_page(kmap_pte[idx]); } +#define flush_cache_kmaps() flush_cache_all() + #endif /* __KERNEL__ */ #endif /* _ASM_HIGHMEM_H */ diff -Nru a/include/asm-ppc/pgtable.h b/include/asm-ppc/pgtable.h --- a/include/asm-ppc/pgtable.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-ppc/pgtable.h Wed Oct 8 12:24:56 2003 @@ -129,7 +129,6 @@ #else #define VMALLOC_START ((((long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))) #endif -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END ioremap_bot /* diff -Nru a/include/asm-ppc/reg.h b/include/asm-ppc/reg.h --- a/include/asm-ppc/reg.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc/reg.h Wed Oct 8 12:24:57 2003 @@ -86,10 +86,6 @@ /* Special Purpose Registers (SPRNs)*/ #define SPRN_CTR 0x009 /* Count Register */ #define SPRN_DABR 0x3F5 /* Data Address Breakpoint Register */ -#if !defined(SPRN_DAC1) && !defined(SPRN_DAC2) -#define SPRN_DAC1 0x3F6 /* Data Address Compare 1 */ -#define SPRN_DAC2 0x3F7 /* Data Address Compare 2 */ -#endif #define SPRN_DAR 0x013 /* Data Address Register */ #define SPRN_DBAT0L 0x219 /* Data BAT 0 Lower Register */ #define SPRN_DBAT0U 0x218 /* Data BAT 0 Upper Register */ @@ -290,8 +286,6 @@ #define SPRN_SPRG7 0x117 /* Special Purpose Register General 7 */ #define SPRN_SRR0 0x01A /* Save/Restore Register 0 */ #define SPRN_SRR1 0x01B /* Save/Restore Register 1 */ -#define SPRN_SRR2 0x3DE /* Save/Restore Register 2 */ -#define SPRN_SRR3 0x3DF /* Save/Restore Register 3 */ #define SPRN_THRM1 0x3FC /* Thermal Management Register 1 */ /* these bits were defined in inverted endian sense originally, ugh, confusing */ #define THRM1_TIN (1 << 31) diff -Nru a/include/asm-ppc/reg_booke.h b/include/asm-ppc/reg_booke.h --- a/include/asm-ppc/reg_booke.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc/reg_booke.h Wed Oct 8 12:24:57 2003 @@ -128,8 +128,12 @@ #define SPRN_DEAR 0x3D5 /* Data Error Address Register */ #define SPRN_TSR 0x3D8 /* Timer Status Register */ #define SPRN_TCR 0x3DA /* Timer Control Register */ +#define SPRN_SRR2 0x3DE /* Save/Restore Register 2 */ +#define SPRN_SRR3 0x3DF /* Save/Restore Register 3 */ #define SPRN_DBSR 0x3F0 /* Debug Status Register */ #define SPRN_DBCR0 0x3F2 /* Debug Control Register 0 */ +#define SPRN_DAC1 0x3F6 /* Data Address Compare 1 */ +#define SPRN_DAC2 0x3F7 /* Data Address Compare 2 */ #endif /* Bit definitions for the DBSR. */ diff -Nru a/include/asm-ppc/uaccess.h b/include/asm-ppc/uaccess.h --- a/include/asm-ppc/uaccess.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-ppc/uaccess.h Wed Oct 8 12:24:55 2003 @@ -120,21 +120,27 @@ __pu_err; \ }) -#define __put_user_size(x,ptr,size,retval) \ -do { \ - retval = 0; \ - switch (size) { \ - case 1: __put_user_asm(x,ptr,retval,"stb"); break; \ - case 2: __put_user_asm(x,ptr,retval,"sth"); break; \ - case 4: __put_user_asm(x,ptr,retval,"stw"); break; \ - case 8: __put_user_asm2(x,ptr,retval); break; \ - default: __put_user_bad(); \ - } \ +#define __put_user_size(x,ptr,size,retval) \ +do { \ + retval = 0; \ + switch (size) { \ + case 1: \ + __put_user_asm(x, ptr, retval, "stb"); \ + break; \ + case 2: \ + __put_user_asm(x, ptr, retval, "sth"); \ + break; \ + case 4: \ + __put_user_asm(x, ptr, retval, "stw"); \ + break; \ + case 8: \ + __put_user_asm2(x, ptr, retval); \ + break; \ + default: \ + __put_user_bad(); \ + } \ } while (0) -struct __large_struct { unsigned long buf[100]; }; -#define __m(x) (*(struct __large_struct *)(x)) - /* * We don't tell gcc that we are accessing memory, but this is OK * because we do not write to any memory gcc knows about, so there @@ -152,13 +158,13 @@ " .align 2\n" \ " .long 1b,3b\n" \ ".previous" \ - : "=r"(err) \ - : "r"(x), "b"(addr), "i"(-EFAULT), "0"(err)) + : "=r" (err) \ + : "r" (x), "b" (addr), "i" (-EFAULT), "0" (err)) #define __put_user_asm2(x, addr, err) \ __asm__ __volatile__( \ "1: stw %1,0(%2)\n" \ - "2: stw %1+1,4(%2)\n" \ + "2: stw %1+1,4(%2)\n" \ "3:\n" \ ".section .fixup,\"ax\"\n" \ "4: li %0,%3\n" \ @@ -169,69 +175,85 @@ " .long 1b,4b\n" \ " .long 2b,4b\n" \ ".previous" \ - : "=r"(err) \ - : "r"(x), "b"(addr), "i"(-EFAULT), "0"(err)) + : "=r" (err) \ + : "r" (x), "b" (addr), "i" (-EFAULT), "0" (err)) -#define __get_user_nocheck(x,ptr,size) \ +#define __get_user_nocheck(x, ptr, size) \ ({ \ long __gu_err, __gu_val; \ - __get_user_size(__gu_val,(ptr),(size),__gu_err); \ + __get_user_size(__gu_val, (ptr), (size), __gu_err); \ (x) = (__typeof__(*(ptr)))__gu_val; \ __gu_err; \ }) -#define __get_user64_nocheck(x,ptr,size) \ +#define __get_user64_nocheck(x, ptr, size) \ ({ \ long __gu_err; \ long long __gu_val; \ - __get_user_size64(__gu_val,(ptr),(size),__gu_err); \ + __get_user_size64(__gu_val, (ptr), (size), __gu_err); \ (x) = (__typeof__(*(ptr)))__gu_val; \ __gu_err; \ }) -#define __get_user_check(x,ptr,size) \ +#define __get_user_check(x, ptr, size) \ ({ \ long __gu_err = -EFAULT, __gu_val = 0; \ const __typeof__(*(ptr)) *__gu_addr = (ptr); \ - if (access_ok(VERIFY_READ,__gu_addr,size)) \ - __get_user_size(__gu_val,__gu_addr,(size),__gu_err); \ + if (access_ok(VERIFY_READ, __gu_addr, (size))) \ + __get_user_size(__gu_val, __gu_addr, (size), __gu_err); \ (x) = (__typeof__(*(ptr)))__gu_val; \ __gu_err; \ }) -#define __get_user64_check(x,ptr,size) \ -({ \ - long __gu_err = -EFAULT; \ - long long __gu_val = 0; \ - const __typeof__(*(ptr)) *__gu_addr = (ptr); \ - if (access_ok(VERIFY_READ,__gu_addr,size)) \ - __get_user_size64(__gu_val,__gu_addr,(size),__gu_err); \ - (x) = (__typeof__(*(ptr)))__gu_val; \ - __gu_err; \ +#define __get_user64_check(x, ptr, size) \ +({ \ + long __gu_err = -EFAULT; \ + long long __gu_val = 0; \ + const __typeof__(*(ptr)) *__gu_addr = (ptr); \ + if (access_ok(VERIFY_READ, __gu_addr, (size))) \ + __get_user_size64(__gu_val, __gu_addr, (size), __gu_err); \ + (x) = (__typeof__(*(ptr)))__gu_val; \ + __gu_err; \ }) extern long __get_user_bad(void); -#define __get_user_size(x,ptr,size,retval) \ +#define __get_user_size(x, ptr, size, retval) \ do { \ retval = 0; \ switch (size) { \ - case 1: __get_user_asm(x,ptr,retval,"lbz"); break; \ - case 2: __get_user_asm(x,ptr,retval,"lhz"); break; \ - case 4: __get_user_asm(x,ptr,retval,"lwz"); break; \ - default: (x) = __get_user_bad(); \ + case 1: \ + __get_user_asm(x, ptr, retval, "lbz"); \ + break; \ + case 2: \ + __get_user_asm(x, ptr, retval, "lhz"); \ + break; \ + case 4: \ + __get_user_asm(x, ptr, retval, "lwz"); \ + break; \ + default: \ + x = __get_user_bad(); \ } \ } while (0) -#define __get_user_size64(x,ptr,size,retval) \ +#define __get_user_size64(x, ptr, size, retval) \ do { \ retval = 0; \ switch (size) { \ - case 1: __get_user_asm(x,ptr,retval,"lbz"); break; \ - case 2: __get_user_asm(x,ptr,retval,"lhz"); break; \ - case 4: __get_user_asm(x,ptr,retval,"lwz"); break; \ - case 8: __get_user_asm2(x, ptr, retval); break; \ - default: (x) = __get_user_bad(); \ + case 1: \ + __get_user_asm(x, ptr, retval, "lbz"); \ + break; \ + case 2: \ + __get_user_asm(x, ptr, retval, "lhz"); \ + break; \ + case 4: \ + __get_user_asm(x, ptr, retval, "lwz"); \ + break; \ + case 8: \ + __get_user_asm2(x, ptr, retval); \ + break; \ + default: \ + x = __get_user_bad(); \ } \ } while (0) diff -Nru a/include/asm-ppc/zorro.h b/include/asm-ppc/zorro.h --- a/include/asm-ppc/zorro.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc/zorro.h Wed Oct 8 12:24:57 2003 @@ -27,4 +27,4 @@ #define z_ioremap ioremap #define z_iounmap iounmap -#endif /* _ASM_ZORRO_H */ +#endif /* _ASM_PPC_ZORRO_H */ diff -Nru a/include/asm-ppc64/cacheflush.h b/include/asm-ppc64/cacheflush.h --- a/include/asm-ppc64/cacheflush.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-ppc64/cacheflush.h Wed Oct 8 12:24:55 2003 @@ -14,12 +14,22 @@ #define flush_cache_range(vma, start, end) do { } while (0) #define flush_cache_page(vma, vmaddr) do { } while (0) #define flush_icache_page(vma, page) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) extern void flush_dcache_page(struct page *page); extern void flush_icache_range(unsigned long, unsigned long); extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, unsigned long addr, int len); + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + extern void __flush_dcache_icache(void *page_va); #endif /* _PPC64_CACHEFLUSH_H */ diff -Nru a/include/asm-ppc64/elf.h b/include/asm-ppc64/elf.h --- a/include/asm-ppc64/elf.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc64/elf.h Wed Oct 8 12:24:57 2003 @@ -128,11 +128,6 @@ extern int dump_task_fpu(struct task_struct *, elf_fpregset_t *); #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) -#ifdef CONFIG_SMP -extern void dump_smp_unlazy_fpu(void); -#define ELF_CORE_SYNC dump_smp_unlazy_fpu -#endif - #endif /* This yields a mask that user programs can use to figure out what diff -Nru a/include/asm-ppc64/numnodes.h b/include/asm-ppc64/numnodes.h --- a/include/asm-ppc64/numnodes.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc64/numnodes.h Wed Oct 8 12:24:57 2003 @@ -1,6 +1,7 @@ #ifndef _ASM_MAX_NUMNODES_H #define _ASM_MAX_NUMNODES_H -#define MAX_NUMNODES 16 +/* Max 16 Nodes */ +#define NODES_SHIFT 4 #endif /* _ASM_MAX_NUMNODES_H */ diff -Nru a/include/asm-ppc64/pgtable.h b/include/asm-ppc64/pgtable.h --- a/include/asm-ppc64/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-ppc64/pgtable.h Wed Oct 8 12:24:57 2003 @@ -45,7 +45,6 @@ * Define the address range of the vmalloc VM area. */ #define VMALLOC_START (0xD000000000000000) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END (VMALLOC_START + VALID_EA_BITS) /* diff -Nru a/include/asm-s390/cacheflush.h b/include/asm-s390/cacheflush.h --- a/include/asm-s390/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-s390/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -13,5 +13,12 @@ #define flush_icache_range(start, end) do { } while (0) #define flush_icache_page(vma,pg) do { } while (0) #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) #endif /* _S390_CACHEFLUSH_H */ diff -Nru a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h --- a/include/asm-s390/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-s390/pgtable.h Wed Oct 8 12:24:57 2003 @@ -117,7 +117,6 @@ #define VMALLOC_OFFSET (8*1024*1024) #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) \ & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #ifndef __s390x__ # define VMALLOC_END (0x7fffffffL) #else /* __s390x__ */ diff -Nru a/include/asm-s390/unistd.h b/include/asm-s390/unistd.h --- a/include/asm-s390/unistd.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-s390/unistd.h Wed Oct 8 12:24:57 2003 @@ -232,9 +232,7 @@ #define __NR_futex 238 #define __NR_sched_setaffinity 239 #define __NR_sched_getaffinity 240 -/* - * Number 241 is currently unused - */ +#define __NR_tgkill 241 /* * Number 242 is reserved for tux */ @@ -258,8 +256,11 @@ #define __NR_clock_gettime (__NR_timer_create+6) #define __NR_clock_getres (__NR_timer_create+7) #define __NR_clock_nanosleep (__NR_timer_create+8) +/* + * Number 263 is reserved for vserver + */ -#define NR_syscalls 263 +#define NR_syscalls 264 /* * There are some system calls that are not present on 64 bit, some diff -Nru a/include/asm-sh/bigsur/serial.h b/include/asm-sh/bigsur/serial.h --- a/include/asm-sh/bigsur/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sh/bigsur/serial.h Wed Oct 8 12:24:57 2003 @@ -11,9 +11,6 @@ #define BASE_BAUD (3379200 / 16) -/* Leave 2 spare for possible PCMCIA serial cards */ -#define RS_TABLE_SIZE 3 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) diff -Nru a/include/asm-sh/cacheflush.h b/include/asm-sh/cacheflush.h --- a/include/asm-sh/cacheflush.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-sh/cacheflush.h Wed Oct 8 12:24:56 2003 @@ -10,4 +10,14 @@ /* Flush (invalidate only) a region (smaller than a page) */ extern void __flush_invalidate_region(void *start, int size); +#define flush_cache_vmap(start, end) flush_cache_all() +#define flush_cache_vunmap(start, end) flush_cache_all() + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + #endif /* __ASM_SH_CACHEFLUSH_H */ diff -Nru a/include/asm-sh/ec3104/serial.h b/include/asm-sh/ec3104/serial.h --- a/include/asm-sh/ec3104/serial.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-sh/ec3104/serial.h Wed Oct 8 12:24:55 2003 @@ -4,8 +4,6 @@ * guess. */ #define BASE_BAUD (16800000 / 16) -#define RS_TABLE_SIZE 3 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* there is a fourth serial port with the expected values as well, but diff -Nru a/include/asm-sh/mmzone.h b/include/asm-sh/mmzone.h --- a/include/asm-sh/mmzone.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sh/mmzone.h Wed Oct 8 12:24:57 2003 @@ -10,14 +10,14 @@ #include +#ifdef CONFIG_DISCONTIGMEM + /* Currently, just for HP690 */ #define PHYSADDR_TO_NID(phys) ((((phys) - __MEMORY_START) >= 0x01000000)?1:0) -#define NR_NODES 2 -extern pg_data_t discontig_page_data[NR_NODES]; -extern bootmem_data_t discontig_node_bdata[NR_NODES]; +extern pg_data_t discontig_page_data[MAX_NUMNODES]; +extern bootmem_data_t discontig_node_bdata[MAX_NUMNODES]; -#ifdef CONFIG_DISCONTIGMEM /* * Following are macros that each numa implmentation must define. */ @@ -46,7 +46,7 @@ { unsigned int i; - for (i = 0; i < NR_NODES; i++) { + for (i = 0; i < MAX_NUMNODES; i++) { if (page >= NODE_MEM_MAP(i) && page < NODE_MEM_MAP(i) + NODE_DATA(i)->node_size) return 1; diff -Nru a/include/asm-sh/numnodes.h b/include/asm-sh/numnodes.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/asm-sh/numnodes.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,7 @@ +#ifndef _ASM_MAX_NUMNODES_H +#define _ASM_MAX_NUMNODES_H + +/* Max 2 Nodes */ +#define NODES_SHIFT 1 + +#endif /* _ASM_MAX_NUMNODES_H */ diff -Nru a/include/asm-sh/pgtable.h b/include/asm-sh/pgtable.h --- a/include/asm-sh/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sh/pgtable.h Wed Oct 8 12:24:57 2003 @@ -51,7 +51,6 @@ * Currently only 4-enty (16kB) is used (see arch/sh/mm/cache.c) */ #define VMALLOC_START (P3SEG+0x00100000) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END P4SEG /* 0x001 WT-bit on SH-4, 0 on SH-3 */ diff -Nru a/include/asm-sh/serial-bigsur.h b/include/asm-sh/serial-bigsur.h --- a/include/asm-sh/serial-bigsur.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sh/serial-bigsur.h Wed Oct 8 12:24:57 2003 @@ -11,9 +11,6 @@ #define BASE_BAUD (3379200 / 16) -/* Leave 2 spare for possible PCMCIA serial cards */ -#define RS_TABLE_SIZE 3 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) diff -Nru a/include/asm-sh/serial-ec3104.h b/include/asm-sh/serial-ec3104.h --- a/include/asm-sh/serial-ec3104.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-sh/serial-ec3104.h Wed Oct 8 12:24:56 2003 @@ -4,8 +4,6 @@ * guess. */ #define BASE_BAUD (16800000 / 16) -#define RS_TABLE_SIZE 3 - #define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) /* there is a fourth serial port with the expected values as well, but diff -Nru a/include/asm-sh/serial.h b/include/asm-sh/serial.h --- a/include/asm-sh/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sh/serial.h Wed Oct 8 12:24:57 2003 @@ -29,15 +29,11 @@ #ifdef CONFIG_HD64465 #include -#define RS_TABLE_SIZE 1 - #define STD_SERIAL_PORT_DEFNS \ /* UART CLK PORT IRQ FLAGS */ \ { 0, BASE_BAUD, 0x3F8, HD64465_IRQ_UART, STD_COM_FLAGS } /* ttyS0 */ #else - -#define RS_TABLE_SIZE 2 #define STD_SERIAL_PORT_DEFNS \ /* UART CLK PORT IRQ FLAGS */ \ diff -Nru a/include/asm-sparc/cacheflush.h b/include/asm-sparc/cacheflush.h --- a/include/asm-sparc/cacheflush.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-sparc/cacheflush.h Wed Oct 8 12:24:56 2003 @@ -56,6 +56,11 @@ #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + BTFIXUPDEF_CALL(void, __flush_page_to_ram, unsigned long) BTFIXUPDEF_CALL(void, flush_sig_insns, struct mm_struct *, unsigned long) @@ -65,5 +70,8 @@ extern void sparc_flush_page_to_ram(struct page *page); #define flush_dcache_page(page) sparc_flush_page_to_ram(page) + +#define flush_cache_vmap(start, end) flush_cache_all() +#define flush_cache_vunmap(start, end) flush_cache_all() #endif /* _SPARC_CACHEFLUSH_H */ diff -Nru a/include/asm-sparc/highmem.h b/include/asm-sparc/highmem.h --- a/include/asm-sparc/highmem.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sparc/highmem.h Wed Oct 8 12:24:57 2003 @@ -89,6 +89,8 @@ return pte_page(*pte); } +#define flush_cache_kmaps() flush_cache_all() + #endif /* __KERNEL__ */ #endif /* _ASM_HIGHMEM_H */ diff -Nru a/include/asm-sparc/pgtable.h b/include/asm-sparc/pgtable.h --- a/include/asm-sparc/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sparc/pgtable.h Wed Oct 8 12:24:57 2003 @@ -101,8 +101,6 @@ BTFIXUPDEF_SIMM13(ptrs_per_pgd) BTFIXUPDEF_SIMM13(user_ptrs_per_pgd) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) - #define pte_ERROR(e) __builtin_trap() #define pmd_ERROR(e) __builtin_trap() #define pgd_ERROR(e) __builtin_trap() diff -Nru a/include/asm-sparc/unistd.h b/include/asm-sparc/unistd.h --- a/include/asm-sparc/unistd.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-sparc/unistd.h Wed Oct 8 12:24:55 2003 @@ -283,7 +283,8 @@ #define __NR_timer_getoverrun 264 #define __NR_timer_delete 265 #define __NR_timer_create 266 -/* WARNING: You MAY NOT add syscall numbers larger than 266, since +/* #define __NR_vserver 267 Reserved for VSERVER */ +/* WARNING: You MAY NOT add syscall numbers larger than 267, since * all of the syscall tables in the Sparc kernel are * sized to have 267 entries (starting at zero). Therefore * find a free slot in the 0-266 range. diff -Nru a/include/asm-sparc64/cacheflush.h b/include/asm-sparc64/cacheflush.h --- a/include/asm-sparc64/cacheflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sparc64/cacheflush.h Wed Oct 8 12:24:57 2003 @@ -33,21 +33,17 @@ extern void __flush_dcache_range(unsigned long start, unsigned long end); -extern void __flush_cache_all(void); - -#ifndef CONFIG_SMP - -#define flush_cache_all() __flush_cache_all() - -#else /* CONFIG_SMP */ - -extern void smp_flush_cache_all(void); - -#endif /* ! CONFIG_SMP */ - #define flush_icache_page(vma, pg) do { } while(0) #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + extern void flush_dcache_page(struct page *page); + +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) #endif /* _SPARC64_CACHEFLUSH_H */ diff -Nru a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h --- a/include/asm-sparc64/pgtable.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-sparc64/pgtable.h Wed Oct 8 12:24:55 2003 @@ -30,7 +30,6 @@ #define MODULES_LEN 0x000000007e000000 #define MODULES_END 0x0000000080000000 #define VMALLOC_START 0x0000000140000000 -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define VMALLOC_END 0x0000000200000000 #define LOW_OBP_ADDRESS 0x00000000f0000000 #define HI_OBP_ADDRESS 0x0000000100000000 diff -Nru a/include/asm-sparc64/posix_types.h b/include/asm-sparc64/posix_types.h --- a/include/asm-sparc64/posix_types.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sparc64/posix_types.h Wed Oct 8 12:24:57 2003 @@ -28,8 +28,8 @@ typedef int __kernel_clockid_t; typedef int __kernel_timer_t; -typedef __kernel_uid_t __kernel_old_uid_t; -typedef __kernel_gid_t __kernel_old_gid_t; +typedef unsigned short __kernel_old_uid_t; +typedef unsigned short __kernel_old_gid_t; typedef __kernel_uid_t __kernel_uid32_t; typedef __kernel_gid_t __kernel_gid32_t; diff -Nru a/include/asm-sparc64/tlbflush.h b/include/asm-sparc64/tlbflush.h --- a/include/asm-sparc64/tlbflush.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-sparc64/tlbflush.h Wed Oct 8 12:24:57 2003 @@ -70,7 +70,6 @@ extern void smp_flush_tlb_kernel_range(unsigned long start, unsigned long end); extern void smp_flush_tlb_page(struct mm_struct *mm, unsigned long page); -#define flush_cache_all() smp_flush_cache_all() #define flush_tlb_all() smp_flush_tlb_all() #define flush_tlb_mm(mm) smp_flush_tlb_mm(mm) #define flush_tlb_range(vma, start, end) \ diff -Nru a/include/asm-sparc64/unistd.h b/include/asm-sparc64/unistd.h --- a/include/asm-sparc64/unistd.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-sparc64/unistd.h Wed Oct 8 12:24:55 2003 @@ -285,7 +285,8 @@ #define __NR_timer_getoverrun 264 #define __NR_timer_delete 265 #define __NR_timer_create 266 -/* WARNING: You MAY NOT add syscall numbers larger than 266, since +/* #define __NR_vserver 267 Reserved for VSERVER */ +/* WARNING: You MAY NOT add syscall numbers larger than 267, since * all of the syscall tables in the Sparc kernel are * sized to have 267 entries (starting at zero). Therefore * find a free slot in the 0-266 range. diff -Nru a/include/asm-sparc64/visasm.h b/include/asm-sparc64/visasm.h --- a/include/asm-sparc64/visasm.h Wed Oct 8 12:24:55 2003 +++ b/include/asm-sparc64/visasm.h Wed Oct 8 12:24:55 2003 @@ -17,7 +17,8 @@ andcc %o5, (FPRS_FEF|FPRS_DU), %g0; \ be,pt %icc, 297f; \ sethi %hi(297f), %g7; \ - ba,pt %xcc, VISenter; \ + sethi %hi(VISenter), %g1; \ + jmpl %g1 + %lo(VISenter), %g0; \ or %g7, %lo(297f), %g7; \ 297: wr %g0, FPRS_FEF, %fprs; \ @@ -32,7 +33,8 @@ andcc %o5, FPRS_FEF, %g0; \ be,pt %icc, 297f; \ sethi %hi(298f), %g7; \ - ba,pt %xcc, VISenterhalf; \ + sethi %hi(VISenterhalf), %g1; \ + jmpl %g1 + %lo(VISenterhalf), %g0; \ or %g7, %lo(298f), %g7; \ clr %o5; \ 297: wr %o5, FPRS_FEF, %fprs; \ @@ -48,7 +50,8 @@ " andcc %%o5, %0, %%g0\n" " be,pt %%icc, 299f\n" " sethi %%hi(298f), %%g7\n" -" ba VISenter ! Note. This cannot be bp, as it may be too far from VISenter.\n" +" sethi %%hi(VISenter), %%g1\n" +" jmpl %%g1 + %%lo(VISenter), %%g0\n" " or %%g7, %%lo(298f), %%g7\n" " 298: wr %%g0, 0, %%fprs\n" " 299:\n" diff -Nru a/include/asm-um/pgtable.h b/include/asm-um/pgtable.h --- a/include/asm-um/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-um/pgtable.h Wed Oct 8 12:24:57 2003 @@ -69,7 +69,6 @@ #define VMALLOC_OFFSET (__va_space) #define VMALLOC_START (((unsigned long) high_physmem + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #ifdef CONFIG_HIGHMEM # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) diff -Nru a/include/asm-v850/cacheflush.h b/include/asm-v850/cacheflush.h --- a/include/asm-v850/cacheflush.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-v850/cacheflush.h Wed Oct 8 12:24:56 2003 @@ -27,6 +27,8 @@ #define flush_cache_range(vma, start, end) ((void)0) #define flush_cache_page(vma, vmaddr) ((void)0) #define flush_dcache_page(page) ((void)0) +#define flush_cache_vmap(start, end) ((void)0) +#define flush_cache_vunmap(start, end) ((void)0) #ifdef CONFIG_NO_CACHE @@ -55,5 +57,11 @@ #endif /* CONFIG_NO_CACHE */ +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ +do { memcpy(dst, src, len); \ + flush_icache_user_range(vma, page, vaddr, len); \ +} while (0) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) #endif /* __V850_CACHEFLUSH_H__ */ diff -Nru a/include/asm-v850/serial.h b/include/asm-v850/serial.h --- a/include/asm-v850/serial.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-v850/serial.h Wed Oct 8 12:24:56 2003 @@ -16,7 +16,6 @@ #define irq_cannonicalize(x) (x) #define BASE_BAUD 250000 /* (16MHz / (16 * 38400)) * 9600 */ -#define RS_TABLE_SIZE 1 #define SERIAL_PORT_DFNS \ { 0, BASE_BAUD, CB_UART_BASE, IRQ_CB_EXTSIO, STD_COM_FLAGS }, diff -Nru a/include/asm-v850/sim.h b/include/asm-v850/sim.h --- a/include/asm-v850/sim.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-v850/sim.h Wed Oct 8 12:24:56 2003 @@ -25,7 +25,7 @@ /* We use a weird value for RAM, not just 0, for testing purposes. These must match the values used in the linker script. */ #define RAM_ADDR 0x8F000000 -#define RAM_SIZE 0x01000000 +#define RAM_SIZE 0x03000000 /* For */ diff -Nru a/include/asm-v850/sim85e2.h b/include/asm-v850/sim85e2.h --- a/include/asm-v850/sim85e2.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-v850/sim85e2.h Wed Oct 8 12:24:57 2003 @@ -38,11 +38,7 @@ #define ERAM_SIZE 0x07f00000 /* 127MB (max) */ /* Dynamic RAM; uses memory controller. */ #define SDRAM_ADDR 0x10000000 -#if 0 #define SDRAM_SIZE 0x01000000 /* 16MB */ -#else -#define SDRAM_SIZE 0x00200000 /* Only use 2MB for testing */ -#endif /* Simulator specific control registers. */ diff -Nru a/include/asm-x86_64/cacheflush.h b/include/asm-x86_64/cacheflush.h --- a/include/asm-x86_64/cacheflush.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-x86_64/cacheflush.h Wed Oct 8 12:24:56 2003 @@ -13,6 +13,13 @@ #define flush_icache_range(start, end) do { } while (0) #define flush_icache_page(vma,pg) do { } while (0) #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) void global_flush_tlb(void); int change_page_attr(struct page *page, int numpages, pgprot_t prot); diff -Nru a/include/asm-x86_64/elf.h b/include/asm-x86_64/elf.h --- a/include/asm-x86_64/elf.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-x86_64/elf.h Wed Oct 8 12:24:57 2003 @@ -150,11 +150,6 @@ #define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) #define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) -#ifdef CONFIG_SMP -extern void dump_smp_unlazy_fpu(void); -#define ELF_CORE_SYNC dump_smp_unlazy_fpu -#endif - #endif #endif diff -Nru a/include/asm-x86_64/mmzone.h b/include/asm-x86_64/mmzone.h --- a/include/asm-x86_64/mmzone.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-x86_64/mmzone.h Wed Oct 8 12:24:57 2003 @@ -10,7 +10,6 @@ #define VIRTUAL_BUG_ON(x) -#include #include #define MAXNODE 8 diff -Nru a/include/asm-x86_64/numnodes.h b/include/asm-x86_64/numnodes.h --- a/include/asm-x86_64/numnodes.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-x86_64/numnodes.h Wed Oct 8 12:24:56 2003 @@ -3,10 +3,7 @@ #include -#ifdef CONFIG_DISCONTIGMEM -#define MAX_NUMNODES 8 /* APIC limit currently */ -#else -#define MAX_NUMNODES 1 -#endif +/* Max 8 Nodes - APIC limit currently */ +#define NODES_SHIFT 3 #endif diff -Nru a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h --- a/include/asm-x86_64/pgtable.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-x86_64/pgtable.h Wed Oct 8 12:24:57 2003 @@ -126,7 +126,6 @@ #ifndef __ASSEMBLY__ #define VMALLOC_START 0xffffff0000000000 #define VMALLOC_END 0xffffff7fffffffff -#define VMALLOC_VMADDR(x) ((unsigned long)(x)) #define MODULES_VADDR 0xffffffffa0000000 #define MODULES_END 0xffffffffafffffff #define MODULES_LEN (MODULES_END - MODULES_VADDR) diff -Nru a/include/asm-x86_64/posix_types.h b/include/asm-x86_64/posix_types.h --- a/include/asm-x86_64/posix_types.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-x86_64/posix_types.h Wed Oct 8 12:24:57 2003 @@ -36,8 +36,8 @@ int val[2]; } __kernel_fsid_t; -typedef __kernel_uid_t __kernel_old_uid_t; -typedef __kernel_gid_t __kernel_old_gid_t; +typedef unsigned short __kernel_old_uid_t; +typedef unsigned short __kernel_old_gid_t; typedef __kernel_uid_t __kernel_uid32_t; typedef __kernel_gid_t __kernel_gid32_t; diff -Nru a/include/asm-x86_64/serial.h b/include/asm-x86_64/serial.h --- a/include/asm-x86_64/serial.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-x86_64/serial.h Wed Oct 8 12:24:57 2003 @@ -27,9 +27,6 @@ #define ACCENT_FLAGS 0 #define BOCA_FLAGS 0 #define HUB6_FLAGS 0 -#define RS_TABLE_SIZE 64 -#else -#define RS_TABLE_SIZE #endif #define MCA_COM_FLAGS (STD_COM_FLAGS|ASYNC_BOOT_ONLYMCA) diff -Nru a/include/asm-x86_64/uaccess.h b/include/asm-x86_64/uaccess.h --- a/include/asm-x86_64/uaccess.h Wed Oct 8 12:24:56 2003 +++ b/include/asm-x86_64/uaccess.h Wed Oct 8 12:24:56 2003 @@ -241,9 +241,9 @@ static inline int __copy_from_user(void *dst, const void *src, unsigned size) { + int ret = 0; if (!__builtin_constant_p(size)) return copy_user_generic(dst,src,size); - int ret = 0; switch (size) { case 1:__get_user_asm(*(u8*)dst,(u8 *)src,ret,"b","b","=q",1); return ret; @@ -270,9 +270,9 @@ static inline int __copy_to_user(void *dst, const void *src, unsigned size) { + int ret = 0; if (!__builtin_constant_p(size)) return copy_user_generic(dst,src,size); - int ret = 0; switch (size) { case 1:__put_user_asm(*(u8*)src,(u8 *)dst,ret,"b","b","iq",1); return ret; @@ -302,9 +302,9 @@ static inline int __copy_in_user(void *dst, const void *src, unsigned size) { + int ret = 0; if (!__builtin_constant_p(size)) return copy_user_generic(dst,src,size); - int ret = 0; switch (size) { case 1: { u8 tmp; diff -Nru a/include/asm-x86_64/unistd.h b/include/asm-x86_64/unistd.h --- a/include/asm-x86_64/unistd.h Wed Oct 8 12:24:57 2003 +++ b/include/asm-x86_64/unistd.h Wed Oct 8 12:24:57 2003 @@ -530,8 +530,10 @@ __SYSCALL(__NR_tgkill, sys_tgkill) #define __NR_utimes 235 __SYSCALL(__NR_utimes, sys_utimes) +#define __NR_vserver 236 +__SYSCALL(__NR_vserver, sys_ni_syscall) -#define __NR_syscall_max __NR_utimes +#define __NR_syscall_max __NR_vserver #ifndef __NO_STUBS /* user-visible error numbers are in the range -1 - -4095 */ diff -Nru a/include/linux/acpi.h b/include/linux/acpi.h --- a/include/linux/acpi.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/acpi.h Wed Oct 8 12:24:55 2003 @@ -424,17 +424,17 @@ #endif /*CONFIG_ACPI_EC*/ -#ifdef CONFIG_ACPI +#ifdef CONFIG_ACPI_INTERPRETER int acpi_blacklisted(void); -#else +#else /*!CONFIG_ACPI_INTERPRETER*/ static inline int acpi_blacklisted(void) { return 0; } -#endif /*CONFIG_ACPI*/ +#endif /*!CONFIG_ACPI_INTERPRETER*/ #endif /*_LINUX_ACPI_H*/ diff -Nru a/include/linux/atmdev.h b/include/linux/atmdev.h --- a/include/linux/atmdev.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/atmdev.h Wed Oct 8 12:24:57 2003 @@ -351,7 +351,7 @@ struct atmdev_ops { /* only send is required */ void (*dev_close)(struct atm_dev *dev); - int (*open)(struct atm_vcc *vcc,short vpi,int vci); + int (*open)(struct atm_vcc *vcc); void (*close)(struct atm_vcc *vcc); int (*ioctl)(struct atm_dev *dev,unsigned int cmd,void *arg); int (*getsockopt)(struct atm_vcc *vcc,int level,int optname, @@ -380,7 +380,9 @@ unsigned long atm_options; /* ATM layer options */ }; -extern struct hlist_head vcc_sklist; +#define VCC_HTABLE_SIZE 32 + +extern struct hlist_head vcc_hash[VCC_HTABLE_SIZE]; extern rwlock_t vcc_sklist_lock; #define ATM_SKB(skb) (((struct atm_skb_data *) (skb)->cb)) @@ -443,7 +445,6 @@ int atm_charge(struct atm_vcc *vcc,int truesize); struct sk_buff *atm_alloc_charge(struct atm_vcc *vcc,int pdu_size, int gfp_flags); -int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci); int atm_pcr_goal(struct atm_trafprm *tp); void vcc_release_async(struct atm_vcc *vcc, int reply); diff -Nru a/include/linux/compat.h b/include/linux/compat.h --- a/include/linux/compat.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/compat.h Wed Oct 8 12:24:56 2003 @@ -90,5 +90,12 @@ __u32 f_spare[5]; }; +struct compat_dirent { + u32 d_ino; + compat_off_t d_off; + u16 d_reclen; + char d_name[256]; +}; + #endif /* CONFIG_COMPAT */ #endif /* _LINUX_COMPAT_H */ diff -Nru a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h --- a/include/linux/compat_ioctl.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/compat_ioctl.h Wed Oct 8 12:24:57 2003 @@ -68,7 +68,7 @@ COMPATIBLE_IOCTL(HDIO_DRIVE_CMD) COMPATIBLE_IOCTL(HDIO_SET_PIO_MODE) COMPATIBLE_IOCTL(HDIO_SET_NICE) -#ifndef CONFIG_ARCH_S390 +#ifdef CONFIG_BLK_DEV_FD /* 0x02 -- Floppy ioctls */ COMPATIBLE_IOCTL(FDMSGON) COMPATIBLE_IOCTL(FDMSGOFF) diff -Nru a/include/linux/dqblk_xfs.h b/include/linux/dqblk_xfs.h --- a/include/linux/dqblk_xfs.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/dqblk_xfs.h Wed Oct 8 12:24:57 2003 @@ -105,15 +105,6 @@ #define FS_DQ_TIMER_MASK (FS_DQ_BTIMER | FS_DQ_ITIMER | FS_DQ_RTBTIMER) /* - * The following constants define the default amount of time given a user - * before the soft limits are treated as hard limits (usually resulting - * in an allocation failure). These may be modified by the quotactl(2) - * system call with the Q_XSETQLIM command. - */ -#define DQ_FTIMELIMIT (7 * 24*60*60) /* 1 week */ -#define DQ_BTIMELIMIT (7 * 24*60*60) /* 1 week */ - -/* * Various flags related to quotactl(2). Only relevant to XFS filesystems. */ #define XFS_QUOTA_UDQ_ACCT (1<<0) /* user quota accounting */ diff -Nru a/include/linux/eisa.h b/include/linux/eisa.h --- a/include/linux/eisa.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/eisa.h Wed Oct 8 12:24:57 2003 @@ -4,16 +4,6 @@ #include #include -#ifdef CONFIG_EISA -# ifdef CONFIG_EISA_ALWAYS -# define EISA_bus 1 -# else - extern int EISA_bus; -# endif -#else -# define EISA_bus 0 -#endif - #define EISA_SIG_LEN 8 #define EISA_MAX_SLOTS 8 @@ -107,5 +97,11 @@ }; int eisa_root_register (struct eisa_root_device *root); + +#ifdef CONFIG_EISA +extern int EISA_bus; +#else +# define EISA_bus 0 +#endif #endif diff -Nru a/include/linux/elf.h b/include/linux/elf.h --- a/include/linux/elf.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/elf.h Wed Oct 8 12:24:55 2003 @@ -395,6 +395,7 @@ #define NT_PRFPREG 2 #define NT_PRPSINFO 3 #define NT_TASKSTRUCT 4 +#define NT_AUXV 6 #define NT_PRXFPREG 0x46e62b7f /* copied from gdb5.1/include/elf/common.h */ diff -Nru a/include/linux/ext3_fs_i.h b/include/linux/ext3_fs_i.h --- a/include/linux/ext3_fs_i.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/ext3_fs_i.h Wed Oct 8 12:24:55 2003 @@ -106,7 +106,7 @@ * during recovery. Hence we must fix the get_block-vs-truncate race * by other means, so we have truncate_sem. */ - struct rw_semaphore truncate_sem; + struct semaphore truncate_sem; struct inode vfs_inode; }; diff -Nru a/include/linux/ftape.h b/include/linux/ftape.h --- a/include/linux/ftape.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/ftape.h Wed Oct 8 12:24:57 2003 @@ -35,7 +35,6 @@ #include #endif #include -#include #include #include diff -Nru a/include/linux/hdlcdrv.h b/include/linux/hdlcdrv.h --- a/include/linux/hdlcdrv.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/hdlcdrv.h Wed Oct 8 12:24:57 2003 @@ -359,11 +359,11 @@ void hdlcdrv_receiver(struct net_device *, struct hdlcdrv_state *); void hdlcdrv_transmitter(struct net_device *, struct hdlcdrv_state *); void hdlcdrv_arbitrate(struct net_device *, struct hdlcdrv_state *); -int hdlcdrv_register_hdlcdrv(struct net_device *dev, const struct hdlcdrv_ops *ops, - unsigned int privsize, char *ifname, - unsigned int baseaddr, unsigned int irq, - unsigned int dma); -int hdlcdrv_unregister_hdlcdrv(struct net_device *dev); +struct net_device *hdlcdrv_register(const struct hdlcdrv_ops *ops, + unsigned int privsize, const char *ifname, + unsigned int baseaddr, unsigned int irq, + unsigned int dma); +void hdlcdrv_unregister(struct net_device *dev); /* -------------------------------------------------------------------- */ diff -Nru a/include/linux/hfs_fs.h b/include/linux/hfs_fs.h --- a/include/linux/hfs_fs.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/hfs_fs.h Wed Oct 8 12:24:57 2003 @@ -267,9 +267,9 @@ /* file.c */ extern hfs_s32 hfs_do_read(struct inode *, struct hfs_fork *, hfs_u32, - char *, hfs_u32); + char __user *, hfs_u32); extern hfs_s32 hfs_do_write(struct inode *, struct hfs_fork *, hfs_u32, - const char *, hfs_u32); + const char __user *, hfs_u32); extern void hfs_file_fix_mode(struct hfs_cat_entry *entry); extern struct inode_operations hfs_file_inode_operations; extern struct file_operations hfs_file_operations; diff -Nru a/include/linux/highuid.h b/include/linux/highuid.h --- a/include/linux/highuid.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/highuid.h Wed Oct 8 12:24:57 2003 @@ -35,6 +35,9 @@ extern int overflowuid; extern int overflowgid; +extern void __bad_uid(void); +extern void __bad_gid(void); + #define DEFAULT_OVERFLOWUID 65534 #define DEFAULT_OVERFLOWGID 65534 @@ -50,33 +53,22 @@ #define low2highuid(uid) ((uid) == (old_uid_t)-1 ? (uid_t)-1 : (uid_t)(uid)) #define low2highgid(gid) ((gid) == (old_gid_t)-1 ? (gid_t)-1 : (gid_t)(gid)) -/* Avoid extra ifdefs with these macros */ - -#define SET_UID16(var, uid) var = high2lowuid(uid) -#define SET_GID16(var, gid) var = high2lowgid(gid) -#define NEW_TO_OLD_UID(uid) high2lowuid(uid) -#define NEW_TO_OLD_GID(gid) high2lowgid(gid) - -/* specific to fs/stat.c */ -#define SET_OLDSTAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) -#define SET_OLDSTAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) -#define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid) -#define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid) +#define __convert_uid(size, uid) \ + (size >= sizeof(uid) ? (uid) : high2lowuid(uid)) +#define __convert_gid(size, gid) \ + (size >= sizeof(gid) ? (gid) : high2lowgid(gid)) + #else -#define SET_UID16(var, uid) do { ; } while (0) -#define SET_GID16(var, gid) do { ; } while (0) -#define NEW_TO_OLD_UID(uid) (uid) -#define NEW_TO_OLD_GID(gid) (gid) - -#define SET_OLDSTAT_UID(stat, uid) (stat).st_uid = (uid) -#define SET_OLDSTAT_GID(stat, gid) (stat).st_gid = (gid) -#define SET_STAT_UID(stat, uid) (stat).st_uid = (uid) -#define SET_STAT_GID(stat, gid) (stat).st_gid = (gid) +#define __convert_uid(size, uid) (uid) +#define __convert_gid(size, gid) (gid) -#endif /* CONFIG_UID16 */ +#endif /* !CONFIG_UID16 */ +/* uid/gid input should be always 32bit uid_t */ +#define SET_UID(var, uid) do { (var) = __convert_uid(sizeof(var), (uid)); } while (0) +#define SET_GID(var, gid) do { (var) = __convert_gid(sizeof(var), (gid)); } while (0) /* * Everything below this line is needed on all architectures, to deal with diff -Nru a/include/linux/istallion.h b/include/linux/istallion.h --- a/include/linux/istallion.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/istallion.h Wed Oct 8 12:24:56 2003 @@ -21,6 +21,8 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + /*****************************************************************************/ #ifndef _ISTALLION_H #define _ISTALLION_H diff -Nru a/include/linux/list.h b/include/linux/list.h --- a/include/linux/list.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/list.h Wed Oct 8 12:24:56 2003 @@ -203,7 +203,7 @@ * list_empty - tests whether a list is empty * @head: the list to test. */ -static inline int list_empty(struct list_head *head) +static inline int list_empty(const struct list_head *head) { return head->next == head; } @@ -325,6 +325,19 @@ pos = list_entry(pos->member.prev, typeof(*pos), member), \ prefetch(pos->member.prev)) +/** + * list_for_each_entry_continue - iterate over list of given type + * continuing after existing point + * @pos: the type * to use as a loop counter. + * @head: the head for your list. + * @member: the name of the list_struct within the struct. + */ +#define list_for_each_entry_continue(pos, head, member) \ + for (pos = list_entry(pos->member.next, typeof(*pos), member), \ + prefetch(pos->member.next); \ + &pos->member != (head); \ + pos = list_entry(pos->member.next, typeof(*pos), member), \ + prefetch(pos->member.next)) /** * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry @@ -408,12 +421,12 @@ #define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) #define INIT_HLIST_NODE(ptr) ((ptr)->next = NULL, (ptr)->pprev = NULL) -static __inline__ int hlist_unhashed(struct hlist_node *h) +static __inline__ int hlist_unhashed(const struct hlist_node *h) { return !h->pprev; } -static __inline__ int hlist_empty(struct hlist_head *h) +static __inline__ int hlist_empty(const struct hlist_head *h) { return !h->first; } @@ -436,7 +449,7 @@ /** * hlist_del_rcu - deletes entry from hash list without re-initialization - * @entry: the element to delete from the hash list. + * @n: the element to delete from the hash list. * * Note: list_unhashed() on entry does not return true after this, * the entry is in an undefined state. It is useful for RCU based diff -Nru a/include/linux/mca-legacy.h b/include/linux/mca-legacy.h --- a/include/linux/mca-legacy.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/mca-legacy.h Wed Oct 8 12:24:57 2003 @@ -7,6 +7,8 @@ #ifndef _LINUX_MCA_LEGACY_H #define _LINUX_MCA_LEGACY_H +#include + #warning "MCA legacy - please move your driver to the new sysfs api" /* MCA_NOTFOUND is an error condition. The other two indicate diff -Nru a/include/linux/mca.h b/include/linux/mca.h --- a/include/linux/mca.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/mca.h Wed Oct 8 12:24:56 2003 @@ -136,10 +136,6 @@ /* WARNING: only called by the boot time device setup */ extern int mca_register_device(int bus, struct mca_device *mca_dev); -#ifdef CONFIG_MCA_LEGACY -#include -#endif - #ifdef CONFIG_MCA_PROC_FS extern void mca_do_proc_init(void); extern void mca_set_adapter_procfn(int slot, MCA_ProcFn, void* dev); diff -Nru a/include/linux/mm.h b/include/linux/mm.h --- a/include/linux/mm.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/mm.h Wed Oct 8 12:24:55 2003 @@ -196,7 +196,7 @@ #if defined(WANT_PAGE_VIRTUAL) void *virtual; /* Kernel virtual address (NULL if not kmapped, ie. highmem) */ -#endif /* CONFIG_HIGMEM || WANT_PAGE_VIRTUAL */ +#endif /* WANT_PAGE_VIRTUAL */ }; /* @@ -323,7 +323,6 @@ * The zone field is never updated after free_area_init_core() * sets it, so none of the operations on it need to be atomic. */ -#define NODE_SHIFT 4 #define ZONE_SHIFT (BITS_PER_LONG - 8) struct zone; diff -Nru a/include/linux/mman.h b/include/linux/mman.h --- a/include/linux/mman.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/mman.h Wed Oct 8 12:24:55 2003 @@ -28,8 +28,13 @@ vm_acct_memory(-pages); } -/* Optimisation macro. */ -#define _calc_vm_trans(x,bit1,bit2) \ +/* + * Optimisation macro. It is equivalent to: + * (x & bit1) ? bit2 : 0 + * but this version is faster. + * ("bit1" and "bit2" must be single bits) + */ +#define _calc_vm_trans(x, bit1, bit2) \ ((bit1) <= (bit2) ? ((x) & (bit1)) * ((bit2) / (bit1)) \ : ((x) & (bit1)) / ((bit1) / (bit2))) diff -Nru a/include/linux/mmzone.h b/include/linux/mmzone.h --- a/include/linux/mmzone.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/mmzone.h Wed Oct 8 12:24:56 2003 @@ -10,13 +10,8 @@ #include #include #include +#include #include -#ifdef CONFIG_DISCONTIGMEM -#include -#endif -#ifndef MAX_NUMNODES -#define MAX_NUMNODES 1 -#endif /* Free memory management - zoned buddy allocator. */ #ifndef CONFIG_FORCE_MAX_ZONEORDER @@ -303,19 +298,34 @@ #define numa_node_id() (cpu_to_node(smp_processor_id())) #ifndef CONFIG_DISCONTIGMEM + extern struct pglist_data contig_page_data; #define NODE_DATA(nid) (&contig_page_data) #define NODE_MEM_MAP(nid) mem_map -#define MAX_NR_NODES 1 +#define MAX_NODES_SHIFT 0 + #else /* CONFIG_DISCONTIGMEM */ #include -/* page->zone is currently 8 bits ... */ -#define MAX_NR_NODES (255 / MAX_NR_ZONES) +#if BITS_PER_LONG == 32 +/* + * with 32 bit flags field, page->zone is currently 8 bits. + * there are 3 zones (2 bits) and this leaves 8-2=6 bits for nodes. + */ +#define MAX_NODES_SHIFT 6 +#elif BITS_PER_LONG == 64 +/* + * with 64 bit flags field, there's plenty of room. + */ +#define MAX_NODES_SHIFT 10 +#endif #endif /* !CONFIG_DISCONTIGMEM */ +#if NODES_SHIFT > MAX_NODES_SHIFT +#error NODES_SHIFT > MAX_NODES_SHIFT +#endif extern DECLARE_BITMAP(node_online_map, MAX_NUMNODES); extern DECLARE_BITMAP(memblk_online_map, MAX_NR_MEMBLKS); diff -Nru a/include/linux/moduleparam.h b/include/linux/moduleparam.h --- a/include/linux/moduleparam.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/moduleparam.h Wed Oct 8 12:24:56 2003 @@ -3,6 +3,7 @@ /* (C) Copyright 2001, 2002 Rusty Russell IBM Corporation */ #include #include +#include /* You can override this manually, but generally this should match the module name. */ @@ -33,6 +34,17 @@ char *string; }; +/* Special one for arrays */ +struct kparam_array +{ + unsigned int max; + unsigned int *num; + param_set_fn set; + param_get_fn get; + unsigned int elemsize; + void *elem; +}; + /* This is the fundamental function for registering boot/module parameters. perm sets the visibility in driverfs: 000 means it's not there, read bits mean it's readable, write bits mean it's @@ -112,10 +124,16 @@ extern int param_get_invbool(char *buffer, struct kernel_param *kp); #define param_check_invbool(name, p) __param_check(name, p, int) -/* First two elements are the max and min array length (which don't change) */ -extern int param_set_intarray(const char *val, struct kernel_param *kp); -extern int param_get_intarray(char *buffer, struct kernel_param *kp); -#define param_check_intarray(name, p) __param_check(name, p, int *) +/* Comma-separated array: num is set to number they actually specified. */ +#define module_param_array(name, type, num, perm) \ + static struct kparam_array __param_arr_##name \ + = { ARRAY_SIZE(name), &num, param_set_##type, param_get_##type, \ + sizeof(name[0]), name }; \ + module_param_call(name, param_array_set, param_array_get, \ + &__param_arr_##name, perm) + +extern int param_array_set(const char *val, struct kernel_param *kp); +extern int param_array_get(char *buffer, struct kernel_param *kp); extern int param_set_copystring(const char *val, struct kernel_param *kp); @@ -123,5 +141,6 @@ const char *val, unsigned int min, unsigned int max, void *elem, int elemsize, - int (*set)(const char *, struct kernel_param *kp)); + int (*set)(const char *, struct kernel_param *kp), + int *num); #endif /* _LINUX_MODULE_PARAM_TYPES_H */ diff -Nru a/include/linux/netdevice.h b/include/linux/netdevice.h --- a/include/linux/netdevice.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/netdevice.h Wed Oct 8 12:24:57 2003 @@ -201,7 +201,7 @@ (HH_DATA_MOD - ((__len) & (HH_DATA_MOD - 1))) #define HH_DATA_ALIGN(__len) \ (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1)) - unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER)]; + unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)]; }; /* Reserve HH_DATA_MOD byte aligned hard_header_len, but at least that much. @@ -477,15 +477,12 @@ */ #define SET_NETDEV_DEV(net, pdev) ((net)->class_dev.dev = (pdev)) -#define PKT_CAN_SHARE_SKB ((void*)1) - -struct packet_type -{ +struct packet_type { unsigned short type; /* This is really htons(ether_type). */ struct net_device *dev; /* NULL is wildcarded here */ int (*func) (struct sk_buff *, struct net_device *, struct packet_type *); - void *data; /* Private to the packet type */ + void *af_packet_priv; struct list_head list; }; diff -Nru a/include/linux/netfilter_bridge/ebt_limit.h b/include/linux/netfilter_bridge/ebt_limit.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/netfilter_bridge/ebt_limit.h Wed Oct 8 12:24:57 2003 @@ -0,0 +1,23 @@ +#ifndef __LINUX_BRIDGE_EBT_LIMIT_H +#define __LINUX_BRIDGE_EBT_LIMIT_H + +#define EBT_LIMIT_MATCH "limit" + +/* timings are in milliseconds. */ +#define EBT_LIMIT_SCALE 10000 + +/* 1/10,000 sec period => max of 10,000/sec. Min rate is then 429490 + seconds, or one every 59 hours. */ + +struct ebt_limit_info +{ + u_int32_t avg; /* Average secs between packets * scale */ + u_int32_t burst; /* Period multiplier for upper limit. */ + + /* Used internally by the kernel */ + unsigned long prev; + u_int32_t credit; + u_int32_t credit_cap, cost; +}; + +#endif diff -Nru a/include/linux/netfilter_bridge.h b/include/linux/netfilter_bridge.h --- a/include/linux/netfilter_bridge.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/netfilter_bridge.h Wed Oct 8 12:24:57 2003 @@ -8,6 +8,9 @@ #include #if defined(__KERNEL__) && defined(CONFIG_BRIDGE_NETFILTER) #include +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) +#include +#endif #endif /* Bridge Hooks */ @@ -44,6 +47,7 @@ #define BRNF_BRIDGED_DNAT 0x02 #define BRNF_DONT_TAKE_PARENT 0x04 #define BRNF_BRIDGED 0x08 +#define BRNF_NF_BRIDGE_PREROUTING 0x10 static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb) @@ -54,9 +58,39 @@ atomic_set(&(*nf_bridge)->use, 1); (*nf_bridge)->mask = 0; (*nf_bridge)->physindev = (*nf_bridge)->physoutdev = NULL; +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + (*nf_bridge)->netoutdev = NULL; +#endif } return *nf_bridge; +} + +/* Only used in br_forward.c */ +static inline +void nf_bridge_maybe_copy_header(struct sk_buff *skb) +{ + if (skb->nf_bridge) { +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + memcpy(skb->data - 18, skb->nf_bridge->hh, 18); + skb_push(skb, 4); + } else +#endif + memcpy(skb->data - 16, skb->nf_bridge->hh, 16); + } +} + +static inline +void nf_bridge_save_header(struct sk_buff *skb) +{ + int header_size = 16; + +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + if (skb->protocol == __constant_htons(ETH_P_8021Q)) + header_size = 18; +#endif + memcpy(skb->nf_bridge->hh, skb->data - header_size, header_size); } struct bridge_skb_cb { diff -Nru a/include/linux/netfilter_ipv4/ip_conntrack_tuple.h b/include/linux/netfilter_ipv4/ip_conntrack_tuple.h --- a/include/linux/netfilter_ipv4/ip_conntrack_tuple.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/netfilter_ipv4/ip_conntrack_tuple.h Wed Oct 8 12:24:57 2003 @@ -62,6 +62,14 @@ } dst; }; +/* This is optimized opposed to a memset of the whole structure. Everything we + * really care about is the source/destination unions */ +#define IP_CT_TUPLE_U_BLANK(tuple) \ + do { \ + (tuple)->src.u.all = 0; \ + (tuple)->dst.u.all = 0; \ + } while (0) + enum ip_conntrack_dir { IP_CT_DIR_ORIGINAL, diff -Nru a/include/linux/netfilter_ipv4/ip_nat_rule.h b/include/linux/netfilter_ipv4/ip_nat_rule.h --- a/include/linux/netfilter_ipv4/ip_nat_rule.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/netfilter_ipv4/ip_nat_rule.h Wed Oct 8 12:24:57 2003 @@ -14,5 +14,10 @@ const struct net_device *out, struct ip_conntrack *ct, struct ip_nat_info *info); + +extern unsigned int +alloc_null_binding(struct ip_conntrack *conntrack, + struct ip_nat_info *info, + unsigned int hooknum); #endif #endif /* _IP_NAT_RULE_H */ diff -Nru a/include/linux/netlink.h b/include/linux/netlink.h --- a/include/linux/netlink.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/netlink.h Wed Oct 8 12:24:57 2003 @@ -2,6 +2,7 @@ #define __LINUX_NETLINK_H #include /* for sa_family_t */ +#include #define NETLINK_ROUTE 0 /* Routing/device hook */ #define NETLINK_SKIP 1 /* Reserved for ENskip */ diff -Nru a/include/linux/nfs4.h b/include/linux/nfs4.h --- a/include/linux/nfs4.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/nfs4.h Wed Oct 8 12:24:56 2003 @@ -46,8 +46,8 @@ #define NFS4_ACE_SYSTEM_AUDIT_ACE_TYPE 2 #define NFS4_ACE_SYSTEM_ALARM_ACE_TYPE 3 -typedef char nfs4_verifier[NFS4_VERIFIER_SIZE]; -typedef char nfs4_stateid[16]; +typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier; +typedef struct { char data[16]; } nfs4_stateid; enum nfs_opnum4 { OP_ACCESS = 3, diff -Nru a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h --- a/include/linux/nfs_fs.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/nfs_fs.h Wed Oct 8 12:24:56 2003 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -26,7 +27,6 @@ #include #include #include -#include #include /* @@ -157,9 +157,7 @@ #ifdef CONFIG_NFS_V4 /* NFSv4 state */ - struct nfs4_shareowner *ro_owner; - struct nfs4_shareowner *wo_owner; - struct nfs4_shareowner *rw_owner; + struct list_head open_states; #endif /* CONFIG_NFS_V4*/ struct inode vfs_inode; @@ -228,21 +226,16 @@ return ((loff_t)page->index) << PAGE_CACHE_SHIFT; } -static inline -loff_t req_offset(struct nfs_page *req) -{ - return (((loff_t)req->wb_index) << PAGE_CACHE_SHIFT) + req->wb_offset; -} - /* * linux/fs/nfs/inode.c */ extern void nfs_zap_caches(struct inode *); -extern struct inode *nfs_fhget(struct dentry *, struct nfs_fh *, +extern struct inode *nfs_fhget(struct super_block *, struct nfs_fh *, struct nfs_fattr *); extern int __nfs_refresh_inode(struct inode *, struct nfs_fattr *); extern int nfs_getattr(struct vfsmount *, struct dentry *, struct kstat *); extern int nfs_permission(struct inode *, int, struct nameidata *); +extern void nfs_set_mmcred(struct inode *, struct rpc_cred *); extern int nfs_open(struct inode *, struct file *); extern int nfs_release(struct inode *, struct file *); extern int __nfs_revalidate_inode(struct nfs_server *, struct inode *); @@ -469,45 +462,96 @@ ((err) != NFSERR_RESOURCE) && \ ((err) != NFSERR_NOFILEHANDLE)) +enum nfs4_client_state { + NFS4CLNT_OK = 0, + NFS4CLNT_NEW, +}; + +/* + * The nfs4_client identifies our client state to the server. + */ struct nfs4_client { - u64 cl_clientid; /* constant */ - nfs4_verifier cl_confirm; + struct list_head cl_servers; /* Global list of servers */ + struct in_addr cl_addr; /* Server identifier */ + u64 cl_clientid; /* constant */ + nfs4_verifier cl_confirm; + enum nfs4_client_state cl_state; u32 cl_lockowner_id; + + /* + * The following rwsem ensures exclusive access to the server + * while we recover the state following a lease expiration. + */ + struct rw_semaphore cl_sem; + + struct list_head cl_state_owners; + struct list_head cl_unused; + int cl_nunused; + spinlock_t cl_lock; + atomic_t cl_count; }; /* -* The ->so_sema is held during all shareowner seqid-mutating operations: -* OPEN, OPEN_DOWNGRADE, and CLOSE. -* Its purpose is to properly serialize so_seqid, as mandated by -* the protocol. -*/ -struct nfs4_shareowner { + * NFS4 state_owners and lock_owners are simply labels for ordered + * sequences of RPC calls. Their sole purpose is to provide once-only + * semantics by allowing the server to identify replayed requests. + * + * The ->so_sema is held during all state_owner seqid-mutating operations: + * OPEN, OPEN_DOWNGRADE, and CLOSE. Its purpose is to properly serialize + * so_seqid. + */ +struct nfs4_state_owner { + struct list_head so_list; /* per-clientid list of state_owners */ + struct nfs4_client *so_client; u32 so_id; /* 32-bit identifier, unique */ struct semaphore so_sema; u32 so_seqid; /* protected by so_sema */ - nfs4_stateid so_stateid; /* protected by so_sema */ unsigned int so_flags; /* protected by so_sema */ + atomic_t so_count; + + struct rpc_cred *so_cred; /* Associated cred */ + struct list_head so_states; +}; + +/* + * struct nfs4_state maintains the client-side state for a given + * (state_owner,inode) tuple. + * + * In order to know when to OPEN_DOWNGRADE or CLOSE the state on the server, + * we need to know how many files are open for reading or writing on a + * given inode. This information too is stored here. + */ +struct nfs4_state { + struct list_head open_states; /* List of states for the same state_owner */ + struct list_head inode_states; /* List of states for the same inode */ + + struct nfs4_state_owner *owner; /* Pointer to the open owner */ + struct inode *inode; /* Pointer to the inode */ + pid_t pid; /* Thread that called OPEN */ + + nfs4_stateid stateid; + + int state; /* State on the server (R,W, or RW) */ + atomic_t count; }; /* nfs4proc.c */ extern int nfs4_proc_renew(struct nfs_server *server); -extern int nfs4_do_close(struct inode *inode, struct nfs4_shareowner *sp); +extern int nfs4_do_close(struct inode *, struct nfs4_state *); /* nfs4renewd.c */ extern int nfs4_init_renewd(struct nfs_server *server); /* nfs4state.c */ -extern struct nfs4_client *nfs4_get_client(void); +extern struct nfs4_client *nfs4_get_client(struct in_addr *); extern void nfs4_put_client(struct nfs4_client *clp); -extern struct nfs4_shareowner * nfs4_get_shareowner(struct inode *inode); -void nfs4_put_shareowner(struct inode *inode, struct nfs4_shareowner *sp); -extern int nfs4_set_inode_share(struct inode * inode, - struct nfs4_shareowner *sp, unsigned int flags); -extern void nfs4_increment_seqid(u32 status, struct nfs4_shareowner *sp); -extern int nfs4_test_shareowner(struct inode *inode, unsigned int open_flags); -struct nfs4_shareowner * nfs4_get_inode_share(struct inode * inode, unsigned int open_flags); +extern struct nfs4_state_owner * nfs4_get_state_owner(struct nfs_server *, struct rpc_cred *); +extern void nfs4_put_state_owner(struct nfs4_state_owner *); +extern struct nfs4_state * nfs4_get_open_state(struct inode *, struct nfs4_state_owner *); +extern void nfs4_put_open_state(struct nfs4_state *); +extern void nfs4_increment_seqid(u32 status, struct nfs4_state_owner *sp); @@ -537,7 +581,8 @@ #else #define create_nfsv4_state(server, data) 0 #define destroy_nfsv4_state(server) do { } while (0) -#define nfs4_put_shareowner(inode, owner) do { } while (0) +#define nfs4_put_state_owner(inode, owner) do { } while (0) +#define nfs4_put_open_state(state) do { } while (0) #endif #endif /* __KERNEL__ */ diff -Nru a/include/linux/nfs_page.h b/include/linux/nfs_page.h --- a/include/linux/nfs_page.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/nfs_page.h Wed Oct 8 12:24:55 2003 @@ -11,7 +11,7 @@ #include -#include +#include #include #include #include @@ -28,6 +28,7 @@ struct file *wb_file; struct inode *wb_inode; struct rpc_cred *wb_cred; + struct nfs4_state *wb_state; struct page *wb_page; /* page to read in/write out */ wait_queue_head_t wb_wait; /* wait queue */ unsigned long wb_index; /* Offset >> PAGE_CACHE_SHIFT */ @@ -41,7 +42,7 @@ #define NFS_WBACK_BUSY(req) (test_bit(PG_BUSY,&(req)->wb_flags)) -extern struct nfs_page *nfs_create_request(struct rpc_cred *, struct inode *, +extern struct nfs_page *nfs_create_request(struct file *, struct inode *, struct page *, unsigned int, unsigned int); extern void nfs_clear_request(struct nfs_page *req); @@ -119,6 +120,12 @@ nfs_list_entry(struct list_head *head) { return list_entry(head, struct nfs_page, wb_list); +} + +static inline +loff_t req_offset(struct nfs_page *req) +{ + return (((loff_t)req->wb_index) << PAGE_CACHE_SHIFT) + req->wb_offset; } #endif /* _LINUX_NFS_PAGE_H */ diff -Nru a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h --- a/include/linux/nfs_xdr.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/nfs_xdr.h Wed Oct 8 12:24:57 2003 @@ -451,7 +451,6 @@ struct nfs_fsstat * gt_fsstat; /* response */ struct nfs_fsinfo * gt_fsinfo; /* response */ struct nfs_pathconf * gt_pathconf; /* response */ - u32 * gt_bmres; /* response */ }; struct nfs4_getfh { @@ -591,6 +590,7 @@ #endif /* CONFIG_NFS_V4 */ struct nfs_read_data { + int flags; struct rpc_task task; struct inode *inode; struct rpc_cred *cred; @@ -605,6 +605,7 @@ }; struct nfs_write_data { + int flags; struct rpc_task task; struct inode *inode; struct rpc_cred *cred; @@ -619,6 +620,8 @@ #endif }; +struct nfs_page; + /* * RPC procedure vector for NFSv2/NFSv3 demuxing */ @@ -634,18 +637,12 @@ struct nfs_fh *, struct nfs_fattr *); int (*access) (struct inode *, struct rpc_cred *, int); int (*readlink)(struct inode *, struct page *); - int (*read) (struct inode *, struct rpc_cred *, - struct nfs_fattr *, - int, unsigned int, unsigned int, - struct page *, int *eofp); - int (*write) (struct inode *, struct rpc_cred *, - struct nfs_fattr *, - int, unsigned int, unsigned int, - struct page *, struct nfs_writeverf *verfp); + int (*read) (struct nfs_read_data *, struct file *); + int (*write) (struct nfs_write_data *, struct file *); int (*commit) (struct inode *, struct nfs_fattr *, unsigned long, unsigned int); - int (*create) (struct inode *, struct qstr *, struct iattr *, - int, struct nfs_fh *, struct nfs_fattr *); + struct inode * (*create) (struct inode *, struct qstr *, + struct iattr *, int); int (*remove) (struct inode *, struct qstr *); int (*unlink_setup) (struct rpc_message *, struct dentry *, struct qstr *); @@ -674,6 +671,9 @@ void (*write_setup) (struct nfs_write_data *, unsigned int count, int how); void (*commit_setup) (struct nfs_write_data *, u64 start, u32 len, int how); int (*file_open) (struct inode *, struct file *); + int (*file_release) (struct inode *, struct file *); + void (*request_init)(struct nfs_page *, struct file *); + int (*request_compatible)(struct nfs_page *, struct file *, struct page *); }; /* diff -Nru a/include/linux/numa.h b/include/linux/numa.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/numa.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,16 @@ +#ifndef _LINUX_NUMA_H +#define _LINUX_NUMA_H + +#include + +#ifdef CONFIG_DISCONTIGMEM +#include +#endif + +#ifndef NODES_SHIFT +#define NODES_SHIFT 0 +#endif + +#define MAX_NUMNODES (1 << NODES_SHIFT) + +#endif /* _LINUX_NUMA_H */ diff -Nru a/include/linux/parser.h b/include/linux/parser.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/linux/parser.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,21 @@ +struct match_token { + int token; + char *pattern; +}; + +typedef struct match_token match_table_t[]; + +enum {MAX_OPT_ARGS = 3}; + +typedef struct { + char *from; + char *to; +} substring_t; + +int match_token(char *s, match_table_t table, substring_t args[]); + +int match_int(substring_t *, int *result); +int match_octal(substring_t *, int *result); +int match_hex(substring_t *, int *result); +void match_strcpy(char *, substring_t *); +char *match_strdup(substring_t *); diff -Nru a/include/linux/pci.h b/include/linux/pci.h --- a/include/linux/pci.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/pci.h Wed Oct 8 12:24:56 2003 @@ -515,7 +515,6 @@ const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */ int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */ void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ - int (*save_state) (struct pci_dev *dev, u32 state); /* Save Device Context */ int (*suspend) (struct pci_dev *dev, u32 state); /* Device suspended */ int (*resume) (struct pci_dev *dev); /* Device woken up */ int (*enable_wake) (struct pci_dev *dev, u32 state, int enable); /* Enable wake event */ diff -Nru a/include/linux/profile.h b/include/linux/profile.h --- a/include/linux/profile.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/profile.h Wed Oct 8 12:24:56 2003 @@ -48,6 +48,8 @@ int register_profile_notifier(struct notifier_block * nb); int unregister_profile_notifier(struct notifier_block * nb); +struct pt_regs; + /* profiling hook activated on each timer interrupt */ void profile_hook(struct pt_regs * regs); diff -Nru a/include/linux/raw.h b/include/linux/raw.h --- a/include/linux/raw.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/raw.h Wed Oct 8 12:24:57 2003 @@ -13,4 +13,6 @@ __u64 block_minor; }; +#define MAX_RAW_MINORS CONFIG_MAX_RAW_DEVS + #endif /* __LINUX_RAW_H */ diff -Nru a/include/linux/rcupdate.h b/include/linux/rcupdate.h --- a/include/linux/rcupdate.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/rcupdate.h Wed Oct 8 12:24:56 2003 @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * Copyright (c) IBM Corporation, 2001 + * Copyright (C) IBM Corporation, 2001 * * Author: Dipankar Sarma * diff -Nru a/include/linux/root_dev.h b/include/linux/root_dev.h --- a/include/linux/root_dev.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/root_dev.h Wed Oct 8 12:24:56 2003 @@ -1,6 +1,8 @@ #ifndef _ROOT_DEV_H_ #define _ROOT_DEV_H_ +#include + enum { Root_NFS = MKDEV(UNNAMED_MAJOR, 255), Root_RAM0 = MKDEV(RAMDISK_MAJOR, 0), diff -Nru a/include/linux/sched.h b/include/linux/sched.h --- a/include/linux/sched.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/sched.h Wed Oct 8 12:24:55 2003 @@ -207,6 +207,8 @@ cpumask_t cpu_vm_mask; unsigned long swap_address; + unsigned long saved_auxv[40]; /* for /proc/PID/auxv */ + unsigned dumpable:1; #ifdef CONFIG_HUGETLB_PAGE int used_hugetlb; @@ -262,6 +264,15 @@ /* thread group stop support, overloads group_exit_code too */ int group_stop_count; + + /* job control IDs */ + pid_t pgrp; + pid_t tty_old_pgrp; + pid_t session; + /* boolean value for session group leader */ + int leader; + + struct tty_struct *tty; /* NULL if no tty */ }; /* @@ -364,12 +375,7 @@ unsigned long personality; int did_exec:1; pid_t pid; - pid_t __pgrp; /* Accessed via process_group() */ - pid_t tty_old_pgrp; - pid_t session; pid_t tgid; - /* boolean value for session group leader */ - int leader; /* * pointers to (original) parent process, youngest child, younger sibling, * older sibling, respectively. (p->father can be replaced with @@ -413,8 +419,6 @@ char comm[16]; /* file system info */ int link_count, total_link_count; - struct tty_struct *tty; /* NULL if no tty */ - unsigned int locks; /* How many file locks are being held */ /* ipc stuff */ struct sysv_sem sysvsem; /* CPU-specific state of this task */ @@ -467,7 +471,22 @@ static inline pid_t process_group(struct task_struct *tsk) { - return tsk->group_leader->__pgrp; + return tsk->signal->pgrp; +} + +static inline pid_t process_session(struct task_struct *tsk) +{ + return tsk->signal->session; +} + +static inline int process_session_leader(struct task_struct *tsk) +{ + return tsk->signal->leader; +} + +static inline struct tty_struct *process_tty(struct task_struct *tsk) +{ + return tsk->signal->tty; } extern void __put_task_struct(struct task_struct *tsk); diff -Nru a/include/linux/sctp.h b/include/linux/sctp.h --- a/include/linux/sctp.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/sctp.h Wed Oct 8 12:24:57 2003 @@ -524,113 +524,4 @@ sctp_addiphdr_t addip_hdr; } sctp_addip_chunk_t __attribute__((packed)); -/* FIXME: Cleanup needs to continue below this line. */ - - -/* ADDIP Section 3.1.1 - * - * ASCONF-Request Correlation ID: 32 bits (unsigned integer) - * - * This is an opaque integer assigned by the sender to identify each - * request parameter. It is in host byte order and is only meaningful - * to the sender. The receiver of the ASCONF Chunk will copy this 32 - * bit value into the ASCONF Correlation ID field of the - * ASCONF-ACK. The sender of the ASCONF can use this same value in the - * ASCONF-ACK to find which request the response is for. - * - * ASCONF Parameter: TLV format - * - * Each Address configuration change is represented by a TLV parameter - * as defined in Section 3.2. One or more requests may be present in - * an ASCONF Chunk. - */ -typedef struct { - __u32 correlation; - sctp_paramhdr_t p; - __u8 payload[0]; -} sctpAsconfReq_t; - -/* ADDIP - * 3.1.1 Address/Stream Configuration Change Chunk (ASCONF) - * - * This chunk is used to communicate to the remote endpoint one of the - * configuration change requests that MUST be acknowledged. The - * information carried in the ASCONF Chunk uses the form of a - * Tag-Length-Value (TLV), as described in "3.2.1 - * Optional/Variable-length Parameter Format" in [RFC2960], for all - * variable parameters. - */ -typedef struct { - __u32 serial; - __u8 reserved[3]; - __u8 addr_type; - __u32 addr[4]; - sctpAsconfReq_t requests[0]; -} sctpAsconf_t; - -/* ADDIP - * 3.1.2 Address/Stream Configuration Acknowledgment Chunk (ASCONF-ACK) - * - * ASCONF-Request Correlation ID: 32 bits (unsigned integer) - * - * This value is copied from the ASCONF Correlation ID received in the - * ASCONF Chunk. It is used by the receiver of the ASCONF-ACK to identify - * which ASCONF parameter this response is associated with. - * - * ASCONF Parameter Response : TLV format - * - * The ASCONF Parameter Response is used in the ASCONF-ACK to report - * status of ASCONF processing. By default, if a responding endpoint - * does not include any Error Cause, a success is indicated. Thus a - * sender of an ASCONF-ACK MAY indicate complete success of all TLVs in - * an ASCONF by returning only the Chunk Type, Chunk Flags, Chunk Length - * (set to 8) and the Serial Number. - */ -typedef union { - struct { - __u32 correlation; - sctp_paramhdr_t header; /* success report */ - } success; - struct { - __u32 correlation; - sctp_paramhdr_t header; /* error cause indication */ - sctp_paramhdr_t errcause; - uint8_t request[0]; /* original request from ASCONF */ - } error; -#define __correlation success.correlation -#define __header success.header -#define __cause error.errcause -#define __request error.request -} sctpAsconfAckRsp_t; - -/* ADDIP - * 3.1.2 Address/Stream Configuration Acknowledgment Chunk (ASCONF-ACK) - * - * This chunk is used by the receiver of an ASCONF Chunk to - * acknowledge the reception. It carries zero or more results for any - * ASCONF Parameters that were processed by the receiver. - */ -typedef struct { - __u32 serial; - sctpAsconfAckRsp_t responses[0]; -} sctpAsconfAck_t; - -/********************************************************************* - * Internal structures - * - * These are data structures which never go out on the wire. - *********************************************************************/ - -/* What is this data structure for? The TLV isn't one--it is just a - * value. Perhaps this data structure ought to have a type--otherwise - * it is not unambigiously parseable. --piggy - */ -typedef struct { - struct list_head hook; - int length; /* length of the TLV */ - - /* the actually TLV to be copied into ASCONF_ACK */ - sctpAsconfAckRsp_t TLV; -} sctpAsconfAckRspNode_t; - #endif /* __LINUX_SCTP_H__ */ diff -Nru a/include/linux/security.h b/include/linux/security.h --- a/include/linux/security.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/security.h Wed Oct 8 12:24:57 2003 @@ -334,6 +334,7 @@ * called when the actual read/write operations are performed. * @inode contains the inode structure to check. * @mask contains the permission mask. + * @nd contains the nameidata (may be NULL). * Return 0 if permission is granted. * @inode_setattr: * Check permission before setting file attributes. Note that the kernel @@ -1055,7 +1056,7 @@ struct dentry *new_dentry); int (*inode_readlink) (struct dentry *dentry); int (*inode_follow_link) (struct dentry *dentry, struct nameidata *nd); - int (*inode_permission) (struct inode *inode, int mask); + int (*inode_permission) (struct inode *inode, int mask, struct nameidata *nd); int (*inode_setattr) (struct dentry *dentry, struct iattr *attr); int (*inode_getattr) (struct vfsmount *mnt, struct dentry *dentry); void (*inode_delete) (struct inode *inode); @@ -1474,9 +1475,10 @@ return security_ops->inode_follow_link (dentry, nd); } -static inline int security_inode_permission (struct inode *inode, int mask) +static inline int security_inode_permission (struct inode *inode, int mask, + struct nameidata *nd) { - return security_ops->inode_permission (inode, mask); + return security_ops->inode_permission (inode, mask, nd); } static inline int security_inode_setattr (struct dentry *dentry, @@ -2110,7 +2112,8 @@ return 0; } -static inline int security_inode_permission (struct inode *inode, int mask) +static inline int security_inode_permission (struct inode *inode, int mask, + struct nameidata *nd) { return 0; } diff -Nru a/include/linux/serialP.h b/include/linux/serialP.h --- a/include/linux/serialP.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/serialP.h Wed Oct 8 12:24:55 2003 @@ -19,6 +19,7 @@ * For definitions of the flags field, see tty.h */ +#include #include #include #include diff -Nru a/include/linux/serio.h b/include/linux/serio.h --- a/include/linux/serio.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/serio.h Wed Oct 8 12:24:57 2003 @@ -18,10 +18,7 @@ #include -struct serio; - struct serio { - void *private; void *driver; char *name; @@ -45,7 +42,6 @@ }; struct serio_dev { - void *private; char *name; diff -Nru a/include/linux/skbuff.h b/include/linux/skbuff.h --- a/include/linux/skbuff.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/skbuff.h Wed Oct 8 12:24:57 2003 @@ -103,8 +103,11 @@ atomic_t use; struct net_device *physindev; struct net_device *physoutdev; +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + struct net_device *netoutdev; +#endif unsigned int mask; - unsigned long hh[16 / sizeof(unsigned long)]; + unsigned long hh[32 / sizeof(unsigned long)]; }; #endif @@ -152,6 +155,7 @@ * @sk: Socket we are owned by * @stamp: Time we arrived * @dev: Device we arrived on/are leaving by + * @real_dev: The real device we are using * @h: Transport layer header * @nh: Network layer header * @mac: Link layer header @@ -179,6 +183,7 @@ * @nfct: Associated connection, if any * @nf_debug: Netfilter debugging * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c + * @private: Data which is private to the HIPPI implementation * @tc_index: Traffic control index */ @@ -885,7 +890,7 @@ */ static inline unsigned char *skb_pull(struct sk_buff *skb, unsigned int len) { - return (len > skb->len) ? NULL : __skb_pull(skb, len); + return unlikely(len > skb->len) ? NULL : __skb_pull(skb, len); } extern unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta); @@ -901,7 +906,7 @@ static inline unsigned char *pskb_pull(struct sk_buff *skb, unsigned int len) { - return (len > skb->len) ? NULL : __pskb_pull(skb, len); + return unlikely(len > skb->len) ? NULL : __pskb_pull(skb, len); } static inline int pskb_may_pull(struct sk_buff *skb, unsigned int len) @@ -1052,7 +1057,7 @@ int gfp_mask) { struct sk_buff *skb = alloc_skb(length + 16, gfp_mask); - if (skb) + if (likely(skb)) skb_reserve(skb, 16); return skb; } diff -Nru a/include/linux/stallion.h b/include/linux/stallion.h --- a/include/linux/stallion.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/stallion.h Wed Oct 8 12:24:57 2003 @@ -21,6 +21,8 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + /*****************************************************************************/ #ifndef _STALLION_H #define _STALLION_H diff -Nru a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h --- a/include/linux/sunrpc/rpc_pipe_fs.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/sunrpc/rpc_pipe_fs.h Wed Oct 8 12:24:56 2003 @@ -43,8 +43,5 @@ extern struct dentry *rpc_mkpipe(char *, void *, struct rpc_pipe_ops *, int flags); extern int rpc_unlink(char *); -void __rpc_purge_current_upcall(struct file *); -void __rpc_purge_one_upcall(struct file *filp, struct rpc_pipe_msg *target); - #endif #endif diff -Nru a/include/linux/sunrpc/timer.h b/include/linux/sunrpc/timer.h --- a/include/linux/sunrpc/timer.h Wed Oct 8 12:24:57 2003 +++ b/include/linux/sunrpc/timer.h Wed Oct 8 12:24:57 2003 @@ -15,11 +15,26 @@ unsigned long timeo; /* default timeout value */ unsigned long srtt[5]; /* smoothed round trip time << 3 */ unsigned long sdrtt[5]; /* smoothed medium deviation of RTT */ + int ntimeouts[5]; /* Number of timeouts for the last request */ }; extern void rpc_init_rtt(struct rpc_rtt *rt, unsigned long timeo); extern void rpc_update_rtt(struct rpc_rtt *rt, unsigned timer, long m); extern unsigned long rpc_calc_rto(struct rpc_rtt *rt, unsigned timer); + +static inline void rpc_set_timeo(struct rpc_rtt *rt, int timer, int ntimeo) +{ + if (!timer) + return; + rt->ntimeouts[timer-1] = ntimeo; +} + +static inline int rpc_ntimeo(struct rpc_rtt *rt, int timer) +{ + if (!timer) + return 0; + return rt->ntimeouts[timer-1]; +} #endif /* _LINUX_SUNRPC_TIMER_H */ diff -Nru a/include/linux/swap.h b/include/linux/swap.h --- a/include/linux/swap.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/swap.h Wed Oct 8 12:24:55 2003 @@ -261,11 +261,15 @@ #define lookup_swap_cache(swp) NULL #define valid_swaphandles(swp, off) 0 #define can_share_swap_page(p) 0 -#define remove_exclusive_swap_page(p) 0 #define move_to_swap_cache(p, swp) 1 #define move_from_swap_cache(p, i, m) 1 #define __delete_from_swap_cache(p) /*NOTHING*/ #define delete_from_swap_cache(p) /*NOTHING*/ + +static inline int remove_exclusive_swap_page(struct page *p) +{ + return 0; +} static inline swp_entry_t get_swap_page(void) { diff -Nru a/include/linux/sysctl.h b/include/linux/sysctl.h --- a/include/linux/sysctl.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/sysctl.h Wed Oct 8 12:24:56 2003 @@ -244,6 +244,7 @@ NET_IPV4_NEIGH=17, NET_IPV4_ROUTE=18, NET_IPV4_FIB_HASH=19, + NET_IPV4_NETFILTER=20, NET_IPV4_TCP_TIMESTAMPS=33, NET_IPV4_TCP_WINDOW_SCALING=34, @@ -358,6 +359,24 @@ NET_IPV4_CONF_NOPOLICY=16, }; +/* /proc/sys/net/ipv4/netfilter */ +enum +{ + NET_IPV4_NF_CONNTRACK_MAX=1, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT=2, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV=3, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED=4, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT=5, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT=6, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK=7, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT=8, + NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE=9, + NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT=10, + NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT_STREAM=11, + NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT=12, + NET_IPV4_NF_CONNTRACK_GENERIC_TIMEOUT=13, +}; + /* /proc/sys/net/ipv6 */ enum { NET_IPV6_CONF=16, diff -Nru a/include/linux/toshiba.h b/include/linux/toshiba.h --- a/include/linux/toshiba.h Wed Oct 8 12:24:55 2003 +++ b/include/linux/toshiba.h Wed Oct 8 12:24:55 2003 @@ -33,4 +33,13 @@ unsigned int edi __attribute__ ((packed)); } SMMRegisters; +#ifdef CONFIG_PROC_FS +static int tosh_get_info(char *, char **, off_t, int); +#else /* !CONFIG_PROC_FS */ +inline int tosh_get_info(char *buffer, char **start, off_t fpos, int lenght) +{ + return 0; +} +#endif /* CONFIG_PROC_FS */ + #endif diff -Nru a/include/linux/usb.h b/include/linux/usb.h --- a/include/linux/usb.h Wed Oct 8 12:24:56 2003 +++ b/include/linux/usb.h Wed Oct 8 12:24:56 2003 @@ -1038,9 +1038,9 @@ #define dbg(format, arg...) do {} while (0) #endif -#define err(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg) -#define info(format, arg...) printk(KERN_INFO __FILE__ ": " format "\n" , ## arg) -#define warn(format, arg...) printk(KERN_WARNING __FILE__ ": " format "\n" , ## arg) +#define err(format, arg...) printk(KERN_ERR "%s: " format "\n" , __FILE__ , ## arg) +#define info(format, arg...) printk(KERN_INFO "%s: " format "\n" , __FILE__ , ## arg) +#define warn(format, arg...) printk(KERN_WARNING "%s: " format "\n" , __FILE__ , ## arg) #endif /* __KERNEL__ */ diff -Nru a/include/media/saa6752hs.h b/include/media/saa6752hs.h --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/include/media/saa6752hs.h Wed Oct 8 12:24:58 2003 @@ -0,0 +1,58 @@ +/* + saa6752hs.h - definition for saa6752hs MPEG encoder + + Copyright (C) 2003 Andrew de Quincey + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _SAA6752HS_H +#define _SAA6752HS_H + +enum mpeg_bitrate_mode { + MPEG_BITRATE_MODE_VBR = 0, /* Variable bitrate */ + MPEG_BITRATE_MODE_CBR = 1, /* Constant bitrate */ + + MPEG_BITRATE_MODE_MAX +}; + +enum mpeg_audio_bitrate { + MPEG_AUDIO_BITRATE_256 = 0, /* 256 kBit/sec */ + MPEG_AUDIO_BITRATE_384 = 1, /* 384 kBit/sec */ + + MPEG_AUDIO_BITRATE_MAX +}; + +#define MPEG_VIDEO_TARGET_BITRATE_MAX 27000 +#define MPEG_VIDEO_MAX_BITRATE_MAX 27000 +#define MPEG_TOTAL_BITRATE_MAX 27000 + +struct mpeg_params { + enum mpeg_bitrate_mode bitrate_mode; + unsigned int video_target_bitrate; + unsigned int video_max_bitrate; // only used for VBR + enum mpeg_audio_bitrate audio_bitrate; + unsigned int total_bitrate; +}; + +#define MPEG_SETPARAMS _IOW('6',100,struct mpeg_params) + +#endif // _SAA6752HS_H + +/* + * Local variables: + * c-basic-offset: 8 + * End: + */ diff -Nru a/include/media/video-buf.h b/include/media/video-buf.h --- a/include/media/video-buf.h Wed Oct 8 12:24:56 2003 +++ b/include/media/video-buf.h Wed Oct 8 12:24:56 2003 @@ -43,17 +43,17 @@ * A small set of helper functions to manage buffers (both userland * and kernel) for DMA. * - * videobuf_init_*_dmabuf() + * videobuf_dma_init_*() * creates a buffer. The userland version takes a userspace * pointer + length. The kernel version just wants the size and * does memory allocation too using vmalloc_32(). * - * videobuf_pci_*_dmabuf() + * videobuf_dma_pci_*() * see Documentation/DMA-mapping.txt, these functions to * basically the same. The map function does also build a * scatterlist for the buffer (and unmap frees it ...) * - * videobuf_free_dmabuf() + * videobuf_dma_free() * no comment ... * */ @@ -66,6 +66,9 @@ /* for kernel buffers */ void *vmalloc; + /* for overlay buffers (pci-pci dma) */ + dma_addr_t bus_addr; + /* common */ struct scatterlist *sglist; int sglen; @@ -77,6 +80,8 @@ unsigned long data, unsigned long size); int videobuf_dma_init_kernel(struct videobuf_dmabuf *dma, int direction, int nr_pages); +int videobuf_dma_init_overlay(struct videobuf_dmabuf *dma, int direction, + dma_addr_t addr, int nr_pages); int videobuf_dma_pci_map(struct pci_dev *dev, struct videobuf_dmabuf *dma); int videobuf_dma_pci_sync(struct pci_dev *dev, struct videobuf_dmabuf *dma); @@ -133,6 +138,7 @@ /* info about the buffer */ unsigned int width; unsigned int height; + unsigned int bytesperline; /* use only if != 0 */ unsigned long size; enum v4l2_field field; enum videobuf_state state; @@ -140,7 +146,8 @@ struct list_head stream; /* QBUF/DQBUF list */ /* for mmap'ed buffers */ - size_t boff; /* buffer offset (mmap) */ + enum v4l2_memory memory; + size_t boff; /* buffer offset (mmap + overlay) */ size_t bsize; /* buffer size */ unsigned long baddr; /* buffer addr (userland ptr!) */ struct videobuf_mapping *map; @@ -185,7 +192,8 @@ void* videobuf_alloc(unsigned int size); int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr); -int videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb); +int videobuf_iolock(struct pci_dev *pci, struct videobuf_buffer *vb, + struct v4l2_framebuffer *fbuf); void videobuf_queue_init(struct videobuf_queue *q, struct videobuf_queue_ops *ops, @@ -221,7 +229,8 @@ poll_table *wait); int videobuf_mmap_setup(struct file *file, struct videobuf_queue *q, - unsigned int bcount, unsigned int bsize); + unsigned int bcount, unsigned int bsize, + enum v4l2_memory memory); int videobuf_mmap_free(struct file *file, struct videobuf_queue *q); int videobuf_mmap_mapper(struct vm_area_struct *vma, struct videobuf_queue *q); diff -Nru a/include/net/ip_vs.h b/include/net/ip_vs.h --- a/include/net/ip_vs.h Wed Oct 8 12:24:55 2003 +++ b/include/net/ip_vs.h Wed Oct 8 12:24:55 2003 @@ -8,7 +8,7 @@ #include /* For __uXX types */ -#define IP_VS_VERSION_CODE 0x010107 +#define IP_VS_VERSION_CODE 0x010108 #define NVERSION(version) \ (version >> 16) & 0xFF, \ (version >> 8) & 0xFF, \ @@ -272,22 +272,22 @@ if (net_ratelimit()) \ printk(KERN_DEBUG "IPVS: " msg); \ } while (0) -#define IP_VS_DBG_PKT(level, pp, iph, msg) \ +#define IP_VS_DBG_PKT(level, pp, skb, ofs, msg) \ do { \ if (level <= ip_vs_get_debug_level()) \ - pp->debug_packet(pp, iph, msg); \ + pp->debug_packet(pp, skb, ofs, msg); \ } while (0) -#define IP_VS_DBG_RL_PKT(level, pp, iph, msg) \ +#define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg) \ do { \ if (level <= ip_vs_get_debug_level() && \ net_ratelimit()) \ - pp->debug_packet(pp, iph, msg); \ + pp->debug_packet(pp, skb, ofs, msg); \ } while (0) #else /* NO DEBUGGING at ALL */ #define IP_VS_DBG(level, msg...) do {} while (0) #define IP_VS_DBG_RL(msg...) do {} while (0) -#define IP_VS_DBG_PKT(level, pp, iph, msg) do {} while (0) -#define IP_VS_DBG_RL_PKT(level, pp, iph, msg) do {} while (0) +#define IP_VS_DBG_PKT(level, pp, skb, ofs, msg) do {} while (0) +#define IP_VS_DBG_RL_PKT(level, pp, skb, ofs, msg) do {} while (0) #endif #define IP_VS_BUG() BUG() @@ -396,18 +396,6 @@ }; /* - * Transport protocol header - */ -union ip_vs_tphdr { - unsigned char *raw; - struct udphdr *uh; - struct tcphdr *th; - struct icmphdr *icmph; - __u16 *portp; -}; - - -/* * Delta sequence info structure * Each ip_vs_conn has 2 (output AND input seq. changes). * Only used in the VS/NAT. @@ -447,11 +435,7 @@ struct ip_vs_protocol *next; char *name; __u16 protocol; - int minhlen; - int minhlen_icmp; int dont_defrag; - int skip_nonexisting; - int slave; /* if controlled by others */ atomic_t appcnt; /* counter of proto app incs */ int *timeout_table; /* protocol timeout table */ @@ -459,36 +443,36 @@ void (*exit)(struct ip_vs_protocol *pp); - int (*conn_schedule)(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, + int (*conn_schedule)(struct sk_buff *skb, + struct ip_vs_protocol *pp, int *verdict, struct ip_vs_conn **cpp); struct ip_vs_conn * - (*conn_in_get)(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct iphdr *iph, - union ip_vs_tphdr h, int inverse); + (*conn_in_get)(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse); struct ip_vs_conn * - (*conn_out_get)(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct iphdr *iph, - union ip_vs_tphdr h, int inverse); - - int (*snat_handler)(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct ip_vs_conn *cp, - struct iphdr *iph, union ip_vs_tphdr h, int size); - - int (*dnat_handler)(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct ip_vs_conn *cp, - struct iphdr *iph, union ip_vs_tphdr h, int size); - - int (*csum_check)(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct iphdr *iph, - union ip_vs_tphdr h, int size); + (*conn_out_get)(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse); + + int (*snat_handler)(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp); + + int (*dnat_handler)(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp); + + int (*csum_check)(struct sk_buff *skb, struct ip_vs_protocol *pp); const char *(*state_name)(int state); int (*state_transition)(struct ip_vs_conn *cp, int direction, - struct iphdr *iph, union ip_vs_tphdr h, + const struct sk_buff *skb, struct ip_vs_protocol *pp); int (*register_app)(struct ip_vs_app *inc); @@ -497,8 +481,10 @@ int (*app_conn_bind)(struct ip_vs_conn *cp); - void (*debug_packet)(struct ip_vs_protocol *pp, struct iphdr *iph, - char *msg); + void (*debug_packet)(struct ip_vs_protocol *pp, + const struct sk_buff *skb, + int offset, + const char *msg); void (*timeout_change)(struct ip_vs_protocol *pp, int flags); @@ -538,7 +524,10 @@ struct ip_vs_dest *dest; /* real server */ atomic_t in_pkts; /* incoming packet counter */ - /* packet transmitter for different forwarding methods */ + /* packet transmitter for different forwarding methods. If it + mangles the packet, it must return NF_DROP or better NF_STOLEN, + otherwise this must be changed to a sk_buff **. + */ int (*packet_xmit)(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); @@ -638,7 +627,7 @@ /* selecting a server from the given service */ struct ip_vs_dest* (*schedule)(struct ip_vs_service *svc, - struct iphdr *iph); + const struct sk_buff *skb); }; @@ -660,13 +649,13 @@ __u16 port; /* port number in net order */ atomic_t usecnt; /* usage counter */ - /* output hook */ + /* output hook: return false if can't linearize. diff set for TCP. */ int (*pkt_out)(struct ip_vs_app *, struct ip_vs_conn *, - struct sk_buff *); + struct sk_buff **, int *diff); - /* input hook */ + /* input hook: return false if can't linearize. diff set for TCP. */ int (*pkt_in)(struct ip_vs_app *, struct ip_vs_conn *, - struct sk_buff *); + struct sk_buff **, int *diff); /* ip_vs_app initializer */ int (*init_conn)(struct ip_vs_app *, struct ip_vs_conn *); @@ -686,20 +675,21 @@ int timeouts_size; int (*conn_schedule)(struct sk_buff *skb, struct ip_vs_app *app, - struct iphdr *iph, union ip_vs_tphdr h, int *verdict, struct ip_vs_conn **cpp); struct ip_vs_conn * - (*conn_in_get)(struct sk_buff *skb, struct ip_vs_app *app, - struct iphdr *iph, union ip_vs_tphdr h, int inverse); + (*conn_in_get)(const struct sk_buff *skb, struct ip_vs_app *app, + const struct iphdr *iph, unsigned int proto_off, + int inverse); struct ip_vs_conn * - (*conn_out_get)(struct sk_buff *skb, struct ip_vs_app *app, - struct iphdr *iph, union ip_vs_tphdr h, int inverse); + (*conn_out_get)(const struct sk_buff *skb, struct ip_vs_app *app, + const struct iphdr *iph, unsigned int proto_off, + int inverse); int (*state_transition)(struct ip_vs_conn *cp, int direction, - struct iphdr *iph, - union ip_vs_tphdr h, struct ip_vs_app *app); + const struct sk_buff *skb, + struct ip_vs_app *app); void (*timeout_change)(struct ip_vs_app *app, int flags); }; @@ -839,8 +829,8 @@ extern int ip_vs_app_inc_get(struct ip_vs_app *inc); extern void ip_vs_app_inc_put(struct ip_vs_app *inc); -extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff *skb); -extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff *skb); +extern int ip_vs_app_pkt_out(struct ip_vs_conn *, struct sk_buff **pskb); +extern int ip_vs_app_pkt_in(struct ip_vs_conn *, struct sk_buff **pskb); extern int ip_vs_skb_replace(struct sk_buff *skb, int pri, char *o_buf, int o_len, char *n_buf, int n_len); extern int ip_vs_app_init(void); @@ -856,6 +846,10 @@ extern int *ip_vs_create_timeout_table(int *table, int size); extern int ip_vs_set_state_timeout(int *table, int num, char **names, char *name, int to); +extern void +ip_vs_tcpudp_debug_packet(struct ip_vs_protocol *pp, const struct sk_buff *skb, + int offset, const char *msg); + extern struct ip_vs_protocol ip_vs_protocol_tcp; extern struct ip_vs_protocol ip_vs_protocol_udp; extern struct ip_vs_protocol ip_vs_protocol_icmp; @@ -875,9 +869,9 @@ extern struct ip_vs_scheduler *ip_vs_scheduler_get(const char *sched_name); extern void ip_vs_scheduler_put(struct ip_vs_scheduler *scheduler); extern struct ip_vs_conn * -ip_vs_schedule(struct ip_vs_service *svc, struct iphdr *iph); +ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb); extern int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, - struct ip_vs_protocol *pp, union ip_vs_tphdr h); + struct ip_vs_protocol *pp); /* @@ -940,7 +934,7 @@ extern int ip_vs_dr_xmit (struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); extern int ip_vs_icmp_xmit -(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp); +(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp, int offset); extern void ip_vs_dst_reset(struct ip_vs_dest *dest); @@ -986,6 +980,11 @@ return fwd; } +extern int ip_vs_make_skb_writable(struct sk_buff **pskb, int len); +extern void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp, + struct ip_vs_conn *cp, int dir); + +extern u16 ip_vs_checksum_complete(struct sk_buff *skb, int offset); static inline u16 ip_vs_check_diff(u32 old, u32 new, u16 oldsum) { diff -Nru a/include/net/irda/irda_device.h b/include/net/irda/irda_device.h --- a/include/net/irda/irda_device.h Wed Oct 8 12:24:57 2003 +++ b/include/net/irda/irda_device.h Wed Oct 8 12:24:57 2003 @@ -128,6 +128,7 @@ void (*close)(dongle_t *dongle); int (*reset)(struct irda_task *task); int (*change_speed)(struct irda_task *task); + struct module *owner; }; /* @@ -223,6 +224,7 @@ int irda_device_set_dtr_rts(struct net_device *dev, int dtr, int rts); int irda_device_change_speed(struct net_device *dev, __u32 speed); void irda_device_setup(struct net_device *dev); +struct net_device *alloc_irdadev(int sizeof_priv); /* Dongle interface */ void irda_device_unregister_dongle(struct dongle_reg *dongle); diff -Nru a/include/net/lapb.h b/include/net/lapb.h --- a/include/net/lapb.h Wed Oct 8 12:24:57 2003 +++ b/include/net/lapb.h Wed Oct 8 12:24:57 2003 @@ -129,7 +129,7 @@ extern void lapb_frames_acked(struct lapb_cb *lapb, unsigned short); extern void lapb_requeue_frames(struct lapb_cb *lapb); extern int lapb_validate_nr(struct lapb_cb *lapb, unsigned short); -extern void lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *); +extern int lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *); extern void lapb_send_control(struct lapb_cb *lapb, int, int, int); extern void lapb_transmit_frmr(struct lapb_cb *lapb); diff -Nru a/include/net/pkt_sched.h b/include/net/pkt_sched.h --- a/include/net/pkt_sched.h Wed Oct 8 12:24:56 2003 +++ b/include/net/pkt_sched.h Wed Oct 8 12:24:56 2003 @@ -8,6 +8,7 @@ #define PSCHED_CLOCK_SOURCE PSCHED_JIFFIES #include +#include #include #include #include diff -Nru a/include/net/scm.h b/include/net/scm.h --- a/include/net/scm.h Wed Oct 8 12:24:56 2003 +++ b/include/net/scm.h Wed Oct 8 12:24:56 2003 @@ -39,7 +39,7 @@ memset(scm, 0, sizeof(*scm)); scm->creds.uid = current->uid; scm->creds.gid = current->gid; - scm->creds.pid = current->pid; + scm->creds.pid = current->tgid; if (msg->msg_controllen <= 0) return 0; return __scm_send(sock, msg, scm); diff -Nru a/include/net/sctp/command.h b/include/net/sctp/command.h --- a/include/net/sctp/command.h Wed Oct 8 12:24:57 2003 +++ b/include/net/sctp/command.h Wed Oct 8 12:24:57 2003 @@ -1,5 +1,6 @@ -/* SCTP kernel reference Implementation Copyright (C) 1999-2001 - * Cisco, Motorola, and IBM +/* SCTP kernel reference Implementation + * (C) Copyright IBM Corp. 2001, 2003 + * Copyright (C) 1999-2001 Cisco, Motorola * * This file is part of the SCTP kernel reference Implementation * @@ -88,6 +89,7 @@ SCTP_CMD_PART_DELIVER, /* Partial data delivery considerations. */ SCTP_CMD_RENEGE, /* Renege data on an association. */ SCTP_CMD_SETUP_T4, /* ADDIP, setup T4 RTO timer parms. */ + SCTP_CMD_PROCESS_OPERR, /* Process an ERROR chunk. */ SCTP_CMD_LAST } sctp_verb_t; diff -Nru a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h --- a/include/net/sctp/sctp.h Wed Oct 8 12:24:56 2003 +++ b/include/net/sctp/sctp.h Wed Oct 8 12:24:56 2003 @@ -116,6 +116,9 @@ #define SCTP_STATIC static #endif +#define MSECS_TO_JIFFIES(msec) (msec * HZ / 1000) +#define JIFFIES_TO_MSECS(jiff) (jiff * 1000 / HZ) + /* * Function declarations. */ @@ -495,22 +498,19 @@ #define tv_lt(s, t) \ (s.tv_sec < t.tv_sec || (s.tv_sec == t.tv_sec && s.tv_usec < t.tv_usec)) -/* Stolen from net/profile.h. Using it from there is more grief than - * it is worth. - */ -static inline void tv_add(const struct timeval *entered, struct timeval *leaved) -{ - time_t usecs = leaved->tv_usec + entered->tv_usec; - time_t secs = leaved->tv_sec + entered->tv_sec; - - if (usecs >= 1000000) { - usecs -= 1000000; - secs++; - } - leaved->tv_sec = secs; - leaved->tv_usec = usecs; -} - +/* Add tv1 to tv2. */ +#define TIMEVAL_ADD(tv1, tv2) \ +({ \ + suseconds_t usecs = (tv2).tv_usec + (tv1).tv_usec; \ + time_t secs = (tv2).tv_sec + (tv1).tv_sec; \ +\ + if (usecs >= 1000000) { \ + usecs -= 1000000; \ + secs++; \ + } \ + (tv2).tv_sec = secs; \ + (tv2).tv_usec = usecs; \ +}) /* External references. */ diff -Nru a/include/net/sctp/sm.h b/include/net/sctp/sm.h --- a/include/net/sctp/sm.h Wed Oct 8 12:24:56 2003 +++ b/include/net/sctp/sm.h Wed Oct 8 12:24:56 2003 @@ -265,12 +265,18 @@ struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc, union sctp_addr *addr, int vparam_len); +struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *, + union sctp_addr *, + struct sockaddr *, + int, int); +struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc, + union sctp_addr *addr); +struct sctp_chunk *sctp_make_asconf_ack(struct sctp_association *asoc, + int serial, int vparam_len); + struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, struct sctp_chunk *asconf, int vparam_len); - -struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc, - union sctp_addr *addr); void sctp_chunk_assign_tsn(struct sctp_chunk *); void sctp_chunk_assign_ssn(struct sctp_chunk *); diff -Nru a/include/net/sctp/structs.h b/include/net/sctp/structs.h --- a/include/net/sctp/structs.h Wed Oct 8 12:24:57 2003 +++ b/include/net/sctp/structs.h Wed Oct 8 12:24:57 2003 @@ -1085,6 +1085,10 @@ int sctp_del_bind_addr(struct sctp_bind_addr *, union sctp_addr *); int sctp_bind_addr_match(struct sctp_bind_addr *, const union sctp_addr *, struct sctp_opt *); +union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp, + const union sctp_addr *addrs, + int addrcnt, + struct sctp_opt *opt); union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp, int *addrs_len, int gfp); int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw, int len, @@ -1389,6 +1393,10 @@ __u8 ipv4_address; /* Peer understands IPv4 addresses? */ __u8 ipv6_address; /* Peer understands IPv6 addresses? */ __u8 hostname_address;/* Peer understands DNS addresses? */ + + /* Does peer support ADDIP? */ + __u8 asconf_capable; + struct sctp_inithdr i; int cookie_len; void *cookie; diff -Nru a/include/pcmcia/cs.h b/include/pcmcia/cs.h --- a/include/pcmcia/cs.h Wed Oct 8 12:24:55 2003 +++ b/include/pcmcia/cs.h Wed Oct 8 12:24:55 2003 @@ -180,6 +180,7 @@ #define INT_MEMORY 0x01 #define INT_MEMORY_AND_IO 0x02 #define INT_CARDBUS 0x04 +#define INT_ZOOMED_VIDEO 0x08 /* For RequestIO and ReleaseIO */ typedef struct io_req_t { diff -Nru a/include/sound/sndmagic.h b/include/sound/sndmagic.h --- a/include/sound/sndmagic.h Wed Oct 8 12:24:56 2003 +++ b/include/sound/sndmagic.h Wed Oct 8 12:24:56 2003 @@ -198,6 +198,8 @@ #define vx_pipe_t_magic 0xa15a4112 #define azf3328_t_magic 0xa15a4200 +#define snd_card_harmony_t_magic 0xa15a4300 + #else #define snd_magic_kcalloc(type, extra, flags) (type *) snd_kcalloc(sizeof(type) + extra, flags) diff -Nru a/init/do_mounts.c b/init/do_mounts.c --- a/init/do_mounts.c Wed Oct 8 12:24:56 2003 +++ b/init/do_mounts.c Wed Oct 8 12:24:56 2003 @@ -1,3 +1,4 @@ +#include #include #include #include @@ -22,6 +23,8 @@ /* this is initialized in init/main.c */ dev_t ROOT_DEV; + +EXPORT_SYMBOL(ROOT_DEV); static int __init load_ramdisk(char *str) { diff -Nru a/init/do_mounts.h b/init/do_mounts.h --- a/init/do_mounts.h Wed Oct 8 12:24:57 2003 +++ b/init/do_mounts.h Wed Oct 8 12:24:57 2003 @@ -104,4 +104,3 @@ static inline void md_run_setup(void) {} #endif - diff -Nru a/init/main.c b/init/main.c --- a/init/main.c Wed Oct 8 12:24:56 2003 +++ b/init/main.c Wed Oct 8 12:24:56 2003 @@ -12,6 +12,7 @@ #define __KERNEL_SYSCALLS__ #include +#include #include #include #include @@ -165,6 +166,10 @@ still work even if initially too large, it will just take slightly longer */ unsigned long loops_per_jiffy = (1<<12); +#ifndef __ia64__ +EXPORT_SYMBOL(loops_per_jiffy); +#endif + /* This is the number of bits of precision for the loops_per_jiffy. Each bit takes on average 1.5/HZ seconds. This (like the original) is a little better than 1% */ @@ -306,6 +311,8 @@ #ifdef __GENERIC_PER_CPU unsigned long __per_cpu_offset[NR_CPUS]; + +EXPORT_SYMBOL(__per_cpu_offset); static void __init setup_per_cpu_areas(void) { diff -Nru a/init/version.c b/init/version.c --- a/init/version.c Wed Oct 8 12:24:56 2003 +++ b/init/version.c Wed Oct 8 12:24:56 2003 @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -24,6 +25,8 @@ .machine = UTS_MACHINE, .domainname = UTS_DOMAINNAME, }; + +EXPORT_SYMBOL(system_utsname); const char *linux_banner = "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@" diff -Nru a/ipc/util.c b/ipc/util.c --- a/ipc/util.c Wed Oct 8 12:24:56 2003 +++ b/ipc/util.c Wed Oct 8 12:24:56 2003 @@ -421,10 +421,10 @@ void ipc64_perm_to_ipc_perm (struct ipc64_perm *in, struct ipc_perm *out) { out->key = in->key; - out->uid = NEW_TO_OLD_UID(in->uid); - out->gid = NEW_TO_OLD_GID(in->gid); - out->cuid = NEW_TO_OLD_UID(in->cuid); - out->cgid = NEW_TO_OLD_GID(in->cgid); + SET_UID(out->uid, in->uid); + SET_GID(out->gid, in->gid); + SET_UID(out->cuid, in->cuid); + SET_GID(out->cgid, in->cgid); out->mode = in->mode; out->seq = in->seq; } diff -Nru a/kernel/Makefile b/kernel/Makefile --- a/kernel/Makefile Wed Oct 8 12:24:56 2003 +++ b/kernel/Makefile Wed Oct 8 12:24:56 2003 @@ -12,7 +12,7 @@ obj-$(CONFIG_GENERIC_ISA_DMA) += dma.o obj-$(CONFIG_SMP) += cpu.o obj-$(CONFIG_UID16) += uid16.o -obj-$(CONFIG_MODULES) += ksyms.o module.o +obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_KALLSYMS) += kallsyms.o obj-$(CONFIG_PM) += power/ obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o diff -Nru a/kernel/acct.c b/kernel/acct.c --- a/kernel/acct.c Wed Oct 8 12:24:56 2003 +++ b/kernel/acct.c Wed Oct 8 12:24:56 2003 @@ -343,7 +343,7 @@ /* we really need to bite the bullet and change layout */ ac.ac_uid = current->uid; ac.ac_gid = current->gid; - ac.ac_tty = current->tty ? old_encode_dev(tty_devnum(current->tty)) : 0; + ac.ac_tty = process_tty(current) ? old_encode_dev(tty_devnum(process_tty(current))) : 0; ac.ac_flag = 0; if (current->flags & PF_FORKNOEXEC) diff -Nru a/kernel/capability.c b/kernel/capability.c --- a/kernel/capability.c Wed Oct 8 12:24:57 2003 +++ b/kernel/capability.c Wed Oct 8 12:24:57 2003 @@ -8,11 +8,15 @@ */ #include +#include #include #include unsigned securebits = SECUREBITS_DEFAULT; /* systemwide security settings */ kernel_cap_t cap_bset = CAP_INIT_EFF_SET; + +EXPORT_SYMBOL(securebits); +EXPORT_SYMBOL(cap_bset); /* * This global lock protects task->cap_* for all tasks including current. diff -Nru a/kernel/exit.c b/kernel/exit.c --- a/kernel/exit.c Wed Oct 8 12:24:57 2003 +++ b/kernel/exit.c Wed Oct 8 12:24:57 2003 @@ -119,13 +119,13 @@ read_lock(&tasklist_lock); for_each_task_pid(pgrp, PIDTYPE_PGID, p, l, pid) - if (p->session > 0) { - sid = p->session; + if (process_session(p) > 0) { + sid = process_session(p); goto out; } p = find_task_by_pid(pgrp); if (p) - sid = p->session; + sid = process_session(p); out: read_unlock(&tasklist_lock); @@ -153,7 +153,7 @@ || p->real_parent->pid == 1) continue; if (process_group(p->real_parent) != pgrp - && p->real_parent->session == p->session) { + && process_session(p->real_parent) == process_session(p)) { ret = 0; break; } @@ -242,14 +242,14 @@ { struct task_struct *curr = current; - if (curr->session != session) { + if (process_session(curr) != session) { detach_pid(curr, PIDTYPE_SID); - curr->session = session; + curr->signal->session = session; attach_pid(curr, PIDTYPE_SID, session); } if (process_group(curr) != pgrp) { detach_pid(curr, PIDTYPE_PGID); - curr->group_leader->__pgrp = pgrp; + curr->signal->pgrp = pgrp; attach_pid(curr, PIDTYPE_PGID, pgrp); } } @@ -303,7 +303,7 @@ exit_mm(current); set_special_pids(1, 1); - current->tty = NULL; + current->signal->tty = NULL; /* Block and flush all signals */ sigfillset(&blocked); @@ -323,6 +323,8 @@ reparent_to_init(); } +EXPORT_SYMBOL(daemonize); + static inline void close_files(struct files_struct * files) { int i, j; @@ -418,6 +420,8 @@ __exit_fs(tsk); } +EXPORT_SYMBOL_GPL(exit_fs); + /* * Turn us into a lazy TLB process if we * aren't already.. @@ -455,6 +459,8 @@ __exit_mm(tsk); } +EXPORT_SYMBOL(exit_mm); + static inline void choose_new_parent(task_t *p, task_t *reaper, task_t *child_reaper) { /* @@ -509,7 +515,7 @@ * outside, so the child pgrp is now orphaned. */ if ((process_group(p) != process_group(father)) && - (p->session == father->session)) { + (process_session(p) == process_session(father))) { int pgrp = process_group(p); if (will_become_orphaned_pgrp(pgrp, NULL) && has_stopped_jobs(pgrp)) { @@ -619,7 +625,7 @@ t = tsk->real_parent; if ((process_group(t) != process_group(tsk)) && - (t->session == tsk->session) && + (process_session(t) == process_session(tsk)) && will_become_orphaned_pgrp(process_group(tsk), tsk) && has_stopped_jobs(process_group(tsk))) { __kill_pg_info(SIGHUP, (void *)1, process_group(tsk)); @@ -714,7 +720,7 @@ exit_itimers(tsk); exit_thread(); - if (tsk->leader) + if (process_session_leader(tsk)) disassociate_ctty(1); module_put(tsk->thread_info->exec_domain->module); @@ -741,6 +747,8 @@ do_exit(code); } +EXPORT_SYMBOL(complete_and_exit); + asmlinkage long sys_exit(int error_code) { do_exit((error_code&0xff)<<8); @@ -764,6 +772,8 @@ return pid_task(tmp, PIDTYPE_TGID); } + +EXPORT_SYMBOL(next_thread); /* * Take down every thread in the group. This is called by fatal signals diff -Nru a/kernel/fork.c b/kernel/fork.c --- a/kernel/fork.c Wed Oct 8 12:24:55 2003 +++ b/kernel/fork.c Wed Oct 8 12:24:55 2003 @@ -53,6 +53,8 @@ rwlock_t tasklist_lock __cacheline_aligned = RW_LOCK_UNLOCKED; /* outer */ +EXPORT_SYMBOL(tasklist_lock); + int nr_processes(void) { int cpu; @@ -98,6 +100,8 @@ spin_unlock_irqrestore(&q->lock, flags); } +EXPORT_SYMBOL(add_wait_queue); + void add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t * wait) { unsigned long flags; @@ -108,6 +112,8 @@ spin_unlock_irqrestore(&q->lock, flags); } +EXPORT_SYMBOL(add_wait_queue_exclusive); + void remove_wait_queue(wait_queue_head_t *q, wait_queue_t * wait) { unsigned long flags; @@ -117,6 +123,8 @@ spin_unlock_irqrestore(&q->lock, flags); } +EXPORT_SYMBOL(remove_wait_queue); + void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state) { unsigned long flags; @@ -129,6 +137,8 @@ spin_unlock_irqrestore(&q->lock, flags); } +EXPORT_SYMBOL(prepare_to_wait); + void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state) { @@ -142,6 +152,8 @@ spin_unlock_irqrestore(&q->lock, flags); } +EXPORT_SYMBOL(prepare_to_wait_exclusive); + void finish_wait(wait_queue_head_t *q, wait_queue_t *wait) { unsigned long flags; @@ -154,6 +166,8 @@ } } +EXPORT_SYMBOL(finish_wait); + int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync) { int ret = default_wake_function(wait, mode, sync); @@ -163,6 +177,8 @@ return ret; } +EXPORT_SYMBOL(autoremove_wake_function); + void __init fork_init(unsigned long mempages) { #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR @@ -555,6 +571,8 @@ return __copy_fs_struct(old); } +EXPORT_SYMBOL_GPL(copy_fs_struct); + static inline int copy_fs(unsigned long clone_flags, struct task_struct * tsk) { if (clone_flags & CLONE_FS) { @@ -725,6 +743,12 @@ sig->curr_target = NULL; init_sigpending(&sig->shared_pending); + sig->tty = process_tty(current); + sig->pgrp = process_group(current); + sig->session = process_session(current); + sig->leader = 0; /* session leadership doesn't inherit */ + sig->tty_old_pgrp = 0; + return 0; } @@ -771,7 +795,9 @@ * Thread groups must share signals as well, and detached threads * can only be started up within the thread group. */ - if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND)) + if ((clone_flags & CLONE_THREAD) && + (clone_flags & (CLONE_SIGHAND|CLONE_DETACHED)) != + (CLONE_SIGHAND|CLONE_DETACHED)) return ERR_PTR(-EINVAL); /* @@ -876,8 +902,6 @@ init_timer(&p->real_timer); p->real_timer.data = (unsigned long) p; - p->leader = 0; /* session leadership doesn't inherit */ - p->tty_old_pgrp = 0; p->utime = p->stime = 0; p->cutime = p->cstime = 0; p->array = NULL; @@ -1022,7 +1046,7 @@ if (thread_group_leader(p)) { attach_pid(p, PIDTYPE_TGID, p->tgid); attach_pid(p, PIDTYPE_PGID, process_group(p)); - attach_pid(p, PIDTYPE_SID, p->session); + attach_pid(p, PIDTYPE_SID, process_session(p)); if (p->pid) __get_cpu_var(process_counts)++; } else diff -Nru a/kernel/kmod.c b/kernel/kmod.c --- a/kernel/kmod.c Wed Oct 8 12:24:56 2003 +++ b/kernel/kmod.c Wed Oct 8 12:24:56 2003 @@ -47,7 +47,8 @@ /** * request_module - try to load a kernel module - * @module_name: Name of module + * @fmt: printf style format string for the name of the module + * @varargs: arguements as specified in the format string * * Load a module using the user mode module loader. The function returns * zero on success or a negative errno code on failure. Note that a diff -Nru a/kernel/ksyms.c b/kernel/ksyms.c --- a/kernel/ksyms.c Wed Oct 8 12:24:55 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,615 +0,0 @@ -/* - * Herein lies all the functions/variables that are "exported" for linkage - * with dynamically loaded kernel modules. - * Jon. - * - * - Stacked module support and unified symbol table added (June 1994) - * - External symbol table support added (December 1994) - * - Versions on symbols added (December 1994) - * by Bjorn Ekwall - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(CONFIG_PROC_FS) -#include -#endif -#ifdef CONFIG_KMOD -#include -#endif - -extern struct timezone sys_tz; - -extern int panic_timeout; - -/* process memory management */ -EXPORT_SYMBOL(do_mmap_pgoff); -EXPORT_SYMBOL(do_munmap); -EXPORT_SYMBOL(do_brk); -EXPORT_SYMBOL(exit_mm); -EXPORT_SYMBOL_GPL(exit_fs); -EXPORT_SYMBOL_GPL(copy_fs_struct); - -/* internal kernel memory management */ -EXPORT_SYMBOL(__alloc_pages); -EXPORT_SYMBOL(__get_free_pages); -EXPORT_SYMBOL(get_zeroed_page); -EXPORT_SYMBOL(__page_cache_release); -EXPORT_SYMBOL(__pagevec_lru_add); -EXPORT_SYMBOL(__free_pages); -EXPORT_SYMBOL(free_pages); -EXPORT_SYMBOL(num_physpages); -EXPORT_SYMBOL(kmem_find_general_cachep); -EXPORT_SYMBOL(kmem_cache_create); -EXPORT_SYMBOL(kmem_cache_destroy); -EXPORT_SYMBOL(kmem_cache_shrink); -EXPORT_SYMBOL(kmem_cache_alloc); -EXPORT_SYMBOL(kmem_cache_free); -EXPORT_SYMBOL(kmem_cache_size); -EXPORT_SYMBOL(set_shrinker); -EXPORT_SYMBOL(remove_shrinker); -EXPORT_SYMBOL(malloc_sizes); -EXPORT_SYMBOL(__kmalloc); -EXPORT_SYMBOL(kfree); -#ifdef CONFIG_SMP -EXPORT_SYMBOL(__alloc_percpu); -EXPORT_SYMBOL(free_percpu); -EXPORT_SYMBOL(percpu_counter_mod); -#endif -EXPORT_SYMBOL(vfree); -EXPORT_SYMBOL(__vmalloc); -EXPORT_SYMBOL(vmalloc); -EXPORT_SYMBOL(vmalloc_32); -EXPORT_SYMBOL(vmap); -EXPORT_SYMBOL(vunmap); -EXPORT_SYMBOL(vmalloc_to_page); -EXPORT_SYMBOL(remap_page_range); -#ifndef CONFIG_DISCONTIGMEM -EXPORT_SYMBOL(contig_page_data); -EXPORT_SYMBOL(mem_map); -EXPORT_SYMBOL(max_mapnr); -#endif -EXPORT_SYMBOL(high_memory); -EXPORT_SYMBOL(vmtruncate); -EXPORT_SYMBOL(find_vma); -EXPORT_SYMBOL(get_unmapped_area); -EXPORT_SYMBOL(init_mm); -EXPORT_SYMBOL(blk_queue_bounce); -EXPORT_SYMBOL(blk_congestion_wait); -#ifdef CONFIG_HIGHMEM -EXPORT_SYMBOL(kmap_high); -EXPORT_SYMBOL(kunmap_high); -EXPORT_SYMBOL(highmem_start_page); -EXPORT_SYMBOL(kmap_prot); -EXPORT_SYMBOL(kmap_pte); -#endif -#ifdef HASHED_PAGE_VIRTUAL -EXPORT_SYMBOL(page_address); -#endif -EXPORT_SYMBOL(get_user_pages); - -/* filesystem internal functions */ -EXPORT_SYMBOL(def_blk_fops); -EXPORT_SYMBOL(update_atime); -EXPORT_SYMBOL(get_fs_type); -EXPORT_SYMBOL(user_get_super); -EXPORT_SYMBOL(get_super); -EXPORT_SYMBOL(drop_super); -EXPORT_SYMBOL(getname); -EXPORT_SYMBOL(names_cachep); -EXPORT_SYMBOL(fput); -EXPORT_SYMBOL(fget); -EXPORT_SYMBOL(igrab); -EXPORT_SYMBOL(iunique); -EXPORT_SYMBOL(iput); -EXPORT_SYMBOL(inode_init_once); -EXPORT_SYMBOL(follow_up); -EXPORT_SYMBOL(follow_down); -EXPORT_SYMBOL(lookup_mnt); -EXPORT_SYMBOL(lookup_create); -EXPORT_SYMBOL(path_lookup); -EXPORT_SYMBOL(path_walk); -EXPORT_SYMBOL(path_release); -EXPORT_SYMBOL(__user_walk); -EXPORT_SYMBOL(lookup_one_len); -EXPORT_SYMBOL(lookup_hash); -EXPORT_SYMBOL(sys_close); -EXPORT_SYMBOL(dcache_lock); -EXPORT_SYMBOL(d_alloc_root); -EXPORT_SYMBOL(d_delete); -EXPORT_SYMBOL(dget_locked); -EXPORT_SYMBOL(d_validate); -EXPORT_SYMBOL(d_rehash); -EXPORT_SYMBOL(d_invalidate); /* May be it will be better in dcache.h? */ -EXPORT_SYMBOL(d_move); -EXPORT_SYMBOL(d_instantiate); -EXPORT_SYMBOL(d_alloc); -EXPORT_SYMBOL(d_alloc_anon); -EXPORT_SYMBOL(d_splice_alias); -EXPORT_SYMBOL(d_lookup); -EXPORT_SYMBOL(d_path); -EXPORT_SYMBOL(mark_buffer_dirty); -EXPORT_SYMBOL(end_buffer_read_sync); -EXPORT_SYMBOL(end_buffer_write_sync); -EXPORT_SYMBOL(end_buffer_async_write); -EXPORT_SYMBOL(__mark_inode_dirty); -EXPORT_SYMBOL(get_empty_filp); -EXPORT_SYMBOL(open_private_file); -EXPORT_SYMBOL(close_private_file); -EXPORT_SYMBOL(filp_open); -EXPORT_SYMBOL(filp_close); -EXPORT_SYMBOL(put_filp); -EXPORT_SYMBOL(files_lock); -EXPORT_SYMBOL(check_disk_change); -EXPORT_SYMBOL(invalidate_bdev); -EXPORT_SYMBOL(invalidate_inodes); -EXPORT_SYMBOL(__invalidate_device); -EXPORT_SYMBOL(invalidate_inode_pages); -EXPORT_SYMBOL_GPL(invalidate_inode_pages2); -EXPORT_SYMBOL(truncate_inode_pages); -EXPORT_SYMBOL(fsync_bdev); -EXPORT_SYMBOL(permission); -EXPORT_SYMBOL(vfs_permission); -EXPORT_SYMBOL(inode_setattr); -EXPORT_SYMBOL(inode_change_ok); -EXPORT_SYMBOL(write_inode_now); -EXPORT_SYMBOL(notify_change); -EXPORT_SYMBOL(set_blocksize); -EXPORT_SYMBOL(sb_set_blocksize); -EXPORT_SYMBOL(sb_min_blocksize); -EXPORT_SYMBOL(bdget); -EXPORT_SYMBOL(bdput); -EXPORT_SYMBOL(bd_claim); -EXPORT_SYMBOL(bd_release); -EXPORT_SYMBOL(open_bdev_excl); -EXPORT_SYMBOL(close_bdev_excl); -EXPORT_SYMBOL(open_by_devnum); -EXPORT_SYMBOL(__brelse); -EXPORT_SYMBOL(__bforget); -EXPORT_SYMBOL(ll_rw_block); -EXPORT_SYMBOL(sync_dirty_buffer); -EXPORT_SYMBOL(submit_bh); -EXPORT_SYMBOL(unlock_buffer); -EXPORT_SYMBOL(__wait_on_buffer); -EXPORT_SYMBOL(blockdev_direct_IO); -EXPORT_SYMBOL(block_write_full_page); -EXPORT_SYMBOL(block_read_full_page); -EXPORT_SYMBOL(block_prepare_write); -EXPORT_SYMBOL(block_sync_page); -EXPORT_SYMBOL(generic_cont_expand); -EXPORT_SYMBOL(cont_prepare_write); -EXPORT_SYMBOL(generic_commit_write); -EXPORT_SYMBOL(block_commit_write); -EXPORT_SYMBOL(block_truncate_page); -EXPORT_SYMBOL(generic_block_bmap); -EXPORT_SYMBOL(generic_file_read); -EXPORT_SYMBOL(generic_file_sendfile); -EXPORT_SYMBOL(do_generic_mapping_read); -EXPORT_SYMBOL(file_ra_state_init); -EXPORT_SYMBOL(generic_file_write); -EXPORT_SYMBOL(generic_file_write_nolock); -EXPORT_SYMBOL(generic_file_mmap); -EXPORT_SYMBOL(generic_file_readonly_mmap); -EXPORT_SYMBOL(generic_ro_fops); -EXPORT_SYMBOL(dput); -EXPORT_SYMBOL(have_submounts); -EXPORT_SYMBOL(d_find_alias); -EXPORT_SYMBOL(d_prune_aliases); -EXPORT_SYMBOL(shrink_dcache_sb); -EXPORT_SYMBOL(shrink_dcache_parent); -EXPORT_SYMBOL(shrink_dcache_anon); -EXPORT_SYMBOL(find_inode_number); -EXPORT_SYMBOL(is_subdir); -EXPORT_SYMBOL(get_unused_fd); -EXPORT_SYMBOL(vfs_read); -EXPORT_SYMBOL(vfs_readv); -EXPORT_SYMBOL(vfs_write); -EXPORT_SYMBOL(vfs_writev); -EXPORT_SYMBOL(vfs_create); -EXPORT_SYMBOL(vfs_mkdir); -EXPORT_SYMBOL(vfs_mknod); -EXPORT_SYMBOL(vfs_symlink); -EXPORT_SYMBOL(vfs_link); -EXPORT_SYMBOL(vfs_rmdir); -EXPORT_SYMBOL(vfs_unlink); -EXPORT_SYMBOL(vfs_rename); -EXPORT_SYMBOL(vfs_statfs); -EXPORT_SYMBOL(vfs_fstat); -EXPORT_SYMBOL(vfs_stat); -EXPORT_SYMBOL(vfs_lstat); -EXPORT_SYMBOL(vfs_getattr); -EXPORT_SYMBOL(inode_add_bytes); -EXPORT_SYMBOL(inode_sub_bytes); -EXPORT_SYMBOL(inode_get_bytes); -EXPORT_SYMBOL(inode_set_bytes); -EXPORT_SYMBOL(lock_rename); -EXPORT_SYMBOL(unlock_rename); -EXPORT_SYMBOL(generic_read_dir); -EXPORT_SYMBOL(generic_fillattr); -EXPORT_SYMBOL(generic_file_llseek); -EXPORT_SYMBOL(remote_llseek); -EXPORT_SYMBOL(no_llseek); -EXPORT_SYMBOL(poll_initwait); -EXPORT_SYMBOL(poll_freewait); -EXPORT_SYMBOL(ROOT_DEV); -EXPORT_SYMBOL(find_get_page); -EXPORT_SYMBOL(find_lock_page); -EXPORT_SYMBOL(find_trylock_page); -EXPORT_SYMBOL(find_or_create_page); -EXPORT_SYMBOL(grab_cache_page_nowait); -EXPORT_SYMBOL(read_cache_page); -EXPORT_SYMBOL(read_cache_pages); -EXPORT_SYMBOL(mark_page_accessed); -EXPORT_SYMBOL(vfs_readlink); -EXPORT_SYMBOL(vfs_follow_link); -EXPORT_SYMBOL(page_readlink); -EXPORT_SYMBOL(page_follow_link); -EXPORT_SYMBOL(page_symlink_inode_operations); -EXPORT_SYMBOL(page_symlink); -EXPORT_SYMBOL(vfs_readdir); -EXPORT_SYMBOL(__break_lease); -EXPORT_SYMBOL(lease_get_mtime); -EXPORT_SYMBOL(lock_may_read); -EXPORT_SYMBOL(lock_may_write); -EXPORT_SYMBOL(dcache_dir_open); -EXPORT_SYMBOL(dcache_dir_close); -EXPORT_SYMBOL(dcache_dir_lseek); -EXPORT_SYMBOL(dcache_readdir); -EXPORT_SYMBOL(simple_getattr); -EXPORT_SYMBOL(simple_statfs); -EXPORT_SYMBOL(simple_lookup); -EXPORT_SYMBOL(simple_dir_operations); -EXPORT_SYMBOL(simple_dir_inode_operations); -EXPORT_SYMBOL(simple_link); -EXPORT_SYMBOL(simple_unlink); -EXPORT_SYMBOL(simple_rmdir); -EXPORT_SYMBOL(simple_rename); -EXPORT_SYMBOL(simple_sync_file); -EXPORT_SYMBOL(simple_readpage); -EXPORT_SYMBOL(simple_prepare_write); -EXPORT_SYMBOL(simple_commit_write); -EXPORT_SYMBOL(simple_empty); -EXPORT_SYMBOL(simple_fill_super); -EXPORT_SYMBOL(simple_pin_fs); -EXPORT_SYMBOL(simple_release_fs); -EXPORT_SYMBOL(fd_install); -EXPORT_SYMBOL(put_unused_fd); -EXPORT_SYMBOL(get_sb_bdev); -EXPORT_SYMBOL(kill_block_super); -EXPORT_SYMBOL(get_sb_nodev); -EXPORT_SYMBOL(get_sb_single); -EXPORT_SYMBOL(kill_anon_super); -EXPORT_SYMBOL(kill_litter_super); -EXPORT_SYMBOL(generic_shutdown_super); -EXPORT_SYMBOL(deactivate_super); -EXPORT_SYMBOL(sget); -EXPORT_SYMBOL(set_anon_super); -EXPORT_SYMBOL(do_select); - -/* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */ -EXPORT_SYMBOL(default_llseek); -EXPORT_SYMBOL(dentry_open); -#ifdef CONFIG_MMU -EXPORT_SYMBOL(filemap_nopage); -#endif -EXPORT_SYMBOL(filemap_fdatawrite); -EXPORT_SYMBOL(filemap_fdatawait); -EXPORT_SYMBOL(lock_page); -EXPORT_SYMBOL(unlock_page); - -/* device registration */ -EXPORT_SYMBOL(register_blkdev); -EXPORT_SYMBOL(unregister_blkdev); -EXPORT_SYMBOL(tty_register_driver); -EXPORT_SYMBOL(tty_unregister_driver); -EXPORT_SYMBOL(tty_std_termios); - -/* block device driver support */ -EXPORT_SYMBOL(bmap); -EXPORT_SYMBOL(blkdev_open); -EXPORT_SYMBOL(blkdev_get); -EXPORT_SYMBOL(blkdev_put); -EXPORT_SYMBOL(ioctl_by_bdev); -EXPORT_SYMBOL(read_dev_sector); -EXPORT_SYMBOL(init_buffer); -EXPORT_SYMBOL_GPL(generic_file_direct_IO); -EXPORT_SYMBOL(generic_file_readv); -EXPORT_SYMBOL(generic_file_writev); -EXPORT_SYMBOL(iov_shorten); -EXPORT_SYMBOL_GPL(default_backing_dev_info); - -/* tty routines */ -EXPORT_SYMBOL(tty_wait_until_sent); -EXPORT_SYMBOL(tty_flip_buffer_push); - -/* filesystem registration */ -EXPORT_SYMBOL(register_filesystem); -EXPORT_SYMBOL(unregister_filesystem); -EXPORT_SYMBOL(kern_mount); -EXPORT_SYMBOL(__mntput); -EXPORT_SYMBOL(may_umount); - -/* executable format registration */ -EXPORT_SYMBOL(register_binfmt); -EXPORT_SYMBOL(unregister_binfmt); -EXPORT_SYMBOL(search_binary_handler); -EXPORT_SYMBOL(prepare_binprm); -EXPORT_SYMBOL(compute_creds); -EXPORT_SYMBOL(remove_arg_zero); -EXPORT_SYMBOL(set_binfmt); - -/* sysctl table registration */ -EXPORT_SYMBOL(register_sysctl_table); -EXPORT_SYMBOL(unregister_sysctl_table); -EXPORT_SYMBOL(sysctl_string); -EXPORT_SYMBOL(sysctl_intvec); -EXPORT_SYMBOL(sysctl_jiffies); -EXPORT_SYMBOL(proc_dostring); -EXPORT_SYMBOL(proc_dointvec); -EXPORT_SYMBOL(proc_dointvec_jiffies); -EXPORT_SYMBOL(proc_dointvec_minmax); -EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); -EXPORT_SYMBOL(proc_doulongvec_minmax); - -/* interrupt handling */ -EXPORT_SYMBOL(request_irq); -EXPORT_SYMBOL(free_irq); - -/* waitqueue handling */ -EXPORT_SYMBOL(add_wait_queue); -EXPORT_SYMBOL(add_wait_queue_exclusive); -EXPORT_SYMBOL(remove_wait_queue); -EXPORT_SYMBOL(prepare_to_wait); -EXPORT_SYMBOL(prepare_to_wait_exclusive); -EXPORT_SYMBOL(finish_wait); -EXPORT_SYMBOL(autoremove_wake_function); - -/* completion handling */ -EXPORT_SYMBOL(wait_for_completion); -EXPORT_SYMBOL(complete); - -/* The notion of irq probe/assignment is foreign to S/390 */ - -#if !defined(CONFIG_ARCH_S390) -EXPORT_SYMBOL(probe_irq_on); -EXPORT_SYMBOL(probe_irq_off); -#endif - -#ifdef CONFIG_SMP -EXPORT_SYMBOL(del_timer_sync); -#endif -EXPORT_SYMBOL(del_timer); -EXPORT_SYMBOL(mod_timer); -EXPORT_SYMBOL(__mod_timer); - -#ifdef HAVE_DISABLE_HLT -EXPORT_SYMBOL(disable_hlt); -EXPORT_SYMBOL(enable_hlt); -#endif - -/* resource handling */ -EXPORT_SYMBOL(request_resource); -EXPORT_SYMBOL(release_resource); -EXPORT_SYMBOL(allocate_resource); -EXPORT_SYMBOL(__request_region); -EXPORT_SYMBOL(__check_region); -EXPORT_SYMBOL(__release_region); -EXPORT_SYMBOL(ioport_resource); -EXPORT_SYMBOL(iomem_resource); - -/* process management */ -EXPORT_SYMBOL(complete_and_exit); -EXPORT_SYMBOL(default_wake_function); -EXPORT_SYMBOL(__wake_up); -#ifdef CONFIG_SMP -EXPORT_SYMBOL_GPL(__wake_up_sync); /* internal use only */ -#endif -EXPORT_SYMBOL(wake_up_process); -EXPORT_SYMBOL(sleep_on); -EXPORT_SYMBOL(sleep_on_timeout); -EXPORT_SYMBOL(interruptible_sleep_on); -EXPORT_SYMBOL(interruptible_sleep_on_timeout); -EXPORT_SYMBOL(schedule); -#ifdef CONFIG_PREEMPT -EXPORT_SYMBOL(preempt_schedule); -#endif -EXPORT_SYMBOL(schedule_timeout); -EXPORT_SYMBOL(yield); -EXPORT_SYMBOL(io_schedule); -EXPORT_SYMBOL(__cond_resched); -EXPORT_SYMBOL(set_user_nice); -EXPORT_SYMBOL(task_nice); -EXPORT_SYMBOL_GPL(idle_cpu); -#ifdef CONFIG_SMP -EXPORT_SYMBOL_GPL(set_cpus_allowed); -#endif -#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT) -EXPORT_SYMBOL(kernel_flag); -#endif -EXPORT_SYMBOL(jiffies); -EXPORT_SYMBOL(jiffies_64); -EXPORT_SYMBOL(xtime); -EXPORT_SYMBOL(xtime_lock); -EXPORT_SYMBOL(do_gettimeofday); -EXPORT_SYMBOL(do_settimeofday); -#if (BITS_PER_LONG < 64) -EXPORT_SYMBOL(get_jiffies_64); -#endif -#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP -EXPORT_SYMBOL(__might_sleep); -#endif -#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT) -EXPORT_SYMBOL(__preempt_spin_lock); -EXPORT_SYMBOL(__preempt_write_lock); -#endif -#if !defined(__ia64__) -EXPORT_SYMBOL(loops_per_jiffy); -#endif - - -/* misc */ -EXPORT_SYMBOL(panic); -EXPORT_SYMBOL(panic_notifier_list); -EXPORT_SYMBOL(panic_timeout); -EXPORT_SYMBOL(sprintf); -EXPORT_SYMBOL(snprintf); -EXPORT_SYMBOL(sscanf); -EXPORT_SYMBOL(vsprintf); -EXPORT_SYMBOL(vsnprintf); -EXPORT_SYMBOL(vsscanf); -EXPORT_SYMBOL(__bdevname); -EXPORT_SYMBOL(bdevname); -EXPORT_SYMBOL(simple_strtoull); -EXPORT_SYMBOL(simple_strtoul); -EXPORT_SYMBOL(simple_strtol); -EXPORT_SYMBOL(system_utsname); /* UTS data */ -EXPORT_SYMBOL(uts_sem); /* UTS semaphore */ -EXPORT_SYMBOL(machine_restart); -EXPORT_SYMBOL(machine_halt); -EXPORT_SYMBOL(machine_power_off); -EXPORT_SYMBOL(_ctype); -EXPORT_SYMBOL(secure_tcp_sequence_number); -EXPORT_SYMBOL(get_random_bytes); -EXPORT_SYMBOL(securebits); -EXPORT_SYMBOL(cap_bset); -EXPORT_SYMBOL(daemonize); -EXPORT_SYMBOL(csum_partial); /* for networking and md */ -EXPORT_SYMBOL(seq_escape); -EXPORT_SYMBOL(seq_printf); -EXPORT_SYMBOL(seq_path); -EXPORT_SYMBOL(seq_open); -EXPORT_SYMBOL(seq_release); -EXPORT_SYMBOL(seq_read); -EXPORT_SYMBOL(seq_lseek); -EXPORT_SYMBOL(single_open); -EXPORT_SYMBOL(single_release); -EXPORT_SYMBOL(seq_release_private); - -/* Program loader interfaces */ -#ifdef CONFIG_MMU -EXPORT_SYMBOL(setup_arg_pages); -#endif -EXPORT_SYMBOL(copy_strings_kernel); -EXPORT_SYMBOL(do_execve); -EXPORT_SYMBOL(flush_old_exec); -EXPORT_SYMBOL(kernel_read); -EXPORT_SYMBOL(open_exec); - -/* Miscellaneous access points */ -EXPORT_SYMBOL(si_meminfo); - -/* Added to make file system as module */ -EXPORT_SYMBOL(sys_tz); -EXPORT_SYMBOL(file_fsync); -EXPORT_SYMBOL(fsync_buffers_list); -EXPORT_SYMBOL(clear_inode); -EXPORT_SYMBOL(init_special_inode); -EXPORT_SYMBOL(new_inode); -EXPORT_SYMBOL(__insert_inode_hash); -EXPORT_SYMBOL(remove_inode_hash); -EXPORT_SYMBOL(buffer_insert_list); -EXPORT_SYMBOL(make_bad_inode); -EXPORT_SYMBOL(is_bad_inode); -EXPORT_SYMBOL(__inode_dir_notify); -EXPORT_SYMBOL(generic_osync_inode); -EXPORT_SYMBOL(remove_suid); - -#ifdef CONFIG_UID16 -EXPORT_SYMBOL(overflowuid); -EXPORT_SYMBOL(overflowgid); -#endif -EXPORT_SYMBOL(fs_overflowuid); -EXPORT_SYMBOL(fs_overflowgid); - -/* all busmice */ -EXPORT_SYMBOL(fasync_helper); -EXPORT_SYMBOL(kill_fasync); - -/* binfmt_aout */ -EXPORT_SYMBOL(get_write_access); - -/* library functions */ -EXPORT_SYMBOL(strnicmp); -EXPORT_SYMBOL(strspn); -EXPORT_SYMBOL(strsep); - -/* software interrupts */ -EXPORT_SYMBOL(tasklet_init); -EXPORT_SYMBOL(tasklet_kill); -EXPORT_SYMBOL(do_softirq); -EXPORT_SYMBOL(raise_softirq); -EXPORT_SYMBOL(open_softirq); -EXPORT_SYMBOL(raise_softirq_irqoff); -EXPORT_SYMBOL(__tasklet_schedule); -EXPORT_SYMBOL(__tasklet_hi_schedule); - -/* init task, for moving kthread roots - ought to export a function ?? */ - -EXPORT_SYMBOL(init_task); - -EXPORT_SYMBOL(tasklist_lock); -EXPORT_SYMBOL(find_task_by_pid); -EXPORT_SYMBOL(next_thread); -#if defined(CONFIG_SMP) && defined(__GENERIC_PER_CPU) -EXPORT_SYMBOL(__per_cpu_offset); -#endif - -EXPORT_SYMBOL(set_fs_pwd); -EXPORT_SYMBOL(set_fs_root); - -/* debug */ -EXPORT_SYMBOL(dump_stack); -EXPORT_SYMBOL(ptrace_notify); -EXPORT_SYMBOL(console_printk); - -EXPORT_SYMBOL(current_kernel_time); diff -Nru a/kernel/module.c b/kernel/module.c --- a/kernel/module.c Wed Oct 8 12:24:57 2003 +++ b/kernel/module.c Wed Oct 8 12:24:57 2003 @@ -844,6 +844,7 @@ { unsigned int min, max; unsigned int size, maxsize; + int dummy; char *endp; const char *p; struct obsolete_modparm *obsparm = kp->arg; @@ -866,19 +867,19 @@ switch (*endp) { case 'b': return param_array(kp->name, val, min, max, obsparm->addr, - 1, param_set_byte); + 1, param_set_byte, &dummy); case 'h': return param_array(kp->name, val, min, max, obsparm->addr, - sizeof(short), param_set_short); + sizeof(short), param_set_short, &dummy); case 'i': return param_array(kp->name, val, min, max, obsparm->addr, - sizeof(int), param_set_int); + sizeof(int), param_set_int, &dummy); case 'l': return param_array(kp->name, val, min, max, obsparm->addr, - sizeof(long), param_set_long); + sizeof(long), param_set_long, &dummy); case 's': return param_array(kp->name, val, min, max, obsparm->addr, - sizeof(char *), param_set_charp); + sizeof(char *), param_set_charp, &dummy); case 'c': /* Undocumented: 1-5c50 means 1-5 strings of up to 49 chars, @@ -895,7 +896,7 @@ if (size >= maxsize) goto oversize; return param_array(kp->name, val, min, max, obsparm->addr, - maxsize, obsparm_copy_string); + maxsize, obsparm_copy_string, &dummy); } printk(KERN_ERR "Unknown obsolete parameter type %s\n", obsparm->type); return -EINVAL; diff -Nru a/kernel/panic.c b/kernel/panic.c --- a/kernel/panic.c Wed Oct 8 12:24:57 2003 +++ b/kernel/panic.c Wed Oct 8 12:24:57 2003 @@ -9,6 +9,7 @@ * to indicate a major problem. */ #include +#include #include #include #include @@ -24,8 +25,12 @@ int panic_on_oops; int tainted; +EXPORT_SYMBOL(panic_timeout); + struct notifier_block *panic_notifier_list; +EXPORT_SYMBOL(panic_notifier_list); + static int __init panic_setup(char *str) { panic_timeout = simple_strtoul(str, NULL, 0); @@ -104,6 +109,8 @@ for (;;) ; } + +EXPORT_SYMBOL(panic); /** * print_tainted - return a string to represent the kernel taint state. diff -Nru a/kernel/params.c b/kernel/params.c --- a/kernel/params.c Wed Oct 8 12:24:57 2003 +++ b/kernel/params.c Wed Oct 8 12:24:57 2003 @@ -242,10 +242,10 @@ const char *val, unsigned int min, unsigned int max, void *elem, int elemsize, - int (*set)(const char *, struct kernel_param *kp)) + int (*set)(const char *, struct kernel_param *kp), + int *num) { int ret; - unsigned int count = 0; struct kernel_param kp; char save; @@ -259,11 +259,12 @@ return -EINVAL; } + *num = 0; /* We expect a comma-separated list of values. */ do { int len; - if (count > max) { + if (*num == max) { printk(KERN_ERR "%s: can only take %i arguments\n", name, max); return -EINVAL; @@ -279,10 +280,10 @@ return ret; kp.arg += elemsize; val += len+1; - count++; + (*num)++; } while (save == ','); - if (count < min) { + if (*num < min) { printk(KERN_ERR "%s: needs at least %i arguments\n", name, min); return -EINVAL; @@ -290,29 +291,32 @@ return 0; } -/* First two elements are the max and min array length (which don't change) */ -int param_set_intarray(const char *val, struct kernel_param *kp) +int param_array_set(const char *val, struct kernel_param *kp) { - int *array; + struct kparam_array *arr = kp->arg; - /* Grab min and max as first two elements */ - array = kp->arg; - return param_array(kp->name, val, array[0], array[1], &array[2], - sizeof(int), param_set_int); + return param_array(kp->name, val, 1, arr->max, arr->elem, + arr->elemsize, arr->set, arr->num); } -int param_get_intarray(char *buffer, struct kernel_param *kp) +int param_array_get(char *buffer, struct kernel_param *kp) { - int max; - int *array; - unsigned int i; - - array = kp->arg; - max = array[1]; - - for (i = 2; i < max + 2; i++) - sprintf(buffer, "%s%i", i > 2 ? "," : "", array[i]); - return strlen(buffer); + int i, off, ret; + struct kparam_array *arr = kp->arg; + struct kernel_param p; + + p = *kp; + for (i = off = 0; i < *arr->num; i++) { + if (i) + buffer[off++] = ','; + p.arg = arr->elem + arr->elemsize * i; + ret = arr->get(buffer + off, &p); + if (ret < 0) + return ret; + off += ret; + } + buffer[off] = '\0'; + return off; } int param_set_copystring(const char *val, struct kernel_param *kp) @@ -346,6 +350,6 @@ EXPORT_SYMBOL(param_get_bool); EXPORT_SYMBOL(param_set_invbool); EXPORT_SYMBOL(param_get_invbool); -EXPORT_SYMBOL(param_set_intarray); -EXPORT_SYMBOL(param_get_intarray); +EXPORT_SYMBOL(param_array_set); +EXPORT_SYMBOL(param_array_get); EXPORT_SYMBOL(param_set_copystring); diff -Nru a/kernel/pid.c b/kernel/pid.c --- a/kernel/pid.c Wed Oct 8 12:24:57 2003 +++ b/kernel/pid.c Wed Oct 8 12:24:57 2003 @@ -20,6 +20,7 @@ */ #include +#include #include #include #include @@ -230,6 +231,8 @@ return pid_task(pid->task_list.next, PIDTYPE_PID); } +EXPORT_SYMBOL(find_task_by_pid); + /* * This function switches the PIDs if a non-leader thread calls * sys_execve() - this must be done without releasing the PID. @@ -250,14 +253,14 @@ attach_pid(thread, PIDTYPE_PID, thread->pid); attach_pid(thread, PIDTYPE_TGID, thread->tgid); - attach_pid(thread, PIDTYPE_PGID, leader->__pgrp); - attach_pid(thread, PIDTYPE_SID, thread->session); + attach_pid(thread, PIDTYPE_PGID, thread->signal->pgrp); + attach_pid(thread, PIDTYPE_SID, thread->signal->session); list_add_tail(&thread->tasks, &init_task.tasks); attach_pid(leader, PIDTYPE_PID, leader->pid); attach_pid(leader, PIDTYPE_TGID, leader->tgid); - attach_pid(leader, PIDTYPE_PGID, leader->__pgrp); - attach_pid(leader, PIDTYPE_SID, leader->session); + attach_pid(leader, PIDTYPE_PGID, leader->signal->pgrp); + attach_pid(leader, PIDTYPE_SID, leader->signal->session); } /* diff -Nru a/kernel/printk.c b/kernel/printk.c --- a/kernel/printk.c Wed Oct 8 12:24:57 2003 +++ b/kernel/printk.c Wed Oct 8 12:24:57 2003 @@ -29,11 +29,11 @@ #include #include #include +#include #include -#define LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) -#define LOG_BUF_MASK (LOG_BUF_LEN-1) +#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT) /* printk's without a loglevel use this.. */ #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */ @@ -51,6 +51,8 @@ DEFAULT_CONSOLE_LOGLEVEL, /* default_console_loglevel */ }; +EXPORT_SYMBOL(console_printk); + int oops_in_progress; /* @@ -68,17 +70,21 @@ */ static spinlock_t logbuf_lock = SPIN_LOCK_UNLOCKED; -static char log_buf[LOG_BUF_LEN]; +static char __log_buf[__LOG_BUF_LEN]; +static char *log_buf = __log_buf; +static int log_buf_len = __LOG_BUF_LEN; + +#define LOG_BUF_MASK (log_buf_len-1) #define LOG_BUF(idx) (log_buf[(idx) & LOG_BUF_MASK]) /* - * The indices into log_buf are not constrained to LOG_BUF_LEN - they + * The indices into log_buf are not constrained to log_buf_len - they * must be masked before subscripting */ -static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */ -static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */ -static unsigned long log_end; /* Index into log_buf: most-recently-written-char + 1 */ -static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */ +static unsigned long log_start; /* Index into log_buf: next char to be read by syslog() */ +static unsigned long con_start; /* Index into log_buf: next char to be sent to consoles */ +static unsigned long log_end; /* Index into log_buf: most-recently-written-char + 1 */ +static unsigned long logged_chars; /* Number of chars produced since last read+clear operation */ struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES]; static int preferred_console = -1; @@ -141,6 +147,45 @@ __setup("console=", console_setup); +static int __init log_buf_len_setup(char *str) +{ + unsigned long size = memparse(str, &str); + + if (size > log_buf_len) { + unsigned long start, dest_idx, offset; + char * new_log_buf; + + new_log_buf = alloc_bootmem(size); + if (!new_log_buf) { + printk("log_buf_len: allocation failed\n"); + goto out; + } + + spin_lock_irq(&logbuf_lock); + log_buf_len = size; + log_buf = new_log_buf; + + offset = start = min(con_start, log_start); + dest_idx = 0; + while (start != log_end) { + log_buf[dest_idx] = __log_buf[start & (__LOG_BUF_LEN - 1)]; + start++; + dest_idx++; + } + log_start -= offset; + con_start -= offset; + log_end -= offset; + spin_unlock_irq(&logbuf_lock); + + printk("log_buf_len: %d\n", log_buf_len); + } +out: + + return 1; +} + +__setup("log_buf_len=", log_buf_len_setup); + /* * Commands to do_syslog: * @@ -213,8 +258,8 @@ if (error) goto out; count = len; - if (count > LOG_BUF_LEN) - count = LOG_BUF_LEN; + if (count > log_buf_len) + count = log_buf_len; spin_lock_irq(&logbuf_lock); if (count > logged_chars) count = logged_chars; @@ -229,7 +274,7 @@ */ for(i = 0; i < count && !error; i++) { j = limit-1-i; - if (j+LOG_BUF_LEN < log_end) + if (j + log_buf_len < log_end) break; c = LOG_BUF(j); spin_unlock_irq(&logbuf_lock); @@ -302,12 +347,15 @@ /* * Write out chars from start to end - 1 inclusive */ -static void _call_console_drivers(unsigned long start, unsigned long end, int msg_log_level) +static void _call_console_drivers(unsigned long start, + unsigned long end, int msg_log_level) { - if (msg_log_level < console_loglevel && console_drivers && start != end) { + if (msg_log_level < console_loglevel && + console_drivers && start != end) { if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) { /* wrapped write */ - __call_console_drivers(start & LOG_BUF_MASK, LOG_BUF_LEN); + __call_console_drivers(start & LOG_BUF_MASK, + log_buf_len); __call_console_drivers(0, end & LOG_BUF_MASK); } else { __call_console_drivers(start, end); @@ -370,11 +418,11 @@ { LOG_BUF(log_end) = c; log_end++; - if (log_end - log_start > LOG_BUF_LEN) - log_start = log_end - LOG_BUF_LEN; - if (log_end - con_start > LOG_BUF_LEN) - con_start = log_end - LOG_BUF_LEN; - if (logged_chars < LOG_BUF_LEN) + if (log_end - log_start > log_buf_len) + log_start = log_end - log_buf_len; + if (log_end - con_start > log_buf_len) + con_start = log_end - log_buf_len; + if (logged_chars < log_buf_len) logged_chars++; } diff -Nru a/kernel/ptrace.c b/kernel/ptrace.c --- a/kernel/ptrace.c Wed Oct 8 12:24:57 2003 +++ b/kernel/ptrace.c Wed Oct 8 12:24:57 2003 @@ -7,6 +7,7 @@ * to continually duplicate across every architecture. */ +#include #include #include #include @@ -179,19 +180,14 @@ flush_cache_page(vma, addr); - /* - * FIXME! We used to have flush_page_to_ram() in here, but - * that was wrong. davem says we need a new per-arch primitive - * to handle this correctly. - */ - maddr = kmap(page); if (write) { - memcpy(maddr + offset, buf, bytes); - flush_icache_user_range(vma, page, addr, bytes); + copy_to_user_page(vma, page, addr, + maddr + offset, buf, bytes); set_page_dirty_lock(page); } else { - memcpy(buf, maddr + offset, bytes); + copy_from_user_page(vma, page, addr, + buf, maddr + offset, bytes); } kunmap(page); page_cache_release(page); @@ -345,3 +341,5 @@ recalc_sigpending(); spin_unlock_irq(¤t->sighand->siglock); } + +EXPORT_SYMBOL(ptrace_notify); diff -Nru a/kernel/rcupdate.c b/kernel/rcupdate.c --- a/kernel/rcupdate.c Wed Oct 8 12:24:55 2003 +++ b/kernel/rcupdate.c Wed Oct 8 12:24:55 2003 @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * Copyright (c) IBM Corporation, 2001 + * Copyright (C) IBM Corporation, 2001 * * Author: Dipankar Sarma * diff -Nru a/kernel/resource.c b/kernel/resource.c --- a/kernel/resource.c Wed Oct 8 12:24:57 2003 +++ b/kernel/resource.c Wed Oct 8 12:24:57 2003 @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -27,6 +28,8 @@ .flags = IORESOURCE_IO, }; +EXPORT_SYMBOL(ioport_resource); + struct resource iomem_resource = { .name = "PCI mem", .start = 0UL, @@ -34,6 +37,8 @@ .flags = IORESOURCE_MEM, }; +EXPORT_SYMBOL(iomem_resource); + static rwlock_t resource_lock = RW_LOCK_UNLOCKED; #ifdef CONFIG_PROC_FS @@ -199,6 +204,8 @@ return conflict ? -EBUSY : 0; } +EXPORT_SYMBOL(request_resource); + int release_resource(struct resource *old) { int retval; @@ -209,6 +216,8 @@ return retval; } +EXPORT_SYMBOL(release_resource); + /* * Find empty slot in the resource tree given range and alignment. */ @@ -268,6 +277,8 @@ return err; } +EXPORT_SYMBOL(allocate_resource); + /* * This is compatibility stuff for IO resources. * @@ -315,6 +326,8 @@ return res; } +EXPORT_SYMBOL(__request_region); + int __deprecated __check_region(struct resource *parent, unsigned long start, unsigned long n) { struct resource * res; @@ -328,6 +341,8 @@ return 0; } +EXPORT_SYMBOL(__check_region); + void __release_region(struct resource *parent, unsigned long start, unsigned long n) { struct resource **p; @@ -356,6 +371,8 @@ } printk(KERN_WARNING "Trying to free nonexistent resource <%08lx-%08lx>\n", start, end); } + +EXPORT_SYMBOL(__release_region); /* * Called from init/main.c to reserve IO ports. diff -Nru a/kernel/sched.c b/kernel/sched.c --- a/kernel/sched.c Wed Oct 8 12:24:57 2003 +++ b/kernel/sched.c Wed Oct 8 12:24:57 2003 @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -642,6 +643,8 @@ return try_to_wake_up(p, TASK_STOPPED | TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0, 0); } +EXPORT_SYMBOL(wake_up_process); + int wake_up_process_kick(task_t * p) { return try_to_wake_up(p, TASK_STOPPED | TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0, 1); @@ -1585,6 +1588,8 @@ goto need_resched; } +EXPORT_SYMBOL(schedule); + #ifdef CONFIG_PREEMPT /* * this is is the entry point to schedule() from in-kernel preemption @@ -1612,6 +1617,8 @@ if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) goto need_resched; } + +EXPORT_SYMBOL(preempt_schedule); #endif /* CONFIG_PREEMPT */ int default_wake_function(wait_queue_t *curr, unsigned mode, int sync) @@ -1620,6 +1627,8 @@ return try_to_wake_up(p, mode, sync, 0); } +EXPORT_SYMBOL(default_wake_function); + /* * The core wakeup function. Non-exclusive wakeups (nr_exclusive == 0) just * wake everything up. If it's an exclusive wakeup (nr_exclusive == small +ve @@ -1660,6 +1669,8 @@ spin_unlock_irqrestore(&q->lock, flags); } +EXPORT_SYMBOL(__wake_up); + /* * Same as __wake_up but called with the spinlock in wait_queue_head_t held. */ @@ -1696,6 +1707,8 @@ spin_unlock_irqrestore(&q->lock, flags); } +EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */ + void complete(struct completion *x) { unsigned long flags; @@ -1706,6 +1719,8 @@ spin_unlock_irqrestore(&x->wait.lock, flags); } +EXPORT_SYMBOL(complete); + void complete_all(struct completion *x) { unsigned long flags; @@ -1737,6 +1752,8 @@ spin_unlock_irq(&x->wait.lock); } +EXPORT_SYMBOL(wait_for_completion); + #define SLEEP_ON_VAR \ unsigned long flags; \ wait_queue_t wait; \ @@ -1763,6 +1780,8 @@ SLEEP_ON_TAIL } +EXPORT_SYMBOL(interruptible_sleep_on); + long interruptible_sleep_on_timeout(wait_queue_head_t *q, long timeout) { SLEEP_ON_VAR @@ -1776,6 +1795,8 @@ return timeout; } +EXPORT_SYMBOL(interruptible_sleep_on_timeout); + void sleep_on(wait_queue_head_t *q) { SLEEP_ON_VAR @@ -1787,6 +1808,8 @@ SLEEP_ON_TAIL } +EXPORT_SYMBOL(sleep_on); + long sleep_on_timeout(wait_queue_head_t *q, long timeout) { SLEEP_ON_VAR @@ -1800,6 +1823,8 @@ return timeout; } +EXPORT_SYMBOL(sleep_on_timeout); + void scheduling_functions_end_here(void) { } void set_user_nice(task_t *p, long nice) @@ -1849,6 +1874,8 @@ task_rq_unlock(rq, &flags); } +EXPORT_SYMBOL(set_user_nice); + #ifndef __alpha__ /* @@ -1915,6 +1942,8 @@ return TASK_NICE(p); } +EXPORT_SYMBOL(task_nice); + /** * task_curr - is this task currently executing on a CPU? * @p: the task in question. @@ -1933,6 +1962,8 @@ return cpu_curr(cpu) == cpu_rq(cpu)->idle; } +EXPORT_SYMBOL_GPL(idle_cpu); + /** * find_process_by_pid - find a process with a matching PID value. * @pid: the pid in question. @@ -2260,6 +2291,8 @@ schedule(); } +EXPORT_SYMBOL(__cond_resched); + /** * yield - yield the current processor to other threads. * @@ -2272,6 +2305,8 @@ sys_sched_yield(); } +EXPORT_SYMBOL(yield); + /* * This task is about to go to sleep on IO. Increment rq->nr_iowait so * that process accounting knows that this is a task in IO wait state. @@ -2288,6 +2323,8 @@ atomic_dec(&rq->nr_iowait); } +EXPORT_SYMBOL(io_schedule); + long io_schedule_timeout(long timeout) { struct runqueue *rq = this_rq(); @@ -2428,7 +2465,7 @@ unsigned long * n = (unsigned long *) (p->thread_info+1); while (!*n) n++; - free = (unsigned long) n - (unsigned long)(p+1); + free = (unsigned long) n - (unsigned long)(p->thread_info+1); } printk("%5lu %5d %6d ", free, p->pid, p->parent->pid); if ((relative = eldest_child(p))) @@ -2574,6 +2611,8 @@ return 0; } +EXPORT_SYMBOL_GPL(set_cpus_allowed); + /* Move (not current) task off this cpu, onto dest cpu. */ static void move_task_away(struct task_struct *p, int dest_cpu) { @@ -2721,6 +2760,8 @@ * Don't use in new code. */ spinlock_t kernel_flag __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED; + +EXPORT_SYMBOL(kernel_flag); #endif static void kstat_init_cpu(int cpu) @@ -2819,6 +2860,7 @@ } #endif } +EXPORT_SYMBOL(__might_sleep); #endif @@ -2847,6 +2889,8 @@ } while (!_raw_spin_trylock(lock)); } +EXPORT_SYMBOL(__preempt_spin_lock); + void __preempt_write_lock(rwlock_t *lock) { if (preempt_count() > 1) { @@ -2861,4 +2905,6 @@ preempt_disable(); } while (!_raw_write_trylock(lock)); } -#endif + +EXPORT_SYMBOL(__preempt_write_lock); +#endif /* defined(CONFIG_SMP) && defined(CONFIG_PREEMPT) */ diff -Nru a/kernel/signal.c b/kernel/signal.c --- a/kernel/signal.c Wed Oct 8 12:24:56 2003 +++ b/kernel/signal.c Wed Oct 8 12:24:56 2003 @@ -593,7 +593,8 @@ error = -EPERM; if ((!info || ((unsigned long)info != 1 && (unsigned long)info != 2 && SI_FROMUSER(info))) - && ((sig != SIGCONT) || (current->session != t->session)) + && ((sig != SIGCONT) || + (process_session(current) != process_session(t))) && (current->euid ^ t->suid) && (current->euid ^ t->uid) && (current->uid ^ t->suid) && (current->uid ^ t->uid) && !capable(CAP_KILL)) @@ -1102,7 +1103,7 @@ retval = -ESRCH; read_lock(&tasklist_lock); for_each_task_pid(sid, PIDTYPE_SID, p, l, pid) { - if (!p->leader) + if (!process_session_leader(p)) continue; err = group_send_sig_info(sig, info, p); if (retval) diff -Nru a/kernel/softirq.c b/kernel/softirq.c --- a/kernel/softirq.c Wed Oct 8 12:24:56 2003 +++ b/kernel/softirq.c Wed Oct 8 12:24:56 2003 @@ -113,6 +113,8 @@ local_irq_restore(flags); } +EXPORT_SYMBOL(do_softirq); + void local_bh_enable(void) { __local_bh_enable(); @@ -144,6 +146,8 @@ wakeup_softirqd(); } +EXPORT_SYMBOL(raise_softirq_irqoff); + void raise_softirq(unsigned int nr) { unsigned long flags; @@ -153,12 +157,15 @@ local_irq_restore(flags); } +EXPORT_SYMBOL(raise_softirq); + void open_softirq(int nr, void (*action)(struct softirq_action*), void *data) { softirq_vec[nr].data = data; softirq_vec[nr].action = action; } +EXPORT_SYMBOL(open_softirq); /* Tasklets */ struct tasklet_head @@ -182,6 +189,8 @@ local_irq_restore(flags); } +EXPORT_SYMBOL(__tasklet_schedule); + void __tasklet_hi_schedule(struct tasklet_struct *t) { unsigned long flags; @@ -193,6 +202,8 @@ local_irq_restore(flags); } +EXPORT_SYMBOL(__tasklet_hi_schedule); + static void tasklet_action(struct softirq_action *a) { struct tasklet_struct *list; @@ -270,6 +281,8 @@ t->data = data; } +EXPORT_SYMBOL(tasklet_init); + void tasklet_kill(struct tasklet_struct *t) { if (in_interrupt()) @@ -284,6 +297,7 @@ clear_bit(TASKLET_STATE_SCHED, &t->state); } +EXPORT_SYMBOL(tasklet_kill); static void tasklet_init_cpu(int cpu) { diff -Nru a/kernel/sys.c b/kernel/sys.c --- a/kernel/sys.c Wed Oct 8 12:24:55 2003 +++ b/kernel/sys.c Wed Oct 8 12:24:55 2003 @@ -55,6 +55,11 @@ int overflowuid = DEFAULT_OVERFLOWUID; int overflowgid = DEFAULT_OVERFLOWGID; +#ifdef CONFIG_UID16 +EXPORT_SYMBOL(overflowuid); +EXPORT_SYMBOL(overflowgid); +#endif + /* * the same as above, but for filesystems which can only store a 16-bit * UID and GID. as such, this is needed on all architectures @@ -63,6 +68,9 @@ int fs_overflowuid = DEFAULT_FS_OVERFLOWUID; int fs_overflowgid = DEFAULT_FS_OVERFLOWUID; +EXPORT_SYMBOL(fs_overflowuid); +EXPORT_SYMBOL(fs_overflowgid); + /* * this indicates whether you can reboot with ctrl-alt-del: the default is yes */ @@ -106,6 +114,8 @@ return 0; } +EXPORT_SYMBOL(notifier_chain_register); + /** * notifier_chain_unregister - Remove notifier from a notifier chain * @nl: Pointer to root list pointer @@ -133,6 +143,8 @@ return -ENOENT; } +EXPORT_SYMBOL(notifier_chain_unregister); + /** * notifier_call_chain - Call functions in a notifier chain * @n: Pointer to root pointer of notifier chain @@ -166,6 +178,8 @@ return ret; } +EXPORT_SYMBOL(notifier_call_chain); + /** * register_reboot_notifier - Register function to be called at reboot time * @nb: Info about notifier function to be called @@ -182,6 +196,8 @@ return notifier_chain_register(&reboot_notifier_list, nb); } +EXPORT_SYMBOL(register_reboot_notifier); + /** * unregister_reboot_notifier - Unregister previously registered reboot notifier * @nb: Hook to be unregistered @@ -197,6 +213,8 @@ return notifier_chain_unregister(&reboot_notifier_list, nb); } +EXPORT_SYMBOL(unregister_reboot_notifier); + asmlinkage long sys_ni_syscall(void) { return -ENOSYS; @@ -951,7 +969,7 @@ if (p->parent == current || p->real_parent == current) { err = -EPERM; - if (p->session != current->session) + if (process_session(p) != process_session(current)) goto out; err = -EACCES; if (p->did_exec) @@ -963,7 +981,7 @@ } err = -EPERM; - if (p->leader) + if (process_session_leader(p)) goto out; if (pgid != pid) { @@ -972,7 +990,7 @@ struct list_head *l; for_each_task_pid(pgid, PIDTYPE_PGID, p, l, pid) - if (p->session == current->session) + if (process_session(p) == process_session(current)) goto ok_pgid; goto out; } @@ -984,7 +1002,7 @@ if (process_group(p) != pgid) { detach_pid(p, PIDTYPE_PGID); - p->group_leader->__pgrp = pgid; + p->signal->pgrp = pgid; attach_pid(p, PIDTYPE_PGID, pgid); } @@ -1026,7 +1044,7 @@ asmlinkage long sys_getsid(pid_t pid) { if (!pid) { - return current->session; + return process_session(current); } else { int retval; struct task_struct *p; @@ -1038,7 +1056,7 @@ if(p) { retval = security_task_getsid(p); if (!retval) - retval = p->session; + retval = process_session(p); } read_unlock(&tasklist_lock); return retval; @@ -1059,10 +1077,10 @@ if (pid) goto out; - current->leader = 1; + current->signal->leader = 1; __set_special_pids(current->pid, current->pid); - current->tty = NULL; - current->tty_old_pgrp = 0; + current->signal->tty = NULL; + current->signal->tty_old_pgrp = 0; err = process_group(current); out: write_unlock_irq(&tasklist_lock); @@ -1144,6 +1162,8 @@ return retval; } +EXPORT_SYMBOL(in_group_p); + int in_egroup_p(gid_t grp) { int retval = 1; @@ -1152,8 +1172,12 @@ return retval; } +EXPORT_SYMBOL(in_egroup_p); + DECLARE_RWSEM(uts_sem); +EXPORT_SYMBOL(uts_sem); + asmlinkage long sys_newuname(struct new_utsname __user * name) { int errno = 0; @@ -1433,11 +1457,3 @@ } return error; } - -EXPORT_SYMBOL(notifier_chain_register); -EXPORT_SYMBOL(notifier_chain_unregister); -EXPORT_SYMBOL(notifier_call_chain); -EXPORT_SYMBOL(register_reboot_notifier); -EXPORT_SYMBOL(unregister_reboot_notifier); -EXPORT_SYMBOL(in_group_p); -EXPORT_SYMBOL(in_egroup_p); diff -Nru a/kernel/sysctl.c b/kernel/sysctl.c --- a/kernel/sysctl.c Wed Oct 8 12:24:55 2003 +++ b/kernel/sysctl.c Wed Oct 8 12:24:55 2003 @@ -19,6 +19,7 @@ */ #include +#include #include #include #include @@ -136,17 +137,14 @@ static ssize_t proc_readsys(struct file *, char __user *, size_t, loff_t *); static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *); -static int proc_sys_permission(struct inode *, int, struct nameidata *); +static int proc_opensys(struct inode *, struct file *); struct file_operations proc_sys_file_operations = { + .open = proc_opensys, .read = proc_readsys, .write = proc_writesys, }; -static struct inode_operations proc_sys_inode_operations = { - .permission = proc_sys_permission, -}; - extern struct proc_dir_entry *proc_sys_root; static void register_proc_table(ctl_table *, struct proc_dir_entry *); @@ -1140,10 +1138,8 @@ if (!de) continue; de->data = (void *) table; - if (table->proc_handler) { + if (table->proc_handler) de->proc_fops = &proc_sys_file_operations; - de->proc_iops = &proc_sys_inode_operations; - } } table->de = de; if (de->mode & S_IFDIR) @@ -1212,6 +1208,20 @@ return res; } +static int proc_opensys(struct inode *inode, struct file *file) +{ + if (file->f_mode & FMODE_WRITE) { + /* + * sysctl entries that are not writable, + * are _NOT_ writable, capabilities or not. + */ + if (!(inode->i_mode & S_IWUSR)) + return -EPERM; + } + + return 0; +} + static ssize_t proc_readsys(struct file * file, char __user * buf, size_t count, loff_t *ppos) { @@ -1224,11 +1234,6 @@ return do_rw_proc(1, file, (char __user *) buf, count, ppos); } -static int proc_sys_permission(struct inode *inode, int op, struct nameidata *nd) -{ - return test_perm(inode->i_mode, op); -} - /** * proc_dostring - read a string sysctl * @table: the sysctl table @@ -1994,3 +1999,19 @@ } #endif /* CONFIG_SYSCTL */ + +/* + * No sense putting this after each symbol definition, twice, + * exception granted :-) + */ +EXPORT_SYMBOL(proc_dointvec); +EXPORT_SYMBOL(proc_dointvec_jiffies); +EXPORT_SYMBOL(proc_dointvec_minmax); +EXPORT_SYMBOL(proc_dostring); +EXPORT_SYMBOL(proc_doulongvec_minmax); +EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); +EXPORT_SYMBOL(register_sysctl_table); +EXPORT_SYMBOL(sysctl_intvec); +EXPORT_SYMBOL(sysctl_jiffies); +EXPORT_SYMBOL(sysctl_string); +EXPORT_SYMBOL(unregister_sysctl_table); diff -Nru a/kernel/time.c b/kernel/time.c --- a/kernel/time.c Wed Oct 8 12:24:56 2003 +++ b/kernel/time.c Wed Oct 8 12:24:56 2003 @@ -24,6 +24,7 @@ * (Even though the technical memorandum forbids it) */ +#include #include #include #include @@ -35,6 +36,8 @@ */ struct timezone sys_tz; +EXPORT_SYMBOL(sys_tz); + #if !defined(__alpha__) && !defined(__ia64__) /* @@ -413,6 +416,8 @@ return now; } +EXPORT_SYMBOL(current_kernel_time); + #if (BITS_PER_LONG < 64) u64 get_jiffies_64(void) { @@ -425,4 +430,8 @@ } while (read_seqretry(&xtime_lock, seq)); return ret; } + +EXPORT_SYMBOL(get_jiffies_64); #endif + +EXPORT_SYMBOL(jiffies); diff -Nru a/kernel/timer.c b/kernel/timer.c --- a/kernel/timer.c Wed Oct 8 12:24:57 2003 +++ b/kernel/timer.c Wed Oct 8 12:24:57 2003 @@ -20,6 +20,7 @@ */ #include +#include #include #include #include @@ -207,6 +208,8 @@ return ret; } +EXPORT_SYMBOL(__mod_timer); + /*** * add_timer_on - start a timer on a particular CPU * @timer: the timer to be added @@ -265,6 +268,8 @@ return __mod_timer(timer, expires); } +EXPORT_SYMBOL(mod_timer); + /*** * del_timer - deactive a timer. * @timer: the timer to be deactivated @@ -299,6 +304,8 @@ return 1; } +EXPORT_SYMBOL(del_timer); + #ifdef CONFIG_SMP /*** * del_timer_sync - deactivate a timer and wait for the handler to finish. @@ -344,8 +351,9 @@ return ret; } -#endif +EXPORT_SYMBOL(del_timer_sync); +#endif static int cascade(tvec_base_t *base, tvec_t *tv, int index) { @@ -441,6 +449,8 @@ struct timespec xtime __attribute__ ((aligned (16))); struct timespec wall_to_monotonic __attribute__ ((aligned (16))); +EXPORT_SYMBOL(xtime); + /* Don't completely fail for HZ > 500. */ int tickadj = 500/HZ ? : 1; /* microsecs */ @@ -779,6 +789,8 @@ */ #ifndef ARCH_HAVE_XTIME_LOCK seqlock_t xtime_lock __cacheline_aligned_in_smp = SEQLOCK_UNLOCKED; + +EXPORT_SYMBOL(xtime_lock); #endif /* @@ -1031,6 +1043,8 @@ out: return timeout < 0 ? 0 : timeout; } + +EXPORT_SYMBOL(schedule_timeout); /* Thread ID - the internal kernel "pid" */ asmlinkage long sys_gettid(void) diff -Nru a/lib/Makefile b/lib/Makefile --- a/lib/Makefile Wed Oct 8 12:24:55 2003 +++ b/lib/Makefile Wed Oct 8 12:24:55 2003 @@ -5,7 +5,7 @@ lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ - kobject.o idr.o div64.o + kobject.o idr.o div64.o parser.o lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o diff -Nru a/lib/ctype.c b/lib/ctype.c --- a/lib/ctype.c Wed Oct 8 12:24:57 2003 +++ b/lib/ctype.c Wed Oct 8 12:24:57 2003 @@ -5,6 +5,7 @@ */ #include +#include unsigned char _ctype[] = { _C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ @@ -32,4 +33,4 @@ _L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */ _L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */ - +EXPORT_SYMBOL(_ctype); diff -Nru a/lib/dump_stack.c b/lib/dump_stack.c --- a/lib/dump_stack.c Wed Oct 8 12:24:57 2003 +++ b/lib/dump_stack.c Wed Oct 8 12:24:57 2003 @@ -11,3 +11,5 @@ printk(KERN_NOTICE "This architecture does not implement dump_stack()\n"); } + +EXPORT_SYMBOL(dump_stack); diff -Nru a/lib/parser.c b/lib/parser.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/lib/parser.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,140 @@ +/* + * lib/parser.c - simple parser for mount, etc. options. + * + * This source code is licensed under the GNU General Public License, + * Version 2. See the file COPYING for more details. + */ + +#include +#include +#include +#include +#include + +static int match_one(char *s, char *p, substring_t args[]) +{ + char *meta; + int argc = 0; + + if (!p) + return 1; + + while(1) { + int len = -1; + meta = strchr(p, '%'); + if (!meta) + return strcmp(p, s) == 0; + + if (strncmp(p, s, meta-p)) + return 0; + + s += meta - p; + p = meta + 1; + + if (isdigit(*p)) + len = simple_strtoul(p, &p, 10); + else if (*p == '%') { + if (*s++ != '%') + return 0; + continue; + } + + if (argc >= MAX_OPT_ARGS) + return 0; + + args[argc].from = s; + switch (*p++) { + case 's': + if (strlen(s) == 0) + return 0; + else if (len == -1 || len > strlen(s)) + len = strlen(s); + args[argc].to = s + len; + break; + case 'd': + simple_strtol(s, &args[argc].to, 0); + goto num; + case 'u': + simple_strtoul(s, &args[argc].to, 0); + goto num; + case 'o': + simple_strtoul(s, &args[argc].to, 8); + goto num; + case 'x': + simple_strtoul(s, &args[argc].to, 16); + num: + if (args[argc].to == args[argc].from) + return 0; + break; + default: + return 0; + } + s = args[argc].to; + argc++; + } +} + +int match_token(char *s, match_table_t table, substring_t args[]) +{ + struct match_token *p; + + for (p = table; !match_one(s, p->pattern, args) ; p++) + ; + + return p->token; +} + +static int match_number(substring_t *s, int *result, int base) +{ + char *endp; + char *buf; + int ret; + + buf = kmalloc(s->to - s->from + 1, GFP_KERNEL); + if (!buf) + return -ENOMEM; + memcpy(buf, s->from, s->to - s->from); + buf[s->to - s->from] = '\0'; + *result = simple_strtol(buf, &endp, base); + ret = 0; + if (endp == buf) + ret = -EINVAL; + kfree(buf); + return ret; +} + +int match_int(substring_t *s, int *result) +{ + return match_number(s, result, 0); +} + +int match_octal(substring_t *s, int *result) +{ + return match_number(s, result, 8); +} + +int match_hex(substring_t *s, int *result) +{ + return match_number(s, result, 16); +} + +void match_strcpy(char *to, substring_t *s) +{ + memcpy(to, s->from, s->to - s->from); + to[s->to - s->from] = '\0'; +} + +char *match_strdup(substring_t *s) +{ + char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL); + if (p) + match_strcpy(p, s); + return p; +} + +EXPORT_SYMBOL(match_token); +EXPORT_SYMBOL(match_int); +EXPORT_SYMBOL(match_octal); +EXPORT_SYMBOL(match_hex); +EXPORT_SYMBOL(match_strcpy); +EXPORT_SYMBOL(match_strdup); diff -Nru a/lib/percpu_counter.c b/lib/percpu_counter.c --- a/lib/percpu_counter.c Wed Oct 8 12:24:55 2003 +++ b/lib/percpu_counter.c Wed Oct 8 12:24:55 2003 @@ -1,4 +1,4 @@ - +#include #include #include @@ -17,3 +17,5 @@ fbc->counters[cpu].count = count; put_cpu(); } + +EXPORT_SYMBOL(percpu_counter_mod); diff -Nru a/lib/string.c b/lib/string.c --- a/lib/string.c Wed Oct 8 12:24:57 2003 +++ b/lib/string.c Wed Oct 8 12:24:57 2003 @@ -55,6 +55,8 @@ } return (int)c1 - (int)c2; } + +EXPORT_SYMBOL(strnicmp); #endif #ifndef __HAVE_ARCH_STRCPY @@ -325,6 +327,8 @@ return count; } + +EXPORT_SYMBOL(strspn); #endif /** @@ -396,6 +400,8 @@ return sbegin; } + +EXPORT_SYMBOL(strsep); #endif #ifndef __HAVE_ARCH_MEMSET diff -Nru a/lib/vsprintf.c b/lib/vsprintf.c --- a/lib/vsprintf.c Wed Oct 8 12:24:57 2003 +++ b/lib/vsprintf.c Wed Oct 8 12:24:57 2003 @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -53,6 +54,8 @@ return result; } +EXPORT_SYMBOL(simple_strtoul); + /** * simple_strtol - convert a string to a signed long * @cp: The start of the string @@ -66,6 +69,8 @@ return simple_strtoul(cp,endp,base); } +EXPORT_SYMBOL(simple_strtol); + /** * simple_strtoull - convert a string to an unsigned long long * @cp: The start of the string @@ -97,6 +102,8 @@ return result; } +EXPORT_SYMBOL(simple_strtoull); + /** * simple_strtoll - convert a string to a signed long long * @cp: The start of the string @@ -458,6 +465,8 @@ return str-buf; } +EXPORT_SYMBOL(vsnprintf); + /** * snprintf - Format a string and place it in a buffer * @buf: The buffer to place the result into @@ -476,6 +485,8 @@ return i; } +EXPORT_SYMBOL(snprintf); + /** * vsprintf - Format a string and place it in a buffer * @buf: The buffer to place the result into @@ -490,6 +501,7 @@ return vsnprintf(buf, 0xFFFFFFFFUL, fmt, args); } +EXPORT_SYMBOL(vsprintf); /** * sprintf - Format a string and place it in a buffer @@ -508,6 +520,8 @@ return i; } +EXPORT_SYMBOL(sprintf); + /** * vsscanf - Unformat a buffer into a list of arguments * @buf: input buffer @@ -707,6 +721,8 @@ return num; } +EXPORT_SYMBOL(vsscanf); + /** * sscanf - Unformat a buffer into a list of arguments * @buf: input buffer @@ -723,3 +739,5 @@ va_end(args); return i; } + +EXPORT_SYMBOL(sscanf); diff -Nru a/mm/bootmem.c b/mm/bootmem.c --- a/mm/bootmem.c Wed Oct 8 12:24:56 2003 +++ b/mm/bootmem.c Wed Oct 8 12:24:56 2003 @@ -146,7 +146,7 @@ * We 'merge' subsequent allocations to save space. We might 'lose' * some fraction of a page if allocations cannot be satisfied due to * size constraints on boxes where there is physical RAM space - * fragmentation - in these cases * (mostly large memory boxes) this + * fragmentation - in these cases (mostly large memory boxes) this * is not a problem. * * On low memory boxes we get it right in 100% of the cases. diff -Nru a/mm/filemap.c b/mm/filemap.c --- a/mm/filemap.c Wed Oct 8 12:24:56 2003 +++ b/mm/filemap.c Wed Oct 8 12:24:56 2003 @@ -151,6 +151,8 @@ return __filemap_fdatawrite(mapping, WB_SYNC_ALL); } +EXPORT_SYMBOL(filemap_fdatawrite); + /* * This is a mostly non-blocking flush. Not suitable for data-integrity * purposes. @@ -216,6 +218,8 @@ return ret; } +EXPORT_SYMBOL(filemap_fdatawait); + /* * This adds a page to the page cache, starting out as locked, unreferenced, * not uptodate and with no errors. @@ -253,6 +257,7 @@ } return error; } + EXPORT_SYMBOL(add_to_page_cache); int add_to_page_cache_lru(struct page *page, struct address_space *mapping, @@ -295,6 +300,7 @@ } while (test_bit(bit_nr, &page->flags)); finish_wait(waitqueue, &wait); } + EXPORT_SYMBOL(wait_on_page_bit); /** @@ -323,6 +329,9 @@ wake_up_all(waitqueue); } +EXPORT_SYMBOL(unlock_page); +EXPORT_SYMBOL(lock_page); + /* * End writeback against a page. */ @@ -339,6 +348,7 @@ if (waitqueue_active(waitqueue)) wake_up_all(waitqueue); } + EXPORT_SYMBOL(end_page_writeback); /* @@ -363,6 +373,7 @@ } finish_wait(wqh, &wait); } + EXPORT_SYMBOL(__lock_page); /* @@ -385,6 +396,8 @@ return page; } +EXPORT_SYMBOL(find_get_page); + /* * Same as above, but trylock it instead of incrementing the count. */ @@ -400,6 +413,8 @@ return page; } +EXPORT_SYMBOL(find_trylock_page); + /** * find_lock_page - locate, pin and lock a pagecache page * @@ -438,6 +453,8 @@ return page; } +EXPORT_SYMBOL(find_lock_page); + /** * find_or_create_page - locate or add a pagecache page * @@ -482,6 +499,8 @@ return page; } +EXPORT_SYMBOL(find_or_create_page); + /** * find_get_pages - gang pagecache lookup * @mapping: The address_space to search @@ -543,6 +562,8 @@ return page; } +EXPORT_SYMBOL(grab_cache_page_nowait); + /* * This is a generic file read routine, and uses the * inode->i_op->readpage() function for the actual low-level @@ -699,6 +720,8 @@ update_atime(inode); } +EXPORT_SYMBOL(do_generic_mapping_read); + int file_read_actor(read_descriptor_t *desc, struct page *page, unsigned long offset, unsigned long size) { @@ -816,6 +839,8 @@ return retval; } +EXPORT_SYMBOL(__generic_file_aio_read); + ssize_t generic_file_aio_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t pos) { @@ -824,8 +849,8 @@ BUG_ON(iocb->ki_pos != pos); return __generic_file_aio_read(iocb, &local_iov, 1, &iocb->ki_pos); } + EXPORT_SYMBOL(generic_file_aio_read); -EXPORT_SYMBOL(__generic_file_aio_read); ssize_t generic_file_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) @@ -841,6 +866,8 @@ return ret; } +EXPORT_SYMBOL(generic_file_read); + int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size) { ssize_t written; @@ -880,6 +907,8 @@ return desc.error; } +EXPORT_SYMBOL(generic_file_sendfile); + static ssize_t do_readahead(struct address_space *mapping, struct file *filp, unsigned long index, unsigned long nr) @@ -1126,6 +1155,8 @@ return NULL; } +EXPORT_SYMBOL(filemap_nopage); + static struct page * filemap_getpage(struct file *file, unsigned long pgoff, int nonblock) { @@ -1330,6 +1361,9 @@ } #endif /* CONFIG_MMU */ +EXPORT_SYMBOL(generic_file_mmap); +EXPORT_SYMBOL(generic_file_readonly_mmap); + static inline struct page *__read_cache_page(struct address_space *mapping, unsigned long index, int (*filler)(void *,struct page*), @@ -1406,6 +1440,8 @@ return page; } +EXPORT_SYMBOL(read_cache_page); + /* * If the page was newly created, increment its refcount and add it to the * caller's lru-buffering pagevec. This function is specifically for @@ -1456,6 +1492,8 @@ } } +EXPORT_SYMBOL(remove_suid); + /* * Copy as much as we can into the page and return the number of bytes which * were sucessfully copied. If a fault is encountered then clear the page @@ -1638,6 +1676,7 @@ } return 0; } + EXPORT_SYMBOL(generic_write_checks); /* @@ -1832,6 +1871,8 @@ return err; } +EXPORT_SYMBOL(generic_file_aio_write_nolock); + ssize_t generic_file_write_nolock(struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos) @@ -1846,6 +1887,8 @@ return ret; } +EXPORT_SYMBOL(generic_file_write_nolock); + ssize_t generic_file_aio_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos) { @@ -1863,8 +1906,8 @@ return err; } + EXPORT_SYMBOL(generic_file_aio_write); -EXPORT_SYMBOL(generic_file_aio_write_nolock); ssize_t generic_file_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) @@ -1880,6 +1923,8 @@ return err; } +EXPORT_SYMBOL(generic_file_write); + ssize_t generic_file_readv(struct file *filp, const struct iovec *iov, unsigned long nr_segs, loff_t *ppos) { @@ -1893,6 +1938,8 @@ return ret; } +EXPORT_SYMBOL(generic_file_readv); + ssize_t generic_file_writev(struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t * ppos) { @@ -1905,6 +1952,8 @@ return ret; } +EXPORT_SYMBOL(generic_file_writev); + ssize_t generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_t offset, unsigned long nr_segs) @@ -1927,3 +1976,5 @@ out: return retval; } + +EXPORT_SYMBOL_GPL(generic_file_direct_IO); diff -Nru a/mm/highmem.c b/mm/highmem.c --- a/mm/highmem.c Wed Oct 8 12:24:57 2003 +++ b/mm/highmem.c Wed Oct 8 12:24:57 2003 @@ -17,6 +17,7 @@ */ #include +#include #include #include #include @@ -24,6 +25,7 @@ #include #include #include +#include #include #include @@ -62,7 +64,7 @@ { int i; - flush_cache_all(); + flush_cache_kmaps(); for (i = 0; i < LAST_PKMAP; i++) { struct page *page; @@ -166,6 +168,8 @@ return (void*) vaddr; } +EXPORT_SYMBOL(kmap_high); + void kunmap_high(struct page *page) { unsigned long vaddr; @@ -206,6 +210,8 @@ wake_up(&pkmap_map_wait); } +EXPORT_SYMBOL(kunmap_high); + #define POOL_SIZE 64 static __init int init_emergency_pool(void) @@ -472,6 +478,8 @@ __blk_queue_bounce(q, bio_orig, pool); } +EXPORT_SYMBOL(blk_queue_bounce); + #if defined(HASHED_PAGE_VIRTUAL) #define PA_HASH_ORDER 7 @@ -530,6 +538,8 @@ spin_unlock_irqrestore(&pas->lock, flags); return ret; } + +EXPORT_SYMBOL(page_address); void set_page_address(struct page *page, void *virtual) { diff -Nru a/mm/memory.c b/mm/memory.c --- a/mm/memory.c Wed Oct 8 12:24:56 2003 +++ b/mm/memory.c Wed Oct 8 12:24:56 2003 @@ -59,12 +59,19 @@ /* use the per-pgdat data instead for discontigmem - mbligh */ unsigned long max_mapnr; struct page *mem_map; + +EXPORT_SYMBOL(max_mapnr); +EXPORT_SYMBOL(mem_map); #endif unsigned long num_physpages; void * high_memory; struct page *highmem_start_page; +EXPORT_SYMBOL(num_physpages); +EXPORT_SYMBOL(highmem_start_page); +EXPORT_SYMBOL(high_memory); + /* * We special-case the C-O-W ZERO_PAGE, because it's such * a common occurrence (no need to read the page to know @@ -789,6 +796,8 @@ return i; } +EXPORT_SYMBOL(get_user_pages); + static void zeromap_pte_range(pte_t * pte, unsigned long address, unsigned long size, pgprot_t prot) { @@ -940,6 +949,8 @@ return error; } +EXPORT_SYMBOL(remap_page_range); + /* * Establish a new mapping: * - flush the old one @@ -1178,6 +1189,8 @@ return -EFBIG; } +EXPORT_SYMBOL(vmtruncate); + /* * Primitive swap readahead code. We simply read an aligned block of * (1 << page_cluster) entries in the swap area. This method is chosen @@ -1441,6 +1454,7 @@ sequence = atomic_read(&mapping->truncate_count); spin_unlock(&mm->page_table_lock); page_cache_release(new_page); + pte_chain_free(pte_chain); goto retry; } page_table = pte_offset_map(pmd, address); @@ -1685,3 +1699,5 @@ } return page; } + +EXPORT_SYMBOL(vmalloc_to_page); diff -Nru a/mm/mmap.c b/mm/mmap.c --- a/mm/mmap.c Wed Oct 8 12:24:57 2003 +++ b/mm/mmap.c Wed Oct 8 12:24:57 2003 @@ -681,6 +681,8 @@ return error; } +EXPORT_SYMBOL(do_mmap_pgoff); + /* Get an address range which is currently unmapped. * For shmat() with addr=0. * @@ -779,6 +781,8 @@ return arch_get_unmapped_area(file, addr, len, pgoff, flags); } +EXPORT_SYMBOL(get_unmapped_area); + /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr) { @@ -815,6 +819,8 @@ return vma; } +EXPORT_SYMBOL(find_vma); + /* Same as find_vma, but also return a pointer to the previous VMA in *pprev. */ struct vm_area_struct * find_vma_prev(struct mm_struct *mm, unsigned long addr, @@ -1242,6 +1248,8 @@ return 0; } +EXPORT_SYMBOL(do_munmap); + asmlinkage long sys_munmap(unsigned long addr, size_t len) { int ret; @@ -1341,6 +1349,8 @@ } return addr; } + +EXPORT_SYMBOL(do_brk); /* Build the RB tree corresponding to the VMA list. */ void build_mmap_rb(struct mm_struct * mm) diff -Nru a/mm/page_alloc.c b/mm/page_alloc.c --- a/mm/page_alloc.c Wed Oct 8 12:24:55 2003 +++ b/mm/page_alloc.c Wed Oct 8 12:24:55 2003 @@ -50,7 +50,7 @@ * Used by page_zone() to look up the address of the struct zone whose * id is encoded in the upper bits of page->flags */ -struct zone *zone_table[MAX_NR_ZONES*MAX_NR_NODES]; +struct zone *zone_table[MAX_NR_ZONES*MAX_NUMNODES]; EXPORT_SYMBOL(zone_table); static char *zone_names[MAX_NR_ZONES] = { "DMA", "Normal", "HighMem" }; @@ -679,6 +679,8 @@ return page; } +EXPORT_SYMBOL(__alloc_pages); + /* * Common helper functions. */ @@ -692,6 +694,8 @@ return (unsigned long) page_address(page); } +EXPORT_SYMBOL(__get_free_pages); + unsigned long get_zeroed_page(unsigned int gfp_mask) { struct page * page; @@ -711,6 +715,8 @@ return 0; } +EXPORT_SYMBOL(get_zeroed_page); + void __pagevec_free(struct pagevec *pvec) { int i = pagevec_count(pvec); @@ -729,6 +735,8 @@ } } +EXPORT_SYMBOL(__free_pages); + void free_pages(unsigned long addr, unsigned int order) { if (addr != 0) { @@ -737,6 +745,8 @@ } } +EXPORT_SYMBOL(free_pages); + /* * Total amount of free (allocatable) RAM: */ @@ -750,6 +760,7 @@ return sum; } + EXPORT_SYMBOL(nr_free_pages); unsigned int nr_used_zone_pages(void) @@ -917,6 +928,8 @@ val->mem_unit = PAGE_SIZE; } +EXPORT_SYMBOL(si_meminfo); + #ifdef CONFIG_NUMA void si_meminfo_node(struct sysinfo *val, int nid) { @@ -1383,6 +1396,8 @@ #ifndef CONFIG_DISCONTIGMEM static bootmem_data_t contig_bootmem_data; struct pglist_data contig_page_data = { .bdata = &contig_bootmem_data }; + +EXPORT_SYMBOL(contig_page_data); void __init free_area_init(unsigned long *zones_size) { diff -Nru a/mm/readahead.c b/mm/readahead.c --- a/mm/readahead.c Wed Oct 8 12:24:55 2003 +++ b/mm/readahead.c Wed Oct 8 12:24:55 2003 @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -19,6 +20,8 @@ .state = 0, }; +EXPORT_SYMBOL_GPL(default_backing_dev_info); + /* * Initialise a struct file's readahead state */ @@ -29,6 +32,8 @@ ra->ra_pages = mapping->backing_dev_info->ra_pages; } +EXPORT_SYMBOL(file_ra_state_init); + /* * Return max readahead size for this inode in number-of-pages. */ @@ -88,6 +93,8 @@ pagevec_lru_add(&lru_pvec); return ret; } + +EXPORT_SYMBOL(read_cache_pages); static int read_pages(struct address_space *mapping, struct file *filp, struct list_head *pages, unsigned nr_pages) diff -Nru a/mm/slab.c b/mm/slab.c --- a/mm/slab.c Wed Oct 8 12:24:57 2003 +++ b/mm/slab.c Wed Oct 8 12:24:57 2003 @@ -250,7 +250,7 @@ unsigned int limit; /* 2) touched by every alloc & free from the backend */ struct kmem_list3 lists; - /* NUMA: kmem_3list_t *nodelists[NR_NODES] */ + /* NUMA: kmem_3list_t *nodelists[MAX_NUMNODES] */ unsigned int objsize; unsigned int flags; /* constant flags */ unsigned int num; /* # of objs per slab */ @@ -466,6 +466,8 @@ #undef CACHE }; +EXPORT_SYMBOL(malloc_sizes); + /* Must match cache_sizes above. Out of line to keep cache footprint low. */ static struct cache_names { char *name; @@ -1276,6 +1278,8 @@ return cachep; } +EXPORT_SYMBOL(kmem_cache_create); + static inline void check_irq_off(void) { #if DEBUG @@ -1395,6 +1399,8 @@ return __cache_shrink(cachep); } +EXPORT_SYMBOL(kmem_cache_shrink); + /** * kmem_cache_destroy - delete a cache * @cachep: the cache to destroy @@ -1446,6 +1452,8 @@ return 0; } +EXPORT_SYMBOL(kmem_cache_destroy); + /* Get the memory for a slab management obj. */ static inline struct slab* alloc_slabmgmt (kmem_cache_t *cachep, void *objp, int colour_off, int local_flags) @@ -2064,6 +2072,8 @@ return __cache_alloc(cachep, flags); } +EXPORT_SYMBOL(kmem_cache_alloc); + /** * kmalloc - allocate memory * @size: how many bytes of memory are required. @@ -2105,6 +2115,8 @@ return NULL; } +EXPORT_SYMBOL(__kmalloc); + #ifdef CONFIG_SMP /** * __alloc_percpu - allocate one copy of the object for every present @@ -2144,6 +2156,8 @@ kfree(pdata); return NULL; } + +EXPORT_SYMBOL(__alloc_percpu); #endif /** @@ -2163,6 +2177,8 @@ local_irq_restore(flags); } +EXPORT_SYMBOL(kmem_cache_free); + /** * kfree - free previously allocated memory * @objp: pointer returned by kmalloc. @@ -2184,6 +2200,8 @@ local_irq_restore(flags); } +EXPORT_SYMBOL(kfree); + #ifdef CONFIG_SMP /** * free_percpu - free previously allocated percpu memory @@ -2204,6 +2222,8 @@ kfree(p->ptrs[i]); } } + +EXPORT_SYMBOL(free_percpu); #endif unsigned int kmem_cache_size(kmem_cache_t *cachep) @@ -2211,6 +2231,8 @@ return obj_reallen(cachep); } +EXPORT_SYMBOL(kmem_cache_size); + kmem_cache_t * kmem_find_general_cachep (size_t size, int gfpflags) { struct cache_sizes *csizep = malloc_sizes; @@ -2227,6 +2249,8 @@ return (gfpflags & GFP_DMA) ? csizep->cs_dmacachep : csizep->cs_cachep; } +EXPORT_SYMBOL(kmem_find_general_cachep); + struct ccupdate_struct { kmem_cache_t *cachep; struct array_cache *new[NR_CPUS]; @@ -2675,8 +2699,8 @@ * slabinfo_write - Tuning for the slab allocator * @file: unused * @buffer: user buffer - * @count: data len - * @data: unused + * @count: data length + * @ppos: unused */ ssize_t slabinfo_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) @@ -2749,6 +2773,7 @@ printk("virt addr invalid.\n"); return; } +#ifdef CONFIG_MMU do { pgd_t *pgd = pgd_offset_k(addr); pmd_t *pmd; @@ -2770,6 +2795,7 @@ printk("normal page, pte_val 0x%llx\n", (unsigned long long)pte_val(*pte_offset_kernel(pmd, addr))); } while(0); +#endif page = virt_to_page((void*)addr); printk("struct page at %p, flags %lxh.\n", page, page->flags); diff -Nru a/mm/swap.c b/mm/swap.c --- a/mm/swap.c Wed Oct 8 12:24:56 2003 +++ b/mm/swap.c Wed Oct 8 12:24:56 2003 @@ -104,6 +104,8 @@ } } +EXPORT_SYMBOL(mark_page_accessed); + /** * lru_cache_add: add a page to the page lists * @page: the page to add @@ -162,6 +164,8 @@ free_hot_page(page); } +EXPORT_SYMBOL(__page_cache_release); + /* * Batched page_cache_release(). Decrement the reference count on all the * passed pages. If it fell to zero then remove the page from the LRU and @@ -280,6 +284,8 @@ release_pages(pvec->pages, pvec->nr, pvec->cold); pagevec_reinit(pvec); } + +EXPORT_SYMBOL(__pagevec_lru_add); void __pagevec_lru_add_active(struct pagevec *pvec) { diff -Nru a/mm/truncate.c b/mm/truncate.c --- a/mm/truncate.c Wed Oct 8 12:24:57 2003 +++ b/mm/truncate.c Wed Oct 8 12:24:57 2003 @@ -9,6 +9,7 @@ #include #include +#include #include #include #include /* grr. try_to_release_page, @@ -175,6 +176,8 @@ } } +EXPORT_SYMBOL(truncate_inode_pages); + /** * invalidate_mapping_pages - Invalidate all the unlocked pages of one inode * @mapping: the address_space which holds the pages to invalidate @@ -228,6 +231,8 @@ return invalidate_mapping_pages(mapping, 0, ~0UL); } +EXPORT_SYMBOL(invalidate_inode_pages); + /** * invalidate_inode_pages2 - remove all unmapped pages from an address_space * @mapping - the address_space @@ -264,3 +269,5 @@ cond_resched(); } } + +EXPORT_SYMBOL_GPL(invalidate_inode_pages2); diff -Nru a/mm/vmalloc.c b/mm/vmalloc.c --- a/mm/vmalloc.c Wed Oct 8 12:24:57 2003 +++ b/mm/vmalloc.c Wed Oct 8 12:24:57 2003 @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -135,23 +136,23 @@ void unmap_vm_area(struct vm_struct *area) { - unsigned long address = VMALLOC_VMADDR(area->addr); + unsigned long address = (unsigned long) area->addr; unsigned long end = (address + area->size); pgd_t *dir; dir = pgd_offset_k(address); - flush_cache_all(); + flush_cache_vunmap(address, end); do { unmap_area_pmd(dir, address, end - address); address = (address + PGDIR_SIZE) & PGDIR_MASK; dir++; } while (address && (address < end)); - flush_tlb_kernel_range(VMALLOC_VMADDR(area->addr), end); + flush_tlb_kernel_range((unsigned long) area->addr, end); } int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages) { - unsigned long address = VMALLOC_VMADDR(area->addr); + unsigned long address = (unsigned long) area->addr; unsigned long end = address + (area->size-PAGE_SIZE); pgd_t *dir; int err = 0; @@ -174,7 +175,7 @@ } while (address && (address < end)); spin_unlock(&init_mm.page_table_lock); - flush_cache_all(); + flush_cache_vmap((unsigned long) area->addr, end); return err; } @@ -324,6 +325,8 @@ __vunmap(addr, 1); } +EXPORT_SYMBOL(vfree); + /** * vunmap - release virtual mapping obtained by vmap() * @@ -340,6 +343,8 @@ __vunmap(addr, 0); } +EXPORT_SYMBOL(vunmap); + /** * vmap - map an array of pages into virtually contiguous space * @@ -370,6 +375,8 @@ return area->addr; } +EXPORT_SYMBOL(vmap); + /** * __vmalloc - allocate virtually contiguous memory * @@ -425,6 +432,8 @@ return NULL; } +EXPORT_SYMBOL(__vmalloc); + /** * vmalloc - allocate virtually contiguous memory * @@ -441,6 +450,8 @@ return __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL); } +EXPORT_SYMBOL(vmalloc); + /** * vmalloc_32 - allocate virtually contiguous memory (32bit addressable) * @@ -453,6 +464,8 @@ { return __vmalloc(size, GFP_KERNEL, PAGE_KERNEL); } + +EXPORT_SYMBOL(vmalloc_32); long vread(char *buf, char *addr, unsigned long count) { diff -Nru a/mm/vmscan.c b/mm/vmscan.c --- a/mm/vmscan.c Wed Oct 8 12:24:55 2003 +++ b/mm/vmscan.c Wed Oct 8 12:24:55 2003 @@ -12,6 +12,7 @@ */ #include +#include #include #include #include @@ -112,6 +113,8 @@ return shrinker; } +EXPORT_SYMBOL(set_shrinker); + /* * Remove one */ @@ -122,6 +125,8 @@ up(&shrinker_sem); kfree(shrinker); } + +EXPORT_SYMBOL(remove_shrinker); #define SHRINK_BATCH 128 /* diff -Nru a/net/802/fddi.c b/net/802/fddi.c --- a/net/802/fddi.c Wed Oct 8 12:24:57 2003 +++ b/net/802/fddi.c Wed Oct 8 12:24:57 2003 @@ -27,6 +27,7 @@ */ #include +#include #include #include #include @@ -163,3 +164,5 @@ return(type); } + +EXPORT_SYMBOL(fddi_type_trans); diff -Nru a/net/802/hippi.c b/net/802/hippi.c --- a/net/802/hippi.c Wed Oct 8 12:24:56 2003 +++ b/net/802/hippi.c Wed Oct 8 12:24:56 2003 @@ -20,6 +20,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -151,3 +152,5 @@ return hip->snap.ethertype; } + +EXPORT_SYMBOL(hippi_type_trans); diff -Nru a/net/802/p8023.c b/net/802/p8023.c --- a/net/802/p8023.c Wed Oct 8 12:24:55 2003 +++ b/net/802/p8023.c Wed Oct 8 12:24:55 2003 @@ -12,22 +12,24 @@ * running raw 802.3 on different devices. Thankfully nobody else * has done anything like the old IPX. */ - + +#include +#include +#include #include #include + #include -#include -#include /* * Place an 802.3 header on a packet. The driver will do the mac * addresses, we just need to give it the buffer length. */ - -static int p8023_request(struct datalink_proto *dl, - struct sk_buff *skb, unsigned char *dest_node) +static int p8023_request(struct datalink_proto *dl, + struct sk_buff *skb, unsigned char *dest_node) { - struct net_device *dev = skb->dev; + struct net_device *dev = skb->dev; + dev->hard_header(skb, dev, ETH_P_802_3, dest_node, NULL, skb->len); return dev_queue_xmit(skb); } @@ -35,16 +37,13 @@ /* * Create an 802.3 client. Note there can be only one 802.3 client */ - struct datalink_proto *make_8023_client(void) { - struct datalink_proto *proto; + struct datalink_proto *proto = kmalloc(sizeof(*proto), GFP_ATOMIC); - proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC); - if (proto != NULL) - { + if (proto) { proto->header_length = 0; - proto->request = p8023_request; + proto->request = p8023_request; } return proto; } @@ -52,10 +51,11 @@ /* * Destroy the 802.3 client. */ - void destroy_8023_client(struct datalink_proto *dl) { if (dl) kfree(dl); } +EXPORT_SYMBOL(destroy_8023_client); +EXPORT_SYMBOL(make_8023_client); diff -Nru a/net/802/tr.c b/net/802/tr.c --- a/net/802/tr.c Wed Oct 8 12:24:55 2003 +++ b/net/802/tr.c Wed Oct 8 12:24:55 2003 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -600,3 +601,6 @@ } module_init(rif_init); + +EXPORT_SYMBOL(tr_source_route); +EXPORT_SYMBOL(tr_type_trans); diff -Nru a/net/8021q/vlan.c b/net/8021q/vlan.c --- a/net/8021q/vlan.c Wed Oct 8 12:24:57 2003 +++ b/net/8021q/vlan.c Wed Oct 8 12:24:57 2003 @@ -67,7 +67,6 @@ static struct packet_type vlan_packet_type = { .type = __constant_htons(ETH_P_8021Q), .func = vlan_skb_recv, /* VLAN receive method */ - .data = PKT_CAN_SHARE_SKB, }; /* End of global variables definitions. */ diff -Nru a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c --- a/net/8021q/vlan_dev.c Wed Oct 8 12:24:57 2003 +++ b/net/8021q/vlan_dev.c Wed Oct 8 12:24:57 2003 @@ -74,7 +74,11 @@ static inline struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb) { if (VLAN_DEV_INFO(skb->dev)->flags & 1) { - skb = skb_share_check(skb, GFP_ATOMIC); + if (skb_shared(skb) || skb_cloned(skb)) { + struct sk_buff *nskb = skb_copy(skb, GFP_ATOMIC); + kfree(skb); + skb = nskb; + } if (skb) { /* Lifted from Gleb's VLAN code... */ memmove(skb->data - ETH_HLEN, @@ -501,6 +505,10 @@ stats->tx_packets++; /* for statics only */ stats->tx_bytes += skb->len; + + skb->protocol = __constant_htons(ETH_P_8021Q); + skb->mac.raw -= VLAN_HLEN; + skb->nh.raw -= VLAN_HLEN; dev_queue_xmit(skb); diff -Nru a/net/Kconfig b/net/Kconfig --- a/net/Kconfig Wed Oct 8 12:24:55 2003 +++ b/net/Kconfig Wed Oct 8 12:24:55 2003 @@ -586,7 +586,7 @@ depends on EXPERIMENTAL ---help--- This option enables NIC (Network Interface Card) hardware throttling - during periods of extremal congestion. At the moment only a couple + during periods of extreme congestion. At the moment only a couple of device drivers support it (really only one -- tulip, a modified 8390 driver can be found at ). diff -Nru a/net/Makefile b/net/Makefile --- a/net/Makefile Wed Oct 8 12:24:56 2003 +++ b/net/Makefile Wed Oct 8 12:24:56 2003 @@ -40,6 +40,5 @@ obj-$(CONFIG_IP_SCTP) += sctp/ ifeq ($(CONFIG_NET),y) -obj-$(CONFIG_MODULES) += netsyms.o obj-$(CONFIG_SYSCTL) += sysctl_net.o endif diff -Nru a/net/appletalk/ddp.c b/net/appletalk/ddp.c --- a/net/appletalk/ddp.c Wed Oct 8 12:24:57 2003 +++ b/net/appletalk/ddp.c Wed Oct 8 12:24:57 2003 @@ -1872,13 +1872,11 @@ struct packet_type ltalk_packet_type = { .type = __constant_htons(ETH_P_LOCALTALK), .func = ltalk_rcv, - .data = PKT_CAN_SHARE_SKB, }; struct packet_type ppptalk_packet_type = { .type = __constant_htons(ETH_P_PPPTALK), .func = atalk_rcv, - .data = PKT_CAN_SHARE_SKB, }; static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B }; diff -Nru a/net/atm/atm_misc.c b/net/atm/atm_misc.c --- a/net/atm/atm_misc.c Wed Oct 8 12:24:56 2003 +++ b/net/atm/atm_misc.c Wed Oct 8 12:24:56 2003 @@ -45,76 +45,6 @@ } -static int check_ci(struct atm_vcc *vcc,short vpi,int vci) -{ - struct hlist_node *node; - struct sock *s; - struct atm_vcc *walk; - - sk_for_each(s, node, &vcc_sklist) { - walk = atm_sk(s); - if (walk->dev != vcc->dev) - continue; - if (test_bit(ATM_VF_ADDR,&walk->flags) && walk->vpi == vpi && - walk->vci == vci && ((walk->qos.txtp.traffic_class != - ATM_NONE && vcc->qos.txtp.traffic_class != ATM_NONE) || - (walk->qos.rxtp.traffic_class != ATM_NONE && - vcc->qos.rxtp.traffic_class != ATM_NONE))) - return -EADDRINUSE; - } - /* allow VCCs with same VPI/VCI iff they don't collide on - TX/RX (but we may refuse such sharing for other reasons, - e.g. if protocol requires to have both channels) */ - return 0; -} - - -int atm_find_ci(struct atm_vcc *vcc,short *vpi,int *vci) -{ - static short p; /* poor man's per-device cache */ - static int c; - short old_p; - int old_c; - int err; - - read_lock(&vcc_sklist_lock); - if (*vpi != ATM_VPI_ANY && *vci != ATM_VCI_ANY) { - err = check_ci(vcc,*vpi,*vci); - read_unlock(&vcc_sklist_lock); - return err; - } - /* last scan may have left values out of bounds for current device */ - if (*vpi != ATM_VPI_ANY) p = *vpi; - else if (p >= 1 << vcc->dev->ci_range.vpi_bits) p = 0; - if (*vci != ATM_VCI_ANY) c = *vci; - else if (c < ATM_NOT_RSV_VCI || c >= 1 << vcc->dev->ci_range.vci_bits) - c = ATM_NOT_RSV_VCI; - old_p = p; - old_c = c; - do { - if (!check_ci(vcc,p,c)) { - *vpi = p; - *vci = c; - read_unlock(&vcc_sklist_lock); - return 0; - } - if (*vci == ATM_VCI_ANY) { - c++; - if (c >= 1 << vcc->dev->ci_range.vci_bits) - c = ATM_NOT_RSV_VCI; - } - if ((c == ATM_NOT_RSV_VCI || *vci != ATM_VCI_ANY) && - *vpi == ATM_VPI_ANY) { - p++; - if (p >= 1 << vcc->dev->ci_range.vpi_bits) p = 0; - } - } - while (old_p != p || old_c != c); - read_unlock(&vcc_sklist_lock); - return -EADDRINUSE; -} - - /* * atm_pcr_goal returns the positive PCR if it should be rounded up, the * negative PCR if it should be rounded down, and zero if the maximum available @@ -170,7 +100,6 @@ EXPORT_SYMBOL(atm_charge); EXPORT_SYMBOL(atm_alloc_charge); -EXPORT_SYMBOL(atm_find_ci); EXPORT_SYMBOL(atm_pcr_goal); EXPORT_SYMBOL(sonet_copy_stats); EXPORT_SYMBOL(sonet_subtract_stats); diff -Nru a/net/atm/common.c b/net/atm/common.c --- a/net/atm/common.c Wed Oct 8 12:24:57 2003 +++ b/net/atm/common.c Wed Oct 8 12:24:57 2003 @@ -38,13 +38,16 @@ #define DPRINTK(format,args...) #endif - -HLIST_HEAD(vcc_sklist); +struct hlist_head vcc_hash[VCC_HTABLE_SIZE]; rwlock_t vcc_sklist_lock = RW_LOCK_UNLOCKED; void __vcc_insert_socket(struct sock *sk) { - sk_add_node(sk, &vcc_sklist); + struct atm_vcc *vcc = atm_sk(sk); + struct hlist_head *head = &vcc_hash[vcc->vci & + (VCC_HTABLE_SIZE - 1)]; + sk->sk_hashent = vcc->vci & (VCC_HTABLE_SIZE - 1); + sk_add_node(sk, head); } void vcc_insert_socket(struct sock *sk) @@ -80,7 +83,7 @@ } -EXPORT_SYMBOL(vcc_sklist); +EXPORT_SYMBOL(vcc_hash); EXPORT_SYMBOL(vcc_sklist_lock); EXPORT_SYMBOL(vcc_insert_socket); EXPORT_SYMBOL(vcc_remove_socket); @@ -248,7 +251,80 @@ } -static int __vcc_connect(struct atm_vcc *vcc, struct atm_dev *dev, int vpi, +static int check_ci(struct atm_vcc *vcc, short vpi, int vci) +{ + struct hlist_head *head = &vcc_hash[vci & + (VCC_HTABLE_SIZE - 1)]; + struct hlist_node *node; + struct sock *s; + struct atm_vcc *walk; + + sk_for_each(s, node, head) { + walk = atm_sk(s); + if (walk->dev != vcc->dev) + continue; + if (test_bit(ATM_VF_ADDR, &walk->flags) && walk->vpi == vpi && + walk->vci == vci && ((walk->qos.txtp.traffic_class != + ATM_NONE && vcc->qos.txtp.traffic_class != ATM_NONE) || + (walk->qos.rxtp.traffic_class != ATM_NONE && + vcc->qos.rxtp.traffic_class != ATM_NONE))) + return -EADDRINUSE; + } + + /* allow VCCs with same VPI/VCI iff they don't collide on + TX/RX (but we may refuse such sharing for other reasons, + e.g. if protocol requires to have both channels) */ + + return 0; +} + + +static int find_ci(struct atm_vcc *vcc, short *vpi, int *vci) +{ + static short p; /* poor man's per-device cache */ + static int c; + short old_p; + int old_c; + int err; + + if (*vpi != ATM_VPI_ANY && *vci != ATM_VCI_ANY) { + err = check_ci(vcc, *vpi, *vci); + return err; + } + /* last scan may have left values out of bounds for current device */ + if (*vpi != ATM_VPI_ANY) + p = *vpi; + else if (p >= 1 << vcc->dev->ci_range.vpi_bits) + p = 0; + if (*vci != ATM_VCI_ANY) + c = *vci; + else if (c < ATM_NOT_RSV_VCI || c >= 1 << vcc->dev->ci_range.vci_bits) + c = ATM_NOT_RSV_VCI; + old_p = p; + old_c = c; + do { + if (!check_ci(vcc, p, c)) { + *vpi = p; + *vci = c; + return 0; + } + if (*vci == ATM_VCI_ANY) { + c++; + if (c >= 1 << vcc->dev->ci_range.vci_bits) + c = ATM_NOT_RSV_VCI; + } + if ((c == ATM_NOT_RSV_VCI || *vci != ATM_VCI_ANY) && + *vpi == ATM_VPI_ANY) { + p++; + if (p >= 1 << vcc->dev->ci_range.vpi_bits) p = 0; + } + } + while (old_p != p || old_c != c); + return -EADDRINUSE; +} + + +static int __vcc_connect(struct atm_vcc *vcc, struct atm_dev *dev, short vpi, int vci) { int error; @@ -260,8 +336,18 @@ if (vci > 0 && vci < ATM_NOT_RSV_VCI && !capable(CAP_NET_BIND_SERVICE)) return -EPERM; error = 0; + if (!try_module_get(dev->ops->owner)) + return -ENODEV; vcc->dev = dev; - vcc_insert_socket(vcc->sk); + write_lock_irq(&vcc_sklist_lock); + if ((error = find_ci(vcc, &vpi, &vci))) { + write_unlock_irq(&vcc_sklist_lock); + goto fail_module_put; + } + vcc->vpi = vpi; + vcc->vci = vci; + __vcc_insert_socket(vcc->sk); + write_unlock_irq(&vcc_sklist_lock); switch (vcc->qos.aal) { case ATM_AAL0: error = atm_init_aal0(vcc); @@ -291,21 +377,17 @@ vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,vcc->qos.txtp.max_sdu); DPRINTK(" RX: %d, PCR %d..%d, SDU %d\n",vcc->qos.rxtp.traffic_class, vcc->qos.rxtp.min_pcr,vcc->qos.rxtp.max_pcr,vcc->qos.rxtp.max_sdu); - if (!try_module_get(dev->ops->owner)) { - error = -ENODEV; - goto fail; - } if (dev->ops->open) { - if ((error = dev->ops->open(vcc,vpi,vci))) - goto put_module_fail; + if ((error = dev->ops->open(vcc))) + goto fail; } return 0; -put_module_fail: - module_put(dev->ops->owner); fail: vcc_remove_socket(vcc->sk); +fail_module_put: + module_put(dev->ops->owner); /* ensure we get dev module ref count correct */ vcc->dev = NULL; return error; diff -Nru a/net/atm/proc.c b/net/atm/proc.c --- a/net/atm/proc.c Wed Oct 8 12:24:56 2003 +++ b/net/atm/proc.c Wed Oct 8 12:24:56 2003 @@ -64,6 +64,7 @@ } struct vcc_state { + int bucket; struct sock *sk; int family; }; @@ -75,19 +76,30 @@ return !family || (vcc->sk->sk_family == family); } -static int __vcc_walk(struct sock **sock, int family, loff_t l) +static int __vcc_walk(struct sock **sock, int family, int *bucket, loff_t l) { struct sock *sk = *sock; if (sk == (void *)1) { - sk = hlist_empty(&vcc_sklist) ? NULL : __sk_head(&vcc_sklist); + for (*bucket = 0; *bucket < VCC_HTABLE_SIZE; ++*bucket) { + struct hlist_head *head = &vcc_hash[*bucket]; + + sk = hlist_empty(head) ? NULL : __sk_head(head); + if (sk) + break; + } l--; } +try_again: for (; sk; sk = sk_next(sk)) { l -= compare_family(sk, family); if (l < 0) goto out; } + if (!sk && ++*bucket < VCC_HTABLE_SIZE) { + sk = sk_head(&vcc_hash[*bucket]); + goto try_again; + } sk = (void *)1; out: *sock = sk; @@ -96,7 +108,7 @@ static inline void *vcc_walk(struct vcc_state *state, loff_t l) { - return __vcc_walk(&state->sk, state->family, l) ? + return __vcc_walk(&state->sk, state->family, &state->bucket, l) ? state : NULL; } @@ -207,9 +219,10 @@ default: seq_printf(seq, "%3d", vcc->sk->sk_family); } - seq_printf(seq, " %04lx %5d %7d/%7d %7d/%7d\n", vcc->flags, vcc->sk->sk_err, + seq_printf(seq, " %04lx %5d %7d/%7d %7d/%7d [%d] 0x%x\n", vcc->flags, vcc->sk->sk_err, atomic_read(&vcc->sk->sk_wmem_alloc),vcc->sk->sk_sndbuf, - atomic_read(&vcc->sk->sk_rmem_alloc),vcc->sk->sk_rcvbuf); + atomic_read(&vcc->sk->sk_rmem_alloc),vcc->sk->sk_rcvbuf, + atomic_read(&vcc->sk->sk_refcnt), vcc->sk->sk_hashent); } static void svc_info(struct seq_file *seq, struct atm_vcc *vcc) diff -Nru a/net/atm/resources.c b/net/atm/resources.c --- a/net/atm/resources.c Wed Oct 8 12:24:57 2003 +++ b/net/atm/resources.c Wed Oct 8 12:24:57 2003 @@ -139,7 +139,6 @@ while (atomic_read(&dev->refcnt) != 1) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(HZ / 4); - current->state = TASK_RUNNING; if ((jiffies - warning_time) > 10 * HZ) { printk(KERN_EMERG "atm_dev_deregister: waiting for " "dev %d to become free. Usage count = %d\n", diff -Nru a/net/atm/signaling.c b/net/atm/signaling.c --- a/net/atm/signaling.c Wed Oct 8 12:24:57 2003 +++ b/net/atm/signaling.c Wed Oct 8 12:24:57 2003 @@ -216,6 +216,7 @@ { struct hlist_node *node; struct sock *s; + int i; DPRINTK("sigd_close\n"); sigd = NULL; @@ -224,11 +225,15 @@ skb_queue_purge(&vcc->sk->sk_receive_queue); read_lock(&vcc_sklist_lock); - sk_for_each(s, node, &vcc_sklist) { - struct atm_vcc *vcc = atm_sk(s); + for(i = 0; i < VCC_HTABLE_SIZE; ++i) { + struct hlist_head *head = &vcc_hash[i]; - if (vcc->dev) - purge_vcc(vcc); + sk_for_each(s, node, head) { + struct atm_vcc *vcc = atm_sk(s); + + if (vcc->dev) + purge_vcc(vcc); + } } read_unlock(&vcc_sklist_lock); } diff -Nru a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c --- a/net/ax25/af_ax25.c Wed Oct 8 12:24:57 2003 +++ b/net/ax25/af_ax25.c Wed Oct 8 12:24:57 2003 @@ -1978,7 +1978,6 @@ .type = __constant_htons(ETH_P_AX25), .dev = NULL, /* All devices */ .func = ax25_kiss_rcv, - .data = PKT_CAN_SHARE_SKB, }; static struct notifier_block ax25_dev_notifier = { diff -Nru a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c --- a/net/bluetooth/hci_core.c Wed Oct 8 12:24:56 2003 +++ b/net/bluetooth/hci_core.c Wed Oct 8 12:24:56 2003 @@ -161,7 +161,6 @@ req(hdev, opt); schedule_timeout(timeout); - set_current_state(TASK_RUNNING); remove_wait_queue(&hdev->req_wait_q, &wait); if (signal_pending(current)) diff -Nru a/net/bridge/br_forward.c b/net/bridge/br_forward.c --- a/net/bridge/br_forward.c Wed Oct 8 12:24:56 2003 +++ b/net/bridge/br_forward.c Wed Oct 8 12:24:56 2003 @@ -35,8 +35,7 @@ { #ifdef CONFIG_BRIDGE_NETFILTER /* ip_refrag calls ip_fragment, which doesn't copy the MAC header. */ - if (skb->nf_bridge) - memcpy(skb->data - 16, skb->nf_bridge->hh, 16); + nf_bridge_maybe_copy_header(skb); #endif skb_push(skb, ETH_HLEN); diff -Nru a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c --- a/net/bridge/br_netfilter.c Wed Oct 8 12:24:57 2003 +++ b/net/bridge/br_netfilter.c Wed Oct 8 12:24:57 2003 @@ -4,7 +4,13 @@ * * Authors: * Lennert Buytenhek - * Bart De Schuymer + * Bart De Schuymer (maintainer) + * + * Changes: + * Apr 29 2003: physdev module support (bdschuym) + * Jun 19 2003: let arptables see bridged ARP traffic (bdschuym) + * Oct 06 2003: filter encapsulated IP/ARP VLAN traffic on untagged bridge + * (bdschuym) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -20,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +47,11 @@ #define has_bridge_parent(device) ((device)->br_port != NULL) #define bridge_parent(device) ((device)->br_port->br->dev) +#define IS_VLAN_IP (skb->protocol == __constant_htons(ETH_P_8021Q) && \ + hdr->h_vlan_encapsulated_proto == __constant_htons(ETH_P_IP)) +#define IS_VLAN_ARP (skb->protocol == __constant_htons(ETH_P_8021Q) && \ + hdr->h_vlan_encapsulated_proto == __constant_htons(ETH_P_ARP)) + /* We need these fake structures to make netfilter happy -- * lots of places assume that skb->dst != NULL, which isn't * all that unreasonable. @@ -135,8 +147,13 @@ skb->pkt_type = PACKET_HOST; skb->nf_bridge->mask |= BRNF_PKT_TYPE; } + skb->nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING; skb->dev = bridge_parent(skb->dev); + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + skb_pull(skb, VLAN_HLEN); + skb->nh.raw += VLAN_HLEN; + } skb->dst->output(skb); return 0; } @@ -155,6 +172,7 @@ skb->pkt_type = PACKET_OTHERHOST; nf_bridge->mask ^= BRNF_PKT_TYPE; } + nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING; if (dnat_took_place(skb)) { if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, @@ -186,6 +204,11 @@ nf_bridge->mask |= BRNF_BRIDGED_DNAT; skb->dev = nf_bridge->physindev; clear_cb(skb); + if (skb->protocol == + __constant_htons(ETH_P_8021Q)) { + skb_push(skb, VLAN_HLEN); + skb->nh.raw -= VLAN_HLEN; + } NF_HOOK_THRESH(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL, br_nf_pre_routing_finish_bridge, @@ -202,6 +225,10 @@ clear_cb(skb); skb->dev = nf_bridge->physindev; + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + skb_push(skb, VLAN_HLEN); + skb->nh.raw -= VLAN_HLEN; + } NF_HOOK_THRESH(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL, br_handle_frame_finish, 1); @@ -220,13 +247,20 @@ { struct iphdr *iph; __u32 len; - struct sk_buff *skb; + struct sk_buff *skb = *pskb; struct nf_bridge_info *nf_bridge; - if ((*pskb)->protocol != __constant_htons(ETH_P_IP)) - return NF_ACCEPT; - - if ((skb = skb_share_check(*pskb, GFP_ATOMIC)) == NULL) + if (skb->protocol != __constant_htons(ETH_P_IP)) { + struct vlan_ethhdr *hdr = (struct vlan_ethhdr *) + ((*pskb)->mac.ethernet); + + if (!IS_VLAN_IP) + return NF_ACCEPT; + if ((skb = skb_share_check(*pskb, GFP_ATOMIC)) == NULL) + goto out; + skb_pull(*pskb, VLAN_HLEN); + (*pskb)->nh.raw += VLAN_HLEN; + } else if ((skb = skb_share_check(*pskb, GFP_ATOMIC)) == NULL) goto out; if (!pskb_may_pull(skb, sizeof(struct iphdr))) @@ -264,6 +298,7 @@ nf_bridge->mask |= BRNF_PKT_TYPE; } + nf_bridge->mask |= BRNF_NF_BRIDGE_PREROUTING; nf_bridge->physindev = skb->dev; skb->dev = bridge_parent(skb->dev); store_orig_dstaddr(skb); @@ -294,9 +329,6 @@ { struct sk_buff *skb = *pskb; - if (skb->protocol != __constant_htons(ETH_P_IP)) - return NF_ACCEPT; - if (skb->dst == (struct dst_entry *)&__fake_rtable) { dst_release(skb->dst); skb->dst = NULL; @@ -310,12 +342,13 @@ { struct nf_bridge_info *nf_bridge = skb->nf_bridge; struct net_device *in; + struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug ^= (1 << NF_BR_FORWARD); #endif - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == __constant_htons(ETH_P_IP) || IS_VLAN_IP) { in = nf_bridge->physindev; if (nf_bridge->mask & BRNF_PKT_TYPE) { skb->pkt_type = PACKET_OTHERHOST; @@ -324,7 +357,10 @@ } else { in = *((struct net_device **)(skb->cb)); } - + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + skb_push(skb, VLAN_HLEN); + skb->nh.raw -= VLAN_HLEN; + } NF_HOOK_THRESH(PF_BRIDGE, NF_BR_FORWARD, skb, in, skb->dev, br_forward_finish, 1); return 0; @@ -342,15 +378,20 @@ { struct sk_buff *skb = *pskb; struct nf_bridge_info *nf_bridge; + struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); if (skb->protocol != __constant_htons(ETH_P_IP) && - skb->protocol != __constant_htons(ETH_P_ARP)) - return NF_ACCEPT; + skb->protocol != __constant_htons(ETH_P_ARP)) { + if (!IS_VLAN_IP && !IS_VLAN_ARP) + return NF_ACCEPT; + skb_pull(*pskb, VLAN_HLEN); + (*pskb)->nh.raw += VLAN_HLEN; + } #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug ^= (1 << NF_BR_FORWARD); #endif - if (skb->protocol == __constant_htons(ETH_P_IP)) { + if (skb->protocol == __constant_htons(ETH_P_IP) || IS_VLAN_IP) { nf_bridge = skb->nf_bridge; if (skb->pkt_type == PACKET_OTHERHOST) { skb->pkt_type = PACKET_HOST; @@ -365,7 +406,15 @@ bridge_parent(out), br_nf_forward_finish); } else { struct net_device **d = (struct net_device **)(skb->cb); + struct arphdr *arp = skb->nh.arph; + if (arp->ar_pln != 4) { + if (IS_VLAN_ARP) { + skb_push(*pskb, VLAN_HLEN); + (*pskb)->nh.raw -= VLAN_HLEN; + } + return NF_ACCEPT; + } *d = (struct net_device *)in; NF_HOOK(NF_ARP, NF_ARP_FORWARD, skb, (struct net_device *)in, (struct net_device *)out, br_nf_forward_finish); @@ -381,6 +430,10 @@ #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug &= ~(1 << NF_BR_LOCAL_OUT); #endif + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + skb_push(skb, VLAN_HLEN); + skb->nh.raw -= VLAN_HLEN; + } NF_HOOK_THRESH(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, br_forward_finish, NF_BR_PRI_FIRST + 1); @@ -419,8 +472,9 @@ struct net_device *realindev; struct sk_buff *skb = *pskb; struct nf_bridge_info *nf_bridge; + struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != __constant_htons(ETH_P_IP) && !IS_VLAN_IP) return NF_ACCEPT; /* Sometimes we get packets with NULL ->dst here (for example, @@ -444,11 +498,26 @@ skb->pkt_type = PACKET_OTHERHOST; nf_bridge->mask ^= BRNF_PKT_TYPE; } + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + skb_push(skb, VLAN_HLEN); + skb->nh.raw -= VLAN_HLEN; + } NF_HOOK(PF_BRIDGE, NF_BR_FORWARD, skb, realindev, skb->dev, okfn); } else { + struct net_device *realoutdev = bridge_parent(skb->dev); + +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + /* iptables should match -o br0.x */ + if (nf_bridge->netoutdev) + realoutdev = nf_bridge->netoutdev; +#endif okfn = br_nf_local_out_finish; + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + skb_pull(skb, VLAN_HLEN); + (*pskb)->nh.raw += VLAN_HLEN; + } /* IP forwarded traffic has a physindev, locally * generated traffic hasn't. */ @@ -456,9 +525,8 @@ if (((nf_bridge->mask & BRNF_DONT_TAKE_PARENT) == 0) && has_bridge_parent(realindev)) realindev = bridge_parent(realindev); - NF_HOOK_THRESH(PF_INET, NF_IP_FORWARD, skb, realindev, - bridge_parent(skb->dev), okfn, + realoutdev, okfn, NF_IP_PRI_BRIDGE_SABOTAGE_FORWARD + 1); } else { #ifdef CONFIG_NETFILTER_DEBUG @@ -466,7 +534,7 @@ #endif NF_HOOK_THRESH(PF_INET, NF_IP_LOCAL_OUT, skb, realindev, - bridge_parent(skb->dev), okfn, + realoutdev, okfn, NF_IP_PRI_BRIDGE_SABOTAGE_LOCAL_OUT + 1); } } @@ -482,6 +550,8 @@ { struct sk_buff *skb = *pskb; struct nf_bridge_info *nf_bridge = (*pskb)->nf_bridge; + struct vlan_ethhdr *hdr = (struct vlan_ethhdr *)(skb->mac.ethernet); + struct net_device *realoutdev = bridge_parent(skb->dev); /* Be very paranoid. Must be a device driver bug. */ if (skb->mac.raw < skb->head || skb->mac.raw + ETH_HLEN > skb->data) { @@ -492,11 +562,11 @@ if (has_bridge_parent(skb->dev)) printk("[%s]", bridge_parent(skb->dev)->name); } - printk("\n"); + printk(" head:%p, raw:%p\n", skb->head, skb->mac.raw); return NF_ACCEPT; } - if (skb->protocol != __constant_htons(ETH_P_IP)) + if (skb->protocol != __constant_htons(ETH_P_IP) && !IS_VLAN_IP) return NF_ACCEPT; /* Sometimes we get packets with NULL ->dst here (for example, @@ -517,10 +587,19 @@ nf_bridge->mask |= BRNF_PKT_TYPE; } - memcpy(nf_bridge->hh, skb->data - 16, 16); + if (skb->protocol == __constant_htons(ETH_P_8021Q)) { + skb_pull(skb, VLAN_HLEN); + skb->nh.raw += VLAN_HLEN; + } + + nf_bridge_save_header(skb); +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + if (nf_bridge->netoutdev) + realoutdev = nf_bridge->netoutdev; +#endif NF_HOOK(PF_INET, NF_IP_POST_ROUTING, skb, NULL, - bridge_parent(skb->dev), br_dev_queue_push_xmit); + realoutdev, br_dev_queue_push_xmit); return NF_STOLEN; } @@ -535,8 +614,8 @@ const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { - if (in->hard_start_xmit == br_dev_xmit && - okfn != br_nf_pre_routing_finish) { + if ((*pskb)->nf_bridge && + !((*pskb)->nf_bridge->mask & BRNF_NF_BRIDGE_PREROUTING)) { okfn(*pskb); return NF_STOLEN; } @@ -552,10 +631,15 @@ const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { - if (out->hard_start_xmit == br_dev_xmit && + if ((out->hard_start_xmit == br_dev_xmit && okfn != br_nf_forward_finish && okfn != br_nf_local_out_finish && - okfn != br_dev_queue_push_xmit) { + okfn != br_dev_queue_push_xmit) +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + || ((out->priv_flags & IFF_802_1Q_VLAN) && + VLAN_DEV_INFO(out)->real_dev->hard_start_xmit == br_dev_xmit) +#endif + ) { struct sk_buff *skb = *pskb; struct nf_bridge_info *nf_bridge; @@ -574,6 +658,11 @@ nf_bridge->mask &= BRNF_DONT_TAKE_PARENT; nf_bridge->physindev = (struct net_device *)in; } +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) + /* the iptables outdev is br0.x, not br0 */ + if (out->priv_flags & IFF_802_1Q_VLAN) + nf_bridge->netoutdev = (struct net_device *)out; +#endif okfn(skb); return NF_STOLEN; } diff -Nru a/net/bridge/netfilter/Kconfig b/net/bridge/netfilter/Kconfig --- a/net/bridge/netfilter/Kconfig Wed Oct 8 12:24:56 2003 +++ b/net/bridge/netfilter/Kconfig Wed Oct 8 12:24:56 2003 @@ -73,6 +73,17 @@ To compile it as a module, choose M here. If unsure, say N. +config BRIDGE_EBT_LIMIT + tristate "ebt: limit match support" + depends on BRIDGE_NF_EBTABLES + help + This option adds the limit match, which allows you to control + the rate at which a rule can be matched. This match is the + equivalent of the iptables limit match. + + If you want to compile it as a module, say M here and read + . If unsure, say `N'. + config BRIDGE_EBT_MARK tristate "ebt: mark filter support" depends on BRIDGE_NF_EBTABLES diff -Nru a/net/bridge/netfilter/Makefile b/net/bridge/netfilter/Makefile --- a/net/bridge/netfilter/Makefile Wed Oct 8 12:24:57 2003 +++ b/net/bridge/netfilter/Makefile Wed Oct 8 12:24:57 2003 @@ -13,6 +13,7 @@ obj-$(CONFIG_BRIDGE_EBT_802_3) += ebt_802_3.o obj-$(CONFIG_BRIDGE_EBT_ARP) += ebt_arp.o obj-$(CONFIG_BRIDGE_EBT_IP) += ebt_ip.o +obj-$(CONFIG_BRIDGE_EBT_LIMIT) += ebt_limit.o obj-$(CONFIG_BRIDGE_EBT_MARK) += ebt_mark_m.o obj-$(CONFIG_BRIDGE_EBT_PKTTYPE) += ebt_pkttype.o obj-$(CONFIG_BRIDGE_EBT_STP) += ebt_stp.o diff -Nru a/net/bridge/netfilter/ebt_limit.c b/net/bridge/netfilter/ebt_limit.c --- /dev/null Wed Dec 31 16:00:00 1969 +++ b/net/bridge/netfilter/ebt_limit.c Wed Oct 8 12:24:58 2003 @@ -0,0 +1,104 @@ +/* + * ebt_limit + * + * Authors: + * Tom Marshall + * + * Mostly copied from netfilter's ipt_limit.c, see that file for + * more explanation + * + * September, 2003 + * + */ + +#include +#include +#include + +#include +#include + +static spinlock_t limit_lock = SPIN_LOCK_UNLOCKED; + +#define CREDITS_PER_JIFFY 128 + +static int ebt_limit_match(const struct sk_buff *skb, + const struct net_device *in, const struct net_device *out, + const void *data, unsigned int datalen) +{ + struct ebt_limit_info *info = (struct ebt_limit_info *)data; + unsigned long now = jiffies; + + spin_lock_bh(&limit_lock); + info->credit += (now - xchg(&info->prev, now)) * CREDITS_PER_JIFFY; + if (info->credit > info->credit_cap) + info->credit = info->credit_cap; + + if (info->credit >= info->cost) { + /* We're not limited. */ + info->credit -= info->cost; + spin_unlock_bh(&limit_lock); + return EBT_MATCH; + } + + spin_unlock_bh(&limit_lock); + return EBT_NOMATCH; +} + +/* Precision saver. */ +static u_int32_t +user2credits(u_int32_t user) +{ + /* If multiplying would overflow... */ + if (user > 0xFFFFFFFF / (HZ*CREDITS_PER_JIFFY)) + /* Divide first. */ + return (user / EBT_LIMIT_SCALE) * HZ * CREDITS_PER_JIFFY; + + return (user * HZ * CREDITS_PER_JIFFY) / EBT_LIMIT_SCALE; +} + +static int ebt_limit_check(const char *tablename, unsigned int hookmask, + const struct ebt_entry *e, void *data, unsigned int datalen) +{ + struct ebt_limit_info *info = (struct ebt_limit_info *)data; + + if (datalen != EBT_ALIGN(sizeof(struct ebt_limit_info))) + return -EINVAL; + + /* Check for overflow. */ + if (info->burst == 0 || + user2credits(info->avg * info->burst) < user2credits(info->avg)) { + printk("Overflow in ebt_limit: %u/%u\n", + info->avg, info->burst); + return -EINVAL; + } + + /* User avg in seconds * EBT_LIMIT_SCALE: convert to jiffies * 128. */ + info->prev = jiffies; + info->credit = user2credits(info->avg * info->burst); + info->credit_cap = user2credits(info->avg * info->burst); + info->cost = user2credits(info->avg); + return 0; +} + +static struct ebt_match ebt_limit_reg = +{ + .name = EBT_LIMIT_MATCH, + .match = ebt_limit_match, + .check = ebt_limit_check, + .me = THIS_MODULE, +}; + +static int __init init(void) +{ + return ebt_register_match(&ebt_limit_reg); +} + +static void __exit fini(void) +{ + ebt_unregister_match(&ebt_limit_reg); +} + +module_init(init); +module_exit(fini); +MODULE_LICENSE("GPL"); diff -Nru a/net/bridge/netfilter/ebt_vlan.c b/net/bridge/netfilter/ebt_vlan.c --- a/net/bridge/netfilter/ebt_vlan.c Wed Oct 8 12:24:56 2003 +++ b/net/bridge/netfilter/ebt_vlan.c Wed Oct 8 12:24:56 2003 @@ -48,7 +48,7 @@ const void *data, unsigned int datalen) { struct ebt_vlan_info *info = (struct ebt_vlan_info *) data; - struct vlan_ethhdr frame; + struct vlan_hdr frame; unsigned short TCI; /* Whole TCI, given from parsed frame */ unsigned short id; /* VLAN ID, given from frame TCI */ diff -Nru a/net/core/datagram.c b/net/core/datagram.c --- a/net/core/datagram.c Wed Oct 8 12:24:57 2003 +++ b/net/core/datagram.c Wed Oct 8 12:24:57 2003 @@ -33,6 +33,7 @@ * */ +#include #include #include #include @@ -485,3 +486,10 @@ return mask; } + +EXPORT_SYMBOL(datagram_poll); +EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec); +EXPORT_SYMBOL(skb_copy_datagram); +EXPORT_SYMBOL(skb_copy_datagram_iovec); +EXPORT_SYMBOL(skb_free_datagram); +EXPORT_SYMBOL(skb_recv_datagram); diff -Nru a/net/core/dev.c b/net/core/dev.c --- a/net/core/dev.c Wed Oct 8 12:24:56 2003 +++ b/net/core/dev.c Wed Oct 8 12:24:56 2003 @@ -229,8 +229,7 @@ spin_lock_bh(&ptype_lock); #ifdef CONFIG_NET_FASTROUTE - /* Hack to detect packet socket */ - if (pt->data && pt->data != PKT_CAN_SHARE_SKB) { + if (pt->af_packet_priv) { netdev_fastroute_obstacles++; dev_clear_fastroute(pt->dev); } @@ -278,7 +277,7 @@ list_for_each_entry(pt1, head, list) { if (pt == pt1) { #ifdef CONFIG_NET_FASTROUTE - if (pt->data && pt->data != PKT_CAN_SHARE_SKB) + if (pt->af_packet_priv) netdev_fastroute_obstacles--; #endif list_del_rcu(&pt->list); @@ -915,6 +914,8 @@ /** * call_netdevice_notifiers - call all network notifier blocks + * @val: value passed unmodified to notifier function + * @v: pointer passed unmodified to notifier function * * Call all network notifier blocks. Parameters and return value * are as for notifier_call_chain(). @@ -941,7 +942,7 @@ * they originated from - MvS (miquels@drinkel.ow.org) */ if ((ptype->dev == dev || !ptype->dev) && - (struct sock *)ptype->data != skb->sk) { + (struct sock *)ptype->af_packet_priv != skb->sk) { struct sk_buff *skb2= skb_clone(skb, GFP_ATOMIC); if (!skb2) break; @@ -1402,36 +1403,6 @@ return NET_RX_DROP; } -/* Deliver skb to an old protocol, which is not threaded well - or which do not understand shared skbs. - */ -static int deliver_to_old_ones(struct packet_type *pt, - struct sk_buff *skb, int last) -{ - int ret = NET_RX_DROP; - - if (!last) { - skb = skb_clone(skb, GFP_ATOMIC); - if (!skb) - goto out; - } - if (skb_is_nonlinear(skb) && __skb_linearize(skb, GFP_ATOMIC)) - goto out_kfree; - -#ifdef CONFIG_SMP - /* Old protocols did not depened on BHs different of NET_BH and - TIMER_BH - they need to be fixed for the new assumptions. - */ - print_symbol("fix old protocol handler %s!\n", (unsigned long)pt->func); -#endif - ret = pt->func(skb, skb->dev, pt); -out: - return ret; -out_kfree: - kfree_skb(skb); - goto out; -} - static __inline__ void skb_bond(struct sk_buff *skb) { struct net_device *dev = skb->dev; @@ -1488,6 +1459,14 @@ } } +static __inline__ int deliver_skb(struct sk_buff *skb, + struct packet_type *pt_prev, int last) +{ + atomic_inc(&skb->users); + return pt_prev->func(skb, skb->dev, pt_prev); +} + + #if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE) int (*br_handle_frame_hook)(struct sk_buff *skb); @@ -1495,15 +1474,8 @@ struct packet_type *pt_prev) { int ret = NET_RX_DROP; - - if (pt_prev) { - if (!pt_prev->data) - ret = deliver_to_old_ones(pt_prev, skb, 0); - else { - atomic_inc(&skb->users); - ret = pt_prev->func(skb, skb->dev, pt_prev); - } - } + if (pt_prev) + ret = deliver_skb(skb, pt_prev, 0); return ret; } @@ -1551,16 +1523,8 @@ rcu_read_lock(); list_for_each_entry_rcu(ptype, &ptype_all, list) { if (!ptype->dev || ptype->dev == skb->dev) { - if (pt_prev) { - if (!pt_prev->data) { - ret = deliver_to_old_ones(pt_prev, - skb, 0); - } else { - atomic_inc(&skb->users); - ret = pt_prev->func(skb, skb->dev, - pt_prev); - } - } + if (pt_prev) + ret = deliver_skb(skb, pt_prev, 0); pt_prev = ptype; } } @@ -1573,26 +1537,14 @@ list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) { if (ptype->type == type && (!ptype->dev || ptype->dev == skb->dev)) { - if (pt_prev) { - if (!pt_prev->data) { - ret = deliver_to_old_ones(pt_prev, - skb, 0); - } else { - atomic_inc(&skb->users); - ret = pt_prev->func(skb, skb->dev, - pt_prev); - } - } + if (pt_prev) + ret = deliver_skb(skb, pt_prev, 0); pt_prev = ptype; } } if (pt_prev) { - if (!pt_prev->data) { - ret = deliver_to_old_ones(pt_prev, skb, 1); - } else { - ret = pt_prev->func(skb, skb->dev, pt_prev); - } + ret = pt_prev->func(skb, skb->dev, pt_prev); } else { kfree_skb(skb); /* Jamal, now you will not able to escape explaining @@ -1637,8 +1589,8 @@ #ifdef CONFIG_NET_HW_FLOWCONTROL if (queue->throttle && queue->input_pkt_queue.qlen < no_cong_thresh ) { + queue->throttle = 0; if (atomic_dec_and_test(&netdev_dropping)) { - queue->throttle = 0; netdev_wakeup(); break; } @@ -3036,3 +2988,63 @@ } subsys_initcall(net_dev_init); + +EXPORT_SYMBOL(__dev_get); +EXPORT_SYMBOL(__dev_get_by_flags); +EXPORT_SYMBOL(__dev_get_by_index); +EXPORT_SYMBOL(__dev_get_by_name); +EXPORT_SYMBOL(__dev_remove_pack); +EXPORT_SYMBOL(__skb_linearize); +EXPORT_SYMBOL(call_netdevice_notifiers); +EXPORT_SYMBOL(dev_add_pack); +EXPORT_SYMBOL(dev_alloc); +EXPORT_SYMBOL(dev_alloc_name); +EXPORT_SYMBOL(dev_close); +EXPORT_SYMBOL(dev_get_by_flags); +EXPORT_SYMBOL(dev_get_by_index); +EXPORT_SYMBOL(dev_get_by_name); +EXPORT_SYMBOL(dev_getbyhwaddr); +EXPORT_SYMBOL(dev_ioctl); +EXPORT_SYMBOL(dev_new_index); +EXPORT_SYMBOL(dev_open); +EXPORT_SYMBOL(dev_queue_xmit); +EXPORT_SYMBOL(dev_queue_xmit_nit); +EXPORT_SYMBOL(dev_remove_pack); +EXPORT_SYMBOL(dev_set_allmulti); +EXPORT_SYMBOL(dev_set_promiscuity); +EXPORT_SYMBOL(free_netdev); +EXPORT_SYMBOL(netdev_boot_setup_check); +EXPORT_SYMBOL(netdev_set_master); +EXPORT_SYMBOL(netdev_state_change); +EXPORT_SYMBOL(netif_receive_skb); +EXPORT_SYMBOL(netif_rx); +EXPORT_SYMBOL(register_gifconf); +EXPORT_SYMBOL(register_netdevice); +EXPORT_SYMBOL(register_netdevice_notifier); +EXPORT_SYMBOL(skb_checksum_help); +EXPORT_SYMBOL(synchronize_net); +EXPORT_SYMBOL(unregister_netdevice); +EXPORT_SYMBOL(unregister_netdevice_notifier); + +#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) +EXPORT_SYMBOL(br_handle_frame_hook); +#endif +/* for 801q VLAN support */ +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) +EXPORT_SYMBOL(dev_change_flags); +#endif +#ifdef CONFIG_KMOD +EXPORT_SYMBOL(dev_load); +#endif +#ifdef CONFIG_NET_HW_FLOWCONTROL +EXPORT_SYMBOL(netdev_dropping); +EXPORT_SYMBOL(netdev_fc_xoff); +EXPORT_SYMBOL(netdev_register_fc); +EXPORT_SYMBOL(netdev_unregister_fc); +#endif +#ifdef CONFIG_NET_FASTROUTE +EXPORT_SYMBOL(netdev_fastroute); +EXPORT_SYMBOL(netdev_fastroute_obstacles); +#endif + +EXPORT_PER_CPU_SYMBOL(softnet_data); diff -Nru a/net/core/dev_mcast.c b/net/core/dev_mcast.c --- a/net/core/dev_mcast.c Wed Oct 8 12:24:56 2003 +++ b/net/core/dev_mcast.c Wed Oct 8 12:24:56 2003 @@ -22,6 +22,7 @@ */ #include +#include #include #include #include @@ -273,3 +274,6 @@ #endif } +EXPORT_SYMBOL(dev_mc_add); +EXPORT_SYMBOL(dev_mc_delete); +EXPORT_SYMBOL(dev_mc_upload); diff -Nru a/net/core/dst.c b/net/core/dst.c --- a/net/core/dst.c Wed Oct 8 12:24:57 2003 +++ b/net/core/dst.c Wed Oct 8 12:24:57 2003 @@ -6,15 +6,16 @@ */ #include -#include +#include +#include #include -#include #include -#include -#include +#include #include +#include #include -#include +#include +#include #include @@ -257,3 +258,7 @@ { register_netdevice_notifier(&dst_dev_notifier); } + +EXPORT_SYMBOL(__dst_free); +EXPORT_SYMBOL(dst_alloc); +EXPORT_SYMBOL(dst_destroy); diff -Nru a/net/core/dv.c b/net/core/dv.c --- a/net/core/dv.c Wed Oct 8 12:24:56 2003 +++ b/net/core/dv.c Wed Oct 8 12:24:56 2003 @@ -10,6 +10,7 @@ * Dave Miller: improvement on the code (correctness, performance and source files) * */ +#include #include #include #include @@ -237,7 +238,7 @@ default: return -EINVAL; - }; + } break; @@ -281,7 +282,7 @@ default: return -EINVAL; - }; + } break; @@ -301,7 +302,7 @@ default: return -EINVAL; - }; + } break; @@ -321,7 +322,7 @@ default: return -EINVAL; - }; + } break; @@ -337,7 +338,7 @@ default: return -EINVAL; - }; + } break; @@ -353,7 +354,7 @@ default: return -EINVAL; - }; + } break; @@ -373,7 +374,7 @@ default: return -EINVAL; - }; + } break; @@ -389,7 +390,7 @@ default: return -EINVAL; - }; + } break; @@ -405,7 +406,7 @@ default: return -EINVAL; - }; + } break; @@ -425,19 +426,19 @@ default: return -EINVAL; - }; + } break; default: return -EINVAL; - }; + } break; default: return -EINVAL; - }; + } return 0; } @@ -550,8 +551,8 @@ } } break; - }; - - return; + } } +EXPORT_SYMBOL(alloc_divert_blk); +EXPORT_SYMBOL(free_divert_blk); diff -Nru a/net/core/ethtool.c b/net/core/ethtool.c --- a/net/core/ethtool.c Wed Oct 8 12:24:56 2003 +++ b/net/core/ethtool.c Wed Oct 8 12:24:56 2003 @@ -9,6 +9,7 @@ * It's GPL, stupid. */ +#include #include #include #include @@ -727,3 +728,11 @@ return dev->do_ioctl(dev, ifr, SIOCETHTOOL); return -EOPNOTSUPP; } + +EXPORT_SYMBOL(ethtool_op_get_link); +EXPORT_SYMBOL(ethtool_op_get_sg); +EXPORT_SYMBOL(ethtool_op_get_tso); +EXPORT_SYMBOL(ethtool_op_get_tx_csum); +EXPORT_SYMBOL(ethtool_op_set_sg); +EXPORT_SYMBOL(ethtool_op_set_tso); +EXPORT_SYMBOL(ethtool_op_set_tx_csum); diff -Nru a/net/core/filter.c b/net/core/filter.c --- a/net/core/filter.c Wed Oct 8 12:24:56 2003 +++ b/net/core/filter.c Wed Oct 8 12:24:56 2003 @@ -424,3 +424,6 @@ sk_filter_release(sk, fp); return err; } + +EXPORT_SYMBOL(sk_chk_filter); +EXPORT_SYMBOL(sk_run_filter); diff -Nru a/net/core/flow.c b/net/core/flow.c --- a/net/core/flow.c Wed Oct 8 12:24:55 2003 +++ b/net/core/flow.c Wed Oct 8 12:24:55 2003 @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -401,3 +402,6 @@ } module_init(flow_cache_init); + +EXPORT_SYMBOL(flow_cache_genid); +EXPORT_SYMBOL(flow_cache_lookup); diff -Nru a/net/core/iovec.c b/net/core/iovec.c --- a/net/core/iovec.c Wed Oct 8 12:24:57 2003 +++ b/net/core/iovec.c Wed Oct 8 12:24:57 2003 @@ -16,8 +16,8 @@ * Andi Kleen : Fix csum*fromiovecend for IPv6. */ - #include +#include #include #include #include @@ -254,3 +254,9 @@ err = -EFAULT; goto out; } + +EXPORT_SYMBOL(csum_partial_copy_fromiovecend); +EXPORT_SYMBOL(memcpy_fromiovec); +EXPORT_SYMBOL(memcpy_fromiovecend); +EXPORT_SYMBOL(memcpy_toiovec); +EXPORT_SYMBOL(memcpy_tokerneliovec); diff -Nru a/net/core/link_watch.c b/net/core/link_watch.c --- a/net/core/link_watch.c Wed Oct 8 12:24:55 2003 +++ b/net/core/link_watch.c Wed Oct 8 12:24:55 2003 @@ -1,5 +1,5 @@ /* - * Linux network device link state notifaction + * Linux network device link state notification * * Author: * Stefan Rompf @@ -12,6 +12,7 @@ */ #include +#include #include #include #include @@ -132,3 +133,4 @@ } } +EXPORT_SYMBOL(linkwatch_fire_event); diff -Nru a/net/core/neighbour.c b/net/core/neighbour.c --- a/net/core/neighbour.c Wed Oct 8 12:24:55 2003 +++ b/net/core/neighbour.c Wed Oct 8 12:24:55 2003 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -1683,3 +1684,34 @@ } #endif /* CONFIG_SYSCTL */ + +EXPORT_SYMBOL(__neigh_event_send); +EXPORT_SYMBOL(neigh_add); +EXPORT_SYMBOL(neigh_changeaddr); +EXPORT_SYMBOL(neigh_compat_output); +EXPORT_SYMBOL(neigh_connected_output); +EXPORT_SYMBOL(neigh_create); +EXPORT_SYMBOL(neigh_delete); +EXPORT_SYMBOL(neigh_destroy); +EXPORT_SYMBOL(neigh_dump_info); +EXPORT_SYMBOL(neigh_event_ns); +EXPORT_SYMBOL(neigh_ifdown); +EXPORT_SYMBOL(neigh_lookup); +EXPORT_SYMBOL(neigh_parms_alloc); +EXPORT_SYMBOL(neigh_parms_release); +EXPORT_SYMBOL(neigh_rand_reach_time); +EXPORT_SYMBOL(neigh_resolve_output); +EXPORT_SYMBOL(neigh_table_clear); +EXPORT_SYMBOL(neigh_table_init); +EXPORT_SYMBOL(neigh_update); +EXPORT_SYMBOL(neigh_update_hhs); +EXPORT_SYMBOL(pneigh_enqueue); +EXPORT_SYMBOL(pneigh_lookup); + +#ifdef CONFIG_ARPD +EXPORT_SYMBOL(neigh_app_ns); +#endif +#ifdef CONFIG_SYSCTL +EXPORT_SYMBOL(neigh_sysctl_register); +EXPORT_SYMBOL(neigh_sysctl_unregister); +#endif diff -Nru a/net/core/netfilter.c b/net/core/netfilter.c --- a/net/core/netfilter.c Wed Oct 8 12:24:56 2003 +++ b/net/core/netfilter.c Wed Oct 8 12:24:56 2003 @@ -759,3 +759,17 @@ INIT_LIST_HEAD(&nf_hooks[i][h]); } } + +EXPORT_SYMBOL(ip_ct_attach); +EXPORT_SYMBOL(ip_route_me_harder); +EXPORT_SYMBOL(nf_getsockopt); +EXPORT_SYMBOL(nf_hook_slow); +EXPORT_SYMBOL(nf_hooks); +EXPORT_SYMBOL(nf_register_hook); +EXPORT_SYMBOL(nf_register_queue_handler); +EXPORT_SYMBOL(nf_register_sockopt); +EXPORT_SYMBOL(nf_reinject); +EXPORT_SYMBOL(nf_setsockopt); +EXPORT_SYMBOL(nf_unregister_hook); +EXPORT_SYMBOL(nf_unregister_queue_handler); +EXPORT_SYMBOL(nf_unregister_sockopt); diff -Nru a/net/core/rtnetlink.c b/net/core/rtnetlink.c --- a/net/core/rtnetlink.c Wed Oct 8 12:24:57 2003 +++ b/net/core/rtnetlink.c Wed Oct 8 12:24:57 2003 @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -556,7 +557,6 @@ .notifier_call = rtnetlink_event, }; - void __init rtnetlink_init(void) { rtnl = netlink_kernel_create(NETLINK_ROUTE, rtnetlink_rcv); @@ -567,3 +567,13 @@ rtnetlink_links[PF_UNSPEC] = link_rtnetlink_table; rtnetlink_links[PF_PACKET] = link_rtnetlink_table; } + +EXPORT_SYMBOL(__rta_fill); +EXPORT_SYMBOL(rtattr_parse); +EXPORT_SYMBOL(rtnetlink_dump_ifinfo); +EXPORT_SYMBOL(rtnetlink_links); +EXPORT_SYMBOL(rtnetlink_put_metrics); +EXPORT_SYMBOL(rtnl); +EXPORT_SYMBOL(rtnl_lock); +EXPORT_SYMBOL(rtnl_sem); +EXPORT_SYMBOL(rtnl_unlock); diff -Nru a/net/core/scm.c b/net/core/scm.c --- a/net/core/scm.c Wed Oct 8 12:24:56 2003 +++ b/net/core/scm.c Wed Oct 8 12:24:56 2003 @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -282,3 +283,9 @@ } return new_fpl; } + +EXPORT_SYMBOL(__scm_destroy); +EXPORT_SYMBOL(__scm_send); +EXPORT_SYMBOL(put_cmsg); +EXPORT_SYMBOL(scm_detach_fds); +EXPORT_SYMBOL(scm_fp_dup); diff -Nru a/net/core/skbuff.c b/net/core/skbuff.c --- a/net/core/skbuff.c Wed Oct 8 12:24:57 2003 +++ b/net/core/skbuff.c Wed Oct 8 12:24:57 2003 @@ -39,6 +39,7 @@ */ #include +#include #include #include #include @@ -1103,3 +1104,22 @@ if (!skbuff_head_cache) panic("cannot create skbuff cache"); } + +EXPORT_SYMBOL(___pskb_trim); +EXPORT_SYMBOL(__kfree_skb); +EXPORT_SYMBOL(__pskb_pull_tail); +EXPORT_SYMBOL(alloc_skb); +EXPORT_SYMBOL(pskb_copy); +EXPORT_SYMBOL(pskb_expand_head); +EXPORT_SYMBOL(skb_checksum); +EXPORT_SYMBOL(skb_clone); +EXPORT_SYMBOL(skb_clone_fraglist); +EXPORT_SYMBOL(skb_copy); +EXPORT_SYMBOL(skb_copy_and_csum_bits); +EXPORT_SYMBOL(skb_copy_and_csum_dev); +EXPORT_SYMBOL(skb_copy_bits); +EXPORT_SYMBOL(skb_copy_expand); +EXPORT_SYMBOL(skb_over_panic); +EXPORT_SYMBOL(skb_pad); +EXPORT_SYMBOL(skb_realloc_headroom); +EXPORT_SYMBOL(skb_under_panic); diff -Nru a/net/core/sock.c b/net/core/sock.c --- a/net/core/sock.c Wed Oct 8 12:24:57 2003 +++ b/net/core/sock.c Wed Oct 8 12:24:57 2003 @@ -98,6 +98,7 @@ #include #include #include +#include #include #include #include @@ -1111,3 +1112,40 @@ atomic_set(&sk->sk_refcnt, 1); } + +EXPORT_SYMBOL(__lock_sock); +EXPORT_SYMBOL(__release_sock); +EXPORT_SYMBOL(sk_alloc); +EXPORT_SYMBOL(sk_free); +EXPORT_SYMBOL(sk_send_sigurg); +EXPORT_SYMBOL(sock_alloc_send_pskb); +EXPORT_SYMBOL(sock_alloc_send_skb); +EXPORT_SYMBOL(sock_getsockopt); +EXPORT_SYMBOL(sock_init_data); +EXPORT_SYMBOL(sock_kfree_s); +EXPORT_SYMBOL(sock_kmalloc); +EXPORT_SYMBOL(sock_no_accept); +EXPORT_SYMBOL(sock_no_bind); +EXPORT_SYMBOL(sock_no_connect); +EXPORT_SYMBOL(sock_no_getname); +EXPORT_SYMBOL(sock_no_getsockopt); +EXPORT_SYMBOL(sock_no_ioctl); +EXPORT_SYMBOL(sock_no_listen); +EXPORT_SYMBOL(sock_no_mmap); +EXPORT_SYMBOL(sock_no_poll); +EXPORT_SYMBOL(sock_no_recvmsg); +EXPORT_SYMBOL(sock_no_release); +EXPORT_SYMBOL(sock_no_sendmsg); +EXPORT_SYMBOL(sock_no_sendpage); +EXPORT_SYMBOL(sock_no_setsockopt); +EXPORT_SYMBOL(sock_no_shutdown); +EXPORT_SYMBOL(sock_no_socketpair); +EXPORT_SYMBOL(sock_rfree); +EXPORT_SYMBOL(sock_rmalloc); +EXPORT_SYMBOL(sock_setsockopt); +EXPORT_SYMBOL(sock_wfree); +EXPORT_SYMBOL(sock_wmalloc); +#ifdef CONFIG_SYSCTL +EXPORT_SYMBOL(sysctl_rmem_max); +EXPORT_SYMBOL(sysctl_wmem_max); +#endif diff -Nru a/net/core/utils.c b/net/core/utils.c --- a/net/core/utils.c Wed Oct 8 12:24:55 2003 +++ b/net/core/utils.c Wed Oct 8 12:24:55 2003 @@ -13,13 +13,15 @@ * 2 of the License, or (at your option) any later version. */ -#include -#include -#include -#include +#include #include -#include +#include #include +#include +#include + +#include +#include static unsigned long net_rand_seed = 152L; @@ -71,3 +73,7 @@ spin_unlock_irqrestore(&ratelimit_lock, flags); return 0; } + +EXPORT_SYMBOL(net_random); +EXPORT_SYMBOL(net_ratelimit); +EXPORT_SYMBOL(net_srandom); diff -Nru a/net/core/wireless.c b/net/core/wireless.c --- a/net/core/wireless.c Wed Oct 8 12:24:57 2003 +++ b/net/core/wireless.c Wed Oct 8 12:24:57 2003 @@ -1365,3 +1365,10 @@ #endif /* IW_WIRELESS_THRSPY */ #endif /* IW_WIRELESS_SPY */ } + +EXPORT_SYMBOL(iw_handler_get_spy); +EXPORT_SYMBOL(iw_handler_get_thrspy); +EXPORT_SYMBOL(iw_handler_set_spy); +EXPORT_SYMBOL(iw_handler_set_thrspy); +EXPORT_SYMBOL(wireless_send_event); +EXPORT_SYMBOL(wireless_spy_update); diff -Nru a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c --- a/net/decnet/af_decnet.c Wed Oct 8 12:24:56 2003 +++ b/net/decnet/af_decnet.c Wed Oct 8 12:24:56 2003 @@ -2081,7 +2081,6 @@ .type = __constant_htons(ETH_P_DNA_RT), .dev = NULL, /* All devices */ .func = dn_route_rcv, - .data = PKT_CAN_SHARE_SKB, }; #ifdef CONFIG_PROC_FS diff -Nru a/net/econet/af_econet.c b/net/econet/af_econet.c --- a/net/econet/af_econet.c Wed Oct 8 12:24:56 2003 +++ b/net/econet/af_econet.c Wed Oct 8 12:24:56 2003 @@ -1011,26 +1011,26 @@ static int econet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { - struct ec_framehdr *hdr = (struct ec_framehdr *)skb->data; + struct ec_framehdr *hdr; struct sock *sk; struct ec_device *edev = dev->ec_ptr; - if (! edev) - { - kfree_skb(skb); - return 0; - } + if (skb->pkt_type == PACKET_OTHERHOST) + goto drop; - if (skb->len < sizeof(struct ec_framehdr)) - { - /* Frame is too small to be any use */ - kfree_skb(skb); - return 0; - } + if (!edev) + goto drop; + + if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) + return NET_RX_DROP; + + if (!pskb_may_pull(skb, sizeof(struct ec_framehdr))) + goto drop; + + hdr = (struct ec_framehdr *) skb->data; /* First check for encapsulated IP */ - if (hdr->port == EC_PORT_IP) - { + if (hdr->port == EC_PORT_IP) { skb->protocol = htons(ETH_P_IP); skb_pull(skb, sizeof(struct ec_framehdr)); netif_rx(skb); @@ -1038,14 +1038,15 @@ } sk = ec_listening_socket(hdr->port, hdr->src_stn, hdr->src_net); - if (!sk) - { - kfree_skb(skb); - return 0; - } + if (!sk) + goto drop; return ec_queue_packet(sk, skb, edev->net, hdr->src_stn, hdr->cb, hdr->port); + +drop: + kfree_skb(skb); + return 0; } static struct packet_type econet_packet_type = { diff -Nru a/net/ethernet/eth.c b/net/ethernet/eth.c --- a/net/ethernet/eth.c Wed Oct 8 12:24:56 2003 +++ b/net/ethernet/eth.c Wed Oct 8 12:24:56 2003 @@ -37,6 +37,7 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ +#include #include #include #include @@ -241,3 +242,5 @@ memcpy(((u8*)hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)), haddr, dev->addr_len); } + +EXPORT_SYMBOL(eth_type_trans); diff -Nru a/net/ethernet/pe2.c b/net/ethernet/pe2.c --- a/net/ethernet/pe2.c Wed Oct 8 12:24:57 2003 +++ b/net/ethernet/pe2.c Wed Oct 8 12:24:57 2003 @@ -1,27 +1,28 @@ +#include +#include +#include #include #include + #include -#include -#include -static int pEII_request(struct datalink_proto *dl, - struct sk_buff *skb, unsigned char *dest_node) +static int pEII_request(struct datalink_proto *dl, + struct sk_buff *skb, unsigned char *dest_node) { - struct net_device *dev = skb->dev; + struct net_device *dev = skb->dev; - skb->protocol = htons (ETH_P_IPX); - if(dev->hard_header) - dev->hard_header(skb, dev, ETH_P_IPX, dest_node, NULL, skb->len); + skb->protocol = htons(ETH_P_IPX); + if (dev->hard_header) + dev->hard_header(skb, dev, ETH_P_IPX, + dest_node, NULL, skb->len); return dev_queue_xmit(skb); } -struct datalink_proto * -make_EII_client(void) +struct datalink_proto *make_EII_client(void) { - struct datalink_proto *proto; + struct datalink_proto *proto = kmalloc(sizeof(*proto), GFP_ATOMIC); - proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC); - if (proto != NULL) { + if (proto) { proto->header_length = 0; proto->request = pEII_request; } @@ -34,3 +35,6 @@ if (dl) kfree(dl); } + +EXPORT_SYMBOL(destroy_EII_client); +EXPORT_SYMBOL(make_EII_client); diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/af_inet.c Wed Oct 8 12:24:55 2003 @@ -74,6 +74,7 @@ #include #include #include +#include #include #include #include @@ -1246,4 +1247,33 @@ return 0; } #endif /* CONFIG_PROC_FS */ + MODULE_ALIAS_NETPROTO(PF_INET); + +EXPORT_SYMBOL(inet_accept); +EXPORT_SYMBOL(inet_bind); +EXPORT_SYMBOL(inet_dgram_connect); +EXPORT_SYMBOL(inet_dgram_ops); +EXPORT_SYMBOL(inet_family_ops); +EXPORT_SYMBOL(inet_getname); +EXPORT_SYMBOL(inet_getsockopt); +EXPORT_SYMBOL(inet_ioctl); +EXPORT_SYMBOL(inet_listen); +EXPORT_SYMBOL(inet_recvmsg); +EXPORT_SYMBOL(inet_register_protosw); +EXPORT_SYMBOL(inet_release); +EXPORT_SYMBOL(inet_sendmsg); +EXPORT_SYMBOL(inet_setsockopt); +EXPORT_SYMBOL(inet_shutdown); +EXPORT_SYMBOL(inet_sock_destruct); +EXPORT_SYMBOL(inet_sock_release); +EXPORT_SYMBOL(inet_stream_connect); +EXPORT_SYMBOL(inet_stream_ops); +EXPORT_SYMBOL(inet_unregister_protosw); +EXPORT_SYMBOL(net_statistics); +EXPORT_SYMBOL(tcp_protocol); +EXPORT_SYMBOL(udp_protocol); + +#ifdef INET_REFCNT_DEBUG +EXPORT_SYMBOL(inet_sock_nr); +#endif diff -Nru a/net/ipv4/arp.c b/net/ipv4/arp.c --- a/net/ipv4/arp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/arp.c Wed Oct 8 12:24:57 2003 @@ -69,6 +69,7 @@ * Arnaldo C. Melo : convert /proc/net/arp to seq_file */ +#include #include #include #include @@ -630,12 +631,6 @@ if (in_dev == NULL) goto out; - /* ARP header, plus 2 device addresses, plus 2 IP addresses. */ - if (!pskb_may_pull(skb, (sizeof(struct arphdr) + - (2 * dev->addr_len) + - (2 * sizeof(u32))))) - goto out; - arp = skb->nh.arph; switch (dev_type) { @@ -835,8 +830,15 @@ int arp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { - struct arphdr *arp = skb->nh.arph; + struct arphdr *arp; + + /* ARP header, plus 2 device addresses, plus 2 IP addresses. */ + if (!pskb_may_pull(skb, (sizeof(struct arphdr) + + (2 * dev->addr_len) + + (2 * sizeof(u32))))) + goto freeskb; + arp = skb->nh.arph; if (arp->ar_hln != dev->addr_len || dev->flags & IFF_NOARP || skb->pkt_type == PACKET_OTHERHOST || @@ -1108,7 +1110,6 @@ static struct packet_type arp_packet_type = { .type = __constant_htons(ETH_P_ARP), .func = arp_rcv, - .data = PKT_CAN_SHARE_SKB, }; static int arp_proc_init(void); @@ -1429,3 +1430,13 @@ } #endif /* CONFIG_PROC_FS */ + +EXPORT_SYMBOL(arp_broken_ops); +EXPORT_SYMBOL(arp_find); +EXPORT_SYMBOL(arp_rcv); +EXPORT_SYMBOL(arp_send); +EXPORT_SYMBOL(arp_tbl); + +#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) +EXPORT_SYMBOL(clip_tbl_hook); +#endif diff -Nru a/net/ipv4/devinet.c b/net/ipv4/devinet.c --- a/net/ipv4/devinet.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/devinet.c Wed Oct 8 12:24:56 2003 @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -1354,3 +1355,11 @@ devinet_sysctl_register(NULL, &ipv4_devconf_dflt); #endif } + +EXPORT_SYMBOL(devinet_ioctl); +EXPORT_SYMBOL(in_dev_finish_destroy); +EXPORT_SYMBOL(inet_select_addr); +EXPORT_SYMBOL(inetdev_by_index); +EXPORT_SYMBOL(inetdev_lock); +EXPORT_SYMBOL(register_inetaddr_notifier); +EXPORT_SYMBOL(unregister_inetaddr_notifier); diff -Nru a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c --- a/net/ipv4/fib_frontend.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/fib_frontend.c Wed Oct 8 12:24:57 2003 @@ -16,6 +16,7 @@ */ #include +#include #include #include #include @@ -605,3 +606,6 @@ register_inetaddr_notifier(&fib_inetaddr_notifier); } +EXPORT_SYMBOL(inet_addr_type); +EXPORT_SYMBOL(ip_dev_find); +EXPORT_SYMBOL(ip_rt_ioctl); diff -Nru a/net/ipv4/icmp.c b/net/ipv4/icmp.c --- a/net/ipv4/icmp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/icmp.c Wed Oct 8 12:24:57 2003 @@ -65,6 +65,7 @@ */ #include +#include #include #include #include @@ -1126,3 +1127,8 @@ per_cpu(__icmp_socket, i)->sk->sk_prot->unhash(per_cpu(__icmp_socket, i)->sk); } } + +EXPORT_SYMBOL(icmp_err_convert); +EXPORT_SYMBOL(icmp_send); +EXPORT_SYMBOL(icmp_statistics); +EXPORT_SYMBOL(xrlim_allow); diff -Nru a/net/ipv4/igmp.c b/net/ipv4/igmp.c --- a/net/ipv4/igmp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/igmp.c Wed Oct 8 12:24:57 2003 @@ -72,8 +72,8 @@ * Vinay Kulkarni */ - #include +#include #include #include #include @@ -1391,8 +1391,9 @@ sf_markstate(pmc); #endif if (!delta) { + err = -EINVAL; if (!pmc->sfcount[sfmode]) - return -EINVAL; + goto out_unlock; pmc->sfcount[sfmode]--; } err = 0; @@ -1423,6 +1424,7 @@ igmp_ifc_event(pmc->interface); #endif } +out_unlock: spin_unlock_bh(&pmc->lock); return err; } @@ -2438,3 +2440,6 @@ } #endif +EXPORT_SYMBOL(ip_mc_dec_group); +EXPORT_SYMBOL(ip_mc_inc_group); +EXPORT_SYMBOL(ip_mc_join_group); diff -Nru a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c --- a/net/ipv4/inetpeer.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/inetpeer.c Wed Oct 8 12:24:57 2003 @@ -8,6 +8,7 @@ * Authors: Andrey V. Savochkin */ +#include #include #include #include @@ -452,3 +453,5 @@ peer_total / inet_peer_threshold * HZ; add_timer(&peer_periodic_timer); } + +EXPORT_SYMBOL(inet_peer_idlock); diff -Nru a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c --- a/net/ipv4/ip_fragment.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/ip_fragment.c Wed Oct 8 12:24:56 2003 @@ -23,6 +23,7 @@ */ #include +#include #include #include #include @@ -675,3 +676,5 @@ ipfrag_secret_timer.expires = jiffies + sysctl_ipfrag_secret_interval; add_timer(&ipfrag_secret_timer); } + +EXPORT_SYMBOL(ip_defrag); diff -Nru a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c --- a/net/ipv4/ip_gre.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ip_gre.c Wed Oct 8 12:24:57 2003 @@ -803,8 +803,6 @@ tunnel->err_count = 0; } - skb->h.raw = skb->nh.raw; - max_headroom = LL_RESERVED_SPACE(tdev) + gre_hlen; if (skb_headroom(skb) < max_headroom || skb_cloned(skb) || skb_shared(skb)) { @@ -823,6 +821,7 @@ old_iph = skb->nh.iph; } + skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, gre_hlen); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); dst_release(skb->dst); diff -Nru a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c --- a/net/ipv4/ip_input.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/ip_input.c Wed Oct 8 12:24:55 2003 @@ -116,6 +116,7 @@ */ #include +#include #include #include #include @@ -432,3 +433,5 @@ return NET_RX_DROP; } +EXPORT_SYMBOL(ip_rcv); +EXPORT_SYMBOL(ip_statistics); diff -Nru a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c --- a/net/ipv4/ip_options.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ip_options.c Wed Oct 8 12:24:57 2003 @@ -11,6 +11,7 @@ * */ +#include #include #include #include @@ -617,3 +618,6 @@ } return 0; } + +EXPORT_SYMBOL(ip_options_compile); +EXPORT_SYMBOL(ip_options_undo); diff -Nru a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c --- a/net/ipv4/ip_output.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ip_output.c Wed Oct 8 12:24:57 2003 @@ -46,6 +46,7 @@ #include #include +#include #include #include #include @@ -1294,12 +1295,9 @@ * IP protocol layer initialiser */ -static struct packet_type ip_packet_type = -{ +static struct packet_type ip_packet_type = { .type = __constant_htons(ETH_P_IP), - .dev = NULL, /* All devices */ .func = ip_rcv, - .data = PKT_CAN_SHARE_SKB, }; /* @@ -1317,3 +1315,13 @@ igmp_mc_proc_init(); #endif } + +EXPORT_SYMBOL(ip_finish_output); +EXPORT_SYMBOL(ip_fragment); +EXPORT_SYMBOL(ip_generic_getfrag); +EXPORT_SYMBOL(ip_queue_xmit); +EXPORT_SYMBOL(ip_send_check); + +#ifdef CONFIG_SYSCTL +EXPORT_SYMBOL(sysctl_ip_default_ttl); +#endif diff -Nru a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c --- a/net/ipv4/ip_sockglue.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/ip_sockglue.c Wed Oct 8 12:24:56 2003 @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -1055,3 +1056,10 @@ } return 0; } + +EXPORT_SYMBOL(ip_cmsg_recv); + +#ifdef CONFIG_IP_SCTP_MODULE +EXPORT_SYMBOL(ip_getsockopt); +EXPORT_SYMBOL(ip_setsockopt); +#endif diff -Nru a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c --- a/net/ipv4/ipconfig.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/ipconfig.c Wed Oct 8 12:24:55 2003 @@ -408,27 +408,24 @@ static int __init ic_rarp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { - struct arphdr *rarp = (struct arphdr *)skb->h.raw; - unsigned char *rarp_ptr = (unsigned char *) (rarp + 1); + struct arphdr *rarp; + unsigned char *rarp_ptr; unsigned long sip, tip; unsigned char *sha, *tha; /* s for "source", t for "target" */ struct ic_device *d; - /* One reply at a time, please. */ - spin_lock(&ic_recv_lock); + if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) + return NET_RX_DROP; - /* If we already have a reply, just drop the packet */ - if (ic_got_reply) + if (!pskb_may_pull(skb, sizeof(struct arphdr))) goto drop; - /* Find the ic_device that the packet arrived on */ - d = ic_first_dev; - while (d && d->dev != dev) - d = d->next; - if (!d) - goto drop; /* should never happen */ + /* Basic sanity checks can be done without the lock. */ + rarp = (struct arphdr *)skb->h.raw; - /* If this test doesn't pass, it's not IP, or we should ignore it anyway */ + /* If this test doesn't pass, it's not IP, or we should + * ignore it anyway. + */ if (rarp->ar_hln != dev->addr_len || dev->type != ntohs(rarp->ar_hrd)) goto drop; @@ -440,6 +437,30 @@ if (rarp->ar_pro != htons(ETH_P_IP)) goto drop; + if (!pskb_may_pull(skb, + sizeof(struct arphdr) + + (2 * dev->addr_len) + + (2 * 4))) + goto drop; + + /* OK, it is all there and looks valid, process... */ + rarp = (struct arphdr *)skb->h.raw; + rarp_ptr = (unsigned char *) (rarp + 1); + + /* One reply at a time, please. */ + spin_lock(&ic_recv_lock); + + /* If we already have a reply, just drop the packet */ + if (ic_got_reply) + goto drop_unlock; + + /* Find the ic_device that the packet arrived on */ + d = ic_first_dev; + while (d && d->dev != dev) + d = d->next; + if (!d) + goto drop_unlock; /* should never happen */ + /* Extract variable-width fields */ sha = rarp_ptr; rarp_ptr += dev->addr_len; @@ -451,11 +472,11 @@ /* Discard packets which are not meant for us. */ if (memcmp(tha, dev->dev_addr, dev->addr_len)) - goto drop; + goto drop_unlock; /* Discard packets which are not from specified server. */ if (ic_servaddr != INADDR_NONE && ic_servaddr != sip) - goto drop; + goto drop_unlock; /* We have a winner! */ ic_dev = dev; @@ -464,10 +485,11 @@ ic_servaddr = sip; ic_got_reply = IC_RARP; -drop: +drop_unlock: /* Show's over. Nothing to see here. */ spin_unlock(&ic_recv_lock); +drop: /* Throw the packet out. */ kfree_skb(skb); return 0; @@ -793,51 +815,82 @@ */ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { - struct bootp_pkt *b = (struct bootp_pkt *) skb->nh.iph; - struct iphdr *h = &b->iph; + struct bootp_pkt *b; + struct iphdr *h; struct ic_device *d; int len; + /* Perform verifications before taking the lock. */ + if (skb->pkt_type == PACKET_OTHERHOST) + goto drop; + + if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) + return NET_RX_DROP; + + if (!pskb_may_pull(skb, + sizeof(struct iphdr) + + sizeof(struct udphdr))) + goto drop; + + b = (struct bootp_pkt *) skb->nh.iph; + h = &b->iph; + + if (h->ihl != 5 || h->version != 4 || h->protocol != IPPROTO_UDP) + goto drop; + + /* Fragments are not supported */ + if (h->frag_off & htons(IP_OFFSET | IP_MF)) { + if (net_ratelimit()) + printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented " + "reply.\n"); + goto drop; + } + + if (skb->len < ntohs(h->tot_len)) + goto drop; + + if (ip_fast_csum((char *) h, h->ihl)) + goto drop; + + if (b->udph.source != htons(67) || b->udph.dest != htons(68)) + goto drop; + + if (ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr)) + goto drop; + + len = ntohs(b->udph.len) - sizeof(struct udphdr); + if (len < 300) + goto drop; + + /* Ok the front looks good, make sure we can get at the rest. */ + if (!pskb_may_pull(skb, skb->len)) + goto drop; + + b = (struct bootp_pkt *) skb->nh.iph; + h = &b->iph; + /* One reply at a time, please. */ spin_lock(&ic_recv_lock); /* If we already have a reply, just drop the packet */ if (ic_got_reply) - goto drop; + goto drop_unlock; /* Find the ic_device that the packet arrived on */ d = ic_first_dev; while (d && d->dev != dev) d = d->next; if (!d) - goto drop; /* should never happen */ - - /* Check whether it's a BOOTP packet */ - if (skb->pkt_type == PACKET_OTHERHOST || - skb->len < sizeof(struct udphdr) + sizeof(struct iphdr) || - h->ihl != 5 || - h->version != 4 || - ip_fast_csum((char *) h, h->ihl) != 0 || - skb->len < ntohs(h->tot_len) || - h->protocol != IPPROTO_UDP || - b->udph.source != htons(67) || - b->udph.dest != htons(68) || - ntohs(h->tot_len) < ntohs(b->udph.len) + sizeof(struct iphdr)) - goto drop; - - /* Fragments are not supported */ - if (h->frag_off & htons(IP_OFFSET | IP_MF)) { - printk(KERN_ERR "DHCP/BOOTP: Ignoring fragmented reply.\n"); - goto drop; - } + goto drop_unlock; /* should never happen */ /* Is it a reply to our BOOTP request? */ - len = ntohs(b->udph.len) - sizeof(struct udphdr); - if (len < 300 || /* See RFC 951:2.1 */ - b->op != BOOTP_REPLY || + if (b->op != BOOTP_REPLY || b->xid != d->xid) { - printk("?"); - goto drop; + if (net_ratelimit()) + printk(KERN_ERR "DHCP/BOOTP: Reply not for us, " + "op[%x] xid[%x]\n", + b->op, b->xid); + goto drop_unlock; } /* Parse extensions */ @@ -880,7 +933,7 @@ * ignore all others. */ if (ic_myaddr != INADDR_NONE) - goto drop; + goto drop_unlock; /* Let's accept that offer. */ ic_myaddr = b->your_ip; @@ -908,7 +961,7 @@ /* Urque. Forget it*/ ic_myaddr = INADDR_NONE; ic_servaddr = INADDR_NONE; - goto drop; + goto drop_unlock; }; ic_dhcp_msgtype = mt; @@ -937,10 +990,11 @@ ic_nameservers[0] = ic_servaddr; ic_got_reply = IC_BOOTP; -drop: +drop_unlock: /* Show's over. Nothing to see here. */ spin_unlock(&ic_recv_lock); +drop: /* Throw the packet out. */ kfree_skb(skb); diff -Nru a/net/ipv4/ipip.c b/net/ipv4/ipip.c --- a/net/ipv4/ipip.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipip.c Wed Oct 8 12:24:57 2003 @@ -483,6 +483,11 @@ read_lock(&ipip_lock); if ((tunnel = ipip_tunnel_lookup(iph->saddr, iph->daddr)) != NULL) { + if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) { + kfree_skb(skb); + return 0; + } + tunnel->stat.rx_packets++; tunnel->stat.rx_bytes += skb->len; skb->dev = tunnel->dev; @@ -596,8 +601,6 @@ tunnel->err_count = 0; } - skb->h.raw = skb->nh.raw; - /* * Okay, now see if we can stuff it in the buffer as-is. */ @@ -619,6 +622,7 @@ old_iph = skb->nh.iph; } + skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); dst_release(skb->dst); diff -Nru a/net/ipv4/ipvs/ip_vs_app.c b/net/ipv4/ipvs/ip_vs_app.c --- a/net/ipv4/ipvs/ip_vs_app.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/ipvs/ip_vs_app.c Wed Oct 8 12:24:55 2003 @@ -362,29 +362,18 @@ spin_unlock(&cp->lock); } - -/* - * Output pkt hook. Will call bound ip_vs_app specific function - * called by ipvs packet handler, assumes previously checked cp!=NULL - * returns (new - old) skb->len diff. - */ -int ip_vs_app_pkt_out(struct ip_vs_conn *cp, struct sk_buff *skb) +static inline int app_tcp_pkt_out(struct ip_vs_conn *cp, struct sk_buff **pskb, + struct ip_vs_app *app) { - struct ip_vs_app *app; int diff; - struct iphdr *iph; + unsigned int tcp_offset = (*pskb)->nh.iph->ihl*4; struct tcphdr *th; __u32 seq; - /* - * check if application module is bound to - * this ip_vs_conn. - */ - if ((app = cp->app) == NULL) + if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th))) return 0; - iph = skb->nh.iph; - th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); + th = (struct tcphdr *)((*pskb)->nh.raw + tcp_offset); /* * Remember seq number in case this pkt gets resized @@ -394,54 +383,72 @@ /* * Fix seq stuff if flagged as so. */ - if (cp->protocol == IPPROTO_TCP) { - if (cp->flags & IP_VS_CONN_F_OUT_SEQ) - vs_fix_seq(&cp->out_seq, th); - if (cp->flags & IP_VS_CONN_F_IN_SEQ) - vs_fix_ack_seq(&cp->in_seq, th); - } + if (cp->flags & IP_VS_CONN_F_OUT_SEQ) + vs_fix_seq(&cp->out_seq, th); + if (cp->flags & IP_VS_CONN_F_IN_SEQ) + vs_fix_ack_seq(&cp->in_seq, th); /* * Call private output hook function */ if (app->pkt_out == NULL) - return 0; + return 1; - diff = app->pkt_out(app, cp, skb); + if (!app->pkt_out(app, cp, pskb, &diff)) + return 0; /* * Update ip_vs seq stuff if len has changed. */ - if (diff != 0 && cp->protocol == IPPROTO_TCP) + if (diff != 0) vs_seq_update(cp, &cp->out_seq, IP_VS_CONN_F_OUT_SEQ, seq, diff); - return diff; + return 1; } - /* - * Input pkt hook. Will call bound ip_vs_app specific function - * called by ipvs packet handler, assumes previously checked cp!=NULL. - * returns (new - old) skb->len diff. + * Output pkt hook. Will call bound ip_vs_app specific function + * called by ipvs packet handler, assumes previously checked cp!=NULL + * returns false if it can't handle packet (oom) */ -int ip_vs_app_pkt_in(struct ip_vs_conn *cp, struct sk_buff *skb) +int ip_vs_app_pkt_out(struct ip_vs_conn *cp, struct sk_buff **pskb) { struct ip_vs_app *app; - int diff; - struct iphdr *iph; - struct tcphdr *th; - __u32 seq; /* * check if application module is bound to * this ip_vs_conn. */ if ((app = cp->app) == NULL) + return 1; + + /* TCP is complicated */ + if (cp->protocol == IPPROTO_TCP) + return app_tcp_pkt_out(cp, pskb, app); + + /* + * Call private output hook function + */ + if (app->pkt_out == NULL) + return 1; + + return app->pkt_out(app, cp, pskb, NULL); +} + + +static inline int app_tcp_pkt_in(struct ip_vs_conn *cp, struct sk_buff **pskb, + struct ip_vs_app *app) +{ + int diff; + unsigned int tcp_offset = (*pskb)->nh.iph->ihl*4; + struct tcphdr *th; + __u32 seq; + + if (!ip_vs_make_skb_writable(pskb, tcp_offset + sizeof(*th))) return 0; - iph = skb->nh.iph; - th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); + th = (struct tcphdr *)((*pskb)->nh.raw + tcp_offset); /* * Remember seq number in case this pkt gets resized @@ -451,29 +458,57 @@ /* * Fix seq stuff if flagged as so. */ - if (cp->protocol == IPPROTO_TCP) { - if (cp->flags & IP_VS_CONN_F_IN_SEQ) - vs_fix_seq(&cp->in_seq, th); - if (cp->flags & IP_VS_CONN_F_OUT_SEQ) - vs_fix_ack_seq(&cp->out_seq, th); - } + if (cp->flags & IP_VS_CONN_F_IN_SEQ) + vs_fix_seq(&cp->in_seq, th); + if (cp->flags & IP_VS_CONN_F_OUT_SEQ) + vs_fix_ack_seq(&cp->out_seq, th); /* * Call private input hook function */ if (app->pkt_in == NULL) - return 0; + return 1; - diff = app->pkt_in(app, cp, skb); + if (!app->pkt_in(app, cp, pskb, &diff)) + return 0; /* * Update ip_vs seq stuff if len has changed. */ - if (diff != 0 && cp->protocol == IPPROTO_TCP) + if (diff != 0) vs_seq_update(cp, &cp->in_seq, IP_VS_CONN_F_IN_SEQ, seq, diff); - return diff; + return 1; +} + +/* + * Input pkt hook. Will call bound ip_vs_app specific function + * called by ipvs packet handler, assumes previously checked cp!=NULL. + * returns false if can't handle packet (oom). + */ +int ip_vs_app_pkt_in(struct ip_vs_conn *cp, struct sk_buff **pskb) +{ + struct ip_vs_app *app; + + /* + * check if application module is bound to + * this ip_vs_conn. + */ + if ((app = cp->app) == NULL) + return 1; + + /* TCP is complicated */ + if (cp->protocol == IPPROTO_TCP) + return app_tcp_pkt_in(cp, pskb, app); + + /* + * Call private input hook function + */ + if (app->pkt_in == NULL) + return 1; + + return app->pkt_in(app, cp, pskb, NULL); } @@ -490,7 +525,7 @@ list_for_each_entry(inc, &app->incs_list, a_list) { if (pos-- == 0) return inc; - } + } } return NULL; @@ -499,7 +534,7 @@ static void *ip_vs_app_seq_start(struct seq_file *seq, loff_t *pos) { down(&__ip_vs_app_mutex); - + return *pos ? ip_vs_app_idx(*pos - 1) : SEQ_START_TOKEN; } @@ -511,7 +546,7 @@ ++*pos; if (v == SEQ_START_TOKEN) return ip_vs_app_idx(0); - + inc = v; app = inc->app; @@ -563,8 +598,8 @@ static struct file_operations ip_vs_app_fops = { .owner = THIS_MODULE, - .open = ip_vs_app_open, - .read = seq_read, + .open = ip_vs_app_open, + .read = seq_read, .llseek = seq_lseek, .release = seq_release, }; diff -Nru a/net/ipv4/ipvs/ip_vs_conn.c b/net/ipv4/ipvs/ip_vs_conn.c --- a/net/ipv4/ipvs/ip_vs_conn.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_conn.c Wed Oct 8 12:24:57 2003 @@ -670,8 +670,8 @@ { struct list_head *l = seq->private; - if (l) - ct_read_unlock(l - ip_vs_conn_tab); + if (l) + ct_read_unlock_bh(l - ip_vs_conn_tab); } static int ip_vs_conn_seq_show(struct seq_file *seq, void *v) diff -Nru a/net/ipv4/ipvs/ip_vs_core.c b/net/ipv4/ipvs/ip_vs_core.c --- a/net/ipv4/ipvs/ip_vs_core.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/ipvs/ip_vs_core.c Wed Oct 8 12:24:55 2003 @@ -21,6 +21,7 @@ * and others. * * Changes: + * Paul `Rusty' Russell properly handle non-linear skbs * */ @@ -61,10 +62,11 @@ EXPORT_SYMBOL(ip_vs_get_debug_level); #endif EXPORT_SYMBOL(check_for_ip_vs_out); +EXPORT_SYMBOL(ip_vs_make_skb_writable); /* ID used in ICMP lookups */ -#define icmp_id(icmph) ((icmph->un).echo.id) +#define icmp_id(icmph) (((icmph)->un).echo.id) const char *ip_vs_proto_name(unsigned proto) { @@ -156,15 +158,51 @@ static inline int ip_vs_set_state(struct ip_vs_conn *cp, int direction, - struct iphdr *iph, union ip_vs_tphdr h, + const struct sk_buff *skb, struct ip_vs_protocol *pp) { if (unlikely(!pp->state_transition)) return 0; - return pp->state_transition(cp, direction, iph, h, pp); + return pp->state_transition(cp, direction, skb, pp); } +int ip_vs_make_skb_writable(struct sk_buff **pskb, int writable_len) +{ + struct sk_buff *skb = *pskb; + + /* skb is already used, better copy skb and its payload */ + if (unlikely(skb_shared(skb) || skb->sk)) + goto copy_skb; + + /* skb data is already used, copy it */ + if (unlikely(skb_cloned(skb))) + goto copy_data; + + return pskb_may_pull(skb, writable_len); + + copy_data: + if (unlikely(writable_len > skb->len)) + return 0; + return !pskb_expand_head(skb, 0, 0, GFP_ATOMIC); + + copy_skb: + if (unlikely(writable_len > skb->len)) + return 0; + skb = skb_copy(skb, GFP_ATOMIC); + if (!skb) + return 0; + BUG_ON(skb_is_nonlinear(skb)); + + /* Rest of kernel will get very unhappy if we pass it a + suddenly-orphaned skbuff */ + if ((*pskb)->sk) + skb_set_owner_w(skb, (*pskb)->sk); + kfree_skb(*pskb); + *pskb = skb; + return 1; +} + /* * IPVS persistent scheduling function * It creates a connection entry according to its template if exists, @@ -173,24 +211,24 @@ * Protocols supported: TCP, UDP */ static struct ip_vs_conn * -ip_vs_sched_persist(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_sched_persist(struct ip_vs_service *svc, + const struct sk_buff *skb, + __u16 ports[2]) { struct ip_vs_conn *cp = NULL; + struct iphdr *iph = skb->nh.iph; struct ip_vs_dest *dest; - const __u16 *portp; struct ip_vs_conn *ct; __u16 dport; /* destination port to forward */ __u32 snet; /* source network of the client, after masking */ - portp = (__u16 *)&(((char *)iph)[iph->ihl*4]); - /* Mask saddr with the netmask to adjust template granularity */ snet = iph->saddr & svc->netmask; IP_VS_DBG(6, "p-schedule: src %u.%u.%u.%u:%u dest %u.%u.%u.%u:%u " "mnet %u.%u.%u.%u\n", - NIPQUAD(iph->saddr), ntohs(portp[0]), - NIPQUAD(iph->daddr), ntohs(portp[1]), + NIPQUAD(iph->saddr), ntohs(ports[0]), + NIPQUAD(iph->daddr), ntohs(ports[1]), NIPQUAD(snet)); /* @@ -206,11 +244,11 @@ * service, and a template like * is created for other persistent services. */ - if (portp[1] == svc->port) { + if (ports[1] == svc->port) { /* Check if a template already exists */ if (svc->port != FTPPORT) ct = ip_vs_conn_in_get(iph->protocol, snet, 0, - iph->daddr, portp[1]); + iph->daddr, ports[1]); else ct = ip_vs_conn_in_get(iph->protocol, snet, 0, iph->daddr, 0); @@ -220,7 +258,7 @@ * No template found or the dest of the connection * template is not available. */ - dest = svc->scheduler->schedule(svc, iph); + dest = svc->scheduler->schedule(svc, skb); if (dest == NULL) { IP_VS_DBG(1, "p-schedule: no dest found.\n"); return NULL; @@ -235,7 +273,8 @@ if (svc->port != FTPPORT) ct = ip_vs_conn_new(iph->protocol, snet, 0, - iph->daddr, portp[1], + iph->daddr, + ports[1], dest->addr, dest->port, 0, dest); @@ -277,7 +316,7 @@ if (svc->port) return NULL; - dest = svc->scheduler->schedule(svc, iph); + dest = svc->scheduler->schedule(svc, skb); if (dest == NULL) { IP_VS_DBG(1, "p-schedule: no dest found.\n"); return NULL; @@ -308,15 +347,15 @@ /* set destination with the found template */ dest = ct->dest; } - dport = portp[1]; + dport = ports[1]; } /* * Create a new connection according to the template */ cp = ip_vs_conn_new(iph->protocol, - iph->saddr, portp[0], - iph->daddr, portp[1], + iph->saddr, ports[0], + iph->daddr, ports[1], dest->addr, dport, 0, dest); @@ -343,23 +382,26 @@ * Protocols supported: TCP, UDP */ struct ip_vs_conn * -ip_vs_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_conn *cp = NULL; + struct iphdr *iph = skb->nh.iph; struct ip_vs_dest *dest; - const __u16 *portp; + __u16 ports[2]; + + if (skb_copy_bits(skb, iph->ihl*4, ports, sizeof(ports)) < 0) + return NULL; /* * Persistent service */ if (svc->flags & IP_VS_SVC_F_PERSISTENT) - return ip_vs_sched_persist(svc, iph); + return ip_vs_sched_persist(svc, skb, ports); /* * Non-persistent service */ - portp = (__u16 *)&(((char *)iph)[iph->ihl*4]); - if (!svc->fwmark && portp[1] != svc->port) { + if (!svc->fwmark && ports[1] != svc->port) { if (!svc->port) IP_VS_ERR("Schedule: port zero only supported " "in persistent services, " @@ -367,7 +409,7 @@ return NULL; } - dest = svc->scheduler->schedule(svc, iph); + dest = svc->scheduler->schedule(svc, skb); if (dest == NULL) { IP_VS_DBG(1, "Schedule: no dest found.\n"); return NULL; @@ -377,9 +419,9 @@ * Create a connection entry. */ cp = ip_vs_conn_new(iph->protocol, - iph->saddr, portp[0], - iph->daddr, portp[1], - dest->addr, dest->port?dest->port:portp[1], + iph->saddr, ports[0], + iph->daddr, ports[1], + dest->addr, dest->port?dest->port:ports[1], 0, dest); if (cp == NULL) @@ -404,10 +446,16 @@ * no destination is available for a new connection. */ int ip_vs_leave(struct ip_vs_service *svc, struct sk_buff *skb, - struct ip_vs_protocol *pp, union ip_vs_tphdr h) + struct ip_vs_protocol *pp) { + __u16 ports[2]; struct iphdr *iph = skb->nh.iph; + if (skb_copy_bits(skb, iph->ihl*4, ports, sizeof(ports)) < 0) { + ip_vs_service_put(svc); + return NF_DROP; + } + /* if it is fwmark-based service, the cache_bypass sysctl is up and the destination is RTN_UNICAST (and not local), then create a cache_bypass connection entry */ @@ -421,24 +469,23 @@ /* create a new connection entry */ IP_VS_DBG(6, "ip_vs_leave: create a cache_bypass entry\n"); cp = ip_vs_conn_new(iph->protocol, - iph->saddr, h.portp[0], - iph->daddr, h.portp[1], + iph->saddr, ports[0], + iph->daddr, ports[1], 0, 0, IP_VS_CONN_F_BYPASS, NULL); - if (cp == NULL) { - kfree_skb(skb); - return NF_STOLEN; - } + if (cp == NULL) + return NF_DROP; /* statistics */ ip_vs_in_stats(cp, skb); /* set state */ - cs = ip_vs_set_state(cp, IP_VS_DIR_INPUT, iph, h, pp); + cs = ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pp); /* transmit the first SYN packet */ ret = cp->packet_xmit(skb, cp, pp); + /* do not touch skb anymore */ atomic_inc(&cp->in_pkts); ip_vs_conn_put(cp); @@ -451,7 +498,7 @@ * listed in the ipvs table), pass the packets, because it is * not ipvs job to decide to drop the packets. */ - if ((svc->port == FTPPORT) && (h.portp[1] != FTPPORT)) { + if ((svc->port == FTPPORT) && (ports[1] != FTPPORT)) { ip_vs_service_put(svc); return NF_ACCEPT; } @@ -466,8 +513,7 @@ * ICMP_PORT_UNREACH is sent here no matter it is TCP/UDP. --WZ */ icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); - kfree_skb(skb); - return NF_STOLEN; + return NF_DROP; } @@ -479,22 +525,80 @@ * for VS/NAT. */ static unsigned int ip_vs_post_routing(unsigned int hooknum, - struct sk_buff **skb_p, + struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { - struct sk_buff *skb = *skb_p; - - if (!(skb->nfcache & NFC_IPVS_PROPERTY)) + if (!((*pskb)->nfcache & NFC_IPVS_PROPERTY)) return NF_ACCEPT; /* The packet was sent from IPVS, exit this chain */ - (*okfn)(skb); + (*okfn)(*pskb); return NF_STOLEN; } +u16 ip_vs_checksum_complete(struct sk_buff *skb, int offset) +{ + return (u16) csum_fold(skb_checksum(skb, offset, skb->len - offset, 0)); +} + +static inline struct sk_buff * +ip_vs_gather_frags(struct sk_buff *skb) +{ + skb = ip_defrag(skb); + if (skb) + ip_send_check(skb->nh.iph); + return skb; +} + +/* + * Packet has been made sufficiently writable in caller + * - inout: 1=in->out, 0=out->in + */ +void ip_vs_nat_icmp(struct sk_buff *skb, struct ip_vs_protocol *pp, + struct ip_vs_conn *cp, int inout) +{ + struct iphdr *iph = skb->nh.iph; + unsigned int icmp_offset = iph->ihl*4; + struct icmphdr *icmph = (struct icmphdr *)(skb->nh.raw + icmp_offset); + struct iphdr *ciph = (struct iphdr *)(icmph + 1); + + if (inout) { + iph->saddr = cp->vaddr; + ip_send_check(iph); + ciph->daddr = cp->vaddr; + ip_send_check(ciph); + } else { + iph->daddr = cp->daddr; + ip_send_check(iph); + ciph->saddr = cp->daddr; + ip_send_check(ciph); + } + + /* the TCP/UDP port */ + if (IPPROTO_TCP == ciph->protocol || IPPROTO_UDP == ciph->protocol) { + __u16 *ports = (void *)ciph + ciph->ihl*4; + + if (inout) + ports[1] = cp->vport; + else + ports[0] = cp->dport; + } + + /* And finally the ICMP checksum */ + icmph->checksum = 0; + icmph->checksum = ip_vs_checksum_complete(skb, icmp_offset); + skb->ip_summed = CHECKSUM_UNNECESSARY; + + if (inout) + IP_VS_DBG_PKT(11, pp, skb, (void *)ciph - (void *)iph, + "Forwarding altered outgoing ICMP"); + else + IP_VS_DBG_PKT(11, pp, skb, (void *)ciph - (void *)iph, + "Forwarding altered incoming ICMP"); +} /* * Handle ICMP messages in the inside-to-outside direction (outgoing). @@ -503,44 +607,33 @@ * Currently handles error types - unreachable, quench, ttl exceeded. * (Only used in VS/NAT) */ -static int ip_vs_out_icmp(struct sk_buff **skb_p, int *related) +static int ip_vs_out_icmp(struct sk_buff **pskb, int *related) { - struct sk_buff *skb = *skb_p; - struct iphdr *iph; - struct icmphdr *icmph; - struct iphdr *ciph; /* The ip header contained within the ICMP */ - unsigned short ihl; - unsigned short len; - unsigned short clen, cihl; + struct sk_buff *skb = *pskb; + struct iphdr *iph; + struct icmphdr icmph; + struct iphdr ciph; /* The ip header contained within the ICMP */ struct ip_vs_conn *cp; struct ip_vs_protocol *pp; - union ip_vs_tphdr h; + unsigned int offset, ihl, verdict; *related = 1; - /* reassemble IP fragments, but will it happen in ICMP packets?? */ + /* reassemble IP fragments */ if (skb->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { - skb = ip_defrag(skb); + skb = ip_vs_gather_frags(skb); if (!skb) return NF_STOLEN; - *skb_p = skb; - } - - if (skb_is_nonlinear(skb)) { - if (skb_linearize(skb, GFP_ATOMIC) != 0) - return NF_DROP; - ip_send_check(skb->nh.iph); + *pskb = skb; } iph = skb->nh.iph; - ihl = iph->ihl << 2; - icmph = (struct icmphdr *)((char *)iph + ihl); - len = ntohs(iph->tot_len) - ihl; - if (len < sizeof(struct icmphdr)) + offset = ihl = iph->ihl * 4; + if (skb_copy_bits(skb, offset, &icmph, sizeof(icmph)) < 0) return NF_DROP; - IP_VS_DBG(12, "outgoing ICMP (%d,%d) %u.%u.%u.%u->%u.%u.%u.%u\n", - icmph->type, ntohs(icmp_id(icmph)), + IP_VS_DBG(12, "Outgoing ICMP (%d,%d) %u.%u.%u.%u->%u.%u.%u.%u\n", + icmph.type, ntohs(icmp_id(&icmph)), NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); /* @@ -550,86 +643,80 @@ * this means that some packets will manage to get a long way * down this stack and then be rejected, but that's life. */ - if ((icmph->type != ICMP_DEST_UNREACH) && - (icmph->type != ICMP_SOURCE_QUENCH) && - (icmph->type != ICMP_TIME_EXCEEDED)) { + if ((icmph.type != ICMP_DEST_UNREACH) && + (icmph.type != ICMP_SOURCE_QUENCH) && + (icmph.type != ICMP_TIME_EXCEEDED)) { *related = 0; return NF_ACCEPT; } /* Now find the contained IP header */ - clen = len - sizeof(struct icmphdr); - if (clen < sizeof(struct iphdr)) - return NF_DROP; - ciph = (struct iphdr *) (icmph + 1); - cihl = ciph->ihl << 2; - if (clen < cihl) - return NF_DROP; + offset += sizeof(icmph); + if (skb_copy_bits(skb, offset, &ciph, sizeof(ciph)) < 0) + return NF_ACCEPT; /* The packet looks wrong, ignore */ - pp = ip_vs_proto_get(ciph->protocol); + pp = ip_vs_proto_get(ciph.protocol); if (!pp) return NF_ACCEPT; /* Is the embedded protocol header present? */ - if (unlikely(ciph->frag_off & __constant_htons(IP_OFFSET) && - (pp->minhlen || pp->dont_defrag))) + if (unlikely(ciph.frag_off & __constant_htons(IP_OFFSET) && + pp->dont_defrag)) return NF_ACCEPT; - /* We need at least TCP/UDP ports here */ - if (clen < cihl + pp->minhlen_icmp) - return NF_DROP; + IP_VS_DBG_PKT(11, pp, skb, offset, "Checking outgoing ICMP for"); - h.raw = (char *) ciph + cihl; + offset += ciph.ihl * 4; - /* Ensure the checksum is correct */ - if (ip_compute_csum((unsigned char *) icmph, len)) { - /* Failed checksum! */ - IP_VS_DBG(1, "forward ICMP: failed checksum from %d.%d.%d.%d!\n", - NIPQUAD(iph->saddr)); - return NF_DROP; - } - - IP_VS_DBG_PKT(11, pp, ciph, "Handling outgoing ICMP for"); - - /* ciph content is actually */ - cp = pp->conn_out_get(skb, pp, ciph, h, 1); + /* The embedded headers contain source and dest in reverse order */ + cp = pp->conn_out_get(skb, pp, &ciph, offset, 1); if (!cp) return NF_ACCEPT; + verdict = NF_DROP; + if (IP_VS_FWD_METHOD(cp) != 0) { IP_VS_ERR("shouldn't reach here, because the box is on the" "half connection in the tun/dr module.\n"); } - /* Now we do real damage to this packet...! */ - /* First change the source IP address, and recalc checksum */ - iph->saddr = cp->vaddr; - ip_send_check(iph); - - /* Now change the *dest* address in the contained IP */ - ciph->daddr = cp->vaddr; - ip_send_check(ciph); - - /* the TCP/UDP dest port - cannot redo check */ - if (IPPROTO_TCP == ciph->protocol || IPPROTO_UDP == ciph->protocol) - h.portp[1] = cp->vport; + /* Ensure the checksum is correct */ + if (skb->ip_summed != CHECKSUM_UNNECESSARY && + ip_vs_checksum_complete(skb, ihl)) { + /* Failed checksum! */ + IP_VS_DBG(1, "Forward ICMP: failed checksum from %d.%d.%d.%d!\n", + NIPQUAD(iph->saddr)); + goto out; + } - /* And finally the ICMP checksum */ - icmph->checksum = 0; - icmph->checksum = ip_compute_csum((unsigned char *) icmph, len); - skb->ip_summed = CHECKSUM_UNNECESSARY; + if (IPPROTO_TCP == ciph.protocol || IPPROTO_UDP == ciph.protocol) + offset += 2 * sizeof(__u16); + if (!ip_vs_make_skb_writable(pskb, offset)) + goto out; + skb = *pskb; + + ip_vs_nat_icmp(skb, pp, cp, 1); /* do the statistics and put it back */ ip_vs_out_stats(cp, skb); - __ip_vs_conn_put(cp); - - IP_VS_DBG_PKT(11, pp, ciph, "Forwarding correct outgoing ICMP"); skb->nfcache |= NFC_IPVS_PROPERTY; + verdict = NF_ACCEPT; - return NF_ACCEPT; + out: + __ip_vs_conn_put(cp); + + return verdict; } +static inline int is_tcp_reset(const struct sk_buff *skb) +{ + struct tcphdr tcph; + + if (skb_copy_bits(skb, skb->nh.iph->ihl * 4, &tcph, sizeof(tcph)) < 0) + return 0; + return tcph.rst; +} /* * It is hooked at the NF_IP_FORWARD chain, used only for VS/NAT. @@ -637,16 +724,15 @@ * rewrite addresses of the packet and send it on its way... */ static unsigned int -ip_vs_out(unsigned int hooknum, struct sk_buff **skb_p, +ip_vs_out(unsigned int hooknum, struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { - struct sk_buff *skb = *skb_p; + struct sk_buff *skb = *pskb; struct iphdr *iph; struct ip_vs_protocol *pp; - union ip_vs_tphdr h; struct ip_vs_conn *cp; - int size, ihl, firstfrag; + int ihl; EnterFunction(11); @@ -655,10 +741,12 @@ iph = skb->nh.iph; if (unlikely(iph->protocol == IPPROTO_ICMP)) { - int related, verdict = ip_vs_out_icmp(skb_p, &related); + int related, verdict = ip_vs_out_icmp(pskb, &related); if (related) return verdict; + skb = *pskb; + iph = skb->nh.iph; } pp = ip_vs_proto_get(iph->protocol); @@ -668,105 +756,75 @@ /* reassemble IP fragments */ if (unlikely(iph->frag_off & __constant_htons(IP_MF|IP_OFFSET) && !pp->dont_defrag)) { - skb = ip_defrag(skb); + skb = ip_vs_gather_frags(skb); if (!skb) return NF_STOLEN; iph = skb->nh.iph; - *skb_p = skb; + *pskb = skb; } - /* make sure that protocol header is available in skb data area, - note that skb data area may be reallocated. */ ihl = iph->ihl << 2; - firstfrag = !(iph->frag_off & __constant_htons(IP_OFFSET)); - /* - * WARNING: we can work with !firstfrag packets, make sure - * each protocol handler checks for firstfrag - */ - if (firstfrag && - !pskb_may_pull(skb, ihl+pp->minhlen)) - return NF_DROP; - iph = skb->nh.iph; - h.raw = (char*) iph + ihl; /* * Check if the packet belongs to an existing entry */ - cp = pp->conn_out_get(skb, pp, iph, h, 0); + cp = pp->conn_out_get(skb, pp, iph, ihl, 0); if (unlikely(!cp)) { if (sysctl_ip_vs_nat_icmp_send && (pp->protocol == IPPROTO_TCP || - pp->protocol == IPPROTO_UDP) && - ip_vs_lookup_real_service(iph->protocol, - iph->saddr, h.portp[0])) { - /* - * Notify the real server: there is no existing - * entry if it is not RST packet or not TCP packet. - */ - if (!h.th->rst || iph->protocol != IPPROTO_TCP) { - icmp_send(skb, ICMP_DEST_UNREACH, - ICMP_PORT_UNREACH, 0); - kfree_skb(skb); - return NF_STOLEN; + pp->protocol == IPPROTO_UDP)) { + __u16 ports[2]; + + if (skb_copy_bits(skb, ihl, ports, sizeof(ports)) < 0) + return NF_ACCEPT; /* Not for me */ + if (ip_vs_lookup_real_service(iph->protocol, + iph->saddr, ports[0])) { + /* + * Notify the real server: there is no + * existing entry if it is not RST + * packet or not TCP packet. + */ + if (iph->protocol != IPPROTO_TCP + || !is_tcp_reset(skb)) { + icmp_send(skb,ICMP_DEST_UNREACH, + ICMP_PORT_UNREACH, 0); + return NF_DROP; + } } } - IP_VS_DBG_PKT(12, pp, iph, + IP_VS_DBG_PKT(12, pp, skb, 0, "packet continues traversal as normal"); - if (!pp->dont_defrag) - ip_send_check(iph); return NF_ACCEPT; } - /* - * If it has ip_vs_app helper, the helper may change the payload, - * so it needs full checksum checking and checksum calculation. - * If not, only the header (addr/port) is changed, so it is fast - * to do incremental checksum update, and let the destination host - * do final checksum checking. - */ - - if (unlikely(cp->app && !pp->slave && skb_is_nonlinear(skb))) { - if (skb_linearize(skb, GFP_ATOMIC) != 0) { - ip_vs_conn_put(cp); - return NF_DROP; - } - iph = skb->nh.iph; - h.raw = (char*) iph + ihl; - } - - size = skb->len - ihl; - IP_VS_DBG(11, "O-pkt: %s size=%d\n", pp->name, size); + IP_VS_DBG_PKT(11, pp, skb, 0, "Outgoing packet"); - /* do TCP/UDP checksum checking if it has application helper */ - if (unlikely(cp->app && pp->csum_check && !pp->slave)) { - if (!pp->csum_check(skb, pp, iph, h, size)) { - ip_vs_conn_put(cp); - return NF_DROP; - } - } - - IP_VS_DBG_PKT(11, pp, iph, "Outgoing packet"); + if (!ip_vs_make_skb_writable(pskb, ihl)) + goto drop; /* mangle the packet */ - iph->saddr = cp->vaddr; - if (pp->snat_handler) { - pp->snat_handler(skb, pp, cp, iph, h, size); - iph = skb->nh.iph; - h.raw = (char*) iph + ihl; - } - ip_send_check(iph); + if (pp->snat_handler && !pp->snat_handler(pskb, pp, cp)) + goto drop; + skb = *pskb; + skb->nh.iph->saddr = cp->vaddr; + ip_send_check(skb->nh.iph); - IP_VS_DBG_PKT(10, pp, iph, "After SNAT"); + IP_VS_DBG_PKT(10, pp, skb, 0, "After SNAT"); ip_vs_out_stats(cp, skb); - ip_vs_set_state(cp, IP_VS_DIR_OUTPUT, iph, h, pp); + ip_vs_set_state(cp, IP_VS_DIR_OUTPUT, skb, pp); ip_vs_conn_put(cp); skb->nfcache |= NFC_IPVS_PROPERTY; LeaveFunction(11); return NF_ACCEPT; + + drop: + ip_vs_conn_put(cp); + kfree_skb(*pskb); + return NF_STOLEN; } @@ -777,198 +835,186 @@ * they are changed by ipchains masquerading code. */ unsigned int -check_for_ip_vs_out(struct sk_buff **skb_p, int (*okfn)(struct sk_buff *)) +check_for_ip_vs_out(struct sk_buff **pskb, int (*okfn)(struct sk_buff *)) { unsigned int ret; - ret = ip_vs_out(NF_IP_FORWARD, skb_p, NULL, NULL, NULL); + ret = ip_vs_out(NF_IP_FORWARD, pskb, NULL, NULL, NULL); if (ret != NF_ACCEPT) { return ret; } else { /* send the packet immediately if it is already mangled by ip_vs_out */ - if ((*skb_p)->nfcache & NFC_IPVS_PROPERTY) { - (*okfn)(*skb_p); + if ((*pskb)->nfcache & NFC_IPVS_PROPERTY) { + (*okfn)(*pskb); return NF_STOLEN; } } return NF_ACCEPT; } - /* * Handle ICMP messages in the outside-to-inside direction (incoming). * Find any that might be relevant, check against existing connections, * forward to the right destination host if relevant. - * Currently handles error types - unreachable, quench, ttl exceeded + * Currently handles error types - unreachable, quench, ttl exceeded. */ -static int ip_vs_in_icmp(struct sk_buff **skb_p, int *related) +static int ip_vs_in_icmp(struct sk_buff **pskb, int *related) { - struct sk_buff *skb = *skb_p; - struct iphdr *iph; - struct icmphdr *icmph; - struct iphdr *ciph; /* The ip header contained within the ICMP */ - unsigned short len; - unsigned short clen, cihl; + struct sk_buff *skb = *pskb; + struct iphdr *iph; + struct icmphdr icmph; + struct iphdr ciph; /* The ip header contained within the ICMP */ struct ip_vs_conn *cp; struct ip_vs_protocol *pp; - union ip_vs_tphdr h; - int rc; + unsigned int offset, ihl, verdict; *related = 1; - if (skb_is_nonlinear(skb)) { - if (skb_linearize(skb, GFP_ATOMIC) != 0) - return NF_DROP; - ip_send_check(skb->nh.iph); + + /* reassemble IP fragments */ + if (skb->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { + skb = ip_vs_gather_frags(skb); + if (!skb) + return NF_STOLEN; + *pskb = skb; } iph = skb->nh.iph; - icmph = (struct icmphdr *)((char *)iph+(iph->ihl<<2)); - len = ntohs(iph->tot_len) - (iph->ihl<<2); - if (len < sizeof(struct icmphdr)) + offset = ihl = iph->ihl * 4; + if (skb_copy_bits(skb, offset, &icmph, sizeof(icmph)) < 0) return NF_DROP; - IP_VS_DBG(12, "icmp in (%d,%d) %u.%u.%u.%u -> %u.%u.%u.%u\n", - icmph->type, ntohs(icmp_id(icmph)), + IP_VS_DBG(12, "Incoming ICMP (%d,%d) %u.%u.%u.%u->%u.%u.%u.%u\n", + icmph.type, ntohs(icmp_id(&icmph)), NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); - if ((icmph->type != ICMP_DEST_UNREACH) && - (icmph->type != ICMP_SOURCE_QUENCH) && - (icmph->type != ICMP_TIME_EXCEEDED)) { + /* + * Work through seeing if this is for us. + * These checks are supposed to be in an order that means easy + * things are checked first to speed up processing.... however + * this means that some packets will manage to get a long way + * down this stack and then be rejected, but that's life. + */ + if ((icmph.type != ICMP_DEST_UNREACH) && + (icmph.type != ICMP_SOURCE_QUENCH) && + (icmph.type != ICMP_TIME_EXCEEDED)) { *related = 0; return NF_ACCEPT; } - /* - * If we get here we have an ICMP error of one of the above 3 types - * Now find the contained IP header - */ - clen = len - sizeof(struct icmphdr); - if (clen < sizeof(struct iphdr)) - return NF_DROP; - ciph = (struct iphdr *) (icmph + 1); - cihl = ciph->ihl << 2; - if (clen < cihl) - return NF_DROP; + /* Now find the contained IP header */ + offset += sizeof(icmph); + if (skb_copy_bits(skb, offset, &ciph, sizeof(ciph)) < 0) + return NF_ACCEPT; /* The packet looks wrong, ignore */ - pp = ip_vs_proto_get(ciph->protocol); + pp = ip_vs_proto_get(ciph.protocol); if (!pp) return NF_ACCEPT; /* Is the embedded protocol header present? */ - if (unlikely(ciph->frag_off & __constant_htons(IP_OFFSET) && - (pp->minhlen || pp->dont_defrag))) + if (unlikely(ciph.frag_off & __constant_htons(IP_OFFSET) && + pp->dont_defrag)) return NF_ACCEPT; - /* We need at least TCP/UDP ports here */ - if (clen < cihl + pp->minhlen_icmp) - return NF_DROP; + IP_VS_DBG_PKT(11, pp, skb, offset, "Checking incoming ICMP for"); - /* Ensure the checksum is correct */ - if (ip_compute_csum((unsigned char *) icmph, len)) { - /* Failed checksum! */ - IP_VS_ERR_RL("incoming ICMP: failed checksum from " - "%d.%d.%d.%d!\n", NIPQUAD(iph->saddr)); - return NF_DROP; - } + offset += ciph.ihl * 4; - h.raw = (char *) ciph + cihl; + /* The embedded headers contain source and dest in reverse order */ + cp = pp->conn_in_get(skb, pp, &ciph, offset, 1); + if (!cp) + return NF_ACCEPT; - IP_VS_DBG_PKT(11, pp, ciph, "Handling incoming ICMP for"); + verdict = NF_DROP; - /* This is pretty much what ip_vs_conn_in_get() does, - except parameters are in the reverse order */ - cp = pp->conn_in_get(skb, pp, ciph, h, 1); - if (cp == NULL) - return NF_ACCEPT; + /* Ensure the checksum is correct */ + if (skb->ip_summed != CHECKSUM_UNNECESSARY && + ip_vs_checksum_complete(skb, ihl)) { + /* Failed checksum! */ + IP_VS_DBG(1, "Incoming ICMP: failed checksum from %d.%d.%d.%d!\n", + NIPQUAD(iph->saddr)); + goto out; + } + /* do the statistics and put it back */ ip_vs_in_stats(cp, skb); - rc = ip_vs_icmp_xmit(skb, cp, pp); + if (IPPROTO_TCP == ciph.protocol || IPPROTO_UDP == ciph.protocol) + offset += 2 * sizeof(__u16); + verdict = ip_vs_icmp_xmit(skb, cp, pp, offset); + /* do not touch skb anymore */ + + out: __ip_vs_conn_put(cp); - return rc; -} + return verdict; +} /* * Check if it's for virtual services, look it up, * and send it on its way... */ static unsigned int -ip_vs_in(unsigned int hooknum, struct sk_buff **skb_p, +ip_vs_in(unsigned int hooknum, struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { - struct sk_buff *skb = *skb_p; - struct iphdr *iph = skb->nh.iph; - struct ip_vs_protocol *pp = ip_vs_proto_get(iph->protocol); - union ip_vs_tphdr h; + struct sk_buff *skb = *pskb; + struct iphdr *iph; + struct ip_vs_protocol *pp; struct ip_vs_conn *cp; - int ihl, ret, restart; - int firstfrag; + int ret, restart; + int ihl; /* * Big tappo: only PACKET_HOST (neither loopback nor mcasts) * ... don't know why 1st test DOES NOT include 2nd (?) */ - if (unlikely(skb->pkt_type != PACKET_HOST || skb->dev == &loopback_dev)) { + if (unlikely(skb->pkt_type != PACKET_HOST + || skb->dev == &loopback_dev || skb->sk)) { IP_VS_DBG(12, "packet type=%d proto=%d daddr=%d.%d.%d.%d ignored\n", skb->pkt_type, - iph->protocol, - NIPQUAD(iph->daddr)); + skb->nh.iph->protocol, + NIPQUAD(skb->nh.iph->daddr)); return NF_ACCEPT; } + iph = skb->nh.iph; if (unlikely(iph->protocol == IPPROTO_ICMP)) { - int related, verdict = ip_vs_in_icmp(skb_p, &related); + int related, verdict = ip_vs_in_icmp(pskb, &related); if (related) return verdict; + skb = *pskb; + iph = skb->nh.iph; } /* Protocol supported? */ + pp = ip_vs_proto_get(iph->protocol); if (unlikely(!pp)) return NF_ACCEPT; - /* make sure that protocol header is available in skb data area, - note that skb data area may be reallocated. */ ihl = iph->ihl << 2; -#if 0 - /* Enable this when not in LOCAL_IN */ - firstfrag = !(iph->frag_off & __constant_htons(IP_OFFSET)); - /* - * WARNING: we can work with !firstfrag packets, make sure - * each protocol handler checks for firstfrag - */ -#else - firstfrag = 1; -#endif - if (firstfrag && - !pskb_may_pull(skb, ihl+pp->minhlen)) - return NF_DROP; - iph = skb->nh.iph; - h.raw = (char*) iph + ihl; /* * Check if the packet belongs to an existing connection entry */ - cp = pp->conn_in_get(skb, pp, iph, h, 0); + cp = pp->conn_in_get(skb, pp, iph, ihl, 0); if (unlikely(!cp)) { int v; - if (!pp->conn_schedule(skb, pp, iph, h, &v, &cp)) { + if (!pp->conn_schedule(skb, pp, &v, &cp)) return v; - } } if (unlikely(!cp)) { /* sorry, all this trouble for a no-hit :) */ - IP_VS_DBG_PKT(12, pp, iph, - "packet continues traversal as normal"); + IP_VS_DBG_PKT(12, pp, skb, 0, + "packet continues traversal as normal"); return NF_ACCEPT; } - IP_VS_DBG_PKT(11, pp, iph, "Incoming packet"); + IP_VS_DBG_PKT(11, pp, skb, 0, "Incoming packet"); /* Check the server status */ if (cp->dest && !(cp->dest->flags & IP_VS_DEST_F_AVAILABLE)) { @@ -986,9 +1032,10 @@ } ip_vs_in_stats(cp, skb); - restart = ip_vs_set_state(cp, IP_VS_DIR_INPUT, iph, h, pp); + restart = ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pp); if (cp->packet_xmit) ret = cp->packet_xmit(skb, cp, pp); + /* do not touch skb anymore */ else { IP_VS_DBG_RL("warning: packet_xmit is null"); ret = NF_ACCEPT; @@ -1011,7 +1058,7 @@ /* * It is hooked at the NF_IP_FORWARD chain, in order to catch ICMP - * packets destined for 0.0.0.0/0. + * related packets destined for 0.0.0.0/0. * When fwmark-based virtual service is used, such as transparent * cache cluster, TCP packets can be marked and routed to ip_vs_in, * but ICMP destined for 0.0.0.0/0 cannot not be easily marked and @@ -1019,25 +1066,16 @@ * and send them to ip_vs_in_icmp. */ static unsigned int -ip_vs_forward_icmp(unsigned int hooknum, struct sk_buff **skb_p, +ip_vs_forward_icmp(unsigned int hooknum, struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { - struct sk_buff *skb = *skb_p; - struct iphdr *iph = skb->nh.iph; int r; - if (iph->protocol != IPPROTO_ICMP) + if ((*pskb)->nh.iph->protocol != IPPROTO_ICMP) return NF_ACCEPT; - if (iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) { - skb = ip_defrag(skb); - if (!skb) - return NF_STOLEN; - *skb_p = skb; - } - - return ip_vs_in_icmp(skb_p, &r); + return ip_vs_in_icmp(pskb, &r); } diff -Nru a/net/ipv4/ipvs/ip_vs_dh.c b/net/ipv4/ipvs/ip_vs_dh.c --- a/net/ipv4/ipvs/ip_vs_dh.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_dh.c Wed Oct 8 12:24:57 2003 @@ -202,10 +202,11 @@ * Destination hashing scheduling */ static struct ip_vs_dest * -ip_vs_dh_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_dh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_dest *dest; struct ip_vs_dh_bucket *tbl; + struct iphdr *iph = skb->nh.iph; IP_VS_DBG(6, "ip_vs_dh_schedule(): Scheduling...\n"); diff -Nru a/net/ipv4/ipvs/ip_vs_ftp.c b/net/ipv4/ipvs/ip_vs_ftp.c --- a/net/ipv4/ipvs/ip_vs_ftp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_ftp.c Wed Oct 8 12:24:57 2003 @@ -87,39 +87,46 @@ __u32 *addr, __u16 *port, char **start, char **end) { - unsigned char p1,p2,p3,p4,p5,p6; + unsigned char p[6]; + int i = 0; - while (data < data_limit) { - if (strnicmp(data, pattern, plen) != 0) { - data++; - continue; + if (data_limit - data < plen) { + /* check if there is partial match */ + if (strnicmp(data, pattern, data_limit - data) == 0) + return -1; + else + return 0; + } + + if (strnicmp(data, pattern, plen) != 0) { + return 0; + } + *start = data + plen; + + for (data = *start; *data != term; data++) { + if (data == data_limit) + return -1; + } + *end = data; + + memset(p, 0, sizeof(p)); + for (data = *start; data != *end; data++) { + if (*data >= '0' && *data <= '9') { + p[i] = p[i]*10 + *data - '0'; + } else if (*data == ',' && i < 5) { + i++; + } else { + /* unexpected character */ + return -1; } - *start = data+plen; - p1 = simple_strtoul(data+plen, &data, 10); - if (*data != ',') - continue; - p2 = simple_strtoul(data+1, &data, 10); - if (*data != ',') - continue; - p3 = simple_strtoul(data+1, &data, 10); - if (*data != ',') - continue; - p4 = simple_strtoul(data+1, &data, 10); - if (*data != ',') - continue; - p5 = simple_strtoul(data+1, &data, 10); - if (*data != ',') - continue; - p6 = simple_strtoul(data+1, &data, 10); - if (*data != term) - continue; - - *end = data; - *addr = (p4<<24) | (p3<<16) | (p2<<8) | p1; - *port = (p6<<8) | p5; - return 1; } - return 0; + + if (i != 5) + return -1; + + *addr = (p[3]<<24) | (p[2]<<16) | (p[1]<<8) | p[0]; + *port = (p[5]<<8) | p[4]; + return 1; } @@ -136,8 +143,8 @@ * "227 Entering Passive Mode (xxx,xxx,xxx,xxx,ppp,ppp)". * xxx,xxx,xxx,xxx is the server address, ppp,ppp is the server port number. */ -static int ip_vs_ftp_out(struct ip_vs_app *app, - struct ip_vs_conn *cp, struct sk_buff *skb) +static int ip_vs_ftp_out(struct ip_vs_app *app, struct ip_vs_conn *cp, + struct sk_buff **pskb, int *diff) { struct iphdr *iph; struct tcphdr *th; @@ -148,24 +155,30 @@ struct ip_vs_conn *n_cp; char buf[24]; /* xxx.xxx.xxx.xxx,ppp,ppp\000 */ unsigned buf_len; - int diff; + int ret; + + *diff = 0; /* Only useful for established sessions */ if (cp->state != IP_VS_TCP_S_ESTABLISHED) + return 1; + + /* Linear packets are much easier to deal with. */ + if (!ip_vs_make_skb_writable(pskb, (*pskb)->len)) return 0; if (cp->app_data == &ip_vs_ftp_pasv) { - iph = skb->nh.iph; + iph = (*pskb)->nh.iph; th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); data = (char *)th + (th->doff << 2); - data_limit = skb->tail; + data_limit = (*pskb)->tail; if (ip_vs_ftp_get_addrport(data, data_limit, SERVER_STRING, sizeof(SERVER_STRING)-1, ')', &from, &port, - &start, &end) == 0) - return 0; + &start, &end) != 1) + return 1; IP_VS_DBG(1-debug, "PASV response (%u.%u.%u.%u:%d) -> " "%u.%u.%u.%u:%d detected\n", @@ -196,29 +209,29 @@ from = n_cp->vaddr; port = n_cp->vport; sprintf(buf,"%d,%d,%d,%d,%d,%d", NIPQUAD(from), - port&255, port>>8&255); + port&255, (port>>8)&255); buf_len = strlen(buf); /* * Calculate required delta-offset to keep TCP happy */ - diff = buf_len - (end-start); + *diff = buf_len - (end-start); - if (diff == 0) { + if (*diff == 0) { /* simply replace it with new passive address */ memcpy(start, buf, buf_len); + ret = 1; } else { - /* fixme: return value isn't checked here */ - ip_vs_skb_replace(skb, GFP_ATOMIC, start, + ret = !ip_vs_skb_replace(*pskb, GFP_ATOMIC, start, end-start, buf, buf_len); } cp->app_data = NULL; ip_vs_tcp_conn_listen(n_cp); ip_vs_conn_put(n_cp); - return diff; + return ret; } - return 0; + return 1; } @@ -233,8 +246,8 @@ * port, so that the active ftp data connection from the server can reach * the client. */ -static int ip_vs_ftp_in(struct ip_vs_app *app, - struct ip_vs_conn *cp, struct sk_buff *skb) +static int ip_vs_ftp_in(struct ip_vs_app *app, struct ip_vs_conn *cp, + struct sk_buff **pskb, int *diff) { struct iphdr *iph; struct tcphdr *th; @@ -244,29 +257,37 @@ __u16 port; struct ip_vs_conn *n_cp; + /* no diff required for incoming packets */ + *diff = 0; + /* Only useful for established sessions */ if (cp->state != IP_VS_TCP_S_ESTABLISHED) + return 1; + + /* Linear packets are much easier to deal with. */ + if (!ip_vs_make_skb_writable(pskb, (*pskb)->len)) return 0; /* * Detecting whether it is passive */ - iph = skb->nh.iph; + iph = (*pskb)->nh.iph; th = (struct tcphdr *)&(((char *)iph)[iph->ihl*4]); /* Since there may be OPTIONS in the TCP packet and the HLEN is the length of the header in 32-bit multiples, it is accurate to calculate data address by th+HLEN*4 */ data = data_start = (char *)th + (th->doff << 2); - data_limit = skb->tail; + data_limit = (*pskb)->tail; - while (data < data_limit) { + while (data <= data_limit - 6) { if (strnicmp(data, "PASV\r\n", 6) == 0) { + /* Passive mode on */ IP_VS_DBG(1-debug, "got PASV at %d of %d\n", data - data_start, data_limit - data_start); cp->app_data = &ip_vs_ftp_pasv; - return 0; + return 1; } data++; } @@ -278,28 +299,28 @@ * then create a new connection entry for the coming data * connection. */ - data = data_start; - data_limit = skb->h.raw + skb->len - 18; - - if (ip_vs_ftp_get_addrport(data, data_limit, + if (ip_vs_ftp_get_addrport(data_start, data_limit, CLIENT_STRING, sizeof(CLIENT_STRING)-1, '\r', &to, &port, - &start, &end) == 0) - return 0; + &start, &end) != 1) + return 1; IP_VS_DBG(1-debug, "PORT %u.%u.%u.%u:%d detected\n", NIPQUAD(to), ntohs(port)); + /* Passive mode off */ + cp->app_data = NULL; + /* * Now update or create a connection entry for it */ IP_VS_DBG(1-debug, "protocol %s %u.%u.%u.%u:%d %u.%u.%u.%u:%d\n", ip_vs_proto_name(iph->protocol), - NIPQUAD(to), ntohs(port), NIPQUAD(iph->daddr), 0); + NIPQUAD(to), ntohs(port), NIPQUAD(cp->vaddr), 0); n_cp = ip_vs_conn_in_get(iph->protocol, to, port, - iph->daddr, htons(ntohs(cp->vport)-1)); + cp->vaddr, htons(ntohs(cp->vport)-1)); if (!n_cp) { n_cp = ip_vs_conn_new(IPPROTO_TCP, to, port, @@ -320,8 +341,7 @@ ip_vs_tcp_conn_listen(n_cp); ip_vs_conn_put(n_cp); - /* no diff required for incoming packets */ - return 0; + return 1; } diff -Nru a/net/ipv4/ipvs/ip_vs_lblc.c b/net/ipv4/ipvs/ip_vs_lblc.c --- a/net/ipv4/ipvs/ip_vs_lblc.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_lblc.c Wed Oct 8 12:24:57 2003 @@ -458,10 +458,11 @@ * The server with weight=0 is quiesced and will not receive any * new connection. */ - list_for_each_entry(least, &svc->destinations, n_list) { - if (least->flags & IP_VS_DEST_F_OVERLOAD) + list_for_each_entry(dest, &svc->destinations, n_list) { + if (dest->flags & IP_VS_DEST_F_OVERLOAD) continue; - if (atomic_read(&least->weight) > 0) { + if (atomic_read(&dest->weight) > 0) { + least = dest; loh = atomic_read(&least->activeconns) * 50 + atomic_read(&least->inactconns); goto nextstage; @@ -473,7 +474,7 @@ * Find the destination with the least load. */ nextstage: - list_for_each_entry(dest, &svc->destinations, n_list) { + list_for_each_entry_continue(dest, &svc->destinations, n_list) { if (dest->flags & IP_VS_DEST_F_OVERLOAD) continue; @@ -522,11 +523,12 @@ * Locality-Based (weighted) Least-Connection scheduling */ static struct ip_vs_dest * -ip_vs_lblc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_lblc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_dest *dest; struct ip_vs_lblc_table *tbl; struct ip_vs_lblc_entry *en; + struct iphdr *iph = skb->nh.iph; IP_VS_DBG(6, "ip_vs_lblc_schedule(): Scheduling...\n"); diff -Nru a/net/ipv4/ipvs/ip_vs_lblcr.c b/net/ipv4/ipvs/ip_vs_lblcr.c --- a/net/ipv4/ipvs/ip_vs_lblcr.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_lblcr.c Wed Oct 8 12:24:57 2003 @@ -711,11 +711,12 @@ * The server with weight=0 is quiesced and will not receive any * new connection. */ - list_for_each_entry(least, &svc->destinations, n_list) { - if (least->flags & IP_VS_DEST_F_OVERLOAD) + list_for_each_entry(dest, &svc->destinations, n_list) { + if (dest->flags & IP_VS_DEST_F_OVERLOAD) continue; - if (atomic_read(&least->weight) > 0) { + if (atomic_read(&dest->weight) > 0) { + least = dest; loh = atomic_read(&least->activeconns) * 50 + atomic_read(&least->inactconns); goto nextstage; @@ -727,7 +728,7 @@ * Find the destination with the least load. */ nextstage: - list_for_each_entry(dest, &svc->destinations, n_list) { + list_for_each_entry_continue(dest, &svc->destinations, n_list) { if (dest->flags & IP_VS_DEST_F_OVERLOAD) continue; @@ -776,11 +777,12 @@ * Locality-Based (weighted) Least-Connection scheduling */ static struct ip_vs_dest * -ip_vs_lblcr_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_lblcr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_dest *dest; struct ip_vs_lblcr_table *tbl; struct ip_vs_lblcr_entry *en; + struct iphdr *iph = skb->nh.iph; IP_VS_DBG(6, "ip_vs_lblcr_schedule(): Scheduling...\n"); diff -Nru a/net/ipv4/ipvs/ip_vs_lc.c b/net/ipv4/ipvs/ip_vs_lc.c --- a/net/ipv4/ipvs/ip_vs_lc.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_lc.c Wed Oct 8 12:24:57 2003 @@ -63,10 +63,10 @@ * Least Connection scheduling */ static struct ip_vs_dest * -ip_vs_lc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_lc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { - struct ip_vs_dest *dest, *least; - unsigned int loh, doh; + struct ip_vs_dest *dest, *least = NULL; + unsigned int loh = 0, doh; IP_VS_DBG(6, "ip_vs_lc_schedule(): Scheduling...\n"); @@ -79,31 +79,18 @@ * served, but no new connection is assigned to the server. */ - list_for_each_entry(least, &svc->destinations, n_list) { - if (least->flags & IP_VS_DEST_F_OVERLOAD) - continue; - if (atomic_read(&least->weight) > 0) { - loh = ip_vs_lc_dest_overhead(least); - goto nextstage; - } - } - return NULL; - - /* - * Find the destination with the least load. - */ - nextstage: list_for_each_entry(dest, &svc->destinations, n_list) { if ((dest->flags & IP_VS_DEST_F_OVERLOAD) || atomic_read(&dest->weight) == 0) continue; doh = ip_vs_lc_dest_overhead(dest); - if (doh < loh) { + if (!least || doh < loh) { least = dest; loh = doh; } } + if (least) IP_VS_DBG(6, "LC: server %u.%u.%u.%u:%u activeconns %d inactconns %d\n", NIPQUAD(least->addr), ntohs(least->port), atomic_read(&least->activeconns), diff -Nru a/net/ipv4/ipvs/ip_vs_nq.c b/net/ipv4/ipvs/ip_vs_nq.c --- a/net/ipv4/ipvs/ip_vs_nq.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_nq.c Wed Oct 8 12:24:57 2003 @@ -79,10 +79,10 @@ * Weighted Least Connection scheduling */ static struct ip_vs_dest * -ip_vs_nq_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_nq_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { - struct ip_vs_dest *dest, *least; - unsigned int loh, doh; + struct ip_vs_dest *dest, *least = NULL; + unsigned int loh = 0, doh; IP_VS_DBG(6, "ip_vs_nq_schedule(): Scheduling...\n"); @@ -99,27 +99,10 @@ * new connections. */ - list_for_each_entry(least, &svc->destinations, n_list) { - if (!(least->flags & IP_VS_DEST_F_OVERLOAD) && - atomic_read(&least->weight) > 0) { - loh = ip_vs_nq_dest_overhead(least); - - /* return the server directly if it is idle */ - if (atomic_read(&least->activeconns) == 0) - goto out; - - goto nextstage; - } - } - return NULL; - - /* - * Find the destination with the least load. - */ - nextstage: list_for_each_entry(dest, &svc->destinations, n_list) { - if (dest->flags & IP_VS_DEST_F_OVERLOAD) + if (dest->flags & IP_VS_DEST_F_OVERLOAD || + !atomic_read(&dest->weight)) continue; doh = ip_vs_nq_dest_overhead(dest); @@ -127,15 +110,20 @@ /* return the server directly if it is idle */ if (atomic_read(&dest->activeconns) == 0) { least = dest; + loh = doh; goto out; } - if (loh * atomic_read(&dest->weight) > - doh * atomic_read(&least->weight)) { + if (!least || + (loh * atomic_read(&dest->weight) > + doh * atomic_read(&least->weight))) { least = dest; loh = doh; } } + + if (!least) + return NULL; out: IP_VS_DBG(6, "NQ: server %u.%u.%u.%u:%u " diff -Nru a/net/ipv4/ipvs/ip_vs_proto.c b/net/ipv4/ipvs/ip_vs_proto.c --- a/net/ipv4/ipvs/ip_vs_proto.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/ipvs/ip_vs_proto.c Wed Oct 8 12:24:56 2003 @@ -164,22 +164,33 @@ void -tcpudp_debug_packet(struct ip_vs_protocol *pp, struct iphdr *iph, char *msg) +ip_vs_tcpudp_debug_packet(struct ip_vs_protocol *pp, + const struct sk_buff *skb, + int offset, + const char *msg) { char buf[128]; - union ip_vs_tphdr h; + __u16 ports[2]; + struct iphdr iph; - h.raw = (char *) iph + iph->ihl * 4; - if (iph->frag_off & __constant_htons(IP_OFFSET)) + if (skb_copy_bits(skb, offset, &iph, sizeof(iph)) < 0) + sprintf(buf, "%s TRUNCATED", pp->name); + else if (iph.frag_off & __constant_htons(IP_OFFSET)) sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u frag", - pp->name, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); + pp->name, NIPQUAD(iph.saddr), + NIPQUAD(iph.daddr)); + else if (skb_copy_bits(skb, offset + iph.ihl*4, ports, sizeof(ports)) < 0) + sprintf(buf, "%s TRUNCATED %u.%u.%u.%u->%u.%u.%u.%u", + pp->name, + NIPQUAD(iph.saddr), + NIPQUAD(iph.daddr)); else sprintf(buf, "%s %u.%u.%u.%u:%u->%u.%u.%u.%u:%u", pp->name, - NIPQUAD(iph->saddr), - ntohs(h.portp[0]), - NIPQUAD(iph->daddr), - ntohs(h.portp[1])); + NIPQUAD(iph.saddr), + ntohs(ports[0]), + NIPQUAD(iph.daddr), + ntohs(ports[1])); printk(KERN_DEBUG "IPVS: %s: %s\n", msg, buf); } diff -Nru a/net/ipv4/ipvs/ip_vs_proto_ah.c b/net/ipv4/ipvs/ip_vs_proto_ah.c --- a/net/ipv4/ipvs/ip_vs_proto_ah.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_proto_ah.c Wed Oct 8 12:24:57 2003 @@ -44,8 +44,11 @@ static struct ip_vs_conn * -ah_conn_in_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +ah_conn_in_get(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse) { struct ip_vs_conn *cp; @@ -66,11 +69,11 @@ if (!cp) { /* * We are not sure if the packet is from our - * service, so the caller should check skip_nonexisting + * service, so our conn_schedule hook should return NF_ACCEPT */ IP_VS_DBG(12, "Unknown ISAKMP entry for outin packet " "%s%s %u.%u.%u.%u->%u.%u.%u.%u\n", - inverse?"ICMP+":"", + inverse ? "ICMP+" : "", pp->name, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); @@ -81,8 +84,8 @@ static struct ip_vs_conn * -ah_conn_out_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +ah_conn_out_get(const struct sk_buff *skb, struct ip_vs_protocol *pp, + const struct iphdr *iph, unsigned int proto_off, int inverse) { struct ip_vs_conn *cp; @@ -101,11 +104,6 @@ } if (!cp) { - /* - * We are not sure if the packet is from our - * service, so the caller should check skip_nonexisting - * or our conn_schedule hook should return NF_ACCEPT - */ IP_VS_DBG(12, "Unknown ISAKMP entry for inout packet " "%s%s %u.%u.%u.%u->%u.%u.%u.%u\n", inverse ? "ICMP+" : "", @@ -119,8 +117,8 @@ static int -ah_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, +ah_conn_schedule(struct sk_buff *skb, + struct ip_vs_protocol *pp, int *verdict, struct ip_vs_conn **cpp) { /* @@ -132,12 +130,18 @@ static void -ah_debug_packet(struct ip_vs_protocol *pp, struct iphdr *iph, char *msg) +ah_debug_packet(struct ip_vs_protocol *pp, const struct sk_buff *skb, + int offset, const char *msg) { char buf[256]; + struct iphdr iph; - sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u", - pp->name, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); + if (skb_copy_bits(skb, offset, &iph, sizeof(iph)) < 0) + sprintf(buf, "%s TRUNCATED", pp->name); + else + sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u", + pp->name, NIPQUAD(iph.saddr), + NIPQUAD(iph.daddr)); printk(KERN_DEBUG "IPVS: %s: %s\n", msg, buf); } @@ -158,11 +162,7 @@ struct ip_vs_protocol ip_vs_protocol_ah = { .name = "AH", .protocol = IPPROTO_AH, - .minhlen = 0, - .minhlen_icmp = 0, .dont_defrag = 1, - .skip_nonexisting = 1, - .slave = 1, .init = ah_init, .exit = ah_exit, .conn_schedule = ah_conn_schedule, @@ -170,11 +170,11 @@ .conn_out_get = ah_conn_out_get, .snat_handler = NULL, .dnat_handler = NULL, + .csum_check = NULL, .state_transition = NULL, .register_app = NULL, .unregister_app = NULL, .app_conn_bind = NULL, - .csum_check = NULL, .debug_packet = ah_debug_packet, .timeout_change = NULL, /* ISAKMP */ .set_state_timeout = NULL, diff -Nru a/net/ipv4/ipvs/ip_vs_proto_esp.c b/net/ipv4/ipvs/ip_vs_proto_esp.c --- a/net/ipv4/ipvs/ip_vs_proto_esp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_proto_esp.c Wed Oct 8 12:24:57 2003 @@ -44,8 +44,11 @@ static struct ip_vs_conn * -esp_conn_in_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +esp_conn_in_get(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse) { struct ip_vs_conn *cp; @@ -66,7 +69,7 @@ if (!cp) { /* * We are not sure if the packet is from our - * service, so the caller should check skip_nonexisting + * service, so our conn_schedule hook should return NF_ACCEPT */ IP_VS_DBG(12, "Unknown ISAKMP entry for outin packet " "%s%s %u.%u.%u.%u->%u.%u.%u.%u\n", @@ -81,8 +84,8 @@ static struct ip_vs_conn * -esp_conn_out_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +esp_conn_out_get(const struct sk_buff *skb, struct ip_vs_protocol *pp, + const struct iphdr *iph, unsigned int proto_off, int inverse) { struct ip_vs_conn *cp; @@ -101,14 +104,9 @@ } if (!cp) { - /* - * We are not sure if the packet is from our - * service, so the caller should check skip_nonexisting - * or our conn_schedule hook should return NF_ACCEPT - */ IP_VS_DBG(12, "Unknown ISAKMP entry for inout packet " "%s%s %u.%u.%u.%u->%u.%u.%u.%u\n", - inverse?"ICMP+":"", + inverse ? "ICMP+" : "", pp->name, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); @@ -120,7 +118,6 @@ static int esp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int *verdict, struct ip_vs_conn **cpp) { /* @@ -132,12 +129,18 @@ static void -esp_debug_packet(struct ip_vs_protocol *pp, struct iphdr *iph, char *msg) +esp_debug_packet(struct ip_vs_protocol *pp, const struct sk_buff *skb, + int offset, const char *msg) { char buf[256]; + struct iphdr iph; - sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u", - pp->name, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); + if (skb_copy_bits(skb, offset, &iph, sizeof(iph)) < 0) + sprintf(buf, "%s TRUNCATED", pp->name); + else + sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u", + pp->name, NIPQUAD(iph.saddr), + NIPQUAD(iph.daddr)); printk(KERN_DEBUG "IPVS: %s: %s\n", msg, buf); } @@ -158,11 +161,7 @@ struct ip_vs_protocol ip_vs_protocol_esp = { .name = "ESP", .protocol = IPPROTO_ESP, - .minhlen = 0, - .minhlen_icmp = 0, .dont_defrag = 1, - .skip_nonexisting = 1, - .slave = 1, .init = esp_init, .exit = esp_exit, .conn_schedule = esp_conn_schedule, diff -Nru a/net/ipv4/ipvs/ip_vs_proto_icmp.c b/net/ipv4/ipvs/ip_vs_proto_icmp.c --- a/net/ipv4/ipvs/ip_vs_proto_icmp.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/ipvs/ip_vs_proto_icmp.c Wed Oct 8 12:24:55 2003 @@ -28,8 +28,11 @@ static char * icmp_state_name_table[1] = { "ICMP" }; struct ip_vs_conn * -icmp_conn_in_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +icmp_conn_in_get(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse) { #if 0 struct ip_vs_conn *cp; @@ -52,8 +55,11 @@ } struct ip_vs_conn * -icmp_conn_out_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +icmp_conn_out_get(const struct sk_buff *skb, + struct ip_vs_protocol *pp, + const struct iphdr *iph, + unsigned int proto_off, + int inverse) { #if 0 struct ip_vs_conn *cp; @@ -76,7 +82,6 @@ static int icmp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int *verdict, struct ip_vs_conn **cpp) { *verdict = NF_ACCEPT; @@ -84,41 +89,51 @@ } static int -icmp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int size) +icmp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp) { - if (!(iph->frag_off & __constant_htons(IP_OFFSET))) { - if (ip_compute_csum(h.raw, size)) { - IP_VS_DBG_RL_PKT(0, pp, iph, "Failed checksum for"); - return 0; + if (!(skb->nh.iph->frag_off & __constant_htons(IP_OFFSET))) { + if (skb->ip_summed != CHECKSUM_UNNECESSARY) { + if (ip_vs_checksum_complete(skb, skb->nh.iph->ihl * 4)) { + IP_VS_DBG_RL_PKT(0, pp, skb, 0, "Failed checksum for"); + return 0; + } } } return 1; - } static void -icmp_debug_packet(struct ip_vs_protocol *pp, struct iphdr *iph, char *msg) +icmp_debug_packet(struct ip_vs_protocol *pp, + const struct sk_buff *skb, + int offset, + const char *msg) { char buf[256]; - union ip_vs_tphdr h; + struct iphdr iph; + struct icmphdr icmph; - h.raw = (char *) iph + iph->ihl * 4; - if (iph->frag_off & __constant_htons(IP_OFFSET)) + if (skb_copy_bits(skb, offset, &iph, sizeof(iph)) < 0) + sprintf(buf, "%s TRUNCATED", pp->name); + else if (iph.frag_off & __constant_htons(IP_OFFSET)) sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u frag", - pp->name, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr)); + pp->name, NIPQUAD(iph.saddr), + NIPQUAD(iph.daddr)); + else if (skb_copy_bits(skb, offset + iph.ihl*4, &icmph, sizeof(icmph)) < 0) + sprintf(buf, "%s TRUNCATED to %u bytes\n", + pp->name, skb->len - offset); else sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u T:%d C:%d", - pp->name, NIPQUAD(iph->saddr), NIPQUAD(iph->daddr), - h.icmph->type, h.icmph->code); + pp->name, NIPQUAD(iph.saddr), + NIPQUAD(iph.daddr), + icmph.type, icmph.code); printk(KERN_DEBUG "IPVS: %s: %s\n", msg, buf); } static int -icmp_state_transition(struct ip_vs_conn *cp, - int direction, struct iphdr *iph, - union ip_vs_tphdr h, struct ip_vs_protocol *pp) +icmp_state_transition(struct ip_vs_conn *cp, int direction, + const struct sk_buff *skb, + struct ip_vs_protocol *pp) { cp->timeout = pp->timeout_table[IP_VS_ICMP_S_NORMAL]; return 1; @@ -148,11 +163,7 @@ struct ip_vs_protocol ip_vs_protocol_icmp = { .name = "ICMP", .protocol = IPPROTO_ICMP, - .minhlen = sizeof(struct icmphdr), - .minhlen_icmp = 8, .dont_defrag = 0, - .skip_nonexisting = 0, - .slave = 0, .init = icmp_init, .exit = icmp_exit, .conn_schedule = icmp_conn_schedule, diff -Nru a/net/ipv4/ipvs/ip_vs_proto_tcp.c b/net/ipv4/ipvs/ip_vs_proto_tcp.c --- a/net/ipv4/ipvs/ip_vs_proto_tcp.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/ipvs/ip_vs_proto_tcp.c Wed Oct 8 12:24:56 2003 @@ -21,52 +21,68 @@ #include /* for tcphdr */ #include #include /* for csum_tcpudp_magic */ -#include +#include #include static struct ip_vs_conn * -tcp_conn_in_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +tcp_conn_in_get(const struct sk_buff *skb, struct ip_vs_protocol *pp, + const struct iphdr *iph, unsigned int proto_off, int inverse) { + __u16 ports[2]; + + if (skb_copy_bits(skb, proto_off, ports, sizeof(ports)) < 0) + return NULL; + if (likely(!inverse)) { return ip_vs_conn_in_get(iph->protocol, - iph->saddr, h.th->source, - iph->daddr, h.th->dest); + iph->saddr, ports[0], + iph->daddr, ports[1]); } else { return ip_vs_conn_in_get(iph->protocol, - iph->daddr, h.th->dest, - iph->saddr, h.th->source); + iph->daddr, ports[1], + iph->saddr, ports[0]); } } static struct ip_vs_conn * -tcp_conn_out_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +tcp_conn_out_get(const struct sk_buff *skb, struct ip_vs_protocol *pp, + const struct iphdr *iph, unsigned int proto_off, int inverse) { + __u16 ports[2]; + + if (skb_copy_bits(skb, proto_off, ports, sizeof(ports)) < 0) + return NULL; + if (likely(!inverse)) { return ip_vs_conn_out_get(iph->protocol, - iph->saddr, h.th->source, - iph->daddr, h.th->dest); + iph->saddr, ports[0], + iph->daddr, ports[1]); } else { return ip_vs_conn_out_get(iph->protocol, - iph->daddr, h.th->dest, - iph->saddr, h.th->source); + iph->daddr, ports[1], + iph->saddr, ports[0]); } } static int -tcp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, - int *verdict, struct ip_vs_conn **cpp) +tcp_conn_schedule(struct sk_buff *skb, + struct ip_vs_protocol *pp, + int *verdict, struct ip_vs_conn **cpp) { struct ip_vs_service *svc; + struct tcphdr tcph; + + if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0) { + *verdict = NF_DROP; + return 0; + } - if (h.th->syn && - (svc = ip_vs_service_get(skb->nfmark, iph->protocol, - iph->daddr, h.portp[1]))) { + if (tcph.syn && + (svc = ip_vs_service_get(skb->nfmark, skb->nh.iph->protocol, + skb->nh.iph->daddr, tcph.dest))) { if (ip_vs_todrop()) { /* * It seems that we are very loaded. @@ -81,9 +97,9 @@ * Let the virtual server select a real server for the * incoming connection, and create a connection entry. */ - *cpp = ip_vs_schedule(svc, iph); + *cpp = ip_vs_schedule(svc, skb); if (!*cpp) { - *verdict = ip_vs_leave(svc, skb, pp, h); + *verdict = ip_vs_leave(svc, skb, pp); return 0; } ip_vs_service_put(svc); @@ -93,111 +109,128 @@ static inline void -tcp_fast_csum_update(union ip_vs_tphdr *h, u32 oldip, u32 newip, +tcp_fast_csum_update(struct tcphdr *tcph, u32 oldip, u32 newip, u16 oldport, u16 newport) { - h->th->check = + tcph->check = ip_vs_check_diff(~oldip, newip, ip_vs_check_diff(oldport ^ 0xFFFF, - newport, h->th->check)); + newport, tcph->check)); } static int -tcp_snat_handler(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct ip_vs_conn *cp, - struct iphdr *iph, union ip_vs_tphdr h, int size) -{ - int ihl = (char *) h.raw - (char *) iph; - - /* We are sure that we work on first fragment */ - - h.th->source = cp->vport; - - /* Call application helper if needed */ - if (ip_vs_app_pkt_out(cp, skb) != 0) { - /* skb data has probably changed, update pointers */ - iph = skb->nh.iph; - h.raw = (char*)iph + ihl; - size = skb->len - ihl; +tcp_snat_handler(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp) +{ + struct tcphdr *tcph; + unsigned int tcphoff = (*pskb)->nh.iph->ihl * 4; + + /* csum_check requires unshared skb */ + if (!ip_vs_make_skb_writable(pskb, tcphoff+sizeof(*tcph))) + return 0; + + if (unlikely(cp->app != NULL)) { + /* Some checks before mangling */ + if (pp->csum_check && !pp->csum_check(*pskb, pp)) + return 0; + + /* Call application helper if needed */ + if (!ip_vs_app_pkt_out(cp, pskb)) + return 0; } + tcph = (void *)(*pskb)->nh.iph + tcphoff; + tcph->source = cp->vport; + /* Adjust TCP checksums */ if (!cp->app) { /* Only port and addr are changed, do fast csum update */ - tcp_fast_csum_update(&h, cp->daddr, cp->vaddr, + tcp_fast_csum_update(tcph, cp->daddr, cp->vaddr, cp->dport, cp->vport); - if (skb->ip_summed == CHECKSUM_HW) - skb->ip_summed = CHECKSUM_NONE; + if ((*pskb)->ip_summed == CHECKSUM_HW) + (*pskb)->ip_summed = CHECKSUM_NONE; } else { /* full checksum calculation */ - h.th->check = 0; - skb->csum = csum_partial(h.raw, size, 0); - h.th->check = csum_tcpudp_magic(iph->saddr, iph->daddr, - size, iph->protocol, - skb->csum); + tcph->check = 0; + (*pskb)->csum = skb_checksum(*pskb, tcphoff, + (*pskb)->len - tcphoff, 0); + tcph->check = csum_tcpudp_magic(cp->vaddr, cp->caddr, + (*pskb)->len - tcphoff, + cp->protocol, + (*pskb)->csum); IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%d)\n", - pp->name, h.th->check, - (char*)&(h.th->check) - (char*)h.raw); + pp->name, tcph->check, + (char*)&(tcph->check) - (char*)tcph); } return 1; } static int -tcp_dnat_handler(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct ip_vs_conn *cp, - struct iphdr *iph, union ip_vs_tphdr h, int size) +tcp_dnat_handler(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp) { - int ihl = (char *) h.raw - (char *) iph; + struct tcphdr *tcph; + unsigned int tcphoff = (*pskb)->nh.iph->ihl * 4; - /* We are sure that we work on first fragment */ + /* csum_check requires unshared skb */ + if (!ip_vs_make_skb_writable(pskb, tcphoff+sizeof(*tcph))) + return 0; - h.th->dest = cp->dport; + if (unlikely(cp->app != NULL)) { + /* Some checks before mangling */ + if (pp->csum_check && !pp->csum_check(*pskb, pp)) + return 0; - /* - * Attempt ip_vs_app call. - * It will fix ip_vs_conn and iph ack_seq stuff - */ - if (ip_vs_app_pkt_in(cp, skb) != 0) { - /* skb data has probably changed, update pointers */ - iph = skb->nh.iph; - h.raw = (char*) iph + ihl; - size = skb->len - ihl; + /* + * Attempt ip_vs_app call. + * It will fix ip_vs_conn and iph ack_seq stuff + */ + if (!ip_vs_app_pkt_in(cp, pskb)) + return 0; } + tcph = (void *)(*pskb)->nh.iph + tcphoff; + tcph->dest = cp->dport; + /* - * Adjust TCP/UDP checksums + * Adjust TCP checksums */ if (!cp->app) { /* Only port and addr are changed, do fast csum update */ - tcp_fast_csum_update(&h, cp->vaddr, cp->daddr, + tcp_fast_csum_update(tcph, cp->vaddr, cp->daddr, cp->vport, cp->dport); - if (skb->ip_summed == CHECKSUM_HW) - skb->ip_summed = CHECKSUM_NONE; + if ((*pskb)->ip_summed == CHECKSUM_HW) + (*pskb)->ip_summed = CHECKSUM_NONE; } else { /* full checksum calculation */ - h.th->check = 0; - h.th->check = csum_tcpudp_magic(iph->saddr, iph->daddr, - size, iph->protocol, - csum_partial(h.raw, size, 0)); - skb->ip_summed = CHECKSUM_UNNECESSARY; + tcph->check = 0; + (*pskb)->csum = skb_checksum(*pskb, tcphoff, + (*pskb)->len - tcphoff, 0); + tcph->check = csum_tcpudp_magic(cp->caddr, cp->daddr, + (*pskb)->len - tcphoff, + cp->protocol, + (*pskb)->csum); + (*pskb)->ip_summed = CHECKSUM_UNNECESSARY; } return 1; } static int -tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int size) +tcp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp) { + unsigned int tcphoff = skb->nh.iph->ihl*4; + switch (skb->ip_summed) { case CHECKSUM_NONE: - skb->csum = csum_partial(h.raw, size, 0); + skb->csum = skb_checksum(skb, tcphoff, skb->len - tcphoff, 0); case CHECKSUM_HW: - if (csum_tcpudp_magic(iph->saddr, iph->daddr, size, - iph->protocol, skb->csum)) { - IP_VS_DBG_RL_PKT(0, pp, iph, + if (csum_tcpudp_magic(skb->nh.iph->saddr, skb->nh.iph->daddr, + skb->len - tcphoff, + skb->nh.iph->protocol, skb->csum)) { + IP_VS_DBG_RL_PKT(0, pp, skb, 0, "Failed checksum for"); return 0; } @@ -383,10 +416,9 @@ static inline void set_tcp_state(struct ip_vs_protocol *pp, struct ip_vs_conn *cp, - int direction, union ip_vs_tphdr h) + int direction, struct tcphdr *th) { int state_idx; - struct tcphdr *th = h.th; int new_state = IP_VS_TCP_S_CLOSE; int state_off = tcp_state_off[direction]; @@ -448,12 +480,17 @@ * Handle state transitions */ static int -tcp_state_transition(struct ip_vs_conn *cp, - int direction, struct iphdr *iph, - union ip_vs_tphdr h, struct ip_vs_protocol *pp) +tcp_state_transition(struct ip_vs_conn *cp, int direction, + const struct sk_buff *skb, + struct ip_vs_protocol *pp) { + struct tcphdr tcph; + + if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &tcph, sizeof(tcph)) < 0) + return 0; + spin_lock(&cp->lock); - set_tcp_state(pp, cp, direction, h); + set_tcp_state(pp, cp, direction, &tcph); spin_unlock(&cp->lock); return 1; @@ -574,17 +611,10 @@ } -extern void -tcpudp_debug_packet(struct ip_vs_protocol *pp, struct iphdr *iph, char *msg); - struct ip_vs_protocol ip_vs_protocol_tcp = { .name = "TCP", .protocol = IPPROTO_TCP, - .minhlen = sizeof(struct tcphdr), - .minhlen_icmp = 8, .dont_defrag = 0, - .skip_nonexisting = 0, - .slave = 0, .appcnt = ATOMIC_INIT(0), .init = tcp_init, .exit = tcp_exit, @@ -599,7 +629,7 @@ .state_name = tcp_state_name, .state_transition = tcp_state_transition, .app_conn_bind = tcp_app_conn_bind, - .debug_packet = tcpudp_debug_packet, + .debug_packet = ip_vs_tcpudp_debug_packet, .timeout_change = tcp_timeout_change, .set_state_timeout = tcp_set_state_timeout, }; diff -Nru a/net/ipv4/ipvs/ip_vs_proto_udp.c b/net/ipv4/ipvs/ip_vs_proto_udp.c --- a/net/ipv4/ipvs/ip_vs_proto_udp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_proto_udp.c Wed Oct 8 12:24:57 2003 @@ -16,25 +16,29 @@ */ #include -#include +#include #include static struct ip_vs_conn * -udp_conn_in_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +udp_conn_in_get(const struct sk_buff *skb, struct ip_vs_protocol *pp, + const struct iphdr *iph, unsigned int proto_off, int inverse) { struct ip_vs_conn *cp; + __u16 ports[2]; + + if (skb_copy_bits(skb, proto_off, ports, sizeof(ports)) < 0) + return NULL; if (likely(!inverse)) { cp = ip_vs_conn_in_get(iph->protocol, - iph->saddr, h.portp[0], - iph->daddr, h.portp[1]); + iph->saddr, ports[0], + iph->daddr, ports[1]); } else { cp = ip_vs_conn_in_get(iph->protocol, - iph->daddr, h.portp[1], - iph->saddr, h.portp[0]); + iph->daddr, ports[1], + iph->saddr, ports[0]); } return cp; @@ -42,19 +46,23 @@ static struct ip_vs_conn * -udp_conn_out_get(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int inverse) +udp_conn_out_get(const struct sk_buff *skb, struct ip_vs_protocol *pp, + const struct iphdr *iph, unsigned int proto_off, int inverse) { struct ip_vs_conn *cp; + __u16 ports[2]; + + if (skb_copy_bits(skb, skb->nh.iph->ihl*4, ports, sizeof(ports)) < 0) + return NULL; if (likely(!inverse)) { cp = ip_vs_conn_out_get(iph->protocol, - iph->saddr, h.portp[0], - iph->daddr, h.portp[1]); + iph->saddr, ports[0], + iph->daddr, ports[1]); } else { cp = ip_vs_conn_out_get(iph->protocol, - iph->daddr, h.portp[1], - iph->saddr, h.portp[0]); + iph->daddr, ports[1], + iph->saddr, ports[0]); } return cp; @@ -63,13 +71,18 @@ static int udp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int *verdict, struct ip_vs_conn **cpp) { struct ip_vs_service *svc; + struct udphdr udph; - if ((svc = ip_vs_service_get(skb->nfmark, iph->protocol, - iph->daddr, h.portp[1]))) { + if (skb_copy_bits(skb, skb->nh.iph->ihl*4, &udph, sizeof(udph)) < 0) { + *verdict = NF_DROP; + return 0; + } + + if ((svc = ip_vs_service_get(skb->nfmark, skb->nh.iph->protocol, + skb->nh.iph->daddr, udph.dest))) { if (ip_vs_todrop()) { /* * It seems that we are very loaded. @@ -84,9 +97,9 @@ * Let the virtual server select a real server for the * incoming connection, and create a connection entry. */ - *cpp = ip_vs_schedule(svc, iph); + *cpp = ip_vs_schedule(svc, skb); if (!*cpp) { - *verdict = ip_vs_leave(svc, skb, pp, h); + *verdict = ip_vs_leave(svc, skb, pp); return 0; } ip_vs_service_put(svc); @@ -96,121 +109,145 @@ static inline void -udp_fast_csum_update(union ip_vs_tphdr *h, u32 oldip, u32 newip, +udp_fast_csum_update(struct udphdr *uhdr, u32 oldip, u32 newip, u16 oldport, u16 newport) { - h->uh->check = + uhdr->check = ip_vs_check_diff(~oldip, newip, ip_vs_check_diff(oldport ^ 0xFFFF, - newport, h->uh->check)); - if (!h->uh->check) - h->uh->check = 0xFFFF; + newport, uhdr->check)); + if (!uhdr->check) + uhdr->check = 0xFFFF; } static int -udp_snat_handler(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct ip_vs_conn *cp, - struct iphdr *iph, union ip_vs_tphdr h, int size) +udp_snat_handler(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp) { - int ihl = (char *) h.raw - (char *) iph; + struct udphdr *udph; + unsigned int udphoff = (*pskb)->nh.iph->ihl * 4; - /* We are sure that we work on first fragment */ + /* csum_check requires unshared skb */ + if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph))) + return 0; - h.portp[0] = cp->vport; + if (unlikely(cp->app != NULL)) { + /* Some checks before mangling */ + if (pp->csum_check && !pp->csum_check(*pskb, pp)) + return 0; - /* - * Call application helper if needed - */ - if (ip_vs_app_pkt_out(cp, skb) != 0) { - /* skb data has probably changed, update pointers */ - iph = skb->nh.iph; - h.raw = (char*)iph + ihl; - size = skb->len - ihl; + /* + * Call application helper if needed + */ + if (!ip_vs_app_pkt_out(cp, pskb)) + return 0; } + udph = (void *)(*pskb)->nh.iph + udphoff; + udph->source = cp->vport; + /* * Adjust UDP checksums */ - if (!cp->app && (h.uh->check != 0)) { + if (!cp->app && (udph->check != 0)) { /* Only port and addr are changed, do fast csum update */ - udp_fast_csum_update(&h, cp->daddr, cp->vaddr, + udp_fast_csum_update(udph, cp->daddr, cp->vaddr, cp->dport, cp->vport); - if (skb->ip_summed == CHECKSUM_HW) - skb->ip_summed = CHECKSUM_NONE; + if ((*pskb)->ip_summed == CHECKSUM_HW) + (*pskb)->ip_summed = CHECKSUM_NONE; } else { /* full checksum calculation */ - h.uh->check = 0; - skb->csum = csum_partial(h.raw, size, 0); - h.uh->check = csum_tcpudp_magic(iph->saddr, iph->daddr, - size, iph->protocol, - skb->csum); - if (h.uh->check == 0) - h.uh->check = 0xFFFF; + udph->check = 0; + (*pskb)->csum = skb_checksum(*pskb, udphoff, + (*pskb)->len - udphoff, 0); + udph->check = csum_tcpudp_magic(cp->vaddr, cp->caddr, + (*pskb)->len - udphoff, + cp->protocol, + (*pskb)->csum); + if (udph->check == 0) + udph->check = 0xFFFF; IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%d)\n", - pp->name, h.uh->check, - (char*)&(h.uh->check) - (char*)h.raw); + pp->name, udph->check, + (char*)&(udph->check) - (char*)udph); } return 1; } static int -udp_dnat_handler(struct sk_buff *skb, - struct ip_vs_protocol *pp, struct ip_vs_conn *cp, - struct iphdr *iph, union ip_vs_tphdr h, int size) +udp_dnat_handler(struct sk_buff **pskb, + struct ip_vs_protocol *pp, struct ip_vs_conn *cp) { - int ihl = (char *) h.raw - (char *) iph; + struct udphdr *udph; + unsigned int udphoff = (*pskb)->nh.iph->ihl * 4; - /* We are sure that we work on first fragment */ + /* csum_check requires unshared skb */ + if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph))) + return 0; - h.portp[1] = cp->dport; + if (unlikely(cp->app != NULL)) { + /* Some checks before mangling */ + if (pp->csum_check && !pp->csum_check(*pskb, pp)) + return 0; - /* - * Attempt ip_vs_app call. - * will fix ip_vs_conn and iph ack_seq stuff - */ - if (ip_vs_app_pkt_in(cp, skb) != 0) { - /* skb data has probably changed, update pointers */ - iph = skb->nh.iph; - h.raw = (char*) iph + ihl; - size = skb->len - ihl; + /* + * Attempt ip_vs_app call. + * It will fix ip_vs_conn + */ + if (!ip_vs_app_pkt_in(cp, pskb)) + return 0; } + udph = (void *)(*pskb)->nh.iph + udphoff; + udph->dest = cp->dport; + /* * Adjust UDP checksums */ - if (!cp->app && (h.uh->check != 0)) { + if (!cp->app && (udph->check != 0)) { /* Only port and addr are changed, do fast csum update */ - udp_fast_csum_update(&h, cp->vaddr, cp->daddr, + udp_fast_csum_update(udph, cp->vaddr, cp->daddr, cp->vport, cp->dport); - if (skb->ip_summed == CHECKSUM_HW) - skb->ip_summed = CHECKSUM_NONE; + if ((*pskb)->ip_summed == CHECKSUM_HW) + (*pskb)->ip_summed = CHECKSUM_NONE; } else { /* full checksum calculation */ - h.uh->check = 0; - h.uh->check = csum_tcpudp_magic(iph->saddr, iph->daddr, - size, iph->protocol, - csum_partial(h.raw, size, 0)); - if (h.uh->check == 0) - h.uh->check = 0xFFFF; - skb->ip_summed = CHECKSUM_UNNECESSARY; + udph->check = 0; + (*pskb)->csum = skb_checksum(*pskb, udphoff, + (*pskb)->len - udphoff, 0); + udph->check = csum_tcpudp_magic(cp->caddr, cp->daddr, + (*pskb)->len - udphoff, + cp->protocol, + (*pskb)->csum); + if (udph->check == 0) + udph->check = 0xFFFF; + (*pskb)->ip_summed = CHECKSUM_UNNECESSARY; } return 1; } static int -udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp, - struct iphdr *iph, union ip_vs_tphdr h, int size) +udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp) { - if (h.uh->check != 0) { + struct udphdr udph; + unsigned int udphoff = skb->nh.iph->ihl*4; + + if (skb_copy_bits(skb, udphoff, &udph, sizeof(udph)) < 0) + return 0; + + if (udph.check != 0) { switch (skb->ip_summed) { case CHECKSUM_NONE: - skb->csum = csum_partial(h.raw, size, 0); + skb->csum = skb_checksum(skb, udphoff, + skb->len - udphoff, 0); case CHECKSUM_HW: - if (csum_tcpudp_magic(iph->saddr, iph->daddr, size, - iph->protocol, skb->csum)) { - IP_VS_DBG_RL_PKT(0, pp, iph, + if (csum_tcpudp_magic(skb->nh.iph->saddr, + skb->nh.iph->daddr, + skb->len - udphoff, + skb->nh.iph->protocol, + skb->csum)) { + IP_VS_DBG_RL_PKT(0, pp, skb, 0, "Failed checksum for"); return 0; } @@ -342,9 +379,9 @@ } static int -udp_state_transition(struct ip_vs_conn *cp, - int direction, struct iphdr *iph, - union ip_vs_tphdr h, struct ip_vs_protocol *pp) +udp_state_transition(struct ip_vs_conn *cp, int direction, + const struct sk_buff *skb, + struct ip_vs_protocol *pp) { cp->timeout = pp->timeout_table[IP_VS_UDP_S_NORMAL]; return 1; @@ -361,17 +398,10 @@ } -extern void -tcpudp_debug_packet(struct ip_vs_protocol *pp, struct iphdr *iph, char *msg); - struct ip_vs_protocol ip_vs_protocol_udp = { .name = "UDP", .protocol = IPPROTO_UDP, - .minhlen = sizeof(struct udphdr), - .minhlen_icmp = 8, .dont_defrag = 0, - .skip_nonexisting = 0, - .slave = 0, .init = udp_init, .exit = udp_exit, .conn_schedule = udp_conn_schedule, @@ -385,7 +415,7 @@ .register_app = udp_register_app, .unregister_app = udp_unregister_app, .app_conn_bind = udp_app_conn_bind, - .debug_packet = tcpudp_debug_packet, + .debug_packet = ip_vs_tcpudp_debug_packet, .timeout_change = NULL, .set_state_timeout = udp_set_state_timeout, }; diff -Nru a/net/ipv4/ipvs/ip_vs_rr.c b/net/ipv4/ipvs/ip_vs_rr.c --- a/net/ipv4/ipvs/ip_vs_rr.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/ipvs/ip_vs_rr.c Wed Oct 8 12:24:56 2003 @@ -55,7 +55,7 @@ * Round-Robin Scheduling */ static struct ip_vs_dest * -ip_vs_rr_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_rr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct list_head *p, *q; struct ip_vs_dest *dest; diff -Nru a/net/ipv4/ipvs/ip_vs_sed.c b/net/ipv4/ipvs/ip_vs_sed.c --- a/net/ipv4/ipvs/ip_vs_sed.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_sed.c Wed Oct 8 12:24:57 2003 @@ -83,7 +83,7 @@ * Weighted Least Connection scheduling */ static struct ip_vs_dest * -ip_vs_sed_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_sed_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_dest *dest, *least; unsigned int loh, doh; @@ -103,9 +103,10 @@ * new connections. */ - list_for_each_entry(least, &svc->destinations, n_list) { - if (!(least->flags & IP_VS_DEST_F_OVERLOAD) && - atomic_read(&least->weight) > 0) { + list_for_each_entry(dest, &svc->destinations, n_list) { + if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) && + atomic_read(&dest->weight) > 0) { + least = dest; loh = ip_vs_sed_dest_overhead(least); goto nextstage; } @@ -116,7 +117,7 @@ * Find the destination with the least load. */ nextstage: - list_for_each_entry(dest, &svc->destinations, n_list) { + list_for_each_entry_continue(dest, &svc->destinations, n_list) { if (dest->flags & IP_VS_DEST_F_OVERLOAD) continue; doh = ip_vs_sed_dest_overhead(dest); diff -Nru a/net/ipv4/ipvs/ip_vs_sh.c b/net/ipv4/ipvs/ip_vs_sh.c --- a/net/ipv4/ipvs/ip_vs_sh.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_sh.c Wed Oct 8 12:24:57 2003 @@ -199,10 +199,11 @@ * Source Hashing scheduling */ static struct ip_vs_dest * -ip_vs_sh_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_sh_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_dest *dest; struct ip_vs_sh_bucket *tbl; + struct iphdr *iph = skb->nh.iph; IP_VS_DBG(6, "ip_vs_sh_schedule(): Scheduling...\n"); diff -Nru a/net/ipv4/ipvs/ip_vs_sync.c b/net/ipv4/ipvs/ip_vs_sync.c --- a/net/ipv4/ipvs/ip_vs_sync.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/ipvs/ip_vs_sync.c Wed Oct 8 12:24:55 2003 @@ -669,7 +669,6 @@ __set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ); - __set_current_state(TASK_RUNNING); } /* clean up the sync_buff queue */ @@ -728,7 +727,6 @@ __set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ); - __set_current_state(TASK_RUNNING); } /* release the sending multicast socket */ diff -Nru a/net/ipv4/ipvs/ip_vs_wlc.c b/net/ipv4/ipvs/ip_vs_wlc.c --- a/net/ipv4/ipvs/ip_vs_wlc.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_wlc.c Wed Oct 8 12:24:57 2003 @@ -71,7 +71,7 @@ * Weighted Least Connection scheduling */ static struct ip_vs_dest * -ip_vs_wlc_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_wlc_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_dest *dest, *least; unsigned int loh, doh; @@ -91,9 +91,10 @@ * new connections. */ - list_for_each_entry(least, &svc->destinations, n_list) { - if (!(least->flags & IP_VS_DEST_F_OVERLOAD) && - atomic_read(&least->weight) > 0) { + list_for_each_entry(dest, &svc->destinations, n_list) { + if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) && + atomic_read(&dest->weight) > 0) { + least = dest; loh = ip_vs_wlc_dest_overhead(least); goto nextstage; } @@ -104,7 +105,7 @@ * Find the destination with the least load. */ nextstage: - list_for_each_entry(dest, &svc->destinations, n_list) { + list_for_each_entry_continue(dest, &svc->destinations, n_list) { if (dest->flags & IP_VS_DEST_F_OVERLOAD) continue; doh = ip_vs_wlc_dest_overhead(dest); diff -Nru a/net/ipv4/ipvs/ip_vs_wrr.c b/net/ipv4/ipvs/ip_vs_wrr.c --- a/net/ipv4/ipvs/ip_vs_wrr.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/ipvs/ip_vs_wrr.c Wed Oct 8 12:24:55 2003 @@ -58,26 +58,18 @@ { struct ip_vs_dest *dest; int weight; - int g = 1; + int g = 0; list_for_each_entry(dest, &svc->destinations, n_list) { weight = atomic_read(&dest->weight); if (weight > 0) { - g = weight; - goto search_gcd; + if (g > 0) + g = gcd(weight, g); + else + g = weight; } } - - return g; - - search_gcd: - list_for_each_entry(dest, &svc->destinations, n_list) { - weight = atomic_read(&dest->weight); - if (weight > 0) - g = gcd(weight, g); - } - - return g; + return g ? g : 1; } @@ -146,7 +138,7 @@ * Weighted Round-Robin Scheduling */ static struct ip_vs_dest * -ip_vs_wrr_schedule(struct ip_vs_service *svc, struct iphdr *iph) +ip_vs_wrr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb) { struct ip_vs_dest *dest; struct ip_vs_wrr_mark *mark = svc->sched_data; diff -Nru a/net/ipv4/ipvs/ip_vs_xmit.c b/net/ipv4/ipvs/ip_vs_xmit.c --- a/net/ipv4/ipvs/ip_vs_xmit.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/ipvs/ip_vs_xmit.c Wed Oct 8 12:24:57 2003 @@ -128,32 +128,11 @@ } -static inline int -ip_vs_skb_cow(struct sk_buff *skb, unsigned int headroom, - struct iphdr **iph_p, unsigned char **t_p) -{ - int delta = (headroom > 16 ? headroom : 16) - skb_headroom(skb); - - if (delta < 0) - delta = 0; - - if (delta ||skb_cloned(skb)) { - if (pskb_expand_head(skb, (delta+15)&~15, 0, GFP_ATOMIC)) - return -ENOMEM; - - /* skb data changed, update pointers */ - *iph_p = skb->nh.iph; - *t_p = (char*) (*iph_p) + (*iph_p)->ihl * 4; - } - return 0; -} - - #define IP_VS_XMIT(skb, rt) \ do { \ - skb->nfcache |= NFC_IPVS_PROPERTY; \ - NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, \ - rt->u.dst.dev, dst_output); \ + (skb)->nfcache |= NFC_IPVS_PROPERTY; \ + NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, (skb), NULL, \ + (rt)->u.dst.dev, dst_output); \ } while (0) @@ -164,6 +143,7 @@ ip_vs_null_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp) { + /* we do not touch skb and do not need pskb ptr */ return NF_ACCEPT; } @@ -188,7 +168,6 @@ .daddr = iph->daddr, .saddr = 0, .tos = RT_TOS(tos), } }, - .proto = iph->protocol, }; EnterFunction(10); @@ -208,21 +187,23 @@ goto tx_error; } - if (skb_is_nonlinear(skb) && skb->len <= mtu) - ip_send_check(iph); - - if (unlikely(skb_headroom(skb) < rt->u.dst.dev->hard_header_len)) { - if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) { - ip_rt_put(rt); - IP_VS_ERR_RL("ip_vs_bypass_xmit(): no memory\n"); - goto tx_error; - } + /* + * Call ip_send_check because we are not sure it is called + * after ip_defrag. Is copy-on-write needed? + */ + if (unlikely((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)) { + ip_rt_put(rt); + return NF_STOLEN; } + ip_send_check(skb->nh.iph); /* drop old route */ dst_release(skb->dst); skb->dst = &rt->u.dst; + /* Another hack: avoid icmp_send in ip_fragment */ + skb->local_df = 1; + #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug = 0; #endif /* CONFIG_NETFILTER_DEBUG */ @@ -235,6 +216,7 @@ dst_link_failure(skb); tx_error: kfree_skb(skb); + LeaveFunction(10); return NF_STOLEN; } @@ -248,45 +230,18 @@ struct ip_vs_protocol *pp) { struct rtable *rt; /* Route to the other host */ - struct iphdr *iph; - union ip_vs_tphdr h; - int ihl; - unsigned short size; int mtu; + struct iphdr *iph = skb->nh.iph; EnterFunction(10); - /* - * If it has ip_vs_app helper, the helper may change the payload, - * so it needs full checksum checking and checksum calculation. - * If not, only the header (such as IP address and port number) - * will be changed, so it is fast to do incremental checksum update, - * and let the destination host do final checksum checking. - */ - - if (unlikely(cp->app && !pp->slave)) { - if (skb_is_nonlinear(skb) && - skb_linearize(skb, GFP_ATOMIC) != 0) - return NF_DROP; - } - - iph = skb->nh.iph; - ihl = iph->ihl << 2; - h.raw = (char*) iph + ihl; - size = ntohs(iph->tot_len) - ihl; - - /* do TCP/UDP checksum checking if it has application helper */ - if (unlikely(cp->app && pp->csum_check && !pp->slave)) { - if (!pp->csum_check(skb, pp, iph, h, size)) - goto tx_error; - } - - /* - * Check if it is no clinet port connection ... - */ + /* check if it is a connection of no-client-port */ if (unlikely(cp->flags & IP_VS_CONN_F_NO_CPORT)) { - ip_vs_conn_fill_cport(cp, h.portp[0]); - IP_VS_DBG(10, "filled cport=%d\n", ntohs(cp->dport)); + __u16 pt; + if (skb_copy_bits(skb, iph->ihl*4, &pt, sizeof(pt)) < 0) + goto tx_error; + ip_vs_conn_fill_cport(cp, pt); + IP_VS_DBG(10, "filled cport=%d\n", ntohs(pt)); } if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(iph->tos)))) @@ -297,33 +252,36 @@ if ((skb->len > mtu) && (iph->frag_off&__constant_htons(IP_DF))) { ip_rt_put(rt); icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); - IP_VS_DBG_RL_PKT(0, pp, iph, "ip_vs_nat_xmit(): frag needed for"); + IP_VS_DBG_RL_PKT(0, pp, skb, 0, "ip_vs_nat_xmit(): frag needed for"); goto tx_error; } + /* copy-on-write the packet before mangling it */ + if (!ip_vs_make_skb_writable(&skb, sizeof(struct iphdr))) + goto tx_error_put; + + if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) + goto tx_error_put; + /* drop old route */ dst_release(skb->dst); skb->dst = &rt->u.dst; - /* copy-on-write the packet before mangling it */ - if (ip_vs_skb_cow(skb, rt->u.dst.dev->hard_header_len, &iph, &h.raw)) - return NF_DROP; - /* mangle the packet */ - iph->daddr = cp->daddr; - if (pp->dnat_handler) { - pp->dnat_handler(skb, pp, cp, iph, h, size); - iph = skb->nh.iph; - h.raw = (char*) iph + ihl; - } - ip_send_check(iph); + if (pp->dnat_handler && !pp->dnat_handler(&skb, pp, cp)) + goto tx_error; + skb->nh.iph->daddr = cp->daddr; + ip_send_check(skb->nh.iph); - IP_VS_DBG_PKT(10, pp, iph, "After DNAT"); + IP_VS_DBG_PKT(10, pp, skb, 0, "After DNAT"); /* FIXME: when application helper enlarges the packet and the length is larger than the MTU of outgoing device, there will be still MTU problem. */ + /* Another hack: avoid icmp_send in ip_fragment */ + skb->local_df = 1; + #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug = 0; #endif /* CONFIG_NETFILTER_DEBUG */ @@ -335,8 +293,12 @@ tx_error_icmp: dst_link_failure(skb); tx_error: + LeaveFunction(10); kfree_skb(skb); return NF_STOLEN; + tx_error_put: + ip_rt_put(rt); + goto tx_error; } @@ -405,11 +367,6 @@ goto tx_error; } - if (skb_is_nonlinear(skb)) - ip_send_check(old_iph); - - skb->h.raw = skb->nh.raw; - /* * Okay, now see if we can stuff it in the buffer as-is. */ @@ -423,12 +380,18 @@ ip_rt_put(rt); kfree_skb(skb); IP_VS_ERR_RL("ip_vs_tunnel_xmit(): no memory\n"); - return -EINVAL; + return NF_STOLEN; } kfree_skb(skb); skb = new_skb; + old_iph = skb->nh.iph; } + skb->h.raw = (void *) old_iph; + + /* fix old IP header checksum */ + ip_send_check(old_iph); + skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); @@ -453,9 +416,14 @@ ip_send_check(iph); skb->ip_summed = CHECKSUM_NONE; + + /* Another hack: avoid icmp_send in ip_fragment */ + skb->local_df = 1; + #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug = 0; #endif /* CONFIG_NETFILTER_DEBUG */ + IP_VS_XMIT(skb, rt); LeaveFunction(10); @@ -466,6 +434,7 @@ dst_link_failure(skb); tx_error: kfree_skb(skb); + LeaveFunction(10); return NF_STOLEN; } @@ -496,21 +465,23 @@ goto tx_error; } - if (skb_is_nonlinear(skb) && skb->len <= mtu) - ip_send_check(iph); - - if (unlikely(skb_headroom(skb) < rt->u.dst.dev->hard_header_len)) { - if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) { - ip_rt_put(rt); - IP_VS_ERR_RL("ip_vs_dr_xmit(): no memory\n"); - goto tx_error; - } + /* + * Call ip_send_check because we are not sure it is called + * after ip_defrag. Is copy-on-write needed? + */ + if (unlikely((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)) { + ip_rt_put(rt); + return NF_STOLEN; } + ip_send_check(skb->nh.iph); /* drop old route */ dst_release(skb->dst); skb->dst = &rt->u.dst; + /* Another hack: avoid icmp_send in ip_fragment */ + skb->local_df = 1; + #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug = 0; #endif /* CONFIG_NETFILTER_DEBUG */ @@ -523,6 +494,7 @@ dst_link_failure(skb); tx_error: kfree_skb(skb); + LeaveFunction(10); return NF_STOLEN; } @@ -533,14 +505,9 @@ */ int ip_vs_icmp_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, - struct ip_vs_protocol *pp) + struct ip_vs_protocol *pp, int offset) { struct rtable *rt; /* Route to the other host */ - struct iphdr *iph; - struct icmphdr *icmph; - struct iphdr *ciph; /* The ip header contained within the ICMP */ - unsigned short len; - union ip_vs_tphdr h; int mtu; int rc; @@ -554,65 +521,43 @@ rc = cp->packet_xmit(skb, cp, pp); else rc = NF_ACCEPT; + /* do not touch skb anymore */ atomic_inc(&cp->in_pkts); __ip_vs_conn_put(cp); goto out; } - iph = skb->nh.iph; - icmph = (struct icmphdr *)((char *)iph+(iph->ihl<<2)); - len = ntohs(iph->tot_len) - (iph->ihl<<2); - /* * mangle and send the packet here (only for VS/NAT) */ - if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(iph->tos)))) + if (!(rt = __ip_vs_get_out_rt(cp, RT_TOS(skb->nh.iph->tos)))) goto tx_error_icmp; /* MTU checking */ mtu = dst_pmtu(&rt->u.dst); - if ((skb->len > mtu) && (iph->frag_off&__constant_htons(IP_DF))) { + if ((skb->len > mtu) && (skb->nh.iph->frag_off&__constant_htons(IP_DF))) { ip_rt_put(rt); - icmp_send(skb, ICMP_DEST_UNREACH,ICMP_FRAG_NEEDED, htonl(mtu)); + icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); IP_VS_DBG_RL("ip_vs_in_icmp(): frag needed\n"); goto tx_error; } - /* drop old route */ - dst_release(skb->dst); - skb->dst = &rt->u.dst; - /* copy-on-write the packet before mangling it */ - if (ip_vs_skb_cow(skb, rt->u.dst.dev->hard_header_len, - &iph, (unsigned char**)&icmph)) { - rc = NF_DROP; - goto out; - } - ciph = (struct iphdr *) (icmph + 1); - h.raw = (char *) ciph + (ciph->ihl << 2); + if (!ip_vs_make_skb_writable(&skb, offset)) + goto tx_error_put; - /* The ICMP packet for VS/NAT must be written to correct addresses - before being forwarded to the right server */ + if (skb_cow(skb, rt->u.dst.dev->hard_header_len)) + goto tx_error_put; - /* First change the dest IP address, and recalc checksum */ - iph->daddr = cp->daddr; - ip_send_check(iph); + /* drop the old route when skb is not shared */ + dst_release(skb->dst); + skb->dst = &rt->u.dst; - /* Now change the *source* address in the contained IP */ - ciph->saddr = cp->daddr; - ip_send_check(ciph); - - /* the TCP/UDP source port - cannot redo check */ - if (IPPROTO_TCP == ciph->protocol || IPPROTO_UDP == ciph->protocol) - h.portp[0] = cp->dport; - - /* And finally the ICMP checksum */ - icmph->checksum = 0; - icmph->checksum = ip_compute_csum((unsigned char *) icmph, len); - skb->ip_summed = CHECKSUM_UNNECESSARY; + ip_vs_nat_icmp(skb, pp, cp, 0); - IP_VS_DBG_PKT(11, pp, ciph, "Forwarding incoming ICMP"); + /* Another hack: avoid icmp_send in ip_fragment */ + skb->local_df = 1; #ifdef CONFIG_NETFILTER_DEBUG skb->nf_debug = 0; @@ -630,4 +575,7 @@ out: LeaveFunction(10); return rc; + tx_error_put: + ip_rt_put(rt); + goto tx_error; } diff -Nru a/net/ipv4/netfilter/ip_conntrack_core.c b/net/ipv4/netfilter/ip_conntrack_core.c --- a/net/ipv4/netfilter/ip_conntrack_core.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/netfilter/ip_conntrack_core.c Wed Oct 8 12:24:55 2003 @@ -59,7 +59,7 @@ LIST_HEAD(protocol_list); static LIST_HEAD(helpers); unsigned int ip_conntrack_htable_size = 0; -static int ip_conntrack_max; +int ip_conntrack_max; static atomic_t ip_conntrack_count = ATOMIC_INIT(0); struct list_head *ip_conntrack_hash; static kmem_cache_t *ip_conntrack_cachep; @@ -301,7 +301,7 @@ static void destroy_conntrack(struct nf_conntrack *nfct) { - struct ip_conntrack *ct = (struct ip_conntrack *)nfct; + struct ip_conntrack *ct = (struct ip_conntrack *)nfct, *master = NULL; struct ip_conntrack_protocol *proto; DEBUGP("destroy_conntrack(%p)\n", ct); @@ -328,12 +328,15 @@ /* can't call __unexpect_related here, * since it would screw up expect_list */ list_del(&ct->master->expected_list); - ip_conntrack_put(ct->master->expectant); + master = ct->master->expectant; } kfree(ct->master); } WRITE_UNLOCK(&ip_conntrack_lock); + if (master) + ip_conntrack_put(master); + DEBUGP("destroy_conntrack: returning ct=%p to slab\n", ct); kmem_cache_free(ip_conntrack_cachep, ct); atomic_dec(&ip_conntrack_count); @@ -1276,11 +1279,14 @@ { struct inet_opt *inet = inet_sk(sk); struct ip_conntrack_tuple_hash *h; - struct ip_conntrack_tuple tuple = { { inet->rcv_saddr, - { .tcp = { inet->sport } } }, - { inet->daddr, - { .tcp = { inet->dport } }, - IPPROTO_TCP } }; + struct ip_conntrack_tuple tuple; + + IP_CT_TUPLE_U_BLANK(&tuple); + tuple.src.ip = inet->rcv_saddr; + tuple.src.u.tcp.port = inet->sport; + tuple.dst.ip = inet->daddr; + tuple.dst.u.tcp.port = inet->dport; + tuple.dst.protonum = IPPROTO_TCP; /* We only do TCP at the moment: is there a better way? */ if (strcmp(sk->sk_prot->name, "TCP")) { @@ -1325,45 +1331,6 @@ .get = &getorigdst, }; -#define NET_IP_CONNTRACK_MAX 2089 -#define NET_IP_CONNTRACK_MAX_NAME "ip_conntrack_max" - -#ifdef CONFIG_SYSCTL -static struct ctl_table_header *ip_conntrack_sysctl_header; - -static ctl_table ip_conntrack_table[] = { - { - .ctl_name = NET_IP_CONNTRACK_MAX, - .procname = NET_IP_CONNTRACK_MAX_NAME, - .data = &ip_conntrack_max, - .maxlen = sizeof(ip_conntrack_max), - .mode = 0644, - .proc_handler = proc_dointvec - }, - { .ctl_name = 0 } -}; - -static ctl_table ip_conntrack_dir_table[] = { - { - .ctl_name = NET_IPV4, - .procname = "ipv4", - .mode = 0555, - .child = ip_conntrack_table - }, - { .ctl_name = 0 } -}; - -static ctl_table ip_conntrack_root_table[] = { - { - .ctl_name = CTL_NET, - .procname = "net", - .mode = 0555, - .child = ip_conntrack_dir_table - }, - { .ctl_name = 0 } -}; -#endif /*CONFIG_SYSCTL*/ - static int kill_all(const struct ip_conntrack *i, void *data) { return 1; @@ -1373,9 +1340,6 @@ supposed to kill the mall. */ void ip_conntrack_cleanup(void) { -#ifdef CONFIG_SYSCTL - unregister_sysctl_table(ip_conntrack_sysctl_header); -#endif ip_ct_attach = NULL; /* This makes sure all current packets have passed through netfilter framework. Roll on, two-stage module @@ -1453,25 +1417,10 @@ for (i = 0; i < ip_conntrack_htable_size; i++) INIT_LIST_HEAD(&ip_conntrack_hash[i]); -/* This is fucking braindead. There is NO WAY of doing this without - the CONFIG_SYSCTL unless you don't want to detect errors. - Grrr... --RR */ -#ifdef CONFIG_SYSCTL - ip_conntrack_sysctl_header - = register_sysctl_table(ip_conntrack_root_table, 0); - if (ip_conntrack_sysctl_header == NULL) { - goto err_free_ct_cachep; - } -#endif /*CONFIG_SYSCTL*/ - /* For use by ipt_REJECT */ ip_ct_attach = ip_conntrack_attach; return ret; -#ifdef CONFIG_SYSCTL -err_free_ct_cachep: - kmem_cache_destroy(ip_conntrack_cachep); -#endif /*CONFIG_SYSCTL*/ err_free_hash: vfree(ip_conntrack_hash); err_unreg_sockopt: diff -Nru a/net/ipv4/netfilter/ip_conntrack_irc.c b/net/ipv4/netfilter/ip_conntrack_irc.c --- a/net/ipv4/netfilter/ip_conntrack_irc.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/netfilter/ip_conntrack_irc.c Wed Oct 8 12:24:57 2003 @@ -177,7 +177,10 @@ DEBUGP("DCC bound ip/port: %u.%u.%u.%u:%u\n", HIPQUAD(dcc_ip), dcc_port); - if (ct->tuplehash[dir].tuple.src.ip != htonl(dcc_ip)) { + /* dcc_ip can be the internal OR external (NAT'ed) IP + * Tiago Sousa */ + if (ct->tuplehash[dir].tuple.src.ip != htonl(dcc_ip) + && ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.ip != htonl(dcc_ip)) { if (net_ratelimit()) printk(KERN_WARNING "Forged DCC command from " @@ -201,7 +204,7 @@ exp->tuple = ((struct ip_conntrack_tuple) { { 0, { 0 } }, - { htonl(dcc_ip), { .tcp = { htons(dcc_port) } }, + { ct->tuplehash[dir].tuple.src.ip, { .tcp = { htons(dcc_port) } }, IPPROTO_TCP }}); exp->mask = ((struct ip_conntrack_tuple) { { 0, { 0 } }, diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_generic.c b/net/ipv4/netfilter/ip_conntrack_proto_generic.c --- a/net/ipv4/netfilter/ip_conntrack_proto_generic.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/netfilter/ip_conntrack_proto_generic.c Wed Oct 8 12:24:56 2003 @@ -4,7 +4,7 @@ #include #include -#define GENERIC_TIMEOUT (600*HZ) +unsigned long ip_ct_generic_timeout = 600*HZ; static int generic_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff, @@ -44,7 +44,7 @@ const struct sk_buff *skb, enum ip_conntrack_info conntrackinfo) { - ip_ct_refresh(conntrack, GENERIC_TIMEOUT); + ip_ct_refresh(conntrack, ip_ct_generic_timeout); return NF_ACCEPT; } diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c --- a/net/ipv4/netfilter/ip_conntrack_proto_icmp.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/netfilter/ip_conntrack_proto_icmp.c Wed Oct 8 12:24:55 2003 @@ -6,7 +6,7 @@ #include #include -#define ICMP_TIMEOUT (30*HZ) +unsigned long ip_ct_icmp_timeout = 30*HZ; #if 0 #define DEBUGP printk @@ -86,7 +86,7 @@ ct->timeout.function((unsigned long)ct); } else { atomic_inc(&ct->proto.icmp.count); - ip_ct_refresh(ct, ICMP_TIMEOUT); + ip_ct_refresh(ct, ip_ct_icmp_timeout); } return NF_ACCEPT; diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c --- a/net/ipv4/netfilter/ip_conntrack_proto_tcp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/netfilter/ip_conntrack_proto_tcp.c Wed Oct 8 12:24:57 2003 @@ -49,20 +49,28 @@ #define HOURS * 60 MINS #define DAYS * 24 HOURS - -static unsigned long tcp_timeouts[] -= { 30 MINS, /* TCP_CONNTRACK_NONE, */ - 5 DAYS, /* TCP_CONNTRACK_ESTABLISHED, */ - 2 MINS, /* TCP_CONNTRACK_SYN_SENT, */ - 60 SECS, /* TCP_CONNTRACK_SYN_RECV, */ - 2 MINS, /* TCP_CONNTRACK_FIN_WAIT, */ - 2 MINS, /* TCP_CONNTRACK_TIME_WAIT, */ - 10 SECS, /* TCP_CONNTRACK_CLOSE, */ - 60 SECS, /* TCP_CONNTRACK_CLOSE_WAIT, */ - 30 SECS, /* TCP_CONNTRACK_LAST_ACK, */ - 2 MINS, /* TCP_CONNTRACK_LISTEN, */ -}; - +unsigned long ip_ct_tcp_timeout_syn_sent = 2 MINS; +unsigned long ip_ct_tcp_timeout_syn_recv = 60 SECS; +unsigned long ip_ct_tcp_timeout_established = 5 DAYS; +unsigned long ip_ct_tcp_timeout_fin_wait = 2 MINS; +unsigned long ip_ct_tcp_timeout_close_wait = 3 DAYS; +unsigned long ip_ct_tcp_timeout_last_ack = 30 SECS; +unsigned long ip_ct_tcp_timeout_time_wait = 2 MINS; +unsigned long ip_ct_tcp_timeout_close = 10 SECS; + +static unsigned long * tcp_timeouts[] += { 0, /* TCP_CONNTRACK_NONE */ + &ip_ct_tcp_timeout_established, /* TCP_CONNTRACK_ESTABLISHED, */ + &ip_ct_tcp_timeout_syn_sent, /* TCP_CONNTRACK_SYN_SENT, */ + &ip_ct_tcp_timeout_syn_recv, /* TCP_CONNTRACK_SYN_RECV, */ + &ip_ct_tcp_timeout_fin_wait, /* TCP_CONNTRACK_FIN_WAIT, */ + &ip_ct_tcp_timeout_time_wait, /* TCP_CONNTRACK_TIME_WAIT, */ + &ip_ct_tcp_timeout_close, /* TCP_CONNTRACK_CLOSE, */ + &ip_ct_tcp_timeout_close_wait, /* TCP_CONNTRACK_CLOSE_WAIT, */ + &ip_ct_tcp_timeout_last_ack, /* TCP_CONNTRACK_LAST_ACK, */ + 0, /* TCP_CONNTRACK_LISTEN */ + }; + #define sNO TCP_CONNTRACK_NONE #define sES TCP_CONNTRACK_ESTABLISHED #define sSS TCP_CONNTRACK_SYN_SENT @@ -204,7 +212,7 @@ set_bit(IPS_ASSURED_BIT, &conntrack->status); WRITE_UNLOCK(&tcp_lock); - ip_ct_refresh(conntrack, tcp_timeouts[newconntrack]); + ip_ct_refresh(conntrack, *tcp_timeouts[newconntrack]); } return NF_ACCEPT; diff -Nru a/net/ipv4/netfilter/ip_conntrack_proto_udp.c b/net/ipv4/netfilter/ip_conntrack_proto_udp.c --- a/net/ipv4/netfilter/ip_conntrack_proto_udp.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/netfilter/ip_conntrack_proto_udp.c Wed Oct 8 12:24:55 2003 @@ -6,8 +6,8 @@ #include #include -#define UDP_TIMEOUT (30*HZ) -#define UDP_STREAM_TIMEOUT (180*HZ) +unsigned long ip_ct_udp_timeout = 30*HZ; +unsigned long ip_ct_udp_timeout_stream = 180*HZ; static int udp_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff, @@ -57,11 +57,11 @@ /* If we've seen traffic both ways, this is some kind of UDP stream. Extend timeout. */ if (test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)) { - ip_ct_refresh(conntrack, UDP_STREAM_TIMEOUT); + ip_ct_refresh(conntrack, ip_ct_udp_timeout_stream); /* Also, more likely to be important, and not a probe */ set_bit(IPS_ASSURED_BIT, &conntrack->status); } else - ip_ct_refresh(conntrack, UDP_TIMEOUT); + ip_ct_refresh(conntrack, ip_ct_udp_timeout); return NF_ACCEPT; } diff -Nru a/net/ipv4/netfilter/ip_conntrack_standalone.c b/net/ipv4/netfilter/ip_conntrack_standalone.c --- a/net/ipv4/netfilter/ip_conntrack_standalone.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/netfilter/ip_conntrack_standalone.c Wed Oct 8 12:24:56 2003 @@ -7,6 +7,7 @@ /* (c) 1999 Paul `Rusty' Russell. Licenced under the GNU General Public Licence. */ +#include #include #include #include @@ -14,6 +15,9 @@ #include #include #include +#ifdef CONFIG_SYSCTL +#include +#endif #include #define ASSERT_READ_LOCK(x) MUST_BE_READ_LOCKED(&ip_conntrack_lock) @@ -256,6 +260,98 @@ .priority = NF_IP_PRI_LAST-1, }; +/* Sysctl support */ + +#ifdef CONFIG_SYSCTL + +/* From ip_conntrack_core.c */ +extern int ip_conntrack_max; + +/* From ip_conntrack_proto_tcp.c */ +extern unsigned long ip_ct_tcp_timeout_syn_sent; +extern unsigned long ip_ct_tcp_timeout_syn_recv; +extern unsigned long ip_ct_tcp_timeout_established; +extern unsigned long ip_ct_tcp_timeout_fin_wait; +extern unsigned long ip_ct_tcp_timeout_close_wait; +extern unsigned long ip_ct_tcp_timeout_last_ack; +extern unsigned long ip_ct_tcp_timeout_time_wait; +extern unsigned long ip_ct_tcp_timeout_close; + +/* From ip_conntrack_proto_udp.c */ +extern unsigned long ip_ct_udp_timeout; +extern unsigned long ip_ct_udp_timeout_stream; + +/* From ip_conntrack_proto_icmp.c */ +extern unsigned long ip_ct_icmp_timeout; + +/* From ip_conntrack_proto_icmp.c */ +extern unsigned long ip_ct_generic_timeout; + +static struct ctl_table_header *ip_ct_sysctl_header; + +static ctl_table ip_ct_sysctl_table[] = { + {NET_IPV4_NF_CONNTRACK_MAX, "ip_conntrack_max", + &ip_conntrack_max, sizeof(int), 0644, NULL, + &proc_dointvec}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_SENT, "ip_conntrack_tcp_timeout_syn_sent", + &ip_ct_tcp_timeout_syn_sent, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_SYN_RECV, "ip_conntrack_tcp_timeout_syn_recv", + &ip_ct_tcp_timeout_syn_recv, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_ESTABLISHED, "ip_conntrack_tcp_timeout_established", + &ip_ct_tcp_timeout_established, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_FIN_WAIT, "ip_conntrack_tcp_timeout_fin_wait", + &ip_ct_tcp_timeout_fin_wait, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE_WAIT, "ip_conntrack_tcp_timeout_close_wait", + &ip_ct_tcp_timeout_close_wait, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_LAST_ACK, "ip_conntrack_tcp_timeout_last_ack", + &ip_ct_tcp_timeout_last_ack, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_TIME_WAIT, "ip_conntrack_tcp_timeout_time_wait", + &ip_ct_tcp_timeout_time_wait, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_TCP_TIMEOUT_CLOSE, "ip_conntrack_tcp_timeout_close", + &ip_ct_tcp_timeout_close, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT, "ip_conntrack_udp_timeout", + &ip_ct_udp_timeout, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_UDP_TIMEOUT_STREAM, "ip_conntrack_udp_timeout_stream", + &ip_ct_udp_timeout_stream, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_ICMP_TIMEOUT, "ip_conntrack_icmp_timeout", + &ip_ct_icmp_timeout, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {NET_IPV4_NF_CONNTRACK_GENERIC_TIMEOUT, "ip_conntrack_generic_timeout", + &ip_ct_generic_timeout, sizeof(unsigned int), 0644, NULL, + &proc_dointvec_jiffies}, + {0} +}; + +#define NET_IP_CONNTRACK_MAX 2089 + +static ctl_table ip_ct_netfilter_table[] = { + {NET_IPV4_NETFILTER, "netfilter", NULL, 0, 0555, ip_ct_sysctl_table, 0, 0, 0, 0, 0}, + {NET_IP_CONNTRACK_MAX, "ip_conntrack_max", + &ip_conntrack_max, sizeof(int), 0644, NULL, + &proc_dointvec}, + {0} +}; + +static ctl_table ip_ct_ipv4_table[] = { + {NET_IPV4, "ipv4", NULL, 0, 0555, ip_ct_netfilter_table, 0, 0, 0, 0, 0}, + {0} +}; + +static ctl_table ip_ct_net_table[] = { + {CTL_NET, "net", NULL, 0, 0555, ip_ct_ipv4_table, 0, 0, 0, 0, 0}, + {0} +}; +#endif static int init_or_cleanup(int init) { struct proc_dir_entry *proc; @@ -291,10 +387,20 @@ printk("ip_conntrack: can't register local in hook.\n"); goto cleanup_inoutandlocalops; } +#ifdef CONFIG_SYSCTL + ip_ct_sysctl_header = register_sysctl_table(ip_ct_net_table, 0); + if (ip_ct_sysctl_header == NULL) { + printk("ip_conntrack: can't register to sysctl.\n"); + goto cleanup; + } +#endif return ret; cleanup: +#ifdef CONFIG_SYSCTL + unregister_sysctl_table(ip_ct_sysctl_header); +#endif nf_unregister_hook(&ip_conntrack_local_in_ops); cleanup_inoutandlocalops: nf_unregister_hook(&ip_conntrack_out_ops); diff -Nru a/net/ipv4/netfilter/ip_nat_core.c b/net/ipv4/netfilter/ip_nat_core.c --- a/net/ipv4/netfilter/ip_nat_core.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/netfilter/ip_nat_core.c Wed Oct 8 12:24:55 2003 @@ -516,12 +516,14 @@ struct ip_conntrack_tuple new_tuple, inv_tuple, reply; struct ip_conntrack_tuple orig_tp; struct ip_nat_info *info = &conntrack->nat.info; + int in_hashes = info->initialized; MUST_BE_WRITE_LOCKED(&ip_nat_lock); IP_NF_ASSERT(hooknum == NF_IP_PRE_ROUTING || hooknum == NF_IP_POST_ROUTING || hooknum == NF_IP_LOCAL_OUT); IP_NF_ASSERT(info->num_manips < IP_NAT_MAX_MANIPS); + IP_NF_ASSERT(!(info->initialized & (1 << HOOK2MANIP(hooknum)))); /* What we've got will look like inverse of reply. Normally this is what is in the conntrack, except for prior @@ -638,6 +640,14 @@ /* It's done. */ info->initialized |= (1 << HOOK2MANIP(hooknum)); + + if (in_hashes) { + IP_NF_ASSERT(info->bysource.conntrack); + replace_in_hashes(conntrack, info); + } else { + place_in_hashes(conntrack, info); + } + return NF_ACCEPT; } @@ -760,11 +770,6 @@ struct ip_nat_helper *helper; enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo); int proto = (*pskb)->nh.iph->protocol; - - /* Skip everything and don't call helpers if there are no - * manips for this connection */ - if (info->num_manips == 0) - return NF_ACCEPT; /* Need nat lock to protect against modification, but neither conntrack (referenced) and helper (deleted with diff -Nru a/net/ipv4/netfilter/ip_nat_helper.c b/net/ipv4/netfilter/ip_nat_helper.c --- a/net/ipv4/netfilter/ip_nat_helper.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/netfilter/ip_nat_helper.c Wed Oct 8 12:24:55 2003 @@ -122,7 +122,6 @@ /* fix IP hdr checksum information */ skb->nh.iph->tot_len = htons(skb->len); ip_send_check(skb->nh.iph); - skb->csum = csum_partial(data, skb->len - dataoff, 0); } /* Unusual, but possible case. */ @@ -167,6 +166,7 @@ { struct iphdr *iph; struct tcphdr *tcph; + int datalen; if (!skb_ip_make_writable(pskb, (*pskb)->len)) return 0; @@ -184,11 +184,11 @@ mangle_contents(*pskb, iph->ihl*4 + tcph->doff*4, match_offset, match_len, rep_buffer, rep_len); + datalen = (*pskb)->len - iph->ihl*4; tcph->check = 0; - tcph->check = tcp_v4_check(tcph, (*pskb)->len - iph->ihl*4, - iph->saddr, iph->daddr, - csum_partial((char *)tcph, tcph->doff*4, - (*pskb)->csum)); + tcph->check = tcp_v4_check(tcph, datalen, iph->saddr, iph->daddr, + csum_partial((char *)tcph, datalen, 0)); + adjust_tcp_sequence(ntohl(tcph->seq), (int)rep_len - (int)match_len, ct, ctinfo); @@ -216,7 +216,12 @@ { struct iphdr *iph; struct udphdr *udph; - int need_csum = ((*pskb)->csum != 0); + + /* UDP helpers might accidentally mangle the wrong packet */ + iph = (*pskb)->nh.iph; + if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) + + match_offset + match_len) + return 0; if (!skb_ip_make_writable(pskb, (*pskb)->len)) return 0; @@ -235,17 +240,15 @@ udph->len = htons((*pskb)->len - iph->ihl*4); /* fix udp checksum if udp checksum was previously calculated */ - if (need_csum) { + if (udph->check) { + int datalen = (*pskb)->len - iph->ihl * 4; udph->check = 0; - udph->check - = csum_tcpudp_magic(iph->saddr, iph->daddr, - (*pskb)->len - iph->ihl*4, - IPPROTO_UDP, - csum_partial((char *)udph, - sizeof(struct udphdr), - (*pskb)->csum)); - } else - (*pskb)->csum = 0; + udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, + datalen, IPPROTO_UDP, + csum_partial((char *)udph, + datalen, 0)); + } + return 1; } diff -Nru a/net/ipv4/netfilter/ip_nat_rule.c b/net/ipv4/netfilter/ip_nat_rule.c --- a/net/ipv4/netfilter/ip_nat_rule.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/netfilter/ip_nat_rule.c Wed Oct 8 12:24:56 2003 @@ -233,7 +233,7 @@ return 1; } -static inline unsigned int +inline unsigned int alloc_null_binding(struct ip_conntrack *conntrack, struct ip_nat_info *info, unsigned int hooknum) diff -Nru a/net/ipv4/netfilter/ip_nat_standalone.c b/net/ipv4/netfilter/ip_nat_standalone.c --- a/net/ipv4/netfilter/ip_nat_standalone.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/netfilter/ip_nat_standalone.c Wed Oct 8 12:24:57 2003 @@ -119,7 +119,6 @@ /* Seen it before? This can happen for loopback, retrans, or local packets.. */ if (!(info->initialized & (1 << maniptype))) { - int in_hashes = info->initialized; unsigned int ret; if (ct->master @@ -130,9 +129,10 @@ } else { #ifdef CONFIG_IP_NF_NAT_LOCAL /* LOCAL_IN hook doesn't have a chain! */ - if (hooknum == NF_IP_LOCAL_IN) { - ret = NF_ACCEPT; - } else + if (hooknum == NF_IP_LOCAL_IN) + ret = alloc_null_binding(ct, info, + hooknum); + else #endif ret = ip_nat_rule_find(pskb, hooknum, in, out, ct, info); @@ -142,13 +142,6 @@ WRITE_UNLOCK(&ip_nat_lock); return ret; } - - if (in_hashes) { - IP_NF_ASSERT(info->bysource.conntrack); - replace_in_hashes(ct, info); - } else { - place_in_hashes(ct, info); - } } else DEBUGP("Already setup manip %s for ct %p\n", maniptype == IP_NAT_MANIP_SRC ? "SRC" : "DST", @@ -199,6 +192,7 @@ return ip_nat_fn(hooknum, pskb, in, out, okfn); } +#ifdef CONFIG_IP_NF_NAT_LOCAL static unsigned int ip_nat_local_fn(unsigned int hooknum, struct sk_buff **pskb, @@ -224,6 +218,7 @@ return ip_route_me_harder(pskb) == 0 ? ret : NF_DROP; return ret; } +#endif /* We must be after connection tracking and before packet filtering. */ @@ -245,6 +240,7 @@ .priority = NF_IP_PRI_NAT_SRC, }; +#ifdef CONFIG_IP_NF_NAT_LOCAL /* Before packet filtering, change destination */ static struct nf_hook_ops ip_nat_local_out_ops = { .hook = ip_nat_local_fn, @@ -254,7 +250,7 @@ .priority = NF_IP_PRI_NAT_DST, }; -#ifdef CONFIG_IP_NF_NAT_LOCAL +/* After packet filtering, change source for reply packets of LOCAL_OUT DNAT */ static struct nf_hook_ops ip_nat_local_in_ops = { .hook = ip_nat_fn, .owner = THIS_MODULE, @@ -324,12 +320,12 @@ printk("ip_nat_init: can't register out hook.\n"); goto cleanup_inops; } +#ifdef CONFIG_IP_NF_NAT_LOCAL ret = nf_register_hook(&ip_nat_local_out_ops); if (ret < 0) { printk("ip_nat_init: can't register local out hook.\n"); goto cleanup_outops; } -#ifdef CONFIG_IP_NF_NAT_LOCAL ret = nf_register_hook(&ip_nat_local_in_ops); if (ret < 0) { printk("ip_nat_init: can't register local in hook.\n"); @@ -342,9 +338,9 @@ #ifdef CONFIG_IP_NF_NAT_LOCAL nf_unregister_hook(&ip_nat_local_in_ops); cleanup_localoutops: -#endif nf_unregister_hook(&ip_nat_local_out_ops); cleanup_outops: +#endif nf_unregister_hook(&ip_nat_out_ops); cleanup_inops: nf_unregister_hook(&ip_nat_in_ops); diff -Nru a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c --- a/net/ipv4/netfilter/ipt_REJECT.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/netfilter/ipt_REJECT.c Wed Oct 8 12:24:57 2003 @@ -40,16 +40,17 @@ } } -static inline struct rtable *route_reverse(struct sk_buff *skb, int local) +static inline struct rtable *route_reverse(struct sk_buff *skb, int hook) { struct iphdr *iph = skb->nh.iph; struct dst_entry *odst; struct flowi fl = {}; struct rtable *rt; - if (local) { + if (hook != NF_IP_FORWARD) { fl.nl_u.ip4_u.daddr = iph->saddr; - fl.nl_u.ip4_u.saddr = iph->daddr; + if (hook == NF_IP_LOCAL_IN) + fl.nl_u.ip4_u.saddr = iph->daddr; fl.nl_u.ip4_u.tos = RT_TOS(iph->tos); if (ip_route_output_key(&rt, &fl) != 0) @@ -81,7 +82,7 @@ } /* Send RST reply */ -static void send_reset(struct sk_buff *oldskb, int local) +static void send_reset(struct sk_buff *oldskb, int hook) { struct sk_buff *nskb; struct tcphdr otcph, *tcph; @@ -104,7 +105,7 @@ return; /* FIXME: Check checksum --RR */ - if ((rt = route_reverse(oldskb, local)) == NULL) + if ((rt = route_reverse(oldskb, hook)) == NULL) return; hh_len = (rt->u.dst.dev->hard_header_len + 15)&~15; @@ -390,7 +391,7 @@ send_unreach(*pskb, ICMP_PKT_FILTERED); break; case IPT_TCP_RESET: - send_reset(*pskb, hooknum == NF_IP_LOCAL_IN); + send_reset(*pskb, hooknum); case IPT_ICMP_ECHOREPLY: /* Doesn't happen. */ break; diff -Nru a/net/ipv4/netfilter/ipt_owner.c b/net/ipv4/netfilter/ipt_owner.c --- a/net/ipv4/netfilter/ipt_owner.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/netfilter/ipt_owner.c Wed Oct 8 12:24:57 2003 @@ -90,7 +90,7 @@ read_lock(&tasklist_lock); do_each_thread(g, p) { struct files_struct *files; - if (p->session != sid) + if (process_session(p) != sid) continue; task_lock(p); diff -Nru a/net/ipv4/protocol.c b/net/ipv4/protocol.c --- a/net/ipv4/protocol.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/protocol.c Wed Oct 8 12:24:55 2003 @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -95,3 +96,6 @@ return ret; } + +EXPORT_SYMBOL(inet_add_protocol); +EXPORT_SYMBOL(inet_del_protocol); diff -Nru a/net/ipv4/route.c b/net/ipv4/route.c --- a/net/ipv4/route.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/route.c Wed Oct 8 12:24:57 2003 @@ -62,6 +62,7 @@ */ #include +#include #include #include #include @@ -2778,8 +2779,8 @@ ip_rt_max_size = (rt_hash_mask + 1) * 16; rt_cache_stat = alloc_percpu(struct rt_cache_stat); - if (!rt_cache_stat) - goto out_enomem1; + if (!rt_cache_stat) + return -ENOMEM; devinet_init(); ip_fib_init(); @@ -2804,8 +2805,10 @@ #ifdef CONFIG_PROC_FS if (!proc_net_fops_create("rt_cache", S_IRUGO, &rt_cache_seq_fops) || - !proc_net_fops_create("rt_cache_stat", S_IRUGO, &rt_cpu_seq_fops)) - goto out_enomem; + !proc_net_fops_create("rt_cache_stat", S_IRUGO, &rt_cpu_seq_fops)) { + free_percpu(rt_cache_stat); + return -ENOMEM; + } #ifdef CONFIG_NET_CLS_ROUTE create_proc_read_entry("rt_acct", 0, proc_net, ip_rt_acct_read, NULL); @@ -2815,11 +2818,9 @@ xfrm_init(); xfrm4_init(); #endif -out: return rc; -out_enomem: - free_percpu(rt_cache_stat); -out_enomem1: - rc = -ENOMEM; - goto out; } + +EXPORT_SYMBOL(__ip_select_ident); +EXPORT_SYMBOL(ip_route_input); +EXPORT_SYMBOL(ip_route_output_key); diff -Nru a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c --- a/net/ipv4/sysctl_net_ipv4.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/sysctl_net_ipv4.c Wed Oct 8 12:24:57 2003 @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -587,3 +588,5 @@ }; #endif /* CONFIG_SYSCTL */ + +EXPORT_SYMBOL(ipv4_config); diff -Nru a/net/ipv4/tcp.c b/net/ipv4/tcp.c --- a/net/ipv4/tcp.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/tcp.c Wed Oct 8 12:24:56 2003 @@ -248,6 +248,7 @@ */ #include +#include #include #include #include @@ -2682,3 +2683,26 @@ tcpdiag_init(); } + +EXPORT_SYMBOL(__tcp_mem_reclaim); +EXPORT_SYMBOL(sysctl_tcp_rmem); +EXPORT_SYMBOL(sysctl_tcp_wmem); +EXPORT_SYMBOL(tcp_accept); +EXPORT_SYMBOL(tcp_close); +EXPORT_SYMBOL(tcp_close_state); +EXPORT_SYMBOL(tcp_destroy_sock); +EXPORT_SYMBOL(tcp_disconnect); +EXPORT_SYMBOL(tcp_getsockopt); +EXPORT_SYMBOL(tcp_ioctl); +EXPORT_SYMBOL(tcp_openreq_cachep); +EXPORT_SYMBOL(tcp_poll); +EXPORT_SYMBOL(tcp_read_sock); +EXPORT_SYMBOL(tcp_recvmsg); +EXPORT_SYMBOL(tcp_sendmsg); +EXPORT_SYMBOL(tcp_sendpage); +EXPORT_SYMBOL(tcp_setsockopt); +EXPORT_SYMBOL(tcp_shutdown); +EXPORT_SYMBOL(tcp_sockets_allocated); +EXPORT_SYMBOL(tcp_statistics); +EXPORT_SYMBOL(tcp_timewait_cachep); +EXPORT_SYMBOL(tcp_write_space); diff -Nru a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c --- a/net/ipv4/tcp_input.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/tcp_input.c Wed Oct 8 12:24:57 2003 @@ -65,6 +65,7 @@ #include #include +#include #include #include #include @@ -4089,3 +4090,10 @@ } return 0; } + +EXPORT_SYMBOL(sysctl_tcp_ecn); +EXPORT_SYMBOL(sysctl_tcp_reordering); +EXPORT_SYMBOL(tcp_cwnd_application_limited); +EXPORT_SYMBOL(tcp_parse_options); +EXPORT_SYMBOL(tcp_rcv_established); +EXPORT_SYMBOL(tcp_rcv_state_process); diff -Nru a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c --- a/net/ipv4/tcp_ipv4.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/tcp_ipv4.c Wed Oct 8 12:24:56 2003 @@ -56,6 +56,7 @@ #include #include +#include #include #include #include @@ -187,7 +188,9 @@ sk_for_each_bound(sk2, node, &tb->owners) { if (sk != sk2 && !ipv6_only_sock(sk2) && - sk->sk_bound_dev_if == sk2->sk_bound_dev_if) { + (!sk->sk_bound_dev_if || + !sk2->sk_bound_dev_if || + sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) { if (!reuse || !sk2->sk_reuse || sk2->sk_state == TCP_LISTEN) { struct inet_opt *inet2 = inet_sk(sk2); @@ -2644,3 +2647,32 @@ */ tcp_socket->sk->sk_prot->unhash(tcp_socket->sk); } + +EXPORT_SYMBOL(ipv4_specific); +EXPORT_SYMBOL(tcp_bind_hash); +EXPORT_SYMBOL(tcp_bucket_create); +EXPORT_SYMBOL(tcp_hashinfo); +EXPORT_SYMBOL(tcp_inherit_port); +EXPORT_SYMBOL(tcp_listen_wlock); +EXPORT_SYMBOL(tcp_port_rover); +EXPORT_SYMBOL(tcp_prot); +EXPORT_SYMBOL(tcp_put_port); +EXPORT_SYMBOL(tcp_unhash); +EXPORT_SYMBOL(tcp_v4_conn_request); +EXPORT_SYMBOL(tcp_v4_connect); +EXPORT_SYMBOL(tcp_v4_do_rcv); +EXPORT_SYMBOL(tcp_v4_lookup_listener); +EXPORT_SYMBOL(tcp_v4_rebuild_header); +EXPORT_SYMBOL(tcp_v4_remember_stamp); +EXPORT_SYMBOL(tcp_v4_send_check); +EXPORT_SYMBOL(tcp_v4_syn_recv_sock); + +#ifdef CONFIG_PROC_FS +EXPORT_SYMBOL(tcp_proc_register); +EXPORT_SYMBOL(tcp_proc_unregister); +#endif +#ifdef CONFIG_SYSCTL +EXPORT_SYMBOL(sysctl_local_port_range); +EXPORT_SYMBOL(sysctl_max_syn_backlog); +EXPORT_SYMBOL(sysctl_tcp_low_latency); +#endif diff -Nru a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c --- a/net/ipv4/tcp_minisocks.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/tcp_minisocks.c Wed Oct 8 12:24:57 2003 @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -1053,3 +1054,13 @@ sock_put(child); return ret; } + +EXPORT_SYMBOL(tcp_check_req); +EXPORT_SYMBOL(tcp_child_process); +EXPORT_SYMBOL(tcp_create_openreq_child); +EXPORT_SYMBOL(tcp_timewait_state_process); +EXPORT_SYMBOL(tcp_tw_deschedule); + +#ifdef CONFIG_SYSCTL +EXPORT_SYMBOL(sysctl_tcp_tw_recycle); +#endif diff -Nru a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c --- a/net/ipv4/tcp_output.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/tcp_output.c Wed Oct 8 12:24:57 2003 @@ -39,6 +39,7 @@ #include #include +#include #include /* People can turn this off for buggy TCP's found in printers etc. */ @@ -1542,3 +1543,14 @@ min(tp->rto << tp->backoff, TCP_RESOURCE_PROBE_INTERVAL)); } } + +EXPORT_SYMBOL(tcp_acceptable_seq); +EXPORT_SYMBOL(tcp_connect); +EXPORT_SYMBOL(tcp_connect_init); +EXPORT_SYMBOL(tcp_make_synack); +EXPORT_SYMBOL(tcp_send_synack); +EXPORT_SYMBOL(tcp_simple_retransmit); +EXPORT_SYMBOL(tcp_sync_mss); +EXPORT_SYMBOL(tcp_transmit_skb); +EXPORT_SYMBOL(tcp_write_wakeup); +EXPORT_SYMBOL(tcp_write_xmit); diff -Nru a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c --- a/net/ipv4/tcp_timer.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv4/tcp_timer.c Wed Oct 8 12:24:57 2003 @@ -20,6 +20,7 @@ * Jorge Cwik, */ +#include #include int sysctl_tcp_syn_retries = TCP_SYN_RETRIES; @@ -656,3 +657,8 @@ bh_unlock_sock(sk); sock_put(sk); } + +EXPORT_SYMBOL(tcp_clear_xmit_timers); +EXPORT_SYMBOL(tcp_delete_keepalive_timer); +EXPORT_SYMBOL(tcp_init_xmit_timers); +EXPORT_SYMBOL(tcp_reset_keepalive_timer); diff -Nru a/net/ipv4/udp.c b/net/ipv4/udp.c --- a/net/ipv4/udp.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/udp.c Wed Oct 8 12:24:55 2003 @@ -83,6 +83,7 @@ #include #include #include +#include #include #include #include @@ -175,7 +176,9 @@ if (inet2->num == snum && sk2 != sk && !ipv6_only_sock(sk2) && - sk2->sk_bound_dev_if == sk->sk_bound_dev_if && + (!sk2->sk_bound_dev_if || + !sk->sk_bound_dev_if || + sk2->sk_bound_dev_if == sk->sk_bound_dev_if) && (!inet2->rcv_saddr || !inet->rcv_saddr || inet2->rcv_saddr == inet->rcv_saddr) && @@ -1532,3 +1535,17 @@ udp_proc_unregister(&udp4_seq_afinfo); } #endif /* CONFIG_PROC_FS */ + +EXPORT_SYMBOL(udp_connect); +EXPORT_SYMBOL(udp_disconnect); +EXPORT_SYMBOL(udp_hash); +EXPORT_SYMBOL(udp_hash_lock); +EXPORT_SYMBOL(udp_ioctl); +EXPORT_SYMBOL(udp_port_rover); +EXPORT_SYMBOL(udp_prot); +EXPORT_SYMBOL(udp_sendmsg); + +#ifdef CONFIG_PROC_FS +EXPORT_SYMBOL(udp_proc_register); +EXPORT_SYMBOL(udp_proc_unregister); +#endif diff -Nru a/net/ipv4/utils.c b/net/ipv4/utils.c --- a/net/ipv4/utils.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv4/utils.c Wed Oct 8 12:24:56 2003 @@ -21,6 +21,7 @@ * 2 of the License, or (at your option) any later version. */ +#include #include #include @@ -55,3 +56,4 @@ return(htonl(l)); } +EXPORT_SYMBOL(in_aton); diff -Nru a/net/ipv4/xfrm4_tunnel.c b/net/ipv4/xfrm4_tunnel.c --- a/net/ipv4/xfrm4_tunnel.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv4/xfrm4_tunnel.c Wed Oct 8 12:24:55 2003 @@ -169,6 +169,7 @@ static struct inet_protocol ipip_protocol = { .handler = ipip_rcv, .err_handler = ipip_err, + .no_policy = 1, }; static int __init ipip_init(void) diff -Nru a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c --- a/net/ipv6/ipv6_sockglue.c Wed Oct 8 12:24:55 2003 +++ b/net/ipv6/ipv6_sockglue.c Wed Oct 8 12:24:55 2003 @@ -57,12 +57,9 @@ DEFINE_SNMP_STAT(struct ipv6_mib, ipv6_statistics); -static struct packet_type ipv6_packet_type = -{ +static struct packet_type ipv6_packet_type = { .type = __constant_htons(ETH_P_IPV6), - .dev = NULL, /* All devices */ .func = ipv6_rcv, - .data = PKT_CAN_SHARE_SKB, }; /* diff -Nru a/net/ipv6/mcast.c b/net/ipv6/mcast.c --- a/net/ipv6/mcast.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv6/mcast.c Wed Oct 8 12:24:57 2003 @@ -2029,6 +2029,9 @@ struct ifmcaddr6 *i; struct in6_addr maddr; + /* Deactivate timers */ + ipv6_mc_down(idev); + /* Delete all-nodes address. */ ipv6_addr_all_nodes(&maddr); diff -Nru a/net/ipv6/netfilter/ip6t_ipv6header.c b/net/ipv6/netfilter/ip6t_ipv6header.c --- a/net/ipv6/netfilter/ip6t_ipv6header.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv6/netfilter/ip6t_ipv6header.c Wed Oct 8 12:24:57 2003 @@ -126,18 +126,11 @@ return 1; } -static void -ipv6header_destroy(void *matchinfo, - unsigned int matchinfosize) -{ - return; -} - static struct ip6t_match ip6t_ipv6header_match = { .name = "ipv6header", .match = &ipv6header_match, .checkentry = &ipv6header_checkentry, - .destroy = &ipv6header_destroy, + .destroy = NULL, .me = THIS_MODULE, }; diff -Nru a/net/ipv6/netfilter/ip6t_owner.c b/net/ipv6/netfilter/ip6t_owner.c --- a/net/ipv6/netfilter/ip6t_owner.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv6/netfilter/ip6t_owner.c Wed Oct 8 12:24:57 2003 @@ -56,7 +56,7 @@ read_lock(&tasklist_lock); do_each_thread(g, p) { struct files_struct *files; - if (p->session != sid) + if (process_session(p) != sid) continue; task_lock(p); diff -Nru a/net/ipv6/sit.c b/net/ipv6/sit.c --- a/net/ipv6/sit.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv6/sit.c Wed Oct 8 12:24:57 2003 @@ -530,8 +530,6 @@ tunnel->err_count = 0; } - skb->h.raw = skb->nh.raw; - /* * Okay, now see if we can stuff it in the buffer as-is. */ @@ -553,6 +551,7 @@ iph6 = skb->nh.ipv6h; } + skb->h.raw = skb->nh.raw; skb->nh.raw = skb_push(skb, sizeof(struct iphdr)); memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); dst_release(skb->dst); diff -Nru a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c --- a/net/ipv6/tcp_ipv6.c Wed Oct 8 12:24:56 2003 +++ b/net/ipv6/tcp_ipv6.c Wed Oct 8 12:24:56 2003 @@ -101,7 +101,10 @@ /* We must walk the whole port owner list in this case. -DaveM */ sk_for_each_bound(sk2, node, &tb->owners) { - if (sk != sk2 && sk->sk_bound_dev_if == sk2->sk_bound_dev_if && + if (sk != sk2 && + (!sk->sk_bound_dev_if || + !sk2->sk_bound_dev_if || + sk->sk_bound_dev_if == sk2->sk_bound_dev_if) && (!sk->sk_reuse || !sk2->sk_reuse || sk2->sk_state == TCP_LISTEN) && ipv6_rcv_saddr_equal(sk, sk2)) diff -Nru a/net/ipv6/udp.c b/net/ipv6/udp.c --- a/net/ipv6/udp.c Wed Oct 8 12:24:57 2003 +++ b/net/ipv6/udp.c Wed Oct 8 12:24:57 2003 @@ -112,7 +112,9 @@ &udp_hash[snum & (UDP_HTABLE_SIZE - 1)]) { if (inet_sk(sk2)->num == snum && sk2 != sk && - sk2->sk_bound_dev_if == sk->sk_bound_dev_if && + (!sk2->sk_bound_dev_if || + !sk->sk_bound_dev_if || + sk2->sk_bound_dev_if == sk->sk_bound_dev_if) && (!sk2->sk_reuse || !sk->sk_reuse) && ipv6_rcv_saddr_equal(sk, sk2)) goto fail; diff -Nru a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c --- a/net/ipx/af_ipx.c Wed Oct 8 12:24:55 2003 +++ b/net/ipx/af_ipx.c Wed Oct 8 12:24:55 2003 @@ -1920,13 +1920,11 @@ static struct packet_type ipx_8023_packet_type = { .type = __constant_htons(ETH_P_802_3), .func = ipx_rcv, - .data = PKT_CAN_SHARE_SKB, }; static struct packet_type ipx_dix_packet_type = { .type = __constant_htons(ETH_P_IPX), .func = ipx_rcv, - .data = PKT_CAN_SHARE_SKB, }; static struct notifier_block ipx_dev_notifier = { diff -Nru a/net/irda/Kconfig b/net/irda/Kconfig --- a/net/irda/Kconfig Wed Oct 8 12:24:56 2003 +++ b/net/irda/Kconfig Wed Oct 8 12:24:56 2003 @@ -22,9 +22,8 @@ will need to install some OBEX application, such as OpenObex : - This support is also available as a module called irda. If you - want to compile it as a module, say M here and read - . + To compile this support as a module, choose M here: the module will + be called irda. comment "IrDA protocols" depends on IRDA diff -Nru a/net/irda/ircomm/Kconfig b/net/irda/ircomm/Kconfig --- a/net/irda/ircomm/Kconfig Wed Oct 8 12:24:55 2003 +++ b/net/irda/ircomm/Kconfig Wed Oct 8 12:24:55 2003 @@ -2,12 +2,11 @@ tristate "IrCOMM protocol" depends on IRDA help - Say Y here if you want to build support for the IrCOMM protocol. If - you want to compile it as a module (you will get ircomm and - ircomm-tty), say M here and read . + Say Y here if you want to build support for the IrCOMM protocol. + To compile it as modules, choose M here: the modules will be + called ircomm and ircomm_tty. IrCOMM implements serial port emulation, and makes it possible to use all existing applications that understands TTY's with an infrared link. Thus you should be able to use application like PPP, - minicom and others. Enabling this option will create two modules - called ircomm and ircomm_tty. + minicom and others. diff -Nru a/net/irda/irda_device.c b/net/irda/irda_device.c --- a/net/irda/irda_device.c Wed Oct 8 12:24:56 2003 +++ b/net/irda/irda_device.c Wed Oct 8 12:24:56 2003 @@ -85,11 +85,12 @@ int __init irda_device_init( void) { - dongles = hashbin_new(HB_LOCK); + dongles = hashbin_new(HB_NOLOCK); if (dongles == NULL) { printk(KERN_WARNING "IrDA: Can't allocate dongles hashbin!\n"); return -ENOMEM; } + spin_lock_init(&dongles->hb_spinlock); tasks = hashbin_new(HB_LOCK); if (tasks == NULL) { @@ -104,12 +105,20 @@ return 0; } +static void __exit leftover_dongle(void *arg) +{ + struct dongle_reg *reg = arg; + printk(KERN_WARNING "IrDA: Dongle type %x not unregistered\n", + reg->type); +} + void __exit irda_device_cleanup(void) { IRDA_DEBUG(4, "%s()\n", __FUNCTION__); hashbin_delete(tasks, (FREE_FUNC) __irda_task_delete); - hashbin_delete(dongles, NULL); + + hashbin_delete(dongles, leftover_dongle); } /* @@ -378,8 +387,6 @@ dev->hard_header_len = 0; dev->addr_len = 0; - dev->destructor = free_netdev; - dev->type = ARPHRD_IRDA; dev->tx_queue_len = 8; /* Window size + 1 s-frame */ @@ -390,6 +397,17 @@ } /* + * Funciton alloc_irdadev + * Allocates and sets up an IRDA device in a manner similar to + * alloc_etherdev. + */ +struct net_device *alloc_irdadev(int sizeof_priv) +{ + return alloc_netdev(sizeof_priv, "irda%d", irda_device_setup); +} + + +/* * Function irda_device_txqueue_empty (dev) * * Check if there is still some frames in the transmit queue for this @@ -415,25 +433,34 @@ dongle_t *irda_device_dongle_init(struct net_device *dev, int type) { struct dongle_reg *reg; - dongle_t *dongle; + dongle_t *dongle = NULL; + + might_sleep(); - ASSERT(dev != NULL, return NULL;); + spin_lock(&dongles->hb_spinlock); + reg = hashbin_find(dongles, type, NULL); #ifdef CONFIG_KMOD - ASSERT(!in_interrupt(), return NULL;); /* Try to load the module needed */ - request_module("irda-dongle-%d", type); + if (!reg && capable(CAP_SYS_MODULE)) { + spin_unlock(&dongles->hb_spinlock); + + request_module("irda-dongle-%d", type); + + spin_lock(&dongles->hb_spinlock); + reg = hashbin_find(dongles, type, NULL); + } #endif - if (!(reg = hashbin_lock_find(dongles, type, NULL))) { - ERROR("IrDA: Unable to find requested dongle\n"); - return NULL; + if (!reg || !try_module_get(reg->owner) ) { + ERROR("IrDA: Unable to find requested dongle type %x\n", type); + goto out; } /* Allocate dongle info for this instance */ dongle = kmalloc(sizeof(dongle_t), GFP_KERNEL); if (!dongle) - return NULL; + goto out; memset(dongle, 0, sizeof(dongle_t)); @@ -441,6 +468,8 @@ dongle->issue = reg; dongle->dev = dev; + out: + spin_unlock(&dongles->hb_spinlock); return dongle; } @@ -452,7 +481,7 @@ ASSERT(dongle != NULL, return -1;); dongle->issue->close(dongle); - + module_put(dongle->issue->owner); kfree(dongle); return 0; @@ -463,14 +492,16 @@ */ int irda_device_register_dongle(struct dongle_reg *new) { + spin_lock(&dongles->hb_spinlock); /* Check if this dongle has been registered before */ - if (hashbin_lock_find(dongles, new->type, NULL)) { - MESSAGE("%s: Dongle already registered\n", __FUNCTION__); - return 0; - } - - /* Insert IrDA dongle into hashbin */ - hashbin_insert(dongles, (irda_queue_t *) new, new->type, NULL); + if (hashbin_find(dongles, new->type, NULL)) { + MESSAGE("%s: Dongle type %x already registered\n", + __FUNCTION__, new->type); + } else { + /* Insert IrDA dongle into hashbin */ + hashbin_insert(dongles, (irda_queue_t *) new, new->type, NULL); + } + spin_unlock(&dongles->hb_spinlock); return 0; } @@ -485,11 +516,11 @@ { struct dongle *node; + spin_lock(&dongles->hb_spinlock); node = hashbin_remove(dongles, dongle->type, NULL); - if (!node) { + if (!node) ERROR("%s: dongle not found!\n", __FUNCTION__); - return; - } + spin_unlock(&dongles->hb_spinlock); } /* diff -Nru a/net/irda/irlmp.c b/net/irda/irlmp.c --- a/net/irda/irlmp.c Wed Oct 8 12:24:57 2003 +++ b/net/irda/irlmp.c Wed Oct 8 12:24:57 2003 @@ -1787,22 +1787,21 @@ #define LSAP_START_TOKEN ((void *)1) #define LINK_START_TOKEN ((void *)2) -static void *irlmp_seq_hb_idx(struct irlmp_iter_state *iter, - hashbin_t *bin, loff_t *off) +static void *irlmp_seq_hb_idx(struct irlmp_iter_state *iter, loff_t *off) { void *element; - spin_lock_irqsave(&bin->hb_spinlock, iter->flags); - for (element = hashbin_get_first(bin); + spin_lock_irqsave(&iter->hashbin->hb_spinlock, iter->flags); + for (element = hashbin_get_first(iter->hashbin); element != NULL; - element = hashbin_get_next(bin)) { + element = hashbin_get_next(iter->hashbin)) { if (!off || *off-- == 0) { /* NB: hashbin left locked */ - iter->hashbin = bin; return element; } } - spin_unlock_irqrestore(&bin->hb_spinlock, iter->flags); + spin_unlock_irqrestore(&iter->hashbin->hb_spinlock, iter->flags); + iter->hashbin = NULL; return NULL; } @@ -1813,18 +1812,19 @@ void *v; loff_t off = *pos; - iter->hashbin = NULL; if (off-- == 0) return LSAP_START_TOKEN; - v = irlmp_seq_hb_idx(iter, irlmp->unconnected_lsaps, &off); + iter->hashbin = irlmp->unconnected_lsaps; + v = irlmp_seq_hb_idx(iter, &off); if (v) return v; if (off-- == 0) return LINK_START_TOKEN; - return irlmp_seq_hb_idx(iter, irlmp->links, &off); + iter->hashbin = irlmp->links; + return irlmp_seq_hb_idx(iter, &off); } static void *irlmp_seq_next(struct seq_file *seq, void *v, loff_t *pos) @@ -1833,27 +1833,29 @@ ++*pos; - if (v == LSAP_START_TOKEN) { - v = irlmp_seq_hb_idx(iter, irlmp->unconnected_lsaps, NULL); + if (v == LSAP_START_TOKEN) { /* start of list of lsaps */ + iter->hashbin = irlmp->unconnected_lsaps; + v = irlmp_seq_hb_idx(iter, NULL); return v ? v : LINK_START_TOKEN; } - if (v == LINK_START_TOKEN) - return irlmp_seq_hb_idx(iter, irlmp->links, NULL); - - ASSERT( iter->hashbin != NULL, return NULL; ); + if (v == LINK_START_TOKEN) { /* start of list of links */ + iter->hashbin = irlmp->links; + return irlmp_seq_hb_idx(iter, NULL); + } v = hashbin_get_next(iter->hashbin); - if (v) - return v; - spin_unlock_irqrestore(&iter->hashbin->hb_spinlock, iter->flags); + if (v == NULL) { /* no more in this hash bin */ + spin_unlock_irqrestore(&iter->hashbin->hb_spinlock, + iter->flags); + + if (iter->hashbin == irlmp->unconnected_lsaps) + v = LINK_START_TOKEN; - if (iter->hashbin == irlmp->unconnected_lsaps) { iter->hashbin = NULL; - return LINK_START_TOKEN; } - return NULL; + return v; } static void irlmp_seq_stop(struct seq_file *seq, void *v) diff -Nru a/net/irda/irnet/Kconfig b/net/irda/irnet/Kconfig --- a/net/irda/irnet/Kconfig Wed Oct 8 12:24:57 2003 +++ b/net/irda/irnet/Kconfig Wed Oct 8 12:24:57 2003 @@ -2,11 +2,10 @@ tristate "IrNET protocol" depends on IRDA && PPP help - Say Y here if you want to build support for the IrNET protocol. If - you want to compile it as a module (irnet), say M here and read - . IrNET is a PPP driver, so you - will also need a working PPP subsystem (driver, daemon and - config)... + Say Y here if you want to build support for the IrNET protocol. + To compile it as a module, choose M here: the module will be + called irnet. IrNET is a PPP driver, so you will also need a + working PPP subsystem (driver, daemon and config)... IrNET is an alternate way to tranfer TCP/IP traffic over IrDA. It uses synchronous PPP over a set of point to point IrDA sockets. You diff -Nru a/net/irda/irsyms.c b/net/irda/irsyms.c --- a/net/irda/irsyms.c Wed Oct 8 12:24:57 2003 +++ b/net/irda/irsyms.c Wed Oct 8 12:24:57 2003 @@ -150,6 +150,7 @@ EXPORT_SYMBOL(irda_init_max_qos_capabilies); EXPORT_SYMBOL(irda_qos_bits_to_value); EXPORT_SYMBOL(irda_device_setup); +EXPORT_SYMBOL(alloc_irdadev); EXPORT_SYMBOL(irda_device_set_media_busy); EXPORT_SYMBOL(irda_device_txqueue_empty); @@ -186,13 +187,9 @@ /* Packet type handler. * Tell the kernel how IrDA packets should be handled. */ -static struct packet_type irda_packet_type = -{ +static struct packet_type irda_packet_type = { .type = __constant_htons(ETH_P_IRDA), - .dev = NULL, /* Wildcard : All devices */ .func = irlap_driver_rcv, /* Packet type handler irlap_frame.c */ - .data = PKT_CAN_SHARE_SKB, - //.next = NULL, }; /* @@ -309,7 +306,6 @@ #endif /* Remove IrDA packet type (stop receiving packets) */ - irda_packet_type.type = htons(ETH_P_IRDA); dev_remove_pack(&irda_packet_type); /* Stop receiving interfaces notifications */ diff -Nru a/net/lapb/lapb_in.c b/net/lapb/lapb_in.c --- a/net/lapb/lapb_in.c Wed Oct 8 12:24:57 2003 +++ b/net/lapb/lapb_in.c Wed Oct 8 12:24:57 2003 @@ -702,7 +702,10 @@ { struct lapb_frame frame; - lapb_decode(lapb, skb, &frame); + if (lapb_decode(lapb, skb, &frame) < 0) { + kfree_skb(skb); + return; + } switch (lapb->state) { case LAPB_STATE_0: diff -Nru a/net/lapb/lapb_subr.c b/net/lapb/lapb_subr.c --- a/net/lapb/lapb_subr.c Wed Oct 8 12:24:56 2003 +++ b/net/lapb/lapb_subr.c Wed Oct 8 12:24:56 2003 @@ -107,8 +107,8 @@ * This routine is the centralised routine for parsing the control * information for the different frame formats. */ -void lapb_decode(struct lapb_cb *lapb, struct sk_buff *skb, - struct lapb_frame *frame) +int lapb_decode(struct lapb_cb *lapb, struct sk_buff *skb, + struct lapb_frame *frame) { frame->type = LAPB_ILLEGAL; @@ -118,6 +118,12 @@ skb->data[0], skb->data[1], skb->data[2]); #endif + /* We always need to look at 2 bytes, sometimes we need + * to look at 3 and those cases are handled below. + */ + if (!pskb_may_pull(skb, 2)) + return -1; + if (lapb->mode & LAPB_MLP) { if (lapb->mode & LAPB_DCE) { if (skb->data[0] == LAPB_ADDR_D) @@ -148,6 +154,8 @@ if (lapb->mode & LAPB_EXTENDED) { if (!(skb->data[0] & LAPB_S)) { + if (!pskb_may_pull(skb, 2)) + return -1; /* * I frame - carries NR/NS/PF */ @@ -159,6 +167,8 @@ frame->control[1] = skb->data[1]; skb_pull(skb, 2); } else if ((skb->data[0] & LAPB_U) == 1) { + if (!pskb_may_pull(skb, 2)) + return -1; /* * S frame - take out PF/NR */ @@ -206,6 +216,8 @@ skb_pull(skb, 1); } + + return 0; } /* diff -Nru a/net/llc/llc_core.c b/net/llc/llc_core.c --- a/net/llc/llc_core.c Wed Oct 8 12:24:55 2003 +++ b/net/llc/llc_core.c Wed Oct 8 12:24:55 2003 @@ -140,13 +140,11 @@ static struct packet_type llc_packet_type = { .type = __constant_htons(ETH_P_802_2), .func = llc_rcv, - .data = PKT_CAN_SHARE_SKB, }; static struct packet_type llc_tr_packet_type = { .type = __constant_htons(ETH_P_TR_802_2), .func = llc_rcv, - .data = PKT_CAN_SHARE_SKB, }; static int __init llc_init(void) diff -Nru a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c --- a/net/netlink/af_netlink.c Wed Oct 8 12:24:56 2003 +++ b/net/netlink/af_netlink.c Wed Oct 8 12:24:56 2003 @@ -898,8 +898,18 @@ size = NLMSG_SPACE(4 + NLMSG_ALIGN(nlh->nlmsg_len)); skb = alloc_skb(size, GFP_KERNEL); - if (!skb) + if (!skb) { + struct sock *sk; + + sk = netlink_lookup(in_skb->sk->sk_protocol, + NETLINK_CB(in_skb).pid); + if (sk) { + sk->sk_err = ENOBUFS; + sk->sk_error_report(sk); + sock_put(sk); + } return; + } rep = __nlmsg_put(skb, NETLINK_CB(in_skb).pid, nlh->nlmsg_seq, NLMSG_ERROR, sizeof(struct nlmsgerr)); @@ -1133,4 +1143,22 @@ module_exit(netlink_proto_exit); MODULE_LICENSE("GPL"); + MODULE_ALIAS_NETPROTO(PF_NETLINK); + +EXPORT_SYMBOL(netlink_ack); +EXPORT_SYMBOL(netlink_broadcast); +EXPORT_SYMBOL(netlink_broadcast_deliver); +EXPORT_SYMBOL(netlink_dump_start); +EXPORT_SYMBOL(netlink_kernel_create); +EXPORT_SYMBOL(netlink_register_notifier); +EXPORT_SYMBOL(netlink_set_err); +EXPORT_SYMBOL(netlink_set_nonroot); +EXPORT_SYMBOL(netlink_unicast); +EXPORT_SYMBOL(netlink_unregister_notifier); + +#if defined(CONFIG_NETLINK_DEV) || defined(CONFIG_NETLINK_DEV_MODULE) +EXPORT_SYMBOL(netlink_attach); +EXPORT_SYMBOL(netlink_detach); +EXPORT_SYMBOL(netlink_post); +#endif diff -Nru a/net/netsyms.c b/net/netsyms.c --- a/net/netsyms.c Wed Oct 8 12:24:56 2003 +++ /dev/null Wed Dec 31 16:00:00 1969 @@ -1,640 +0,0 @@ -/* - * linux/net/netsyms.c - * - * Symbol table for the linux networking subsystem. Moved here to - * make life simpler in ksyms.c. - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef CONFIG_HIPPI -#include -#endif -#include -#include -#include -#include -#include -#ifdef CONFIG_NET_DIVERT -#include -#endif /* CONFIG_NET_DIVERT */ - -#ifdef CONFIG_NET -extern __u32 sysctl_wmem_max; -extern __u32 sysctl_rmem_max; -#endif - -#ifdef CONFIG_INET -#include -#include -#include -#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#if defined(CONFIG_INET_AH) || defined(CONFIG_INET_AH_MODULE) || defined(CONFIG_INET6_AH) || defined(CONFIG_INET6_AH_MODULE) -#include -#endif -#if defined(CONFIG_INET_ESP) || defined(CONFIG_INET_ESP_MODULE) || defined(CONFIG_INET6_ESP) || defined(CONFIG_INET6_ESP_MODULE) -#include -#endif - -extern struct net_proto_family inet_family_ops; - -#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) \ - || defined (CONFIG_IP_SCTP_MODULE) -#include -#include -#include -#include -#include -#include - -extern int sysctl_local_port_range[2]; -extern int tcp_port_rover; -extern int udp_port_rover; -#endif - -#endif - -#include - -#ifdef CONFIG_IPX_MODULE -extern struct datalink_proto *make_EII_client(void); -extern struct datalink_proto *make_8023_client(void); -extern void destroy_EII_client(struct datalink_proto *); -extern void destroy_8023_client(struct datalink_proto *); -#endif - -#ifdef CONFIG_ATALK_MODULE -#include -#endif - -#ifdef CONFIG_SYSCTL -extern int sysctl_max_syn_backlog; -#endif - -/* Skbuff symbols. */ -EXPORT_SYMBOL(skb_over_panic); -EXPORT_SYMBOL(skb_under_panic); - -/* Socket layer registration */ -EXPORT_SYMBOL(sock_register); -EXPORT_SYMBOL(sock_unregister); - -/* Socket locking */ -EXPORT_SYMBOL(__lock_sock); -EXPORT_SYMBOL(__release_sock); - -/* Socket layer support routines */ -EXPORT_SYMBOL(memcpy_fromiovec); -EXPORT_SYMBOL(memcpy_tokerneliovec); -EXPORT_SYMBOL(sock_create); -EXPORT_SYMBOL(sock_alloc); -EXPORT_SYMBOL(sock_release); -EXPORT_SYMBOL(sock_setsockopt); -EXPORT_SYMBOL(sock_getsockopt); -EXPORT_SYMBOL(sock_sendmsg); -EXPORT_SYMBOL(sock_recvmsg); -EXPORT_SYMBOL(sk_alloc); -EXPORT_SYMBOL(sk_free); -EXPORT_SYMBOL(sk_send_sigurg); -EXPORT_SYMBOL(sock_wake_async); -EXPORT_SYMBOL(sock_alloc_send_skb); -EXPORT_SYMBOL(sock_alloc_send_pskb); -EXPORT_SYMBOL(sock_init_data); -EXPORT_SYMBOL(sock_no_release); -EXPORT_SYMBOL(sock_no_bind); -EXPORT_SYMBOL(sock_no_connect); -EXPORT_SYMBOL(sock_no_socketpair); -EXPORT_SYMBOL(sock_no_accept); -EXPORT_SYMBOL(sock_no_getname); -EXPORT_SYMBOL(sock_no_poll); -EXPORT_SYMBOL(sock_no_ioctl); -EXPORT_SYMBOL(sock_no_listen); -EXPORT_SYMBOL(sock_no_shutdown); -EXPORT_SYMBOL(sock_no_getsockopt); -EXPORT_SYMBOL(sock_no_setsockopt); -EXPORT_SYMBOL(sock_no_sendmsg); -EXPORT_SYMBOL(sock_no_recvmsg); -EXPORT_SYMBOL(sock_no_mmap); -EXPORT_SYMBOL(sock_no_sendpage); -EXPORT_SYMBOL(sock_rfree); -EXPORT_SYMBOL(sock_wfree); -EXPORT_SYMBOL(sock_wmalloc); -EXPORT_SYMBOL(sock_rmalloc); -EXPORT_SYMBOL(__skb_linearize); -EXPORT_SYMBOL(skb_checksum); -EXPORT_SYMBOL(skb_checksum_help); -EXPORT_SYMBOL(skb_recv_datagram); -EXPORT_SYMBOL(skb_free_datagram); -EXPORT_SYMBOL(skb_copy_datagram); -EXPORT_SYMBOL(skb_copy_datagram_iovec); -EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec); -EXPORT_SYMBOL(skb_copy_bits); -EXPORT_SYMBOL(skb_copy_and_csum_bits); -EXPORT_SYMBOL(skb_copy_and_csum_dev); -EXPORT_SYMBOL(skb_copy_expand); -EXPORT_SYMBOL(___pskb_trim); -EXPORT_SYMBOL(__pskb_pull_tail); -EXPORT_SYMBOL(pskb_expand_head); -EXPORT_SYMBOL(pskb_copy); -EXPORT_SYMBOL(skb_realloc_headroom); -EXPORT_SYMBOL(datagram_poll); -EXPORT_SYMBOL(put_cmsg); -EXPORT_SYMBOL(sock_kmalloc); -EXPORT_SYMBOL(sock_kfree_s); -EXPORT_SYMBOL(sock_map_fd); -EXPORT_SYMBOL(sockfd_lookup); - -EXPORT_SYMBOL(sk_run_filter); -EXPORT_SYMBOL(sk_chk_filter); - -EXPORT_SYMBOL(neigh_table_init); -EXPORT_SYMBOL(neigh_table_clear); -EXPORT_SYMBOL(neigh_resolve_output); -EXPORT_SYMBOL(neigh_connected_output); -EXPORT_SYMBOL(neigh_update); -EXPORT_SYMBOL(neigh_create); -EXPORT_SYMBOL(neigh_lookup); -EXPORT_SYMBOL(__neigh_event_send); -EXPORT_SYMBOL(neigh_event_ns); -EXPORT_SYMBOL(neigh_ifdown); -#ifdef CONFIG_ARPD -EXPORT_SYMBOL(neigh_app_ns); -#endif -#ifdef CONFIG_SYSCTL -EXPORT_SYMBOL(neigh_sysctl_register); -EXPORT_SYMBOL(neigh_sysctl_unregister); -#endif -EXPORT_SYMBOL(pneigh_lookup); -EXPORT_SYMBOL(pneigh_enqueue); -EXPORT_SYMBOL(neigh_destroy); -EXPORT_SYMBOL(neigh_parms_alloc); -EXPORT_SYMBOL(neigh_parms_release); -EXPORT_SYMBOL(neigh_rand_reach_time); -EXPORT_SYMBOL(neigh_compat_output); -EXPORT_SYMBOL(neigh_changeaddr); - -/* dst_entry */ -EXPORT_SYMBOL(dst_alloc); -EXPORT_SYMBOL(__dst_free); -EXPORT_SYMBOL(dst_destroy); - -/* misc. support routines */ -EXPORT_SYMBOL(net_ratelimit); -EXPORT_SYMBOL(net_random); -EXPORT_SYMBOL(net_srandom); - -/* Needed by smbfs.o */ -EXPORT_SYMBOL(__scm_destroy); -EXPORT_SYMBOL(__scm_send); - -/* Needed by unix.o */ -EXPORT_SYMBOL(scm_fp_dup); -EXPORT_SYMBOL(files_stat); -EXPORT_SYMBOL(memcpy_toiovec); - -#ifdef CONFIG_IPX_MODULE -EXPORT_SYMBOL(make_8023_client); -EXPORT_SYMBOL(destroy_8023_client); -EXPORT_SYMBOL(make_EII_client); -EXPORT_SYMBOL(destroy_EII_client); -#endif - -/* for 801q VLAN support */ -#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) -EXPORT_SYMBOL(dev_change_flags); -#endif - -EXPORT_SYMBOL(scm_detach_fds); - -#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) -EXPORT_SYMBOL(br_handle_frame_hook); -#endif - -#ifdef CONFIG_NET_DIVERT -EXPORT_SYMBOL(alloc_divert_blk); -EXPORT_SYMBOL(free_divert_blk); -#endif /* CONFIG_NET_DIVERT */ - -#ifdef CONFIG_INET -/* Internet layer registration */ -EXPORT_SYMBOL(inetdev_lock); -EXPORT_SYMBOL(inet_add_protocol); -EXPORT_SYMBOL(inet_del_protocol); -EXPORT_SYMBOL(inet_register_protosw); -EXPORT_SYMBOL(inet_unregister_protosw); -EXPORT_SYMBOL(ip_route_output_key); -EXPORT_SYMBOL(ip_route_input); -EXPORT_SYMBOL(icmp_send); -EXPORT_SYMBOL(icmp_statistics); -EXPORT_SYMBOL(icmp_err_convert); -EXPORT_SYMBOL(ip_options_compile); -EXPORT_SYMBOL(ip_options_undo); -EXPORT_SYMBOL(arp_send); -EXPORT_SYMBOL(arp_broken_ops); -EXPORT_SYMBOL(__ip_select_ident); -EXPORT_SYMBOL(ip_send_check); -EXPORT_SYMBOL(ip_fragment); -EXPORT_SYMBOL(inet_family_ops); -EXPORT_SYMBOL(in_aton); -EXPORT_SYMBOL(ip_mc_inc_group); -EXPORT_SYMBOL(ip_mc_dec_group); -EXPORT_SYMBOL(ip_mc_join_group); -EXPORT_SYMBOL(ip_finish_output); -EXPORT_SYMBOL(inet_stream_ops); -EXPORT_SYMBOL(inet_dgram_ops); -EXPORT_SYMBOL(ip_cmsg_recv); -EXPORT_SYMBOL(inet_addr_type); -EXPORT_SYMBOL(inet_select_addr); -EXPORT_SYMBOL(ip_dev_find); -EXPORT_SYMBOL(inetdev_by_index); -EXPORT_SYMBOL(in_dev_finish_destroy); -EXPORT_SYMBOL(ip_defrag); -EXPORT_SYMBOL(inet_peer_idlock); - -/* Route manipulation */ -EXPORT_SYMBOL(ip_rt_ioctl); -EXPORT_SYMBOL(devinet_ioctl); -EXPORT_SYMBOL(register_inetaddr_notifier); -EXPORT_SYMBOL(unregister_inetaddr_notifier); - -/* proc */ -#ifdef CONFIG_PROC_FS -EXPORT_SYMBOL(udp_proc_register); -EXPORT_SYMBOL(udp_proc_unregister); -EXPORT_SYMBOL(tcp_proc_register); -EXPORT_SYMBOL(tcp_proc_unregister); -#endif - -/* needed for ip_gre -cw */ -EXPORT_SYMBOL(ip_statistics); -#if defined(CONFIG_INET_ESP) || defined(CONFIG_INET_ESP_MODULE) || defined(CONFIG_INET6_ESP) || defined(CONFIG_INET6_ESP_MODULE) -EXPORT_SYMBOL_GPL(skb_cow_data); -EXPORT_SYMBOL_GPL(pskb_put); -EXPORT_SYMBOL_GPL(skb_to_sgvec); -#endif - -EXPORT_SYMBOL(flow_cache_lookup); -EXPORT_SYMBOL(flow_cache_genid); - -#if defined (CONFIG_IPV6_MODULE) || defined (CONFIG_IP_SCTP_MODULE) -/* inet functions common to v4 and v6 */ -EXPORT_SYMBOL(inet_release); -EXPORT_SYMBOL(inet_stream_connect); -EXPORT_SYMBOL(inet_dgram_connect); -EXPORT_SYMBOL(inet_accept); -EXPORT_SYMBOL(inet_listen); -EXPORT_SYMBOL(inet_shutdown); -EXPORT_SYMBOL(inet_setsockopt); -EXPORT_SYMBOL(inet_getsockopt); -EXPORT_SYMBOL(inet_sendmsg); -EXPORT_SYMBOL(inet_recvmsg); -#ifdef INET_REFCNT_DEBUG -EXPORT_SYMBOL(inet_sock_nr); -#endif -EXPORT_SYMBOL(inet_sock_destruct); -EXPORT_SYMBOL(inet_sock_release); - -/* Socket demultiplexing. */ -EXPORT_SYMBOL(tcp_hashinfo); -EXPORT_SYMBOL(tcp_listen_wlock); -EXPORT_SYMBOL(udp_hash); -EXPORT_SYMBOL(udp_hash_lock); - -EXPORT_SYMBOL(tcp_destroy_sock); -EXPORT_SYMBOL(ip_queue_xmit); -EXPORT_SYMBOL(memcpy_fromiovecend); -EXPORT_SYMBOL(csum_partial_copy_fromiovecend); -EXPORT_SYMBOL(tcp_v4_lookup_listener); -/* UDP/TCP exported functions for TCPv6 */ -EXPORT_SYMBOL(udp_ioctl); -EXPORT_SYMBOL(udp_connect); -EXPORT_SYMBOL(udp_disconnect); -EXPORT_SYMBOL(udp_sendmsg); -EXPORT_SYMBOL(tcp_bind_hash); -EXPORT_SYMBOL(tcp_close); -EXPORT_SYMBOL(tcp_disconnect); -EXPORT_SYMBOL(tcp_accept); -EXPORT_SYMBOL(tcp_write_wakeup); -EXPORT_SYMBOL(tcp_write_space); -EXPORT_SYMBOL(tcp_poll); -EXPORT_SYMBOL(tcp_ioctl); -EXPORT_SYMBOL(tcp_shutdown); -EXPORT_SYMBOL(tcp_setsockopt); -EXPORT_SYMBOL(tcp_getsockopt); -EXPORT_SYMBOL(tcp_recvmsg); -EXPORT_SYMBOL(tcp_send_synack); -EXPORT_SYMBOL(tcp_check_req); -EXPORT_SYMBOL(tcp_child_process); -EXPORT_SYMBOL(tcp_parse_options); -EXPORT_SYMBOL(tcp_rcv_established); -EXPORT_SYMBOL(tcp_init_xmit_timers); -EXPORT_SYMBOL(tcp_clear_xmit_timers); -EXPORT_SYMBOL(tcp_statistics); -EXPORT_SYMBOL(tcp_rcv_state_process); -EXPORT_SYMBOL(tcp_timewait_state_process); -EXPORT_SYMBOL(tcp_timewait_cachep); -EXPORT_SYMBOL(tcp_sendmsg); -EXPORT_SYMBOL(tcp_v4_rebuild_header); -EXPORT_SYMBOL(tcp_v4_send_check); -EXPORT_SYMBOL(tcp_v4_conn_request); -EXPORT_SYMBOL(tcp_create_openreq_child); -EXPORT_SYMBOL(tcp_bucket_create); -EXPORT_SYMBOL(tcp_put_port); -EXPORT_SYMBOL(tcp_inherit_port); -EXPORT_SYMBOL(tcp_v4_syn_recv_sock); -EXPORT_SYMBOL(tcp_v4_do_rcv); -EXPORT_SYMBOL(tcp_v4_connect); -EXPORT_SYMBOL(tcp_unhash); -EXPORT_SYMBOL(udp_prot); -EXPORT_SYMBOL(tcp_prot); -EXPORT_SYMBOL(tcp_openreq_cachep); -EXPORT_SYMBOL(ipv4_specific); -EXPORT_SYMBOL(tcp_simple_retransmit); -EXPORT_SYMBOL(tcp_transmit_skb); -EXPORT_SYMBOL(tcp_connect); -EXPORT_SYMBOL(tcp_make_synack); -EXPORT_SYMBOL(tcp_tw_deschedule); -EXPORT_SYMBOL(tcp_delete_keepalive_timer); -EXPORT_SYMBOL(tcp_reset_keepalive_timer); -EXPORT_SYMBOL(sysctl_local_port_range); -EXPORT_SYMBOL(tcp_port_rover); -EXPORT_SYMBOL(udp_port_rover); -EXPORT_SYMBOL(tcp_sync_mss); -EXPORT_SYMBOL(net_statistics); -EXPORT_SYMBOL(__tcp_mem_reclaim); -EXPORT_SYMBOL(tcp_sockets_allocated); -EXPORT_SYMBOL(sysctl_tcp_reordering); -EXPORT_SYMBOL(sysctl_tcp_rmem); -EXPORT_SYMBOL(sysctl_tcp_wmem); -EXPORT_SYMBOL(sysctl_tcp_ecn); -EXPORT_SYMBOL(tcp_cwnd_application_limited); -EXPORT_SYMBOL(tcp_sendpage); -EXPORT_SYMBOL(sysctl_tcp_low_latency); - -EXPORT_SYMBOL(tcp_write_xmit); - -EXPORT_SYMBOL(tcp_v4_remember_stamp); - -extern int sysctl_tcp_tw_recycle; - -#ifdef CONFIG_SYSCTL -EXPORT_SYMBOL(sysctl_tcp_tw_recycle); -EXPORT_SYMBOL(sysctl_max_syn_backlog); -#endif - -EXPORT_SYMBOL(ip_generic_getfrag); - -#endif - -EXPORT_SYMBOL(tcp_read_sock); - -#ifdef CONFIG_IP_SCTP_MODULE -EXPORT_SYMBOL(ip_setsockopt); -EXPORT_SYMBOL(ip_getsockopt); -EXPORT_SYMBOL(inet_ioctl); -EXPORT_SYMBOL(inet_bind); -EXPORT_SYMBOL(inet_getname); -#endif /* CONFIG_IP_SCTP_MODULE */ - -EXPORT_SYMBOL(netlink_set_err); -EXPORT_SYMBOL(netlink_broadcast); -EXPORT_SYMBOL(netlink_unicast); -EXPORT_SYMBOL(netlink_kernel_create); -EXPORT_SYMBOL(netlink_dump_start); -EXPORT_SYMBOL(netlink_ack); -EXPORT_SYMBOL(netlink_set_nonroot); -EXPORT_SYMBOL(netlink_register_notifier); -EXPORT_SYMBOL(netlink_unregister_notifier); -#if defined(CONFIG_NETLINK_DEV) || defined(CONFIG_NETLINK_DEV_MODULE) -EXPORT_SYMBOL(netlink_attach); -EXPORT_SYMBOL(netlink_detach); -EXPORT_SYMBOL(netlink_post); -#endif - -EXPORT_SYMBOL(rtattr_parse); -EXPORT_SYMBOL(__rta_fill); -EXPORT_SYMBOL(neigh_delete); -EXPORT_SYMBOL(neigh_add); -EXPORT_SYMBOL(neigh_dump_info); - - -/* ABI emulation layers need this */ -EXPORT_SYMBOL(move_addr_to_kernel); -EXPORT_SYMBOL(move_addr_to_user); - -/* Used by at least ipip.c. */ -EXPORT_SYMBOL(ipv4_config); - -/* Used by other modules */ -EXPORT_SYMBOL(xrlim_allow); - -EXPORT_SYMBOL(ip_rcv); -EXPORT_SYMBOL(arp_rcv); -EXPORT_SYMBOL(arp_tbl); -#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) -EXPORT_SYMBOL(clip_tbl_hook); -#endif -EXPORT_SYMBOL(arp_find); - -#endif /* CONFIG_INET */ - -#ifdef CONFIG_TR -EXPORT_SYMBOL(tr_source_route); -EXPORT_SYMBOL(tr_type_trans); -#endif - -/* Device callback registration */ -EXPORT_SYMBOL(register_netdevice_notifier); -EXPORT_SYMBOL(unregister_netdevice_notifier); -EXPORT_SYMBOL(call_netdevice_notifiers); - -/* support for loadable net drivers */ -#ifdef CONFIG_NET -EXPORT_SYMBOL(loopback_dev); -EXPORT_SYMBOL(register_netdevice); -EXPORT_SYMBOL(unregister_netdevice); -EXPORT_SYMBOL(free_netdev); -EXPORT_SYMBOL(synchronize_net); -EXPORT_SYMBOL(netdev_state_change); -EXPORT_SYMBOL(netdev_boot_setup_check); -EXPORT_SYMBOL(dev_new_index); -EXPORT_SYMBOL(dev_get_by_flags); -EXPORT_SYMBOL(__dev_get_by_flags); -EXPORT_SYMBOL(dev_get_by_index); -EXPORT_SYMBOL(__dev_get_by_index); -EXPORT_SYMBOL(dev_get_by_name); -EXPORT_SYMBOL(__dev_get_by_name); -EXPORT_SYMBOL(dev_getbyhwaddr); -EXPORT_SYMBOL(netdev_set_master); -EXPORT_SYMBOL(eth_type_trans); -#ifdef CONFIG_FDDI -EXPORT_SYMBOL(fddi_type_trans); -#endif /* CONFIG_FDDI */ -#if 0 -EXPORT_SYMBOL(eth_copy_and_sum); -#endif -EXPORT_SYMBOL(alloc_skb); -EXPORT_SYMBOL(__kfree_skb); -EXPORT_SYMBOL(skb_clone); -EXPORT_SYMBOL(skb_copy); -EXPORT_SYMBOL(skb_pad); -EXPORT_SYMBOL(netif_rx); -EXPORT_SYMBOL(netif_receive_skb); -EXPORT_SYMBOL(dev_add_pack); -EXPORT_SYMBOL(dev_remove_pack); -EXPORT_SYMBOL(__dev_remove_pack); -EXPORT_SYMBOL(__dev_get); -EXPORT_SYMBOL(dev_alloc); -EXPORT_SYMBOL(dev_alloc_name); -EXPORT_SYMBOL(__netdev_watchdog_up); -#ifdef CONFIG_KMOD -EXPORT_SYMBOL(dev_load); -#endif -EXPORT_SYMBOL(dev_ioctl); -EXPORT_SYMBOL(dev_queue_xmit); -#ifdef CONFIG_NET_HW_FLOWCONTROL -EXPORT_SYMBOL(netdev_dropping); -EXPORT_SYMBOL(netdev_register_fc); -EXPORT_SYMBOL(netdev_unregister_fc); -EXPORT_SYMBOL(netdev_fc_xoff); -#endif -EXPORT_SYMBOL(dev_base); -EXPORT_SYMBOL(dev_base_lock); -EXPORT_SYMBOL(dev_open); -EXPORT_SYMBOL(dev_close); -EXPORT_SYMBOL(dev_mc_add); -EXPORT_SYMBOL(dev_mc_delete); -EXPORT_SYMBOL(dev_mc_upload); -EXPORT_SYMBOL(dev_set_allmulti); -EXPORT_SYMBOL(dev_set_promiscuity); -EXPORT_SYMBOL(__kill_fasync); - -EXPORT_SYMBOL(rtnl); -EXPORT_SYMBOL(rtnetlink_links); -EXPORT_SYMBOL(rtnetlink_dump_ifinfo); -EXPORT_SYMBOL(rtnetlink_put_metrics); -EXPORT_SYMBOL(rtnl_sem); -EXPORT_SYMBOL(rtnl_lock); -EXPORT_SYMBOL(rtnl_unlock); - -#ifdef CONFIG_HIPPI -EXPORT_SYMBOL(hippi_type_trans); -#endif - -#ifdef CONFIG_NET_FASTROUTE -EXPORT_SYMBOL(netdev_fastroute); -#endif - -#ifdef CONFIG_SYSCTL -EXPORT_SYMBOL(sysctl_wmem_max); -EXPORT_SYMBOL(sysctl_rmem_max); -#ifdef CONFIG_INET -EXPORT_SYMBOL(sysctl_ip_default_ttl); -#endif -#endif - -/* Packet scheduler modules want these. */ -EXPORT_SYMBOL(qdisc_destroy); -EXPORT_SYMBOL(qdisc_reset); -EXPORT_SYMBOL(qdisc_restart); -EXPORT_SYMBOL(qdisc_create_dflt); -EXPORT_SYMBOL(noop_qdisc); -EXPORT_SYMBOL(qdisc_tree_lock); -#ifdef CONFIG_NET_SCHED -PSCHED_EXPORTLIST; -EXPORT_SYMBOL(pfifo_qdisc_ops); -EXPORT_SYMBOL(bfifo_qdisc_ops); -EXPORT_SYMBOL(register_qdisc); -EXPORT_SYMBOL(unregister_qdisc); -EXPORT_SYMBOL(qdisc_get_rtab); -EXPORT_SYMBOL(qdisc_put_rtab); -EXPORT_SYMBOL(qdisc_copy_stats); -#ifdef CONFIG_NET_ESTIMATOR -EXPORT_SYMBOL(qdisc_new_estimator); -EXPORT_SYMBOL(qdisc_kill_estimator); -#endif -#ifdef CONFIG_NET_CLS_POLICE -EXPORT_SYMBOL(tcf_police); -EXPORT_SYMBOL(tcf_police_locate); -EXPORT_SYMBOL(tcf_police_destroy); -EXPORT_SYMBOL(tcf_police_dump); -#endif -#endif -#ifdef CONFIG_NET_CLS -EXPORT_SYMBOL(register_tcf_proto_ops); -EXPORT_SYMBOL(unregister_tcf_proto_ops); -#endif -#ifdef CONFIG_NETFILTER -#include -EXPORT_SYMBOL(nf_register_hook); -EXPORT_SYMBOL(nf_unregister_hook); -EXPORT_SYMBOL(nf_register_sockopt); -EXPORT_SYMBOL(nf_unregister_sockopt); -EXPORT_SYMBOL(nf_reinject); -EXPORT_SYMBOL(nf_register_queue_handler); -EXPORT_SYMBOL(nf_unregister_queue_handler); -EXPORT_SYMBOL(nf_hook_slow); -EXPORT_SYMBOL(nf_hooks); -EXPORT_SYMBOL(nf_setsockopt); -EXPORT_SYMBOL(nf_getsockopt); -EXPORT_SYMBOL(ip_ct_attach); -#ifdef CONFIG_INET -#include -EXPORT_SYMBOL(ip_route_me_harder); -#endif -#endif - -EXPORT_SYMBOL(register_gifconf); - -EXPORT_PER_CPU_SYMBOL(softnet_data); - -#ifdef CONFIG_NET_RADIO -#include /* Wireless Extensions driver API */ -EXPORT_SYMBOL(wireless_send_event); -EXPORT_SYMBOL(iw_handler_set_spy); -EXPORT_SYMBOL(iw_handler_get_spy); -EXPORT_SYMBOL(iw_handler_set_thrspy); -EXPORT_SYMBOL(iw_handler_get_thrspy); -EXPORT_SYMBOL(wireless_spy_update); -#endif /* CONFIG_NET_RADIO */ - -EXPORT_SYMBOL(linkwatch_fire_event); - -/* ethtool.c */ -EXPORT_SYMBOL(ethtool_op_get_link); -EXPORT_SYMBOL(ethtool_op_get_tx_csum); -EXPORT_SYMBOL(ethtool_op_set_tx_csum); -EXPORT_SYMBOL(ethtool_op_get_sg); -EXPORT_SYMBOL(ethtool_op_set_sg); -EXPORT_SYMBOL(ethtool_op_get_tso); -EXPORT_SYMBOL(ethtool_op_set_tso); - -#endif /* CONFIG_NET */ diff -Nru a/net/packet/af_packet.c b/net/packet/af_packet.c --- a/net/packet/af_packet.c Wed Oct 8 12:24:57 2003 +++ b/net/packet/af_packet.c Wed Oct 8 12:24:57 2003 @@ -227,7 +227,7 @@ * field for just this event. */ - sk = (struct sock *) pt->data; + sk = pt->af_packet_priv; /* * Yank back the headers [hope the device set this @@ -422,7 +422,7 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; - sk = (struct sock *) pt->data; + sk = pt->af_packet_priv; po = pkt_sk(sk); skb->dev = dev; @@ -525,7 +525,7 @@ if (skb->pkt_type == PACKET_LOOPBACK) goto drop; - sk = (struct sock *) pt->data; + sk = pt->af_packet_priv; po = pkt_sk(sk); if (dev->hard_header) { @@ -973,7 +973,7 @@ if (sock->type == SOCK_PACKET) po->prot_hook.func = packet_rcv_spkt; #endif - po->prot_hook.data = (void *)sk; + po->prot_hook.af_packet_priv = sk; if (protocol) { po->prot_hook.type = protocol; diff -Nru a/net/sched/cls_api.c b/net/sched/cls_api.c --- a/net/sched/cls_api.c Wed Oct 8 12:24:56 2003 +++ b/net/sched/cls_api.c Wed Oct 8 12:24:56 2003 @@ -467,3 +467,6 @@ #endif return 0; } + +EXPORT_SYMBOL(register_tcf_proto_ops); +EXPORT_SYMBOL(unregister_tcf_proto_ops); diff -Nru a/net/sched/estimator.c b/net/sched/estimator.c --- a/net/sched/estimator.c Wed Oct 8 12:24:55 2003 +++ b/net/sched/estimator.c Wed Oct 8 12:24:55 2003 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -194,3 +195,5 @@ } } +EXPORT_SYMBOL(qdisc_kill_estimator); +EXPORT_SYMBOL(qdisc_new_estimator); diff -Nru a/net/sched/police.c b/net/sched/police.c --- a/net/sched/police.c Wed Oct 8 12:24:57 2003 +++ b/net/sched/police.c Wed Oct 8 12:24:57 2003 @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -248,3 +249,12 @@ skb_trim(skb, b - skb->data); return -1; } + +EXPORT_SYMBOL(tcf_police); +EXPORT_SYMBOL(tcf_police_destroy); +EXPORT_SYMBOL(tcf_police_dump); +EXPORT_SYMBOL(tcf_police_hash); +EXPORT_SYMBOL(tcf_police_ht); +EXPORT_SYMBOL(tcf_police_locate); +EXPORT_SYMBOL(tcf_police_lookup); +EXPORT_SYMBOL(tcf_police_new_index); diff -Nru a/net/sched/sch_api.c b/net/sched/sch_api.c --- a/net/sched/sch_api.c Wed Oct 8 12:24:56 2003 +++ b/net/sched/sch_api.c Wed Oct 8 12:24:56 2003 @@ -1255,3 +1255,10 @@ return 0; } + +EXPORT_SYMBOL(qdisc_copy_stats); +EXPORT_SYMBOL(qdisc_get_rtab); +EXPORT_SYMBOL(qdisc_put_rtab); +EXPORT_SYMBOL(register_qdisc); +EXPORT_SYMBOL(unregister_qdisc); +PSCHED_EXPORTLIST; diff -Nru a/net/sched/sch_fifo.c b/net/sched/sch_fifo.c --- a/net/sched/sch_fifo.c Wed Oct 8 12:24:56 2003 +++ b/net/sched/sch_fifo.c Wed Oct 8 12:24:56 2003 @@ -203,3 +203,6 @@ .dump = fifo_dump, .owner = THIS_MODULE, }; + +EXPORT_SYMBOL(bfifo_qdisc_ops); +EXPORT_SYMBOL(pfifo_qdisc_ops); diff -Nru a/net/sched/sch_generic.c b/net/sched/sch_generic.c --- a/net/sched/sch_generic.c Wed Oct 8 12:24:55 2003 +++ b/net/sched/sch_generic.c Wed Oct 8 12:24:55 2003 @@ -531,3 +531,12 @@ spin_unlock_bh(&dev->queue_lock); write_unlock(&qdisc_tree_lock); } + +EXPORT_SYMBOL(__netdev_watchdog_up); +EXPORT_SYMBOL(noop_qdisc); +EXPORT_SYMBOL(noop_qdisc_ops); +EXPORT_SYMBOL(qdisc_create_dflt); +EXPORT_SYMBOL(qdisc_destroy); +EXPORT_SYMBOL(qdisc_reset); +EXPORT_SYMBOL(qdisc_restart); +EXPORT_SYMBOL(qdisc_tree_lock); diff -Nru a/net/sctp/Kconfig b/net/sctp/Kconfig --- a/net/sctp/Kconfig Wed Oct 8 12:24:56 2003 +++ b/net/sctp/Kconfig Wed Oct 8 12:24:56 2003 @@ -32,10 +32,8 @@ -- network-level fault tolerance through supporting of multi- homing at either or both ends of an association." - This protocol support is also available as a module ( = code which - can be inserted in and removed from the running kernel whenever you - want). The module will be called sctp. If you want to compile it - as a module, say M here and read . + To compile this protocol support as a module, choose M here: the + module will be called sctp. If in doubt, say N. diff -Nru a/net/sctp/associola.c b/net/sctp/associola.c --- a/net/sctp/associola.c Wed Oct 8 12:24:55 2003 +++ b/net/sctp/associola.c Wed Oct 8 12:24:55 2003 @@ -141,9 +141,9 @@ * socket values. */ asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt; - asoc->rto_initial = sp->rtoinfo.srto_initial * HZ / 1000; - asoc->rto_max = sp->rtoinfo.srto_max * HZ / 1000; - asoc->rto_min = sp->rtoinfo.srto_min * HZ / 1000; + asoc->rto_initial = MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); + asoc->rto_max = MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); + asoc->rto_min = MSECS_TO_JIFFIES(sp->rtoinfo.srto_min); asoc->overall_error_count = 0; @@ -168,7 +168,8 @@ asoc->c.sinit_num_ostreams = sp->initmsg.sinit_num_ostreams; asoc->max_init_attempts = sp->initmsg.sinit_max_attempts; - asoc->max_init_timeo = sp->initmsg.sinit_max_init_timeo * HZ / 1000; + asoc->max_init_timeo = + MSECS_TO_JIFFIES(sp->initmsg.sinit_max_init_timeo); /* Allocate storage for the ssnmap after the inbound and outbound * streams have been negotiated during Init. @@ -246,6 +247,11 @@ */ asoc->peer.sack_needed = 1; + /* Assume that the peer recongizes ASCONF until reported otherwise + * via an ERROR chunk. + */ + asoc->peer.asconf_capable = 1; + /* Create an input queue. */ sctp_inq_init(&asoc->base.inqueue); sctp_inq_set_th_handler(&asoc->base.inqueue, @@ -495,7 +501,7 @@ /* Initialize the peer's heartbeat interval based on the * sock configured value. */ - peer->hb_interval = sp->paddrparam.spp_hbinterval * HZ; + peer->hb_interval = MSECS_TO_JIFFIES(sp->paddrparam.spp_hbinterval); /* Set the path max_retrans. */ peer->max_retrans = asoc->max_retrans; diff -Nru a/net/sctp/bind_addr.c b/net/sctp/bind_addr.c --- a/net/sctp/bind_addr.c Wed Oct 8 12:24:57 2003 +++ b/net/sctp/bind_addr.c Wed Oct 8 12:24:57 2003 @@ -324,6 +324,43 @@ return 0; } +/* Find the first address in the bind address list that is not present in + * the addrs packed array. + */ +union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr *bp, + const union sctp_addr *addrs, + int addrcnt, + struct sctp_opt *opt) +{ + struct sctp_sockaddr_entry *laddr; + union sctp_addr *addr; + void *addr_buf; + struct sctp_af *af; + struct list_head *pos; + int i; + + list_for_each(pos, &bp->address_list) { + laddr = list_entry(pos, struct sctp_sockaddr_entry, list); + + addr_buf = (union sctp_addr *)addrs; + for (i = 0; i < addrcnt; i++) { + addr = (union sctp_addr *)addr_buf; + af = sctp_get_af_specific(addr->v4.sin_family); + if (!af) + return NULL; + + if (opt->pf->cmp_addr(&laddr->a, addr, opt)) + break; + + addr_buf += af->sockaddr_len; + } + if (i == addrcnt) + return &laddr->a; + } + + return NULL; +} + /* Copy out addresses from the global local address list. */ static int sctp_copy_one_addr(struct sctp_bind_addr *dest, union sctp_addr *addr, diff -Nru a/net/sctp/endpointola.c b/net/sctp/endpointola.c --- a/net/sctp/endpointola.c Wed Oct 8 12:24:55 2003 +++ b/net/sctp/endpointola.c Wed Oct 8 12:24:55 2003 @@ -129,7 +129,7 @@ ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = SCTP_DEFAULT_TIMEOUT_T1_INIT; ep->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = - sp->rtoinfo.srto_initial * HZ / 1000; + MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); ep->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0; ep->timeouts[SCTP_EVENT_TIMEOUT_T4_RTO] = 0; @@ -138,7 +138,7 @@ * recommended value of 5 times 'RTO.Max'. */ ep->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] - = 5 * (sp->rtoinfo.srto_max * HZ / 1000); + = 5 * MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = SCTP_DEFAULT_TIMEOUT_HEARTBEAT; diff -Nru a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c --- a/net/sctp/sm_make_chunk.c Wed Oct 8 12:24:55 2003 +++ b/net/sctp/sm_make_chunk.c Wed Oct 8 12:24:55 2003 @@ -1,5 +1,5 @@ /* SCTP kernel reference Implementation - * Copyright (C) IBM Corp. 2001, 2003 + * (C) Copyright IBM Corp. 2001, 2003 * Copyright (c) 1999-2000 Cisco, Inc. * Copyright (c) 1999-2001 Motorola, Inc. * Copyright (c) 2001-2002 Intel Corp. @@ -1288,7 +1288,7 @@ /* Set an expiration time for the cookie. */ do_gettimeofday(&cookie->c.expiration); - tv_add(&asoc->cookie_life, &cookie->c.expiration); + TIMEVAL_ADD(asoc->cookie_life, cookie->c.expiration); /* Copy the peer's init packet. */ memcpy(&cookie->c.peer_init[0], init_chunk->chunk_hdr, @@ -2021,11 +2021,11 @@ sctp_addiphdr_t asconf; struct sctp_chunk *retval; int length = sizeof(asconf) + vparam_len; - union sctp_params addrparam; + union sctp_addr_param addrparam; int addrlen; struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family); - addrlen = af->to_addr_param(addr, (union sctp_addr_param *)&addrparam); + addrlen = af->to_addr_param(addr, &addrparam); if (!addrlen) return NULL; length += addrlen; @@ -2046,6 +2046,83 @@ } /* ADDIP + * 3.2.1 Add IP Address + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type = 0xC001 | Length = Variable | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | ASCONF-Request Correlation ID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Address Parameter | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + * 3.2.2 Delete IP Address + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Type = 0xC002 | Length = Variable | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | ASCONF-Request Correlation ID | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Address Parameter | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + */ +struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc, + union sctp_addr *laddr, + struct sockaddr *addrs, + int addrcnt, + int flags) +{ + sctp_addip_param_t param; + struct sctp_chunk *retval; + union sctp_addr_param addr_param; + union sctp_addr *addr; + void *addr_buf; + struct sctp_af *af; + int paramlen = sizeof(param); + int addr_param_len = 0; + int totallen = 0; + int i; + + /* Get total length of all the address parameters. */ + addr_buf = addrs; + for (i = 0; i < addrcnt; i++) { + addr = (union sctp_addr *)addr_buf; + af = sctp_get_af_specific(addr->v4.sin_family); + addr_param_len = af->to_addr_param(addr, &addr_param); + + totallen += paramlen; + totallen += addr_param_len; + + addr_buf += af->sockaddr_len; + } + + /* Create an asconf chunk with the required length. */ + retval = sctp_make_asconf(asoc, laddr, totallen); + if (!retval) + return NULL; + + /* Add the address parameters to the asconf chunk. */ + addr_buf = addrs; + for (i = 0; i < addrcnt; i++) { + addr = (union sctp_addr *)addr_buf; + af = sctp_get_af_specific(addr->v4.sin_family); + addr_param_len = af->to_addr_param(addr, &addr_param); + param.param_hdr.type = flags; + param.param_hdr.length = htons(paramlen + addr_param_len); + param.crr_id = htonl(i); + + sctp_addto_chunk(retval, paramlen, ¶m); + sctp_addto_chunk(retval, addr_param_len, &addr_param); + + addr_buf += af->sockaddr_len; + } + return retval; +} + +/* ADDIP * 3.2.4 Set Primary IP Address * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 @@ -2065,11 +2142,11 @@ sctp_addip_param_t param; struct sctp_chunk *retval; int len = sizeof(param); - union sctp_params addrparam; + union sctp_addr_param addrparam; int addrlen; struct sctp_af *af = sctp_get_af_specific(addr->v4.sin_family); - addrlen = af->to_addr_param(addr, (union sctp_addr_param *)&addrparam); + addrlen = af->to_addr_param(addr, &addrparam); if (!addrlen) return NULL; len += addrlen; @@ -2089,11 +2166,7 @@ return retval; } -/* - * Unpack the parameters in an ASCONF chunk into an association and - * generate ASCONF-ACK chunk. - * - * ADDIP 3.1.2 Address Configuration Acknowledgement Chunk (ASCONF-ACK) +/* ADDIP 3.1.2 Address Configuration Acknowledgement Chunk (ASCONF-ACK) * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -2110,8 +2183,28 @@ * | ASCONF Parameter Response#N | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * - * All the parameter respoinces will be added in this function. + * Create an ASCONF_ACK chunk with enough space for the parameter responses. */ +struct sctp_chunk *sctp_make_asconf_ack(struct sctp_association *asoc, + int serial, int vparam_len) +{ + sctp_addiphdr_t asconf; + struct sctp_chunk *retval; + int length = sizeof(asconf) + vparam_len; + + /* Create the chunk. */ + retval = sctp_make_chunk(asoc, SCTP_CID_ASCONF_ACK, 0, length); + if (!retval) + return NULL; + + asconf.serial = serial; + + retval->subh.addip_hdr = + sctp_addto_chunk(retval, sizeof(asconf), &asconf); + + return retval; +} + struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc, struct sctp_chunk *asconf, int vparam_len) diff -Nru a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c --- a/net/sctp/sm_sideeffect.c Wed Oct 8 12:24:57 2003 +++ b/net/sctp/sm_sideeffect.c Wed Oct 8 12:24:57 2003 @@ -1,7 +1,7 @@ /* SCTP kernel reference Implementation + * (C) Copyright IBM Corp. 2001, 2003 * Copyright (c) 1999 Cisco, Inc. * Copyright (c) 1999-2001 Motorola, Inc. - * Copyright (c) 2001-2002 International Business Machines Corp. * * This file is part of the SCTP kernel reference Implementation * @@ -690,6 +690,44 @@ chunk->transport = t; } +/* Process an incoming Operation Error Chunk. */ +static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds, + struct sctp_association *asoc, + struct sctp_chunk *chunk) +{ + struct sctp_operr_chunk *operr_chunk; + struct sctp_errhdr *err_hdr; + + operr_chunk = (struct sctp_operr_chunk *)chunk->chunk_hdr; + err_hdr = &operr_chunk->err_hdr; + + switch (err_hdr->cause) { + case SCTP_ERROR_UNKNOWN_CHUNK: + { + struct sctp_chunkhdr *unk_chunk_hdr; + + unk_chunk_hdr = (struct sctp_chunkhdr *)err_hdr->variable; + switch (unk_chunk_hdr->type) { + /* ADDIP 4.1 A9) If the peer responds to an ASCONF with an + * ERROR chunk reporting that it did not recognized the ASCONF + * chunk type, the sender of the ASCONF MUST NOT send any + * further ASCONF chunks and MUST stop its T-4 timer. + */ + case SCTP_CID_ASCONF: + asoc->peer.asconf_capable = 0; + sctp_add_cmd_sf(cmds, SCTP_CMD_TIMER_STOP, + SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO)); + break; + default: + break; + } + break; + } + default: + break; + } +} + /* These three macros allow us to pull the debugging code out of the * main flow of sctp_do_sm() to keep attention focused on the real * functionality there. @@ -1205,6 +1243,9 @@ sctp_cmd_setup_t4(commands, asoc, cmd->obj.ptr); break; + case SCTP_CMD_PROCESS_OPERR: + sctp_cmd_process_operr(commands, asoc, chunk); + break; default: printk(KERN_WARNING "Impossible command: %u, %p\n", cmd->verb, cmd->obj.ptr); diff -Nru a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c --- a/net/sctp/sm_statefuns.c Wed Oct 8 12:24:55 2003 +++ b/net/sctp/sm_statefuns.c Wed Oct 8 12:24:55 2003 @@ -1,7 +1,7 @@ /* SCTP kernel reference Implementation + * (C) Copyright IBM Corp. 2001, 2003 * Copyright (c) 1999-2000 Cisco, Inc. * Copyright (c) 1999-2001 Motorola, Inc. - * Copyright (c) 2001-2002 International Business Machines, Corp. * Copyright (c) 2001-2002 Intel Corp. * Copyright (c) 2002 Nokia Corp. * @@ -2864,6 +2864,9 @@ sctp_ulpevent_free(ev); goto nomem; } + + sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR, + SCTP_CHUNK(chunk)); } return SCTP_DISPOSITION_CONSUME; diff -Nru a/net/sctp/socket.c b/net/sctp/socket.c --- a/net/sctp/socket.c Wed Oct 8 12:24:57 2003 +++ b/net/sctp/socket.c Wed Oct 8 12:24:57 2003 @@ -97,6 +97,8 @@ static inline int sctp_verify_addr(struct sock *, union sctp_addr *, int); static int sctp_bindx_add(struct sock *, struct sockaddr *, int); static int sctp_bindx_rem(struct sock *, struct sockaddr *, int); +static int sctp_send_asconf_add_ip(struct sock *, struct sockaddr *, int); +static int sctp_send_asconf_del_ip(struct sock *, struct sockaddr *, int); static int sctp_do_bind(struct sock *, union sctp_addr *, int); static int sctp_autobind(struct sock *sk); static void sctp_sock_migrate(struct sock *, struct sock *, @@ -349,6 +351,106 @@ return retval; } +/* Send an ASCONF chunk with Add IP address parameters to all the peers of the + * associations that are part of the endpoint indicating that a list of local + * addresses are added to the endpoint. + * + * If any of the addresses is already in the bind address list of the + * association, we do not send the chunk for that association. But it will not + * affect other associations. + * + * Only sctp_setsockopt_bindx() is supposed to call this function. + */ +static int sctp_send_asconf_add_ip(struct sock *sk, + struct sockaddr *addrs, + int addrcnt) +{ + struct sctp_opt *sp; + struct sctp_endpoint *ep; + struct sctp_association *asoc; + struct sctp_bind_addr *bp; + struct sctp_chunk *chunk; + struct sctp_sockaddr_entry *laddr; + union sctp_addr *addr; + void *addr_buf; + struct sctp_af *af; + struct list_head *pos; + struct list_head *p; + int i; + int retval = 0; + + sp = sctp_sk(sk); + ep = sp->ep; + + SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", + __FUNCTION__, sk, addrs, addrcnt); + + list_for_each(pos, &ep->asocs) { + asoc = list_entry(pos, struct sctp_association, asocs); + + if (!sctp_state(asoc, ESTABLISHED)) + continue; + + if (!asoc->peer.asconf_capable) + continue; + + /* Check if any address in the packed array of addresses is + * in the bind address list of the association. If so, + * do not send the asconf chunk to its peer, but continue with + * other associations. + */ + addr_buf = addrs; + for (i = 0; i < addrcnt; i++) { + addr = (union sctp_addr *)addr_buf; + af = sctp_get_af_specific(addr->v4.sin_family); + if (!af) { + retval = -EINVAL; + goto out; + } + + if (sctp_assoc_lookup_laddr(asoc, addr)) + break; + + addr_buf += af->sockaddr_len; + } + if (i < addrcnt) + continue; + + /* Use the first address in bind addr list of association as + * Address Parameter of ASCONF CHUNK. + */ + sctp_read_lock(&asoc->base.addr_lock); + bp = &asoc->base.bind_addr; + p = bp->address_list.next; + laddr = list_entry(p, struct sctp_sockaddr_entry, list); + sctp_read_unlock(&asoc->base.addr_lock); + + chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs, + addrcnt, SCTP_PARAM_ADD_IP); + if (!chunk) { + retval = -ENOMEM; + goto out; + } + + retval = sctp_primitive_ASCONF(asoc, chunk); + if (retval) { + sctp_chunk_free(chunk); + goto out; + } + + /* FIXME: After sending the add address ASCONF chunk, we + * cannot append the address to the association's binding + * address list, because the new address may be used as the + * source of a message sent to the peer before the ASCONF + * chunk is received by the peer. So we should wait until + * ASCONF_ACK is received. + */ + } + +out: + return retval; +} + /* Remove a list of addresses from bind addresses list. Do not remove the * last address. * @@ -436,6 +538,106 @@ return retval; } +/* Send an ASCONF chunk with Delete IP address parameters to all the peers of + * the associations that are part of the endpoint indicating that a list of + * local addresses are removed from the endpoint. + * + * If any of the addresses is already in the bind address list of the + * association, we do not send the chunk for that association. But it will not + * affect other associations. + * + * Only sctp_setsockopt_bindx() is supposed to call this function. + */ +static int sctp_send_asconf_del_ip(struct sock *sk, + struct sockaddr *addrs, + int addrcnt) +{ + struct sctp_opt *sp; + struct sctp_endpoint *ep; + struct sctp_association *asoc; + struct sctp_bind_addr *bp; + struct sctp_chunk *chunk; + union sctp_addr *laddr; + void *addr_buf; + struct sctp_af *af; + struct list_head *pos; + int i; + int retval = 0; + + sp = sctp_sk(sk); + ep = sp->ep; + + SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", + __FUNCTION__, sk, addrs, addrcnt); + + list_for_each(pos, &ep->asocs) { + asoc = list_entry(pos, struct sctp_association, asocs); + + if (!sctp_state(asoc, ESTABLISHED)) + continue; + + if (!asoc->peer.asconf_capable) + continue; + + /* Check if any address in the packed array of addresses is + * not present in the bind address list of the association. + * If so, do not send the asconf chunk to its peer, but + * continue with other associations. + */ + addr_buf = addrs; + for (i = 0; i < addrcnt; i++) { + laddr = (union sctp_addr *)addr_buf; + af = sctp_get_af_specific(laddr->v4.sin_family); + if (!af) { + retval = -EINVAL; + goto out; + } + + if (!sctp_assoc_lookup_laddr(asoc, laddr)) + break; + + addr_buf += af->sockaddr_len; + } + if (i < addrcnt) + continue; + + /* Find one address in the association's bind address list + * that is not in the packed array of addresses. This is to + * make sure that we do not delete all the addresses in the + * association. + */ + sctp_read_lock(&asoc->base.addr_lock); + bp = &asoc->base.bind_addr; + laddr = sctp_find_unmatch_addr(bp, (union sctp_addr *)addrs, + addrcnt, sp); + sctp_read_unlock(&asoc->base.addr_lock); + if (!laddr) + continue; + + chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt, + SCTP_PARAM_DEL_IP); + if (!chunk) { + retval = -ENOMEM; + goto out; + } + + retval = sctp_primitive_ASCONF(asoc, chunk); + if (retval) { + sctp_chunk_free(chunk); + goto out; + } + + /* FIXME: After sending the delete address ASCONF chunk, we + * cannot remove the addresses from the association's bind + * address list, because there maybe some packet send to + * the delete addresses, so we should wait until ASCONF_ACK + * packet is received. + */ + } +out: + return retval; +} + /* Helper for tunneling sctp_bindx() requests through sctp_setsockopt() * * API 8.1 @@ -564,10 +766,16 @@ switch (op) { case SCTP_BINDX_ADD_ADDR: err = sctp_bindx_add(sk, kaddrs, addrcnt); + if (err) + goto out; + err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt); break; case SCTP_BINDX_REM_ADDR: err = sctp_bindx_rem(sk, kaddrs, addrcnt); + if (err) + goto out; + err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt); break; default: @@ -575,6 +783,7 @@ break; }; +out: kfree(kaddrs); return err; @@ -962,8 +1171,8 @@ = sinit->sinit_max_attempts; } if (sinit->sinit_max_init_timeo) { - asoc->max_init_timeo - = sinit->sinit_max_init_timeo * HZ; + asoc->max_init_timeo = + MSECS_TO_JIFFIES(sinit->sinit_max_init_timeo); } } @@ -1401,7 +1610,8 @@ */ if (params.spp_hbinterval) { trans->hb_allowed = 1; - trans->hb_interval = params.spp_hbinterval * HZ / 1000; + trans->hb_interval = + MSECS_TO_JIFFIES(params.spp_hbinterval); } else trans->hb_allowed = 0; } @@ -1560,11 +1770,12 @@ if (asoc) { if (rtoinfo.srto_initial != 0) - asoc->rto_initial = rtoinfo.srto_initial * HZ / 1000; + asoc->rto_initial = + MSECS_TO_JIFFIES(rtoinfo.srto_initial); if (rtoinfo.srto_max != 0) - asoc->rto_max = rtoinfo.srto_max * HZ / 1000; + asoc->rto_max = MSECS_TO_JIFFIES(rtoinfo.srto_max); if (rtoinfo.srto_min != 0) - asoc->rto_min = rtoinfo.srto_min * HZ / 1000; + asoc->rto_min = MSECS_TO_JIFFIES(rtoinfo.srto_min); } else { /* If there is no association or the association-id = 0 * set the values to the endpoint. @@ -2088,14 +2299,14 @@ sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; sp->initmsg.sinit_max_instreams = sctp_max_instreams; sp->initmsg.sinit_max_attempts = sctp_max_retrans_init; - sp->initmsg.sinit_max_init_timeo = (sctp_rto_max / HZ) * 1000; + sp->initmsg.sinit_max_init_timeo = JIFFIES_TO_MSECS(sctp_rto_max); /* Initialize default RTO related parameters. These parameters can * be modified for with the SCTP_RTOINFO socket option. */ - sp->rtoinfo.srto_initial = (sctp_rto_initial / HZ) * 1000; - sp->rtoinfo.srto_max = (sctp_rto_max / HZ) * 1000; - sp->rtoinfo.srto_min = (sctp_rto_min / HZ) * 1000; + sp->rtoinfo.srto_initial = JIFFIES_TO_MSECS(sctp_rto_initial); + sp->rtoinfo.srto_max = JIFFIES_TO_MSECS(sctp_rto_max); + sp->rtoinfo.srto_min = JIFFIES_TO_MSECS(sctp_rto_min); /* Initialize default association related parameters. These parameters * can be modified with the SCTP_ASSOCINFO socket option. @@ -2104,8 +2315,8 @@ sp->assocparams.sasoc_number_peer_destinations = 0; sp->assocparams.sasoc_peer_rwnd = 0; sp->assocparams.sasoc_local_rwnd = 0; - sp->assocparams.sasoc_cookie_life = (sctp_valid_cookie_life / HZ) - * 1000; + sp->assocparams.sasoc_cookie_life = + JIFFIES_TO_MSECS(sctp_valid_cookie_life); /* Initialize default event subscriptions. By default, all the * options are off. @@ -2115,7 +2326,7 @@ /* Default Peer Address Parameters. These defaults can * be modified via SCTP_PEER_ADDR_PARAMS */ - sp->paddrparam.spp_hbinterval = (sctp_hb_interval / HZ) * 1000; + sp->paddrparam.spp_hbinterval = JIFFIES_TO_MSECS(sctp_hb_interval); sp->paddrparam.spp_pathmaxrxt = sctp_max_retrans_path; /* If enabled no SCTP message fragmentation will be performed. @@ -2265,7 +2476,7 @@ status.sstat_primary.spinfo_state = transport->active; status.sstat_primary.spinfo_cwnd = transport->cwnd; status.sstat_primary.spinfo_srtt = transport->srtt; - status.sstat_primary.spinfo_rto = (transport->rto / HZ) * 1000; + status.sstat_primary.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); status.sstat_primary.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2320,7 +2531,7 @@ pinfo.spinfo_state = transport->active; pinfo.spinfo_cwnd = transport->cwnd; pinfo.spinfo_srtt = transport->srtt; - pinfo.spinfo_rto = (transport->rto / HZ) * 1000; + pinfo.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); pinfo.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2524,7 +2735,7 @@ if (!trans->hb_allowed) params.spp_hbinterval = 0; else - params.spp_hbinterval = trans->hb_interval * 1000 / HZ; + params.spp_hbinterval = JIFFIES_TO_MSECS(trans->hb_interval); /* spp_pathmaxrxt contains the maximum number of retransmissions * before this address shall be considered unreachable. @@ -2582,10 +2793,8 @@ list_for_each(pos, &asoc->peer.transport_addr_list) { cnt ++; } - if (copy_to_user(optval, &cnt, sizeof(int))) - return -EFAULT; - return 0; + return cnt; } static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, @@ -2666,10 +2875,8 @@ list_for_each(pos, &bp->address_list) { cnt ++; } - if (copy_to_user(optval, &cnt, sizeof(int))) - return -EFAULT; - return 0; + return cnt; } static int sctp_getsockopt_local_addrs(struct sock *sk, int len, @@ -2879,9 +3086,9 @@ /* Values corresponding to the specific association. */ if (asoc) { - rtoinfo.srto_initial = (asoc->rto_initial / HZ) * 1000; - rtoinfo.srto_max = (asoc->rto_max / HZ) * 1000; - rtoinfo.srto_min = (asoc->rto_min / HZ) * 1000; + rtoinfo.srto_initial = JIFFIES_TO_MSECS(asoc->rto_initial); + rtoinfo.srto_max = JIFFIES_TO_MSECS(asoc->rto_max); + rtoinfo.srto_min = JIFFIES_TO_MSECS(asoc->rto_min); } else { /* Values corresponding to the endpoint. */ struct sctp_opt *sp = sctp_sk(sk); diff -Nru a/net/sctp/sysctl.c b/net/sctp/sysctl.c --- a/net/sctp/sysctl.c Wed Oct 8 12:24:56 2003 +++ b/net/sctp/sysctl.c Wed Oct 8 12:24:56 2003 @@ -44,7 +44,7 @@ #include static ctl_handler sctp_sysctl_jiffies_ms; -static long rto_timer_min = 0; +static long rto_timer_min = 1; static long rto_timer_max = 86400000; /* One day */ static ctl_table sctp_table[] = { diff -Nru a/net/socket.c b/net/socket.c --- a/net/socket.c Wed Oct 8 12:24:56 2003 +++ b/net/socket.c Wed Oct 8 12:24:56 2003 @@ -1989,3 +1989,18 @@ seq_printf(seq, "sockets: used %d\n", counter); } #endif /* CONFIG_PROC_FS */ + +/* ABI emulation layers need these two */ +EXPORT_SYMBOL(move_addr_to_kernel); +EXPORT_SYMBOL(move_addr_to_user); +EXPORT_SYMBOL(sock_alloc); +EXPORT_SYMBOL(sock_alloc_inode); +EXPORT_SYMBOL(sock_create); +EXPORT_SYMBOL(sock_map_fd); +EXPORT_SYMBOL(sock_recvmsg); +EXPORT_SYMBOL(sock_register); +EXPORT_SYMBOL(sock_release); +EXPORT_SYMBOL(sock_sendmsg); +EXPORT_SYMBOL(sock_unregister); +EXPORT_SYMBOL(sock_wake_async); +EXPORT_SYMBOL(sockfd_lookup); diff -Nru a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c --- a/net/sunrpc/auth_gss/auth_gss.c Wed Oct 8 12:24:56 2003 +++ b/net/sunrpc/auth_gss/auth_gss.c Wed Oct 8 12:24:56 2003 @@ -292,21 +292,59 @@ static void gss_release_msg(struct gss_upcall_msg *gss_msg) { - if (atomic_dec_and_test(&gss_msg->count)) - kfree(gss_msg); + struct gss_auth *gss_auth = gss_msg->auth; + + if (!atomic_dec_and_lock(&gss_msg->count, &gss_auth->lock)) + return; + if (!list_empty(&gss_msg->list)) + list_del(&gss_msg->list); + spin_unlock(&gss_auth->lock); + kfree(gss_msg); } static struct gss_upcall_msg * -gss_find_upcall(struct gss_auth *gss_auth, uid_t uid) +__gss_find_upcall(struct gss_auth *gss_auth, uid_t uid) { struct gss_upcall_msg *pos; list_for_each_entry(pos, &gss_auth->upcalls, list) { - if (pos->uid == uid) - return pos; + if (pos->uid != uid) + continue; + atomic_inc(&pos->count); + return pos; } return NULL; } +static struct gss_upcall_msg * +gss_find_upcall(struct gss_auth *gss_auth, uid_t uid) +{ + struct gss_upcall_msg *gss_msg; + + spin_lock(&gss_auth->lock); + gss_msg = __gss_find_upcall(gss_auth, uid); + spin_unlock(&gss_auth->lock); + return gss_msg; +} + +static void +__gss_unhash_msg(struct gss_upcall_msg *gss_msg) +{ + if (list_empty(&gss_msg->list)) + return; + list_del_init(&gss_msg->list); + rpc_wake_up(&gss_msg->waitq); +} + +static void +gss_unhash_msg(struct gss_upcall_msg *gss_msg) +{ + struct gss_auth *gss_auth = gss_msg->auth; + + spin_lock(&gss_auth->lock); + __gss_unhash_msg(gss_msg); + spin_unlock(&gss_auth->lock); +} + static void gss_release_callback(struct rpc_task *task) { @@ -315,12 +353,10 @@ struct gss_auth, rpc_auth); struct gss_upcall_msg *gss_msg; - spin_lock(&gss_auth->lock); gss_msg = gss_find_upcall(gss_auth, task->tk_msg.rpc_cred->cr_uid); - if (gss_msg) { - rpc_wake_up(&gss_msg->waitq); - } - spin_unlock(&gss_auth->lock); + BUG_ON(!gss_msg); + atomic_dec(&gss_msg->count); + gss_release_msg(gss_msg); } static int @@ -334,22 +370,22 @@ int res; retry: - gss_msg = gss_find_upcall(gss_auth, uid); - if (gss_msg == NULL && gss_new == NULL) { + gss_msg = __gss_find_upcall(gss_auth, uid); + if (gss_msg) + goto out_sleep; + if (gss_new == NULL) { spin_unlock(&gss_auth->lock); gss_new = kmalloc(sizeof(*gss_new), GFP_KERNEL); - spin_lock(&gss_auth->lock); if (gss_new) - goto retry; - return -ENOMEM; + return -ENOMEM; + spin_lock(&gss_auth->lock); + goto retry; } - if (gss_msg) - goto out_sleep; gss_msg = gss_new; memset(gss_new, 0, sizeof(*gss_new)); INIT_LIST_HEAD(&gss_new->list); INIT_RPC_WAITQ(&gss_new->waitq, "RPCSEC_GSS upcall waitq"); - atomic_set(&gss_new->count, 1); + atomic_set(&gss_new->count, 2); msg = &gss_new->msg; msg->data = &gss_new->uid; msg->len = sizeof(gss_new->uid); @@ -361,15 +397,14 @@ rpc_sleep_on(&gss_msg->waitq, task, gss_release_callback, NULL); spin_unlock(&gss_auth->lock); res = rpc_queue_upcall(dentry->d_inode, msg); - spin_lock(&gss_auth->lock); if (res) { - rpc_wake_up(&gss_msg->waitq); - list_del(&gss_msg->list); + gss_unhash_msg(gss_msg); gss_release_msg(gss_msg); } return res; out_sleep: - rpc_sleep_on(&gss_msg->waitq, task, NULL, NULL); + rpc_sleep_on(&gss_msg->waitq, task, gss_release_callback, NULL); + spin_unlock(&gss_auth->lock); if (gss_new) kfree(gss_new); return 0; @@ -386,7 +421,14 @@ if (mlen > buflen) mlen = buflen; left = copy_to_user(dst, data, mlen); - return mlen - left; + if (left < 0) { + msg->errno = left; + return left; + } + mlen -= left; + msg->copied += mlen; + msg->errno = 0; + return mlen; } static ssize_t @@ -432,14 +474,13 @@ else gss_cred_set_ctx(cred, ctx); spin_lock(&gss_auth->lock); - gss_msg = gss_find_upcall(gss_auth, acred.uid); + gss_msg = __gss_find_upcall(gss_auth, acred.uid); if (gss_msg) { - list_del(&gss_msg->list); - __rpc_purge_one_upcall(filp, &gss_msg->msg); - rpc_wake_up(&gss_msg->waitq); + __gss_unhash_msg(gss_msg); + spin_unlock(&gss_auth->lock); gss_release_msg(gss_msg); - } - spin_unlock(&gss_auth->lock); + } else + spin_unlock(&gss_auth->lock); rpc_release_client(clnt); return mlen; err: @@ -454,13 +495,10 @@ gss_pipe_destroy_msg(struct rpc_pipe_msg *msg) { struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg); - struct gss_auth *gss_auth = gss_msg->auth; - spin_lock(&gss_auth->lock); - list_del(&gss_msg->list); - rpc_wake_up(&gss_msg->waitq); + if (msg->errno < 0) + gss_unhash_msg(gss_msg); gss_release_msg(gss_msg); - spin_unlock(&gss_auth->lock); } /* diff -Nru a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c --- a/net/sunrpc/clnt.c Wed Oct 8 12:24:56 2003 +++ b/net/sunrpc/clnt.c Wed Oct 8 12:24:56 2003 @@ -960,6 +960,24 @@ switch ((n = ntohl(*p++))) { case RPC_SUCCESS: return p; + case RPC_PROG_UNAVAIL: + printk(KERN_WARNING "RPC: %4d call_verify: program %u is unsupported by server %s\n", + task->tk_pid, (unsigned int)task->tk_client->cl_prog, + task->tk_client->cl_server); + goto out_eio; + case RPC_PROG_MISMATCH: + printk(KERN_WARNING "RPC: %4d call_verify: program %u, version %u unsupported by server %s\n", + task->tk_pid, (unsigned int)task->tk_client->cl_prog, + (unsigned int)task->tk_client->cl_vers, + task->tk_client->cl_server); + goto out_eio; + case RPC_PROC_UNAVAIL: + printk(KERN_WARNING "RPC: %4d call_verify: proc %p unsupported by program %u, version %u on server %s\n", + task->tk_pid, task->tk_msg.rpc_proc, + task->tk_client->cl_prog, + task->tk_client->cl_vers, + task->tk_client->cl_server); + goto out_eio; case RPC_GARBAGE_ARGS: break; /* retry */ default: @@ -977,6 +995,7 @@ return NULL; } printk(KERN_WARNING "RPC: garbage, exit EIO\n"); +out_eio: rpc_exit(task, -EIO); return NULL; } diff -Nru a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c --- a/net/sunrpc/rpc_pipe.c Wed Oct 8 12:24:56 2003 +++ b/net/sunrpc/rpc_pipe.c Wed Oct 8 12:24:56 2003 @@ -59,43 +59,6 @@ up(&inode->i_sem); } -/* - * XXX should only be called in ->downcall - */ -void -__rpc_purge_current_upcall(struct file *filp) -{ - struct rpc_pipe_msg *msg; - - msg = filp->private_data; - filp->private_data = NULL; - - if (msg != NULL) - msg->errno = 0; -} - -void -__rpc_purge_one_upcall(struct file *filp, struct rpc_pipe_msg *target) -{ - struct rpc_inode *rpci = RPC_I(filp->f_dentry->d_inode); - struct rpc_pipe_msg *msg; - - msg = filp->private_data; - if (msg == target) { - filp->private_data = NULL; - goto found; - } - list_for_each_entry(msg, &rpci->pipe, list) { - if (msg == target) { - list_del(&msg->list); - goto found; - } - } - BUG(); -found: - return; -} - int rpc_queue_upcall(struct inode *inode, struct rpc_pipe_msg *msg) { @@ -198,14 +161,15 @@ list_del_init(&msg->list); rpci->pipelen -= msg->len; filp->private_data = msg; + msg->copied = 0; } if (msg == NULL) goto out_unlock; } + /* NOTE: it is up to the callback to update msg->copied */ res = rpci->ops->upcall(filp, msg, buf, len); if (res < 0 || msg->len == msg->copied) { filp->private_data = NULL; - msg->errno = 0; rpci->ops->destroy_msg(msg); } out_unlock: @@ -685,7 +649,7 @@ if (IS_ERR(dentry)) return dentry; dir = nd.dentry->d_inode; - inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IXUSR); + inode = rpc_get_inode(dir->i_sb, S_IFSOCK | S_IRUSR | S_IWUSR); if (!inode) goto err_dput; inode->i_ino = iunique(dir->i_sb, 100); diff -Nru a/net/sunrpc/sunrpc_syms.c b/net/sunrpc/sunrpc_syms.c --- a/net/sunrpc/sunrpc_syms.c Wed Oct 8 12:24:57 2003 +++ b/net/sunrpc/sunrpc_syms.c Wed Oct 8 12:24:57 2003 @@ -56,8 +56,6 @@ EXPORT_SYMBOL(rpc_wake_up); EXPORT_SYMBOL(rpc_queue_upcall); EXPORT_SYMBOL(rpc_mkpipe); -EXPORT_SYMBOL(__rpc_purge_current_upcall); -EXPORT_SYMBOL(__rpc_purge_one_upcall); /* Client transport */ EXPORT_SYMBOL(xprt_create_proto); diff -Nru a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c --- a/net/sunrpc/svcsock.c Wed Oct 8 12:24:55 2003 +++ b/net/sunrpc/svcsock.c Wed Oct 8 12:24:55 2003 @@ -1151,7 +1151,6 @@ if (!p) { set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(HZ/2); - current->state = TASK_RUNNING; continue; } rqstp->rq_argpages[rqstp->rq_arghi++] = p; diff -Nru a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c --- a/net/sunrpc/xprt.c Wed Oct 8 12:24:57 2003 +++ b/net/sunrpc/xprt.c Wed Oct 8 12:24:57 2003 @@ -579,14 +579,14 @@ /* Adjust congestion window */ if (!xprt->nocong) { + unsigned timer = task->tk_msg.rpc_proc->p_timer; xprt_adjust_cwnd(xprt, copied); __xprt_put_cong(xprt, req); - if (req->rq_ntrans == 1) { - unsigned timer = - task->tk_msg.rpc_proc->p_timer; - if (timer) + if (timer) { + if (req->rq_ntrans == 1) rpc_update_rtt(&clnt->cl_rtt, timer, (long)jiffies - req->rq_xtime); + rpc_set_timeo(&clnt->cl_rtt, timer, req->rq_ntrans - 1); } } @@ -1223,8 +1223,9 @@ /* Set the task's receive timeout value */ spin_lock_bh(&xprt->sock_lock); if (!xprt->nocong) { - task->tk_timeout = rpc_calc_rto(&clnt->cl_rtt, - task->tk_msg.rpc_proc->p_timer); + int timer = task->tk_msg.rpc_proc->p_timer; + task->tk_timeout = rpc_calc_rto(&clnt->cl_rtt, timer); + task->tk_timeout <<= rpc_ntimeo(&clnt->cl_rtt, timer); task->tk_timeout <<= clnt->cl_timeout.to_retries - req->rq_timeout.to_retries; if (task->tk_timeout > req->rq_timeout.to_maxval) diff -Nru a/net/unix/af_unix.c b/net/unix/af_unix.c --- a/net/unix/af_unix.c Wed Oct 8 12:24:57 2003 +++ b/net/unix/af_unix.c Wed Oct 8 12:24:57 2003 @@ -448,7 +448,7 @@ sk->sk_max_ack_backlog = backlog; sk->sk_state = TCP_LISTEN; /* set credentials so connect can copy them */ - sk->sk_peercred.pid = current->pid; + sk->sk_peercred.pid = current->tgid; sk->sk_peercred.uid = current->euid; sk->sk_peercred.gid = current->egid; err = 0; @@ -983,7 +983,7 @@ unix_peer(newsk) = sk; newsk->sk_state = TCP_ESTABLISHED; newsk->sk_type = SOCK_STREAM; - newsk->sk_peercred.pid = current->pid; + newsk->sk_peercred.pid = current->tgid; newsk->sk_peercred.uid = current->euid; newsk->sk_peercred.gid = current->egid; newu = unix_sk(newsk); @@ -1045,7 +1045,7 @@ sock_hold(skb); unix_peer(ska)=skb; unix_peer(skb)=ska; - ska->sk_peercred.pid = skb->sk_peercred.pid = current->pid; + ska->sk_peercred.pid = skb->sk_peercred.pid = current->tgid; ska->sk_peercred.uid = skb->sk_peercred.uid = current->euid; ska->sk_peercred.gid = skb->sk_peercred.gid = current->egid; diff -Nru a/net/wanrouter/af_wanpipe.c b/net/wanrouter/af_wanpipe.c --- a/net/wanrouter/af_wanpipe.c Wed Oct 8 12:24:57 2003 +++ b/net/wanrouter/af_wanpipe.c Wed Oct 8 12:24:57 2003 @@ -634,11 +634,8 @@ skb_queue_tail(&sk->sk_write_queue,skb); atomic_inc(&wp->packet_sent); - if (!(test_and_set_bit(0, &wp->timer))){ - del_timer(&wp->tx_timer); - wp->tx_timer.expires = jiffies + 1; - add_timer(&wp->tx_timer); - } + if (!(test_and_set_bit(0, &wp->timer))) + mod_timer(&wp->tx_timer, jiffies + 1); return(len); diff -Nru a/net/x25/af_x25.c b/net/x25/af_x25.c --- a/net/x25/af_x25.c Wed Oct 8 12:24:57 2003 +++ b/net/x25/af_x25.c Wed Oct 8 12:24:57 2003 @@ -345,10 +345,8 @@ if (atomic_read(&sk->sk_wmem_alloc) || atomic_read(&sk->sk_rmem_alloc)) { /* Defer: outstanding buffers */ - init_timer(&sk->sk_timer); sk->sk_timer.expires = jiffies + 10 * HZ; sk->sk_timer.function = x25_destroy_timer; - sk->sk_timer.data = (unsigned long)sk; add_timer(&sk->sk_timer); } else { /* drop last reference so sock_put will free */ @@ -463,6 +461,8 @@ goto out; } +void x25_init_timers(struct sock *sk); + static int x25_create(struct socket *sock, int protocol) { struct sock *sk; @@ -481,7 +481,7 @@ sock_init_data(sock, sk); sk_set_owner(sk, THIS_MODULE); - init_timer(&x25->timer); + x25_init_timers(sk); sock->ops = &x25_proto_ops; sk->sk_protocol = protocol; @@ -537,7 +537,7 @@ x25->facilities = ox25->facilities; x25->qbitincl = ox25->qbitincl; - init_timer(&x25->timer); + x25_init_timers(sk); out: return sk; } @@ -760,13 +760,14 @@ if (sk->sk_type != SOCK_SEQPACKET) goto out; + lock_sock(sk); rc = x25_wait_for_data(sk, sk->sk_rcvtimeo); if (rc) - goto out; + goto out2; skb = skb_dequeue(&sk->sk_receive_queue); rc = -EINVAL; if (!skb->sk) - goto out; + goto out2; newsk = skb->sk; newsk->sk_pair = NULL; newsk->sk_socket = newsock; @@ -779,6 +780,8 @@ newsock->sk = newsk; newsock->state = SS_CONNECTED; rc = 0; +out2: + release_sock(sk); out: return rc; } diff -Nru a/net/x25/x25_dev.c b/net/x25/x25_dev.c --- a/net/x25/x25_dev.c Wed Oct 8 12:24:56 2003 +++ b/net/x25/x25_dev.c Wed Oct 8 12:24:56 2003 @@ -100,9 +100,14 @@ int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev, struct packet_type *ptype) { + struct sk_buff *nskb; struct x25_neigh *nb; - skb->sk = NULL; + nskb = skb_copy(skb, GFP_ATOMIC); + if (!nskb) + goto drop; + kfree_skb(skb); + skb = nskb; /* * Packet received from unrecognised device, throw it away. diff -Nru a/net/x25/x25_link.c b/net/x25/x25_link.c --- a/net/x25/x25_link.c Wed Oct 8 12:24:55 2003 +++ b/net/x25/x25_link.c Wed Oct 8 12:24:55 2003 @@ -51,15 +51,9 @@ /* * Linux set/reset timer routines */ -static void x25_start_t20timer(struct x25_neigh *nb) +static inline void x25_start_t20timer(struct x25_neigh *nb) { - del_timer(&nb->t20timer); - - nb->t20timer.data = (unsigned long)nb; - nb->t20timer.function = &x25_t20timer_expiry; - nb->t20timer.expires = jiffies + nb->t20; - - add_timer(&nb->t20timer); + mod_timer(&nb->t20timer, jiffies + nb->t20); } static void x25_t20timer_expiry(unsigned long param) @@ -71,12 +65,12 @@ x25_start_t20timer(nb); } -static void x25_stop_t20timer(struct x25_neigh *nb) +static inline void x25_stop_t20timer(struct x25_neigh *nb) { del_timer(&nb->t20timer); } -static int x25_t20timer_pending(struct x25_neigh *nb) +static inline int x25_t20timer_pending(struct x25_neigh *nb) { return timer_pending(&nb->t20timer); } @@ -291,6 +285,8 @@ skb_queue_head_init(&nb->queue); init_timer(&nb->t20timer); + nb->t20timer.data = (unsigned long)nb; + nb->t20timer.function = &x25_t20timer_expiry; dev_hold(dev); nb->dev = dev; diff -Nru a/net/x25/x25_timer.c b/net/x25/x25_timer.c --- a/net/x25/x25_timer.c Wed Oct 8 12:24:55 2003 +++ b/net/x25/x25_timer.c Wed Oct 8 12:24:55 2003 @@ -43,15 +43,22 @@ static void x25_heartbeat_expiry(unsigned long); static void x25_timer_expiry(unsigned long); -void x25_start_heartbeat(struct sock *sk) +void x25_init_timers(struct sock *sk) { - del_timer(&sk->sk_timer); + struct x25_opt *x25 = x25_sk(sk); + init_timer(&x25->timer); + x25->timer.data = (unsigned long)sk; + x25->timer.function = &x25_timer_expiry; + + /* initialized by sock_init_data */ sk->sk_timer.data = (unsigned long)sk; sk->sk_timer.function = &x25_heartbeat_expiry; - sk->sk_timer.expires = jiffies + 5 * HZ; +} - add_timer(&sk->sk_timer); +void x25_start_heartbeat(struct sock *sk) +{ + mod_timer(&sk->sk_timer, jiffies + 5 * HZ); } void x25_stop_heartbeat(struct sock *sk) @@ -63,52 +70,28 @@ { struct x25_opt *x25 = x25_sk(sk); - del_timer(&x25->timer); - - x25->timer.data = (unsigned long)sk; - x25->timer.function = &x25_timer_expiry; - x25->timer.expires = jiffies + x25->t2; - - add_timer(&x25->timer); + mod_timer(&x25->timer, jiffies + x25->t2); } void x25_start_t21timer(struct sock *sk) { struct x25_opt *x25 = x25_sk(sk); - del_timer(&x25->timer); - - x25->timer.data = (unsigned long)sk; - x25->timer.function = &x25_timer_expiry; - x25->timer.expires = jiffies + x25->t21; - - add_timer(&x25->timer); + mod_timer(&x25->timer, jiffies + x25->t21); } void x25_start_t22timer(struct sock *sk) { struct x25_opt *x25 = x25_sk(sk); - del_timer(&x25->timer); - - x25->timer.data = (unsigned long)sk; - x25->timer.function = &x25_timer_expiry; - x25->timer.expires = jiffies + x25->t22; - - add_timer(&x25->timer); + mod_timer(&x25->timer, jiffies + x25->t22); } void x25_start_t23timer(struct sock *sk) { struct x25_opt *x25 = x25_sk(sk); - del_timer(&x25->timer); - - x25->timer.data = (unsigned long)sk; - x25->timer.function = &x25_timer_expiry; - x25->timer.expires = jiffies + x25->t23; - - add_timer(&x25->timer); + mod_timer(&x25->timer, jiffies + x25->t23); } void x25_stop_timer(struct sock *sk) diff -Nru a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c --- a/net/xfrm/xfrm_algo.c Wed Oct 8 12:24:56 2003 +++ b/net/xfrm/xfrm_algo.c Wed Oct 8 12:24:56 2003 @@ -8,7 +8,9 @@ * Software Foundation; either version 2 of the License, or (at your option) * any later version. */ + #include +#include #include #include #include @@ -617,6 +619,7 @@ BUG(); return elt; } +EXPORT_SYMBOL_GPL(skb_to_sgvec); /* Check that skb data bits are writable. If they are not, copy data * to newly created private area. If "tailbits" is given, make sure that @@ -717,6 +720,7 @@ return elt; } +EXPORT_SYMBOL_GPL(skb_cow_data); void *pskb_put(struct sk_buff *skb, struct sk_buff *tail, int len) { @@ -726,4 +730,5 @@ } return skb_put(tail, len); } +EXPORT_SYMBOL_GPL(pskb_put); #endif diff -Nru a/scripts/Makefile.build b/scripts/Makefile.build --- a/scripts/Makefile.build Wed Oct 8 12:24:57 2003 +++ b/scripts/Makefile.build Wed Oct 8 12:24:57 2003 @@ -25,27 +25,27 @@ ifdef EXTRA_TARGETS -$(warning kbuild: $(obj)/Makefile - Usage of EXTRA_TARGETS is obsolete in 2.5. Please fix!) +$(warning kbuild: $(obj)/Makefile - Usage of EXTRA_TARGETS is obsolete in 2.6. Please fix!) endif ifdef build-targets -$(warning kbuild: $(obj)/Makefile - Usage of build-targets is obsolete in 2.5. Please fix!) +$(warning kbuild: $(obj)/Makefile - Usage of build-targets is obsolete in 2.6. Please fix!) endif ifdef export-objs -$(warning kbuild: $(obj)/Makefile - Usage of export-objs is obsolete in 2.5. Please fix!) +$(warning kbuild: $(obj)/Makefile - Usage of export-objs is obsolete in 2.6. Please fix!) endif ifdef O_TARGET -$(warning kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete in 2.5. Please fix!) +$(warning kbuild: $(obj)/Makefile - Usage of O_TARGET := $(O_TARGET) is obsolete in 2.6. Please fix!) endif ifdef L_TARGET -$(error kbuild: $(obj)/Makefile - Use of L_TARGET is replaced by lib-y in 2.5. Please fix!) +$(error kbuild: $(obj)/Makefile - Use of L_TARGET is replaced by lib-y in 2.6. Please fix!) endif ifdef list-multi -$(warning kbuild: $(obj)/Makefile - list-multi := $(list-multi) is obsolete in 2.5. Please fix!) +$(warning kbuild: $(obj)/Makefile - list-multi := $(list-multi) is obsolete in 2.6. Please fix!) endif ifndef obj diff -Nru a/scripts/bin2c.c b/scripts/bin2c.c --- a/scripts/bin2c.c Wed Oct 8 12:24:57 2003 +++ b/scripts/bin2c.c Wed Oct 8 12:24:57 2003 @@ -1,3 +1,12 @@ +/* + * Unloved program to convert a binary on stdin to a C include on stdout + * + * Jan 1999 Matt Mackall + * + * This software may be used and distributed according to the terms + * of the GNU General Public License, incorporated herein by reference. + */ + #include int main(int argc, char *argv[]) diff -Nru a/scripts/pnmtologo.c b/scripts/pnmtologo.c --- a/scripts/pnmtologo.c Wed Oct 8 12:24:55 2003 +++ b/scripts/pnmtologo.c Wed Oct 8 12:24:55 2003 @@ -119,7 +119,8 @@ static void read_image(void) { FILE *fp; - int i, j, magic; + unsigned int i, j; + int magic; unsigned int maxval; /* open image file */ @@ -274,7 +275,7 @@ static void write_logo_mono(void) { - int i, j; + unsigned int i, j; unsigned char val, bit; /* validate image */ @@ -302,7 +303,7 @@ static void write_logo_vga16(void) { - int i, j, k; + unsigned int i, j, k; unsigned char val; /* validate image */ @@ -342,7 +343,7 @@ static void write_logo_clut224(void) { - int i, j, k; + unsigned int i, j, k; /* validate image */ for (i = 0; i < logo_height; i++) @@ -388,7 +389,7 @@ static void write_logo_gray256(void) { - int i, j; + unsigned int i, j; /* validate image */ for (i = 0; i < logo_height; i++) diff -Nru a/scripts/ver_linux b/scripts/ver_linux --- a/scripts/ver_linux Wed Oct 8 12:24:57 2003 +++ b/scripts/ver_linux Wed Oct 8 12:24:57 2003 @@ -28,7 +28,7 @@ mount --version | awk -F\- '{print "mount ", $NF}' -depmod -V 2>&1 | grep version | awk 'NR==1 {print "module-init-tools ",$NF}' +depmod -V 2>&1 | awk 'NR==1 {print "module-init-tools ",$NF}' tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \ 'NR==1 {print "e2fsprogs ", $2}' diff -Nru a/security/dummy.c b/security/dummy.c --- a/security/dummy.c Wed Oct 8 12:24:56 2003 +++ b/security/dummy.c Wed Oct 8 12:24:56 2003 @@ -364,7 +364,7 @@ return 0; } -static int dummy_inode_permission (struct inode *inode, int mask) +static int dummy_inode_permission (struct inode *inode, int mask, struct nameidata *nd) { return 0; } diff -Nru a/security/selinux/hooks.c b/security/selinux/hooks.c --- a/security/selinux/hooks.c Wed Oct 8 12:24:57 2003 +++ b/security/selinux/hooks.c Wed Oct 8 12:24:57 2003 @@ -1730,12 +1730,17 @@ return dentry_has_perm(current, NULL, dentry, FILE__READ); } -static int selinux_inode_permission(struct inode *inode, int mask) +static int selinux_inode_permission(struct inode *inode, int mask, + struct nameidata *nd) { if (!mask) { /* No permission to check. Existence test. */ return 0; } + + if (nd && nd->dentry) + return dentry_has_perm(current, nd->mnt, nd->dentry, + file_mask_to_av(inode->i_mode, mask)); return inode_has_perm(current, inode, file_mask_to_av(inode->i_mode, mask), NULL, NULL); diff -Nru a/security/selinux/ss/services.c b/security/selinux/ss/services.c --- a/security/selinux/ss/services.c Wed Oct 8 12:24:57 2003 +++ b/security/selinux/ss/services.c Wed Oct 8 12:24:57 2003 @@ -896,13 +896,15 @@ struct user_datum *usrdatum; char *s; u32 len; - int rc = -EINVAL; + int rc; args = p; rc = context_cpy(&oldc, c); if (rc) goto out; + + rc = -EINVAL; /* Convert the user. */ usrdatum = hashtab_search(args->newp->p_users.table, diff -Nru a/sound/Kconfig b/sound/Kconfig --- a/sound/Kconfig Wed Oct 8 12:24:57 2003 +++ b/sound/Kconfig Wed Oct 8 12:24:57 2003 @@ -22,12 +22,10 @@ If you have a PnP sound card and you want to configure it at boot time using the ISA PnP tools (read ), then you need to - compile the sound card support as a module ( = code which can be - inserted in and removed from the running kernel whenever you want) - and load that module after the PnP configuration is finished. To do - this, say M here and read as well - as ; the module will be - called soundcore. + compile the sound card support as a module and load that module + after the PnP configuration is finished. To do this, choose M here + and read ; the module + will be called soundcore. I'm told that even without a sound card, you can make your computer say more than an occasional beep, by programming the PC speaker. diff -Nru a/sound/core/rawmidi.c b/sound/core/rawmidi.c --- a/sound/core/rawmidi.c Wed Oct 8 12:24:55 2003 +++ b/sound/core/rawmidi.c Wed Oct 8 12:24:55 2003 @@ -1182,7 +1182,6 @@ spin_unlock_irq(&runtime->lock); set_current_state(TASK_INTERRUPTIBLE); timeout = schedule_timeout(30 * HZ); - set_current_state(TASK_RUNNING); remove_wait_queue(&runtime->sleep, &wait); if (signal_pending(current)) return result > 0 ? result : -ERESTARTSYS; @@ -1210,7 +1209,6 @@ spin_unlock_irq(&runtime->lock); set_current_state(TASK_INTERRUPTIBLE); timeout = schedule_timeout(30 * HZ); - set_current_state(TASK_RUNNING); remove_wait_queue(&runtime->sleep, &wait); if (signal_pending(current)) return result > 0 ? result : -ERESTARTSYS; diff -Nru a/sound/oss/Kconfig b/sound/oss/Kconfig --- a/sound/oss/Kconfig Wed Oct 8 12:24:57 2003 +++ b/sound/oss/Kconfig Wed Oct 8 12:24:57 2003 @@ -17,10 +17,8 @@ don't need this driver as most TV cards handle sound with a short cable from the TV card to your sound card's line-in. - This driver is available as a module called btaudio ( = code - which can be inserted in and removed from the running kernel - whenever you want). If you want to compile it as a module, say M - here and read . + To compile this driver as a module, choose M here: the module will + be called btaudio. config SOUND_CMPCI tristate "C-Media PCI (CMI8338/8738)" diff -Nru a/sound/oss/ac97_codec.c b/sound/oss/ac97_codec.c --- a/sound/oss/ac97_codec.c Wed Oct 8 12:24:55 2003 +++ b/sound/oss/ac97_codec.c Wed Oct 8 12:24:55 2003 @@ -46,7 +46,6 @@ * Isolated from trident.c to support multiple ac97 codec */ #include -#include #include #include #include diff -Nru a/sound/oss/ac97_plugin_ad1980.c b/sound/oss/ac97_plugin_ad1980.c --- a/sound/oss/ac97_plugin_ad1980.c Wed Oct 8 12:24:55 2003 +++ b/sound/oss/ac97_plugin_ad1980.c Wed Oct 8 12:24:55 2003 @@ -28,6 +28,7 @@ */ +#include #include #include #include @@ -45,7 +46,7 @@ * use of the codec after the probe function. */ -static void ad1980_remove(struct ac97_codec *codec) +static void __devexit ad1980_remove(struct ac97_codec *codec, struct ac97_driver *driver) { /* Nothing to do in the simple example */ } diff -Nru a/sound/oss/ali5455.c b/sound/oss/ali5455.c --- a/sound/oss/ali5455.c Wed Oct 8 12:24:57 2003 +++ b/sound/oss/ali5455.c Wed Oct 8 12:24:57 2003 @@ -47,7 +47,6 @@ */ #include -#include #include #include #include diff -Nru a/sound/oss/au1000.c b/sound/oss/au1000.c --- a/sound/oss/au1000.c Wed Oct 8 12:24:57 2003 +++ b/sound/oss/au1000.c Wed Oct 8 12:24:57 2003 @@ -50,7 +50,6 @@ * channels [stevel]. * */ -#include #include #include #include @@ -2223,8 +2222,9 @@ if (!options || !*options) return 0; - for(this_opt=strtok(options, ","); - this_opt; this_opt=strtok(NULL, ",")) { + while (this_opt = strsep(&options, ",")) { + if (!*this_opt) + continue; if (!strncmp(this_opt, "vra", 3)) { vra = 1; } diff -Nru a/sound/oss/btaudio.c b/sound/oss/btaudio.c --- a/sound/oss/btaudio.c Wed Oct 8 12:24:56 2003 +++ b/sound/oss/btaudio.c Wed Oct 8 12:24:56 2003 @@ -177,8 +177,11 @@ bta->risc_size = PAGE_SIZE; bta->risc_cpu = pci_alloc_consistent (bta->pci, bta->risc_size, &bta->risc_dma); - if (NULL == bta->risc_cpu) + if (NULL == bta->risc_cpu) { + pci_free_consistent(bta->pci, bta->buf_size, bta->buf_cpu, bta->buf_dma); + bta->buf_cpu = NULL; return -ENOMEM; + } } return 0; } diff -Nru a/sound/oss/dmasound/Kconfig b/sound/oss/dmasound/Kconfig --- a/sound/oss/dmasound/Kconfig Wed Oct 8 12:24:56 2003 +++ b/sound/oss/dmasound/Kconfig Wed Oct 8 12:24:56 2003 @@ -1,7 +1,7 @@ -# drivers/sound/dmasound/Config.in config DMASOUND_ATARI tristate "Atari DMA sound support" depends on ATARI && SOUND + select DMASOUND help If you want to use the internal audio of your Atari in Linux, answer Y to this question. This will provide a Sun-like /dev/audio, @@ -15,6 +15,7 @@ config DMASOUND_PMAC tristate "PowerMac DMA sound support" depends on PPC_PMAC && SOUND && I2C + select DMASOUND help If you want to use the internal audio of your PowerMac in Linux, answer Y to this question. This will provide a Sun-like /dev/audio, @@ -28,6 +29,7 @@ config DMASOUND_PAULA tristate "Amiga DMA sound support" depends on (AMIGA || APUS) && SOUND + select DMASOUND help If you want to use the internal audio of your Amiga in Linux, answer Y to this question. This will provide a Sun-like /dev/audio, @@ -41,6 +43,7 @@ config DMASOUND_Q40 tristate "Q40 sound support" depends on Q40 && SOUND + select DMASOUND help If you want to use the internal audio of your Q40 in Linux, answer Y to this question. This will provide a Sun-like /dev/audio, @@ -53,13 +56,3 @@ config DMASOUND tristate - depends on SOUND!=n - default m if DMASOUND_ATARI!=y && DMASOUND_AWACS!=y && DMASOUND_PAULA!=y && DMASOUND_Q40!=y && (DMASOUND_ATARI=m || DMASOUND_AWACS=m || DMASOUND_PAULA=m || DMASOUND_Q40=m) - default y if DMASOUND_ATARI=y || DMASOUND_AWACS=y || DMASOUND_PAULA=y || DMASOUND_Q40=y - help - Support built-in audio chips accessible by DMA on various machines - that have them. Note that this symbol does not affect the kernel - directly; rather, it controls whether configuration questions - enabling DMA sound drivers for various specific machine - architectures will be used. - diff -Nru a/sound/oss/dmasound/dac3550a.c b/sound/oss/dmasound/dac3550a.c --- a/sound/oss/dmasound/dac3550a.c Wed Oct 8 12:24:56 2003 +++ b/sound/oss/dmasound/dac3550a.c Wed Oct 8 12:24:56 2003 @@ -7,7 +7,6 @@ * for more details. */ -#include #include #include #include diff -Nru a/sound/oss/dmasound/tas3001c.c b/sound/oss/dmasound/tas3001c.c --- a/sound/oss/dmasound/tas3001c.c Wed Oct 8 12:24:55 2003 +++ b/sound/oss/dmasound/tas3001c.c Wed Oct 8 12:24:55 2003 @@ -15,7 +15,6 @@ * */ -#include #include #include #include diff -Nru a/sound/oss/dmasound/tas3004.c b/sound/oss/dmasound/tas3004.c --- a/sound/oss/dmasound/tas3004.c Wed Oct 8 12:24:57 2003 +++ b/sound/oss/dmasound/tas3004.c Wed Oct 8 12:24:57 2003 @@ -13,7 +13,6 @@ * */ -#include #include #include #include diff -Nru a/sound/oss/dmasound/tas_common.c b/sound/oss/dmasound/tas_common.c --- a/sound/oss/dmasound/tas_common.c Wed Oct 8 12:24:57 2003 +++ b/sound/oss/dmasound/tas_common.c Wed Oct 8 12:24:57 2003 @@ -1,4 +1,3 @@ -#include #include #include #include diff -Nru a/sound/oss/harmony.c b/sound/oss/harmony.c --- a/sound/oss/harmony.c Wed Oct 8 12:24:57 2003 +++ b/sound/oss/harmony.c Wed Oct 8 12:24:57 2003 @@ -28,14 +28,14 @@ #include #include #include +#include #include #include #include #include -#include +#include #include -#include #include "sound_config.h" diff -Nru a/sound/oss/ite8172.c b/sound/oss/ite8172.c --- a/sound/oss/ite8172.c Wed Oct 8 12:24:56 2003 +++ b/sound/oss/ite8172.c Wed Oct 8 12:24:56 2003 @@ -54,7 +54,6 @@ * 07.30.2003 Removed initialisation to zero for static variables * (spdif[NR_DEVICE], i2s_fmt[NR_DEVICE], and devindex) */ -#include #include #include #include @@ -2238,8 +2237,9 @@ if (!options || !*options) return 0; - for(this_opt=strtok(options, ","); - this_opt; this_opt=strtok(NULL, ",")) { + while (this_opt = strsep(&options, ",")) { + if (!*this_opt) + continue; if (!strncmp(this_opt, "spdif", 5)) { spdif[nr_dev] = 1; } else if (!strncmp(this_opt, "i2s:", 4)) { diff -Nru a/sound/oss/opl3sa2.c b/sound/oss/opl3sa2.c --- a/sound/oss/opl3sa2.c Wed Oct 8 12:24:55 2003 +++ b/sound/oss/opl3sa2.c Wed Oct 8 12:24:55 2003 @@ -324,15 +324,6 @@ } -static void opl3sa3_set_wide(opl3sa2_state_t* devc, int left, int right) -{ - unsigned char wide; - - wide = left ? ((unsigned char) (8 * left / 101)) : 0; - wide |= (right ? ((unsigned char) (8 * right / 101)) : 0) << 4; - - opl3sa2_write(devc->cfg_port, OPL3SA3_WIDE, wide); -} static void opl3sa2_mixer_reset(opl3sa2_state_t* devc) @@ -401,7 +392,7 @@ static int opl3sa2_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg) { - int cmdf = cmd & 0xff; + int retval, value, cmdf = cmd & 0xff; opl3sa2_state_t* devc = &opl3sa2_state[dev]; @@ -422,23 +413,31 @@ if (((cmd >> 8) & 0xff) != 'M') return -EINVAL; + retval = 0; if (_SIOC_DIR (cmd) & _SIOC_WRITE) { switch (cmdf) { case SOUND_MIXER_VOLUME: - arg_to_vol_stereo(*(unsigned int*)arg, - &devc->volume_l, &devc->volume_r); + retval = get_user(value, (unsigned int *) arg); + if (retval) + break; + arg_to_vol_stereo(value, &devc->volume_l, &devc->volume_r); opl3sa2_set_volume(devc, devc->volume_l, devc->volume_r); - *(int*)arg = ret_vol_stereo(devc->volume_l, devc->volume_r); - return 0; + value = ret_vol_stereo(devc->volume_l, devc->volume_r); + retval = put_user(value, (int *) arg); + break; case SOUND_MIXER_MIC: - arg_to_vol_mono(*(unsigned int*)arg, &devc->mic); + retval = get_user(value, (unsigned int *) arg); + if (retval) + break; + arg_to_vol_mono(value, &devc->mic); opl3sa2_set_mic(devc, devc->mic); - *(int*)arg = ret_vol_mono(devc->mic); - return 0; + value = ret_vol_mono(devc->mic); + retval = put_user(value, (int *) arg); + break; default: - return -EINVAL; + retval = -EINVAL; } } else { @@ -447,122 +446,72 @@ */ switch (cmdf) { case SOUND_MIXER_DEVMASK: - *(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_MIC); - return 0; + retval = put_user(SOUND_MASK_VOLUME | SOUND_MASK_MIC, (int *) arg); + break; case SOUND_MIXER_STEREODEVS: - *(int*)arg = SOUND_MASK_VOLUME; - return 0; + retval = put_user(SOUND_MASK_VOLUME, (int *) arg); + break; case SOUND_MIXER_RECMASK: /* No recording devices */ - return (*(int*)arg = 0); + retval = put_user(0, (int *) arg); + break; case SOUND_MIXER_CAPS: - *(int*)arg = SOUND_CAP_EXCL_INPUT; - return 0; + retval = put_user(SOUND_CAP_EXCL_INPUT, (int *) arg); + break; case SOUND_MIXER_RECSRC: /* No recording source */ - return (*(int*)arg = 0); + retval = put_user(0, (int *) arg); + break; case SOUND_MIXER_VOLUME: - *(int*)arg = ret_vol_stereo(devc->volume_l, devc->volume_r); - return 0; + value = ret_vol_stereo(devc->volume_l, devc->volume_r); + retval = put_user(value, (int *) arg); + break; case SOUND_MIXER_MIC: - *(int*)arg = ret_vol_mono(devc->mic); - return 0; + value = ret_vol_mono(devc->mic); + put_user(value, (int *) arg); + break; default: - return -EINVAL; + retval = -EINVAL; } } + return retval; } /* opl3sa2_mixer_ioctl end */ static int opl3sa3_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg) { - int cmdf = cmd & 0xff; + int value, retval, cmdf = cmd & 0xff; opl3sa2_state_t* devc = &opl3sa2_state[dev]; switch (cmdf) { - case SOUND_MIXER_BASS: - case SOUND_MIXER_TREBLE: - case SOUND_MIXER_DIGITAL1: - case SOUND_MIXER_DEVMASK: - case SOUND_MIXER_STEREODEVS: - break; - - default: - return opl3sa2_mixer_ioctl(dev, cmd, arg); - } - - if (((cmd >> 8) & 0xff) != 'M') - return -EINVAL; + case SOUND_MIXER_BASS: + value = ret_vol_stereo(devc->bass_l, devc->bass_r); + retval = put_user(value, (int *) arg); + break; - if (_SIOC_DIR (cmd) & _SIOC_WRITE) { - switch (cmdf) { - case SOUND_MIXER_BASS: - arg_to_vol_stereo(*(unsigned int*)arg, - &devc->bass_l, &devc->bass_r); - opl3sa3_set_bass(devc, devc->bass_l, devc->bass_r); - *(int*)arg = ret_vol_stereo(devc->bass_l, devc->bass_r); - return 0; - - case SOUND_MIXER_TREBLE: - arg_to_vol_stereo(*(unsigned int*)arg, - &devc->treble_l, &devc->treble_r); - opl3sa3_set_treble(devc, devc->treble_l, devc->treble_r); - *(int*)arg = ret_vol_stereo(devc->treble_l, devc->treble_r); - return 0; - - case SOUND_MIXER_DIGITAL1: - arg_to_vol_stereo(*(unsigned int*)arg, - &devc->wide_l, &devc->wide_r); - opl3sa3_set_wide(devc, devc->wide_l, devc->wide_r); - *(int*)arg = ret_vol_stereo(devc->wide_l, devc->wide_r); - return 0; + case SOUND_MIXER_TREBLE: + value = ret_vol_stereo(devc->treble_l, devc->treble_r); + retval = put_user(value, (int *) arg); + break; + + case SOUND_MIXER_DIGITAL1: + value = ret_vol_stereo(devc->wide_l, devc->wide_r); + retval = put_user(value, (int *) arg); + break; - default: - return -EINVAL; - } - } - else - { - /* - * Return parameters - */ - switch (cmdf) { - case SOUND_MIXER_DEVMASK: - *(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_MIC | - SOUND_MASK_BASS | SOUND_MASK_TREBLE | - SOUND_MASK_DIGITAL1); - return 0; - - case SOUND_MIXER_STEREODEVS: - *(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_BASS | - SOUND_MASK_TREBLE | SOUND_MASK_DIGITAL1); - return 0; - - case SOUND_MIXER_BASS: - *(int*)arg = ret_vol_stereo(devc->bass_l, devc->bass_r); - return 0; - - case SOUND_MIXER_TREBLE: - *(int*)arg = ret_vol_stereo(devc->treble_l, devc->treble_r); - return 0; - - case SOUND_MIXER_DIGITAL1: - *(int*)arg = ret_vol_stereo(devc->wide_l, devc->wide_r); - return 0; - - default: - return -EINVAL; - } + default: + retval = -EINVAL; } + return retval; } /* opl3sa3_mixer_ioctl end */ diff -Nru a/sound/oss/swarm_cs4297a.c b/sound/oss/swarm_cs4297a.c --- a/sound/oss/swarm_cs4297a.c Wed Oct 8 12:24:56 2003 +++ b/sound/oss/swarm_cs4297a.c Wed Oct 8 12:24:56 2003 @@ -59,7 +59,6 @@ *******************************************************************************/ #include -#include #include #include #include diff -Nru a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c --- a/sound/oss/via82cxxx_audio.c Wed Oct 8 12:24:56 2003 +++ b/sound/oss/via82cxxx_audio.c Wed Oct 8 12:24:56 2003 @@ -1844,6 +1844,7 @@ /** * via_intr_channel - handle an interrupt for a single channel + * @card: unused * @chan: handle interrupt for this channel * * This is the "meat" of the interrupt handler, diff -Nru a/sound/parisc/harmony.c b/sound/parisc/harmony.c --- a/sound/parisc/harmony.c Wed Oct 8 12:24:56 2003 +++ b/sound/parisc/harmony.c Wed Oct 8 12:24:56 2003 @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -77,8 +78,8 @@ #include #include #include -#include #include +#include MODULE_AUTHOR("Laurent Canet "); MODULE_DESCRIPTION("ALSA Harmony sound driver"); @@ -709,8 +710,8 @@ * harmony is not "real" pci, but we need a pci_dev * to alloc PCI DMA pages */ - substream->dma_private = harmony->fake_pci_dev; - substream->dma_type = SNDRV_PCM_DMA_TYPE_PCI; + substream->runtime->dma_private = harmony->fake_pci_dev; +// substream->dma_type = SNDRV_PCM_DMA_TYPE_PCI; harmony->playback_substream = substream; runtime->hw = snd_card_harmony_playback; @@ -733,8 +734,8 @@ * harmony is not "real" pci, but we need a pci_dev * to alloc PCI DMA pages */ - substream->dma_private = harmony->fake_pci_dev; - substream->dma_type = SNDRV_PCM_DMA_TYPE_PCI; + substream->runtime->dma_private = harmony->fake_pci_dev; +// substream->dma_type = SNDRV_PCM_DMA_TYPE_PCI; harmony->capture_substream = substream; runtime->hw = snd_card_harmony_capture; diff -Nru a/sound/pci/Kconfig b/sound/pci/Kconfig --- a/sound/pci/Kconfig Wed Oct 8 12:24:56 2003 +++ b/sound/pci/Kconfig Wed Oct 8 12:24:56 2003 @@ -17,7 +17,8 @@ config SND_CS46XX tristate "Cirrus Logic (Sound Fusion) CS4280/CS461x/CS462x/CS463x" - depends on SND && GAMEPORT + depends on SND + select GAMEPORT help Say 'Y' or 'M' to include support for Cirrus Logic CS4610 / CS4612 / CS4614 / CS4615 / CS4622 / CS4624 / CS4630 / CS4280 chips. @@ -30,7 +31,8 @@ config SND_CS4281 tristate "Cirrus Logic (Sound Fusion) CS4281" - depends on SND && GAMEPORT + depends on SND + select GAMEPORT help Say 'Y' or 'M' to include support for Cirrus Logic CS4281. @@ -83,7 +85,8 @@ config SND_TRIDENT tristate "Trident 4D-Wave DX/NX; SiS 7018" - depends on SND && GAMEPORT + depends on SND + select GAMEPORT help Say 'Y' or 'M' to include support for Trident 4D-Wave DX/NX and SiS 7018 soundcards. @@ -110,20 +113,23 @@ config SND_ENS1370 tristate "(Creative) Ensoniq AudioPCI 1370" - depends on SND && GAMEPORT + depends on SND + select GAMEPORT help Say 'Y' or 'M' to include support for Ensoniq AudioPCI ES1370. config SND_ENS1371 tristate "(Creative) Ensoniq AudioPCI 1371/1373" - depends on SND && GAMEPORT + depends on SND + select GAMEPORT help Say 'Y' or 'M' to include support for Ensoniq AudioPCI ES1371 and Sound Blaster PCI 64 or 128 soundcards. config SND_ES1938 tristate "ESS ES1938/1946/1969 (Solo-1)" - depends on SND && GAMEPORT + depends on SND + select GAMEPORT help Say 'Y' or 'M' to include support for ESS Solo-1 (ES1938, ES1946, ES1969) soundcard. @@ -173,7 +179,8 @@ config SND_SONICVIBES tristate "S3 SonicVibes" - depends on SND && GAMEPORT + depends on SND + select GAMEPORT help Say 'Y' or 'M' to include support for S3 SonicVibes based soundcards. diff -Nru a/sound/pci/cmipci.c b/sound/pci/cmipci.c --- a/sound/pci/cmipci.c Wed Oct 8 12:24:57 2003 +++ b/sound/pci/cmipci.c Wed Oct 8 12:24:57 2003 @@ -2791,6 +2791,7 @@ * proc interface */ +#ifdef CONFIG_PROC_FS static void snd_cmipci_proc_read(snd_info_entry_t *entry, snd_info_buffer_t *buffer) { @@ -2817,6 +2818,9 @@ if (! snd_card_proc_new(cm->card, "cmipci", &entry)) snd_info_set_text_ops(entry, cm, snd_cmipci_proc_read); } +#else /* !CONFIG_PROC_FS */ +static inline void snd_cmipci_proc_init(cmipci_t *cm) {} +#endif static struct pci_device_id snd_cmipci_ids[] = { diff -Nru a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c --- a/sound/usb/usbaudio.c Wed Oct 8 12:24:57 2003 +++ b/sound/usb/usbaudio.c Wed Oct 8 12:24:57 2003 @@ -732,7 +732,6 @@ break; set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(1); - set_current_state(TASK_RUNNING); } while (--timeout > 0); if (alive) snd_printk(KERN_ERR "timeout: still %d active urbs..\n", alive);