]> git.neil.brown.name Git - history.git/commitdiff
Import 2.2.6pre3 2.2.6pre3
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:18:35 +0000 (15:18 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:18:35 +0000 (15:18 -0500)
104 files changed:
MAINTAINERS
arch/alpha/lib/io.c
arch/i386/kernel/io_apic.c
arch/i386/kernel/irq.c
arch/i386/kernel/mca.c
drivers/char/Config.in
drivers/char/Makefile
drivers/char/radio-aimslab.c
drivers/char/radio-aztech.c
drivers/char/radio-cadet.c [new file with mode: 0644]
drivers/char/radio-gemtek.c
drivers/char/radio-miropcm20.c
drivers/char/radio-rtrack2.c
drivers/char/radio-sf16fmi.c
drivers/char/radio-typhoon.c
drivers/char/radio-zoltrix.c
drivers/char/videodev.c
drivers/net/Makefile
drivers/net/irda/Makefile
drivers/net/irda/irport.c
drivers/net/irda/irtty.c
drivers/net/irda/pc87108.c
drivers/net/irda/tekram.c
drivers/net/irda/uircc.c
drivers/net/irda/w83977af_ir.c
drivers/scsi/NCR5380.c
drivers/scsi/pci2000.c
drivers/scsi/pci2000.h
drivers/scsi/pci2220i.c
drivers/scsi/pci2220i.h
drivers/scsi/psi240i.c
drivers/scsi/psi_dale.h
drivers/scsi/psi_roy.h
drivers/scsi/qlogicfc.c
drivers/scsi/qlogicfc_asm.c
fs/fat/inode.c
fs/inode.c
fs/minix/inode.c
fs/namei.c
include/asm-alpha/io.h
include/asm-alpha/semaphore-helper.h
include/asm-alpha/semaphore.h
include/asm-alpha/uaccess.h
include/linux/mca.h
include/linux/socket.h
include/net/irda/discovery.h [new file with mode: 0644]
include/net/irda/ircomm_common.h
include/net/irda/irda.h
include/net/irda/irda_device.h
include/net/irda/iriap.h
include/net/irda/irkbd.h [new file with mode: 0644]
include/net/irda/irlan_client.h
include/net/irda/irlan_common.h
include/net/irda/irlan_eth.h
include/net/irda/irlan_provider.h
include/net/irda/irlap.h
include/net/irda/irlap_event.h
include/net/irda/irlap_frame.h
include/net/irda/irlmp.h
include/net/irda/irlmp_event.h
include/net/irda/irlmp_frame.h
include/net/irda/irmod.h
include/net/irda/irobex.h
include/net/irda/irqueue.h
include/net/irda/irttp.h
include/net/irda/irvtd.h
include/net/irda/irvtd_driver.h [deleted file]
include/net/irda/timer.h
include/net/irda/uircc.h
include/net/sock.h
net/irda/Config.in
net/irda/Makefile
net/irda/af_irda.c
net/irda/discovery.c [new file with mode: 0644]
net/irda/ircomm/Makefile
net/irda/ircomm/attach.c [deleted file]
net/irda/ircomm/ircomm_common.c
net/irda/ircomm/irvtd.c [deleted file]
net/irda/ircomm/irvtd_driver.c
net/irda/irda_device.c
net/irda/iriap.c
net/irda/irias_object.c
net/irda/irlan/irlan_client.c
net/irda/irlan/irlan_common.c
net/irda/irlan/irlan_eth.c
net/irda/irlan/irlan_filter.c
net/irda/irlan/irlan_provider.c
net/irda/irlap.c
net/irda/irlap_event.c
net/irda/irlap_frame.c
net/irda/irlmp.c
net/irda/irlmp_event.c
net/irda/irlmp_frame.c
net/irda/irlpt/irlpt_cli.c
net/irda/irlpt/irlpt_srvr.c
net/irda/irmod.c
net/irda/irobex/Config.in [deleted file]
net/irda/irobex/Makefile [deleted file]
net/irda/irobex/irobex.c [deleted file]
net/irda/irproc.c
net/irda/irqueue.c
net/irda/irttp.c
net/irda/wrapper.c
net/netlink/af_netlink.c

index 1108da9f50b08f54fd894c0c23f879bad9bd0080..040cb76127b8b9a1660bfbf409d98122d5fdd9d1 100644 (file)
@@ -395,7 +395,7 @@ IRDA SUBSYSTEM
 P:      Dag Brattli
 M:      Dag Brattli <dagb@cs.uit.no>
 L:      linux-irda@list.uit.no
-W:      http://www.cs.uit.no/~dagb/irda/
+W:      http://www.cs.uit.no/linux-irda/
 S:      Maintained
 
 ISDN SUBSYSTEM
index 4172216d8fa60d40a05ba03f2779c7e0b6497558..71ba9d4bf6b0e1f0f8984a6dc2a190e10f0681ae 100644 (file)
@@ -405,15 +405,16 @@ void _memcpy_fromio(void * to, unsigned long from, long count)
  * Copy data from "real" memory space to IO memory space.
  * This needs to be optimized.
  */
-void _memcpy_toio(unsigned long to, void * from, long count)
+void _memcpy_toio(unsigned long to, const void * from, long count)
 {
        /* Optimize co-aligned transfers.  Everything else gets handled
           a byte at a time. */
+       /* FIXME -- align FROM.  */
 
        if (count >= 8 && (to & 7) == ((long)from & 7)) {
                count -= 8;
                do {
-                       writeq(*(u64 *)from, to);
+                       writeq(*(const u64 *)from, to);
                        count -= 8;
                        to += 8;
                        from += 8;
@@ -424,7 +425,7 @@ void _memcpy_toio(unsigned long to, void * from, long count)
        if (count >= 4 && (to & 3) == ((long)from & 3)) {
                count -= 4;
                do {
-                       writel(*(u32 *)from, to);
+                       writel(*(const u32 *)from, to);
                        count -= 4;
                        to += 4;
                        from += 4;
@@ -435,7 +436,7 @@ void _memcpy_toio(unsigned long to, void * from, long count)
        if (count >= 2 && (to & 1) == ((long)from & 1)) {
                count -= 2;
                do {
-                       writew(*(u16 *)from, to);
+                       writew(*(const u16 *)from, to);
                        count -= 2;
                        to += 2;
                        from += 2;
@@ -444,7 +445,7 @@ void _memcpy_toio(unsigned long to, void * from, long count)
        }
 
        while (count > 0) {
-               writeb(*(u8 *) from, to);
+               writeb(*(const u8 *) from, to);
                count--;
                to++;
                from++;
index 2fd584d10b52c55022a3f3b476451b377ea180a9..33b442a45c822d2ecf5d33575db31fff7864706e 100644 (file)
@@ -922,7 +922,7 @@ static void __init construct_default_ISA_mptable(void)
 
                mp_irqs[pos].mpc_irqtype = mp_INT;
                mp_irqs[pos].mpc_irqflag = 0;           /* default */
-               mp_irqs[pos].mpc_srcbus = bus_type;
+               mp_irqs[pos].mpc_srcbus = 0;
                mp_irqs[pos].mpc_srcbusirq = i;
                mp_irqs[pos].mpc_dstapic = 0;
                mp_irqs[pos].mpc_dstirq = i;
@@ -1183,13 +1183,23 @@ static inline void init_IO_APIC_traps(void)
                         */
                        if (i < 16)
                                disable_8259A_irq(i);
-               } else
+               } else {
+                       if (!IO_APIC_IRQ(i))
+                               continue;
+
                        /*
-                        * we have no business changing low ISA
-                        * IRQs.
+                        * Hmm.. We don't have an entry for this,
+                        * so default to an old-fashioned 8259
+                        * interrupt if we can..
                         */
-                       if (IO_APIC_IRQ(i))
-                               irq_desc[i].handler = &no_irq_type;
+                       if (i < 16) {
+                               make_8259A_irq(i);
+                               continue;
+                       }
+
+                       /* Strange. Oh, well.. */
+                       irq_desc[i].handler = &no_irq_type;
+               }
        }
        init_IRQ_SMP();
 }
index 03c4c790a0254c1547af49ba338f75f4deb9ef67..26dcbc328bcf5a67721a6530e943e20df0c41422 100644 (file)
@@ -151,10 +151,7 @@ irq_desc_t irq_desc[NR_IRQS] = { [0 ... NR_IRQS-1] = { 0, &no_irq_type, }};
  */
 static unsigned int cached_irq_mask = 0xffff;
 
-#define __byte(x,y) (((unsigned char *)&(y))[x])
-#define __word(x,y) (((unsigned short *)&(y))[x])
-#define __long(x,y) (((unsigned int *)&(y))[x])
-
+#define __byte(x,y)    (((unsigned char *)&(y))[x])
 #define cached_21      (__byte(0,cached_irq_mask))
 #define cached_A1      (__byte(1,cached_irq_mask))
 
@@ -207,7 +204,7 @@ int i8259A_irq_pending(unsigned int irq)
 void make_8259A_irq(unsigned int irq)
 {
        disable_irq(irq);
-       __long(0,io_apic_irqs) &= ~(1<<irq);
+       io_apic_irqs &= ~(1<<irq);
        irq_desc[irq].handler = &i8259A_irq_type;
        enable_irq(irq);
 }
index de5a47e7211a2bdd92add3e8f3930db0975cc072..74eee64bc0c25622f38e19a6a79d10ceb558919b 100644 (file)
@@ -26,6 +26,9 @@
  *     - Added the 'driver_loaded' flag in MCA_adapter
  *     - Added an alternative implemention of ZP Gu's mca_find_unused_adapter
  *
+ *     David Weinehall March 24th, 1999
+ *     - Fixed the output of 'Driver Installed' in /proc/mca/pos
+ *     - Made the Integrated Video & SCSI show up even if they have id 0000
  */
 
 #include <linux/types.h>
  * Other miscellaneous information follows.
  */
 
-typedef enum {                                                                  
-       MCA_ADAPTER_NORMAL = 0,                                                 
-       MCA_ADAPTER_NONE = 1,                                                   
-       MCA_ADAPTER_DISABLED = 2,                                               
-       MCA_ADAPTER_ERROR = 3                                                   
-} MCA_AdapterStatus;    
+typedef enum {
+       MCA_ADAPTER_NORMAL = 0,
+       MCA_ADAPTER_NONE = 1,
+       MCA_ADAPTER_DISABLED = 2,
+       MCA_ADAPTER_ERROR = 3
+} MCA_AdapterStatus;
 
 struct MCA_adapter {
        MCA_AdapterStatus status;       /* is there a valid adapter? */
@@ -69,16 +72,17 @@ struct MCA_adapter {
 };
 
 struct MCA_info {
-/* one for each of the 8 possible slots, plus one for integrated SCSI
-   and one for integrated video. */
+       /* one for each of the 8 possible slots, plus one for integrated SCSI
+        * and one for integrated video.
+        */
 
        struct MCA_adapter slot[MCA_NUMADAPTERS];
 
-/* two potential addresses for integrated SCSI adapter - this will      
- * track which one we think it is
- */                                       
+       /* two potential addresses for integrated SCSI adapter - this will
+        * track which one we think it is.
+        */
 
-       unsigned char which_scsi;  
+       unsigned char which_scsi;
 };
 
 /* The mca_info structure pointer. If MCA bus is present, the function
@@ -102,10 +106,10 @@ static struct MCA_info* mca_info = 0;
 
 #ifdef CONFIG_PROC_FS
 
-static void mca_do_proc_init( void );
-static int mca_default_procfn( char* buf, int slot );
+static void mca_do_proc_init(void);
+static int mca_default_procfn(char* buf, int slot);
 
-static ssize_t proc_mca_read( struct file*, char*, size_t, loff_t *);
+static ssize_t proc_mca_read(struct file*, char*, size_t, loff_t *);
 
 static struct file_operations proc_mca_operations = {
        NULL,                   /* array_lseek */
@@ -146,13 +150,13 @@ static struct inode_operations proc_mca_inode_operations = {
 
 /* Build the status info for the adapter */
 
-static void mca_configure_adapter_status( int slot ) {
+static void mca_configure_adapter_status(int slot) {
        mca_info->slot[slot].status = MCA_ADAPTER_NONE;
 
        mca_info->slot[slot].id = mca_info->slot[slot].pos[0]
                + (mca_info->slot[slot].pos[1] << 8);
 
-       if( !mca_info->slot[slot].id ) {
+       if(!mca_info->slot[slot].id && slot < MCA_MAX_SLOT_NR) {
 
                /* id = 0x0000 usually indicates hardware failure,
                 * however, ZP Gu (zpg@castle.net> reports that his 9556
@@ -162,7 +166,7 @@ static void mca_configure_adapter_status( int slot ) {
                mca_info->slot[slot].status = MCA_ADAPTER_ERROR;
 
                return;
-       } else if( mca_info->slot[slot].id != 0xffff ) {
+       } else if(mca_info->slot[slot].id != 0xffff) {
 
                /* 0xffff usually indicates that there's no adapter,
                 * however, some integrated adapters may have 0xffff as
@@ -174,21 +178,21 @@ static void mca_configure_adapter_status( int slot ) {
                mca_info->slot[slot].status = MCA_ADAPTER_NORMAL;
        }
 
-       if( (mca_info->slot[slot].id == 0xffff ||
-            mca_info->slot[slot].id == 0x0000) && slot >= MCA_MAX_SLOT_NR ) {
+       if((mca_info->slot[slot].id == 0xffff ||
+          mca_info->slot[slot].id == 0x0000) && slot >= MCA_MAX_SLOT_NR) {
                int j;
 
-               for( j = 2; j < 8; j++ ) {
-                       if( mca_info->slot[slot].pos[j] != 0xff ) {
+               for(j = 2; j < 8; j++) {
+                       if(mca_info->slot[slot].pos[j] != 0xff) {
                                mca_info->slot[slot].status = MCA_ADAPTER_NORMAL;
                                break;
                        }
                }
        }
 
-       if( !(mca_info->slot[slot].pos[2] & MCA_ENABLED) ) {
+       if(!(mca_info->slot[slot].pos[2] & MCA_ENABLED)) {
 
-               /* enabled bit is in pos 2 */
+               /* enabled bit is in POS 2 */
 
                mca_info->slot[slot].status = MCA_ADAPTER_DISABLED;
        }
@@ -198,22 +202,22 @@ static void mca_configure_adapter_status( int slot ) {
 
 __initfunc(void mca_init(void))
 {
-       unsigned int  i, j;
+       unsigned int i, j;
        unsigned long flags;
 
        /* WARNING: Be careful when making changes here. Putting an adapter
-        * and the motherboard simultaneously into setup mode may result in 
-        * damage to chips (according to The Indispensible PC Hardware Book 
-        * by Hans-Peter Messmer). Also, we disable system interrupts (so       
+        * and the motherboard simultaneously into setup mode may result in
+        * damage to chips (according to The Indispensible PC Hardware Book
+        * by Hans-Peter Messmer). Also, we disable system interrupts (so
         * that we are not disturbed in the middle of this).
         */
 
        /* Make sure the MCA bus is present */
        
-       if (!MCA_bus)
+       if(!MCA_bus)
                return;
-       printk( "Micro Channel bus detected.\n" );
-       save_flags( flags );
+       printk("Micro Channel bus detected.\n");
+       save_flags(flags);
        cli();
 
        /* Allocate MCA_info structure (at address divisible by 8) */
@@ -225,67 +229,68 @@ __initfunc(void mca_init(void))
        outb_p(0, MCA_ADAPTER_SETUP_REG);
 
        /* Put motherboard into video setup mode, read integrated video 
-        * pos registers, and turn motherboard setup off.
+        * POS registers, and turn motherboard setup off.
         */
 
        outb_p(0xdf, MCA_MOTHERBOARD_SETUP_REG);
        mca_info->slot[MCA_INTEGVIDEO].name[0] = 0;
-       for (j=0; j<8; j++) {
-               mca_info->slot[MCA_INTEGVIDEO].pos[j] = inb_p(MCA_POS_REG(j)); 
+       for(j=0; j<8; j++) {
+               mca_info->slot[MCA_INTEGVIDEO].pos[j] = inb_p(MCA_POS_REG(j));
        }
        mca_configure_adapter_status(MCA_INTEGVIDEO);
 
        /* Put motherboard into scsi setup mode, read integrated scsi
-        * pos registers, and turn motherboard setup off.
+        * POS registers, and turn motherboard setup off.
         *
-        * It seems there are two possible SCSI registers.  Martin says that
+        * It seems there are two possible SCSI registers. Martin says that
         * for the 56,57, 0xf7 is the one, but fails on the 76.
         * Alfredo (apena@vnet.ibm.com) says
-        * 0xfd works on his machine.  We'll try both of them.  I figure it's
-        * a good bet that only one could be valid at a time.  This could
+        * 0xfd works on his machine. We'll try both of them. I figure it's
+        * a good bet that only one could be valid at a time. This could
         * screw up though if one is used for something else on the other
         * machine.
         */
 
        outb_p(0xf7, MCA_MOTHERBOARD_SETUP_REG);
        mca_info->slot[MCA_INTEGSCSI].name[0] = 0;
-       for (j=0; j<8; j++)  {
-               if( (mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j))) != 0xff 
+       for(j=0; j<8; j++) {
+               if((mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j))) != 0xff
                {
-                       /* 0xff all across means no device.  0x00 means something's
-                        * broken, but a device is probably there.  However, if you get
-                        * 0x00 from a motherboard register it won't matter what we
-                        * find.  For the record, on the 57SLC, the integrated SCSI
-                        * adapter has 0xffff for the adapter ID, but nonzero for
-                        * other registers.
+                       /* 0xff all across means no device. 0x00 means
+                        * something's broken, but a device is probably there.
+                        * However, if you get 0x00 from a motherboard
+                        * register it won't matter what we find.  For the
+                        * record, on the 57SLC, the integrated SCSI
+                        * adapter has 0xffff for the adapter ID, but
+                        * nonzero for other registers.
                         */
 
                        mca_info->which_scsi = 0xf7;
                }
        }
-       if( !mca_info->which_scsi ) { 
+       if(!mca_info->which_scsi) { 
 
                /* Didn't find it at 0xf7, try somewhere else... */
                mca_info->which_scsi = 0xfd;
 
                outb_p(0xfd, MCA_MOTHERBOARD_SETUP_REG);
-               for (j=0; j<8; j++) 
-                       mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j)); 
+               for(j=0; j<8; j++) 
+                       mca_info->slot[MCA_INTEGSCSI].pos[j] = inb_p(MCA_POS_REG(j));
        }
        mca_configure_adapter_status(MCA_INTEGSCSI);
        
-       /* turn off motherboard setup */
+       /* Turn off motherboard setup */
 
        outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
        /* Now loop over MCA slots: put each adapter into setup mode, and
-        * read its pos registers. Then put adapter setup off.
+        * read its POS registers. Then put adapter setup off.
         */
 
-       for (i=0; i<MCA_MAX_SLOT_NR; i++) {
+       for(i=0; i<MCA_MAX_SLOT_NR; i++) {
                outb_p(0x8|(i&0xf), MCA_ADAPTER_SETUP_REG);
-               for (j=0; j<8; j++) {
-                       mca_info->slot[i].pos[j]=inb_p(MCA_POS_REG(j)); 
+               for(j=0; j<8; j++) {
+                       mca_info->slot[i].pos[j]=inb_p(MCA_POS_REG(j));
                }
                mca_info->slot[i].name[0] = 0;
                mca_info->slot[i].driver_loaded = 0;
@@ -295,7 +300,7 @@ __initfunc(void mca_init(void))
 
        /* Enable interrupts and return memory start */
 
-       restore_flags( flags );
+       restore_flags(flags);
 
        request_region(0x60,0x01,"system control port B (MCA)");
        request_region(0x90,0x01,"arbitration (MCA)");
@@ -312,89 +317,90 @@ __initfunc(void mca_init(void))
 
 /*--------------------------------------------------------------------*/
 
-static void mca_handle_nmi_slot( int slot, int check_flag )
+static void mca_handle_nmi_slot(int slot, int check_flag)
 {
-        if( slot < MCA_MAX_SLOT_NR ) {                                          
-                printk( "NMI: caused by MCA adapter in slot %d (%s)\n", slot+1,
-                        mca_info->slot[slot].name );                            
-        } else if( slot == MCA_INTEGSCSI ) {                                    
-                printk( "NMI: caused by MCA integrated SCSI adapter (%s)\n",    
-                        mca_info->slot[slot].name );                            
-        } else if( slot == MCA_INTEGVIDEO ) {                                   
-                printk( "NMI: caused by MCA integrated video adapter (%s)\n",   
-                        mca_info->slot[slot].name );                            
-        }                                                                       
-                                                                                
-        /* more info available in pos 6 and 7? */                               
-
-        if( check_flag ) {                                                      
-                unsigned char pos6, pos7;                                       
-                                                                                
-                pos6 = mca_read_pos( slot, 6 );                                 
-                pos7 = mca_read_pos( slot, 7 );                                 
-                                                                                
-                printk( "NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7 );      
-        }                                                                       
-                                                                                
-} /* mca_handle_nmi_slot */                                                     
-                                                                                
-/*--------------------------------------------------------------------*/        
-
-void mca_handle_nmi( void )
+       if(slot < MCA_MAX_SLOT_NR) {
+               printk("NMI: caused by MCA adapter in slot %d (%s)\n", slot+1,
+                       mca_info->slot[slot].name);
+       } else if(slot == MCA_INTEGSCSI) {
+               printk("NMI: caused by MCA integrated SCSI adapter (%s)\n",
+                       mca_info->slot[slot].name);
+       } else if(slot == MCA_INTEGVIDEO) {
+               printk("NMI: caused by MCA integrated video adapter (%s)\n",
+                       mca_info->slot[slot].name);
+       }
+
+       /* More info available in POS 6 and 7? */
+
+       if(check_flag) {
+               unsigned char pos6, pos7;
+
+               pos6 = mca_read_pos(slot, 6);
+               pos7 = mca_read_pos(slot, 7);
+
+               printk("NMI: POS 6 = 0x%x, POS 7 = 0x%x\n", pos6, pos7);
+       }
+
+} /* mca_handle_nmi_slot */
+
+/*--------------------------------------------------------------------*/
+
+void mca_handle_nmi(void)
 {
 
        int i;
-        unsigned char pos5;                                                     
-                                                                                
-        /* First try - scan the various adapters and see if a specific          
-         * adapter was responsible for the error
-        */                                
-
-        for( i = 0; i < MCA_NUMADAPTERS; i += 1 ) {                             
-                                                                                
-                /* bit 7 of POS 5 is reset when this adapter has a hardware     
-                 * error.  bit 7 it reset if there's error information
-                 * available in pos 6 and 7. */                                              
-                                                                                
-                pos5 = mca_read_pos( i, 5 );                                    
-                                                                                
-                if( !(pos5 & 0x80) ) {                                          
-                        mca_handle_nmi_slot( i, !(pos5 & 0x40) );               
-                        return;                                                 
-                }                                                               
-        }                                                                       
-                                                                                
-        /* if I recall correctly, there's a whole bunch of other things that    
-         * we can do to check for NMI problems, but that's all I know about
+       unsigned char pos5;
+
+       /* First try - scan the various adapters and see if a specific
+        * adapter was responsible for the error.
+        */
+
+       for(i = 0; i < MCA_NUMADAPTERS; i++) {
+
+       /* Bit 7 of POS 5 is reset when this adapter has a hardware
+        * error. Bit 7 it reset if there's error information
+        * available in POS 6 and 7.
+        */
+
+       pos5 = mca_read_pos(i, 5);
+
+       if(!(pos5 & 0x80)) {
+                       mca_handle_nmi_slot(i, !(pos5 & 0x40));
+                       return;
+               }
+       }
+
+       /* If I recall correctly, there's a whole bunch of other things that
+        * we can do to check for NMI problems, but that's all I know about
         * at the moment.
-        */                                                          
+        */
 
-        printk( "NMI generated from unknown source!\n" );                       
-} /* mca_handle_nmi */                                                          
+       printk("NMI generated from unknown source!\n");
+} /* mca_handle_nmi */
 
 /*--------------------------------------------------------------------*/
 
-int mca_find_adapter( int id, int start ) 
+int mca_find_adapter(int id, int start)
 {
-       if( mca_info == 0 || id == 0 || id == 0xffff ) {
+       if(mca_info == 0 || id == 0 || id == 0xffff) {
                return MCA_NOTFOUND;
        }
 
-       for( ; start >= 0 && start < MCA_NUMADAPTERS; start += 1 ) {
+       for(; start >= 0 && start < MCA_NUMADAPTERS; start++) {
 
-               /* not sure about this.  There's no point in returning
+               /* Not sure about this. There's no point in returning
                 * adapters that aren't enabled, since they can't actually
-                * be used.  However, they might be needed for statistical
+                * be used. However, they might be needed for statistical
                 * purposes or something... But if that is the case, the
                 * user is free to write a routine that manually iterates
                 * through the adapters.
                 */
 
-               if( mca_info->slot[start].status == MCA_ADAPTER_DISABLED ) {
+               if(mca_info->slot[start].status == MCA_ADAPTER_DISABLED) {
                        continue;
                }
 
-               if( id == mca_info->slot[start].id ) {
+               if(id == mca_info->slot[start].id) {
                        return start;
                }
        }
@@ -404,28 +410,28 @@ int mca_find_adapter( int id, int start )
 
 /*--------------------------------------------------------------------*/
 
-int mca_find_unused_adapter( int id, int start 
+int mca_find_unused_adapter(int id, int start
 {
-       if( mca_info == 0 || id == 0 || id == 0xffff ) {
+       if(mca_info == 0 || id == 0 || id == 0xffff) {
                return MCA_NOTFOUND;
        }
 
-       for( ; start >= 0 && start < MCA_NUMADAPTERS; start += 1 ) {
+       for(; start >= 0 && start < MCA_NUMADAPTERS; start++) {
 
-               /* not sure about this.  There's no point in returning
+               /* not sure about this. There's no point in returning
                 * adapters that aren't enabled, since they can't actually
-                * be used.  However, they might be needed for statistical
+                * be used. However, they might be needed for statistical
                 * purposes or something... But if that is the case, the
                 * user is free to write a routine that manually iterates
                 * through the adapters.
                 */
 
-               if( mca_info->slot[start].status == MCA_ADAPTER_DISABLED ||
-                   mca_info->slot[start].driver_loaded ) {
+               if(mca_info->slot[start].status == MCA_ADAPTER_DISABLED ||
+                  mca_info->slot[start].driver_loaded) {
                        continue;
                }
 
-               if( id == mca_info->slot[start].id ) {
+               if(id == mca_info->slot[start].id) {
                        return start;
                }
        }
@@ -435,68 +441,68 @@ int mca_find_unused_adapter( int id, int start )
 
 /*--------------------------------------------------------------------*/
 
-unsigned char mca_read_stored_pos( int slot, int reg 
+unsigned char mca_read_stored_pos(int slot, int reg
 {
-       if( slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0 ) return 0;
-       if( reg < 0 || reg >= 8 ) return 0;
+       if(slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0) return 0;
+       if(reg < 0 || reg >= 8) return 0;
        return mca_info->slot[slot].pos[reg];
 } /* mca_read_stored_pos() */
 
 /*--------------------------------------------------------------------*/
 
-unsigned char mca_read_pos( int slot, int reg 
+unsigned char mca_read_pos(int slot, int reg
 {
        unsigned int byte = 0;
        unsigned long flags;
 
-       if( slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0 ) return 0;
-       if( reg < 0 || reg >= 8 ) return 0;
+       if(slot < 0 || slot >= MCA_NUMADAPTERS || mca_info == 0) return 0;
+       if(reg < 0 || reg >= 8) return 0;
 
-       save_flags( flags );
+       save_flags(flags);
        cli();
 
-       /* make sure motherboard setup is off */
+       /* Make sure motherboard setup is off */
 
        outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
-       /* read in the appropriate register */
+       /* Read in the appropriate register */
 
-       if( slot == MCA_INTEGSCSI && mca_info->which_scsi ) {
+       if(slot == MCA_INTEGSCSI && mca_info->which_scsi) {
 
-               /* disable adapter setup, enable motherboard setup */
+               /* Disable adapter setup, enable motherboard setup */
 
                outb_p(0, MCA_ADAPTER_SETUP_REG);
                outb_p(mca_info->which_scsi, MCA_MOTHERBOARD_SETUP_REG);
 
                byte = inb_p(MCA_POS_REG(reg));
                outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
-       } else if( slot == MCA_INTEGVIDEO ) {
+       } else if(slot == MCA_INTEGVIDEO) {
 
-               /* disable adapter setup, enable motherboard setup */
+               /* Disable adapter setup, enable motherboard setup */
 
                outb_p(0, MCA_ADAPTER_SETUP_REG);
                outb_p(0xdf, MCA_MOTHERBOARD_SETUP_REG);
 
                byte = inb_p(MCA_POS_REG(reg));
                outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
-       } else if( slot < MCA_MAX_SLOT_NR ) {
+       } else if(slot < MCA_MAX_SLOT_NR) {
 
-               /* make sure motherboard setup is off */
+               /* Make sure motherboard setup is off */
 
                outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
-               /* read the appropriate register */
+               /* Read the appropriate register */
 
                outb_p(0x8|(slot&0xf), MCA_ADAPTER_SETUP_REG);
                byte = inb_p(MCA_POS_REG(reg));
                outb_p(0, MCA_ADAPTER_SETUP_REG);
        }
 
-       /* make sure the stored values are consistent, while we're here */
+       /* Make sure the stored values are consistent, while we're here */
 
        mca_info->slot[slot].pos[reg] = byte;
 
-       restore_flags( flags );
+       restore_flags(flags);
 
        return byte;
 } /* mca_read_pos() */
@@ -513,44 +519,47 @@ unsigned char mca_read_pos( int slot, int reg )
  * screws up.
  */
 
-void mca_write_pos( int slot, int reg, unsigned char byte 
+void mca_write_pos(int slot, int reg, unsigned char byte
 {
        unsigned long flags;
 
-       if( slot < 0 || slot >= MCA_MAX_SLOT_NR ) return;
-       if( reg < 0 || reg >= 8 ) return;
-       if (mca_info == 0 )  return;
+       if(slot < 0 || slot >= MCA_MAX_SLOT_NR)
+               return;
+       if(reg < 0 || reg >= 8)
+               return;
+       if(mca_info == 0)
+               return;
 
-       save_flags( flags );
+       save_flags(flags);
        cli();
 
-       /* make sure motherboard setup is off */
+       /* Make sure motherboard setup is off */
 
        outb_p(0xff, MCA_MOTHERBOARD_SETUP_REG);
 
-       /* read in the appropriate register */
+       /* Read in the appropriate register */
 
        outb_p(0x8|(slot&0xf), MCA_ADAPTER_SETUP_REG);
-       outb_p( byte, MCA_POS_REG(reg) );
+       outb_p(byte, MCA_POS_REG(reg));
        outb_p(0, MCA_ADAPTER_SETUP_REG);
 
-       restore_flags( flags );
+       restore_flags(flags);
 
-       /* update the global register list, while we have the byte */
+       /* Update the global register list, while we have the byte */
 
        mca_info->slot[slot].pos[reg] = byte;
 } /* mca_write_pos() */
 
 /*--------------------------------------------------------------------*/
 
-void mca_set_adapter_name( int slot, char* name 
+void mca_set_adapter_name(int slot, char* name
 {
-       if( mca_info == 0 ) return;
+       if(mca_info == 0) return;
 
-       if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
-               if( name != NULL ) {
-                       strncpy( mca_info->slot[slot].name, name,
-                               sizeof(mca_info->slot[slot].name)-1 );
+       if(slot >= 0 && slot < MCA_NUMADAPTERS) {
+               if(name != NULL) {
+                       strncpy(mca_info->slot[slot].name, name,
+                               sizeof(mca_info->slot[slot].name)-1);
                        mca_info->slot[slot].name[
                                sizeof(mca_info->slot[slot].name)-1] = 0;
                } else {
@@ -559,61 +568,61 @@ void mca_set_adapter_name( int slot, char* name )
        }
 }
 
-void mca_set_adapter_procfn( int slot, MCA_ProcFn procfn, void* dev)
+void mca_set_adapter_procfn(int slot, MCA_ProcFn procfn, void* dev)
 {
-       if( mca_info == 0 ) return;
+       if(mca_info == 0) return;
 
-       if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
+       if(slot >= 0 && slot < MCA_NUMADAPTERS) {
                mca_info->slot[slot].procfn = procfn;
                mca_info->slot[slot].dev = dev;
        }
 }
 
-int mca_is_adapter_used( int slot )
+int mca_is_adapter_used(int slot)
 {
        return mca_info->slot[slot].driver_loaded;
 }
 
-int mca_mark_as_used( int slot )
+int mca_mark_as_used(int slot)
 {
        if(mca_info->slot[slot].driver_loaded) return 1;
        mca_info->slot[slot].driver_loaded = 1;
        return 0;
 }
 
-void mca_mark_as_unused( int slot )
+void mca_mark_as_unused(int slot)
 {
        mca_info->slot[slot].driver_loaded = 0;
 }
  
-char *mca_get_adapter_name( int slot 
+char *mca_get_adapter_name(int slot
 {
-       if( mca_info == 0 ) return 0;
+       if(mca_info == 0) return 0;
 
-       if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
+       if(slot >= 0 && slot < MCA_NUMADAPTERS) {
                return mca_info->slot[slot].name;
        }
 
        return 0;
 }
 
-int mca_isadapter( int slot )
+int mca_isadapter(int slot)
 {
-       if( mca_info == 0 ) return 0;
+       if(mca_info == 0) return 0;
 
-       if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
-               return (( mca_info->slot[slot].status == MCA_ADAPTER_NORMAL )
-                       || (mca_info->slot[slot].status == MCA_ADAPTER_DISABLED ) );
+       if(slot >= 0 && slot < MCA_NUMADAPTERS) {
+               return ((mca_info->slot[slot].status == MCA_ADAPTER_NORMAL)
+                       || (mca_info->slot[slot].status == MCA_ADAPTER_DISABLED));
        }
 
        return 0;
 }
 
-int mca_isenabled( int slot )
+int mca_isenabled(int slot)
 {
-       if( mca_info == 0 ) return 0;
+       if(mca_info == 0) return 0;
 
-       if( slot >= 0 && slot < MCA_NUMADAPTERS ) {
+       if(slot >= 0 && slot < MCA_NUMADAPTERS) {
                return (mca_info->slot[slot].status == MCA_ADAPTER_NORMAL);
        }
 
@@ -624,39 +633,37 @@ int mca_isenabled( int slot )
 
 #ifdef CONFIG_PROC_FS
 
-int  get_mca_info(char *buf) 
+int get_mca_info(char *buf) 
 {
-       int  i, j, len = 0; 
+       int i, j, len = 0;
 
-       if( MCA_bus && mca_info != 0 
+       if(MCA_bus && mca_info != 0
        {
-               /* Format pos registers of eight MCA slots */
+               /* Format POS registers of eight MCA slots */
 
-               for (i=0; i<MCA_MAX_SLOT_NR; i++) 
+               for(i=0; i<MCA_MAX_SLOT_NR; i++) 
                {
                        len += sprintf(buf+len, "Slot %d: ", i+1);
-                       for (j=0; j<8; j++) 
+                       for(j=0; j<8; j++) 
                                len += sprintf(buf+len, "%02x ", mca_info->slot[i].pos[j]);
-                       len += sprintf( buf+len, " %s\n", mca_info->slot[i].name );
-               }    
+                       len += sprintf(buf+len, " %s\n", mca_info->slot[i].name);
+               }
 
-               /* Format pos registers of integrated video subsystem */
+               /* Format POS registers of integrated video subsystem */
 
                len += sprintf(buf+len, "Video : ");
-               for (j=0; j<8; j++) 
+               for(j=0; j<8; j++) 
                        len += sprintf(buf+len, "%02x ", mca_info->slot[MCA_INTEGVIDEO].pos[j]);
-               len += sprintf( buf+len, " %s\n", mca_info->slot[MCA_INTEGVIDEO].name );
+               len += sprintf(buf+len, " %s\n", mca_info->slot[MCA_INTEGVIDEO].name);
 
-               /* Format pos registers of integrated SCSI subsystem */
+               /* Format POS registers of integrated SCSI subsystem */
        
                len += sprintf(buf+len, "SCSI  : ");
-               for (j=0; j<8; j++) 
+               for(j=0; j<8; j++)
                        len += sprintf(buf+len, "%02x ", mca_info->slot[MCA_INTEGSCSI].pos[j]);
-               len += sprintf( buf+len, " %s\n", mca_info->slot[MCA_INTEGSCSI].name );
-       } 
-       else 
-       {
-               /* Leave it empty if MCA not detected - this should *never*
+               len += sprintf(buf+len, " %s\n", mca_info->slot[MCA_INTEGSCSI].name);
+       } else {
+               /* Leave it empty if MCA not detected - this should *never*
                 * happen! 
                 */
        }
@@ -667,119 +674,119 @@ int  get_mca_info(char *buf)
 
 /*--------------------------------------------------------------------*/
 
-__initfunc(void mca_do_proc_init( void ))
+__initfunc(void mca_do_proc_init(void))
 {
        int i = 0;
        struct proc_dir_entry* node = 0;
 
-       if( mca_info == 0 ) return;     /* should never happen */
+       if(mca_info == 0) return;       /* Should never happen */
 
-       proc_register( &proc_mca, &(struct proc_dir_entry) {
+       proc_register(&proc_mca, &(struct proc_dir_entry) {
                PROC_MCA_REGISTERS, 3, "pos", S_IFREG|S_IRUGO,
-               1, 0, 0, 0, &proc_mca_inode_operations,} );
+               1, 0, 0, 0, &proc_mca_inode_operations,});
 
-       proc_register( &proc_mca, &(struct proc_dir_entry) {
+       proc_register(&proc_mca, &(struct proc_dir_entry) {
                PROC_MCA_MACHINE, 7, "machine", S_IFREG|S_IRUGO,
-               1, 0, 0, 0, &proc_mca_inode_operations,} );
+               1, 0, 0, 0, &proc_mca_inode_operations,});
 
-       /* initialize /proc/mca entries for existing adapters */
+       /* Initialize /proc/mca entries for existing adapters */
 
-       for( i = 0; i < MCA_NUMADAPTERS; i += 1 ) {
+       for(i = 0; i < MCA_NUMADAPTERS; i++) {
                mca_info->slot[i].procfn = 0;
                mca_info->slot[i].dev = 0;
 
-               if( ! mca_isadapter( i ) ) continue;
+               if(!mca_isadapter(i)) continue;
                node = kmalloc(sizeof(struct proc_dir_entry), GFP_ATOMIC);
 
-               if( i < MCA_MAX_SLOT_NR ) {
+               if(i < MCA_MAX_SLOT_NR) {
                        node->low_ino = PROC_MCA_SLOT + i;
-                       node->namelen = sprintf( mca_info->slot[i].procname,
-                               "slot%d", i+1 );
-               } else if( i == MCA_INTEGVIDEO ) {
+                       node->namelen = sprintf(mca_info->slot[i].procname,
+                               "slot%d", i+1);
+               } else if(i == MCA_INTEGVIDEO) {
                        node->low_ino = PROC_MCA_VIDEO;
-                       node->namelen = sprintf( mca_info->slot[i].procname,
-                               "video" );
-               } else if( i == MCA_INTEGSCSI ) {
+                       node->namelen = sprintf(mca_info->slot[i].procname,
+                               "video");
+               } else if(i == MCA_INTEGSCSI) {
                        node->low_ino = PROC_MCA_SCSI;
-                       node->namelen = sprintf( mca_info->slot[i].procname,
-                               "scsi" );
+                       node->namelen = sprintf(mca_info->slot[i].procname,
+                               "scsi");
                }
                node->name = mca_info->slot[i].procname;
                node->mode = S_IFREG | S_IRUGO;
                node->ops = &proc_mca_inode_operations;
-               proc_register( &proc_mca, node );
+               proc_register(&proc_mca, node);
        }
 
 } /* mca_do_proc_init() */
 
 /*--------------------------------------------------------------------*/
 
-int mca_default_procfn( char* buf, int slot 
+int mca_default_procfn(char* buf, int slot
 {
        int len = 0, i;
 
-       /* this really shouldn't happen... */
+       /* This really shouldn't happen... */
 
-       if( mca_info == 0 ) {
+       if(mca_info == 0) {
                *buf = 0;
                return 0;
        }
 
-       /* print out the basic information */
+       /* Print out the basic information */
 
-       if( slot < MCA_MAX_SLOT_NR ) {
-               len += sprintf( buf+len, "Slot: %d\n", slot+1 );
-       } else if( slot == MCA_INTEGSCSI ) {
-               len += sprintf( buf+len, "Integrated SCSI Adapter\n" );
-       } else if( slot == MCA_INTEGVIDEO ) {
-               len += sprintf( buf+len, "Integrated Video Adapter\n" );
+       if(slot < MCA_MAX_SLOT_NR) {
+               len += sprintf(buf+len, "Slot: %d\n", slot+1);
+       } else if(slot == MCA_INTEGSCSI) {
+               len += sprintf(buf+len, "Integrated SCSI Adapter\n");
+       } else if(slot == MCA_INTEGVIDEO) {
+               len += sprintf(buf+len, "Integrated Video Adapter\n");
        }
-       if( mca_info->slot[slot].name[0] ) {
+       if(mca_info->slot[slot].name[0]) {
 
-               /* drivers might register a name without /proc handler... */
+               /* Drivers might register a name without /proc handler... */
 
-               len += sprintf( buf+len, "Adapter Name: %s\n",
-                       mca_info->slot[slot].name );
+               len += sprintf(buf+len, "Adapter Name: %s\n",
+                       mca_info->slot[slot].name);
        } else {
-               len += sprintf( buf+len, "Adapter Name: Unknown\n" );
+               len += sprintf(buf+len, "Adapter Name: Unknown\n");
        }
-       len += sprintf( buf+len, "Id: %02x%02x\n",
-               mca_info->slot[slot].pos[1], mca_info->slot[slot].pos[0] );
-       len += sprintf( buf+len, "Enabled: %s\nPOS: ",
-               mca_isenabled(slot) ? "Yes" : "No" );
-       len += sprintf( buf+len, "Driver Installed: %s\n",
-               mca_is_adapter_used(slot) ? "Yes" : "No" );
-       for (i=0; i<8; i++) {
+       len += sprintf(buf+len, "Id: %02x%02x\n",
+               mca_info->slot[slot].pos[1], mca_info->slot[slot].pos[0]);
+       len += sprintf(buf+len, "Enabled: %s\nPOS: ",
+               mca_isenabled(slot) ? "Yes" : "No");
+       for(i=0; i<8; i++) {
                len += sprintf(buf+len, "%02x ", mca_info->slot[slot].pos[i]);
        }
+       len += sprintf(buf+len, "\nDriver Installed: %s",
+               mca_is_adapter_used(slot) ? "Yes" : "No");
        buf[len++] = '\n';
        buf[len] = 0;
 
        return len;
 } /* mca_default_procfn() */
 
-static int get_mca_machine_info( char* buf 
+static int get_mca_machine_info(char* buf
 {
        int len = 0;
 
-       len += sprintf( buf+len, "Model Id: 0x%x\n", machine_id );
-       len += sprintf( buf+len, "Submodel Id: 0x%x\n", machine_submodel_id );
-       len += sprintf( buf+len, "BIOS Revision: 0x%x\n", BIOS_revision );
+       len += sprintf(buf+len, "Model Id: 0x%x\n", machine_id);
+       len += sprintf(buf+len, "Submodel Id: 0x%x\n", machine_submodel_id);
+       len += sprintf(buf+len, "BIOS Revision: 0x%x\n", BIOS_revision);
 
        return len;
 }
 
-static int mca_fill( char* page, int pid, int type, char** start,
+static int mca_fill(char* page, int pid, int type, char** start,
        loff_t *offset, int length)
 {
        int len = 0;
        int slot = 0;
 
-       switch( type ) {
+       switch(type) {
                case PROC_MCA_REGISTERS:
-                       return get_mca_info( page );
+                       return get_mca_info(page);
                case PROC_MCA_MACHINE:
-                       return get_mca_machine_info( page );
+                       return get_mca_machine_info(page);
                case PROC_MCA_VIDEO:
                        slot = MCA_INTEGVIDEO;
                        break;
@@ -787,24 +794,24 @@ static int mca_fill( char* page, int pid, int type, char** start,
                        slot = MCA_INTEGSCSI;
                        break;
                default:
-                       if( type < PROC_MCA_SLOT || type >= PROC_MCA_LAST ) {
+                       if(type < PROC_MCA_SLOT || type >= PROC_MCA_LAST) {
                                return -EBADF;
                        }
                        slot = type - PROC_MCA_SLOT;
                        break;
        }
 
-       /* if we made it here, we better have a valid slot */
+       /* If we made it here, we better have a valid slot */
 
-       /* get the standard info */
+       /* Get the standard info */
 
-       len = mca_default_procfn( page, slot );
+       len = mca_default_procfn(page, slot);
 
-       /* do any device-specific processing, if there is any */
+       /* Do any device-specific processing, if there is any */
 
-       if( mca_info->slot[slot].procfn ) {
-               len += mca_info->slot[slot].procfn( page+len, slot,
-                       mca_info->slot[slot].dev );
+       if(mca_info->slot[slot].procfn) {
+               len += mca_info->slot[slot].procfn(page+len, slot,
+                       mca_info->slot[slot].dev);
        }
 
        return len;
@@ -814,7 +821,7 @@ static int mca_fill( char* page, int pid, int type, char** start,
 
 #define PROC_BLOCK_SIZE        (3*1024)
 
-static ssize_t proc_mca_read( struct file* file,
+static ssize_t proc_mca_read(struct file* file,
        char* buf, size_t count, loff_t *ppos)
 {
        unsigned long page;
@@ -825,11 +832,11 @@ static ssize_t proc_mca_read( struct file* file,
        struct proc_dir_entry *dp;
        struct inode *inode = file->f_dentry->d_inode;
 
-       if (count < 0)
+       if(count < 0)
                return -EINVAL;
-       if (count > PROC_BLOCK_SIZE)
+       if(count > PROC_BLOCK_SIZE)
                count = PROC_BLOCK_SIZE;
-       if (!(page = __get_free_page(GFP_KERNEL)))
+       if(!(page = __get_free_page(GFP_KERNEL)))
                return -ENOMEM;
        type = inode->i_ino;
        pid = type >> 16;
@@ -837,12 +844,12 @@ static ssize_t proc_mca_read( struct file* file,
        start = 0;
        dp = (struct proc_dir_entry *) inode->u.generic_ip;
        length = mca_fill((char *) page, pid, type,
-                           &start, ppos, count);
-       if (length < 0) {
+                         &start, ppos, count);
+       if(length < 0) {
                free_page(page);
                return length;
        }
-       if (start != 0) {
+       if(start != 0) {
                /* We have had block-adjusting processing! */
 
                copy_to_user(buf, start, length);
@@ -851,11 +858,11 @@ static ssize_t proc_mca_read( struct file* file,
        } else {
                /* Static 4kB (or whatever) block capacity */
 
-               if (*ppos >= length) {
+               if(*ppos >= length) {
                        free_page(page);
                        return 0;
                }
-               if (count + *ppos > length)
+               if(count + *ppos > length)
                        count = length - *ppos;
                end = count + *ppos;
                copy_to_user(buf, (char *) page + *ppos, count);
index d1f6226eb0d09ac7b3975bf0b9fb0fc0b7b63cb9..1e20251c39b444bfccc64c35d2acd4ccb27749e0 100644 (file)
@@ -123,6 +123,7 @@ if [ "$CONFIG_VIDEO_DEV" != "n" ]; then
   if [ "$CONFIG_RADIO_AZTECH" = "y" ]; then
     hex '  Aztech/Packard Bell I/O port (0x350 or 0x358)' CONFIG_RADIO_AZTECH_PORT 350
   fi
+  dep_tristate 'ADS Cadet AM/FM Tuner' CONFIG_RADIO_CADET $CONFIG_VIDEO_DEV
   dep_tristate 'Miro PCM20 Radio' CONFIG_RADIO_MIROPCM20 $CONFIG_VIDEO_DEV
   dep_tristate 'GemTek Radio Card support' CONFIG_RADIO_GEMTEK $CONFIG_VIDEO_DEV
   if [ "$CONFIG_RADIO_GEMTEK" = "y" ]; then
index 56ae8fe339377bde57cd9e0e88c3c28c7c083f61..d623c4ec8c307b3784d76a139ce34be46c66b989 100644 (file)
@@ -401,6 +401,14 @@ else
   endif
 endif                                             
 
+ifeq ($(CONFIG_RADIO_CADET),y)
+L_OBJS += radio-cadet.o
+else
+  ifeq ($(CONFIG_RADIO_CADET),m)
+  M_OBJS += radio-cadet.o
+  endif
+endif                                             
+
 ifeq ($(CONFIG_RADIO_MIROPCM20),y)
 L_OBJS += radio-miropcm20.o
 else
@@ -459,6 +467,7 @@ else
   ALL_SUB_DIRS += hfmodem
   MOD_SUB_DIRS += hfmodem
   endif
+
 endif
 
 include $(TOPDIR)/Rules.make
index f0a9a1c1734ec9e588a2d009ff4101f075967bd5..99c1b92bcaf3975d7d03ee97ccdeef9713c9ada9 100644 (file)
@@ -235,6 +235,7 @@ static int rt_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        v.rangehigh=(108*16000);
                        v.flags=VIDEO_TUNER_LOW;
                        v.mode=VIDEO_MODE_AUTO;
+                       strcpy(v.name, "FM");
                        v.signal=0xFFFF*rt_getsigstr(rt);
                        if(copy_to_user(arg,&v, sizeof(v)))
                                return -EFAULT;
index f9f1d94c82a8a8adf04fef84e402e7a281a56466..e21adc44a1ba0062b384807a908e27e34bc743c0 100644 (file)
@@ -186,6 +186,7 @@ static int az_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        v.signal=0xFFFF*az_getsigstr(az);
                        if(az_getstereo(az))
                                v.flags|=VIDEO_TUNER_STEREO_ON;
+                       strcpy(v.name, "FM");
                        if(copy_to_user(arg,&v, sizeof(v)))
                                return -EFAULT;
                        return 0;
diff --git a/drivers/char/radio-cadet.c b/drivers/char/radio-cadet.c
new file mode 100644 (file)
index 0000000..38d3639
--- /dev/null
@@ -0,0 +1,403 @@
+/* cadet.c - A video4linux driver for the ADS Cadet AM/FM Radio Card 
+ *
+ * by Fred Gleason <fredg@wava.com>
+ * Version 0.1.2
+ *
+ * (Loosely) based on code for the Aztech radio card by
+ *
+ * Russell Kroll    (rkroll@exploits.org)
+ * Quay Ly
+ * Donald Song
+ * Jason Lewis      (jlewis@twilight.vtc.vsc.edu) 
+ * Scott McGrath    (smcgrath@twilight.vtc.vsc.edu)
+ * William McGrath  (wmcgrath@twilight.vtc.vsc.edu)
+ *
+*/
+
+#include <linux/module.h>      /* Modules                      */
+#include <linux/init.h>                /* Initdata                     */
+#include <linux/ioport.h>      /* check_region, request_region */
+#include <linux/delay.h>       /* udelay                       */
+#include <asm/io.h>            /* outb, outb_p                 */
+#include <asm/uaccess.h>       /* copy to/from user            */
+#include <linux/videodev.h>    /* kernel radio structs         */
+#include <linux/config.h>      /* CONFIG_RADIO_CADET_PORT      */
+
+#ifndef CONFIG_RADIO_CADET_PORT
+#define CONFIG_RADIO_CADET_PORT 0x330
+#endif
+
+static int io=CONFIG_RADIO_CADET_PORT; 
+static int users=0;
+static int curtuner=0;
+
+static int cadet_getstereo(void)
+{
+  if(curtuner!=0) {          /* Only FM has stereo capability! */
+               return 0;
+       }
+        outb(7,io);          /* Select tuner control */
+        if((inb(io+1)&0x40)==0) {
+                return 1;    /* Stereo pilot detected */
+        }
+        else {
+                return 0;    /* Mono */
+        }
+}
+
+
+static unsigned cadet_getfreq(void)
+{
+        int curvol,i;
+        unsigned freq=0,test,fifo=0;
+  
+
+        /*
+         * Prepare for read
+         */
+        outb(7,io);       /* Select tuner control */
+        curvol=inb(io+1); /* Save current volume/mute setting */
+        outb(0x00,io+1);  /* Ensure WRITE-ENABLE is LOW */
+
+        /*
+         * Read the shift register
+         */
+        for(i=0;i<25;i++) {
+                fifo=(fifo<<1)|((inb(io+1)>>7)&0x01);
+                if(i<24) {
+                        outb(0x01,io+1);
+                        outb(0x00,io+1);
+                }
+        }
+
+        /*
+         * Restore volume/mute setting
+         */
+        outb(curvol,io+1);
+
+        /*
+         * Convert to actual frequency
+         */
+       if(curtuner==0) {    /* FM */
+               test=12500;
+                for(i=0;i<14;i++) {
+                        if((fifo&0x01)!=0) {
+                                freq+=test;
+                        }
+                        test=test<<1;
+                        fifo=fifo>>1;
+                }
+                freq-=10700000;           /* IF frequency is 10.7 MHz */
+                freq=(freq*16)/1000000;   /* Make it 1/16 MHz */
+       }
+       if(curtuner==1) {    /* AM */
+               freq=((fifo&0x7fff)-2010)*16;
+       }
+
+        return freq;
+}
+
+
+static void cadet_setfreq(unsigned freq)
+{
+        unsigned fifo;
+        int i,test;
+        int curvol;
+
+        /* 
+         * Formulate a fifo command
+         */
+       fifo=0;
+       if(curtuner==0) {    /* FM */
+               test=102400;
+                freq=(freq*1000)/16;       /* Make it kHz */
+                freq+=10700;               /* IF is 10700 kHz */
+                for(i=0;i<14;i++) {
+                        fifo=fifo<<1;
+                        if(freq>=test) {
+                                fifo|=0x01;
+                                freq-=test;
+                        }
+                        test=test>>1;
+                }
+       }
+       if(curtuner==1) {    /* AM */
+                fifo=(freq/16)+2010;            /* Make it kHz */
+               fifo|=0x100000;            /* Select AM Band */
+       }
+
+        /*
+         * Save current volume/mute setting
+         */
+        curvol=inb(io+1); 
+
+        /*
+         * Write the shift register
+         */
+        test=0;
+        test=(fifo>>23)&0x02;      /* Align data for SDO */
+        test|=0x1c;                /* SDM=1, SWE=1, SEN=1, SCK=0 */
+        outb(7,io);                /* Select tuner control */
+        outb(test,io+1);           /* Initialize for write */
+        for(i=0;i<25;i++) {
+                test|=0x01;              /* Toggle SCK High */
+                outb(test,io+1);
+                test&=0xfe;              /* Toggle SCK Low */
+                outb(test,io+1);
+                fifo=fifo<<1;            /* Prepare the next bit */
+                test=0x1c|((fifo>>23)&0x02);
+                outb(test,io+1);
+        }
+        /*
+         * Restore volume/mute setting
+         */
+        outb(curvol,io+1);
+}
+
+
+static int cadet_getvol(void)
+{
+        outb(7,io);                /* Select tuner control */
+        if((inb(io+1)&0x20)!=0) {
+                return 0xffff;
+        }
+        else {
+                return 0;
+        }
+}
+
+
+static void cadet_setvol(int vol)
+{
+        outb(7,io);                /* Select tuner control */
+        if(vol>0) {
+                outb(0x20,io+1);
+        }
+        else {
+                outb(0x00,io+1);
+        }
+}  
+
+
+static int cadet_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
+{
+        unsigned freq;
+       switch(cmd)
+       {
+               case VIDIOCGCAP:
+               {
+                       struct video_capability v;
+                       v.type=VID_TYPE_TUNER;
+                       v.channels=2;
+                       v.audios=1;
+                       /* No we don't do pictures */
+                       v.maxwidth=0;
+                       v.maxheight=0;
+                       v.minwidth=0;
+                       v.minheight=0;
+                       strcpy(v.name, "ADS Cadet");
+                       if(copy_to_user(arg,&v,sizeof(v)))
+                               return -EFAULT;
+                       return 0;
+               }
+               case VIDIOCGTUNER:
+               {
+                       struct video_tuner v;
+                       if(copy_from_user(&v, arg,sizeof(v))!=0) { 
+                               return -EFAULT;
+                       }
+                       if((v.tuner<0)||(v.tuner>1)) {
+                               return -EINVAL;
+                       }
+                       switch(v.tuner) {
+                               case 0:
+                               strcpy(v.name,"FM");
+                               v.rangelow=1400;     /* 87.5 MHz */
+                               v.rangehigh=1728;    /* 108.0 MHz */
+                               v.flags=0;
+                               v.mode=0;
+                               v.mode|=VIDEO_MODE_AUTO;
+                               v.signal=0xFFFF;
+                               if(cadet_getstereo()==1) {
+                                       v.flags|=VIDEO_TUNER_STEREO_ON;
+                               }
+                               if(copy_to_user(arg,&v, sizeof(v))) {
+                                       return -EFAULT;
+                               }
+                               break;
+                               case 1:
+                               strcpy(v.name,"AM");
+                               v.rangelow=8320;      /* 520 kHz */
+                               v.rangehigh=26400;    /* 1650 kHz */
+                               v.flags=0;
+                               v.flags|=VIDEO_TUNER_LOW;
+                               v.mode=0;
+                               v.mode|=VIDEO_MODE_AUTO;
+                               v.signal=0xFFFF;
+                               if(copy_to_user(arg,&v, sizeof(v))) {
+                                       return -EFAULT;
+                               }
+                               break;
+                       }
+                       return 0;
+               }
+               case VIDIOCSTUNER:
+               {
+                       struct video_tuner v;
+                       if(copy_from_user(&v, arg, sizeof(v))) {
+                               return -EFAULT;
+                       }
+                       if((v.tuner<0)||(v.tuner>1)) {
+                               return -EINVAL;
+                       }
+                       curtuner=v.tuner;       
+                       return 0;
+               }
+               case VIDIOCGFREQ:
+                       freq=cadet_getfreq();
+                       if(copy_to_user(arg, &freq, sizeof(freq)))
+                               return -EFAULT;
+                       return 0;
+               case VIDIOCSFREQ:
+                       if(copy_from_user(&freq, arg,sizeof(freq)))
+                               return -EFAULT;
+                       if((curtuner==0)&&((freq<1400)||(freq>1728))) {
+                               return -EINVAL;
+                       }
+                       if((curtuner==1)&&((freq<8320)||(freq>26400))) {
+                               return -EINVAL;
+                       }
+                       cadet_setfreq(freq);
+                       return 0;
+               case VIDIOCGAUDIO:
+               {       
+                       struct video_audio v;
+                       memset(&v,0, sizeof(v));
+                       v.flags=VIDEO_AUDIO_MUTABLE|VIDEO_AUDIO_VOLUME;
+                       if(cadet_getstereo()==0) {
+                               v.mode=VIDEO_SOUND_MONO;
+                       }
+                       else {
+                         v.mode=VIDEO_SOUND_STEREO;
+                       }
+                       v.volume=cadet_getvol();
+                       v.step=0xffff;
+                       strcpy(v.name, "Radio");
+                       if(copy_to_user(arg,&v, sizeof(v)))
+                               return -EFAULT;
+                       return 0;                       
+               }
+               case VIDIOCSAUDIO:
+               {
+                       struct video_audio v;
+                       if(copy_from_user(&v, arg, sizeof(v))) 
+                               return -EFAULT; 
+                       if(v.audio) 
+                               return -EINVAL;
+                       cadet_setvol(v.volume);
+                       if(v.flags&VIDEO_AUDIO_MUTE) 
+                               cadet_setvol(0);
+                       else
+                               cadet_setvol(0xffff);
+                       return 0;
+               }
+               default:
+                       return -ENOIOCTLCMD;
+       }
+}
+
+
+static int cadet_open(struct video_device *dev, int flags)
+{
+       if(users)
+               return -EBUSY;
+       users++;
+       MOD_INC_USE_COUNT;
+       return 0;
+}
+
+static void cadet_close(struct video_device *dev)
+{
+       users--;
+       MOD_DEC_USE_COUNT;
+}
+
+
+static struct video_device cadet_radio=
+{
+       "Cadet radio",
+       VID_TYPE_TUNER,
+       VID_HARDWARE_CADET,
+       cadet_open,
+       cadet_close,
+       NULL,   /* Can't read  (no capture ability) */
+       NULL,   /* Can't write */
+       NULL,   /* No poll */
+       cadet_ioctl,
+       NULL,
+       NULL
+};
+
+__initfunc(int cadet_init(struct video_init *v))
+{
+#ifndef MODULE        
+        if(cadet_probe()<0) {
+               return EINVAL;
+       }
+#endif
+       if(video_register_device(&cadet_radio,VFL_TYPE_RADIO)==-1)
+               return -EINVAL;
+               
+       request_region(io,2,"cadet");
+       printk(KERN_INFO "ADS Cadet Radio Card at %x\n",io);
+       return 0;
+}
+
+
+static int cadet_probe(void)
+{
+        static int iovals[8]={0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e};
+       int i;
+
+       for(i=0;i<8;i++) {
+               io=iovals[i];
+               if(check_region(io,2)) {
+                       return -1;
+               }  
+               cadet_setfreq(1410);
+               if(cadet_getfreq()==1410) {
+                       return io;
+               }
+       }
+       return -1;
+}
+
+
+
+#ifdef MODULE
+
+MODULE_AUTHOR("Fred Gleason, Russell Kroll, Quay Lu, Donald Song, Jason Lewis, Scott McGrath, William McGrath");
+MODULE_DESCRIPTION("A driver for the ADS Cadet AM/FM/RDS radio card.");
+MODULE_PARM(io, "i");
+MODULE_PARM_DESC(io, "I/O address of Cadet card (0x330,0x332,0x334,0x336,0x338,0x33a,0x33c,0x33e)");
+
+EXPORT_NO_SYMBOLS;
+
+int init_module(void)
+{
+       if(io==-1)
+       {
+               printk(KERN_ERR "You must set an I/O address with io=0x???\n");
+               return -EINVAL;
+       }
+       return cadet_init(NULL);
+}
+
+void cleanup_module(void)
+{
+       video_unregister_device(&cadet_radio);
+       release_region(io,2);
+}
+
+#endif
+
index 1bfe30e30b9c538cc7bac0224dcc90782c9a00cb..46d41f423912736aeeaf7837119da3a550db911a 100644 (file)
@@ -160,6 +160,7 @@ static int gemtek_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        v.flags=VIDEO_TUNER_LOW;
                        v.mode=VIDEO_MODE_AUTO;
                        v.signal=0xFFFF*gemtek_getsigstr(rt);
+                       strcpy(v.name, "FM");
                        if(copy_to_user(arg,&v, sizeof(v)))
                                return -EFAULT;
                        return 0;
index 126a27771a256b87f474fe799a8174d97d979f64..1f15d389a6e5e717d429346550559c06ac11b100 100644 (file)
@@ -118,6 +118,7 @@ static int pcm20_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        v.flags=0;
                        v.mode=VIDEO_MODE_AUTO;
                        v.signal=0xFFFF*pcm20_getsigstr(pcm20);
+                       strcpy(v.name, "FM");
                        if(copy_to_user(arg,&v, sizeof(v)))
                                return -EFAULT;
                        return 0;
index 175c665f7bba7f983b8f7e6c6037002ef687b2b5..793548839803a84a879e7d4667641938c4293038 100644 (file)
@@ -130,6 +130,7 @@ static int rt_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        v.flags=VIDEO_TUNER_LOW;
                        v.mode=VIDEO_MODE_AUTO;
                        v.signal=0xFFFF*rt_getsigstr(rt);
+                       strcpy(v.name, "FM");
                        if(copy_to_user(arg,&v, sizeof(v)))
                                return -EFAULT;
                        return 0;
index 8840bbc20ee737372fcbdb28a9ddae5a0f35c7ea..58f9918d1c0a977fa90f06929112e62f60820857 100644 (file)
@@ -158,6 +158,7 @@ static int fmi_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        v.flags=fmi->flags;
                        v.mode=VIDEO_MODE_AUTO;
                        v.signal = fmi_getsigstr(fmi);
+                       strcpy(v.name, "FM");
                        if(copy_to_user(arg,&v, sizeof(v)))
                                return -EFAULT;
                        return 0;
index 171ae311af2581590f7f545840a614ce6c7ec990..3282ea67a8bac962481628e2623a41fefd5bd994 100644 (file)
@@ -195,7 +195,8 @@ static int typhoon_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
                        v.rangehigh = 1080 * 1600;
                        v.flags = VIDEO_TUNER_LOW;
                        v.mode = VIDEO_MODE_AUTO;
-                       v.signal = 0;   /* We can't get the signal strength */
+                       v.signal = 0xFFFF;      /* We can't get the signal strength */
+                       strcpy(v.tuner, "FM");
                        if (copy_to_user(arg, &v, sizeof(v)))
                                return -EFAULT;
                        return 0;
index d01e016aac0dc1222a2549d6904198976ff4ff31..4b7d774c54d7b6d99a290d3f36c8fd172da06395 100644 (file)
@@ -223,14 +223,11 @@ static int zol_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
        case VIDIOCGTUNER:
                {
                        struct video_tuner v;
-/*
                        if (copy_from_user(&v, arg, sizeof(v)))
                                return -EFAULT;
                        if (v.tuner)    
                                return -EINVAL;
-*/
-                       v.tuner = 0;
-                       strcpy(v.name, "Zoltrix Radio");
+                       strcpy(v.name, "FM");
                        v.rangelow = (int) (88.0 * 16000);
                        v.rangehigh = (int) (108.0 * 16000);
                        v.flags = zol_is_stereo(zol)
index 187d0715df8a64e0ea9c6411e105b344dfe6084a..21ed48c615aed3ea933bb1e501a9a65ec3dbd2dc 100644 (file)
@@ -75,6 +75,9 @@ extern int gemtek_init(struct video_init *);
 #ifdef CONFIG_RADIO_TYPHOON
 extern int typhoon_init(struct video_init *);
 #endif
+#ifdef CONFIG_RADIO_CADET
+extern int cadet_init(struct video_init *);
+#endif
 #ifdef CONFIG_VIDEO_PMS
 extern int init_pms_cards(struct video_init *);
 #endif
@@ -111,6 +114,9 @@ static struct video_init video_init_list[]={
 #ifdef CONFIG_RADIO_MIROPCM20
        {"PCM20", pcm20_init}, 
 #endif
+#ifdef CONFIG_RADIO_CADET
+       {"Cadet", cadet_init},
+#endif
 #ifdef CONFIG_RADIO_GEMTEK
        {"GemTek", gemtek_init},
 #endif
@@ -430,6 +436,12 @@ void cleanup_module(void)
        unregister_chrdev(VIDEO_MAJOR, "video_capture");
 }
 
+
+
+
+
+
+
 #endif
 
 #if LINUX_VERSION_CODE >= 0x020100
index bf12c3d69a6b778038c45d3363f75045efd9ddb7..6506f718d215876bb37a5948937355ba13a04fdf 100644 (file)
@@ -1073,7 +1073,7 @@ SUB_DIRS += irda
 MOD_IN_SUB_DIRS += irda
 else
   ifeq ($(CONFIG_IRDA),m)
-  MOD_SUB_DIRS += irda
+  MOD_IN_SUB_DIRS += irda
   endif
 endif
 
index 6a15710043124655b5513a6753ef4aface948dba..6a7920a6e1c56695e466ea104825cb5cc82d21ba 100644 (file)
@@ -10,7 +10,7 @@ ALL_SUB_DIRS := $(SUB_DIRS)
 L_TARGET := irda_drivers.a
 L_OBJS   := 
 M_OBJS   :=
-MOD_LIST_NAME := IRDA_MODULES
+MOD_LIST_NAME := IRDA_DRIVERS_MODULES
 
 ifeq ($(CONFIG_IRTTY_SIR),y)
 L_OBJS += irtty.o
index 616a8d3d9500b75a19f47d225008f1352e30e7eb..6f23506528e58794390b6a924ab17fc9b2db6c64 100644 (file)
 #include <net/irda/irport.h>
 
 #define IO_EXTENT 8
+#define CONFIG_HALF_DUPLEX
 
-static unsigned int io[]  = { 0x3e8, ~0, ~0, ~0 };
-static unsigned int irq[] = { 11, 0, 0, 0 };
+/* static unsigned int io[]  = { 0x3e8, ~0, ~0, ~0 }; */
+/* static unsigned int irq[] = { 11, 0, 0, 0 }; */
 
-static void irport_write_wakeup( struct irda_device *idev);
-static int  irport_write( int iobase, int fifo_size, __u8 *buf, int len);
-static void irport_receive( struct irda_device *idev);
+static void irport_write_wakeup(struct irda_device *idev);
+static int  irport_write(int iobase, int fifo_size, __u8 *buf, int len);
+static void irport_receive(struct irda_device *idev);
 
 __initfunc(int irport_init(void))
 {
@@ -115,15 +116,15 @@ static void irport_cleanup(void)
  */
 int irport_open( int iobase)
 {
-       DEBUG( 0, __FUNCTION__ "(), iobase=%#x\n", iobase);
+       DEBUG(4, __FUNCTION__ "(), iobase=%#x\n", iobase);
 
        /* Initialize UART */
-       outb( UART_LCR_WLEN8, iobase+UART_LCR);  /* Reset DLAB */
-       outb(( UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase+UART_MCR);
+       outb(UART_LCR_WLEN8, iobase+UART_LCR);  /* Reset DLAB */
+       outb((UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase+UART_MCR);
        
        /* Turn on interrups */
-       outb(( UART_IER_THRI |UART_IER_RLSI | UART_IER_RDI), iobase+UART_IER); 
-       
+       outb((UART_IER_RLSI | UART_IER_RDI), iobase+UART_IER);
+
        return 0;
 }
 
@@ -135,13 +136,13 @@ int irport_open( int iobase)
  */
 void irport_close( int iobase) 
 {
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
        /* Reset UART */
-       outb( 0, iobase+UART_MCR);
+       outb(0, iobase+UART_MCR);
 
        /* Turn off interrupts */
-       outb( 0, iobase+UART_IER); 
+       outb(0, iobase+UART_IER); 
 }
 
 /*
@@ -158,10 +159,8 @@ void irport_change_speed( int iobase, int speed)
 
        DEBUG( 0, __FUNCTION__ "(), Setting speed to: %d\n", speed);
 
-       DEBUG( 0, __FUNCTION__ "(), iobase=%#x\n", iobase);
-
        /* Turn off interrupts */
-       outb( 0, iobase+UART_IER); 
+       outb(0, iobase+UART_IER); 
 
        divisor = SPEED_MAX/speed;
        
@@ -170,55 +169,14 @@ void irport_change_speed( int iobase, int speed)
        /* IrDA ports use 8N1 */
        lcr = UART_LCR_WLEN8;
        
-       outb( UART_LCR_DLAB | lcr, iobase+UART_LCR); /* Set DLAB */
-       outb( divisor & 0xff,      iobase+UART_DLL); /* Set speed */
-       outb( divisor >> 8,        iobase+UART_DLM);
-       outb( lcr,                 iobase+UART_LCR); /* Set 8N1 */
-       outb( fcr,                 iobase+UART_FCR); /* Enable FIFO's */
-
-       /* Turn on interrups */
-       outb( UART_IER_THRI|UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER); 
-}
-
-/*
- * Function irport_interrupt (irq, dev_id, regs)
- *
- *    
- */
-void irport_interrupt( int irq, void *dev_id, struct pt_regs *regs) 
-{
-       struct irda_device *idev = (struct irda_device *) dev_id;
-
-       int iobase, status;
-       int iir;
-
-       DEBUG( 4, __FUNCTION__ "(), irq %d\n", irq);
-
-       if ( !idev) {
-               printk( KERN_WARNING __FUNCTION__ 
-                       "() irq %d for unknown device.\n", irq);
-               return;
-       }
-
-       idev->netdev.interrupt = 1;
-
-       iobase = idev->io.iobase2;
-
-       iir = inb(iobase + UART_IIR);
-       do {
-               status = inb( iobase+UART_LSR);
-               
-               if (status & UART_LSR_DR) {
-                       /* Receive interrupt */
-                       irport_receive(idev);
-               }
-               if (status & UART_LSR_THRE) {
-                       /* Transmitter ready for data */
-                       irport_write_wakeup(idev);
-               }
-       } while (!(inb(iobase+UART_IIR) & UART_IIR_NO_INT));
-
-       idev->netdev.interrupt = 0;
+       outb(UART_LCR_DLAB | lcr, iobase+UART_LCR); /* Set DLAB */
+       outb(divisor & 0xff,      iobase+UART_DLL); /* Set speed */
+       outb(divisor >> 8,        iobase+UART_DLM);
+       outb(lcr,                 iobase+UART_LCR); /* Set 8N1  */
+       outb(fcr,                 iobase+UART_FCR); /* Enable FIFO's */
+
+       /* Turn on receive interrups */
+       outb(UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER); 
 }
 
 /*
@@ -231,34 +189,38 @@ void irport_interrupt( int irq, void *dev_id, struct pt_regs *regs)
 static void irport_write_wakeup( struct irda_device *idev)
 {
        int actual = 0, count;
-       
-       DEBUG( 4, __FUNCTION__ "() <%ld>\n", jiffies);
-       
-       ASSERT( idev != NULL, return;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+       int iobase;
 
-       /* Finished with frame?  */
-       if ( idev->tx_buff.offset == idev->tx_buff.len)  {
+       ASSERT(idev != NULL, return;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
+       /* Finished with frame?  */
+       if (idev->tx_buff.offset == idev->tx_buff.len)  {
+               iobase = idev->io.iobase2;
                /* 
                 *  Now serial buffer is almost free & we can start 
                 *  transmission of another packet 
                 */
-               DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
-
                idev->netdev.tbusy = 0; /* Unlock */
                idev->stats.tx_packets++;
 
                /* Schedule network layer, so we can get some more frames */
-               mark_bh( NET_BH);
-
+               mark_bh(NET_BH);
+#ifdef CONFIG_HALF_DUPLEX
+               outb(UART_FCR_ENABLE_FIFO | 
+                    UART_FCR_TRIGGER_14  |
+                    UART_FCR_CLEAR_RCVR, iobase+UART_FCR); /* Enable FIFO's */
+
+               /* Turn on receive interrupts */
+               outb(UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER); 
+#endif
                return;
        }
 
        /* Write data left in transmit buffer */
        count = idev->tx_buff.len - idev->tx_buff.offset;
-       actual = irport_write( idev->io.iobase2, idev->io.fifo_size, 
-                              idev->tx_buff.head, count);
+       actual = irport_write(idev->io.iobase2, idev->io.fifo_size, 
+                             idev->tx_buff.head, count);
        idev->tx_buff.offset += actual;
        idev->tx_buff.head += actual;
 }
@@ -269,12 +231,12 @@ static void irport_write_wakeup( struct irda_device *idev)
  *    
  *
  */
-static int irport_write( int iobase, int fifo_size, __u8 *buf, int len)
+static int irport_write(int iobase, int fifo_size, __u8 *buf, int len)
 {
        int actual = 0;
 
        /* Tx FIFO should be empty! */
-       if (!(inb( iobase+UART_LSR) & UART_LSR_THRE)) {
+       if (!(inb(iobase+UART_LSR) & UART_LSR_THRE)) {
                DEBUG( 0, __FUNCTION__ "(), failed, fifo not empty!\n");
                return -1;
        }
@@ -287,8 +249,8 @@ static int irport_write( int iobase, int fifo_size, __u8 *buf, int len)
                actual++;
        }
         
-       DEBUG( 4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
-              fifo_size, actual, len);
+       DEBUG(4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
+             fifo_size, actual, len);
 
        return actual;
 }
@@ -300,43 +262,44 @@ static int irport_write( int iobase, int fifo_size, __u8 *buf, int len)
  *    waits until the next transmitt interrupt, and continues until the
  *    frame is transmited.
  */
-int irport_hard_xmit( struct sk_buff *skb, struct device *dev)
+int irport_hard_xmit(struct sk_buff *skb, struct device *dev)
 {
        struct irda_device *idev;
-       int actual;
-
-       DEBUG( 4, __FUNCTION__ "()\n");
+       int actual = 0;
+       int iobase;
 
-       ASSERT( dev != NULL, return -1;);
+       DEBUG(5, __FUNCTION__ "(), dev=%p\n", dev);
 
-       if ( dev->tbusy) {
-               DEBUG( 4, __FUNCTION__ "(), tbusy==TRUE\n");
-               
-               return -EBUSY;
-       }
+       ASSERT(dev != NULL, return 0;);
        
        idev = (struct irda_device *) dev->priv;
 
-       ASSERT( idev != NULL, return -1;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+       ASSERT(idev != NULL, return 0;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+       iobase = idev->io.iobase2;
 
        /* Lock transmit buffer */
-       if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+       if (irda_lock((void *) &dev->tbusy) == FALSE)
                return -EBUSY;
        
         /*  
         *  Transfer skb to tx_buff while wrapping, stuffing and making CRC 
         */
-       idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data, 
-                                           idev->tx_buff.truesize);
+       idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data, 
+                                          idev->tx_buff.truesize);
        
-       actual = irport_write( idev->io.iobase2, idev->io.fifo_size, 
-                              idev->tx_buff.data, idev->tx_buff.len);
+/*     actual = irport_write(idev->io.iobase2, idev->io.fifo_size,  */
+/*                           idev->tx_buff.data, idev->tx_buff.len); */
        
        idev->tx_buff.offset = actual;
        idev->tx_buff.head = idev->tx_buff.data + actual;
-       
-       dev_kfree_skb( skb);
+
+#ifdef CONFIG_HALF_DUPLEX
+       /* Turn on transmit finished interrupt. Will fire immediately!  */
+       outb(UART_IER_THRI, iobase+UART_IER); 
+#endif
+       dev_kfree_skb(skb);
        
        return 0;
 }
@@ -347,18 +310,19 @@ int irport_hard_xmit( struct sk_buff *skb, struct device *dev)
  *    Receive one frame from the infrared port
  *
  */
-static void irport_receive( struct irda_device *idev) 
+static void irport_receive(struct irda_device *idev) 
 {
        int iobase;
+       int boguscount = 0;
 
-       if ( !idev)
+       if (!idev)
                return;
 
        DEBUG( 4, __FUNCTION__ "()\n");
 
        iobase = idev->io.iobase2;
 
-       if ( idev->rx_buff.len == 0)
+       if (idev->rx_buff.len == 0)
                idev->rx_buff.head = idev->rx_buff.data;
        
        /*  
@@ -366,11 +330,71 @@ static void irport_receive( struct irda_device *idev)
          * async_unwrap_char will deliver all found frames  
         */
        do {
-               async_unwrap_char( idev, inb( iobase+UART_RX));
+               async_unwrap_char(idev, inb( iobase+UART_RX));
+
+               /* Make sure we don't stay here to long */
+               if (boguscount++ > 32) {
+                       DEBUG(0,__FUNCTION__ "(), breaking!\n");
+                       break;
+               }
+
+       } while (inb(iobase+UART_LSR) & UART_LSR_DR);   
+}
+
+/*
+ * Function irport_interrupt (irq, dev_id, regs)
+ *
+ *    
+ */
+void irport_interrupt(int irq, void *dev_id, struct pt_regs *regs) 
+{
+       struct irda_device *idev = (struct irda_device *) dev_id;
+
+       int iobase;
+       int iir, lsr;
+       int boguscount = 0;
+
+       DEBUG(5, __FUNCTION__ "(), irq %d\n", irq);
+       
+       if (!idev) {
+               printk(KERN_WARNING __FUNCTION__ 
+                      "() irq %d for unknown device.\n", irq);
+               return;
+       }
+
+       idev->netdev.interrupt = 1;
+
+       iobase = idev->io.iobase2;
+
+       iir = inb(iobase + UART_IIR) & UART_IIR_ID;
+       while (iir) {
+               DEBUG(4,__FUNCTION__ "(), iir=%#x\n", iir);
+
+               /* Clear interrupt */
+               lsr = inb(iobase+UART_LSR);
+
+               if ((iir & UART_IIR_THRI) && (lsr & UART_LSR_THRE)) {
+                       /* Transmitter ready for data */
+                       irport_write_wakeup(idev);
+               }
+#ifdef CONFIG_HALF_DUPLEX
+               else 
+#endif
+               if ((iir & UART_IIR_RDI) && (lsr & UART_LSR_DR)) {
+                       /* Receive interrupt */
+                       irport_receive(idev);
+               }
                
-       } while ( inb( iobase+UART_LSR) & UART_LSR_DR); 
+               /* Make sure we don't stay here to long */
+               if (boguscount++ > 32)
+                       break;
+
+               iir = inb(iobase + UART_IIR) & UART_IIR_ID;
+       }
+       idev->netdev.interrupt = 0;
 }
 
+
 #ifdef MODULE
 
 /*
index f4c39035ffb76a089b448e846afd2482f42427eb..8ea10d9a8f21b79085cbc9cdf351b5577b21f65d 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Dec  9 21:18:38 1997
- * Modified at:   Tue Feb  9 13:08:25 1999
+ * Modified at:   Tue Apr  6 21:35:25 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
  *                          Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
@@ -33,7 +33,6 @@
 #include <linux/init.h>
 
 #include <net/irda/irda.h>
-#include <net/irda/irmod.h>
 #include <net/irda/irtty.h>
 #include <net/irda/wrapper.h>
 #include <net/irda/irlap.h>
@@ -191,7 +190,6 @@ static int irtty_open( struct tty_struct *tty)
        /*
         *  Initialize driver
         */
-       /* self->idev.flags |= SIR_MODE | IO_PIO; */
        self->idev.rx_buff.state = OUTSIDE_FRAME;
 
        /* 
@@ -207,7 +205,7 @@ static int irtty_open( struct tty_struct *tty)
                IR_115200;
        self->idev.qos.min_turn_time.bits = 0x03;
        self->idev.flags = IFF_SIR | IFF_PIO;
-       irda_qos_bits_to_value( &self->idev.qos);
+       irda_qos_bits_to_value(&self->idev.qos);
 
        /* Specify which buffer allocation policy we need */
        self->idev.rx_buff.flags = GFP_KERNEL;
@@ -230,7 +228,7 @@ static int irtty_open( struct tty_struct *tty)
        self->idev.netdev.stop            = irtty_net_close;
 
        /* Open the IrDA device */
-       irda_device_open( &self->idev, name, self);
+       irda_device_open(&self->idev, name, self);
 
        MOD_INC_USE_COUNT;
 
@@ -244,20 +242,20 @@ static int irtty_open( struct tty_struct *tty)
  *    and then restoring the TTY line discipline to what it was before it got
  *    hooked to IrDA (which usually is TTY again).  
  */
-static void irtty_close( struct tty_struct *tty) 
+static void irtty_close(struct tty_struct *tty) 
 {
        struct irtty_cb *self = (struct irtty_cb *) tty->disc_data;
        
        /* First make sure we're connected. */
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRTTY_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IRTTY_MAGIC, return;);
 
        /* We are not using any dongle anymore! */
-       if ( self->dongle_q)
-               self->dongle_q->dongle->close( &self->idev);
+       if (self->dongle_q)
+               self->dongle_q->dongle->close(&self->idev);
 
        /* Remove driver */
-       irda_device_close( &self->idev);
+       irda_device_close(&self->idev);
 
        /* Stop tty */
        tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
@@ -266,11 +264,10 @@ static void irtty_close( struct tty_struct *tty)
        self->tty = NULL;
        self->magic = 0;
        
-       /* hashbin_remove( irtty, 0, self->name); */
-       self = hashbin_remove( irtty, (int) self, NULL);
+       self = hashbin_remove(irtty, (int) self, NULL);
        
-       if ( self != NULL)
-               kfree( self);
+       if (self != NULL)
+               kfree(self);
 
        MOD_DEC_USE_COUNT;
 }
@@ -579,7 +576,7 @@ static void irtty_write_wakeup( struct tty_struct *tty)
                 *  Now serial buffer is almost free & we can start 
                 *  transmission of another packet 
                 */
-               DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
+               DEBUG(5, __FUNCTION__ "(), finished with frame!\n");
 
                tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
 
@@ -649,8 +646,8 @@ int irtty_register_dongle( struct dongle *dongle)
        memset( new, 0, sizeof( struct dongle_q));
         new->dongle = dongle;
 
-       /* Insert IrDA compressor into hashbin */
-       hashbin_insert( dongles, (QUEUE *) new, dongle->type, NULL);
+       /* Insert IrDA dongle into hashbin */
+       hashbin_insert(dongles, (QUEUE *) new, dongle->type, NULL);
        
         return 0;
 }
@@ -668,11 +665,20 @@ void irtty_unregister_dongle( struct dongle *dongle)
 }
 
 
+/*
+ * Function irtty_set_dtr_rts (tty, dtr, rts)
+ *
+ *    This function can be used by dongles etc. to set or reset the status
+ *    of the dtr and rts lines
+ */
 void irtty_set_dtr_rts(struct tty_struct *tty, int dtr, int rts)
 {
        mm_segment_t fs;
-       int arg = TIOCM_OUT2;
+       int arg = 0;
 
+#ifdef TIOCM_OUT2 /* Not defined for ARM */
+       arg = TIOCM_OUT2;
+#endif
        if (rts)
                arg |= TIOCM_RTS;
        if (dtr)
@@ -747,8 +753,7 @@ MODULE_DESCRIPTION("IrDA TTY device driver");
  */
 int init_module(void)
 {
-       irtty_init();
-       return(0);
+       return irtty_init();
 }
 
 /*
index ea35883a55630f905803ea0f813b78986fd84ce4..385a1eb5f2a219c45d4c4e5b81b24f2c68b2e97b 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Nov  7 21:43:15 1998
- * Modified at:   Tue Feb  9 13:29:40 1999
+ * Modified at:   Sat Apr  3 15:54:47 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>
@@ -132,7 +132,7 @@ __initfunc(int pc87108_init(void))
 
        for ( i=0; (io[i] < 2000) && (i < 4); i++) {
                int ioaddr = io[i];
-               if (check_region(ioaddr, CHIP_IO_EXTENT))
+               if (check_region(ioaddr, CHIP_IO_EXTENT) < 0)
                        continue;
                if (pc87108_open( i, io[i], io2[i], irq[i], dma[i]) == 0)
                        return 0;
@@ -151,11 +151,11 @@ static void pc87108_cleanup(void)
 {
        int i;
 
-        DEBUG( 4, __FUNCTION__ "()\n");
+        DEBUG(4, __FUNCTION__ "()\n");
 
-       for ( i=0; i < 4; i++) {
-               if ( dev_self[i])
-                       pc87108_close( &(dev_self[i]->idev));
+       for (i=0; i < 4; i++) {
+               if (dev_self[i])
+                       pc87108_close(&(dev_self[i]->idev));
        }
 }
 #endif /* MODULE */
@@ -233,7 +233,6 @@ static int pc87108_open( int i, unsigned int iobase, unsigned int board_addr,
        idev->tx_buff.truesize = 4000;
        
        /* Initialize callbacks */
-       idev->hard_xmit       = pc87108_hard_xmit;
        idev->change_speed    = pc87108_change_speed;
        idev->wait_until_sent = pc87108_wait_until_sent;
        idev->is_receiving    = pc87108_is_receiving;
@@ -671,7 +670,7 @@ static void pc87108_change_speed( struct irda_device *idev, int speed)
 
        /* Set appropriate speed mode */
        switch_bank(iobase, BANK0);
-       outb( mcr|MCR_TX_DFR, iobase+MCR);
+       outb(mcr | MCR_TX_DFR, iobase+MCR);
 
        /* Give some hits to the transceiver */
        pc87108_change_dongle_speed( iobase, speed, idev->io.dongle_id);
@@ -805,8 +804,8 @@ static void pc87108_dma_write( struct irda_device *idev, int iobase)
        switch_bank(iobase, BANK0);
        outb( inb( iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
 
-       setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
-                  DMA_MODE_WRITE);
+       setup_dma(idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
+                 DMA_MODE_WRITE);
        
        /* idev->media_busy = TRUE; */
        idev->io.direction = IO_XMIT;
@@ -920,29 +919,29 @@ static void pc87108_dma_xmit_complete( struct irda_device *idev)
  *    if it starts to receive a frame.
  *
  */
-static int pc87108_dma_receive( struct irda_device *idev) 
+static int pc87108_dma_receive(struct irda_device *idev) 
 {
        struct pc87108 *self;
        int iobase;
        __u8 bsr;
 
-       ASSERT( idev != NULL, return -1;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+       ASSERT(idev != NULL, return -1;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
-       DEBUG( 4, __FUNCTION__ "\n");
+       DEBUG(4, __FUNCTION__ "\n");
 
        self = idev->priv;
-       iobase= idev->io.iobase;
+       iobase = idev->io.iobase;
 
        /* Save current bank */
-       bsr = inb( iobase+BSR);
+       bsr = inb(iobase+BSR);
 
        /* Disable DMA */
-       switch_bank( iobase, BANK0);
-       outb( inb(iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
+       switch_bank(iobase, BANK0);
+       outb(inb(iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
 
-       setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize
-                  DMA_MODE_READ);
+       setup_dma(idev->io.dma, idev->rx_buff.data
+                 idev->rx_buff.truesize, DMA_MODE_READ);
        
        /* driver->media_busy = FALSE; */
        idev->io.direction = IO_RECV;
@@ -950,22 +949,22 @@ static int pc87108_dma_receive( struct irda_device *idev)
        idev->rx_buff.offset = 0;
 
        /* Reset Rx FIFO. This will also flush the ST_FIFO */
-       outb( FCR_RXTH|FCR_TXTH|FCR_RXSR|FCR_FIFO_EN, iobase+FCR);
+       outb(FCR_RXTH|FCR_TXTH|FCR_RXSR|FCR_FIFO_EN, iobase+FCR);
        self->st_fifo.len = self->st_fifo.tail = self->st_fifo.head = 0;
 
        /* Choose DMA Rx, DMA Fairness, and Advanced mode */
        switch_bank(iobase, BANK2);
-       outb(( inb( iobase+ECR1) & ~ECR1_DMASWP)|ECR1_DMANF|ECR1_EXT_SL, 
-             iobase+ECR1);
+       outb((inb( iobase+ECR1) & ~ECR1_DMASWP)|ECR1_DMANF|ECR1_EXT_SL, 
+            iobase+ECR1);
        
        /* enable DMA */
        switch_bank(iobase, BANK0);
-       outb( inb( iobase+MCR)|MCR_DMA_EN, iobase+MCR);
+       outb(inb(iobase+MCR)|MCR_DMA_EN, iobase+MCR);
 
        /* Restore bank register */
-       outb( bsr, iobase+BSR);
+       outb(bsr, iobase+BSR);
        
-       DEBUG( 4, __FUNCTION__ "(), done!\n");  
+       DEBUG(4, __FUNCTION__ "(), done!\n");   
        
        return 0;
 }
@@ -1481,9 +1480,7 @@ static int pc87108_net_close(struct device *dev)
  */
 int init_module(void)
 {
-       pc87108_init();
-
-       return(0);
+       return pc87108_init();
 }
 
 /*
@@ -1496,6 +1493,5 @@ void cleanup_module(void)
 {
        pc87108_cleanup();
 }
-
-#endif
+#endif /* MODULE */
 
index 40a1e46bf2b8e17723c11af1fea0040c6281497a..eb8e2a0c41ceb327e947d4bc22340f75eef3cab4 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Wed Oct 21 20:02:35 1998
- * Modified at:   Tue Feb  9 15:36:55 1999
+ * Modified at:   Mon Feb 15 14:13:17 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
index e182049eabc825df0d702dae40ec590e284ab88a..c4915c7556b7d9af04b22ba3d80a34fc59ec89e2 100644 (file)
@@ -1,13 +1,13 @@
 /*********************************************************************
  *                
  * Filename:      uircc.c
- * Version:       0.1
+ * Version:       0.3
  * Description:   Driver for the Sharp Universal Infrared 
- *                Communications Controller (UIRCC)
+ *                Communications Controller (UIRCC v 1.3)
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Dec 26 10:59:03 1998
- * Modified at:   Tue Feb  9 13:30:41 1999
+ * Modified at:   Sat Apr  3 15:54:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
  *     740CDT, Portege 300CT, 660CDT, Satellite 220C Series, 
  *     Satellite Pro, 440C Series, 470CDT, 460C Series, 480C Series
  *
- *     Notice that FIR mode is not working yet, since I don't know 
- *     how to make the UIRCC drive the interrupt line, and not the
- *     UART (which is used for SIR speeds). Please mail me if you know!
- *
  ********************************************************************/
 
 #include <linux/module.h>
@@ -69,22 +65,24 @@ static unsigned int dma[] = { 5, 0, 0, 0 };
 static struct uircc_cb *dev_self[] = { NULL, NULL, NULL, NULL};
 
 /* Some prototypes */
-static int  uircc_open( int i, unsigned int iobase, unsigned int board_addr, 
-                       unsigned int irq, unsigned int dma);
-static int  uircc_close( struct irda_device *idev);
-static int  uircc_probe( int iobase, int board_addr, int irq, int dma);
-static int  uircc_dma_receive( struct irda_device *idev); 
+static int  uircc_open(int i, unsigned int iobase, unsigned int board_addr, 
+                      unsigned int irq, unsigned int dma);
+#ifdef MODULE
+static int  uircc_close(struct irda_device *idev);
+#endif /* MODULE */
+static int  uircc_probe(int iobase, int board_addr, int irq, int dma);
+static int  uircc_dma_receive(struct irda_device *idev); 
 static int  uircc_dma_receive_complete(struct irda_device *idev, int iobase);
-static int  uircc_hard_xmit( struct sk_buff *skb, struct device *dev);
-static void uircc_dma_write( struct irda_device *idev, int iobase);
-static void uircc_change_speed( struct irda_device *idev, int baud);
+static int  uircc_hard_xmit(struct sk_buff *skb, struct device *dev);
+static void uircc_dma_write(struct irda_device *idev, int iobase);
+static void uircc_change_speed(struct irda_device *idev, int baud);
 static void uircc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-static void uircc_wait_until_sent( struct irda_device *idev);
-static int  uircc_is_receiving( struct irda_device *idev);
-
-static int  uircc_net_init( struct device *dev);
-static int  uircc_net_open( struct device *dev);
-static int  uircc_net_close( struct device *dev);
+static void uircc_wait_until_sent(struct irda_device *idev);
+static int  uircc_is_receiving(struct irda_device *idev);
+static int uircc_toshiba_cmd(int *retval, int arg0, int arg1, int arg2);
+static int  uircc_net_init(struct device *dev);
+static int  uircc_net_open(struct device *dev);
+static int  uircc_net_close(struct device *dev);
 
 /*
  * Function uircc_init ()
@@ -98,9 +96,9 @@ __initfunc(int uircc_init(void))
 
        for ( i=0; (io[i] < 2000) && (i < 4); i++) {
                int ioaddr = io[i];
-               if (check_region(ioaddr, CHIP_IO_EXTENT))
+               if (check_region(ioaddr, CHIP_IO_EXTENT) < 0)
                        continue;
-               if (uircc_open( i, io[i], io2[i], irq[i], dma[i]) == 0)
+               if (uircc_open(i, io[i], io2[i], irq[i], dma[i]) == 0)
                        return 0;
        }
        return -ENODEV;
@@ -117,11 +115,11 @@ static void uircc_cleanup(void)
 {
        int i;
 
-        DEBUG( 4, __FUNCTION__ "()\n");
+        DEBUG(4, __FUNCTION__ "()\n");
 
-       for ( i=0; i < 4; i++) {
-               if ( dev_self[i])
-                       uircc_close( &(dev_self[i]->idev));
+       for (i=0; i < 4; i++) {
+               if (dev_self[i])
+                       uircc_close(&(dev_self[i]->idev));
        }
 }
 #endif /* MODULE */
@@ -132,28 +130,28 @@ static void uircc_cleanup(void)
  *    Open driver instance
  *
  */
-static int uircc_open( int i, unsigned int iobase, unsigned int iobase2, 
-                       unsigned int irq, unsigned int dma)
+static int uircc_open(int i, unsigned int iobase, unsigned int iobase2, 
+                     unsigned int irq, unsigned int dma)
 {
        struct uircc_cb *self;
        struct irda_device *idev;
        int ret;
 
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       if (( uircc_probe( iobase, iobase2, irq, dma)) == -1)
+       if ((uircc_probe(iobase, iobase2, irq, dma)) == -1)
                return -1;
        
        /*
         *  Allocate new instance of the driver
         */
        self = kmalloc( sizeof(struct uircc_cb), GFP_KERNEL);
-       if ( self == NULL) {
-               printk( KERN_ERR "IrDA: Can't allocate memory for "
-                       "IrDA control block!\n");
+       if (self == NULL) {
+               printk(KERN_ERR "IrDA: Can't allocate memory for "
+                      "IrDA control block!\n");
                return -ENOMEM;
        }
-       memset( self, 0, sizeof(struct uircc_cb));
+       memset(self, 0, sizeof(struct uircc_cb));
    
        /* Need to store self somewhere */
        dev_self[i] = self;
@@ -170,32 +168,32 @@ static int uircc_open( int i, unsigned int iobase, unsigned int iobase2,
         idev->io.fifo_size = 16;
 
        /* Lock the port that we need */
-       ret = check_region( idev->io.iobase, idev->io.io_ext);
-       if ( ret < 0) { 
-               DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
-                      idev->io.iobase);
+       ret = check_region(idev->io.iobase, idev->io.io_ext);
+       if (ret < 0) { 
+               DEBUG(0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+                     idev->io.iobase);
                /* uircc_cleanup( self->idev);  */
                return -ENODEV;
        }
-       ret = check_region( idev->io.iobase2, idev->io.io_ext2);
-       if ( ret < 0) { 
-               DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
-                      idev->io.iobase2);
+       ret = check_region(idev->io.iobase2, idev->io.io_ext2);
+       if (ret < 0) { 
+               DEBUG(0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+                     idev->io.iobase2);
                /* uircc_cleanup( self->idev);  */
                return -ENODEV;
        }
-       request_region( idev->io.iobase, idev->io.io_ext, idev->name);
-        request_region( idev->io.iobase2, idev->io.io_ext2, idev->name);
+       request_region(idev->io.iobase, idev->io.io_ext, idev->name);
+        request_region(idev->io.iobase2, idev->io.io_ext2, idev->name);
 
        /* Initialize QoS for this device */
-       irda_init_max_qos_capabilies( &idev->qos);
+       irda_init_max_qos_capabilies(&idev->qos);
        
        /* The only value we must override it the baudrate */
        idev->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
-               IR_115200|IR_576000|IR_1152000|(IR_4000000 << 8);
+               IR_115200|/*IR_576000|IR_1152000| */(IR_4000000 << 8);
 
-       idev->qos.min_turn_time.bits = 0x07;
-       irda_qos_bits_to_value( &idev->qos);
+       idev->qos.min_turn_time.bits = 0x0f;
+       irda_qos_bits_to_value(&idev->qos);
 
        idev->flags = IFF_FIR|IFF_SIR|IFF_DMA|IFF_PIO;
        
@@ -208,7 +206,6 @@ static int uircc_open( int i, unsigned int iobase, unsigned int iobase2,
        idev->tx_buff.truesize = 4000;
        
        /* Initialize callbacks */
-       idev->hard_xmit       = uircc_hard_xmit;
        idev->change_speed    = uircc_change_speed;
        idev->wait_until_sent = uircc_wait_until_sent;
        idev->is_receiving    = uircc_is_receiving;
@@ -219,10 +216,10 @@ static int uircc_open( int i, unsigned int iobase, unsigned int iobase2,
        idev->netdev.open            = uircc_net_open;
        idev->netdev.stop            = uircc_net_close;
 
-       irport_open( iobase2);
+       irport_open(iobase2);
 
        /* Open the IrDA device */
-       irda_device_open( idev, driver_name, self);
+       irda_device_open(idev, driver_name, self);
        
        return 0;
 }
@@ -233,36 +230,41 @@ static int uircc_open( int i, unsigned int iobase, unsigned int iobase2,
  *    Close driver instance
  *
  */
-static int uircc_close( struct irda_device *idev)
+#ifdef MODULE
+static int uircc_close(struct irda_device *idev)
 {
        int iobase;
+       int status;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( idev != NULL, return -1;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+       ASSERT(idev != NULL, return -1;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
         iobase = idev->io.iobase;
 
+       /* Some magic to disable FIR and enable SIR */
+       uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0000);
+
        /* Disable modem */
-       outb( 0x00, iobase+UIRCC_CR10);
+       outb(0x00, iobase+UIRCC_CR10);
 
-       irport_close( idev->io.iobase2);
+       irport_close(idev->io.iobase2);
 
        /* Release the PORT that this driver is using */
-       DEBUG( 4, __FUNCTION__ "(), Releasing Region %03x\n", idev->io.iobase);
-       release_region( idev->io.iobase, idev->io.io_ext);
+       DEBUG(4, __FUNCTION__ "(), Releasing Region %03x\n", idev->io.iobase);
+       release_region(idev->io.iobase, idev->io.io_ext);
 
-       if ( idev->io.iobase2) {
-               DEBUG( 4, __FUNCTION__ "(), Releasing Region %03x\n", 
-                      idev->io.iobase2);
-               release_region( idev->io.iobase2, idev->io.io_ext2);
+       if (idev->io.iobase2) {
+               DEBUG(4, __FUNCTION__ "(), Releasing Region %03x\n", 
+                     idev->io.iobase2);
+               release_region(idev->io.iobase2, idev->io.io_ext2);
        }
-
-       irda_device_close( idev);
+       irda_device_close(idev);
 
        return 0;
 }
+#endif /* MODULE */
 
 /*
  * Function uircc_probe (iobase, board_addr, irq, dma)
@@ -270,83 +272,38 @@ static int uircc_close( struct irda_device *idev)
  *    Returns non-negative on success.
  *
  */
-static int uircc_probe( int iobase, int iobase2, int irq, int dma) 
+static int uircc_probe(int iobase, int iobase2, int irq, int dma) 
 {
        int version;
-#if 0
-       int probe_irq=0;
-       unsigned long mask;
-       int i;
-#endif
        
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
        /* read the chip version, should be 0x03 */
-       version = inb( iobase+UIRCC_SR8);
+       version = inb(iobase+UIRCC_SR8);
 
-       if ( version != 0x03) {
-               DEBUG( 0, __FUNCTION__ "(), Wrong chip version");       
+       if (version != 0x03) {
+               DEBUG(0, __FUNCTION__ "(), Wrong chip version");        
                return -1;
        }
-        DEBUG( 0, "UIRCC driver loaded. Version: 0x%02x\n", version);
+        printk(KERN_INFO "Sharp UIRCC IrDA driver loaded. Version: 0x%02x\n",
+              version);
 
        /* Reset chip */
-       outb( UIRCC_CR0_SYS_RST, iobase+UIRCC_CR0);
+       outb(UIRCC_CR0_SYS_RST, iobase+UIRCC_CR0);
 
        /* Initialize some registers */
-       outb( 0, iobase+UIRCC_CR11);
-       outb( 0, iobase+UIRCC_CR9);
-
-       /* Enable DMA single mode */
-       outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
-             iobase+UIRCC_CR1);
-
-       /* Disable interrupts */
-       outb( 0xff, iobase+UIRCC_CR2); 
+       outb(0x03, iobase+UIRCC_CR15);
+       outb(0, iobase+UIRCC_CR11);
+       outb(0, iobase+UIRCC_CR9);
 
-#if 0
-       irport_close( iobase2);
-
-       for (i=0;i<1;i++) {
-
-       /* Set appropriate speed mode */
-       outb( UIRCC_CR10_FIR, iobase+UIRCC_CR10);
+       DEBUG(0, __FUNCTION__ "(), sr15=%#x\n", inb(iobase+UIRCC_SR15));
 
        /* Enable DMA single mode */
-       outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
-             iobase+UIRCC_CR1);
-
-       /* Set up timer */
-       outb( 0x01, iobase+UIRCC_CR12);
-       outb( 0x00, iobase+UIRCC_CR13);
+       outb(UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
+            iobase+UIRCC_CR1);
 
-       /* Set interrupt mask */
-       outb( 0x82, iobase+UIRCC_CR2);
-
-       DEBUG( 0, __FUNCTION__ "(*), sr3=%#x, sr2=%#x, sr10=%#x, sr12=%#x\n", 
-              inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
-              inb( iobase+UIRCC_SR10), inb( iobase+UIRCC_SR12));
-
-       mask = probe_irq_on();
-
-       /* Enable timer */
-       outb( 0x08, iobase+UIRCC_CR11);
-
-       udelay( 10000); /* Wait for interrupt! */
-
-       probe_irq = probe_irq_off( mask);
-
-       DEBUG( 0, "Found irq=%d\n", probe_irq);
-
-       DEBUG( 0, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x, sr12=%#x\n", 
-              inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
-              inb( iobase+UIRCC_SR10), inb( iobase+UIRCC_SR12));
-       
-
-       /* Diable timer */
-       outb( 0x00, iobase+UIRCC_CR11);
-       }
-#endif
+       /* Disable interrupts */
+       outb(0xff, iobase+UIRCC_CR2); 
 
        /* Set self poll address */
 
@@ -359,16 +316,20 @@ static int uircc_probe( int iobase, int iobase2, int irq, int dma)
  *    Change the speed of the device
  *
  */
-static void uircc_change_speed( struct irda_device *idev, int speed)
+static void uircc_change_speed(struct irda_device *idev, int speed)
 {
        struct uircc_cb *self;
        int iobase; 
        int modem = UIRCC_CR10_SIR;
+       int status;
 
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(0, __FUNCTION__ "()\n");
 
-       ASSERT( idev != NULL, return;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+       /* Just test the high speed stuff */
+       /*speed = 4000000;*/
+
+       ASSERT(idev != NULL, return;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
        self = idev->priv;
        iobase = idev->io.iobase;
@@ -377,16 +338,20 @@ static void uircc_change_speed( struct irda_device *idev, int speed)
        idev->io.baudrate = speed;
 
        /* Disable interrupts */        
-       outb( 0xff, iobase+UIRCC_CR2);
+       outb(0xff, iobase+UIRCC_CR2);
 
-       switch ( speed) {
+       switch (speed) {
        case 9600:
        case 19200:
        case 37600:
        case 57600:
        case 115200:
-/*             irport_open( idev->io.iobase2); */
+               irport_open(idev->io.iobase2);
                irport_change_speed( idev->io.iobase2, speed);
+
+               /* Some magic to disable FIR and enable SIR */
+               uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0000);
+
                modem = UIRCC_CR10_SIR;
                break;
        case 576000:            
@@ -398,9 +363,18 @@ static void uircc_change_speed( struct irda_device *idev, int speed)
                DEBUG(0, __FUNCTION__ "(), handling baud of 1152000\n");
                break;
        case 4000000:
-               irport_close( idev->io.iobase2);
+               irport_close(idev->io.iobase2);
+
+               /* Some magic to disable SIR and enable FIR */
+               uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0001);
+
                modem = UIRCC_CR10_FIR;
                DEBUG(0, __FUNCTION__ "(), handling baud of 4000000\n");
+
+               /* Set self pole address */
+               outb(0x10, iobase+UIRCC_CR8);
+
+               /* outb(0x10, iobase+UIRCC_CR11); */
                break;
        default:
                DEBUG( 0, __FUNCTION__ "(), unknown baud rate of %d\n", speed);
@@ -408,19 +382,19 @@ static void uircc_change_speed( struct irda_device *idev, int speed)
        }
 
        /* Set appropriate speed mode */
-       outb( modem, iobase+UIRCC_CR10);
+       outb(modem, iobase+UIRCC_CR10);
 
        idev->netdev.tbusy = 0;
        
        /* Enable some interrupts so we can receive frames */
-       if ( speed > 115200) {
+       if (speed > 115200) {
                /* Enable DMA single mode */
-               outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
-                     iobase+UIRCC_CR1);
+               outb(UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, 
+                    iobase+UIRCC_CR1);
 
-               /* outb( UIRCC_CR2_RECV_MASK, iobase+UIRCC_CR2);  */
-               outb( 0, iobase+UIRCC_CR2); 
-               uircc_dma_receive( idev);
+               /* Enable all interrupts  */
+               outb(0, iobase+UIRCC_CR2); 
+               uircc_dma_receive(idev);
        }       
 }
 
@@ -430,7 +404,7 @@ static void uircc_change_speed( struct irda_device *idev, int speed)
  *    Transmit the frame!
  *
  */
-static int uircc_hard_xmit( struct sk_buff *skb, struct device *dev)
+static int uircc_hard_xmit(struct sk_buff *skb, struct device *dev)
 {
        struct irda_device *idev;
        int iobase;
@@ -438,86 +412,97 @@ static int uircc_hard_xmit( struct sk_buff *skb, struct device *dev)
        
        idev = (struct irda_device *) dev->priv;
 
-       ASSERT( idev != NULL, return 0;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+       ASSERT(idev != NULL, return 0;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
 
        iobase = idev->io.iobase;
 
-       DEBUG(0, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
+       DEBUG(4, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
+       
+       /* Reset carrier latch */
+       /*outb(0x02, iobase+UIRCC_CR0);*/
 
        /* Use irport for SIR speeds */
        if (idev->io.baudrate <= 115200) {
                return irport_hard_xmit(skb, dev);
        }
        
+       DEBUG(0, __FUNCTION__ "(), sr0=%#x, sr1=%#x, sr2=%#x, sr3=%#x, sr10=%#x, sr11=%#x\n",
+             inb(iobase+UIRCC_SR0), inb(iobase+UIRCC_SR3),
+             inb(iobase+UIRCC_SR2), inb(iobase+UIRCC_SR3), 
+             inb(iobase+UIRCC_SR10), inb(iobase+UIRCC_SR11));
+
        /* Lock transmit buffer */
        if (irda_lock((void *) &dev->tbusy) == FALSE)
                return -EBUSY;
 
-       memcpy( idev->tx_buff.data, skb->data, skb->len);
+       memcpy(idev->tx_buff.data, skb->data, skb->len);
 
        /* Make sure that the length is a multiple of 16 bits */
-       if ( skb->len & 0x01)
+       if (skb->len & 0x01)
                skb->len++;
 
        idev->tx_buff.len = skb->len;
        idev->tx_buff.head = idev->tx_buff.data;
        idev->tx_buff.offset = 0;
        
-       mtt = irda_get_mtt( skb);
+       mtt = irda_get_mtt(skb);
        
        /* Use udelay for delays less than 50 us. */
        if (mtt)
-               udelay( mtt);
+               udelay(mtt);
        
        /* Enable transmit interrupts */
-       /* outb( UIRCC_CR2_XMIT_MASK, iobase+UIRCC_CR2); */
-       outb( 0, iobase+UIRCC_CR2); 
+       outb(0, iobase+UIRCC_CR2);
 
-       uircc_dma_write( idev, iobase);
+       uircc_dma_write(idev, iobase);
        
-       dev_kfree_skb( skb);
+       dev_kfree_skb(skb);
 
        return 0;
 }
 
 /*
- * Function uircc_dma_xmit (idev, iobase)
+ * Function uircc_dma_write (idev, iobase)
  *
  *    Transmit data using DMA
  *
  */
-static void uircc_dma_write( struct irda_device *idev, int iobase)
+static void uircc_dma_write(struct irda_device *idev, int iobase)
 {
        struct uircc_cb *self;
-       int i;
 
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( idev != NULL, return;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+       ASSERT(idev != NULL, return;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
        self = idev->priv;
 
        /* Receiving disable */
        self->cr3 &= ~UIRCC_CR3_RECV_EN;
-       outb( self->cr3, iobase+UIRCC_CR3);
+       outb(self->cr3, iobase+UIRCC_CR3);
 
-       setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
-                  DMA_MODE_WRITE);
-       
-       DEBUG( 0, __FUNCTION__ "residue=%d\n", 
-              get_dma_residue( idev->io.dma));
+       /* Set modem */
+       outb(0x80, iobase+UIRCC_CR10);
 
+       /* Enable transmit DMA */
+       outb(UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET, iobase+UIRCC_CR1);
+
+       ASSERT((((__u32)(idev->tx_buff.data)) & 0x01) != 0x01, return;);
+
+       setup_dma(idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
+                 DMA_MODE_WRITE);
+       
        idev->io.direction = IO_XMIT;
 
-       /* Set frame length */
-       outb( idev->tx_buff.len & 0xff, iobase+UIRCC_CR4); /* Low byte */
-       outb( idev->tx_buff.len >> 8, iobase+UIRCC_CR5);   /* High byte */
+       /* Set frame length (should be the real length without padding */
+       outb(idev->tx_buff.len & 0xff, iobase+UIRCC_CR4); /* Low byte */
+       outb(idev->tx_buff.len >> 8, iobase+UIRCC_CR5);   /* High byte */
 
        /* Enable transmit and transmit CRC */
        self->cr3 |= (UIRCC_CR3_XMIT_EN|UIRCC_CR3_TX_CRC_EN);
-       outb( self->cr3, iobase+UIRCC_CR3);
+       outb(self->cr3, iobase+UIRCC_CR3);
 }
 
 /*
@@ -533,33 +518,38 @@ static void uircc_dma_xmit_complete( struct irda_device *idev, int underrun)
        int iobase;
        int len;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( idev != NULL, return;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+       ASSERT(idev != NULL, return;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
        self = idev->priv;
 
        iobase = idev->io.iobase;
 
        /* Select TX counter */
-       outb( UIRCC_CR0_CNT_SWT, iobase+UIRCC_CR0);
+       outb(UIRCC_CR0_CNT_SWT, iobase+UIRCC_CR0);
 
        /* Read TX length counter */
-       len  = inb( iobase+UIRCC_SR4);      /* Low byte */
-       len |= inb( iobase+UIRCC_SR5) << 8; /* High byte */
+       len  = inb(iobase+UIRCC_SR4);      /* Low byte */
+       len |= inb(iobase+UIRCC_SR5) << 8; /* High byte */
+
+       DEBUG(4, __FUNCTION__ "(), sent %d bytes\n", len);
 
        /* Disable transmit */
        self->cr3 &= ~UIRCC_CR3_XMIT_EN;
-       outb( self->cr3, iobase+UIRCC_CR3);
+       outb(self->cr3, iobase+UIRCC_CR3);
+
+       /* Transmit reset (just to be sure) */
+       outb(UIRCC_CR0_XMIT_RST, iobase+UIRCC_CR0);
        
        /* Check for underrrun! */
-       if ( underrun) {
+       if (underrun) {
                idev->stats.tx_errors++;
                idev->stats.tx_fifo_errors++;           
        } else {
                idev->stats.tx_packets++;
-               idev->stats.tx_bytes +=  idev->tx_buff.len;
+               idev->stats.tx_bytes += idev->tx_buff.len;
        }
 
        /* Unlock tx_buff and request another frame */
@@ -567,7 +557,7 @@ static void uircc_dma_xmit_complete( struct irda_device *idev, int underrun)
        idev->media_busy = FALSE;
        
        /* Tell the network layer, that we can accept more frames */
-       mark_bh( NET_BH);
+       mark_bh(NET_BH);
 }
 
 /*
@@ -577,23 +567,38 @@ static void uircc_dma_xmit_complete( struct irda_device *idev, int underrun)
  *    if it starts to receive a frame.
  *
  */
-static int uircc_dma_receive( struct irda_device *idev) 
+static int uircc_dma_receive(struct irda_device *idev) 
 {
        struct uircc_cb *self;
        int iobase;
 
-       ASSERT( idev != NULL, return -1;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+       ASSERT(idev != NULL, return -1;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
-       DEBUG( 0, __FUNCTION__ "\n");
+       DEBUG(4, __FUNCTION__ "\n");
 
        self = idev->priv;
        iobase= idev->io.iobase;
 
-       /* Disable DMA */
-       
-       setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize, 
-                  DMA_MODE_READ);
+       /* Transmit disable */
+       /* self->cr3 &= ~UIRCC_CR3_XMIT_EN; */
+       self->cr3 = 0;
+       outb(self->cr3, iobase+UIRCC_CR3);
+
+       /* Transmit reset (just in case) */
+       outb(UIRCC_CR0_XMIT_RST, iobase+UIRCC_CR0);
+
+       /* Set modem */
+       outb(0x08, iobase+UIRCC_CR10);
+
+       /* Make sure Rx DMA is set */
+       outb(UIRCC_CR1_RX_DMA|UIRCC_CR1_MUST_SET, iobase+UIRCC_CR1);
+
+       /* Rx reset */
+       /* outb(UIRCC_CR0_RECV_RST, iobase+UIRCC_CR0); */
+
+       setup_dma(idev->io.dma, idev->rx_buff.data, 
+                 idev->rx_buff.truesize, DMA_MODE_READ);
        
        /* driver->media_busy = FALSE; */
        idev->io.direction = IO_RECV;
@@ -601,13 +606,13 @@ static int uircc_dma_receive( struct irda_device *idev)
        idev->rx_buff.offset = 0;
 
        /* Enable receiving with CRC */
-       self->cr3 |= (UIRCC_CR3_RECV_EN|UIRCC_CR3_RX_CRC_EN);
-       outb( self->cr3, iobase+UIRCC_CR3);
+       self->cr3 = (UIRCC_CR3_RECV_EN|UIRCC_CR3_RX_CRC_EN);
+       outb(self->cr3, iobase+UIRCC_CR3);
+
+       DEBUG(4, __FUNCTION__ "(), cr3=%#x\n", self->cr3);
        
        /* Address check? */
 
-       DEBUG( 4, __FUNCTION__ "(), done!\n");  
-       
        return 0;
 }
 
@@ -618,7 +623,7 @@ static int uircc_dma_receive( struct irda_device *idev)
  *
  *    
  */
-static int uircc_dma_receive_complete( struct irda_device *idev, int iobase)
+static int uircc_dma_receive_complete(struct irda_device *idev, int iobase)
 {
        struct sk_buff *skb;
        struct uircc_cb *self;
@@ -626,37 +631,37 @@ static int uircc_dma_receive_complete( struct irda_device *idev, int iobase)
 
        self = idev->priv;
 
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(0, __FUNCTION__ "()\n");
 
        /* Check for CRC or framing error */
-       if ( inb( iobase+UIRCC_SR0) & UIRCC_SR0_RX_CRCFRM) {
-               DEBUG( 0, __FUNCTION__ "(), crc or frm error\n");
+       if (inb(iobase+UIRCC_SR0) & UIRCC_SR0_RX_CRCFRM) {
+               DEBUG(0, __FUNCTION__ "(), CRC or FRAME error\n");
                return -1;
        }
 
        /* Select receive length counter */
-       outb( 0x00, iobase+UIRCC_CR0);
+       outb(0x00, iobase+UIRCC_CR0);
 
        /* Read frame length */
-       len = inb( iobase+UIRCC_SR4);       /* Low byte */
-       len |= inb( iobase+UIRCC_SR5) << 8; /* High byte */
+       len = inb(iobase+UIRCC_SR4);       /* Low byte */
+       len |= inb(iobase+UIRCC_SR5) << 8; /* High byte */
 
-       DEBUG( 0, __FUNCTION__ "(), len=%d\n", len);
+       DEBUG(0, __FUNCTION__ "(), len=%d\n", len);
 
        /* Receiving disable */
        self->cr3 &= ~UIRCC_CR3_RECV_EN;
-       outb( self->cr3, iobase+UIRCC_CR3);
+       outb(self->cr3, iobase+UIRCC_CR3);
 
-       skb = dev_alloc_skb( len+1);
+       skb = dev_alloc_skb(len+1);
        if (skb == NULL)  {
-               printk( KERN_INFO __FUNCTION__ 
-                       "(), memory squeeze, dropping frame.\n");
+               printk(KERN_INFO __FUNCTION__ 
+                      "(), memory squeeze, dropping frame.\n");
                                /* Restore bank register */
                return FALSE;
        }
                        
        /* Make sure IP header gets aligned */
-       skb_reserve( skb, 1); 
+       skb_reserve(skb, 1);
 
        /* Copy frame without CRC */
        /* if ( idev->io.baudrate < 4000000) { */
@@ -667,14 +672,14 @@ static int uircc_dma_receive_complete( struct irda_device *idev, int iobase)
 /*             memcpy( skb->data, idev->rx_buff.head, len-4); */
 /*     } */
 
-       skb_put( skb, len);
-       memcpy( skb->data, idev->rx_buff.head, len);
+       skb_put(skb, len);
+       memcpy(skb->data, idev->rx_buff.head, len);
        idev->stats.rx_packets++;
 
        skb->dev = &idev->netdev;
        skb->mac.raw  = skb->data;
        skb->protocol = htons(ETH_P_IRDA);
-       netif_rx( skb);
+       netif_rx(skb);
 
        return TRUE;
 }
@@ -706,40 +711,44 @@ static void uircc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        /* Read interrupt status */
        sr3 = inb( iobase+UIRCC_SR3); 
        if (!sr3) {
+               DEBUG(4,"**\n");
                return;
        }
-
        idev->netdev.interrupt = 1;
 
-       DEBUG( 4, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x\n", 
-              inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
-              inb( iobase+UIRCC_SR10));
+       DEBUG(4, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x\n", 
+             inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2), 
+             inb( iobase+UIRCC_SR10));
 
        /*
         *  Check what interrupt this is. The UIRCC will not report two
         *  different interrupts at the same time!
         */
-       switch( sr3) {
-       case UIRCC_SR3_RX_EOF: /* Check of end of frame */
-               uircc_dma_receive_complete( idev, iobase);
+       switch(sr3) {
+       case UIRCC_SR3_RX_EOF: /* Check for end of frame */
+               uircc_dma_receive_complete(idev, iobase);
                break;
        case UIRCC_SR3_TXUR:   /* Check for transmit underrun */
-               uircc_dma_xmit_complete( idev, TRUE);
+               uircc_dma_xmit_complete(idev, TRUE);
+               uircc_dma_receive(idev);
+               outb(0, iobase+UIRCC_CR2); 
                break;
        case UIRCC_SR3_TX_DONE:
-               uircc_dma_xmit_complete( idev, FALSE);
+               uircc_dma_xmit_complete(idev, FALSE);
+               uircc_dma_receive(idev);
+
+               /* outb(0, iobase+UIRCC_CR2);  */
                break;
        case UIRCC_SR3_TMR_OUT:
                /* Disable timer */
-               outb( inb( iobase+UIRCC_CR11) & ~UIRCC_CR11_TMR_EN, 
-                     iobase+UIRCC_CR11);
+               outb(inb(iobase+UIRCC_CR11) & ~UIRCC_CR11_TMR_EN, 
+                    iobase+UIRCC_CR11);
                break;
        default:
-               DEBUG( 0, __FUNCTION__ "(), unknown interrupt status=%#x\n",
-                      sr3);
+               DEBUG(0, __FUNCTION__ "(), unknown interrupt status=%#x\n",
+                     sr3);
                break;
-       }
-       
+       }       
        idev->netdev.interrupt = 0;
 }
 
@@ -767,13 +776,13 @@ static int uircc_is_receiving( struct irda_device *idev)
        int status = FALSE;
        /* int iobase; */
 
-       ASSERT( idev != NULL, return FALSE;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return FALSE;);
+       ASSERT(idev != NULL, return FALSE;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return FALSE;);
 
-       if ( idev->io.baudrate > 115200) {
+       if (idev->io.baudrate > 115200) {
                
        } else 
-               status = ( idev->rx_buff.state != OUTSIDE_FRAME);
+               status = (idev->rx_buff.state != OUTSIDE_FRAME);
        
        return status;
 }
@@ -789,7 +798,7 @@ static int uircc_net_init( struct device *dev)
        DEBUG( 4, __FUNCTION__ "()\n");
 
        /* Setup to be a normal IrDA network device driver */
-       irda_device_setup( dev);
+       irda_device_setup(dev);
 
        /* Insert overrides below this line! */
 
@@ -803,23 +812,23 @@ static int uircc_net_init( struct device *dev)
  *    Start the device
  *
  */
-static int uircc_net_open( struct device *dev)
+static int uircc_net_open(struct device *dev)
 {
        struct irda_device *idev;
        int iobase;
        
        DEBUG( 4, __FUNCTION__ "()\n");
        
-       ASSERT( dev != NULL, return -1;);
+       ASSERT(dev != NULL, return -1;);
        idev = (struct irda_device *) dev->priv;
        
-       ASSERT( idev != NULL, return 0;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+       ASSERT(idev != NULL, return 0;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
        
        iobase = idev->io.iobase;
 
-       if (request_irq( idev->io.irq, uircc_interrupt, 0, idev->name, 
-                        (void *) idev)) {
+       if (request_irq(idev->io.irq, uircc_interrupt, 0, idev->name, 
+                       (void *) idev)) {
                return -EAGAIN;
        }
        /*
@@ -827,7 +836,7 @@ static int uircc_net_open( struct device *dev)
         * and clean up on failure.
         */
        if (request_dma(idev->io.dma, idev->name)) {
-               free_irq( idev->io.irq, idev);
+               free_irq(idev->io.irq, idev);
                return -EAGAIN;
        }
                
@@ -854,32 +863,62 @@ static int uircc_net_close(struct device *dev)
        struct irda_device *idev;
        int iobase;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
        
        /* Stop device */
        dev->tbusy = 1;
        dev->start = 0;
 
-       ASSERT( dev != NULL, return -1;);
+       ASSERT(dev != NULL, return -1;);
        idev = (struct irda_device *) dev->priv;
        
-       ASSERT( idev != NULL, return 0;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+       ASSERT(idev != NULL, return 0;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
        
        iobase = idev->io.iobase;
 
-       disable_dma( idev->io.dma);
+       disable_dma(idev->io.dma);
 
        /* Disable interrupts */
        
-       free_irq( idev->io.irq, idev);
-       free_dma( idev->io.dma);
+       free_irq(idev->io.irq, idev);
+       free_dma(idev->io.dma);
 
        MOD_DEC_USE_COUNT;
 
        return 0;
 }
 
+/*
+ * Function uircc_toshiba_cmd (arg0, arg1, arg2)
+ *
+ *    disable FIR: uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0000);
+ *    enable  FIR: uircc_toshiba_cmd(&status, 0xffff, 0x001b, 0x0001);
+ *    IRDA status: uircc_toshiba_cmd(&status, 0xfefe, 0x001b, 0x0000);
+ */
+static int uircc_toshiba_cmd(int *retval, int arg0, int arg1, int arg2)
+{
+       char return_code = 0;
+
+       __asm__ volatile ("inb   $0xb2,%%al; "
+                         "movb  %%ah,%%al;  "
+                         : /* Output */
+                         "=al"  (return_code),
+                         "=ecx" (*retval)
+                         : /* Input */
+                         "ax" (arg0),
+                         "bx" (arg1),
+                         "cx" (arg2)
+               );
+       /*
+        * Return
+        * 0x00 = OK
+        * 0x80 = Function not supported by system
+        * 0x83 = Input data error
+        */
+       return (int) return_code;
+}
+
 #ifdef MODULE
 
 /*
@@ -890,9 +929,7 @@ static int uircc_net_close(struct device *dev)
  */
 int init_module(void)
 {
-       uircc_init();
-
-       return(0);
+       return uircc_init();
 }
 
 /*
@@ -905,6 +942,5 @@ void cleanup_module(void)
 {
        uircc_cleanup();
 }
-
-#endif
+#endif /* MODULE */
 
index 7e634e0fe41d1a317a634200f0b00a0339f6b886..5d92f5a198204a3a1e2406415dcb49d1dce1e761 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Paul VanderSpek
  * Created at:    Wed Nov  4 11:46:16 1998
- * Modified at:   Tue Feb  9 13:30:35 1999
+ * Modified at:   Wed Apr  7 17:35:59 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Corel Computer Corp.
@@ -22,7 +22,7 @@
  *     provided "AS-IS" and at no charge.
  *     
  *     If you find bugs in this file, its very likely that the same bug
- *     will also be in w83977af_ir.c since the implementations is quite
+ *     will also be in pc87108.c since the implementations is quite
  *     similar.
  *
  *     Notice that all functions that needs to access the chip in _any_
@@ -67,8 +67,8 @@ static char *driver_name = "w83977af_ir";
 
 #define CHIP_IO_EXTENT 8
 
-static unsigned int io[] = { 0x400, ~0, ~0, ~0 };
-static unsigned int irq[] = { 22, 0, 0, 0 };
+static unsigned int io[] = { 0x180, ~0, ~0, ~0 };
+static unsigned int irq[] = { 6, 0, 0, 0 };
 static unsigned int dma[] = { 0, 0, 0, 0 };
 
 static struct irda_device *dev_self[] = { NULL, NULL, NULL, NULL};
@@ -116,7 +116,7 @@ __initfunc(int w83977af_init(void))
 
        for ( i=0; (io[i] < 2000) && (i < 4); i++) {
                int ioaddr = io[i];
-               if (check_region(ioaddr, CHIP_IO_EXTENT))
+               if (check_region(ioaddr, CHIP_IO_EXTENT) < 0)
                        continue;
                if (w83977af_open( i, io[i], irq[i], dma[i]) == 0)
                        return 0;
@@ -216,7 +216,6 @@ int w83977af_open( int i, unsigned int iobase, unsigned int irq,
        idev->tx_buff.truesize = 4000;
        
        /* Initialize callbacks */
-       idev->hard_xmit       = w83977af_hard_xmit;
        idev->change_speed    = w83977af_change_speed;
        idev->wait_until_sent = w83977af_wait_until_sent;
         idev->is_receiving    = w83977af_is_receiving;
@@ -290,9 +289,10 @@ int w83977af_probe( int iobase, int irq, int dma)
        /* Configure PnP port, IRQ, and DMA channel */
        w977_write_reg(0x60, (iobase >> 8) & 0xff);
        w977_write_reg(0x61, (iobase) & 0xff);
-       w977_write_reg(0x70, 0x06);
+       /* w977_write_reg(0x70, 0x06); */
+       w977_write_reg(0x70, irq);
 #ifdef NETWINDER
-       w977_write_reg(0x74, dma+1); /* Netwinder uses 1 higher than Linux */
+       w977_write_reg(0x74, dma+1); /* Netwinder uses one higher than Linux */
 #else
        w977_write_reg(0x74, dma);   
 #endif
@@ -433,7 +433,7 @@ void w83977af_change_speed( struct irda_device *idev, int speed)
        
        /* set FIFO threshold to TX17, RX16 */
        switch_bank(iobase, SET0);
-       outb( UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|UFR_EN_FIFO, iobase+UFR);
+       outb(UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|UFR_EN_FIFO, iobase+UFR);
        
        idev->netdev.tbusy = 0;
        
@@ -464,65 +464,65 @@ int w83977af_hard_xmit( struct sk_buff *skb, struct device *dev)
        
        idev = (struct irda_device *) dev->priv;
 
-       ASSERT( idev != NULL, return 0;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+       ASSERT(idev != NULL, return 0;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
 
        iobase = idev->io.iobase;
 
        DEBUG(4, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
        
        /* Lock transmit buffer */
-       if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+       if (irda_lock((void *) &dev->tbusy) == FALSE)
                return -EBUSY;
-
+       
        /* Save current set */
-       set = inb( iobase+SSR);
+       set = inb(iobase+SSR);
        
        /* Decide if we should use PIO or DMA transfer */
-       if ( idev->io.baudrate > 115200) {
-               memcpy( idev->tx_buff.data, skb->data, skb->len);
+       if (idev->io.baudrate > 115200) {
+               memcpy(idev->tx_buff.data, skb->data, skb->len);
                idev->tx_buff.len = skb->len;
                idev->tx_buff.head = idev->tx_buff.data;
                idev->tx_buff.offset = 0;
                
-               mtt = irda_get_mtt( skb);
-               if ( mtt > 50) {
+               mtt = irda_get_mtt(skb);
+               if (mtt > 50) {
                        /* Adjust for timer resolution */
-                       mtt /= 1000+1;
+                       mtt = mtt / 1000 + 1;
 
                        /* Setup timer */
-                       switch_bank( iobase, SET4);
-                       outb( mtt & 0xff, iobase+TMRL);
-                       outb(( mtt >> 8) & 0x0f, iobase+TMRH);
+                       switch_bank(iobase, SET4);
+                       outb(mtt & 0xff, iobase+TMRL);
+                       outb((mtt >> 8) & 0x0f, iobase+TMRH);
                        
                        /* Start timer */
-                       outb( IR_MSL_EN_TMR, iobase+IR_MSL);
+                       outb(IR_MSL_EN_TMR, iobase+IR_MSL);
                        idev->io.direction = IO_XMIT;
                        
                        /* Enable timer interrupt */
-                       switch_bank( iobase, SET0);
-                       outb( ICR_ETMRI, iobase+ICR);
+                       switch_bank(iobase, SET0);
+                       outb(ICR_ETMRI, iobase+ICR);
                } else {
-                       if ( mtt)
-                               udelay( mtt);
+                       if (mtt)
+                               udelay(mtt);
 
                        /* Enable DMA interrupt */
-                       switch_bank( iobase, SET0);
-                       outb( ICR_EDMAI, iobase+ICR);
-                       w83977af_dma_write( idev, iobase);
+                       switch_bank(iobase, SET0);
+                       outb(ICR_EDMAI, iobase+ICR);
+                       w83977af_dma_write(idev, iobase);
                }
        } else {
-               idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data, 
-                                                   idev->tx_buff.truesize);
+               idev->tx_buff.len = async_wrap_skb(skb, idev->tx_buff.data, 
+                                                  idev->tx_buff.truesize);
                
                idev->tx_buff.offset = 0;
                idev->tx_buff.head = idev->tx_buff.data;
                
                /* Add interrupt on tx low level (will fire immediately) */
                switch_bank( iobase, SET0);
-               outb( ICR_ETXTHI, iobase+ICR);
+               outb(ICR_ETXTHI, iobase+ICR);
        }
-       dev_kfree_skb( skb);
+       dev_kfree_skb(skb);
 
        /* Restore set register */
        outb( set, iobase+SSR);
@@ -550,23 +550,23 @@ static void w83977af_dma_write( struct irda_device *idev, int iobase)
        switch_bank(iobase, SET0);
        outb( inb( iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
        
-       setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
-                  DMA_MODE_WRITE);
+       setup_dma(idev->io.dma, idev->tx_buff.data, idev->tx_buff.len, 
+                 DMA_MODE_WRITE);
        
        /* idev->media_busy = TRUE; */
        idev->io.direction = IO_XMIT;
        
        /* Choose transmit DMA channel  */ 
        switch_bank(iobase, SET2);
-       outb( inb( iobase+ADCR1) | ADCR1_D_CHSW|ADCR1_DMA_F|ADCR1_ADV_SL, 
-             iobase+ADCR1);
+       outb(inb(iobase+ADCR1) | ADCR1_D_CHSW|ADCR1_DMA_F|ADCR1_ADV_SL, 
+            iobase+ADCR1);
        
        /* Enable DMA */
-       switch_bank( iobase, SET0);
-       outb( inb( iobase+HCR) | HCR_EN_DMA, iobase+HCR);
+       switch_bank(iobase, SET0);
+       outb(inb(iobase+HCR) | HCR_EN_DMA, iobase+HCR);
        
        /* Restore set register */
-       outb( set, iobase+SSR);
+       outb(set, iobase+SSR);
 }
 
 /*
@@ -575,7 +575,7 @@ static void w83977af_dma_write( struct irda_device *idev, int iobase)
  *    
  *
  */
-static int w83977af_pio_write( int iobase, __u8 *buf, int len, int fifo_size)
+static int w83977af_pio_write(int iobase, __u8 *buf, int len, int fifo_size)
 {
        int actual = 0;
        __u8 set;
@@ -586,7 +586,7 @@ static int w83977af_pio_write( int iobase, __u8 *buf, int len, int fifo_size)
        set = inb( iobase+SSR);
 
        switch_bank( iobase, SET0);
-       if (!( inb_p( iobase+USR) & USR_TSRE)) {
+       if (!(inb_p(iobase+USR) & USR_TSRE)) {
                DEBUG( 4, __FUNCTION__ "(), warning, FIFO not empty yet!\n");
 
                fifo_size -= 17;
@@ -599,11 +599,11 @@ static int w83977af_pio_write( int iobase, __u8 *buf, int len, int fifo_size)
                outb( buf[actual++], iobase+TBR);
        }
         
-       DEBUG( 4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
-              fifo_size, actual, len);
+       DEBUG(4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n", 
+             fifo_size, actual, len);
 
        /* Restore bank */
-       outb( set, iobase+SSR);
+       outb(set, iobase+SSR);
 
        return actual;
 }
@@ -615,34 +615,34 @@ static int w83977af_pio_write( int iobase, __u8 *buf, int len, int fifo_size)
  *
  *    
  */
-void w83977af_dma_xmit_complete( struct irda_device *idev)
+void w83977af_dma_xmit_complete(struct irda_device *idev)
 {
        int iobase;
        __u8 set;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( idev != NULL, return;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+       ASSERT(idev != NULL, return;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return;);
 
        iobase = idev->io.iobase;
 
        /* Save current set */
-       set = inb( iobase+SSR);
+       set = inb(iobase+SSR);
 
        /* Disable DMA */
        switch_bank(iobase, SET0);
-       outb( inb(iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
+       outb(inb(iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
        
        /* Check for underrrun! */
-       if ( inb( iobase+AUDR) & AUDR_UNDR) {
-               DEBUG( 0, __FUNCTION__ "(), Transmit underrun!\n");
+       if (inb(iobase+AUDR) & AUDR_UNDR) {
+               DEBUG(0, __FUNCTION__ "(), Transmit underrun!\n");
                
                idev->stats.tx_errors++;
                idev->stats.tx_fifo_errors++;
 
                /* Clear bit, by writing 1 to it */
-               outb( AUDR_UNDR, iobase+AUDR);
+               outb(AUDR_UNDR, iobase+AUDR);
        } else
                idev->stats.tx_packets++;
 
@@ -651,10 +651,10 @@ void w83977af_dma_xmit_complete( struct irda_device *idev)
        idev->media_busy = FALSE;
        
        /* Tell the network layer, that we want more frames */
-       mark_bh( NET_BH);
+       mark_bh(NET_BH);
 
        /* Restore set */
-       outb( set, iobase+SSR);
+       outb(set, iobase+SSR);
 }
 
 /*
@@ -664,7 +664,7 @@ void w83977af_dma_xmit_complete( struct irda_device *idev)
  *    if it starts to receive a frame.
  *
  */
-int w83977af_dma_receive( struct irda_device *idev) 
+int w83977af_dma_receive(struct irda_device *idev) 
 {
        int iobase;
        __u8 set;
@@ -673,10 +673,10 @@ int w83977af_dma_receive( struct irda_device *idev)
        __u8 hcr;
 #endif
 
-       ASSERT( idev != NULL, return -1;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+       ASSERT(idev != NULL, return -1;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return -1;);
 
-       DEBUG( 0, __FUNCTION__ "\n");
+       DEBUG(0, __FUNCTION__ "\n");
 
        iobase= idev->io.iobase;
 
@@ -697,8 +697,8 @@ int w83977af_dma_receive( struct irda_device *idev)
        set_dma_addr( idev->io.dma, virt_to_bus(idev->rx_buff.data));
        set_dma_count( idev->io.dma, idev->rx_buff.truesize);
 #else
-       setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize
-                  DMA_MODE_READ);
+       setup_dma(idev->io.dma, idev->rx_buff.data
+                 idev->rx_buff.truesize, DMA_MODE_READ);
 #endif
        /* driver->media_busy = FALSE; */
        idev->io.direction = IO_RECV;
@@ -895,23 +895,23 @@ static void w83977af_pio_receive( struct irda_device *idev)
  *    Handle SIR interrupt
  *
  */
-static __u8 w83977af_sir_interrupt( struct irda_device *idev, int isr)
+static __u8 w83977af_sir_interrupt(struct irda_device *idev, int isr)
 {
        int len;
        int actual;
        __u8 new_icr = 0;
 
-       DEBUG( 4, __FUNCTION__ "(), isr=%#x\n", isr);
+       DEBUG(4, __FUNCTION__ "(), isr=%#x\n", isr);
        
        /* Transmit FIFO low on data */
-       if ( isr & ISR_TXTH_I) {
+       if (isr & ISR_TXTH_I) {
                /* Write data left in transmit buffer */
                len = idev->tx_buff.len - idev->tx_buff.offset;
 
-               ASSERT( len > 0, return 0;);
-               actual = w83977af_pio_write( idev->io.iobase, 
-                                            idev->tx_buff.head, 
-                                            len, idev->io.fifo_size);
+               ASSERT(len > 0, return 0;);
+               actual = w83977af_pio_write(idev->io.iobase, 
+                                           idev->tx_buff.head, 
+                                           len, idev->io.fifo_size);
                idev->tx_buff.offset += actual;
                idev->tx_buff.head += actual;
                
@@ -931,7 +931,7 @@ static __u8 w83977af_sir_interrupt( struct irda_device *idev, int isr)
                        new_icr |= ICR_ETXTHI;
        }
        /* Check if transmission has completed */
-       if ( isr & ISR_TXEMP_I) {
+       if (isr & ISR_TXEMP_I) {
                
                /* Turn around and get ready to receive some data */
                idev->io.direction = IO_RECV;
@@ -939,8 +939,8 @@ static __u8 w83977af_sir_interrupt( struct irda_device *idev, int isr)
        }
 
        /* Rx FIFO threshold or timeout */
-       if ( isr & ISR_RXTH_I) {
-               w83977af_pio_receive( idev);
+       if (isr & ISR_RXTH_I) {
+               w83977af_pio_receive(idev);
 
                /* Keep receiving */
                new_icr |= ICR_ERBRI;
@@ -964,64 +964,64 @@ static __u8 w83977af_fir_interrupt( struct irda_device *idev, int isr)
 
        iobase = idev->io.iobase;
 
-       set = inb( iobase+SSR);
+       set = inb(iobase+SSR);
        
        /* End of frame detected in FIFO */
-       if ( isr & (ISR_FEND_I|ISR_FSF_I)) {
-               if ( w83977af_dma_receive_complete( idev)) {
+       if (isr & (ISR_FEND_I|ISR_FSF_I)) {
+               if (w83977af_dma_receive_complete(idev)) {
                        
                        new_icr |= ICR_EFSFI;
                } else {
                        /* DMA not finished yet */
 
                        /* Set timer value, resolution 1 ms */
-                       switch_bank( iobase, SET4);
-                       outb( 0x01, iobase+TMRL); /* 1 ms */
-                       outb( 0x00, iobase+TMRH);
+                       switch_bank(iobase, SET4);
+                       outb(0x01, iobase+TMRL); /* 1 ms */
+                       outb(0x00, iobase+TMRH);
 
                        /* Start timer */
-                       outb( IR_MSL_EN_TMR, iobase+IR_MSL);
+                       outb(IR_MSL_EN_TMR, iobase+IR_MSL);
 
                        new_icr |= ICR_ETMRI;
                }
        }
        /* Timer finished */
-       if ( isr & ISR_TMR_I) {
+       if (isr & ISR_TMR_I) {
                /* Disable timer */
-               switch_bank( iobase, SET4);
-               outb( 0, iobase+IR_MSL);
+               switch_bank(iobase, SET4);
+               outb(0, iobase+IR_MSL);
 
                /* Clear timer event */
                /* switch_bank(iobase, SET0); */
 /*             outb( ASCR_CTE, iobase+ASCR); */
 
                /* Check if this is a TX timer interrupt */
-               if ( idev->io.direction == IO_XMIT) {
-                       w83977af_dma_write( idev, iobase);
+               if (idev->io.direction == IO_XMIT) {
+                       w83977af_dma_write(idev, iobase);
 
                        new_icr |= ICR_EDMAI;
                } else {
                        /* Check if DMA has now finished */
-                       w83977af_dma_receive_complete( idev);
+                       w83977af_dma_receive_complete(idev);
 
                        new_icr |= ICR_EFSFI;
                }
        }       
        /* Finished with DMA */
-       if ( isr & ISR_DMA_I) {
+       if (isr & ISR_DMA_I) {
                w83977af_dma_xmit_complete( idev);
-
+               
                /* Check if there are more frames to be transmitted */
-               if ( irda_device_txqueue_empty( idev)) {
+               if (irda_device_txqueue_empty( idev)) {
                
                        /* Prepare for receive */
-                       w83977af_dma_receive( idev);
+                       w83977af_dma_receive(idev);
                        new_icr = ICR_EFSFI;
                }
        }
        
        /* Restore set */
-       outb( set, iobase+SSR);
+       outb(set, iobase+SSR);
 
        return new_icr;
 }
@@ -1039,9 +1039,9 @@ static void w83977af_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 
        struct irda_device *idev = (struct irda_device *) dev_id;
 
-       if ( idev == NULL) {
-               printk( KERN_WARNING "%s: irq %d for unknown device.\n", 
-                       driver_name, irq);
+       if (idev == NULL) {
+               printk(KERN_WARNING "%s: irq %d for unknown device.\n", 
+                      driver_name, irq);
                return;
        }
 
@@ -1050,24 +1050,24 @@ static void w83977af_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        iobase = idev->io.iobase;
 
        /* Save current bank */
-       set = inb( iobase+SSR);
-       switch_bank( iobase, SET0);
+       set = inb(iobase+SSR);
+       switch_bank(iobase, SET0);
        
-       icr = inb( iobase+ICR); 
-       isr = inb( iobase+ISR) & icr; /* Mask out the interesting ones */ 
+       icr = inb(iobase+ICR); 
+       isr = inb(iobase+ISR) & icr; /* Mask out the interesting ones */ 
 
-       outb( 0, iobase+ICR); /* Disable interrupts */
+       outb(0, iobase+ICR); /* Disable interrupts */
        
-       if ( isr) {
+       if (isr) {
                /* Dispatch interrupt handler for the current speed */
                if ( idev->io.baudrate > 115200)
-                       icr = w83977af_fir_interrupt( idev, isr);
+                       icr = w83977af_fir_interrupt(idev, isr);
                else
-                       icr = w83977af_sir_interrupt( idev, isr);
+                       icr = w83977af_sir_interrupt(idev, isr);
        }
 
-       outb( icr, iobase+ICR);    /* Restore (new) interrupts */
-       outb( set, iobase+SSR);    /* Restore bank register */
+       outb(icr, iobase+ICR);    /* Restore (new) interrupts */
+       outb(set, iobase+SSR);    /* Restore bank register */
 
        idev->netdev.interrupt = 0;
 }
@@ -1078,7 +1078,7 @@ static void w83977af_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  *    This function should put the current thread to sleep until all data 
  *    have been sent, so it is safe to f.eks. change the speed.
  */
-static void w83977af_wait_until_sent( struct irda_device *idev)
+static void w83977af_wait_until_sent(struct irda_device *idev)
 {
        current->state = TASK_INTERRUPTIBLE;
        schedule_timeout(6);
@@ -1090,7 +1090,7 @@ static void w83977af_wait_until_sent( struct irda_device *idev)
  *    Return TRUE is we are currently receiving a frame
  *
  */
-static int w83977af_is_receiving( struct irda_device *idev)
+static int w83977af_is_receiving(struct irda_device *idev)
 {
        int status = FALSE;
        int iobase;
@@ -1103,15 +1103,15 @@ static int w83977af_is_receiving( struct irda_device *idev)
                iobase = idev->io.iobase;
 
                /* Check if rx FIFO is not empty */
-               set = inb( iobase+SSR);
+               set = inb(iobase+SSR);
                switch_bank( iobase, SET2);
                if (( inb( iobase+RXFDTH) & 0x3f) != 0) {
                        /* We are receiving something */
                        status =  TRUE;
                }
-               outb( set, iobase+SSR);
+               outb(set, iobase+SSR);
        } else 
-               status = ( idev->rx_buff.state != OUTSIDE_FRAME);
+               status = (idev->rx_buff.state != OUTSIDE_FRAME);
        
        return status;
 }
@@ -1124,7 +1124,7 @@ static int w83977af_is_receiving( struct irda_device *idev)
  */
 static int w83977af_net_init( struct device *dev)
 {
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(0, __FUNCTION__ "()\n");
 
        /* Set up to be a normal IrDA network device driver */
        irda_device_setup( dev);
@@ -1147,18 +1147,18 @@ static int w83977af_net_open( struct device *dev)
        int iobase;
        __u8 set;
        
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(0, __FUNCTION__ "()\n");
        
-       ASSERT( dev != NULL, return -1;);
+       ASSERT(dev != NULL, return -1;);
        idev = (struct irda_device *) dev->priv;
        
-       ASSERT( idev != NULL, return 0;);
-       ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+       ASSERT(idev != NULL, return 0;);
+       ASSERT(idev->magic == IRDA_DEVICE_MAGIC, return 0;);
        
        iobase = idev->io.iobase;
 
-       if (request_irq( idev->io.irq, w83977af_interrupt, 0, idev->name, 
-                        (void *) idev)) {
+       if (request_irq(idev->io.irq, w83977af_interrupt, 0, idev->name, 
+                       (void *) idev)) {
                return -EAGAIN;
        }
        /*
@@ -1166,7 +1166,7 @@ static int w83977af_net_open( struct device *dev)
         * and clean up on failure.
         */
        if (request_dma(idev->io.dma, idev->name)) {
-               free_irq( idev->io.irq, idev);
+               free_irq(idev->io.irq, idev);
                return -EAGAIN;
        }
                
@@ -1176,11 +1176,11 @@ static int w83977af_net_open( struct device *dev)
        dev->start = 1;
 
        /* Save current set */
-       set = inb( iobase+SSR);
+       set = inb(iobase+SSR);
 
        /* Enable some interrupts so we can receive frames again */
        switch_bank(iobase, SET0);
-       if ( idev->io.baudrate > 115200) {
+       if (idev->io.baudrate > 115200) {
                outb( ICR_EFSFI, iobase+ICR);
                w83977af_dma_receive( idev);
        } else
@@ -1250,9 +1250,7 @@ static int w83977af_net_close(struct device *dev)
  */
 int init_module(void)
 {
-       w83977af_init();
-
-       return(0);
+       return w83977af_init();
 }
 
 /*
@@ -1265,5 +1263,4 @@ void cleanup_module(void)
 {
        w83977af_cleanup();
 }
-
-#endif
+#endif /* MODULE */
index 3aff27f322d3b2fab10dc071336327f5bc15279c..56ae04b72f610124fbe227bbdd00b160971ca4a0 100644 (file)
@@ -569,10 +569,6 @@ static __inline__ void run_main(void)
        if (!main_running) {
                main_running = 1;
                NCR5380_main();
-               /* 
-                * main_running is cleared in NCR5380_main once it can't do 
-                * more work, and NCR5380_main exits with interrupts disabled.
-                */
        }
        restore_flags(flags);
 }
@@ -702,7 +698,9 @@ void NCR5380_timer_fn(unsigned long surplus_to_requirements)
        }
        restore_flags(flags);
 
+       spin_lock_irqsave(&io_request_lock, flags);
        run_main();
+       spin_unlock_irqrestore(&io_request_lock, flags);
 }
 #endif                         /* def USLEEP */
 
@@ -1266,6 +1264,7 @@ static void NCR5380_main(void) {
        struct Scsi_Host *instance;
        struct NCR5380_hostdata *hostdata;
        int done;
+       unsigned long flags;
 
        /*
         * We run (with interrupts disabled) until we're sure that none of 
@@ -1279,14 +1278,16 @@ static void NCR5380_main(void) {
         * this should prevent any race conditions.
         */
 
+       spin_unlock_irq(&io_request_lock);
+       
+       save_flags(flags);
+       
        do {
                cli();          /* Freeze request queues */
                done = 1;
                for (instance = first_instance; instance &&
                     instance->hostt == the_template; instance = instance->next) {
-                       unsigned long flags;
                         hostdata = (struct NCR5380_hostdata *) instance->hostdata;
-                        save_flags(flags);
                         cli();
 #ifdef USLEEP
                        if (!hostdata->connected && !hostdata->selecting) {
@@ -1365,8 +1366,6 @@ static void NCR5380_main(void) {
                                                             TAG_NEXT)) {
                                                        break;
                                                } else {
-                                                       unsigned long flags;
-                                                       save_flags(flags);
                                                        cli();
                                                        LIST(tmp, hostdata->issue_queue);
                                                        tmp->host_scribble = (unsigned char *)
@@ -1393,14 +1392,12 @@ static void NCR5380_main(void) {
                                }
                                else
                                {
-                                       unsigned long flags;
                                        /* RvC: device failed, so we wait a long time
                                        this is needed for Mustek scanners, that
                                        do not respond to commands immediately
                                        after a scan */
                                        printk(KERN_DEBUG "scsi%d: device %d did not respond in time\n",
                                                instance->host_no, tmp->target);
-                                       save_flags(flags);
                                        cli();
                                        LIST(tmp, hostdata->issue_queue);
                                        tmp->host_scribble = (unsigned char *) hostdata->issue_queue;
@@ -1434,7 +1431,8 @@ static void NCR5380_main(void) {
                                break;
                }               /* for instance */
        } while (!done);
-       cli();
+       spin_lock_irq(&io_request_lock);
+  /*   cli();*/
        main_running = 0;
 }
 
index 2ef4fe5f5894529a1cd77ee651f81d44038dba11..0662010944ed77c55502379cd03e41486bd36f19 100644 (file)
@@ -1,24 +1,22 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * pci2000.c - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
  *
- * 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.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *     File Name:              pci2000i.c
  *
  *     Revisions       1.10    Jan-21-1999
  *             - Fixed sign on message to reflect proper controller name.
  *             - Fixed control timeout to not lock up the entire system if
  *               controller goes offline completely.
  *
- *-M*************************************************************************/
-#define PCI2000_VERSION                "1.11"
+ *     Revisions 1.12          Mar-26-1999
+ *             - Fixed spinlock and PCI configuration.
+ *
+ ****************************************************************************/
+#define PCI2000_VERSION                "1.12"
 
 #include <linux/module.h>
 
 #include <linux/kernel.h>
-#include <linux/head.h>
 #include <linux/types.h>
 #include <linux/string.h>
-#include <linux/bios32.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/blk.h>
 #include "scsi.h"
 #include "hosts.h"
+#include <linux/stat.h>
 
 #include "pci2000.h"
 #include "psi_roy.h"
 
-#include<linux/stat.h>
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,95)
+#include <asm/spinlock.h>
+#endif
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,93)
+#include <linux/bios32.h>
+#endif
 
 struct proc_dir_entry Proc_Scsi_Pci2000 =
        { PROC_SCSI_PCI2000, 7, "pci2000", S_IFDIR | S_IRUGO | S_IXUGO, 2 };
@@ -91,6 +96,7 @@ typedef struct
        USHORT           mb4;
        USHORT           cmd;
        USHORT           tag;
+       ULONG            irqOwned;
        DEV2000          dev[MAX_BUS][MAX_UNITS];
        }       ADAPTER2000, *PADAPTER2000;
 
@@ -234,6 +240,23 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
        int                                     pun;
        int                                     bus;
        int                                     z;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int                                        flags;
+#else /* version >= v2.1.95 */
+    unsigned long              flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 
        DEB(printk ("\npci2000 recieved interrupt "));
        for ( z = 0; z < NumAdapters;  z++ )                                                                            // scan for interrupt to process
@@ -252,7 +275,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
        if ( !shost )
                {
                DEB (printk ("\npci2000: not my interrupt"));
-               return;
+               goto irq_return;
                }
 
        padapter = HOSTDATA(shost);
@@ -276,7 +299,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
 
        outb_p (0xFF, padapter->tag);                                                                                           // clear the op interrupt
        outb_p (CMD_DONE, padapter->cmd);                                                                                       // complete the op
-       return;                                                                                                                                         // done, but, with what?
+       goto irq_return;;                                                                                                                                               // done, but, with what?
 
 irqProceed:;
        if ( tag & ERR08_TAGGED )                                                                                               // is there an error here?
@@ -284,7 +307,7 @@ irqProceed:;
                if ( WaitReady (padapter) )
                        {
                        OpDone (SCpnt, DID_TIME_OUT << 16);
-                       return;
+                       goto irq_return;;
                        }
 
                outb_p (tag0, padapter->mb0);                                                                           // get real error code
@@ -292,7 +315,7 @@ irqProceed:;
                if ( WaitReady (padapter) )                                                                                     // wait for controller to suck up the op
                        {
                        OpDone (SCpnt, DID_TIME_OUT << 16);
-                       return;
+                       goto irq_return;;
                        }
 
                error = inl (padapter->mb0);                                                                            // get error data
@@ -305,24 +328,40 @@ irqProceed:;
                        if ( bus )                                                                                                              // are we doint SCSI commands?
                                {
                                OpDone (SCpnt, (DID_OK << 16) | 2);
-                               return;
+                               goto irq_return;;
                                }
                        if ( *SCpnt->cmnd == SCSIOP_TEST_UNIT_READY )
                                OpDone (SCpnt, (DRIVER_SENSE << 24) | (DID_OK << 16) | 2);      // test caller we have sense data too
                        else
                                OpDone (SCpnt, DID_ERROR << 16);
-                       return;
+                       goto irq_return;;
                        }
                OpDone (SCpnt, DID_ERROR << 16);
-               return;
+               goto irq_return;;
                }
 
        outb_p (0xFF, padapter->tag);                                                                                   // clear the op interrupt
        outb_p (CMD_DONE, padapter->cmd);                                                                               // complete the op
        OpDone (SCpnt, DID_OK << 16);
+
+irq_return:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
        }
 /****************************************************************
- *     Name:   Pci2220i_QueueCommand
+ *     Name:   Pci2000_QueueCommand
  *
  *     Description:    Process a queued command from the SCSI manager.
  *
@@ -511,7 +550,7 @@ int Pci2000_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
                        if ( cmd )
                                break;
                default:
-                       DEB (printk ("pci2220i_queuecommand: Unsupported command %02X\n", *cdb));
+                       DEB (printk ("pci2000_queuecommand: Unsupported command %02X\n", *cdb));
                        OpDone (SCpnt, DID_ERROR << 16);
                        return 0;
                }
@@ -538,7 +577,7 @@ static void internal_done (Scsi_Cmnd * SCpnt)
        SCpnt->SCp.Status++;
        }
 /****************************************************************
- *     Name:   Pci2220i_Command
+ *     Name:   Pci2000_Command
  *
  *     Description:    Process a command from the SCSI manager.
  *
@@ -559,90 +598,121 @@ int Pci2000_Command (Scsi_Cmnd *SCpnt)
        return SCpnt->result;
        }
 /****************************************************************
- *     Name:   Pci2220i_Detect
+ *     Name:   Pci2000_Detect
  *
  *     Description:    Detect and initialize our boards.
  *
  *     Parameters:             tpnt - Pointer to SCSI host template structure.
  *
- *     Returns:                Number of adapters found.
+ *     Returns:                Number of adapters installed.
  *
  ****************************************************************/
 int Pci2000_Detect (Scsi_Host_Template *tpnt)
        {
-       int                                     pci_index = 0;
+       int                                     found = 0;
+       int                                     installed = 0;
        struct Scsi_Host   *pshost;
        PADAPTER2000        padapter;
        int                                     z, zz;
        int                                     setirq;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+       struct pci_dev     *pdev = NULL;
+#else
+       UCHAR   pci_bus, pci_device_fn;
+#endif
 
-       if ( pcibios_present () )
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+       if ( !pci_present () )
+#else
+       if ( !pcibios_present () )
+#endif
                {
-               for ( pci_index = 0;  pci_index <= MAXADAPTER;  ++pci_index )
-                       {
-                       UCHAR   pci_bus, pci_device_fn;
+               printk ("pci2000: PCI BIOS not present\n");
+               return 0;
+               }
 
-                       if ( pcibios_find_device (VENDOR_PSI, DEVICE_ROY_1, pci_index, &pci_bus, &pci_device_fn) != 0 )
-                               break;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+       while ( (pdev = pci_find_device (VENDOR_PSI, DEVICE_ROY_1, pdev)) != NULL )
+#else
+       while ( !pcibios_find_device (VENDOR_PSI, DEVICE_ROY_1, found, &pci_bus, &pci_device_fn) )
+#endif
+               {
+               pshost = scsi_register (tpnt, sizeof(ADAPTER2000));
+               padapter = HOSTDATA(pshost);
 
-                       pshost = scsi_register (tpnt, sizeof(ADAPTER2000));
-                       padapter = HOSTDATA(pshost);
-
-                       pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &padapter->basePort);
-                       padapter->basePort &= 0xFFFE;
-                       DEB (printk ("\nBase Regs = %#04X", padapter->basePort));                       // get the base I/O port address
-                       padapter->mb0   = padapter->basePort + RTR_MAILBOX;                                     // get the 32 bit mail boxes
-                       padapter->mb1   = padapter->basePort + RTR_MAILBOX + 4;
-                       padapter->mb2   = padapter->basePort + RTR_MAILBOX + 8;
-                       padapter->mb3   = padapter->basePort + RTR_MAILBOX + 12;
-                       padapter->mb4   = padapter->basePort + RTR_MAILBOX + 16;
-                       padapter->cmd   = padapter->basePort + RTR_LOCAL_DOORBELL;                      // command register
-                       padapter->tag   = padapter->basePort + RTR_PCI_DOORBELL;                        // tag/response register
-
-                       if ( WaitReady (padapter) )
-                               goto unregister;
-                       outb_p (0x84, padapter->mb0);
-                       outb_p (CMD_SPECIFY, padapter->cmd);
-                       if ( WaitReady (padapter) )
-                               goto unregister;
-
-                       pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
-                       setirq = 1;
-                       for ( z = 0;  z < pci_index;  z++ )                                                                     // scan for shared interrupts
-                               {
-                               if ( PsiHost[z]->irq == pshost->irq )                                                   // if shared then, don't posses
-                                       setirq = 0;
-                               }
-                       if ( setirq )                                                                                                           // if not shared, posses
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+               padapter->basePort = pdev->base_address[1] & 0xFFFE;
+#else
+               pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &padapter->basePort);
+               padapter->basePort &= 0xFFFE;
+#endif
+               DEB (printk ("\nBase Regs = %#04X", padapter->basePort));                       // get the base I/O port address
+               padapter->mb0   = padapter->basePort + RTR_MAILBOX;                                     // get the 32 bit mail boxes
+               padapter->mb1   = padapter->basePort + RTR_MAILBOX + 4;
+               padapter->mb2   = padapter->basePort + RTR_MAILBOX + 8;
+               padapter->mb3   = padapter->basePort + RTR_MAILBOX + 12;
+               padapter->mb4   = padapter->basePort + RTR_MAILBOX + 16;
+               padapter->cmd   = padapter->basePort + RTR_LOCAL_DOORBELL;                      // command register
+               padapter->tag   = padapter->basePort + RTR_PCI_DOORBELL;                        // tag/response register
+
+               if ( WaitReady (padapter) )
+                       goto unregister;
+               outb_p (0x84, padapter->mb0);
+               outb_p (CMD_SPECIFY, padapter->cmd);
+               if ( WaitReady (padapter) )
+                       goto unregister;
+
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+               pshost->irq = pdev->irq;
+#else
+               pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
+#endif
+               setirq = 1;
+               padapter->irqOwned = 0;
+               for ( z = 0;  z < installed;  z++ )                                                                     // scan for shared interrupts
+                       {
+                       if ( PsiHost[z]->irq == pshost->irq )                                                   // if shared then, don't posses
+                               setirq = 0;
+                       }
+               if ( setirq )                                                                                           // if not shared, posses
+                       {
+                       if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2000", padapter) < 0 )
                                {
-                               if ( request_irq (pshost->irq, Irq_Handler, 0, "pci2000", NULL) )
+                               if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2000", padapter) < 0 )
                                        {
-                                       printk ("Unable to allocate IRQ for PSI-2000 controller.\n");
+                                       printk ("Unable to allocate IRQ for PCI-2000 controller.\n");
                                        goto unregister;
                                        }
                                }
-                       PsiHost[pci_index]      = pshost;                                                                               // save SCSI_HOST pointer
+                       padapter->irqOwned = pshost->irq;                                               // set IRQ as owned
+                       }
+               PsiHost[installed]      = pshost;                                                                               // save SCSI_HOST pointer
 
-                       pshost->unique_id       = padapter->basePort;
-                       pshost->max_id          = 16;
-                       pshost->max_channel     = 1;
+               pshost->io_port         = padapter->basePort;
+               pshost->n_io_port       = 0xFF;
+               pshost->unique_id       = padapter->basePort;
+               pshost->max_id          = 16;
+               pshost->max_channel     = 1;
 
-                       for ( zz = 0;  zz < MAX_BUS;  zz++ )
-                               for ( z = 0; z < MAX_UNITS;  z++ )
-                                       padapter->dev[zz][z].tag = 0;
+               for ( zz = 0;  zz < MAX_BUS;  zz++ )
+                       for ( z = 0; z < MAX_UNITS;  z++ )
+                               padapter->dev[zz][z].tag = 0;
                        
-                       printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %X  IRQ = %d\n", padapter->basePort, pshost->irq);
-                       printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION,  __DATE__, __TIME__);
+               printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %X  IRQ = %d\n", padapter->basePort, pshost->irq);
+               printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION,  __DATE__, __TIME__);
+               found++;
+               if ( ++installed < MAXADAPTER )
                        continue;
+               break;
 unregister:;
-                       scsi_unregister (pshost);
-                       }
+               scsi_unregister (pshost);
+               found++;
                }
-       NumAdapters = pci_index;
-       return pci_index;
+       NumAdapters = installed;
+       return installed;
        }
 /****************************************************************
- *     Name:   Pci2220i_Abort
+ *     Name:   Pci2000_Abort
  *
  *     Description:    Process the Abort command from the SCSI manager.
  *
@@ -657,7 +727,7 @@ int Pci2000_Abort (Scsi_Cmnd *SCpnt)
        return SCSI_ABORT_SNOOZE;
        }
 /****************************************************************
- *     Name:   Pci2220i_Reset
+ *     Name:   Pci2000_Reset
  *
  *     Description:    Process the Reset command from the SCSI manager.
  *
@@ -675,11 +745,34 @@ int Pci2000_Reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags)
        {
        return SCSI_RESET_PUNT;
        }
+/****************************************************************
+ *     Name:   Pci2000_Release
+ *
+ *     Description:    Release resources allocated for a single each adapter.
+ *
+ *     Parameters:             pshost - Pointer to SCSI command structure.
+ *
+ *     Returns:                zero.
+ *
+ ****************************************************************/
+int Pci2000_Release (struct Scsi_Host *pshost)
+       {
+    PADAPTER2000       padapter = HOSTDATA (pshost);
+
+       if ( padapter->irqOwned )
+#if LINUX_VERSION_CODE < LINUXVERSION(1,3,70)
+           free_irq (pshost->irq);
+#else /* version >= v1.3.70 */
+               free_irq (pshost->irq, padapter);
+#endif /* version >= v1.3.70 */
+    release_region (pshost->io_port, pshost->n_io_port);
+    scsi_unregister(pshost);
+    return 0;
+       }
 
 #include "sd.h"
-
 /****************************************************************
- *     Name:   Pci2220i_BiosParam
+ *     Name:   Pci2000_BiosParam
  *
  *     Description:    Process the biosparam request from the SCSI manager to
  *                                     return C/H/S data.
@@ -713,7 +806,7 @@ int Pci2000_BiosParam (Scsi_Disk *disk, kdev_t dev, int geom[])
 
 #ifdef MODULE
 /* Eventually this will go into an include file, but this will be later */
-Scsi_Host_Template driver_template = PCI2220I;
+Scsi_Host_Template driver_template = PCI2000;
 
 #include "scsi_module.c"
 #endif
index ded993958ec5c58552fd136d0b072e6336e78b68..a3daa5f76304ffc1173624c040d0a6420227db6e 100644 (file)
@@ -1,29 +1,23 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
  *
- * Copyright (c) 1997 Perceptive Solutions, Inc.
+ * pci2000.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
  *
- * 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.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *     File Name:              pci2000.h
- *
- *     Description:    Header file for the SCSI driver for the PCI-2000
- *                                     interface card.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
 #ifndef _PCI2000_H
 #define _PCI2000_H
 
 #ifndef        PSI_EIDE_SCSIOP
 #define        PSI_EIDE_SCSIOP 1
 
+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#endif 
+#define        LINUXVERSION(v,p,s)    (((v)<<16) + ((p)<<8) + (s))
+
 /************************************************/
 /*             definition of standard data types               */
 /************************************************/
@@ -194,6 +193,7 @@ int Pci2000_Command                 (Scsi_Cmnd *SCpnt);
 int Pci2000_QueueCommand       (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
 int Pci2000_Abort                      (Scsi_Cmnd *SCpnt);
 int Pci2000_Reset                      (Scsi_Cmnd *SCpnt, unsigned int flags);
+int Pci2000_Release                    (struct Scsi_Host *pshost);
 int Pci2000_BiosParam          (Disk *disk, kdev_t dev, int geom[]);
 
 #ifndef NULL
@@ -202,12 +202,43 @@ int Pci2000_BiosParam             (Disk *disk, kdev_t dev, int geom[]);
 
 extern struct proc_dir_entry Proc_Scsi_Pci2000;
 
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,75)
+#define PCI2000 {                                                                                                                              \
+               next:                                           NULL,                                                                           \
+               module:                                         NULL,                                                                           \
+               proc_dir:                                       &Proc_Scsi_Pci2000,                                                     \
+               proc_info:                                      NULL,   /* let's not bloat the kernel */        \
+               name:                                           "PCI-2000 SCSI Intelligent Disk Controller",\
+               detect:                                         Pci2000_Detect,                                                         \
+               release:                                        Pci2000_Release,                                                        \
+               info:                                           NULL,   /* let's not bloat the kernel */        \
+               command:                                        Pci2000_Command,                                                        \
+               queuecommand:                           Pci2000_QueueCommand,                                           \
+               eh_strategy_handler:            NULL,                                                                           \
+               eh_abort_handler:                       NULL,                                                                           \
+               eh_device_reset_handler:        NULL,                                                                           \
+               eh_bus_reset_handler:           NULL,                                                                           \
+               eh_host_reset_handler:          NULL,                                                                           \
+               abort:                                          Pci2000_Abort,                                                          \
+               reset:                                          Pci2000_Reset,                                                          \
+               slave_attach:                           NULL,                                                                           \
+               bios_param:                                     Pci2000_BiosParam,                                                      \
+               can_queue:                                      16,                                                                                     \
+               this_id:                                        -1,                                                                                     \
+               sg_tablesize:                           16,                                                                                     \
+               cmd_per_lun:                            1,                                                                                      \
+               present:                                        0,                                                                                      \
+               unchecked_isa_dma:                      0,                                                                                      \
+               use_clustering:                         DISABLE_CLUSTERING,                                                     \
+               use_new_eh_code:                        0                                                                                       \
+               }
+#else
 #define PCI2000 { NULL, NULL,                                                  \
                        &Proc_Scsi_Pci2000,/* proc_dir_entry */         \
                        NULL,                                                           \
                        "PCI-2000 SCSI Intelligent Disk Controller",\
                        Pci2000_Detect,                                                         \
-                       NULL,                                                                           \
+                       Pci2000_Release,                                                        \
                        NULL,                                                                           \
                        Pci2000_Command,                                                        \
                        Pci2000_QueueCommand,                                           \
@@ -222,5 +253,6 @@ extern struct proc_dir_entry Proc_Scsi_Pci2000;
                        0,                                                                                      \
                        0,                                                                                      \
                        DISABLE_CLUSTERING }
+#endif
 
 #endif
index 8f5e6aee06faac6d90e71a5ade51d8f7280a9ca0..bcbd30913b1e6ac0b6c112cadeaea519a6ef0135 100644 (file)
@@ -1,35 +1,36 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-22220I device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * pci2220i.c - Linux Host Driver for PCI-2220I EIDE RAID Adapters
  *
- * 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.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *     File Name:              pci2220i.c
  *
- *     Description:    SCSI driver for the PCI2220I EIDE interface card.
+ *     Revisions 1.10          Mar-26-1999
+ *             - Updated driver for RAID and hot reconstruct support.
  *
- *-M*************************************************************************/
+ *     Revisions 1.11          Mar-26-1999
+ *             - Fixed spinlock and PCI configuration.
+ *
+ ****************************************************************************/
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/head.h>
 #include <linux/types.h>
 #include <linux/string.h>
-#include <linux/bios32.h>
+#include <linux/malloc.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include "hosts.h"
 #include "pci2220i.h"
 
-#define        PCI2220I_VERSION                "1.10"
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,95)
+#include <asm/spinlock.h>
+#endif
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,93)
+#include <linux/bios32.h>
+#endif
+
+#define        PCI2220I_VERSION                "1.11"
 //#define      READ_CMD                                IDE_COMMAND_READ
 //#define      WRITE_CMD                               IDE_COMMAND_WRITE
 //#define      MAX_BUS_MASTER_BLOCKS   1               // This is the maximum we can bus master
@@ -119,6 +127,7 @@ typedef struct
        USHORT           timingMode;                    // timing mode currently set for adapter
        USHORT           timingPIO;                             // TRUE if PIO timing is active
        ULONG            timingAddress;                 // address to use on adapter for current timing mode
+       ULONG            irqOwned;                              // owned IRQ or zero if shared
        OUR_DEVICE       device[DALE_MAXDRIVES];
        DISK_MIRROR     *raidData[8];
        ULONG            startSector;
@@ -135,9 +144,9 @@ typedef struct
        USHORT           demoFail;                              // flag for RAID failure demonstration
        USHORT           survivor;
        USHORT           failinprog;
-       USHORT           timeoutReconRetry;
        struct timer_list       reconTimer;     
        struct timer_list       timer;
+       UCHAR           *kBuffer;
        }       ADAPTER2220I, *PADAPTER2220I;
 
 #define HOSTDATA(host) ((PADAPTER2220I)&host->hostdata)
@@ -155,7 +164,6 @@ static                      int                             NumAdapters = 0;
 static                 SETUP                   DaleSetup;
 static                 DISK_MIRROR             DiskMirror[2];
 static                 ULONG                   ModeArray[] = {DALE_DATA_MODE2, DALE_DATA_MODE3, DALE_DATA_MODE4, DALE_DATA_MODE4P};
-static                 UCHAR                   Buffer[SECTORSXFER * BYTES_PER_SECTOR];
 
 static void ReconTimerExpiry (unsigned long data);
 
@@ -523,7 +531,7 @@ static void OpDone (PADAPTER2220I padapter, ULONG result)
  ****************************************************************/
 static ULONG InlineIdentify (PADAPTER2220I padapter, UCHAR spigot, UCHAR device)
        {
-       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)Buffer;
+       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)padapter->kBuffer;
 
        SelectSpigot (padapter, spigot | 0x80);                                         // select the spigot
        outb_p (device << 4, padapter->regLba24);                               // select the drive
@@ -532,9 +540,50 @@ static ULONG InlineIdentify (PADAPTER2220I padapter, UCHAR spigot, UCHAR device)
        WriteCommand (padapter, IDE_COMMAND_IDENTIFY);  
        if ( WaitDrq (padapter) )
                return 0;
-       insw (padapter->regData, Buffer, sizeof (IDENTIFY_DATA) >> 1);
+       insw (padapter->regData, padapter->kBuffer, sizeof (IDENTIFY_DATA) >> 1);
        return (pid->LBATotalSectors - 1);
        }
+/****************************************************************
+ *     Name:   InlineReadSignature     :LOCAL
+ *
+ *     Description:    Do an inline read RAID sigature.
+ *
+ *     Parameters:             padapter - Pointer adapter data structure.
+ *                                     pdev     - Pointer to device.
+ *                                     index    - index of data to read.
+ *
+ *     Returns:                Zero if no error or status register contents on error.
+ *
+ ****************************************************************/
+static UCHAR InlineReadSignature (PADAPTER2220I padapter, POUR_DEVICE pdev, int index)
+       {
+       UCHAR   status;
+       UCHAR   spigot = 1 << index;
+       ULONG   zl = pdev->lastsectorlba[index];
+
+       SelectSpigot (padapter, spigot | 0x80);                         // select the spigot without interrupts
+       outb_p (pdev->byte6 | ((UCHAR *)&zl)[3], padapter->regLba24);           
+       status = WaitReady (padapter);
+       if ( !status )
+               {
+               outb_p (((UCHAR *)&zl)[2], padapter->regLba16);
+               outb_p (((UCHAR *)&zl)[1], padapter->regLba8); 
+               outb_p (((UCHAR *)&zl)[0], padapter->regLba0);
+               outb_p (1, padapter->regSectCount);
+               WriteCommand (padapter, IDE_COMMAND_READ);
+               status = WaitDrq (padapter);
+               if ( !status )
+                       {
+                       insw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
+                       ((ULONG *)(&pdev->DiskMirror[index]))[0] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0];
+                       ((ULONG *)(&pdev->DiskMirror[index]))[1] = ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1];
+                       // some drives assert DRQ before IRQ so let's make sure we clear the IRQ
+                       WaitReady (padapter);
+                       return 0;                       
+                       }
+               }
+       return status;
+       }
 /****************************************************************
  *     Name:   DecodeError     :LOCAL
  *
@@ -619,9 +668,9 @@ static int WriteSignature (PADAPTER2220I padapter, POUR_DEVICE pdev, UCHAR spigo
        StartTimer (padapter);  
        padapter->expectingIRQ = TRUE;
        
-       outsw (padapter->regData, Buffer, DISK_MIRROR_POSITION / 2);
-       outsw (padapter->regData, &pdev->DiskMirror[index], sizeof (DISK_MIRROR) / 2);
-       outsw (padapter->regData, Buffer, ((512 - (DISK_MIRROR_POSITION + sizeof (DISK_MIRROR))) / 2));
+       ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[0] = ((ULONG *)(&pdev->DiskMirror[index]))[0];
+       ((ULONG *)(&padapter->kBuffer[DISK_MIRROR_POSITION]))[1] = ((ULONG *)(&pdev->DiskMirror[index]))[1];
+       outsw (padapter->regData, padapter->kBuffer, BYTES_PER_SECTOR / 2);
        return FALSE;
        }
 /*******************************************************************************************************
@@ -640,7 +689,7 @@ static int InitFailover (PADAPTER2220I padapter, POUR_DEVICE pdev)
        {
        UCHAR                    spigot;
        
-       DEB (printk ("\npci2000i:  Initialize failover process - survivor = %d", padapter->survivor));
+       DEB (printk ("\npci2220i:  Initialize failover process - survivor = %d", padapter->survivor));
        pdev->raid = FALSE;                                                                     //initializes system for non raid mode
        pdev->hotRecon = 0;
        padapter->reconOn = FALSE;
@@ -674,71 +723,75 @@ static void TimerExpiry (unsigned long data)
        {
        PADAPTER2220I   padapter = (PADAPTER2220I)data;
        POUR_DEVICE             pdev = padapter->pdev;
-       ULONG                   flags;
        UCHAR                   status = IDE_STATUS_BUSY;
        UCHAR                   temp, temp1;
-
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int                                        flags;
+#else /* version >= v2.1.95 */
+    unsigned long              flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
        DEB (printk ("\nPCI2220I: Timeout expired "));
-       save_flags (flags);
-       cli ();
 
        if ( padapter->failinprog )
                {
                DEB (printk ("in failover process"));
-               restore_flags (flags);
                OpDone (padapter, DecodeError (padapter, inb_p (padapter->regStatCmd)));
-               return;
+               goto timerExpiryDone;
                }
        
        while ( padapter->reconPhase )
                {
                DEB (printk ("in recon phase %X", padapter->reconPhase));
-               if ( --padapter->timeoutReconRetry )
-                       {
-                       StartTimer (padapter);
-                       return;
-                       }
                switch ( padapter->reconPhase )
                        {
                        case RECON_PHASE_MARKING:
                        case RECON_PHASE_LAST:
                                padapter->survivor = (pdev->spigot ^ 3) >> 1;
-                               restore_flags (flags);
                                DEB (printk ("\npci2220i: FAILURE 1"));
                                if ( InitFailover (padapter, pdev) )
                                        OpDone (padapter, DID_ERROR << 16);
-                               return;
+                               goto timerExpiryDone;
                        
                        case RECON_PHASE_READY:
                                OpDone (padapter, DID_ERROR << 16);
-                               return;
+                               goto timerExpiryDone;
 
                        case RECON_PHASE_COPY:
                                padapter->survivor = (pdev->spigot) >> 1;
-                               restore_flags (flags);
                                DEB (printk ("\npci2220i: FAILURE 2"));
+                               DEB (printk ("\n       spig/stat = %X", inb_p (padapter->regStatSel));
                                if ( InitFailover (padapter, pdev) )
                                        OpDone (padapter, DID_ERROR << 16);
-                               return;
+                               goto timerExpiryDone;
 
                        case RECON_PHASE_UPDATE:
                                padapter->survivor = (pdev->spigot) >> 1;
-                               restore_flags (flags);
-                               DEB (printk ("\npci2220i: FAILURE 3"));
+                               DEB (printk ("\npci2220i: FAILURE 3")));
                                if ( InitFailover (padapter, pdev) )
                                        OpDone (padapter, DID_ERROR << 16);
-                               return;
+                               goto timerExpiryDone;
 
                        case RECON_PHASE_END:
                                padapter->survivor = (pdev->spigot) >> 1;
-                               restore_flags (flags);
                                DEB (printk ("\npci2220i: FAILURE 4"));
                                if ( InitFailover (padapter, pdev) )
                                        OpDone (padapter, DID_ERROR << 16);
-                               return;
+                               goto timerExpiryDone;
                        
                        default:
-                               return;
+                               goto timerExpiryDone;
                        }
                }
        
@@ -779,14 +832,13 @@ static void TimerExpiry (unsigned long data)
                                                        padapter->survivor = 1;
                                                else
                                                        padapter->survivor = 0;
-                                               restore_flags (flags);
-                               DEB (printk ("\npci2220i: FAILURE 5"));
+                                               DEB (printk ("\npci2220i: FAILURE 5"));
                                                if ( InitFailover (padapter, pdev) )
                                                        {
                                                        status = inb_p (padapter->regStatCmd);
                                                        break;
                                                        }
-                                               return;
+                                               goto timerExpiryDone;
                                                }
                                        }
                                }
@@ -794,14 +846,13 @@ static void TimerExpiry (unsigned long data)
                                {
                                DEB (printk ("in RAID read operation"));
                                padapter->survivor = (pdev->spigot ^ 3) >> 1;
-                               restore_flags (flags);
                                DEB (printk ("\npci2220i: FAILURE 6"));
                                if ( InitFailover (padapter, pdev) )
                                        {
                                        status = inb_p (padapter->regStatCmd);
                                        break;
                                        }
-                               return;
+                               goto timerExpiryDone;
                                }
                        }
                else
@@ -812,8 +863,23 @@ static void TimerExpiry (unsigned long data)
                break;
                }
        
-       restore_flags (flags);
        OpDone (padapter, DecodeError (padapter, status));
+
+timerExpiryDone:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
        }
 /****************************************************************
  *     Name:                   SetReconstruct  :LOCAL
@@ -854,15 +920,31 @@ static void ReconTimerExpiry (unsigned long data)
        USHORT                  minmode;
        ULONG                   zl;
        UCHAR                   zc;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int                                flags;
+#else /* version >= v2.1.95 */
+    unsigned long      flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 
        padapter = (PADAPTER2220I)data;
        if ( padapter->SCpnt )
-               return;
+               goto reconTimerExpiry;
 
        pdev = padapter->device;
-       pid = (PIDENTIFY_DATA)Buffer;
+       pid = (PIDENTIFY_DATA)padapter->kBuffer;
        padapter->reconTimer.data = 0;
-       padapter->timeoutReconRetry = 2;
        padapter->pdev = pdev;
        if ( padapter->reconIsStarting )
                {
@@ -875,7 +957,7 @@ static void ReconTimerExpiry (unsigned long data)
                        {
                        if ( (pdev->DiskMirror[0].status & UCBF_MATCHED) && (pdev->DiskMirror[1].status & UCBF_MATCHED) )
                                {
-                               return;
+                               goto reconTimerExpiry;
                                }
 
                        if ( pdev->DiskMirror[0].status & UCBF_SURVIVOR )                               // is first drive survivor?
@@ -900,7 +982,7 @@ static void ReconTimerExpiry (unsigned long data)
                        }
 
                if ( !pdev->hotRecon )
-                       return;
+                       goto reconTimerExpiry;
 
                zc = ((inb_p (padapter->regStatSel) >> 3) | inb_p (padapter->regStatSel)) & 0x83;               // mute the alarm
                outb_p (zc | pdev->hotRecon | 0x40, padapter->regFail);
@@ -976,15 +1058,15 @@ static void ReconTimerExpiry (unsigned long data)
                        padapter->reconPhase = RECON_PHASE_FAILOVER;
                                DEB (printk ("\npci2220i: FAILURE 7"));
                        InitFailover (padapter, pdev);
-                       return;
+                       goto reconTimerExpiry;
                        }
 
                pdev->raid = TRUE;
        
                if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-                       return;
+                       goto reconTimerExpiry;
                padapter->reconPhase = RECON_PHASE_MARKING;
-               return;
+               goto reconTimerExpiry;
                }
 
        //**********************************
@@ -999,10 +1081,10 @@ static void ReconTimerExpiry (unsigned long data)
                        padapter->reconPhase = RECON_PHASE_FAILOVER;
                                DEB (printk ("\npci2220i: FAILURE 8"));
                        InitFailover (padapter, pdev);
-                       return;
+                       goto reconTimerExpiry;
                        }
                padapter->reconPhase = RECON_PHASE_UPDATE;
-               return;
+               goto reconTimerExpiry;
                }
 
        zl = pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint;      
@@ -1016,7 +1098,7 @@ static void ReconTimerExpiry (unsigned long data)
                outb_p (pdev->byte6 | ((UCHAR *)(&zl))[3], padapter->regLba24);// select the drive
                SelectSpigot (padapter, pdev->spigot);
                if ( WaitReady (padapter) )
-                       return;
+                       goto reconTimerExpiry;
 
                SelectSpigot (padapter, pdev->hotRecon);
                if ( WaitReady (padapter) )
@@ -1025,7 +1107,7 @@ static void ReconTimerExpiry (unsigned long data)
                        padapter->reconPhase = RECON_PHASE_FAILOVER;
                                DEB (printk ("\npci2220i: FAILURE 9"));
                        InitFailover (padapter, pdev);
-                       return;
+                       goto reconTimerExpiry;
                        }
        
                SelectSpigot (padapter, 3);
@@ -1040,15 +1122,30 @@ static void ReconTimerExpiry (unsigned long data)
                StartTimer (padapter);
                SelectSpigot (padapter, pdev->spigot);
                WriteCommand (padapter, READ_CMD);
-               return;
+               goto reconTimerExpiry;
                }
 
        pdev->DiskMirror[pdev->mirrorRecon].status = UCBF_MIRRORED | UCBF_MATCHED;
        pdev->DiskMirror[pdev->mirrorRecon ^ 1].status = UCBF_MIRRORED | UCBF_MATCHED;
        if ( WriteSignature (padapter, pdev, pdev->spigot, pdev->mirrorRecon ^ 1) )
-               return;
+               goto reconTimerExpiry;
        padapter->reconPhase = RECON_PHASE_LAST;
-       return;
+
+reconTimerExpiry:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
        }
 /****************************************************************
  *     Name:   Irq_Handler     :LOCAL
@@ -1072,6 +1169,23 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
        UCHAR                           status1;
        int                                     z;
        ULONG                           zl;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    int                                        flags;
+#else /* version >= v2.1.95 */
+    unsigned long              flags;
+#endif /* version >= v2.1.95 */
+
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /* Disable interrupts, if they aren't already disabled. */
+    save_flags (flags);
+    cli ();
+#else /* version >= v2.1.95 */
+    /*
+     * Disable interrupts, if they aren't already disabled and acquire
+     * the I/O spinlock.
+     */
+    spin_lock_irqsave (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
 
 //     DEB (printk ("\npci2220i recieved interrupt\n"));
 
@@ -1090,7 +1204,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
        if ( !shost )
                {
                DEB (printk ("\npci2220i: not my interrupt"));
-               return;
+               goto irq_return;
                }
 
        padapter = HOSTDATA(shost);
@@ -1101,7 +1215,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                {
                DEB(printk ("\npci2220i Unsolicited interrupt\n"));
                STOP_HERE ();
-               return;
+               goto irq_return;
                }
        padapter->expectingIRQ = 0;
        outb_p (0x08, padapter->regDmaCmdStat);                                                                 // cancel interrupt from DMA engine
@@ -1125,7 +1239,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                OpDone (padapter, DID_OK << 16);
                        else
                                Pci2220i_QueueCommand (SCpnt, SCpnt->scsi_done);
-                       return;         
+                       goto irq_return;                
                        }
                }
 
@@ -1142,24 +1256,24 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                        if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
                                                {
                                                padapter->survivor = (pdev->spigot ^ 3) >> 1;
-                               DEB (printk ("\npci2220i: FAILURE 10"));
+                                               DEB (printk ("\npci2220i: FAILURE 10"));
                                                if ( InitFailover (padapter, pdev) )
                                                        OpDone (padapter, DecodeError (padapter, status));
-                                               return;
+                                               goto irq_return;
                                                }
                                        if ( WriteSignature (padapter, pdev, pdev->hotRecon, pdev->mirrorRecon) )
                                                {
                                                padapter->survivor = (pdev->spigot) >> 1;
-                               DEB (printk ("\npci2220i: FAILURE 11"));
+                                               DEB (printk ("\npci2220i: FAILURE 11"));
                                                if ( InitFailover (padapter, pdev) )
                                                        OpDone (padapter, DecodeError (padapter, status));
-                                               return;
+                                               goto irq_return;
                                                }
                                        padapter->reconPhase = RECON_PHASE_END; 
-                                       return;
+                                       goto irq_return;
                                        }
                                OpDone (padapter, DID_OK << 16);
-                               return;
+                               goto irq_return;
 
                        case RECON_PHASE_READY:
                                status = inb_p (padapter->regStatCmd);                                          // read the device status
@@ -1167,7 +1281,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                        {
                                        del_timer (&padapter->timer);
                                        OpDone (padapter, DecodeError (padapter, status));
-                                       return;
+                                       goto irq_return;
                                        }
                                SelectSpigot (padapter, pdev->hotRecon);
                                if ( WaitDrq (padapter) )
@@ -1177,25 +1291,25 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                DEB (printk ("\npci2220i: FAILURE 12"));
                                        if ( InitFailover (padapter, pdev) )
                                                OpDone (padapter, DecodeError (padapter, status));
-                                       return;
+                                       goto irq_return;
                                        }
                                SelectSpigot (padapter, pdev->spigot | 0x40);
                                padapter->reconPhase = RECON_PHASE_COPY;
                                padapter->expectingIRQ = TRUE;
                                if ( padapter->timingPIO )
                                        {
-                                       insw (padapter->regData, Buffer, padapter->reconSize * (BYTES_PER_SECTOR / 2));
+                                       insw (padapter->regData, padapter->kBuffer, padapter->reconSize * (BYTES_PER_SECTOR / 2));
                                        }
                                else
                                        {
                                        outl (padapter->timingAddress, padapter->regDmaAddrLoc);
-                                       outl (virt_to_bus (Buffer), padapter->regDmaAddrPci);
+                                       outl (virt_to_bus (padapter->kBuffer), padapter->regDmaAddrPci);
                                        outl (padapter->reconSize * BYTES_PER_SECTOR, padapter->regDmaCount);
                                        outb_p (8, padapter->regDmaDesc);                                               // read operation
                                        outb_p (1, padapter->regDmaMode);                                               // no interrupt
                                        outb_p (0x03, padapter->regDmaCmdStat);                                 // kick the DMA engine in gear
                                        }
-                               return;
+                               goto irq_return;
 
                        case RECON_PHASE_COPY:
                                pdev->DiskMirror[pdev->mirrorRecon].reconstructPoint += padapter->reconSize;
@@ -1207,14 +1321,13 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                if ( status & (IDE_STATUS_ERROR | IDE_STATUS_WRITE_FAULT) )
                                        {
                                        padapter->survivor = (pdev->spigot) >> 1;
-                               DEB (printk ("\npci2220i: FAILURE 13"));
-                               DEB (printk ("  status = %X  error = %X", status, inb_p (padapter->regError)));
+                                       DEB (printk ("\npci2220i: FAILURE 13"));
                                        if ( InitFailover (padapter, pdev) )
                                                OpDone (padapter, DecodeError (padapter, status));
-                                       return;
+                                       goto irq_return;
                                        }
                                OpDone (padapter, DID_OK << 16);
-                               return;
+                               goto irq_return;
 
                        case RECON_PHASE_END:
                                status = inb_p (padapter->regStatCmd);                                          // read the device status
@@ -1225,15 +1338,15 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                DEB (printk ("\npci2220i: FAILURE 14"));
                                        if ( InitFailover (padapter, pdev) )
                                                OpDone (padapter, DecodeError (padapter, status));
-                                       return;
+                                       goto irq_return;
                                        }
                                padapter->reconOn = FALSE;
                                pdev->hotRecon = 0;
                                OpDone (padapter, DID_OK << 16);
-                               return;
+                               goto irq_return;
 
                        default:
-                               return;
+                               goto irq_return;
                        }
                }
                
@@ -1251,7 +1364,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                                del_timer (&padapter->timer);
                                DEB (printk ("\npci2220i: FAILURE 15"));
                                                if ( !InitFailover (padapter, pdev) )
-                                                       return;
+                                                       goto irq_return;
                                                }
                                        break;  
                                        }
@@ -1270,7 +1383,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                else
                                        BusMaster (padapter, 1, 1);
                                padapter->expectingIRQ = TRUE;
-                               return;
+                               goto irq_return;
                                }
                        status = 0;
                        break;
@@ -1295,7 +1408,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                SelectSpigot (padapter, pdev->spigot | 0x80);
                                DEB (printk ("\npci2220i: FAILURE 16  status = %X  error = %X", status, inb_p (padapter->regError)));
                                        if ( !InitFailover (padapter, pdev) )
-                                               return;
+                                               goto irq_return;
                                        }
                                break;
                                }
@@ -1307,7 +1420,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                        del_timer (&padapter->timer);
                                DEB (printk ("\npci2220i: FAILURE 17  status = %X  error = %X", status1, inb_p (padapter->regError)));
                                        if ( !InitFailover (padapter, pdev) )
-                                               return;
+                                               goto irq_return;
                                        status = status1;
                                        break;
                                        }
@@ -1320,13 +1433,13 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                                del_timer (&padapter->timer);
                                DEB (printk ("\npci2220i: FAILURE 18"));
                                                if ( !InitFailover (padapter, pdev) )
-                                                       return;
+                                                       goto irq_return;
                                                SelectSpigot (padapter, status | 0x80);                         
                                                status = inb_p (padapter->regStatCmd);                                                          // read the device status
                                                break;
                                                }
                                        padapter->expectingIRQ = TRUE;
-                                       return;
+                                       goto irq_return;
                                        }
                                status = 0;
                                break;
@@ -1338,7 +1451,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                                if ( status )
                                        break;
                                padapter->expectingIRQ = TRUE;
-                               return;
+                               goto irq_return;
                                }
                        status = 0;
                        break;
@@ -1346,7 +1459,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                case IDE_COMMAND_IDENTIFY:
                        {
                        PINQUIRYDATA    pinquiryData  = SCpnt->request_buffer;
-                       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)Buffer;
+                       PIDENTIFY_DATA  pid = (PIDENTIFY_DATA)padapter->kBuffer;
 
                        status = inb_p (padapter->regStatCmd);
                        if ( status & IDE_STATUS_DRQ )
@@ -1399,6 +1512,21 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
                zl = DID_OK << 16;
 
        OpDone (padapter, zl);
+irq_return:;
+#if LINUX_VERSION_CODE < LINUXVERSION(2,1,95)
+    /*
+     * Restore the original flags which will enable interrupts
+     * if and only if they were enabled on entry.
+     */
+    restore_flags (flags);
+#else /* version >= v2.1.95 */
+    /*
+     * Release the I/O spinlock and restore the original flags
+     * which will enable interrupts if and only if they were
+     * enabled on entry.
+     */
+    spin_unlock_irqrestore (&io_request_lock, flags);
+#endif /* version >= v2.1.95 */
        }
 /****************************************************************
  *     Name:   Pci2220i_QueueCommand
@@ -1652,12 +1780,13 @@ VOID ReadFlash (PADAPTER2220I padapter, VOID *pdata, ULONG base, ULONG length)
  *
  *     Parameters:             tpnt - Pointer to SCSI host template structure.
  *
- *     Returns:                Number of adapters found.
+ *     Returns:                Number of adapters installed.
  *
  ****************************************************************/
 int Pci2220i_Detect (Scsi_Host_Template *tpnt)
        {
-       int                                     pci_index = 0;
+       int                                     found = 0;
+       int                                     installed = 0;
        struct Scsi_Host   *pshost;
        PADAPTER2220I       padapter;
        int                                     unit;
@@ -1667,174 +1796,223 @@ int Pci2220i_Detect (Scsi_Host_Template *tpnt)
        int                                     setirq;
        UCHAR                           spigot1 = FALSE;
        UCHAR                           spigot2 = FALSE;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+       struct pci_dev     *pdev = NULL;
+#else
+       UCHAR                           pci_bus, pci_device_fn;
+#endif
 
-       if ( pcibios_present () )
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+       if ( !pci_present () )
+#else
+       if ( !pcibios_present () )
+#endif
                {
-               for ( pci_index = 0;  pci_index <= MAXADAPTER;  ++pci_index )
-                       {
-                       UCHAR   pci_bus, pci_device_fn;
+               printk ("pci2220i: PCI BIOS not present\n");
+               return 0;
+               }
 
-                       if ( pcibios_find_device (VENDOR_PSI, DEVICE_DALE_1, pci_index, &pci_bus, &pci_device_fn) != 0 )
-                               break;
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+       while ( (pdev = pci_find_device (VENDOR_PSI, DEVICE_DALE_1, pdev)) != NULL )
+#else
+       while ( !pcibios_find_device (VENDOR_PSI, DEVICE_DALE_1, found, &pci_bus, &pci_device_fn) )
+#endif
+               {
+               pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
+               padapter = HOSTDATA(pshost);
+               memset (padapter, 0, sizeof (ADAPTER2220I));
 
-                       pshost = scsi_register (tpnt, sizeof(ADAPTER2220I));
-                       padapter = HOSTDATA(pshost);
-                       memset (padapter, 0, sizeof (ADAPTER2220I));
-
-                       pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &zs);
-                       zs &= 0xFFFE;
-                       padapter->basePort = zs;
-                       padapter->regRemap              = zs + RTR_LOCAL_REMAP;                         // 32 bit local space remap
-                       padapter->regDesc               = zs + RTR_REGIONS;                                     // 32 bit local region descriptor
-                       padapter->regRange              = zs + RTR_LOCAL_RANGE;                         // 32 bit local range
-                       padapter->regIrqControl = zs + RTR_INT_CONTROL_STATUS;          // 16 bit interupt control and status
-                       padapter->regScratchPad = zs + RTR_MAILBOX;                                     // 16 byte scratchpad I/O base address
-
-                       pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_2, &zs);
-                       zs &= 0xFFFE;
-                       padapter->regBase               = zs;
-                       padapter->regData               = zs + REG_DATA;                                        // data register I/O address
-                       padapter->regError              = zs + REG_ERROR;                                       // error register I/O address
-                       padapter->regSectCount  = zs + REG_SECTOR_COUNT;                        // sector count register I/O address
-                       padapter->regLba0               = zs + REG_LBA_0;                                       // least significant byte of LBA
-                       padapter->regLba8               = zs + REG_LBA_8;                                       // next least significant byte of LBA
-                       padapter->regLba16              = zs + REG_LBA_16;                                      // next most significan byte of LBA
-                       padapter->regLba24              = zs + REG_LBA_24;                                      // head and most 4 significant bits of LBA
-                       padapter->regStatCmd    = zs + REG_STAT_CMD;                            // status on read and command on write register
-                       padapter->regStatSel    = zs + REG_STAT_SEL;                            // board status on read and spigot select on write register
-                       padapter->regFail               = zs + REG_FAIL;
-                       padapter->regAltStat    = zs + REG_ALT_STAT;
-
-                       padapter->regDmaDesc    = zs + RTL_DMA1_DESC_PTR;                       // address of the DMA discriptor register for direction of transfer
-                       padapter->regDmaCmdStat = zs + RTL_DMA_COMMAND_STATUS + 1;      // Byte #1 of DMA command status register
-                       padapter->regDmaAddrPci = zs + RTL_DMA1_PCI_ADDR;                       // 32 bit register for PCI address of DMA
-                       padapter->regDmaAddrLoc = zs + RTL_DMA1_LOCAL_ADDR;                     // 32 bit register for local bus address of DMA
-                       padapter->regDmaCount   = zs + RTL_DMA1_COUNT;                          // 32 bit register for DMA transfer count
-                       padapter->regDmaMode    = zs + RTL_DMA1_MODE + 1;                       // 32 bit register for DMA mode control
-
-                       if ( !inb_p (padapter->regScratchPad + DALE_NUM_DRIVES) )       // if no devices on this board
-                               goto unregister;
-
-                       pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
-                       setirq = 1;
-                       for ( z = 0;  z < pci_index;  z++ )                                                     // scan for shared interrupts
-                               {
-                               if ( PsiHost[z]->irq == pshost->irq )                                   // if shared then, don't posses
-                                       setirq = 0;
-                               }
-                       if ( setirq )                                                                                           // if not shared, posses
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+               zs = pdev->base_address[1] & 0xFFFE;
+#else
+               pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_1, &zs);
+               zs &= 0xFFFE;
+#endif
+               padapter->basePort = zs;
+               padapter->regRemap              = zs + RTR_LOCAL_REMAP;                         // 32 bit local space remap
+               padapter->regDesc               = zs + RTR_REGIONS;                                     // 32 bit local region descriptor
+               padapter->regRange              = zs + RTR_LOCAL_RANGE;                         // 32 bit local range
+               padapter->regIrqControl = zs + RTR_INT_CONTROL_STATUS;          // 16 bit interupt control and status
+               padapter->regScratchPad = zs + RTR_MAILBOX;                                     // 16 byte scratchpad I/O base address
+
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+               zs = pdev->base_address[2] & 0xFFFE;
+#else
+               pcibios_read_config_word (pci_bus, pci_device_fn, PCI_BASE_ADDRESS_2, &zs);
+               zs &= 0xFFFE;
+#endif
+               padapter->regBase               = zs;
+               padapter->regData               = zs + REG_DATA;                                        // data register I/O address
+               padapter->regError              = zs + REG_ERROR;                                       // error register I/O address
+               padapter->regSectCount  = zs + REG_SECTOR_COUNT;                        // sector count register I/O address
+               padapter->regLba0               = zs + REG_LBA_0;                                       // least significant byte of LBA
+               padapter->regLba8               = zs + REG_LBA_8;                                       // next least significant byte of LBA
+               padapter->regLba16              = zs + REG_LBA_16;                                      // next most significan byte of LBA
+               padapter->regLba24              = zs + REG_LBA_24;                                      // head and most 4 significant bits of LBA
+               padapter->regStatCmd    = zs + REG_STAT_CMD;                            // status on read and command on write register
+               padapter->regStatSel    = zs + REG_STAT_SEL;                            // board status on read and spigot select on write register
+               padapter->regFail               = zs + REG_FAIL;
+               padapter->regAltStat    = zs + REG_ALT_STAT;
+
+               padapter->regDmaDesc    = zs + RTL_DMA1_DESC_PTR;                       // address of the DMA discriptor register for direction of transfer
+               padapter->regDmaCmdStat = zs + RTL_DMA_COMMAND_STATUS + 1;      // Byte #1 of DMA command status register
+               padapter->regDmaAddrPci = zs + RTL_DMA1_PCI_ADDR;                       // 32 bit register for PCI address of DMA
+               padapter->regDmaAddrLoc = zs + RTL_DMA1_LOCAL_ADDR;                     // 32 bit register for local bus address of DMA
+               padapter->regDmaCount   = zs + RTL_DMA1_COUNT;                          // 32 bit register for DMA transfer count
+               padapter->regDmaMode    = zs + RTL_DMA1_MODE + 1;                       // 32 bit register for DMA mode control
+
+               if ( !inb_p (padapter->regScratchPad + DALE_NUM_DRIVES) )       // if no devices on this board
+                       goto unregister;
+
+#if LINUX_VERSION_CODE > LINUXVERSION(2,1,92)
+               pshost->irq = pdev->irq;
+#else
+               pcibios_read_config_byte (pci_bus, pci_device_fn, PCI_INTERRUPT_LINE, &pshost->irq);
+#endif
+               setirq = 1;
+               for ( z = 0;  z < installed;  z++ )                                                     // scan for shared interrupts
+                       {
+                       if ( PsiHost[z]->irq == pshost->irq )                                   // if shared then, don't posses
+                               setirq = 0;
+                       }
+               if ( setirq )                                                                                           // if not shared, posses
+                       {
+                       if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2220i", padapter) < 0 )
                                {
-                               if ( request_irq (pshost->irq, Irq_Handler, 0, "pci2220i", NULL) )
+                               if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2220i", padapter) < 0 )
                                        {
-                                       printk ("Unable to allocate IRQ for PSI-2220I controller.\n");
+                                       printk ("Unable to allocate IRQ for PCI-2220I controller.\n");
                                        goto unregister;
                                        }
                                }
-                       PsiHost[pci_index]      = pshost;                                                               // save SCSI_HOST pointer
+                       padapter->irqOwned = pshost->irq;                                               // set IRQ as owned
+                       }
+               padapter->kBuffer = kmalloc (SECTORSXFER * BYTES_PER_SECTOR, GFP_DMA | GFP_ATOMIC);
+               if ( !padapter->kBuffer )
+                       {
+                       printk ("Unable to allocate DMA buffer for PCI-2220I controller.\n");
+#if LINUX_VERSION_CODE < LINUXVERSION(1,3,70)
+                       free_irq (pshost->irq);
+#else /* version >= v1.3.70 */
+                       free_irq (pshost->irq, padapter);
+#endif /* version >= v1.3.70 */
+                       goto unregister;
+                       }
+               PsiHost[installed]      = pshost;                                                               // save SCSI_HOST pointer
 
-                       pshost->unique_id       = padapter->regBase;
-                       pshost->max_id          = 4;
+               pshost->io_port         = padapter->basePort;
+               pshost->n_io_port       = 0xFF;
+               pshost->unique_id       = padapter->regBase;
+               pshost->max_id          = 4;
 
-                       outb_p (0x01, padapter->regRange);                                                      // fix our range register because other drivers want to tromp on it
+               outb_p (0x01, padapter->regRange);                                                      // fix our range register because other drivers want to tromp on it
 
-                       padapter->timingMode = inb_p (padapter->regScratchPad + DALE_TIMING_MODE);
-                       if ( padapter->timingMode >= 2 )
-                               padapter->timingAddress = ModeArray[padapter->timingMode - 2];
-                       else
-                               padapter->timingPIO = TRUE;
+               padapter->timingMode = inb_p (padapter->regScratchPad + DALE_TIMING_MODE);
+               if ( padapter->timingMode >= 2 )
+                       padapter->timingAddress = ModeArray[padapter->timingMode - 2];
+               else
+                       padapter->timingPIO = TRUE;
                        
-                       ReadFlash (padapter, &DaleSetup, DALE_FLASH_SETUP, sizeof (SETUP));
-                       for ( z = 0;  z < inb_p (padapter->regScratchPad + DALE_NUM_DRIVES);  ++z )
+               ReadFlash (padapter, &DaleSetup, DALE_FLASH_SETUP, sizeof (SETUP));
+               for ( z = 0;  z < inb_p (padapter->regScratchPad + DALE_NUM_DRIVES);  ++z )
+                       {
+                       unit = inb_p (padapter->regScratchPad + DALE_CHANNEL_DEVICE_0 + z) & 0x0F;
+                       padapter->device[z].device       = inb_p (padapter->regScratchPad + DALE_SCRATH_DEVICE_0 + unit);
+                       padapter->device[z].byte6        = (UCHAR)(((unit & 1) << 4) | 0xE0);
+                       padapter->device[z].spigot       = (UCHAR)(1 << (unit >> 1));
+                       padapter->device[z].sectors      = DaleSetup.setupDevice[unit].sectors;
+                       padapter->device[z].heads        = DaleSetup.setupDevice[unit].heads;
+                       padapter->device[z].cylinders = DaleSetup.setupDevice[unit].cylinders;
+                       padapter->device[z].blocks       = DaleSetup.setupDevice[unit].blocks;
+
+                       if ( !z )
                                {
-                               unit = inb_p (padapter->regScratchPad + DALE_CHANNEL_DEVICE_0 + z) & 0x0F;
-                               padapter->device[z].device       = inb_p (padapter->regScratchPad + DALE_SCRATH_DEVICE_0 + unit);
-                               padapter->device[z].byte6        = (UCHAR)(((unit & 1) << 4) | 0xE0);
-                               padapter->device[z].spigot       = (UCHAR)(1 << (unit >> 1));
-                               padapter->device[z].sectors      = DaleSetup.setupDevice[unit].sectors;
-                               padapter->device[z].heads        = DaleSetup.setupDevice[unit].heads;
-                               padapter->device[z].cylinders = DaleSetup.setupDevice[unit].cylinders;
-                               padapter->device[z].blocks       = DaleSetup.setupDevice[unit].blocks;
-
-                               if ( !z )
-                                       {
-                                       ReadFlash (padapter, &DiskMirror, DALE_FLASH_RAID, sizeof (DiskMirror));
-                                       DiskMirror[0].status = inb_p (padapter->regScratchPad + DALE_RAID_0_STATUS);            
-                                       DiskMirror[1].status = inb_p (padapter->regScratchPad + DALE_RAID_1_STATUS);            
-                                       if ( (DiskMirror[0].signature == SIGNATURE) && (DiskMirror[1].signature == SIGNATURE) &&
-                                            (DiskMirror[0].pairIdentifier == (DiskMirror[1].pairIdentifier ^ 1)) )
-                                               {                        
-                                               raidon = TRUE;
-                                               }       
-
-                                       memcpy (padapter->device[z].DiskMirror, DiskMirror, sizeof (DiskMirror));
-                                       padapter->raidData[0] = &padapter->device[z].DiskMirror[0];
-                                       padapter->raidData[2] = &padapter->device[z].DiskMirror[1];
+                               ReadFlash (padapter, &DiskMirror, DALE_FLASH_RAID, sizeof (DiskMirror));
+                               DiskMirror[0].status = inb_p (padapter->regScratchPad + DALE_RAID_0_STATUS);            
+                               DiskMirror[1].status = inb_p (padapter->regScratchPad + DALE_RAID_1_STATUS);            
+                               if ( (DiskMirror[0].signature == SIGNATURE) && (DiskMirror[1].signature == SIGNATURE) &&
+                                    (DiskMirror[0].pairIdentifier == (DiskMirror[1].pairIdentifier ^ 1)) )
+                                       {                        
+                                       raidon = TRUE;
+                                       }       
+
+                               memcpy (padapter->device[z].DiskMirror, DiskMirror, sizeof (DiskMirror));
+                               padapter->raidData[0] = &padapter->device[z].DiskMirror[0];
+                               padapter->raidData[2] = &padapter->device[z].DiskMirror[1];
                                
-                                       if ( raidon )
-                                               {
-                                               padapter->device[z].lastsectorlba[0] = InlineIdentify (padapter, 1, 0);
-                                               padapter->device[z].lastsectorlba[1] = InlineIdentify (padapter, 2, 0);
+                               if ( raidon )
+                                       {
+                                       padapter->device[z].lastsectorlba[0] = InlineIdentify (padapter, 1, 0);
+                                       padapter->device[z].lastsectorlba[1] = InlineIdentify (padapter, 2, 0);
                                                
-                                               if ( !(DiskMirror[1].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[0] )
-                                                       spigot1 = TRUE;
-                                               if ( !(DiskMirror[0].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[1] )
-                                                       spigot2 = TRUE;
-                                               if ( DiskMirror[0].status & UCBF_SURVIVOR & DiskMirror[1].status & UCBF_SURVIVOR )
-                                                       spigot1 = TRUE;
-
-                                               if ( spigot1 && spigot2 )
+                                       if ( !(DiskMirror[1].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[0] )
+                                               spigot1 = TRUE;
+                                       if ( !(DiskMirror[0].status & UCBF_SURVIVOR) && padapter->device[z].lastsectorlba[1] )
+                                               spigot2 = TRUE;
+                                       if ( DiskMirror[0].status & UCBF_SURVIVOR & DiskMirror[1].status & UCBF_SURVIVOR )
+                                               spigot1 = TRUE;
+
+                                       if ( spigot1 && (DiskMirror[0].status & UCBF_REBUILD) )
+                                               InlineReadSignature (padapter, &padapter->device[z], 0);
+                                       if ( spigot2 && (DiskMirror[1].status & UCBF_REBUILD) )
+                                               InlineReadSignature (padapter, &padapter->device[z], 1);
+
+                                       if ( spigot1 && spigot2 )
+                                               {
+                                               padapter->device[z].raid = 1;
+                                               if ( DiskMirror[0].status & UCBF_REBUILD )
+                                                       padapter->device[z].spigot = 2;
+                                               else
+                                                       padapter->device[z].spigot = 1;
+                                               if ( (DiskMirror[0].status & UCBF_REBUILD) || (DiskMirror[1].status & UCBF_REBUILD) )
+                                                       {
+                                                       padapter->reconOn = padapter->reconIsStarting = TRUE;
+                                                       }
+                                               }
+                                       else
+                                               {
+                                               if ( spigot1 )
                                                        {
-                                                       padapter->device[z].raid = 1;
                                                        if ( DiskMirror[0].status & UCBF_REBUILD )
-                                                               padapter->device[z].spigot = 2;
-                                                       else
-                                                               padapter->device[z].spigot = 1;
-                                                       if ( (DiskMirror[0].status & UCBF_REBUILD) || (DiskMirror[1].status & UCBF_REBUILD) )
-                                                               {
-                                                               padapter->reconOn = padapter->reconIsStarting = TRUE;
-                                                               }
+                                                               goto unregister;
+                                                       DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
+                                                       padapter->device[z].spigot = 1;
                                                        }
                                                else
                                                        {
-                                                       if ( spigot1 )
-                                                               {
-                                                               if ( DiskMirror[0].status & UCBF_REBUILD )
-                                                                       goto unregister;
-                                                               DiskMirror[0].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                                               padapter->device[z].spigot = 1;
-                                                               }
-                                                       else
-                                                               {
-                                                               if ( DiskMirror[1].status & UCBF_REBUILD )
-                                                                       goto unregister;
-                                                               DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
-                                                               padapter->device[z].spigot = 2;
-                                                               }
-                                                       if ( DaleSetup.rebootRebuil )
-                                                               padapter->reconOn = padapter->reconIsStarting = TRUE;
+                                                       if ( DiskMirror[1].status & UCBF_REBUILD )
+                                                               goto unregister;
+                                                       DiskMirror[1].status = UCBF_MIRRORED | UCBF_SURVIVOR;
+                                                       padapter->device[z].spigot = 2;
                                                        }
-                               
-                                               break;
+                                               if ( DaleSetup.rebootRebuil )
+                                                       padapter->reconOn = padapter->reconIsStarting = TRUE;
                                                }
+                               
+                                       break;
                                        }
                                }
+                       }
                        
-                       init_timer (&padapter->timer);
-                       padapter->timer.function = TimerExpiry;
-                       padapter->timer.data = (unsigned long)padapter;
-                       init_timer (&padapter->reconTimer);
-                       padapter->reconTimer.function = ReconTimerExpiry;
-                       padapter->reconTimer.data = (unsigned long)padapter;
-                       printk("\nPCI-2220I EIDE CONTROLLER: at I/O = %X/%X  IRQ = %d\n", padapter->basePort, padapter->regBase, pshost->irq);
-                       printk("Version %s, Compiled %s %s\n\n", PCI2220I_VERSION, __DATE__, __TIME__);
-                       NumAdapters++;
+               init_timer (&padapter->timer);
+               padapter->timer.function = TimerExpiry;
+               padapter->timer.data = (unsigned long)padapter;
+               init_timer (&padapter->reconTimer);
+               padapter->reconTimer.function = ReconTimerExpiry;
+               padapter->reconTimer.data = (unsigned long)padapter;
+               printk("\nPCI-2220I EIDE CONTROLLER: at I/O = %X/%X  IRQ = %d\n", padapter->basePort, padapter->regBase, pshost->irq);
+               printk("Version %s, Compiled %s %s\n\n", PCI2220I_VERSION, __DATE__, __TIME__);
+               found++;
+               if ( ++installed < MAXADAPTER )
                        continue;
+               break;;
 unregister:;
-                       scsi_unregister (pshost);
-                       }
+               scsi_unregister (pshost);
+               found++;
                }
        
-       return NumAdapters;
+       NumAdapters = installed;
+       return installed;
        }
 /****************************************************************
  *     Name:   Pci2220i_Abort
@@ -1869,6 +2047,47 @@ int Pci2220i_Reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags)
        {
        return SCSI_RESET_PUNT;
        }
+/****************************************************************
+ *     Name:   Pci2220i_Release
+ *
+ *     Description:    Release resources allocated for a single each adapter.
+ *
+ *     Parameters:             pshost - Pointer to SCSI command structure.
+ *
+ *     Returns:                zero.
+ *
+ ****************************************************************/
+int Pci2220i_Release (struct Scsi_Host *pshost)
+       {
+    PADAPTER2220I      padapter = HOSTDATA (pshost);
+
+       if ( padapter->reconOn )
+               {
+               padapter->reconOn = FALSE;                                              // shut down the hot reconstruct
+               if ( padapter->reconPhase )
+                       udelay (300000);
+               if ( padapter->reconTimer.data )                                // is the timer running?
+                       {
+                       del_timer (&padapter->reconTimer);
+                       padapter->reconTimer.data = 0;
+                       }
+               }
+
+       // save RAID status on the board
+       outb_p (DiskMirror[0].status, padapter->regScratchPad + DALE_RAID_0_STATUS);            
+       outb_p (DiskMirror[1].status, padapter->regScratchPad + DALE_RAID_1_STATUS);            
+
+       if ( padapter->irqOwned )
+#if LINUX_VERSION_CODE < LINUXVERSION(1,3,70)
+               free_irq (pshost->irq);
+#else /* version >= v1.3.70 */
+               free_irq (pshost->irq, padapter);
+#endif /* version >= v1.3.70 */
+    release_region (pshost->io_port, pshost->n_io_port);
+       kfree (padapter->kBuffer);
+    scsi_unregister(pshost);
+    return 0;
+       }
 
 #include "sd.h"
 
index 58686ea4482659bd6ec83d59ace6058b2ac3e57f..25735bdb5ec99804f5752c36bfe0f797148a8e06 100644 (file)
@@ -1,33 +1,34 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * pci2220i.h - Linux Host Driver for PCI-2220i EIDE Adapters
  *
- * 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.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *     File Name:              pci2220i.h
- *
- *     Description:    Header file for the SCSI driver for the PCI2220I
- *                                     EIDE interface card.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
+#ifndef _PCI2220I_H
+#define _PCI2220I_H
 
 #ifndef        PSI_EIDE_SCSIOP
 #define        PSI_EIDE_SCSIOP 1
 
+#ifndef LINUX_VERSION_CODE
+#include <linux/version.h>
+#endif 
+#define        LINUXVERSION(v,p,s)    (((v)<<16) + ((p)<<8) + (s))
+
 /************************************************/
 /*             Some defines that we like                               */
 /************************************************/
@@ -281,10 +282,11 @@ typedef struct _IDENTIFY_DATA
 
 // function prototypes
 int Pci2220i_Detect                    (Scsi_Host_Template *tpnt);
-int Pci2220i_Command                   (Scsi_Cmnd *SCpnt);
+int Pci2220i_Command           (Scsi_Cmnd *SCpnt);
 int Pci2220i_QueueCommand      (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
 int Pci2220i_Abort                     (Scsi_Cmnd *SCpnt);
 int Pci2220i_Reset                     (Scsi_Cmnd *SCpnt, unsigned int flags);
+int Pci2220i_Release           (struct Scsi_Host *pshost);
 int Pci2220i_BiosParam         (Disk *disk, kdev_t dev, int geom[]);
 
 #ifndef NULL
@@ -293,12 +295,43 @@ int Pci2220i_BiosParam            (Disk *disk, kdev_t dev, int geom[]);
 
 extern struct proc_dir_entry Proc_Scsi_Pci2220i;
 
+#if LINUX_VERSION_CODE >= LINUXVERSION(2,1,75)
+#define PCI2220I {                                                                                                                     \
+               next:                                           NULL,                                                                   \
+               module:                                         NULL,                                                                   \
+               proc_dir:                                       &Proc_Scsi_Pci2220i,                                    \
+               proc_info:                                      NULL,   /* let's not bloat the kernel */\
+               name:                                           "PCI-2220I EIDE Disk Controller",               \
+               detect:                                         Pci2220i_Detect,                                                \
+               release:                                        Pci2220i_Release,                                               \
+               info:                                           NULL,   /* let's not bloat the kernel */\
+               command:                                        Pci2220i_Command,                                               \
+               queuecommand:                           Pci2220i_QueueCommand,                                  \
+               eh_strategy_handler:            NULL,                                                                   \
+               eh_abort_handler:                       NULL,                                                                   \
+               eh_device_reset_handler:        NULL,                                                                   \
+               eh_bus_reset_handler:           NULL,                                                                   \
+               eh_host_reset_handler:          NULL,                                                                   \
+               abort:                                          Pci2220i_Abort,                                                 \
+               reset:                                          Pci2220i_Reset,                                                 \
+               slave_attach:                           NULL,                                                                   \
+               bios_param:                                     Pci2220i_BiosParam,                                             \
+               can_queue:                                      1,                                                                              \
+               this_id:                                        -1,                                                                             \
+               sg_tablesize:                           SG_NONE,                                                                \
+               cmd_per_lun:                            1,                                                                              \
+               present:                                        0,                                                                              \
+               unchecked_isa_dma:                      0,                                                                              \
+               use_clustering:                         DISABLE_CLUSTERING,                                             \
+               use_new_eh_code:                        0                                                                               \
+               }
+#else
 #define PCI2220I { NULL, NULL,                                         \
                        &Proc_Scsi_Pci2220i,/* proc_dir_entry */\
                        NULL,                                                   \
                        "PCI-2220I EIDE Disk Controller",               \
                        Pci2220i_Detect,                                                \
-                       NULL,                                                                   \
+                       Pci2220i_Release,                                               \
                        NULL,                                                                   \
                        Pci2220i_Command,                                               \
                        Pci2220i_QueueCommand,                                  \
@@ -313,4 +346,6 @@ extern struct proc_dir_entry Proc_Scsi_Pci2220i;
                        0,                                                                              \
                        0,                                                                              \
                        DISABLE_CLUSTERING }
+#endif
 
+#endif
index d07f72875e0dae9ca57ebdd353932516d3bf1024..cca528fee288499db92dbbb7e759e9ccdd0c2a07 100644 (file)
@@ -129,7 +129,7 @@ static int WriteData (PADAPTER240I padapter)
                        outsw (pports[PORT_DATA], padapter->buffer, (USHORT)padapter->ide.ide.ide[2] * 256);
                        return 0;
                        }
-               }       while ( timer > jiffies );                                                                      // test for timeout
+               }       while ( time_after(timer, jiffies) );                                                                   // test for timeout
 
        padapter->ide.ide.ides.cmd = 0;                                                                 // null out the command byte
        return 1;
@@ -169,7 +169,7 @@ static UCHAR IdeCmd (PADAPTER240I padapter)
 
                        return 0;
                        }
-               }       while ( timer > jiffies );                                                                      // test for timeout
+               }       while ( time_after(timer, jiffies) );                                                                   // test for timeout
 
        padapter->ide.ide.ides.cmd = 0;                                                                 // null out the command byte
        return status;
@@ -264,7 +264,7 @@ static void Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
        UCHAR                           status;
        int                                     z;
 
-       DEB(printk ("\npsi240i recieved interrupt\n"));
+       DEB(printk ("\npsi240i received interrupt\n"));
 
        shost = PsiHost[irq - 10];
        if ( !shost )
index ef79bbb5225966d1236161fd91ae63bee5ba934d..bb7c8006b319c130055cf4500db14a55ccd76fa0 100644 (file)
@@ -1,29 +1,23 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
  *
- * Copyright (c) 1999 Perceptive Solutions, Inc.
+ * psi_dalei.h - Linux Host Driver for PCI-2220i EIDE Adapters
  *
- * 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.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *     File Name:              psi_dale.h
- *
- *     Description:    This file contains the interface defines and
- *                                     error codes.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
 
 /************************************************/
 /*             Dale PCI setup                                                  */
index c9dcecfce1a6d51ad584f19619a42ef3ae5672a7..c55b9c04c32ad76a5870361830baea861bb03be5 100644 (file)
@@ -1,29 +1,23 @@
-/*+M*************************************************************************
- * Perceptive Solutions, Inc. PCI-2000 device driver proc support for Linux.
+/****************************************************************************
+ * Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
  *
- * Copyright (c) 1997 Perceptive Solutions, Inc.
+ * psi_roy.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
  *
- * 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.
+ * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
+ * All Rights Reserved.
  *
- * 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.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that redistributions of source
+ * code retain the above copyright notice and this comment without
+ * modification.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; see the file COPYING.  If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Technical updates and product information at:
+ *  http://www.psidisk.com
  *
+ * Please send questions, comments, bug reports to:
+ *  tech@psidisk.com Technical Support
  *
- *     File Name:      psi_roy.h
- *
- *     Description:    This file contains the host interface command and
- *                                     error codes.
- *
- *-M*************************************************************************/
+ ****************************************************************************/
 
 #ifndef        ROY_HOST
 #define        ROY_HOST
index d11209629b84fd35d47f2e45dd44d762b18f8044..e82d8f4fffc6c4bbb2f28a730a7ee902eaa543f9 100644 (file)
 /* Configuration section **************************************************** */
 
 /* Set the following macro to 1 to reload the ISP2100's firmware.  This is
-   version 1.13 of the firmware. */
+   version 1.15.19 of the firmware. */
 
 #define RELOAD_FIRMWARE                1
 
 #define USE_NVRAM_DEFAULTS      1
 
+#define ISP2100_PORTDB          1
 
 /* Set the following to 1 to include fabric support, fabric support is 
  * currently not as well tested as the other aspects of the driver */
@@ -316,16 +317,13 @@ struct Status_Entry {
 
 /* status entry completion status definitions */
 #define CS_COMPLETE                    0x0000
-#define CS_INCOMPLETE                  0x0001
 #define CS_DMA_ERROR                   0x0002
-#define CS_TRANSPORT_ERROR             0x0003
 #define CS_RESET_OCCURRED              0x0004
 #define CS_ABORTED                     0x0005
 #define CS_TIMEOUT                     0x0006
 #define CS_DATA_OVERRUN                        0x0007
-#define CS_ABORT_MSG_FAILED            0x000e
-#define CS_REJECT_MSG_FAILED           0x000f
 #define CS_DATA_UNDERRUN               0x0015
+#define CS_QUEUE_FULL                  0x001c
 #define CS_PORT_UNAVAILABLE             0x0028
 #define CS_PORT_LOGGED_OUT              0x0029
 #define CS_PORT_CONFIG_CHANGED         0x002a
@@ -645,9 +643,7 @@ static u_short isp2100_read_nvram_word(struct Scsi_Host *, u_short);
 static void isp2100_print_scsi_cmd(Scsi_Cmnd *);
 #endif
 
-#if DEBUG_ISP2100_INTR
 static void isp2100_print_status_entry(struct Status_Entry *);
-#endif
 
 static struct proc_dir_entry proc_scsi_isp2100 =
 {
@@ -721,7 +717,7 @@ int isp2100_detect(Scsi_Host_Template * tmpt)
                        scsi_unregister(host);
                        continue;
                }
-               host->this_id = tmpt->this_id;
+               host->this_id = 0;
 
                if (request_irq(host->irq, do_isp2100_intr_handler, SA_INTERRUPT | SA_SHIRQ, "qlogicfc", host)) {
                        printk("qlogicfc : interrupt %d already in use\n",
@@ -743,7 +739,7 @@ int isp2100_detect(Scsi_Host_Template * tmpt)
                outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR);
                isp2100_enable_irqs(host);
                /* wait for the loop to come up */
-               for (wait_time = jiffies + 20 * HZ; wait_time > jiffies && hostdata->loop_up == 0;)
+               for (wait_time = jiffies + 10 * HZ; wait_time > jiffies && hostdata->loop_up == 0;)
                        barrier();
 
                if (hostdata->loop_up == 0) {
@@ -805,13 +801,17 @@ static int isp2100_make_portdb(struct Scsi_Host *host)
        isp2100_mbox_command(host, param);
 
        if (param[0] == MBOX_COMMAND_COMPLETE) {
-               host->this_id = param[1];
                hostdata->port_id = ((u_int) param[3]) << 16;
                hostdata->port_id |= param[2];
+               temp[0].loop_id = param[1];
+               temp[0].wwn = hostdata->wwn;
+       }
+       else {
+               printk("qlogicfc: error getting scsi id.\n");
        }
 
-       for (i = 0, j = 0; i <= QLOGICFC_MAX_ID; i++) {
-               temp[i].loop_id = host->this_id;
+       for (i = 1, j = 1; i <= QLOGICFC_MAX_ID; i++) {
+               temp[i].loop_id = temp[0].loop_id;
 
                param[0] = MBOX_GET_PORT_NAME;
                param[1] = (i << 8) & 0xff00;
@@ -848,7 +848,7 @@ static int isp2100_make_portdb(struct Scsi_Host *host)
                                }
                        }
                        if (j == QLOGICFC_MAX_ID + 1)
-                               hostdata->port_db[i].loop_id = host->this_id;
+                               hostdata->port_db[i].loop_id = temp[0].loop_id;
 
                        for (j = 0; j <= QLOGICFC_MAX_ID; j++) {
                                if (hostdata->port_db[j].wwn == temp[i].wwn || !hostdata->port_db[j].wwn) {
@@ -1046,6 +1046,7 @@ int isp2100_queuecommand(Scsi_Cmnd * Cmnd, void (*done) (Scsi_Cmnd *))
                host->max_id = 0;
                return 0;
        }
+
        out_ptr = inw(host->io_port + MBOX4);
        in_ptr = hostdata->req_in_ptr;
 
@@ -1099,10 +1100,13 @@ int isp2100_queuecommand(Scsi_Cmnd * Cmnd, void (*done) (Scsi_Cmnd *))
        cmd->hdr.entry_type = ENTRY_COMMAND;
        cmd->hdr.entry_cnt = 1;
        cmd->target_lun = Cmnd->lun;
+#if ISP2100_PORTDB
        cmd->target_id = hostdata->port_db[Cmnd->target].loop_id;
+#else
+       cmd->target_id = Cmnd->target;
+#endif
        cmd->total_byte_cnt = (u_int) Cmnd->request_bufflen;
-       cmd->time_out = SCSI_TIMEOUT / HZ;
-
+       cmd->time_out = (SCSI_TIMEOUT / HZ) * 5;
        memcpy(cmd->cdb, Cmnd->cmnd, Cmnd->cmd_len);
 
        if (Cmnd->use_sg) {
@@ -1173,41 +1177,38 @@ int isp2100_queuecommand(Scsi_Cmnd * Cmnd, void (*done) (Scsi_Cmnd *))
 
 
        if (Cmnd->device->tagged_supported) {
-               switch (Cmnd->tag) {
-               case SIMPLE_QUEUE_TAG:
-                       cmd->control_flags |= CFLAG_SIMPLE_TAG;
-                       break;
-               case HEAD_OF_QUEUE_TAG:
-                       cmd->control_flags |= CFLAG_HEAD_TAG;
-                       break;
-               case ORDERED_QUEUE_TAG:
+               if ((jiffies - hostdata->tag_ages[Cmnd->target]) > (2 * SCSI_TIMEOUT)) {
                        cmd->control_flags |= CFLAG_ORDERED_TAG;
-                       break;
-               default:
-                       if ((jiffies - hostdata->tag_ages[Cmnd->target]) > (5 * HZ)) {
+                       hostdata->tag_ages[Cmnd->target] = jiffies;
+               } else
+                       switch (Cmnd->tag) {
+                       case HEAD_OF_QUEUE_TAG:
+                               cmd->control_flags |= CFLAG_HEAD_TAG;
+                               break;
+                       case ORDERED_QUEUE_TAG:
                                cmd->control_flags |= CFLAG_ORDERED_TAG;
-                               hostdata->tag_ages[Cmnd->target] = jiffies;
-                       } else
+                               break;
+                       default:
                                cmd->control_flags |= CFLAG_SIMPLE_TAG;
+                               break;
                }
        }
        outw(in_ptr, host->io_port + MBOX4);
        hostdata->req_in_ptr = in_ptr;
 
        hostdata->queued++;
-
        num_free = QLOGICFC_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr);
-       num_free = num_free - 2;
+       num_free = (num_free > 2) ? num_free - 2 : 0;
        host->can_queue = hostdata->queued + num_free;
        if (host->can_queue > QLOGICFC_REQ_QUEUE_LEN)
                host->can_queue = QLOGICFC_REQ_QUEUE_LEN;
        host->sg_tablesize = QLOGICFC_MAX_SG(num_free);
 
        /* this is really gross */
-       if (host->can_queue < host->host_busy){
+       if (host->can_queue <= host->host_busy){
                if (host->can_queue+2 < host->host_busy) 
-                 printk("qlogicfc.c crosses its fingers.\n");
-               host->can_queue = host->host_busy;
+                       DEBUG(printk("qlogicfc.c crosses its fingers.\n"));
+               host->can_queue = host->host_busy + 1;
        }
 
        LEAVE("isp2100_queuecommand");
@@ -1310,22 +1311,20 @@ void isp2100_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
                while (out_ptr != in_ptr) {
                        sts = (struct Status_Entry *) &hostdata->res[out_ptr][0];
                        out_ptr = (out_ptr + 1) & RES_QUEUE_LEN;
-                       Cmnd = hostdata->handle_ptrs[sts->handle];
-
-                       hostdata->handle_ptrs[sts->handle] = NULL;
-
-                       if (hostdata->handle_serials[sts->handle] != Cmnd->serial_number) {
-                               hostdata->queued--;
-                               hostdata->handle_serials[sts->handle] = 0;
-                               outw(out_ptr, host->io_port + MBOX5);
-                               continue;
-                       }
-                       hostdata->handle_serials[sts->handle] = 0;
-
+                 
                        TRACE("done", out_ptr, Cmnd);
                        DEBUG_INTR(isp2100_print_status_entry(sts));
                        if (sts->hdr.entry_type == ENTRY_STATUS) {
+                               Cmnd = hostdata->handle_ptrs[sts->handle];
                                Cmnd->result = isp2100_return_status(sts);
+                               hostdata->handle_ptrs[sts->handle] = NULL;
+                               hostdata->queued--;
+                               if (hostdata->handle_serials[sts->handle] != Cmnd->serial_number) {
+                                       hostdata->handle_serials[sts->handle] = 0;
+                                       outw(out_ptr, host->io_port + MBOX5);
+                                       continue;
+                               }
+                               hostdata->handle_serials[sts->handle] = 0;
                        } else {
                                outw(out_ptr, host->io_port + MBOX5);
                                continue;
@@ -1336,13 +1335,13 @@ void isp2100_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
                            || (sts->status_flags & STF_BUS_RESET))
                                hostdata->send_marker = 1;
 
+                       memset(Cmnd->sense_buffer, 0, sizeof(Cmnd->sense_buffer));
                        if (sts->scsi_status & 0x0200)
                                memcpy(Cmnd->sense_buffer, sts->req_sense_data,
                                       sizeof(Cmnd->sense_buffer));
 
                        outw(out_ptr, host->io_port + MBOX5);
 
-                       hostdata->queued--;
                        if (Cmnd->scsi_done != NULL) {
                                (*Cmnd->scsi_done) (Cmnd);
                        } else
@@ -1356,16 +1355,16 @@ void isp2100_intr_handler(int irq, void *dev_id, struct pt_regs *regs)
        in_ptr = hostdata->req_in_ptr;
 
        num_free = QLOGICFC_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr);
-       num_free = num_free-2;
+       num_free = (num_free > 2) ? num_free - 2 : 0;
        host->can_queue = hostdata->queued + num_free;
        if (host->can_queue > QLOGICFC_REQ_QUEUE_LEN)
                host->can_queue = QLOGICFC_REQ_QUEUE_LEN;
        host->sg_tablesize = QLOGICFC_MAX_SG(num_free);
 
-       if (host->can_queue < host->host_busy){
+       if (host->can_queue <= host->host_busy){
                if (host->can_queue+2 < host->host_busy) 
                        DEBUG(printk("qlogicfc crosses its fingers.\n"));
-               host->can_queue = host->host_busy;
+               host->can_queue = host->host_busy + 1;
        }
 
        outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR);
@@ -1401,16 +1400,7 @@ static int isp2100_return_status(struct Status_Entry *sts)
        case CS_COMPLETE:
                host_status = DID_OK;
                break;
-       case CS_INCOMPLETE:
-               if (!(sts->state_flags & SF_SENT_CDB))
-                       host_status = DID_ERROR;
-               else if (!(sts->state_flags & SF_TRANSFERRED_DATA))
-                       host_status = DID_ERROR;
-               else if (!(sts->state_flags & SF_GOT_STATUS))
-                       host_status = DID_ERROR;
-               break;
        case CS_DMA_ERROR:
-       case CS_TRANSPORT_ERROR:
                host_status = DID_ERROR;
                break;
        case CS_RESET_OCCURRED:
@@ -1423,7 +1413,6 @@ static int isp2100_return_status(struct Status_Entry *sts)
                host_status = DID_TIME_OUT;
                break;
        case CS_DATA_OVERRUN:
-       case CS_ABORT_MSG_FAILED:
                host_status = DID_ERROR;
                break;
        case CS_DATA_UNDERRUN:
@@ -1434,6 +1423,9 @@ static int isp2100_return_status(struct Status_Entry *sts)
        case CS_PORT_CONFIG_CHANGED:
                host_status = DID_BAD_TARGET;
                break;
+       case CS_QUEUE_FULL:
+               host_status = DID_ERROR;
+               break;
        default:
                printk("qlogicfc : unknown completion status 0x%04x\n",
                       sts->completion_status);
@@ -1539,8 +1531,6 @@ int isp2100_biosparam(Disk * disk, kdev_t n, int ip[])
                ip[0] = 255;
                ip[1] = 63;
                ip[2] = size / (ip[0] * ip[1]);
-               if (ip[2] > 1023)
-                       ip[2] = 1023;
        }
        LEAVE("isp2100_biosparam");
 
@@ -1678,9 +1668,6 @@ static int isp2100_get_nvram_defaults(struct Scsi_Host *host, struct init_cb *co
        if (isp2100_read_nvram_word(host, 0) != 0x5349)
                return 1;
 
-       control_block->max_frame_len = isp2100_read_nvram_word(host, 5);
-       control_block->max_iocb = isp2100_read_nvram_word(host, 6);
-       control_block->exec_throttle = isp2100_read_nvram_word(host, 7);
        value = isp2100_read_nvram_word(host, 8);
        control_block->node_name[0] = isp2100_read_nvram_word(host, 9);
        control_block->node_name[1] = isp2100_read_nvram_word(host, 10);
@@ -1892,8 +1879,6 @@ static int isp2100_mbox_command(struct Scsi_Host *host, u_short param[])
 }
 
 
-#if DEBUG_ISP2100_INTR
-
 void isp2100_print_status_entry(struct Status_Entry *status)
 {
        printk("qlogicfc : entry count = 0x%02x, type = 0x%02x, flags = 0x%02x\n",
@@ -1908,7 +1893,6 @@ void isp2100_print_status_entry(struct Status_Entry *status)
 
 }
 
-#endif                         /* DEBUG_ISP2100_INTR */
 
 
 #if DEBUG_ISP2100
index bedeabc1139139420eaa43500575ed762a080a77..4823af170c2ba99d18c75902947a3767eaa57a61 100644 (file)
  *      --- ISP2100 Fabric Initiator/Target Firmware ---               *
  *                                                                     *
  *                                                                     *
- *                                                                     *
+ ************************************************************************
+ *                                                                      *
+ *                              NOTICE                                  *
+ *                                                                      *
+ *                 COPYRIGHT 1998 QLOGIC CORPORATION                    *
+ *                       ALL RIGHTS RESERVED                            *
+ *                                                                      *
  ************************************************************************
  */
+
 /*
- *     Firmware Version 1.13.00 (18:06 May 04, 1998)
+ *     Firmware Version 1.15.19 (14:58 Jan 19, 1999)
  */
 
-unsigned short risc_code_version = 1*1024+13;
+unsigned short risc_code_version = 1*1024+15;
 
-unsigned char firmware_version[] = {1,13,0};
+unsigned char firmware_version[] = {1,15,19};
+
+#define FW_VERSION_STRING "1.15.19"
 
 unsigned short risc_code_addr01 = 0x1000 ;
 
 unsigned short risc_code01[] = { 
-       0x0078, 0x1029, 0x0000, 0x5c95, 0x0000, 0x2043, 0x4f50, 0x5952,
+       0x0078, 0x1029, 0x0000, 0x65e6, 0x0000, 0x2043, 0x4f50, 0x5952,
        0x4947, 0x4854, 0x2031, 0x3939, 0x3620, 0x514c, 0x4f47, 0x4943,
        0x2043, 0x4f52, 0x504f, 0x5241, 0x5449, 0x4f4e, 0x2049, 0x5350,
        0x3231, 0x3030, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056,
-       0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3133, 0x2020, 0x2020,
-       0x2400, 0x20c1, 0x0021, 0x20a1, 0x6c95, 0x2009, 0x0000, 0x20a9,
-       0x076b, 0x41a4, 0x3400, 0x20c9, 0x71ff, 0x2091, 0x2000, 0x2059,
-       0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x1e36, 0x2051, 0x6d00,
-       0x2a70, 0x705b, 0x8c00, 0x705f, 0xffff, 0x7057, 0x8bf9, 0x7063,
-       0x0300, 0x1078, 0x1264, 0x20a1, 0x7400, 0x715c, 0x810d, 0x810d,
+       0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3135, 0x2020, 0x2020,
+       0x2400, 0x20c1, 0x0021, 0x20a1, 0x75e6, 0x2009, 0x0000, 0x20a9,
+       0x071a, 0x41a4, 0x3400, 0x20c9, 0x7aff, 0x2091, 0x2000, 0x2059,
+       0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x20a0, 0x2051, 0x7600,
+       0x2a70, 0x705b, 0x9500, 0x705f, 0xffff, 0x7057, 0x94f9, 0x7063,
+       0x0300, 0x1078, 0x1282, 0x20a1, 0x7d00, 0x715c, 0x810d, 0x810d,
        0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0007, 0xa112, 0xa00e,
        0x21a8, 0x41a4, 0x3400, 0x8211, 0x00c0, 0x1058, 0x715c, 0x3400,
        0xa102, 0x0040, 0x1068, 0x0048, 0x1068, 0x20a8, 0xa00e, 0x41a4,
-       0x1078, 0x122b, 0x1078, 0x134e, 0x1078, 0x14d3, 0x1078, 0x17d7,
-       0x1078, 0x324a, 0x1078, 0x54fc, 0x1078, 0x12d9, 0x1078, 0x2191,
-       0x1078, 0x3875, 0x1078, 0x3655, 0x1078, 0x4064, 0x1078, 0x1c35,
-       0x1078, 0x4213, 0x1078, 0x3d73, 0x1078, 0x1b5d, 0x1078, 0x1c14,
+       0x1078, 0x1249, 0x1078, 0x136e, 0x1078, 0x14f3, 0x1078, 0x19c8,
+       0x1078, 0x3615, 0x1078, 0x5b94, 0x1078, 0x12f9, 0x1078, 0x242f,
+       0x1078, 0x3c56, 0x1078, 0x3a2e, 0x1078, 0x4494, 0x1078, 0x1e5b,
+       0x1078, 0x46d3, 0x1078, 0x4174, 0x1078, 0x1d7a, 0x1078, 0x1e3a,
        0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x109d, 0x7820, 0xa086,
        0x0002, 0x00c0, 0x109d, 0x7823, 0x4000, 0x0068, 0x1095, 0x781b,
        0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000,
        0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000, 0xa08e, 0x0003,
-       0x00c0, 0x10bd, 0x1078, 0x2a96, 0x1078, 0x21b9, 0x1078, 0x38c5,
-       0x1078, 0x373c, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
-       0x10c1, 0x1078, 0x4078, 0x0078, 0x10a4, 0x1079, 0x10c5, 0x0078,
-       0x10aa, 0x1078, 0x52d8, 0x0078, 0x10b9, 0x10cf, 0x10d0, 0x1151,
-       0x10cd, 0x11aa, 0x1228, 0x1229, 0x122a, 0x1078, 0x12b7, 0x007c,
-       0x127e, 0x0f7e, 0x2091, 0x8000, 0x1078, 0x2aec, 0x2079, 0x0100,
-       0x7844, 0xa005, 0x00c0, 0x1142, 0x2011, 0x318e, 0x1078, 0x40d1,
+       0x00c0, 0x10bd, 0x1078, 0x2d8d, 0x1078, 0x2457, 0x1078, 0x3ca6,
+       0x1078, 0x3b19, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
+       0x10c1, 0x1078, 0x44ac, 0x0078, 0x10a4, 0x1079, 0x10c5, 0x0078,
+       0x10aa, 0x1078, 0x5866, 0x0078, 0x10b9, 0x10cf, 0x10d0, 0x114b,
+       0x10cd, 0x11c6, 0x1246, 0x1247, 0x1248, 0x1078, 0x12d5, 0x007c,
+       0x127e, 0x0f7e, 0x2091, 0x8000, 0x1078, 0x2eb2, 0x2079, 0x0100,
+       0x7844, 0xa005, 0x00c0, 0x113c, 0x2011, 0x3542, 0x1078, 0x456e,
        0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, 0x8010,
-       0x73b8, 0x1078, 0x2a53, 0x1078, 0x5129, 0x2011, 0x0004, 0x1078,
-       0x6135, 0x1078, 0x35ef, 0x70c7, 0x0000, 0x70bf, 0x0000, 0x70c3,
-       0x0000, 0x1078, 0x1145, 0x2011, 0x0000, 0x2079, 0x6d51, 0x7804,
+       0x73b8, 0x1078, 0x2d4a, 0x1078, 0x56b1, 0x2011, 0x0004, 0x1078,
+       0x6953, 0x1078, 0x39c8, 0x70c7, 0x0000, 0x70bf, 0x0000, 0x70c3,
+       0x0000, 0x1078, 0x113f, 0x2011, 0x0000, 0x2079, 0x7651, 0x7804,
        0xd0ac, 0x0040, 0x1104, 0xc295, 0x70a4, 0xa005, 0x0040, 0x1109,
        0xc29d, 0x72be, 0xa296, 0x0004, 0x0040, 0x112a, 0x2011, 0x0001,
-       0x1078, 0x6135, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
-       0x0f7f, 0x1078, 0x1ee6, 0x2011, 0x0005, 0x1078, 0x5232, 0x1078,
-       0x476a, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x127f,
-       0x0078, 0x1144, 0x7003, 0x0003, 0x2001, 0x0000, 0x1078, 0x1dc9,
-       0x2011, 0x0000, 0x1078, 0x5232, 0x2011, 0x0000, 0x1078, 0x523c,
-       0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x1078, 0x476a,
-       0x1078, 0x4821, 0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082,
-       0x2009, 0x007e, 0x1078, 0x342f, 0x8108, 0x00f0, 0x114a, 0x0c7f,
-       0x007c, 0x127e, 0x2091, 0x8000, 0x708c, 0xa086, 0xffff, 0x0040,
-       0x115f, 0x1078, 0x1ee6, 0x1078, 0x476a, 0x0078, 0x11a8, 0x70bc,
-       0xd09c, 0x0040, 0x1187, 0xd084, 0x0040, 0x1187, 0x0f7e, 0x2079,
-       0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c, 0x0040, 0x1187,
-       0x70c0, 0xa086, 0xffff, 0x0040, 0x1183, 0x1078, 0x1fdb, 0x1078,
-       0x476a, 0x2011, 0x0001, 0x2019, 0x0000, 0x1078, 0x2013, 0x1078,
-       0x476a, 0x0078, 0x11a8, 0x70c4, 0xa005, 0x00c0, 0x11a8, 0x7088,
-       0xa005, 0x00c0, 0x11a8, 0x7003, 0x0003, 0x708f, 0xffff, 0x2001,
-       0x0000, 0x1078, 0x1dc9, 0x1078, 0x2ad1, 0x2001, 0x6f11, 0x2004,
-       0xa086, 0x0005, 0x00c0, 0x11a0, 0x2011, 0x0000, 0x1078, 0x5232,
-       0x2011, 0x0000, 0x1078, 0x523c, 0x1078, 0x476a, 0x1078, 0x4821,
-       0x127f, 0x007c, 0x017e, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079,
-       0x0100, 0x7843, 0x0000, 0x7924, 0xd1b4, 0x0040, 0x11b9, 0x7827,
-       0x0040, 0xd19c, 0x0040, 0x11be, 0x7827, 0x0008, 0x007e, 0x037e,
-       0x157e, 0x7900, 0xa18a, 0x0003, 0x0050, 0x11e4, 0x7954, 0xd1ac,
-       0x00c0, 0x11e4, 0x2009, 0x00f8, 0x1078, 0x3233, 0x7843, 0x0090,
-       0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x11dc,
-       0x7824, 0xd0ac, 0x00c0, 0x1218, 0x00f0, 0x11d4, 0x2001, 0x0001,
-       0x1078, 0x1dc9, 0x0078, 0x1221, 0x7853, 0x0000, 0x782f, 0x0020,
-       0x20a9, 0x0008, 0x00e0, 0x11ea, 0x2091, 0x6000, 0x00f0, 0x11ea,
-       0x7853, 0x0400, 0x782f, 0x0000, 0x2009, 0x00f8, 0x1078, 0x3233,
-       0x20a9, 0x000e, 0x0005, 0x00f0, 0x11fa, 0x7853, 0x1400, 0x7843,
-       0x0090, 0x7843, 0x0010, 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005,
-       0xd08c, 0x0040, 0x120f, 0x7824, 0xd0ac, 0x00c0, 0x1218, 0x8319,
-       0x00c0, 0x1205, 0x2001, 0x0001, 0x1078, 0x1dc9, 0x0078, 0x121f,
-       0x7828, 0xc09d, 0x782a, 0x7827, 0x0008, 0x7827, 0x0040, 0x7853,
-       0x0400, 0x157f, 0x037f, 0x007f, 0x127f, 0x0f7f, 0x017f, 0x007c,
-       0x007c, 0x007c, 0x007c, 0x2a70, 0x2009, 0x0100, 0x2104, 0xa082,
-       0x0002, 0x0048, 0x1237, 0x704f, 0xffff, 0x0078, 0x1239, 0x704f,
-       0x0000, 0x7053, 0xffff, 0x7067, 0x0000, 0x706b, 0x0000, 0x2061,
-       0x6f00, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f,
-       0x0200, 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f,
-       0x07d0, 0x2061, 0x6f08, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b,
-       0x0000, 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b,
-       0x0001, 0x601f, 0x0000, 0x007c, 0x1078, 0x128a, 0x2011, 0x0000,
-       0x81ff, 0x0040, 0x1289, 0xa186, 0x0001, 0x00c0, 0x1279, 0x705f,
-       0x8fff, 0x7057, 0x7c01, 0x7063, 0x0100, 0x705b, 0x7c00, 0x0078,
-       0x1287, 0xa186, 0x0002, 0x00c0, 0x1281, 0x2011, 0x0000, 0x0078,
-       0x1287, 0xa186, 0x0005, 0x00c0, 0x1287, 0x2011, 0x0001, 0x1078,
-       0x12b1, 0x007c, 0x2009, 0x0000, 0x2011, 0x0000, 0x1078, 0x12b1,
-       0x2019, 0xaaaa, 0x2061, 0xffff, 0x2362, 0x2c24, 0x2061, 0x7fff,
-       0x2c04, 0xa406, 0x0040, 0x129f, 0xc18d, 0x0078, 0x12ac, 0xc185,
-       0x2011, 0x0001, 0x1078, 0x12b1, 0x2061, 0xffff, 0x2362, 0x2c04,
-       0xa306, 0x00c0, 0x12ac, 0xc195, 0x2011, 0x0001, 0x1078, 0x12b1,
-       0x007c, 0x3800, 0xa084, 0xfffc, 0xa205, 0x20c0, 0x007c, 0x2091,
-       0x8000, 0x0068, 0x12b9, 0x007e, 0x017e, 0x2079, 0x0000, 0x7818,
-       0xa084, 0x0000, 0x00c0, 0x12bf, 0x017f, 0x792e, 0x007f, 0x782a,
-       0x007f, 0x7826, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091, 0x5000,
-       0x2091, 0x4080, 0x2079, 0x6d00, 0x7803, 0x0005, 0x0078, 0x12d6,
-       0x007c, 0x2071, 0x6d00, 0x7158, 0x712e, 0x2021, 0x0001, 0xa190,
-       0x002d, 0xa298, 0x002d, 0x0048, 0x12ef, 0x705c, 0xa302, 0x00c8,
-       0x12ef, 0x220a, 0x2208, 0x2310, 0x8420, 0x0078, 0x12e1, 0x200b,
+       0x1078, 0x6953, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
+       0x0f7f, 0x1078, 0x2150, 0x2011, 0x0005, 0x1078, 0x57c0, 0x1078,
+       0x4c7a, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, 0x127f,
+       0x0078, 0x113e, 0x708b, 0x0000, 0x708f, 0xffff, 0x7003, 0x0002,
+       0x2011, 0x0005, 0x1078, 0x57c0, 0x1078, 0x4c7a, 0x0c7e, 0x2061,
+       0x0100, 0x60e3, 0x0008, 0x0c7f, 0x0f7f, 0x127f, 0x007c, 0x0c7e,
+       0x20a9, 0x0082, 0x2009, 0x007e, 0x1078, 0x380d, 0x8108, 0x00f0,
+       0x1144, 0x0c7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x708c, 0xa086,
+       0xffff, 0x0040, 0x1159, 0x1078, 0x2150, 0x1078, 0x4c7a, 0x0078,
+       0x11c4, 0x70bc, 0xd09c, 0x0040, 0x1181, 0xd084, 0x0040, 0x1181,
+       0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c,
+       0x0040, 0x1181, 0x70c0, 0xa086, 0xffff, 0x0040, 0x117d, 0x1078,
+       0x2245, 0x1078, 0x4c7a, 0x2011, 0x0001, 0x2019, 0x0000, 0x1078,
+       0x227d, 0x1078, 0x4c7a, 0x0078, 0x11c4, 0x70c4, 0xa005, 0x00c0,
+       0x11c4, 0x7088, 0xa005, 0x00c0, 0x11c4, 0x2001, 0x7652, 0x2004,
+       0xd0ac, 0x0040, 0x11a7, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009,
+       0x0000, 0x017e, 0x1078, 0x3825, 0x00c0, 0x119a, 0x6000, 0xd0ec,
+       0x00c0, 0x11a2, 0x017f, 0x8108, 0x00f0, 0x1191, 0x0c7f, 0x157f,
+       0x0078, 0x11a7, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x11c4, 0x7003,
+       0x0003, 0x708f, 0xffff, 0x2001, 0x0000, 0x1078, 0x202b, 0x1078,
+       0x2dc8, 0x2001, 0x7837, 0x2004, 0xa086, 0x0005, 0x00c0, 0x11bc,
+       0x2011, 0x0000, 0x1078, 0x57c0, 0x2011, 0x0000, 0x1078, 0x57ca,
+       0x1078, 0x4c7a, 0x1078, 0x4d3a, 0x127f, 0x007c, 0x017e, 0x0f7e,
+       0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x7940, 0xa18c, 0x0010,
+       0x7942, 0x7924, 0xd1b4, 0x0040, 0x11d7, 0x7827, 0x0040, 0xd19c,
+       0x0040, 0x11dc, 0x7827, 0x0008, 0x007e, 0x037e, 0x157e, 0x7900,
+       0xa18a, 0x0003, 0x0050, 0x1202, 0x7954, 0xd1ac, 0x00c0, 0x1202,
+       0x2009, 0x00f8, 0x1078, 0x35e4, 0x7843, 0x0090, 0x7843, 0x0010,
+       0x20a9, 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x11fa, 0x7824, 0xd0ac,
+       0x00c0, 0x1236, 0x00f0, 0x11f2, 0x2001, 0x0001, 0x1078, 0x202b,
+       0x0078, 0x123f, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0008,
+       0x00e0, 0x1208, 0x2091, 0x6000, 0x00f0, 0x1208, 0x7853, 0x0400,
+       0x782f, 0x0000, 0x2009, 0x00f8, 0x1078, 0x35e4, 0x20a9, 0x000e,
+       0x0005, 0x00f0, 0x1218, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843,
+       0x0010, 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040,
+       0x122d, 0x7824, 0xd0ac, 0x00c0, 0x1236, 0x8319, 0x00c0, 0x1223,
+       0x2001, 0x0001, 0x1078, 0x202b, 0x0078, 0x123d, 0x7828, 0xc09d,
+       0x782a, 0x7827, 0x0008, 0x7827, 0x0040, 0x7853, 0x0400, 0x157f,
+       0x037f, 0x007f, 0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c,
+       0x007c, 0x2a70, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048,
+       0x1255, 0x704f, 0xffff, 0x0078, 0x1257, 0x704f, 0x0000, 0x7053,
+       0xffff, 0x7067, 0x0000, 0x706b, 0x0000, 0x2061, 0x7820, 0x6003,
+       0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013,
+       0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061,
+       0x7828, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, 0x0000, 0x600f,
+       0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, 0x0001, 0x601f,
+       0x0000, 0x007c, 0x1078, 0x12a8, 0x2011, 0x0000, 0x81ff, 0x0040,
+       0x12a7, 0xa186, 0x0001, 0x00c0, 0x1297, 0x705f, 0x8fff, 0x7057,
+       0x8501, 0x7063, 0x0100, 0x705b, 0x8500, 0x0078, 0x12a5, 0xa186,
+       0x0002, 0x00c0, 0x129f, 0x2011, 0x0000, 0x0078, 0x12a5, 0xa186,
+       0x0005, 0x00c0, 0x12a5, 0x2011, 0x0001, 0x1078, 0x12cf, 0x007c,
+       0x2009, 0x0000, 0x2011, 0x0000, 0x1078, 0x12cf, 0x2019, 0xaaaa,
+       0x2061, 0xffff, 0x2362, 0x2c24, 0x2061, 0x7fff, 0x2c04, 0xa406,
+       0x0040, 0x12bd, 0xc18d, 0x0078, 0x12ca, 0xc185, 0x2011, 0x0001,
+       0x1078, 0x12cf, 0x2061, 0xffff, 0x2362, 0x2c04, 0xa306, 0x00c0,
+       0x12ca, 0xc195, 0x2011, 0x0001, 0x1078, 0x12cf, 0x007c, 0x3800,
+       0xa084, 0xfffc, 0xa205, 0x20c0, 0x007c, 0x2091, 0x8000, 0x0068,
+       0x12d7, 0x007e, 0x017e, 0x2079, 0x0000, 0x7818, 0xa084, 0x0000,
+       0x00c0, 0x12dd, 0x017f, 0x792e, 0x007f, 0x782a, 0x007f, 0x7826,
+       0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091, 0x5000,
+       0x2091, 0x4080, 0x2079, 0x7600, 0x7803, 0x0005, 0x0078, 0x12f6,
+       0x007c, 0x2071, 0x7600, 0x7158, 0x712e, 0x2021, 0x0001, 0xa190,
+       0x002d, 0xa298, 0x002d, 0x0048, 0x130f, 0x705c, 0xa302, 0x00c8,
+       0x130f, 0x220a, 0x2208, 0x2310, 0x8420, 0x0078, 0x1301, 0x200b,
        0x0000, 0x749e, 0x74a2, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000,
-       0x2071, 0x6d00, 0x70a0, 0xa0ea, 0x0010, 0x00c8, 0x1302, 0xa06e,
-       0x0078, 0x130c, 0x8001, 0x70a2, 0x702c, 0x2068, 0x2d04, 0x702e,
+       0x2071, 0x7600, 0x70a0, 0xa0ea, 0x0010, 0x00c8, 0x1322, 0xa06e,
+       0x0078, 0x132c, 0x8001, 0x70a2, 0x702c, 0x2068, 0x2d04, 0x702e,
        0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c, 0x0e7e,
-       0x2071, 0x6d00, 0x127e, 0x2091, 0x8000, 0x70a0, 0x8001, 0x00c8,
-       0x131c, 0xa06e, 0x0078, 0x1325, 0x70a2, 0x702c, 0x2068, 0x2d04,
+       0x2071, 0x7600, 0x127e, 0x2091, 0x8000, 0x70a0, 0x8001, 0x00c8,
+       0x133c, 0xa06e, 0x0078, 0x1345, 0x70a2, 0x702c, 0x2068, 0x2d04,
        0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, 0x007c,
-       0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x6d00, 0x702c, 0x206a,
+       0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7600, 0x702c, 0x206a,
        0x2d00, 0x702e, 0x70a0, 0x8000, 0x70a2, 0x127f, 0x0e7f, 0x007c,
-       0x8dff, 0x0040, 0x1344, 0x6804, 0x6807, 0x0000, 0x007e, 0x1078,
-       0x1328, 0x0d7f, 0x0078, 0x1338, 0x007c, 0x0e7e, 0x2071, 0x6d00,
+       0x8dff, 0x0040, 0x1364, 0x6804, 0x6807, 0x0000, 0x007e, 0x1078,
+       0x1348, 0x0d7f, 0x0078, 0x1358, 0x007c, 0x0e7e, 0x2071, 0x7600,
        0x70a0, 0xa08a, 0x0010, 0xa00d, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
-       0x6f31, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
+       0x7859, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, 0x2071,
        0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x0e7f, 0x007c, 0x0e7e,
-       0x2270, 0x700b, 0x0000, 0x2071, 0x6f31, 0x7018, 0xa088, 0x6f3a,
+       0x2270, 0x700b, 0x0000, 0x2071, 0x7859, 0x7018, 0xa088, 0x7862,
        0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, 0xa005, 0x00c0,
-       0x1377, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x1388, 0x0f7f, 0x0e7f,
-       0x007c, 0x0e7e, 0x2071, 0x6f31, 0x7004, 0xa005, 0x00c0, 0x1386,
-       0x0f7e, 0x2079, 0x0010, 0x1078, 0x1388, 0x0f7f, 0x0e7f, 0x007c,
-       0x7000, 0x0079, 0x138b, 0x138f, 0x13f9, 0x1416, 0x1416, 0x7018,
-       0x711c, 0xa106, 0x00c0, 0x1397, 0x7007, 0x0000, 0x007c, 0x0d7e,
-       0xa180, 0x6f3a, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
+       0x1397, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a8, 0x0f7f, 0x0e7f,
+       0x007c, 0x0e7e, 0x2071, 0x7859, 0x7004, 0xa005, 0x00c0, 0x13a6,
+       0x0f7e, 0x2079, 0x0010, 0x1078, 0x13a8, 0x0f7f, 0x0e7f, 0x007c,
+       0x7000, 0x0079, 0x13ab, 0x13af, 0x1419, 0x1436, 0x1436, 0x7018,
+       0x711c, 0xa106, 0x00c0, 0x13b7, 0x7007, 0x0000, 0x007c, 0x0d7e,
+       0xa180, 0x7862, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007,
        0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c,
        0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804,
-       0x0d7f, 0xd084, 0x0040, 0x13b9, 0x7007, 0x0001, 0x1078, 0x13be,
-       0x007c, 0x7007, 0x0002, 0x1078, 0x13d4, 0x007c, 0x017e, 0x027e,
-       0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13c9, 0x2110,
+       0x0d7f, 0xd084, 0x0040, 0x13d9, 0x7007, 0x0001, 0x1078, 0x13de,
+       0x007c, 0x7007, 0x0002, 0x1078, 0x13f4, 0x007c, 0x017e, 0x027e,
+       0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13e9, 0x2110,
        0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
        0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, 0x137e, 0x147e,
        0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, 0x0026, 0x710c,
-       0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x13e8, 0x2110, 0xa006,
+       0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x1408, 0x2110, 0xa006,
        0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, 0x0020, 0x7803,
        0x0001, 0x3300, 0x7016, 0x157f, 0x147f, 0x137f, 0x027f, 0x017f,
-       0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0x6dc5, 0x20a1, 0x0018,
+       0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0x76e5, 0x20a1, 0x0018,
        0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
        0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, 0x700b,
-       0x6dc0, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
-       0x157e, 0x2001, 0x6df4, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
-       0x2001, 0x6df5, 0x20ac, 0x53a6, 0x2099, 0x6df6, 0x20a1, 0x0018,
+       0x76e0, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x137e, 0x147e,
+       0x157e, 0x2001, 0x7714, 0x209c, 0x20a1, 0x0014, 0x7803, 0x0026,
+       0x2001, 0x7715, 0x20ac, 0x53a6, 0x2099, 0x7716, 0x20a1, 0x0018,
        0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, 0x2091, 0x8000,
        0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, 0x7002, 0x700b,
-       0x6df1, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
-       0x2071, 0x6f31, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
-       0xd1fc, 0x0040, 0x1459, 0xa18c, 0x0700, 0x0040, 0x1456, 0x7008,
-       0xa080, 0x0002, 0x2003, 0x0200, 0x0078, 0x1459, 0x7004, 0x1079,
-       0x145d, 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x1388, 0x1465, 0x1487,
-       0x14a1, 0x14ca, 0x1463, 0x0078, 0x1463, 0x137e, 0x147e, 0x157e,
+       0x7711, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, 0x017e, 0x0e7e,
+       0x2071, 0x7859, 0x0f7e, 0x2079, 0x0010, 0x7904, 0x7803, 0x0002,
+       0xd1fc, 0x0040, 0x1479, 0xa18c, 0x0700, 0x0040, 0x1476, 0x7008,
+       0xa080, 0x0002, 0x2003, 0x0200, 0x0078, 0x1479, 0x7004, 0x1079,
+       0x147d, 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x13a8, 0x1485, 0x14a7,
+       0x14c1, 0x14ea, 0x1483, 0x0078, 0x1483, 0x137e, 0x147e, 0x157e,
        0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, 0x20a8,
        0x53a5, 0x3400, 0x7016, 0x157f, 0x147f, 0x137f, 0x700c, 0xa005,
-       0x0040, 0x148e, 0x1078, 0x13be, 0x007c, 0x7008, 0xa080, 0x0002,
-       0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x1388, 0x007c, 0x700c,
-       0xa005, 0x0040, 0x148e, 0x1078, 0x13d4, 0x007c, 0x0d7e, 0x7008,
+       0x0040, 0x14ae, 0x1078, 0x13de, 0x007c, 0x7008, 0xa080, 0x0002,
+       0x2003, 0x0100, 0x7007, 0x0000, 0x1078, 0x13a8, 0x007c, 0x700c,
+       0xa005, 0x0040, 0x14ae, 0x1078, 0x13f4, 0x007c, 0x0d7e, 0x7008,
        0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, 0x682e, 0x783c,
-       0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x1388,
-       0x007c, 0x137e, 0x147e, 0x157e, 0x2001, 0x6dc3, 0x2004, 0xa080,
+       0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, 0x1078, 0x13a8,
+       0x007c, 0x137e, 0x147e, 0x157e, 0x2001, 0x76e3, 0x2004, 0xa080,
        0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020,
-       0x53a5, 0x2001, 0x6dc5, 0x2004, 0xd0bc, 0x0040, 0x14c0, 0x2001,
-       0x6dce, 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5,
-       0x157f, 0x147f, 0x137f, 0x7007, 0x0000, 0x1078, 0x396e, 0x1078,
-       0x1388, 0x007c, 0x2001, 0x6df3, 0x2003, 0x0100, 0x7007, 0x0000,
-       0x1078, 0x1388, 0x007c, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030,
-       0x2071, 0x6f42, 0x7003, 0x0000, 0x700f, 0x6f48, 0x7013, 0x6f48,
+       0x53a5, 0x2001, 0x76e5, 0x2004, 0xd0bc, 0x0040, 0x14e0, 0x2001,
+       0x76ee, 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5,
+       0x157f, 0x147f, 0x137f, 0x7007, 0x0000, 0x1078, 0x3d4f, 0x1078,
+       0x13a8, 0x007c, 0x2001, 0x7713, 0x2003, 0x0100, 0x7007, 0x0000,
+       0x1078, 0x13a8, 0x007c, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030,
+       0x2071, 0x786a, 0x7003, 0x0000, 0x700f, 0x7870, 0x7013, 0x7870,
        0x780f, 0x0070, 0x127f, 0x007c, 0x6934, 0xa184, 0x0007, 0x0079,
-       0x14e9, 0x14f1, 0x151b, 0x14f1, 0x14f1, 0x14f1, 0x1500, 0x14f1,
-       0x14f5, 0xa085, 0x0001, 0x0078, 0x1531, 0x684c, 0xd0bc, 0x0040,
-       0x14f1, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x1523,
-       0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, 0x14f1, 0x684c, 0xd0ac,
-       0x0040, 0x14f1, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084,
-       0x000f, 0xa080, 0x1a82, 0x2004, 0x6832, 0xa006, 0x682e, 0x682a,
-       0x6858, 0x0078, 0x152b, 0x684c, 0xd0ac, 0x0040, 0x14f1, 0xa006,
-       0x682e, 0x682a, 0x6858, 0xa18c, 0x000f, 0xa188, 0x1a82, 0x210c,
-       0x6932, 0x2d08, 0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006,
-       0x680a, 0x007c, 0x82ff, 0x0040, 0x1545, 0xa280, 0x0004, 0x0d7e,
-       0x206c, 0x684c, 0xd0dc, 0x00c0, 0x1541, 0x1078, 0x14e4, 0x10c0,
-       0x12b7, 0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e,
-       0x027e, 0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005,
-       0x00c0, 0x1559, 0x7206, 0x2001, 0x156d, 0x007e, 0x2260, 0x0078,
-       0x164f, 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108,
-       0xa182, 0x6f63, 0x0048, 0x1566, 0x2009, 0x6f48, 0x710e, 0x7000,
-       0xa005, 0x00c0, 0x156d, 0x1078, 0x1638, 0x127f, 0x007c, 0x127e,
-       0x027e, 0x037e, 0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f,
-       0x037f, 0x027f, 0x0c7e, 0x0d7e, 0x2460, 0x6110, 0x2168, 0x6a62,
-       0x6b5e, 0xa005, 0x0040, 0x15bc, 0x6808, 0xa005, 0x0040, 0x15ea,
-       0x7000, 0xa005, 0x00c0, 0x158e, 0x0078, 0x15b4, 0x700c, 0x7110,
-       0xa106, 0x00c0, 0x15ba, 0x7004, 0xa406, 0x00c0, 0x15b4, 0x2001,
-       0x0005, 0x2004, 0xd08c, 0x00c0, 0x15ee, 0x2001, 0x0207, 0x2004,
-       0xd09c, 0x00c0, 0x1597, 0x7804, 0xa084, 0x6000, 0x0040, 0x15ae,
-       0xa086, 0x6000, 0x0040, 0x15ae, 0x0078, 0x1597, 0x7803, 0x0004,
-       0x7003, 0x0000, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5591,
-       0x0078, 0x15ee, 0x0078, 0x15ee, 0x6808, 0xa005, 0x0040, 0x15ea,
-       0x7000, 0xa005, 0x00c0, 0x15c6, 0x0078, 0x15ea, 0x700c, 0x7110,
-       0xa106, 0x00c0, 0x15ba, 0x7004, 0xa406, 0x00c0, 0x15ea, 0x2001,
-       0x0005, 0x2004, 0xd08c, 0x00c0, 0x15ee, 0x2001, 0x0207, 0x2004,
-       0xd09c, 0x00c0, 0x15cf, 0x7804, 0xa084, 0x6000, 0x0040, 0x15e6,
-       0xa086, 0x6000, 0x0040, 0x15e6, 0x0078, 0x15cf, 0x7803, 0x0004,
-       0x7003, 0x0000, 0x2009, 0x0048, 0x1078, 0x5591, 0x0d7f, 0x0c7f,
-       0x127f, 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x6f42, 0x7000, 0xa086,
-       0x0000, 0x0040, 0x1635, 0x7004, 0xac06, 0x00c0, 0x1626, 0x2079,
-       0x0030, 0x7804, 0xd0fc, 0x00c0, 0x1622, 0x2001, 0x0207, 0x2004,
-       0xd09c, 0x00c0, 0x1601, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0,
-       0x160d, 0x7908, 0xd1ec, 0x00c0, 0x1619, 0x2009, 0x0009, 0x0078,
-       0x161b, 0x2009, 0x0019, 0x7803, 0x0002, 0x7902, 0x7003, 0x0003,
-       0x0078, 0x1635, 0x1078, 0x16e5, 0x0078, 0x15f6, 0x157e, 0x20a9,
-       0x0009, 0x2009, 0x6f48, 0x2104, 0xac06, 0x00c0, 0x1630, 0x200a,
-       0xa188, 0x0003, 0x00f0, 0x162b, 0x157f, 0x0e7f, 0x0f7f, 0x007c,
-       0x700c, 0x7110, 0xa106, 0x00c0, 0x1640, 0x7003, 0x0000, 0x007c,
-       0x2104, 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124, 0x8108,
-       0xa182, 0x6f63, 0x0048, 0x164e, 0x2009, 0x6f48, 0x7112, 0x8cff,
-       0x00c0, 0x1658, 0x7803, 0x0019, 0x7003, 0x0003, 0x0078, 0x167b,
-       0x6010, 0x2068, 0x2d58, 0x6828, 0xa406, 0x00c0, 0x1663, 0x682c,
-       0xa306, 0x0040, 0x1667, 0x1078, 0x1aa2, 0x00c0, 0x1652, 0x6824,
-       0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f,
-       0x2009, 0x0011, 0x1078, 0x167c, 0x0040, 0x167a, 0x2009, 0x0001,
-       0x1078, 0x167c, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x16e0, 0xa03e,
-       0x2730, 0x6850, 0xd0fc, 0x00c0, 0x169b, 0x0d7e, 0x2804, 0xac68,
-       0x2900, 0x0079, 0x168b, 0x16ca, 0x16ab, 0x16ab, 0x16ca, 0x16ca,
-       0x16c2, 0x16ca, 0x16ab, 0x16ca, 0x16b1, 0x16b1, 0x16ca, 0x16ca,
-       0x16ca, 0x16ca, 0x16b1, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c,
-       0x6c20, 0x0d7e, 0xd99c, 0x0040, 0x16cd, 0x2804, 0xac68, 0x6f08,
-       0x6e0c, 0x0078, 0x16cd, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078,
-       0x16cd, 0x7b0c, 0xd3bc, 0x0040, 0x16ba, 0x7b08, 0xa39c, 0x0fff,
-       0x0078, 0x16bb, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c,
-       0x0078, 0x16cd, 0x0d7f, 0x1078, 0x1a3f, 0x00c0, 0x167c, 0xa00e,
-       0x0078, 0x16e0, 0x0d7f, 0x1078, 0x12b7, 0x7b22, 0x7a26, 0x7d32,
+       0x1509, 0x1511, 0x1557, 0x1511, 0x1511, 0x1511, 0x153c, 0x1520,
+       0x1515, 0xa085, 0x0001, 0x0078, 0x1571, 0x684c, 0xd0bc, 0x0040,
+       0x1511, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x0078, 0x155f,
+       0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x1511, 0x684c, 0xd0bc,
+       0x0040, 0x1511, 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a,
+       0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004,
+       0x6832, 0x6858, 0x0078, 0x1567, 0xa18c, 0x00ff, 0xa186, 0x0015,
+       0x00c0, 0x1511, 0x684c, 0xd0ac, 0x0040, 0x1511, 0x6804, 0x681a,
+       0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004,
+       0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, 0x1567, 0x684c,
+       0xd0ac, 0x0040, 0x1511, 0xa006, 0x682e, 0x682a, 0x6858, 0xa18c,
+       0x000f, 0xa188, 0x1c84, 0x210c, 0x6932, 0x2d08, 0x691a, 0x6826,
+       0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, 0x6912, 0x6980,
+       0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, 0x020a,
+       0x2004, 0x82ff, 0x0040, 0x158c, 0xa280, 0x0004, 0x0d7e, 0x206c,
+       0x684c, 0xd0dc, 0x00c0, 0x1588, 0x1078, 0x1504, 0x10c0, 0x12d5,
+       0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, 0x037e, 0x027e,
+       0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, 0xa005, 0x00c0,
+       0x15a0, 0x7206, 0x2001, 0x15b4, 0x007e, 0x2260, 0x0078, 0x16cc,
+       0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182,
+       0x788b, 0x0048, 0x15ad, 0x2009, 0x7870, 0x710e, 0x7000, 0xa005,
+       0x00c0, 0x15b4, 0x1078, 0x16b5, 0x127f, 0x007c, 0x127e, 0x027e,
+       0x037e, 0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f, 0x037f,
+       0x027f, 0x0d7e, 0x0c7e, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e,
+       0xa005, 0x0040, 0x1608, 0x6808, 0xa005, 0x0040, 0x166e, 0x7000,
+       0xa005, 0x00c0, 0x15d5, 0x0078, 0x1602, 0x700c, 0x7110, 0xa106,
+       0x00c0, 0x1672, 0x7004, 0xa406, 0x00c0, 0x1602, 0x2001, 0x0005,
+       0x2004, 0xd08c, 0x0040, 0x15eb, 0x047e, 0x1078, 0x178d, 0x047f,
+       0x2460, 0x0078, 0x15cb, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0,
+       0x15de, 0x7804, 0xa084, 0x6000, 0x0040, 0x15fc, 0xa086, 0x6000,
+       0x0040, 0x15fc, 0x0078, 0x15de, 0x7803, 0x0004, 0x7003, 0x0000,
+       0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5c29, 0x0078, 0x1672,
+       0x6808, 0xa005, 0x0040, 0x166e, 0x7000, 0xa005, 0x00c0, 0x1612,
+       0x0078, 0x166e, 0x700c, 0x7110, 0xa106, 0x00c0, 0x161b, 0x7004,
+       0xa406, 0x00c0, 0x166e, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040,
+       0x1628, 0x047e, 0x1078, 0x178d, 0x047f, 0x2460, 0x0078, 0x1608,
+       0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x161b, 0x2001, 0x0005,
+       0x2004, 0xd08c, 0x00c0, 0x1621, 0x7804, 0xa084, 0x6000, 0x0040,
+       0x163f, 0xa086, 0x6000, 0x0040, 0x163f, 0x0078, 0x161b, 0x7007,
+       0x0000, 0xa016, 0x2218, 0x7000, 0xa08e, 0x0001, 0x0040, 0x1660,
+       0xa08e, 0x0002, 0x00c0, 0x166e, 0x0c7e, 0x0e7e, 0x6818, 0x2060,
+       0x1078, 0x1c59, 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0, 0x165c,
+       0x7308, 0x720c, 0x0078, 0x165e, 0x7310, 0x7214, 0x0e7f, 0x0c7f,
+       0x7820, 0xa318, 0x7824, 0xa211, 0x6810, 0xa300, 0x6812, 0x6814,
+       0xa201, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x2009, 0x0048,
+       0x1078, 0x5c29, 0x0c7f, 0x0d7f, 0x127f, 0x007c, 0x0f7e, 0x0e7e,
+       0x2071, 0x786a, 0x7000, 0xa086, 0x0000, 0x0040, 0x16b2, 0x7004,
+       0xac06, 0x00c0, 0x16a3, 0x2079, 0x0030, 0x7804, 0xd0fc, 0x00c0,
+       0x169f, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x1685, 0x7803,
+       0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1691, 0x7803, 0x0002, 0x7803,
+       0x0009, 0x7003, 0x0003, 0x7007, 0x0000, 0x0078, 0x16a3, 0x1078,
+       0x178d, 0x0078, 0x167a, 0x157e, 0x20a9, 0x0009, 0x2009, 0x7870,
+       0x2104, 0xac06, 0x00c0, 0x16ad, 0x200a, 0xa188, 0x0003, 0x00f0,
+       0x16a8, 0x157f, 0x0e7f, 0x0f7f, 0x007c, 0x700c, 0x7110, 0xa106,
+       0x00c0, 0x16bd, 0x7003, 0x0000, 0x007c, 0x2104, 0x7006, 0x2060,
+       0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0x788b, 0x0048,
+       0x16cb, 0x2009, 0x7870, 0x7112, 0x8cff, 0x00c0, 0x16d3, 0x1078,
+       0x1958, 0x0078, 0x16fa, 0x6010, 0x2068, 0x2d58, 0x6828, 0xa406,
+       0x00c0, 0x16de, 0x682c, 0xa306, 0x0040, 0x16e2, 0x1078, 0x1ca4,
+       0x00c0, 0x16cf, 0x684c, 0xd0f4, 0x00c0, 0x16cf, 0x6824, 0x2050,
+       0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009,
+       0x0011, 0x1078, 0x16fb, 0x0040, 0x16f9, 0x2009, 0x0001, 0x1078,
+       0x16fb, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x1788, 0xa03e, 0x2730,
+       0x6850, 0xd0fc, 0x00c0, 0x171a, 0x0d7e, 0x2804, 0xac68, 0x2900,
+       0x0079, 0x170a, 0x176a, 0x172a, 0x172a, 0x176a, 0x176a, 0x1762,
+       0x176a, 0x172a, 0x176a, 0x1730, 0x1730, 0x176a, 0x176a, 0x176a,
+       0x1759, 0x1730, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20,
+       0x0d7e, 0xd99c, 0x0040, 0x176d, 0x2804, 0xac68, 0x6f08, 0x6e0c,
+       0x0078, 0x176d, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x176d,
+       0x7b0c, 0xd3bc, 0x0040, 0x1751, 0x7004, 0x0e7e, 0x2070, 0x701c,
+       0x0e7f, 0xa086, 0x0008, 0x00c0, 0x1751, 0x7b08, 0xa39c, 0x0fff,
+       0x2d20, 0x0d7f, 0x0d7e, 0x6a14, 0x82ff, 0x00c0, 0x174c, 0x6810,
+       0xa302, 0x0048, 0x174c, 0x6b10, 0x2011, 0x0000, 0x2468, 0x0078,
+       0x1753, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078,
+       0x176d, 0x0d7f, 0x0d7e, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e,
+       0x00c0, 0x176a, 0x0d7f, 0x1078, 0x1c40, 0x00c0, 0x16fb, 0xa00e,
+       0x0078, 0x1788, 0x0d7f, 0x1078, 0x12d5, 0x7b22, 0x7a26, 0x7d32,
        0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x0d7f,
-       0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x1078, 0x1a3f,
-       0x007c, 0x1078, 0x12b7, 0x1078, 0x12b7, 0x127e, 0x2091, 0x2100,
+       0x6828, 0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x2300, 0x6b10,
+       0xa302, 0x6812, 0x2200, 0x6a14, 0xa203, 0x6816, 0x1078, 0x1c40,
+       0x007c, 0x1078, 0x12d5, 0x1078, 0x12d5, 0x127e, 0x2091, 0x2100,
        0x007e, 0x017e, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002,
-       0xa184, 0x0700, 0x00c0, 0x16e3, 0xa184, 0x0003, 0xa086, 0x0003,
-       0x0040, 0x16e3, 0x7000, 0x0079, 0x16fd, 0x1701, 0x1703, 0x1779,
-       0x17c0, 0x1078, 0x12b7, 0x8001, 0x7002, 0xa184, 0x0880, 0x00c0,
-       0x1718, 0x8aff, 0x0040, 0x175b, 0x2009, 0x0001, 0x1078, 0x167c,
-       0x0040, 0x17d3, 0x2009, 0x0001, 0x1078, 0x167c, 0x0078, 0x17d3,
-       0x7803, 0x0004, 0x7003, 0x0000, 0xd1dc, 0x0040, 0x1751, 0x027e,
-       0x037e, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, 0x7824, 0x6872,
-       0xa213, 0x6b2a, 0x6a2e, 0x037f, 0x027f, 0x7830, 0x681e, 0x7834,
-       0x6822, 0x1078, 0x1a58, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800,
-       0x6832, 0x7003, 0x0000, 0x6850, 0xc0fd, 0x6852, 0x6808, 0x8001,
-       0x680a, 0x00c0, 0x174d, 0x684c, 0xd0e4, 0x0040, 0x174d, 0x7004,
-       0x2060, 0x2009, 0x0048, 0x1078, 0x5591, 0x1078, 0x1638, 0x0078,
-       0x17d3, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x1758, 0x1078, 0x6c41,
-       0x057f, 0x0078, 0x1773, 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005,
-       0x00c0, 0x1773, 0x7003, 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0,
-       0x176f, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x5591, 0x1078,
-       0x1638, 0x0078, 0x17d3, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078,
-       0x17d3, 0x8001, 0x7002, 0xd194, 0x0040, 0x178b, 0x7804, 0xd0fc,
-       0x00c0, 0x16ed, 0x8aff, 0x0040, 0x17d3, 0x2009, 0x0001, 0x1078,
-       0x167c, 0x0078, 0x17d3, 0xa184, 0x0880, 0x00c0, 0x1798, 0x8aff,
-       0x0040, 0x17d3, 0x2009, 0x0001, 0x1078, 0x167c, 0x0078, 0x17d3,
-       0x7803, 0x0004, 0x7003, 0x0000, 0xd1dc, 0x0040, 0x17b9, 0x027e,
-       0x037e, 0x6b28, 0x6a2c, 0x1078, 0x1a58, 0x0d7e, 0x2804, 0xac68,
-       0x6034, 0xd09c, 0x00c0, 0x17b2, 0x6808, 0xa31a, 0x680c, 0xa213,
-       0x0078, 0x17b6, 0x6810, 0xa31a, 0x6814, 0xa213, 0x0d7f, 0x0078,
-       0x1723, 0x057e, 0x7d0c, 0x1078, 0x6c41, 0x057f, 0x0078, 0x1773,
-       0x7003, 0x0000, 0x7004, 0xa00d, 0x0040, 0x17d1, 0x6808, 0x8001,
-       0x680a, 0x00c0, 0x17d1, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078,
-       0x5591, 0x1078, 0x1638, 0x017f, 0x007f, 0x127f, 0x007c, 0x0e7e,
-       0x2071, 0x6f63, 0x7003, 0x0000, 0x0e7f, 0x007c, 0x0d7e, 0xa280,
-       0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1836, 0x6934, 0xa184,
-       0x0007, 0x0079, 0x17eb, 0x17f3, 0x1821, 0x17f3, 0x17f3, 0x17f3,
-       0x1806, 0x17f3, 0x17f5, 0x1078, 0x12b7, 0x684c, 0xd0b4, 0x0040,
-       0x192f, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c,
-       0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1829, 0xa18c, 0x00ff,
-       0xa186, 0x0015, 0x00c0, 0x1836, 0x684c, 0xd0b4, 0x0040, 0x192f,
-       0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080,
-       0x1a82, 0x2004, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0078,
-       0x1832, 0x684c, 0xd0b4, 0x0040, 0x16e1, 0x6958, 0xa006, 0x682e,
-       0x682a, 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x1a82,
-       0x2004, 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c,
-       0x0f7e, 0x2079, 0x0020, 0x7804, 0xd0fc, 0x10c0, 0x1933, 0x0e7e,
-       0x0d7e, 0x2071, 0x6f63, 0x7000, 0xa005, 0x00c0, 0x18b2, 0x0c7e,
-       0x7206, 0xa280, 0x0004, 0x205c, 0x7004, 0x2068, 0x6818, 0x0d7e,
-       0x2068, 0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, 0x9040, 0x2079,
-       0x0200, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x0f7f, 0x0d7f,
-       0x2b68, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034,
-       0xa0cc, 0x000f, 0x6908, 0xa184, 0x0007, 0x0040, 0x1874, 0x017e,
-       0x2009, 0x0008, 0xa102, 0x017f, 0xa108, 0x791a, 0x7116, 0x701e,
-       0x680c, 0xa081, 0x0000, 0x781e, 0x701a, 0xa006, 0x700e, 0x7012,
-       0x7004, 0x692c, 0x6814, 0xa106, 0x00c0, 0x188b, 0x6928, 0x6810,
-       0xa106, 0x0040, 0x1898, 0x037e, 0x047e, 0x6b14, 0x6c10, 0x1078,
-       0x1aa2, 0x047f, 0x037f, 0x0040, 0x1898, 0x0c7f, 0x0078, 0x18b2,
-       0x8aff, 0x00c0, 0x18a0, 0x0c7f, 0xa085, 0x0001, 0x0078, 0x18b2,
-       0x127e, 0x2091, 0x8000, 0x2079, 0x0020, 0x2009, 0x0001, 0x1078,
-       0x18b6, 0x0040, 0x18af, 0x2009, 0x0001, 0x1078, 0x18b6, 0x127f,
-       0x0c7f, 0xa006, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, 0x067e,
-       0x057e, 0x047e, 0x037e, 0x027e, 0x8aff, 0x0040, 0x1928, 0x700c,
-       0x7214, 0xa202, 0x7010, 0x7218, 0xa203, 0x0048, 0x1927, 0xa03e,
-       0x2730, 0x6850, 0xd0fc, 0x00c0, 0x18e3, 0x0d7e, 0x2804, 0xac68,
-       0x2900, 0x0079, 0x18d3, 0x1909, 0x18f3, 0x18f3, 0x1909, 0x1909,
-       0x1901, 0x1909, 0x18f3, 0x1909, 0x18f9, 0x18f9, 0x1909, 0x1909,
-       0x1909, 0x1909, 0x18f9, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c,
-       0x6c20, 0xd99c, 0x0040, 0x190d, 0x0d7e, 0x2804, 0xac68, 0x6f08,
-       0x6e0c, 0x0078, 0x190c, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, 0x0078,
-       0x190c, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0078,
-       0x190c, 0x0d7f, 0x1078, 0x1a3f, 0x00c0, 0x18bc, 0xa00e, 0x0078,
-       0x1928, 0x0d7f, 0x1078, 0x12b7, 0x0d7f, 0x7b22, 0x7a26, 0x7d32,
-       0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x6828,
-       0xa300, 0x682a, 0x682c, 0xa201, 0x682e, 0x700c, 0xa300, 0x700e,
-       0x7010, 0xa201, 0x7012, 0x1078, 0x1a3f, 0x0078, 0x1928, 0xa006,
-       0x027f, 0x037f, 0x047f, 0x057f, 0x067f, 0x077f, 0x007c, 0x1078,
-       0x12b7, 0x1078, 0x12b7, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e,
-       0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, 0x2071, 0x6f63,
-       0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700,
-       0x00c0, 0x1931, 0x7000, 0x0079, 0x194d, 0x1a09, 0x1951, 0x19d6,
-       0x1a07, 0x8001, 0x7002, 0xd19c, 0x00c0, 0x1965, 0x8aff, 0x0040,
-       0x199a, 0x2009, 0x0001, 0x1078, 0x18b6, 0x0040, 0x1a09, 0x2009,
-       0x0001, 0x1078, 0x18b6, 0x0078, 0x1a09, 0x7803, 0x0004, 0xd194,
-       0x0040, 0x1975, 0x6850, 0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1990,
-       0x684c, 0xc0f5, 0x684e, 0x0078, 0x1990, 0x027e, 0x037e, 0x6b28,
-       0x6a2c, 0x701c, 0xa005, 0x10c0, 0x1a11, 0x7820, 0x686e, 0xa31a,
-       0x7824, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x037f, 0x027f, 0x7830,
-       0x681e, 0x7834, 0x6822, 0x1078, 0x1a58, 0x6850, 0xc0fd, 0x6852,
-       0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000,
-       0x0078, 0x1a09, 0x711c, 0x81ff, 0x0040, 0x19af, 0x7922, 0x7827,
+       0xa184, 0x0700, 0x00c0, 0x178b, 0xa184, 0x0003, 0xa086, 0x0003,
+       0x0040, 0x178b, 0x7000, 0x0079, 0x17a5, 0x17ad, 0x17af, 0x1887,
+       0x18ef, 0x1906, 0x17ad, 0x17ad, 0x17ad, 0x1078, 0x12d5, 0x8001,
+       0x7002, 0xa184, 0x0880, 0x00c0, 0x17c4, 0x8aff, 0x0040, 0x1827,
+       0x2009, 0x0001, 0x1078, 0x16fb, 0x0040, 0x1918, 0x2009, 0x0001,
+       0x1078, 0x16fb, 0x0078, 0x1918, 0x7803, 0x0004, 0x7003, 0x0000,
+       0xd1bc, 0x00c0, 0x180f, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x7820,
+       0x686e, 0xa31a, 0x7824, 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x7820,
+       0x6910, 0xa100, 0x6812, 0x7824, 0x6914, 0xa101, 0x6816, 0x037f,
+       0x027f, 0x7830, 0x681e, 0x7834, 0x6822, 0x1078, 0x1c59, 0x2a00,
+       0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x6850,
+       0xc0fd, 0x6852, 0x6808, 0x8001, 0x680a, 0x00c0, 0x1801, 0x684c,
+       0xd0e4, 0x0040, 0x1801, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078,
+       0x5c29, 0x7808, 0xd0ec, 0x00c0, 0x180b, 0x7803, 0x0009, 0x7003,
+       0x0004, 0x0078, 0x1918, 0x1078, 0x16b5, 0x0078, 0x1918, 0x057e,
+       0x7d0c, 0xd5bc, 0x00c0, 0x1816, 0x1078, 0x7592, 0x057f, 0x1078,
+       0x191c, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
+       0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1918, 0x684c,
+       0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x183f, 0x7003, 0x0000,
+       0x6808, 0x8001, 0x680a, 0x00c0, 0x183b, 0x7004, 0x2060, 0x2009,
+       0x0048, 0x1078, 0x5c29, 0x1078, 0x16b5, 0x0078, 0x1918, 0x7814,
+       0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000, 0x6816, 0x7814,
+       0x7908, 0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214,
+       0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b,
+       0x1078, 0x1983, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001,
+       0x7804, 0xd0fc, 0x0040, 0x1860, 0x7803, 0x0002, 0x7803, 0x0004,
+       0x780f, 0x0070, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048,
+       0x1078, 0x5c29, 0x1078, 0x19a6, 0x0040, 0x183b, 0x7908, 0xd1ec,
+       0x00c0, 0x187e, 0x2009, 0x0009, 0x0078, 0x1880, 0x2009, 0x0019,
+       0x7902, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1918, 0x8001,
+       0x7002, 0xd194, 0x0040, 0x1899, 0x7804, 0xd0fc, 0x00c0, 0x1795,
+       0x8aff, 0x0040, 0x1918, 0x2009, 0x0001, 0x1078, 0x16fb, 0x0078,
+       0x1918, 0xa184, 0x0880, 0x00c0, 0x18a6, 0x8aff, 0x0040, 0x1918,
+       0x2009, 0x0001, 0x1078, 0x16fb, 0x0078, 0x1918, 0x7803, 0x0004,
+       0x7003, 0x0000, 0xd1bc, 0x00c0, 0x18da, 0x027e, 0x037e, 0x6b28,
+       0x6a2c, 0x1078, 0x1c59, 0x0d7e, 0x0f7e, 0x2d78, 0x2804, 0xac68,
+       0x6034, 0xd09c, 0x00c0, 0x18ca, 0x6808, 0x2008, 0xa31a, 0x680c,
+       0xa213, 0x7810, 0xa100, 0x7812, 0x690c, 0x7814, 0xa101, 0x7816,
+       0x0078, 0x18d6, 0x6810, 0x2008, 0xa31a, 0x6814, 0xa213, 0x7810,
+       0xa100, 0x7812, 0x6914, 0x7814, 0xa101, 0x7816, 0x0f7f, 0x0d7f,
+       0x0078, 0x17cf, 0x057e, 0x7d0c, 0x1078, 0x7592, 0x057f, 0x1078,
+       0x191c, 0x682b, 0xffff, 0x682f, 0xffff, 0x697c, 0x6912, 0x6980,
+       0x6916, 0x7803, 0x0009, 0x7003, 0x0003, 0x0078, 0x1918, 0x7803,
+       0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0040, 0x1902, 0x6808,
+       0x8001, 0x680a, 0x00c0, 0x1902, 0x7004, 0x2060, 0x2009, 0x0048,
+       0x1078, 0x5c29, 0x1078, 0x16b5, 0x0078, 0x1918, 0x7803, 0x0004,
+       0x7003, 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0040, 0x1902,
+       0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x1078, 0x16cc,
+       0x017f, 0x007f, 0x127f, 0x007c, 0x1078, 0x192d, 0x20e1, 0x9028,
+       0x700f, 0x7870, 0x7013, 0x7870, 0x2001, 0x015d, 0x200c, 0x810a,
+       0x2102, 0x2001, 0x0138, 0x2202, 0x007c, 0x2001, 0x0138, 0x2014,
+       0x2003, 0x0000, 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc,
+       0x00c0, 0x194a, 0x2001, 0x0109, 0x201c, 0xa39c, 0x0048, 0x00c0,
+       0x194a, 0x2001, 0x0111, 0x201c, 0x83ff, 0x00c0, 0x194a, 0x8421,
+       0x00c0, 0x1934, 0x007c, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204,
+       0xa005, 0x00c0, 0x1957, 0x8109, 0x00c0, 0x194f, 0x007c, 0x007c,
+       0x1078, 0x194b, 0x0040, 0x1980, 0x7908, 0xd1ec, 0x00c0, 0x1970,
+       0x1078, 0x19a6, 0x0040, 0x1970, 0x7803, 0x0009, 0x7904, 0xd1fc,
+       0x0040, 0x1966, 0x7803, 0x0006, 0x1078, 0x194b, 0x0040, 0x1980,
+       0x780c, 0xd0a4, 0x00c0, 0x1980, 0x7007, 0x0000, 0x1078, 0x19a6,
+       0x0040, 0x1982, 0x7803, 0x0019, 0x7003, 0x0003, 0x0078, 0x1982,
+       0x1078, 0x191c, 0x007c, 0x3c00, 0x007e, 0x0e7e, 0x2071, 0x0200,
+       0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x192d, 0x20e1, 0x7000,
+       0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f,
+       0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001,
+       0x0138, 0x2202, 0x0e7f, 0x007f, 0x20e0, 0x007c, 0x3c00, 0x007e,
+       0x7908, 0xa18c, 0x0fff, 0xa182, 0x0009, 0x0048, 0x19b3, 0xa085,
+       0x0001, 0x0078, 0x19c5, 0x2001, 0x020a, 0x81ff, 0x0040, 0x19be,
+       0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x20e1, 0x7000,
+       0x200c, 0x200c, 0x7003, 0x0000, 0xa006, 0x007f, 0x20e0, 0x007c,
+       0x0e7e, 0x2071, 0x788b, 0x7003, 0x0000, 0x0e7f, 0x007c, 0x0d7e,
+       0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x00c0, 0x1a4a, 0x6934,
+       0xa184, 0x0007, 0x0079, 0x19dc, 0x19e4, 0x1a35, 0x19e4, 0x19e4,
+       0x19e4, 0x1a1a, 0x19f7, 0x19e6, 0x1078, 0x12d5, 0x684c, 0xd0b4,
+       0x0040, 0x1b4c, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
+       0x687c, 0x680a, 0x6880, 0x680e, 0x6958, 0x0078, 0x1a3d, 0x6834,
+       0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x19e4, 0x684c, 0xd0b4,
+       0x0040, 0x1b4c, 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812,
+       0x687c, 0x680a, 0x6880, 0x680e, 0x6804, 0x681a, 0xa080, 0x000d,
+       0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004, 0x6832, 0x6958,
+       0x0078, 0x1a46, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x00c0, 0x1a4a,
+       0x684c, 0xd0b4, 0x0040, 0x1b4c, 0x6804, 0x681a, 0xa080, 0x000d,
+       0x2004, 0xa084, 0x000f, 0xa080, 0x1c84, 0x2004, 0x6832, 0x6958,
+       0xa006, 0x682e, 0x682a, 0x0078, 0x1a46, 0x684c, 0xd0b4, 0x0040,
+       0x1789, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, 0x681a, 0x6834,
+       0xa084, 0x000f, 0xa080, 0x1c84, 0x2004, 0x6832, 0x6926, 0x684c,
+       0xc0dd, 0x684e, 0x0d7f, 0x007c, 0x0f7e, 0x2079, 0x0020, 0x7804,
+       0xd0fc, 0x10c0, 0x1b50, 0x0e7e, 0x0d7e, 0x2071, 0x788b, 0x7000,
+       0xa005, 0x00c0, 0x1ac6, 0x0c7e, 0x7206, 0xa280, 0x0004, 0x205c,
+       0x7004, 0x2068, 0x6818, 0x0d7e, 0x2068, 0x686c, 0x7812, 0x6890,
+       0x0f7e, 0x20e1, 0x9040, 0x2079, 0x0200, 0x781a, 0x2079, 0x0100,
+       0x8004, 0x78d6, 0x0f7f, 0x0d7f, 0x2b68, 0x6824, 0x2050, 0x6818,
+       0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, 0x6908, 0xa184,
+       0x0007, 0x0040, 0x1a88, 0x017e, 0x2009, 0x0008, 0xa102, 0x017f,
+       0xa108, 0x791a, 0x7116, 0x701e, 0x680c, 0xa081, 0x0000, 0x781e,
+       0x701a, 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, 0x6814, 0xa106,
+       0x00c0, 0x1a9f, 0x6928, 0x6810, 0xa106, 0x0040, 0x1aac, 0x037e,
+       0x047e, 0x6b14, 0x6c10, 0x1078, 0x1ca4, 0x047f, 0x037f, 0x0040,
+       0x1aac, 0x0c7f, 0x0078, 0x1ac6, 0x8aff, 0x00c0, 0x1ab4, 0x0c7f,
+       0xa085, 0x0001, 0x0078, 0x1ac6, 0x127e, 0x2091, 0x8000, 0x2079,
+       0x0020, 0x2009, 0x0001, 0x1078, 0x1aca, 0x0040, 0x1ac3, 0x2009,
+       0x0001, 0x1078, 0x1aca, 0x127f, 0x0c7f, 0xa006, 0x0d7f, 0x0e7f,
+       0x0f7f, 0x007c, 0x077e, 0x067e, 0x057e, 0x047e, 0x037e, 0x027e,
+       0x8aff, 0x0040, 0x1b45, 0x700c, 0x7214, 0xa202, 0x7010, 0x7218,
+       0xa203, 0x0048, 0x1b44, 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0,
+       0x1af7, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1ae7, 0x1b26,
+       0x1b07, 0x1b07, 0x1b26, 0x1b26, 0x1b1e, 0x1b26, 0x1b07, 0x1b26,
+       0x1b0d, 0x1b0d, 0x1b26, 0x1b26, 0x1b26, 0x1b15, 0x1b0d, 0xc0fc,
+       0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1b2a,
+       0x0d7e, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x1b29, 0x6b08,
+       0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x1b29, 0x6b10, 0x6a14, 0x6d00,
+       0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x1b29, 0x0d7f, 0x0d7e, 0x6834,
+       0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1b26, 0x0d7f, 0x1078,
+       0x1c40, 0x00c0, 0x1ad0, 0xa00e, 0x0078, 0x1b45, 0x0d7f, 0x1078,
+       0x12d5, 0x0d7f, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e,
+       0x7902, 0x7000, 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c,
+       0xa201, 0x682e, 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012,
+       0x1078, 0x1c40, 0x0078, 0x1b45, 0xa006, 0x027f, 0x037f, 0x047f,
+       0x057f, 0x067f, 0x077f, 0x007c, 0x1078, 0x12d5, 0x1078, 0x12d5,
+       0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x0f7e, 0x0e7e, 0x0d7e,
+       0x0c7e, 0x2079, 0x0020, 0x2071, 0x788b, 0x2b68, 0x6818, 0x2060,
+       0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0, 0x1b4e, 0x7000,
+       0x0079, 0x1b6a, 0x1c11, 0x1b6e, 0x1bde, 0x1c0f, 0x8001, 0x7002,
+       0xd19c, 0x00c0, 0x1b82, 0x8aff, 0x0040, 0x1ba1, 0x2009, 0x0001,
+       0x1078, 0x1aca, 0x0040, 0x1c11, 0x2009, 0x0001, 0x1078, 0x1aca,
+       0x0078, 0x1c11, 0x7803, 0x0004, 0xd194, 0x0040, 0x1b92, 0x6850,
+       0xc0fc, 0x6852, 0x8aff, 0x00c0, 0x1b97, 0x684c, 0xc0f5, 0x684e,
+       0x0078, 0x1b97, 0x1078, 0x1c59, 0x6850, 0xc0fd, 0x6852, 0x2a00,
+       0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0078,
+       0x1c11, 0x711c, 0x81ff, 0x0040, 0x1bb7, 0x7918, 0x7922, 0x7827,
        0x0000, 0x7803, 0x0001, 0x7000, 0x8000, 0x7002, 0x700c, 0xa100,
-       0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078, 0x1a09, 0x0f7e,
+       0x700e, 0x7010, 0xa081, 0x0000, 0x7012, 0x0078, 0x1c11, 0x0f7e,
        0x027e, 0x781c, 0x007e, 0x7818, 0x007e, 0x2079, 0x0100, 0x7a14,
        0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x7820, 0xd0bc, 0x00c0,
-       0x19bd, 0x79c8, 0x007f, 0xa102, 0x78ca, 0x79c4, 0x007f, 0xa102,
+       0x1bc5, 0x79c8, 0x007f, 0xa102, 0x78ca, 0x79c4, 0x007f, 0xa102,
        0x78c6, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f,
-       0x7803, 0x0008, 0x7003, 0x0000, 0x0078, 0x1a09, 0x8001, 0x7002,
-       0xd194, 0x0040, 0x19eb, 0x7804, 0xd0fc, 0x00c0, 0x1943, 0xd19c,
-       0x00c0, 0x1a05, 0x8aff, 0x0040, 0x1a09, 0x2009, 0x0001, 0x1078,
-       0x18b6, 0x0078, 0x1a09, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078,
-       0x1a58, 0x0d7e, 0x2804, 0xac68, 0x6034, 0xd09c, 0x00c0, 0x19fe,
-       0x6808, 0xa31a, 0x680c, 0xa213, 0x0078, 0x1a02, 0x6810, 0xa31a,
-       0x6814, 0xa213, 0x0d7f, 0x0078, 0x1979, 0x0078, 0x1975, 0x1078,
-       0x12b7, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f,
-       0x007c, 0x7920, 0xa108, 0x7922, 0x7924, 0xa189, 0x0000, 0x7926,
-       0x7930, 0xa10a, 0x7932, 0x7934, 0xa18b, 0x0000, 0x7936, 0x007c,
-       0x0f7e, 0x0e7e, 0x2071, 0x6f63, 0x7000, 0xa086, 0x0000, 0x0040,
-       0x1a3c, 0x2079, 0x0020, 0x7804, 0xa084, 0x0003, 0x0040, 0x1a36,
-       0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1a32, 0x20e1, 0x9040,
-       0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x0f7f, 0x007c, 0x8840,
-       0x2804, 0xa005, 0x00c0, 0x1a53, 0x6004, 0xa005, 0x0040, 0x1a55,
-       0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x1a82, 0x2044,
-       0x88ff, 0x1040, 0x12b7, 0x8a51, 0x007c, 0x2051, 0x0000, 0x007c,
-       0x8a50, 0x8841, 0x2804, 0xa005, 0x00c0, 0x1a72, 0x2c00, 0xad06,
-       0x0040, 0x1a67, 0x6000, 0xa005, 0x00c0, 0x1a67, 0x2d00, 0x2060,
-       0x681a, 0x6034, 0xa084, 0x000f, 0xa080, 0x1a92, 0x2044, 0x88ff,
-       0x1040, 0x12b7, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019, 0x001d,
-       0x0021, 0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b, 0x0021,
-       0x0027, 0x0000, 0x0000, 0x1a78, 0x1a74, 0x0000, 0x0000, 0x8000,
-       0x0000, 0x1a78, 0x0000, 0x1a7f, 0x1a7c, 0x0000, 0x0000, 0x0000,
-       0x0000, 0x1a7f, 0x0000, 0x1a7a, 0x1a7a, 0x0000, 0x0000, 0x8000,
-       0x0000, 0x1a7a, 0x0000, 0x1a80, 0x1a80, 0x0000, 0x0000, 0x0000,
-       0x0000, 0x1a80, 0x0a7e, 0x097e, 0x087e, 0x6858, 0xa055, 0x0040,
-       0x1b28, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x1a82, 0xa986,
-       0x0007, 0x0040, 0x1ab7, 0xa986, 0x000f, 0x00c0, 0x1abb, 0x605c,
-       0xa422, 0x6060, 0xa31a, 0x2804, 0xa045, 0x00c0, 0x1ac9, 0x0050,
-       0x1ac3, 0x0078, 0x1b28, 0x6004, 0xa065, 0x0040, 0x1b28, 0x0078,
-       0x1aaa, 0x2804, 0xa005, 0x0040, 0x1ae7, 0xac68, 0xd99c, 0x00c0,
-       0x1ad7, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0078, 0x1adb, 0x6810,
-       0xa422, 0x6814, 0xa31b, 0x0048, 0x1af5, 0x2300, 0xa405, 0x0040,
-       0x1aed, 0x8a51, 0x0040, 0x1b28, 0x8840, 0x0078, 0x1ac9, 0x6004,
-       0xa065, 0x0040, 0x1b28, 0x0078, 0x1aaa, 0x8a51, 0x8840, 0x2b68,
-       0x6850, 0xc0fc, 0x6852, 0x0078, 0x1b22, 0x8422, 0x8420, 0x831a,
-       0xa399, 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c,
-       0x00c0, 0x1b10, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b,
-       0x1048, 0x12b7, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x1b1c,
-       0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x12b7,
-       0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850,
-       0xc0fd, 0x6852, 0x007f, 0x007f, 0x007f, 0xa006, 0x0078, 0x1b2d,
-       0x087f, 0x097f, 0x0a7f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0005,
-       0x2004, 0xa084, 0x0007, 0x0079, 0x1b35, 0x1b3d, 0x1b3e, 0x1b41,
-       0x1b44, 0x1b49, 0x1b4c, 0x1b51, 0x1b56, 0x007c, 0x1078, 0x1933,
-       0x007c, 0x1078, 0x16e5, 0x007c, 0x1078, 0x16e5, 0x1078, 0x1933,
-       0x007c, 0x1078, 0x143e, 0x007c, 0x1078, 0x1933, 0x1078, 0x143e,
-       0x007c, 0x1078, 0x16e5, 0x1078, 0x143e, 0x007c, 0x1078, 0x16e5,
-       0x1078, 0x1933, 0x1078, 0x143e, 0x007c, 0x127e, 0x2091, 0x2300,
-       0x2079, 0x0200, 0x2071, 0x7280, 0x2069, 0x6d00, 0x2009, 0x0004,
-       0x7912, 0x7916, 0x1078, 0x1df6, 0x781b, 0x0002, 0x20e1, 0x8700,
-       0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007,
-       0x0079, 0x1b7a, 0x1b9e, 0x1b82, 0x1b86, 0x1b8a, 0x1b90, 0x1b94,
-       0x1b98, 0x1b9c, 0x1078, 0x3d7c, 0x0078, 0x1b9e, 0x1078, 0x3db0,
-       0x0078, 0x1b9e, 0x1078, 0x3d7c, 0x1078, 0x3db0, 0x0078, 0x1b9e,
-       0x1078, 0x1ba0, 0x0078, 0x1b9e, 0x1078, 0x1ba0, 0x0078, 0x1b9e,
-       0x1078, 0x1ba0, 0x0078, 0x1b9e, 0x1078, 0x1ba0, 0x127f, 0x007c,
-       0x007e, 0x017e, 0x027e, 0x7930, 0xa184, 0x0003, 0x0040, 0x1baa,
-       0x1078, 0x12b7, 0xa184, 0x0030, 0x0040, 0x1bbb, 0x6a00, 0xa286,
-       0x0003, 0x00c0, 0x1bb5, 0x1078, 0x12b7, 0x1078, 0x31cb, 0x20e1,
-       0x9010, 0x0078, 0x1bc7, 0xa184, 0x00c0, 0x0040, 0x1bc1, 0x1078,
-       0x12b7, 0xa184, 0x0300, 0x0040, 0x1bc7, 0x20e1, 0x9020, 0x7932,
-       0x027f, 0x017f, 0x007f, 0x007c, 0x017e, 0x0e7e, 0x0f7e, 0x2071,
-       0x6d00, 0x7128, 0x2001, 0x6f03, 0x2102, 0x2001, 0x6f0b, 0x2102,
-       0xa182, 0x0211, 0x00c8, 0x1be0, 0x2009, 0x0008, 0x0078, 0x1c0a,
-       0xa182, 0x0259, 0x00c8, 0x1be8, 0x2009, 0x0007, 0x0078, 0x1c0a,
-       0xa182, 0x02c1, 0x00c8, 0x1bf0, 0x2009, 0x0006, 0x0078, 0x1c0a,
-       0xa182, 0x0349, 0x00c8, 0x1bf8, 0x2009, 0x0005, 0x0078, 0x1c0a,
-       0xa182, 0x0421, 0x00c8, 0x1c00, 0x2009, 0x0004, 0x0078, 0x1c0a,
-       0xa182, 0x0581, 0x00c8, 0x1c08, 0x2009, 0x0003, 0x0078, 0x1c0a,
-       0x2009, 0x0002, 0x2079, 0x0200, 0x7912, 0x7916, 0x1078, 0x1df6,
-       0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x127e, 0x2091, 0x2200, 0x2061,
-       0x0100, 0x2071, 0x6d00, 0x6024, 0x6026, 0x6033, 0x00ef, 0x60e7,
-       0x0000, 0x60eb, 0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043,
-       0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0caf, 0x600f,
-       0x00ff, 0x602b, 0x002f, 0x127f, 0x007c, 0x2001, 0x6d2d, 0x2003,
-       0x0000, 0x2001, 0x6d2c, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091,
-       0x2200, 0x007e, 0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0,
-       0x1c4d, 0xa184, 0x0007, 0x0079, 0x1c53, 0xa195, 0x0004, 0xa284,
-       0x0007, 0x0079, 0x1c53, 0x1c7f, 0x1c5b, 0x1c5f, 0x1c63, 0x1c69,
-       0x1c6d, 0x1c73, 0x1c79, 0x1078, 0x4226, 0x0078, 0x1c7f, 0x1078,
-       0x42e4, 0x0078, 0x1c7f, 0x1078, 0x42e4, 0x1078, 0x4226, 0x0078,
-       0x1c7f, 0x1078, 0x1c84, 0x0078, 0x1c7f, 0x1078, 0x4226, 0x1078,
-       0x1c84, 0x0078, 0x1c7f, 0x1078, 0x42e4, 0x1078, 0x1c84, 0x0078,
-       0x1c7f, 0x1078, 0x42e4, 0x1078, 0x4226, 0x1078, 0x1c84, 0x027f,
-       0x017f, 0x007f, 0x127f, 0x007c, 0xd1ac, 0x0040, 0x1d24, 0x017e,
-       0x047e, 0x0c7e, 0x644c, 0x74ba, 0xa48c, 0xff00, 0xa196, 0xff00,
-       0x0040, 0x1cb3, 0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040,
-       0x1cb3, 0x7130, 0xd18c, 0x00c0, 0x1cb3, 0x2011, 0x6d52, 0x2214,
-       0xd2ec, 0x0040, 0x1ca7, 0xc18d, 0x7132, 0x0078, 0x1cb3, 0x6240,
-       0xa294, 0x0010, 0x0040, 0x1cf2, 0x6248, 0xa294, 0xff00, 0xa296,
-       0xff00, 0x00c0, 0x1cf2, 0x2011, 0x8013, 0x1078, 0x2a53, 0x7130,
-       0xc185, 0x7132, 0x2011, 0x6d52, 0x220c, 0xd1a4, 0x0040, 0x1cda,
-       0x017e, 0x2009, 0x0001, 0x2011, 0x0100, 0x1078, 0x41f4, 0x2019,
-       0x000e, 0x1078, 0x6b8f, 0xa484, 0x00ff, 0xa080, 0x2091, 0x200c,
-       0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x1078,
-       0x6bf7, 0x017f, 0xd1ac, 0x00c0, 0x1ce3, 0x2019, 0x0004, 0x1078,
-       0x202f, 0x0078, 0x1cf2, 0x157e, 0x20a9, 0x007f, 0x2009, 0x0000,
-       0x1078, 0x3447, 0x00c0, 0x1cee, 0x1078, 0x3256, 0x8108, 0x00f0,
-       0x1ce8, 0x157f, 0x0c7f, 0x047f, 0x6043, 0x0000, 0x2009, 0x00f7,
-       0x1078, 0x3233, 0x2011, 0x0003, 0x1078, 0x5232, 0x2011, 0x0002,
-       0x1078, 0x523c, 0x1078, 0x5148, 0x1078, 0x414c, 0x037e, 0x2019,
-       0x0000, 0x1078, 0x51da, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001,
-       0x6d00, 0x2014, 0xa296, 0x0004, 0x00c0, 0x1d1c, 0xd19c, 0x00c0,
-       0x1d1c, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x6d20,
-       0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040, 0x1d9d, 0x017e,
-       0x6220, 0xd2b4, 0x0040, 0x1d5b, 0x1078, 0x414c, 0x1078, 0x4fe5,
-       0x6027, 0x0004, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000,
-       0x0040, 0x1d3e, 0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e,
-       0x2061, 0x6f10, 0x6028, 0xa09a, 0x0002, 0x00c8, 0x1d4e, 0x8000,
-       0x602a, 0x0c7f, 0x1078, 0x4fd7, 0x0078, 0x1d9c, 0x2019, 0x6f19,
-       0x2304, 0xa065, 0x0040, 0x1d58, 0x2009, 0x0014, 0x1078, 0x5591,
-       0x0c7f, 0x0078, 0x1d9c, 0xd2bc, 0x0040, 0x1d9c, 0x1078, 0x415a,
-       0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e, 0x2069, 0x0140, 0x6804,
-       0xa084, 0x4000, 0x0040, 0x1d70, 0x6803, 0x1000, 0x6803, 0x0000,
-       0x0d7f, 0x0c7e, 0x2061, 0x6f10, 0x6044, 0xa09a, 0x0002, 0x00c8,
-       0x1d91, 0x8000, 0x6046, 0x603c, 0x0c7f, 0xa005, 0x0040, 0x1d9c,
-       0x1078, 0x4151, 0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x00c0,
-       0x1d8d, 0x6017, 0x0012, 0x0078, 0x1d9c, 0x6017, 0x0016, 0x0078,
-       0x1d9c, 0x2019, 0x6f1f, 0x2304, 0xa065, 0x0040, 0x1d9b, 0x2009,
-       0x004a, 0x1078, 0x5591, 0x0c7f, 0x017f, 0xd19c, 0x0040, 0x1dc5,
-       0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078, 0x5232,
-       0x2011, 0x0002, 0x1078, 0x523c, 0x1078, 0x5148, 0x1078, 0x414c,
-       0x037e, 0x2019, 0x0000, 0x1078, 0x51da, 0x037f, 0x60e3, 0x0000,
-       0x1078, 0x6c5f, 0x1078, 0x6c7d, 0x2001, 0x6d00, 0x2003, 0x0004,
-       0x6027, 0x0008, 0x1078, 0x11aa, 0x017f, 0xa18c, 0xffd0, 0x6126,
-       0x007c, 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091,
-       0x8000, 0x2071, 0x6d00, 0x71b0, 0x70b2, 0xa116, 0x0040, 0x1def,
-       0x81ff, 0x0040, 0x1de1, 0x2011, 0x8011, 0x1078, 0x2a53, 0x0078,
-       0x1def, 0x2011, 0x8012, 0x1078, 0x2a53, 0x037e, 0x0c7e, 0x2061,
-       0x0100, 0x2019, 0x0028, 0x1078, 0x202f, 0x0c7f, 0x037f, 0x127f,
-       0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e, 0x0f7e,
-       0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x1e09, 0x2204, 0x60f2,
-       0xa190, 0x1e12, 0x2204, 0x60ee, 0x027f, 0x007f, 0x0f7f, 0x0c7f,
-       0x007c, 0x083e, 0x083e, 0x083e, 0x0580, 0x0420, 0x0348, 0x02c0,
-       0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x0140, 0x00f8,
-       0x00d0, 0x00b0, 0x00a0, 0x2028, 0x2130, 0xa094, 0xff00, 0x00c0,
-       0x1e24, 0x81ff, 0x0040, 0x1e28, 0x1078, 0x3f00, 0x0078, 0x1e2f,
-       0xa080, 0x2091, 0x200c, 0xa18c, 0xff00, 0x810f, 0xa006, 0x007c,
-       0xa080, 0x2091, 0x200c, 0xa18c, 0x00ff, 0x007c, 0x1e56, 0x1e5a,
-       0x1e5e, 0x1e64, 0x1e6a, 0x1e70, 0x1e76, 0x1e7e, 0x1e86, 0x1e8c,
-       0x1e92, 0x1e9a, 0x1ea2, 0x1eaa, 0x1eb2, 0x1ebc, 0x1ec6, 0x1ec6,
-       0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6,
-       0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x1ec6, 0x107e, 0x007e,
-       0x0078, 0x1edf, 0x107e, 0x007e, 0x0078, 0x1edf, 0x107e, 0x007e,
-       0x1078, 0x1c3e, 0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e,
-       0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b2e, 0x0078, 0x1edf,
-       0x107e, 0x007e, 0x1078, 0x1b2e, 0x0078, 0x1edf, 0x107e, 0x007e,
-       0x1078, 0x1c3e, 0x1078, 0x1b2e, 0x0078, 0x1edf, 0x107e, 0x007e,
-       0x1078, 0x1c3e, 0x1078, 0x1b2e, 0x0078, 0x1edf, 0x107e, 0x007e,
-       0x1078, 0x1b72, 0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b72,
-       0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e, 0x1078, 0x1b72,
-       0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e, 0x1078, 0x1b72,
-       0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b2e, 0x1078, 0x1b72,
-       0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1b2e, 0x1078, 0x1b72,
-       0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e, 0x1078, 0x1b2e,
-       0x1078, 0x1b72, 0x0078, 0x1edf, 0x107e, 0x007e, 0x1078, 0x1c3e,
-       0x1078, 0x1b2e, 0x1078, 0x1b72, 0x0078, 0x1edf, 0x0005, 0x0078,
-       0x1ec6, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x1ecf, 0x1edf,
-       0x1e5c, 0x1e60, 0x1e66, 0x1e6c, 0x1e72, 0x1e78, 0x1e80, 0x1e88,
-       0x1e8e, 0x1e94, 0x1e9c, 0x1ea4, 0x1eac, 0x1eb4, 0x1ebe, 0x0008,
-       0x1ec9, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e, 0x027e,
-       0x2041, 0x007e, 0x70bc, 0xd09c, 0x0040, 0x1ef0, 0x2041, 0x007f,
-       0x2001, 0x010c, 0x203c, 0x727c, 0x82ff, 0x0040, 0x1f3b, 0x037e,
-       0x738c, 0xa38e, 0xffff, 0x00c0, 0x1eff, 0x2019, 0x0001, 0x8314,
-       0xa2e0, 0x73c0, 0x2c04, 0xa38c, 0x0001, 0x0040, 0x1f0c, 0xa084,
-       0xff00, 0x8007, 0x0078, 0x1f0e, 0xa084, 0x00ff, 0xa70e, 0x0040,
-       0x1f30, 0xa08e, 0x00ff, 0x0040, 0x1f36, 0x2009, 0x0000, 0x1078,
-       0x1e1b, 0x1078, 0x3410, 0x00c0, 0x1f33, 0x6004, 0xa084, 0x00ff,
-       0xa086, 0x0006, 0x00c0, 0x1f2a, 0x1078, 0x1f8d, 0x0040, 0x1f33,
-       0x0078, 0x1f30, 0x1078, 0x208d, 0x1078, 0x1fb4, 0x0040, 0x1f33,
-       0x8318, 0x0078, 0x1eff, 0x738e, 0x0078, 0x1f38, 0x708f, 0xffff,
-       0x037f, 0x0078, 0x1f8a, 0xa780, 0x2091, 0x203c, 0xa7bc, 0xff00,
-       0x873f, 0x708c, 0xa096, 0xffff, 0x0040, 0x1f4d, 0xa812, 0x00c8,
-       0x1f5d, 0x708f, 0xffff, 0x0078, 0x1f87, 0x2009, 0x0000, 0x70bc,
-       0xd09c, 0x0040, 0x1f58, 0xd094, 0x0040, 0x1f58, 0x2009, 0x007e,
-       0x2100, 0xa802, 0x20a8, 0x0078, 0x1f61, 0x2008, 0x2810, 0xa202,
-       0x20a8, 0x2700, 0x157e, 0x017e, 0xa106, 0x0040, 0x1f7e, 0x1078,
-       0x3410, 0x00c0, 0x1f87, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
-       0x00c0, 0x1f78, 0x1078, 0x1f8d, 0x0040, 0x1f87, 0x0078, 0x1f7e,
-       0x1078, 0x208d, 0x1078, 0x1fb4, 0x0040, 0x1f87, 0x017f, 0x8108,
-       0x157f, 0x00f0, 0x1f61, 0x708f, 0xffff, 0x0078, 0x1f8a, 0x017f,
-       0x157f, 0x718e, 0x027f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e,
-       0x0c7e, 0x2c68, 0x1078, 0x5504, 0x0040, 0x1faf, 0x2d00, 0x601a,
-       0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001, 0x0000,
-       0x1078, 0x33f3, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000, 0x708a,
-       0x127f, 0x2009, 0x0004, 0x1078, 0x5591, 0xa085, 0x0001, 0x0c7f,
-       0x0d7f, 0x077f, 0x017f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
-       0x2c68, 0x1078, 0x5504, 0x0040, 0x1fd6, 0x2d00, 0x601a, 0x601f,
-       0x0001, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001, 0x0002, 0x1078,
-       0x33f3, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000, 0x708a, 0x127f,
-       0x2009, 0x0002, 0x1078, 0x5591, 0xa085, 0x0001, 0x0c7f, 0x0d7f,
-       0x077f, 0x017f, 0x007c, 0x0c7e, 0x027e, 0x2009, 0x0080, 0x1078,
-       0x3410, 0x00c0, 0x1fe9, 0x1078, 0x1fec, 0x0040, 0x1fe9, 0x70c3,
-       0xffff, 0x027f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e,
-       0x2c68, 0x1078, 0x5504, 0x0040, 0x200e, 0x2d00, 0x601a, 0x601f,
-       0x0001, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001, 0x0002, 0x1078,
-       0x33f3, 0x127e, 0x2091, 0x8000, 0x70c4, 0x8000, 0x70c6, 0x127f,
-       0x2009, 0x0002, 0x1078, 0x5591, 0xa085, 0x0001, 0x0c7f, 0x0d7f,
-       0x077f, 0x017f, 0x007c, 0x0c7e, 0x0d7e, 0x2009, 0x007f, 0x1078,
-       0x3410, 0x00c0, 0x202c, 0x2c68, 0x1078, 0x5504, 0x0040, 0x202c,
-       0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x2009, 0x0022,
-       0x1078, 0x5591, 0xa085, 0x0001, 0x0d7f, 0x0c7f, 0x007c, 0x0e7e,
-       0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x4463, 0x1078, 0x4417,
-       0x1078, 0x59ce, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078,
-       0x3447, 0x00c0, 0x2047, 0x1078, 0x35cf, 0x1078, 0x3256, 0x017f,
-       0x8108, 0x00f0, 0x203e, 0x027f, 0x037f, 0x067f, 0x0c7f, 0x0e7f,
-       0x007c, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270,
-       0x72a0, 0x027e, 0x2019, 0x0029, 0x1078, 0x445c, 0x1078, 0x43a9,
-       0x2c08, 0x1078, 0x6a57, 0x017f, 0x2e60, 0x1078, 0x35cf, 0x1078,
-       0x3256, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e,
-       0x007e, 0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x2083,
-       0x2071, 0x6d00, 0x7088, 0xa005, 0x0040, 0x2080, 0x8001, 0x708a,
-       0x007f, 0x0e7f, 0x007c, 0x2071, 0x6d00, 0x70c4, 0xa005, 0x0040,
-       0x2080, 0x8001, 0x70c6, 0x0078, 0x2080, 0x6000, 0xc08c, 0x6002,
-       0x007c, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc,
-       0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1,
-       0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6,
-       0x77c5, 0x76c3, 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4,
-       0x72b3, 0x80b2, 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa,
-       0x6ea9, 0x80a7, 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d,
-       0x809b, 0x8098, 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282,
-       0x8081, 0x8080, 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074,
-       0x8073, 0x8072, 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a,
-       0x5b69, 0x8067, 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559,
-       0x8056, 0x8055, 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d,
-       0x804c, 0x804b, 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043,
-       0x803c, 0x803a, 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932,
-       0x4831, 0x802e, 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227,
-       0x8026, 0x8025, 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18,
-       0x8017, 0x8010, 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000,
-       0x8000, 0x3800, 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000,
-       0x8000, 0x3400, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-       0x3300, 0x3200, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-       0x3100, 0x3000, 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00,
-       0x2c00, 0x8000, 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900,
-       0x2800, 0x8000, 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200,
-       0x8000, 0x8000, 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00,
-       0x8000, 0x8000, 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000,
-       0x8000, 0x8000, 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600,
-       0x1500, 0x8000, 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00,
-       0x8000, 0x8000, 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900,
-       0x8000, 0x8000, 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000,
-       0x8000, 0x0500, 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000,
-       0x8000, 0x0100, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-       0x0000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
+       0x7803, 0x0008, 0x7003, 0x0000, 0x0078, 0x1c11, 0x8001, 0x7002,
+       0xd194, 0x0040, 0x1bf3, 0x7804, 0xd0fc, 0x00c0, 0x1b60, 0xd19c,
+       0x00c0, 0x1c0d, 0x8aff, 0x0040, 0x1c11, 0x2009, 0x0001, 0x1078,
+       0x1aca, 0x0078, 0x1c11, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078,
+       0x1c59, 0x0d7e, 0x2804, 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1c06,
+       0x6808, 0xa31a, 0x680c, 0xa213, 0x0078, 0x1c0a, 0x6810, 0xa31a,
+       0x6814, 0xa213, 0x0d7f, 0x0078, 0x1b92, 0x0078, 0x1b92, 0x1078,
+       0x12d5, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f,
+       0x007c, 0x0f7e, 0x0e7e, 0x2071, 0x788b, 0x7000, 0xa086, 0x0000,
+       0x0040, 0x1c3d, 0x2079, 0x0020, 0x20e1, 0x9040, 0x7804, 0xd0fc,
+       0x0040, 0x1c24, 0x1078, 0x1b50, 0x7000, 0xa086, 0x0000, 0x00c0,
+       0x1c24, 0x7803, 0x0004, 0x7804, 0xd0ac, 0x00c0, 0x1c33, 0x20e1,
+       0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x0e7f, 0x0f7f, 0x007c,
+       0x8840, 0x2804, 0xa005, 0x00c0, 0x1c54, 0x6004, 0xa005, 0x0040,
+       0x1c56, 0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x1c84,
+       0x2044, 0x88ff, 0x1040, 0x12d5, 0x8a51, 0x007c, 0x2051, 0x0000,
+       0x007c, 0x8a50, 0x8841, 0x2804, 0xa005, 0x00c0, 0x1c73, 0x2c00,
+       0xad06, 0x0040, 0x1c68, 0x6000, 0xa005, 0x00c0, 0x1c68, 0x2d00,
+       0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080, 0x1c94, 0x2044,
+       0x88ff, 0x1040, 0x12d5, 0x007c, 0x0000, 0x0011, 0x0015, 0x0019,
+       0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f, 0x0015, 0x001b,
+       0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x1c79, 0x1c75, 0x0000,
+       0x0000, 0x1c83, 0x0000, 0x1c79, 0x0000, 0x1c80, 0x1c7d, 0x0000,
+       0x0000, 0x0000, 0x1c83, 0x1c80, 0x0000, 0x1c7b, 0x1c7b, 0x0000,
+       0x0000, 0x1c83, 0x0000, 0x1c7b, 0x0000, 0x1c81, 0x1c81, 0x0000,
+       0x0000, 0x0000, 0x1c83, 0x1c81, 0x0a7e, 0x097e, 0x087e, 0x6858,
+       0xa055, 0x0040, 0x1d45, 0x2d60, 0x6034, 0xa0cc, 0x000f, 0xa9c0,
+       0x1c84, 0xa986, 0x0007, 0x0040, 0x1cbd, 0xa986, 0x000e, 0x0040,
+       0x1cbd, 0xa986, 0x000f, 0x00c0, 0x1cc1, 0x605c, 0xa422, 0x6060,
+       0xa31a, 0x2804, 0xa045, 0x00c0, 0x1ccf, 0x0050, 0x1cc9, 0x0078,
+       0x1d45, 0x6004, 0xa065, 0x0040, 0x1d45, 0x0078, 0x1cac, 0x2804,
+       0xa005, 0x0040, 0x1ced, 0xac68, 0xd99c, 0x00c0, 0x1cdd, 0x6808,
+       0xa422, 0x680c, 0xa31b, 0x0078, 0x1ce1, 0x6810, 0xa422, 0x6814,
+       0xa31b, 0x0048, 0x1d0c, 0x2300, 0xa405, 0x0040, 0x1cf3, 0x8a51,
+       0x0040, 0x1d45, 0x8840, 0x0078, 0x1ccf, 0x6004, 0xa065, 0x0040,
+       0x1d45, 0x0078, 0x1cac, 0x8a51, 0x0040, 0x1d45, 0x8840, 0x2804,
+       0xa005, 0x00c0, 0x1d06, 0x6004, 0xa065, 0x0040, 0x1d45, 0x6034,
+       0xa0cc, 0x000f, 0xa9c0, 0x1c84, 0x2804, 0x2040, 0x2b68, 0x6850,
+       0xc0fc, 0x6852, 0x0078, 0x1d39, 0x8422, 0x8420, 0x831a, 0xa399,
+       0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, 0x0d7f, 0xd99c, 0x00c0,
+       0x1d27, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, 0x1048,
+       0x12d5, 0x6800, 0xa420, 0x6804, 0xa319, 0x0078, 0x1d33, 0x6910,
+       0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, 0x1048, 0x12d5, 0x6800,
+       0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, 0x6b22, 0x6850, 0xc0fd,
+       0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, 0x2a00, 0x6826, 0x007f,
+       0x007f, 0x007f, 0xa006, 0x0078, 0x1d4a, 0x087f, 0x097f, 0x0a7f,
+       0xa085, 0x0001, 0x007c, 0x2001, 0x0005, 0x2004, 0xa084, 0x0007,
+       0x0079, 0x1d52, 0x1d5a, 0x1d5b, 0x1d5e, 0x1d61, 0x1d66, 0x1d69,
+       0x1d6e, 0x1d73, 0x007c, 0x1078, 0x1b50, 0x007c, 0x1078, 0x178d,
+       0x007c, 0x1078, 0x178d, 0x1078, 0x1b50, 0x007c, 0x1078, 0x145e,
+       0x007c, 0x1078, 0x1b50, 0x1078, 0x145e, 0x007c, 0x1078, 0x178d,
+       0x1078, 0x145e, 0x007c, 0x1078, 0x178d, 0x1078, 0x1b50, 0x1078,
+       0x145e, 0x007c, 0x127e, 0x2091, 0x2300, 0x2079, 0x0200, 0x2071,
+       0x7b80, 0x2069, 0x7600, 0x2009, 0x0004, 0x7912, 0x7817, 0x0004,
+       0x1078, 0x2058, 0x781b, 0x0002, 0x20e1, 0x8700, 0x127f, 0x007c,
+       0x127e, 0x2091, 0x2300, 0x781c, 0xa084, 0x0007, 0x0079, 0x1d98,
+       0x1dbc, 0x1da0, 0x1da4, 0x1da8, 0x1dae, 0x1db2, 0x1db6, 0x1dba,
+       0x1078, 0x417d, 0x0078, 0x1dbc, 0x1078, 0x41ac, 0x0078, 0x1dbc,
+       0x1078, 0x417d, 0x1078, 0x41ac, 0x0078, 0x1dbc, 0x1078, 0x1dbe,
+       0x0078, 0x1dbc, 0x1078, 0x1dbe, 0x0078, 0x1dbc, 0x1078, 0x1dbe,
+       0x0078, 0x1dbc, 0x1078, 0x1dbe, 0x127f, 0x007c, 0x007e, 0x017e,
+       0x027e, 0x7930, 0xa184, 0x0003, 0x0040, 0x1dc8, 0x1078, 0x12d5,
+       0xa184, 0x0030, 0x0040, 0x1dd9, 0x6a00, 0xa286, 0x0003, 0x00c0,
+       0x1dd3, 0x1078, 0x12d5, 0x1078, 0x357b, 0x20e1, 0x9010, 0x0078,
+       0x1de5, 0xa184, 0x00c0, 0x0040, 0x1ddf, 0x1078, 0x12d5, 0xa184,
+       0x0300, 0x0040, 0x1de5, 0x20e1, 0x9020, 0x7932, 0x027f, 0x017f,
+       0x007f, 0x007c, 0x017e, 0x0e7e, 0x0f7e, 0x2071, 0x7600, 0x7128,
+       0x2001, 0x7823, 0x2102, 0x2001, 0x782b, 0x2102, 0xa182, 0x0211,
+       0x00c8, 0x1dfe, 0x2009, 0x0008, 0x0078, 0x1e28, 0xa182, 0x0259,
+       0x00c8, 0x1e06, 0x2009, 0x0007, 0x0078, 0x1e28, 0xa182, 0x02c1,
+       0x00c8, 0x1e0e, 0x2009, 0x0006, 0x0078, 0x1e28, 0xa182, 0x0349,
+       0x00c8, 0x1e16, 0x2009, 0x0005, 0x0078, 0x1e28, 0xa182, 0x0421,
+       0x00c8, 0x1e1e, 0x2009, 0x0004, 0x0078, 0x1e28, 0xa182, 0x0581,
+       0x00c8, 0x1e26, 0x2009, 0x0003, 0x0078, 0x1e28, 0x2009, 0x0002,
+       0x2079, 0x0200, 0x7912, 0xa182, 0x0005, 0x00c8, 0x1e32, 0x7916,
+       0x0078, 0x1e34, 0x7817, 0x0004, 0x1078, 0x2058, 0x0f7f, 0x0e7f,
+       0x017f, 0x007c, 0x127e, 0x2091, 0x2200, 0x2061, 0x0100, 0x2071,
+       0x7600, 0x6024, 0x6026, 0x6033, 0x00ef, 0x60e7, 0x0000, 0x60eb,
+       0x00ef, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f,
+       0x0080, 0x602f, 0x0000, 0x6007, 0x0caf, 0x600f, 0x00ff, 0x602b,
+       0x002f, 0x127f, 0x007c, 0x2001, 0x762d, 0x2003, 0x0000, 0x2001,
+       0x762c, 0x2003, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x007e,
+       0x017e, 0x027e, 0x6124, 0xa184, 0x002c, 0x00c0, 0x1e73, 0xa184,
+       0x0007, 0x0079, 0x1e79, 0xa195, 0x0004, 0xa284, 0x0007, 0x0079,
+       0x1e79, 0x1ea5, 0x1e81, 0x1e85, 0x1e89, 0x1e8f, 0x1e93, 0x1e99,
+       0x1e9f, 0x1078, 0x46e6, 0x0078, 0x1ea5, 0x1078, 0x47d5, 0x0078,
+       0x1ea5, 0x1078, 0x47d5, 0x1078, 0x46e6, 0x0078, 0x1ea5, 0x1078,
+       0x1eaa, 0x0078, 0x1ea5, 0x1078, 0x46e6, 0x1078, 0x1eaa, 0x0078,
+       0x1ea5, 0x1078, 0x47d5, 0x1078, 0x1eaa, 0x0078, 0x1ea5, 0x1078,
+       0x47d5, 0x1078, 0x46e6, 0x1078, 0x1eaa, 0x027f, 0x017f, 0x007f,
+       0x127f, 0x007c, 0xd1ac, 0x0040, 0x1f5e, 0x017e, 0x047e, 0x0c7e,
+       0x644c, 0x74ba, 0xa48c, 0xff00, 0xa196, 0xff00, 0x0040, 0x1ed9,
+       0x6030, 0xa084, 0x00ff, 0x810f, 0xa116, 0x0040, 0x1ed9, 0x7130,
+       0xd18c, 0x00c0, 0x1ed9, 0x2011, 0x7652, 0x2214, 0xd2ec, 0x0040,
+       0x1ecd, 0xc18d, 0x7132, 0x0078, 0x1ed9, 0x6240, 0xa294, 0x0010,
+       0x0040, 0x1f1b, 0x6248, 0xa294, 0xff00, 0xa296, 0xff00, 0x00c0,
+       0x1f1b, 0x037e, 0x73b8, 0x2011, 0x8013, 0x1078, 0x2d4a, 0x037f,
+       0x7130, 0xc185, 0x7132, 0x2011, 0x7652, 0x220c, 0xd1a4, 0x0040,
+       0x1f03, 0x017e, 0x2009, 0x0001, 0x2011, 0x0100, 0x1078, 0x46b4,
+       0x2019, 0x000e, 0x1078, 0x74d9, 0xa484, 0x00ff, 0xa080, 0x232f,
+       0x200c, 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e,
+       0x1078, 0x7541, 0x017f, 0xd1ac, 0x00c0, 0x1f0c, 0x2019, 0x0004,
+       0x1078, 0x2299, 0x0078, 0x1f1b, 0x157e, 0x20a9, 0x007f, 0x2009,
+       0x0000, 0x1078, 0x3825, 0x00c0, 0x1f17, 0x1078, 0x3621, 0x8108,
+       0x00f0, 0x1f11, 0x157f, 0x0c7f, 0x047f, 0x6043, 0x0000, 0x2009,
+       0x00f7, 0x1078, 0x35e4, 0x0f7e, 0x2079, 0x7849, 0x783c, 0xa086,
+       0x0000, 0x0040, 0x1f33, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079,
+       0x0140, 0x7803, 0x0000, 0x0f7f, 0x2011, 0x0003, 0x1078, 0x57c0,
+       0x2011, 0x0002, 0x1078, 0x57ca, 0x1078, 0x56d6, 0x1078, 0x45eb,
+       0x037e, 0x2019, 0x0000, 0x1078, 0x5768, 0x037f, 0x60e3, 0x0000,
+       0x017f, 0x2001, 0x7600, 0x2014, 0xa296, 0x0004, 0x00c0, 0x1f56,
+       0xd19c, 0x00c0, 0x1f56, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001,
+       0x2001, 0x7620, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0040,
+       0x1fff, 0x0f7e, 0x2079, 0x7849, 0x783c, 0xa086, 0x0001, 0x00c0,
+       0x1f82, 0x017e, 0x6027, 0x0004, 0x783f, 0x0000, 0x2079, 0x0140,
+       0x7803, 0x1000, 0x7803, 0x0000, 0x2079, 0x7836, 0x7807, 0x0000,
+       0x7833, 0x0000, 0x1078, 0x4c7a, 0x1078, 0x4d3a, 0x017f, 0x0f7f,
+       0x0078, 0x1fff, 0x0f7f, 0x017e, 0x6220, 0xd2b4, 0x0040, 0x1fb7,
+       0x1078, 0x45eb, 0x1078, 0x5582, 0x6027, 0x0004, 0x0d7e, 0x2069,
+       0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x1f9a, 0x6803, 0x1000,
+       0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0x7836, 0x6028, 0xa09a,
+       0x0002, 0x00c8, 0x1faa, 0x8000, 0x602a, 0x0c7f, 0x1078, 0x5574,
+       0x0078, 0x1ffe, 0x2019, 0x783f, 0x2304, 0xa065, 0x0040, 0x1fb4,
+       0x2009, 0x0027, 0x1078, 0x5c29, 0x0c7f, 0x0078, 0x1ffe, 0xd2bc,
+       0x0040, 0x1ffe, 0x1078, 0x45f9, 0x6017, 0x0010, 0x6027, 0x0004,
+       0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x1fcc,
+       0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0x7836,
+       0x6044, 0xa09a, 0x0002, 0x00c8, 0x1fed, 0x8000, 0x6046, 0x603c,
+       0x0c7f, 0xa005, 0x0040, 0x1ffe, 0x1078, 0x45f0, 0xa080, 0x0007,
+       0x2004, 0xa086, 0x0006, 0x00c0, 0x1fe9, 0x6017, 0x0012, 0x0078,
+       0x1ffe, 0x6017, 0x0016, 0x0078, 0x1ffe, 0x037e, 0x2019, 0x0001,
+       0x1078, 0x5768, 0x037f, 0x2019, 0x7845, 0x2304, 0xa065, 0x0040,
+       0x1ffd, 0x2009, 0x004f, 0x1078, 0x5c29, 0x0c7f, 0x017f, 0xd19c,
+       0x0040, 0x2027, 0x017e, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003,
+       0x1078, 0x57c0, 0x2011, 0x0002, 0x1078, 0x57ca, 0x1078, 0x56d6,
+       0x1078, 0x45eb, 0x037e, 0x2019, 0x0000, 0x1078, 0x5768, 0x037f,
+       0x60e3, 0x0000, 0x1078, 0x75b0, 0x1078, 0x75ce, 0x2001, 0x7600,
+       0x2003, 0x0004, 0x6027, 0x0008, 0x1078, 0x11c6, 0x017f, 0xa18c,
+       0xffd0, 0x6126, 0x007c, 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e,
+       0x127e, 0x2091, 0x8000, 0x2071, 0x7600, 0x71b0, 0x70b2, 0xa116,
+       0x0040, 0x2051, 0x81ff, 0x0040, 0x2043, 0x2011, 0x8011, 0x1078,
+       0x2d4a, 0x0078, 0x2051, 0x2011, 0x8012, 0x1078, 0x2d4a, 0x037e,
+       0x0c7e, 0x2061, 0x0100, 0x2019, 0x0028, 0x1078, 0x2299, 0x0c7f,
+       0x037f, 0x127f, 0x0f7f, 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c,
+       0x0c7e, 0x0f7e, 0x007e, 0x027e, 0x2061, 0x0100, 0xa190, 0x2073,
+       0x2204, 0x60f2, 0xa192, 0x0005, 0x00c8, 0x206a, 0xa190, 0x207c,
+       0x0078, 0x206c, 0x2011, 0x2080, 0x2204, 0x60ee, 0x027f, 0x007f,
+       0x0f7f, 0x0c7f, 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420,
+       0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8,
+       0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0x2130, 0xa094,
+       0xff00, 0x00c0, 0x208e, 0x81ff, 0x0040, 0x2092, 0x1078, 0x4330,
+       0x0078, 0x2099, 0xa080, 0x232f, 0x200c, 0xa18c, 0xff00, 0x810f,
+       0xa006, 0x007c, 0xa080, 0x232f, 0x200c, 0xa18c, 0x00ff, 0x007c,
+       0x20c0, 0x20c4, 0x20c8, 0x20ce, 0x20d4, 0x20da, 0x20e0, 0x20e8,
+       0x20f0, 0x20f6, 0x20fc, 0x2104, 0x210c, 0x2114, 0x211c, 0x2126,
+       0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130,
+       0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130, 0x2130,
+       0x107e, 0x007e, 0x0078, 0x2149, 0x107e, 0x007e, 0x0078, 0x2149,
+       0x107e, 0x007e, 0x1078, 0x1e64, 0x0078, 0x2149, 0x107e, 0x007e,
+       0x1078, 0x1e64, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b,
+       0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b, 0x0078, 0x2149,
+       0x107e, 0x007e, 0x1078, 0x1e64, 0x1078, 0x1d4b, 0x0078, 0x2149,
+       0x107e, 0x007e, 0x1078, 0x1e64, 0x1078, 0x1d4b, 0x0078, 0x2149,
+       0x107e, 0x007e, 0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e,
+       0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1e64,
+       0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1e64,
+       0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b,
+       0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1d4b,
+       0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e, 0x1078, 0x1e64,
+       0x1078, 0x1d4b, 0x1078, 0x1d90, 0x0078, 0x2149, 0x107e, 0x007e,
+       0x1078, 0x1e64, 0x1078, 0x1d4b, 0x1078, 0x1d90, 0x0078, 0x2149,
+       0x0005, 0x0078, 0x2130, 0xb084, 0x003c, 0x8004, 0x8004, 0x0079,
+       0x2139, 0x2149, 0x20c6, 0x20ca, 0x20d0, 0x20d6, 0x20dc, 0x20e2,
+       0x20ea, 0x20f2, 0x20f8, 0x20fe, 0x2106, 0x210e, 0x2116, 0x211e,
+       0x2128, 0x0008, 0x2133, 0x007f, 0x107f, 0x2091, 0x8001, 0x007c,
+       0x0c7e, 0x027e, 0x2041, 0x007e, 0x70bc, 0xd09c, 0x0040, 0x215a,
+       0x2041, 0x007f, 0x2001, 0x010c, 0x203c, 0x727c, 0x82ff, 0x0040,
+       0x21a5, 0x037e, 0x738c, 0xa38e, 0xffff, 0x00c0, 0x2169, 0x2019,
+       0x0001, 0x8314, 0xa2e0, 0x7cc0, 0x2c04, 0xa38c, 0x0001, 0x0040,
+       0x2176, 0xa084, 0xff00, 0x8007, 0x0078, 0x2178, 0xa084, 0x00ff,
+       0xa70e, 0x0040, 0x219a, 0xa08e, 0x00ff, 0x0040, 0x21a0, 0x2009,
+       0x0000, 0x1078, 0x2085, 0x1078, 0x37ee, 0x00c0, 0x219d, 0x6004,
+       0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2194, 0x1078, 0x21f7,
+       0x0040, 0x219d, 0x0078, 0x219a, 0x1078, 0x22fb, 0x1078, 0x221e,
+       0x0040, 0x219d, 0x8318, 0x0078, 0x2169, 0x738e, 0x0078, 0x21a2,
+       0x708f, 0xffff, 0x037f, 0x0078, 0x21f4, 0xa780, 0x232f, 0x203c,
+       0xa7bc, 0xff00, 0x873f, 0x708c, 0xa096, 0xffff, 0x0040, 0x21b7,
+       0xa812, 0x00c8, 0x21c7, 0x708f, 0xffff, 0x0078, 0x21f1, 0x2009,
+       0x0000, 0x70bc, 0xd09c, 0x0040, 0x21c2, 0xd094, 0x0040, 0x21c2,
+       0x2009, 0x007e, 0x2100, 0xa802, 0x20a8, 0x0078, 0x21cb, 0x2008,
+       0x2810, 0xa202, 0x20a8, 0x2700, 0x157e, 0x017e, 0xa106, 0x0040,
+       0x21e8, 0x1078, 0x37ee, 0x00c0, 0x21f1, 0x6004, 0xa084, 0x00ff,
+       0xa086, 0x0006, 0x00c0, 0x21e2, 0x1078, 0x21f7, 0x0040, 0x21f1,
+       0x0078, 0x21e8, 0x1078, 0x22fb, 0x1078, 0x221e, 0x0040, 0x21f1,
+       0x017f, 0x8108, 0x157f, 0x00f0, 0x21cb, 0x708f, 0xffff, 0x0078,
+       0x21f4, 0x017f, 0x157f, 0x718e, 0x027f, 0x0c7f, 0x007c, 0x017e,
+       0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5b9c, 0x0040, 0x2219,
+       0x2d00, 0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd,
+       0x2001, 0x0000, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x7088,
+       0x8000, 0x708a, 0x127f, 0x2009, 0x0004, 0x1078, 0x5c29, 0xa085,
+       0x0001, 0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x017e, 0x077e,
+       0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5b9c, 0x0040, 0x2240, 0x2d00,
+       0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+       0x0002, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000,
+       0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5c29, 0xa085, 0x0001,
+       0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, 0x027e, 0x2009,
+       0x0080, 0x1078, 0x37ee, 0x00c0, 0x2253, 0x1078, 0x2256, 0x0040,
+       0x2253, 0x70c3, 0xffff, 0x027f, 0x0c7f, 0x007c, 0x017e, 0x077e,
+       0x0d7e, 0x0c7e, 0x2c68, 0x1078, 0x5b9c, 0x0040, 0x2278, 0x2d00,
+       0x601a, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+       0x0002, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x70c4, 0x8000,
+       0x70c6, 0x127f, 0x2009, 0x0002, 0x1078, 0x5c29, 0xa085, 0x0001,
+       0x0c7f, 0x0d7f, 0x077f, 0x017f, 0x007c, 0x0c7e, 0x0d7e, 0x2009,
+       0x007f, 0x1078, 0x37ee, 0x00c0, 0x2296, 0x2c68, 0x1078, 0x5b9c,
+       0x0040, 0x2296, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a,
+       0x2009, 0x0022, 0x1078, 0x5c29, 0xa085, 0x0001, 0x0d7f, 0x0c7f,
+       0x007c, 0x0e7e, 0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, 0x4969,
+       0x1078, 0x4919, 0x1078, 0x6103, 0x20a9, 0x007f, 0x2009, 0x0000,
+       0x017e, 0x1078, 0x3825, 0x00c0, 0x22b1, 0x1078, 0x39a6, 0x1078,
+       0x3621, 0x017f, 0x8108, 0x00f0, 0x22a8, 0x027f, 0x037f, 0x067f,
+       0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e,
+       0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029, 0x1078, 0x4962,
+       0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b, 0x017f, 0x2e60, 0x1078,
+       0x39a6, 0x6210, 0x6314, 0x1078, 0x3621, 0x6212, 0x6316, 0x017f,
+       0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x6018,
+       0xa080, 0x0028, 0x2004, 0xd0bc, 0x00c0, 0x22f1, 0x2071, 0x7600,
+       0x7088, 0xa005, 0x0040, 0x22ee, 0x8001, 0x708a, 0x007f, 0x0e7f,
+       0x007c, 0x2071, 0x7600, 0x70c4, 0xa005, 0x0040, 0x22ee, 0x8001,
+       0x70c6, 0x0078, 0x22ee, 0x6000, 0xc08c, 0x6002, 0x007c, 0x0e7e,
+       0x0c7e, 0x037e, 0x027e, 0x017e, 0x157e, 0x81ff, 0x00c0, 0x230c,
+       0x20a9, 0x0001, 0x0078, 0x2310, 0x20a9, 0x007f, 0x2011, 0x0000,
+       0x027e, 0xa2e0, 0x7720, 0x2c64, 0x8cff, 0x0040, 0x2322, 0x2019,
+       0x0029, 0x1078, 0x4962, 0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b,
+       0x1078, 0x39a6, 0x027f, 0x8210, 0x00f0, 0x2310, 0x027e, 0x027f,
+       0x157f, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x7eef,
+       0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9,
+       0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd,
+       0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3,
+       0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2,
+       0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7,
+       0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098,
+       0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080,
+       0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072,
+       0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067,
+       0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055,
+       0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b,
+       0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a,
+       0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e,
+       0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025,
+       0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010,
+       0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800,
+       0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400,
+       0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200,
+       0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000,
+       0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000,
+       0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000,
+       0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000,
+       0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000,
+       0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000,
+       0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000,
+       0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000,
+       0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000,
+       0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500,
+       0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100,
+       0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000,
        0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
-       0x8000, 0x2071, 0x6d6d, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016,
-       0x703a, 0x703e, 0x7033, 0x6d7d, 0x7037, 0x6d7d, 0x7007, 0x0001,
-       0x2061, 0x6d9d, 0x6003, 0x0002, 0x007c, 0x0090, 0x21b8, 0x0068,
-       0x21b8, 0x2071, 0x6d6d, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x21b8,
-       0x2a60, 0x7820, 0xa08e, 0x0069, 0x00c0, 0x229c, 0x0079, 0x223c,
-       0x007c, 0x2071, 0x6d6d, 0x7004, 0x0079, 0x21be, 0x21c2, 0x21c3,
-       0x21cd, 0x21df, 0x007c, 0x0090, 0x21cc, 0x0068, 0x21cc, 0x2b78,
-       0x7818, 0xd084, 0x0040, 0x21eb, 0x007c, 0x2b78, 0x2061, 0x6d9d,
-       0x6008, 0xa08e, 0x0100, 0x0040, 0x21da, 0xa086, 0x0200, 0x0040,
-       0x2294, 0x007c, 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010,
-       0x2068, 0x6834, 0xa086, 0x0103, 0x0040, 0x21e7, 0x007c, 0x2a60,
-       0x2b78, 0x7018, 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8,
-       0x21f4, 0x61b0, 0x0079, 0x21fc, 0x2100, 0xa08a, 0x0033, 0x00c8,
-       0x2290, 0x61b0, 0x0079, 0x223c, 0x2272, 0x22a4, 0x22ac, 0x22b0,
-       0x22b8, 0x22be, 0x22c2, 0x22cb, 0x22cf, 0x22d7, 0x22db, 0x2290,
-       0x2290, 0x2290, 0x22df, 0x2290, 0x22ef, 0x2306, 0x231d, 0x2399,
-       0x239e, 0x23cb, 0x2416, 0x2425, 0x2446, 0x247c, 0x2486, 0x2493,
-       0x24a6, 0x24be, 0x24c7, 0x2504, 0x250a, 0x2290, 0x251a, 0x2290,
-       0x2290, 0x2290, 0x2290, 0x2290, 0x251e, 0x2524, 0x2290, 0x2290,
-       0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x252c, 0x2290,
-       0x2290, 0x2290, 0x2290, 0x2290, 0x2539, 0x253f, 0x2290, 0x2290,
-       0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290,
-       0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290,
-       0x2290, 0x2290, 0x2290, 0x2290, 0x22d7, 0x22db, 0x2290, 0x2290,
-       0x2551, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290, 0x2290,
-       0x2290, 0x2290, 0x2290, 0x2290, 0x259e, 0x265d, 0x2671, 0x2678,
-       0x26db, 0x2736, 0x2741, 0x2783, 0x2790, 0x279d, 0x27a0, 0x2555,
-       0x27c9, 0x2811, 0x281e, 0x28fd, 0x29cb, 0x29f2, 0x2ade, 0x713c,
-       0x0078, 0x2272, 0x2021, 0x4000, 0x1078, 0x2a2d, 0x127e, 0x2091,
-       0x8000, 0x0068, 0x227f, 0x7818, 0xd084, 0x0040, 0x2282, 0x127f,
-       0x0078, 0x2276, 0x781b, 0x0001, 0x7c22, 0x7926, 0x7a2a, 0x7b2e,
-       0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x127f, 0x007c,
-       0x2021, 0x4001, 0x0078, 0x2274, 0x2021, 0x4002, 0x0078, 0x2274,
-       0x2021, 0x4003, 0x0078, 0x2274, 0x2021, 0x4005, 0x0078, 0x2274,
-       0x2021, 0x4006, 0x0078, 0x2274, 0xa02e, 0x2520, 0x7b28, 0x7a2c,
-       0x7824, 0x7930, 0x0078, 0x2a3c, 0x7823, 0x0004, 0x7824, 0x007a,
-       0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x2a40,
-       0x7924, 0x7828, 0x2114, 0x200a, 0x0078, 0x2272, 0x7924, 0x2114,
-       0x0078, 0x2272, 0x2099, 0x0009, 0x20a1, 0x0009, 0x20a9, 0x0007,
-       0x53a3, 0x0078, 0x2272, 0x7824, 0x2060, 0x0078, 0x22e1, 0x2009,
-       0x0001, 0x2011, 0x000d, 0x2019, 0x0000, 0x0078, 0x2272, 0x7d38,
-       0x7c3c, 0x0078, 0x22a6, 0x7d38, 0x7c3c, 0x0078, 0x22b2, 0x2061,
-       0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0,
-       0x22e3, 0x2010, 0xa005, 0x0040, 0x2272, 0x0078, 0x2298, 0x2061,
-       0x6d51, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x22a0, 0x8019, 0x0040,
-       0x22a0, 0x604a, 0x6142, 0x782c, 0x6052, 0x7828, 0x6056, 0xa006,
-       0x605a, 0x605e, 0x1078, 0x3890, 0x0078, 0x2272, 0x2061, 0x6d51,
-       0x7824, 0x7930, 0xa11a, 0x00c8, 0x22a0, 0x8019, 0x0040, 0x22a0,
-       0x604e, 0x6146, 0x782c, 0x6062, 0x7828, 0x6066, 0xa006, 0x606a,
-       0x606e, 0x1078, 0x366e, 0x0078, 0x2272, 0xa02e, 0x2520, 0x81ff,
-       0x00c0, 0x229c, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1,
-       0x6d74, 0x41a1, 0x1078, 0x2a04, 0x0040, 0x229c, 0x2009, 0x0020,
-       0x1078, 0x2a3c, 0x701b, 0x2335, 0x007c, 0x6834, 0x2008, 0xa084,
-       0x00ff, 0xa096, 0x0011, 0x0040, 0x2341, 0xa096, 0x0019, 0x00c0,
-       0x229c, 0x810f, 0xa18c, 0x00ff, 0x0040, 0x229c, 0x710e, 0x700c,
-       0x8001, 0x0040, 0x2372, 0x700e, 0x1078, 0x2a04, 0x0040, 0x229c,
-       0x2009, 0x0020, 0x2061, 0x6d9d, 0x6224, 0x6328, 0x642c, 0x6530,
-       0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000,
-       0x1078, 0x2a3c, 0x701b, 0x2365, 0x007c, 0x6834, 0xa084, 0x00ff,
-       0xa096, 0x0002, 0x0040, 0x2370, 0xa096, 0x000a, 0x00c0, 0x229c,
-       0x0078, 0x2347, 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a, 0x1078,
-       0x3344, 0x00c0, 0x2380, 0x7007, 0x0003, 0x701b, 0x2382, 0x007c,
-       0x1078, 0x372d, 0x127e, 0x2091, 0x8000, 0x20a9, 0x0005, 0x2099,
-       0x6d74, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000,
-       0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, 0x127f, 0x0078,
-       0x2a40, 0x6198, 0x7824, 0x609a, 0x0078, 0x2272, 0x2091, 0x8000,
-       0x7823, 0x4000, 0x7827, 0x4953, 0x782b, 0x5020, 0x782f, 0x2020,
-       0x2009, 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836, 0x2061, 0x0100,
-       0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0xa205, 0x783a, 0x2009,
-       0x04fd, 0x2104, 0x783e, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091,
-       0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0, 0xa08a, 0x0003, 0x00c8,
-       0x0427, 0x0078, 0x0423, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c,
-       0x0040, 0x22a0, 0x7c28, 0x7d2c, 0x1078, 0x3592, 0xd28c, 0x00c0,
-       0x23dd, 0x1078, 0x3522, 0x0078, 0x23df, 0x1078, 0x355e, 0x00c0,
-       0x2409, 0x2061, 0x7400, 0x127e, 0x2091, 0x8000, 0x6000, 0xa086,
-       0x0000, 0x0040, 0x23f7, 0x6010, 0xa06d, 0x0040, 0x23f7, 0x683c,
-       0xa406, 0x00c0, 0x23f7, 0x6840, 0xa506, 0x0040, 0x2402, 0x127f,
-       0xace0, 0x0008, 0x2001, 0x6d15, 0x2004, 0xac02, 0x00c8, 0x229c,
-       0x0078, 0x23e3, 0x1078, 0x5f5d, 0x127f, 0x0040, 0x229c, 0x0078,
-       0x2272, 0xa00e, 0x2001, 0x0005, 0x1078, 0x372d, 0x127e, 0x2091,
-       0x8000, 0x1078, 0x36a1, 0x127f, 0x0078, 0x2272, 0x81ff, 0x00c0,
-       0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078, 0x34d7, 0x1078,
-       0x35a3, 0x0040, 0x229c, 0x0078, 0x2272, 0x81ff, 0x00c0, 0x229c,
-       0x1078, 0x2a1c, 0x0040, 0x22a0, 0x2031, 0x000f, 0x1078, 0x34d7,
-       0x8631, 0x00c8, 0x242e, 0x2019, 0x0005, 0x1078, 0x35c4, 0x0040,
-       0x229c, 0x7828, 0xa08a, 0x1000, 0x00c8, 0x22a0, 0x8003, 0x800b,
-       0x810b, 0xa108, 0x1078, 0x40de, 0x0078, 0x2272, 0x127e, 0x2091,
-       0x8000, 0x81ff, 0x00c0, 0x2476, 0x2029, 0x00ff, 0x644c, 0x2400,
-       0xa506, 0x0040, 0x2470, 0x2508, 0x1078, 0x3447, 0x00c0, 0x2470,
-       0x2031, 0x000f, 0x1078, 0x34d7, 0x8631, 0x00c8, 0x245a, 0x2019,
-       0x0004, 0x1078, 0x35c4, 0x0040, 0x2476, 0x7824, 0xa08a, 0x1000,
-       0x00c8, 0x2479, 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x40de,
-       0x8529, 0x00c8, 0x244f, 0x127f, 0x0078, 0x2272, 0x127f, 0x0078,
-       0x229c, 0x127f, 0x0078, 0x22a0, 0x1078, 0x2a1c, 0x0040, 0x22a0,
-       0x1078, 0x3507, 0x1078, 0x3592, 0x0078, 0x2272, 0x81ff, 0x00c0,
-       0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078, 0x34f0, 0x1078,
-       0x3592, 0x0078, 0x2272, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c,
-       0x0040, 0x22a0, 0x1078, 0x3561, 0x0040, 0x229c, 0x1078, 0x338c,
-       0x1078, 0x351b, 0x1078, 0x3592, 0x0078, 0x2272, 0x1078, 0x2a1c,
-       0x0040, 0x22a0, 0x1078, 0x34d7, 0x62a0, 0x2019, 0x0005, 0x0c7e,
-       0x1078, 0x35cf, 0x0c7f, 0x1078, 0x445c, 0x1078, 0x43a9, 0x2c08,
-       0x1078, 0x6a57, 0x1078, 0x3592, 0x0078, 0x2272, 0x1078, 0x2a1c,
-       0x0040, 0x22a0, 0x1078, 0x3592, 0x2208, 0x0078, 0x2272, 0x157e,
-       0x0d7e, 0x0e7e, 0x2069, 0x6ddf, 0x6810, 0x6914, 0xa10a, 0x00c8,
-       0x24d3, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000,
-       0x20a9, 0x007e, 0x2069, 0x6e00, 0x2d04, 0xa075, 0x0040, 0x24e8,
-       0x704c, 0x1078, 0x24f2, 0xa210, 0x7080, 0x1078, 0x24f2, 0xa318,
-       0x8d68, 0x00f0, 0x24dc, 0x2300, 0xa218, 0x0e7f, 0x0d7f, 0x157f,
-       0x0078, 0x2272, 0x0f7e, 0x017e, 0xa07d, 0x0040, 0x2501, 0x2001,
-       0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0040, 0x2501, 0x2178, 0x0078,
-       0x24f9, 0x017f, 0x0f7f, 0x007c, 0x2069, 0x6ddf, 0x6910, 0x629c,
-       0x0078, 0x2272, 0x81ff, 0x00c0, 0x229c, 0x614c, 0xa190, 0x2091,
-       0x2214, 0xa294, 0x00ff, 0x6068, 0xa084, 0xff00, 0xa215, 0x6364,
-       0x0078, 0x2272, 0x613c, 0x6240, 0x0078, 0x2272, 0x1078, 0x2a1c,
-       0x0040, 0x22a0, 0x0078, 0x2272, 0x1078, 0x2a1c, 0x0040, 0x22a0,
-       0x6244, 0x6338, 0x0078, 0x2272, 0x613c, 0x6240, 0x7824, 0x603e,
-       0x7b28, 0x6342, 0x2069, 0x6d51, 0x831f, 0xa305, 0x6816, 0x0078,
-       0x2272, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x0078, 0x2272, 0x1078,
-       0x2a1c, 0x0040, 0x22a0, 0x7828, 0xa00d, 0x0040, 0x22a0, 0x782c,
-       0xa005, 0x0040, 0x22a0, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078,
-       0x2272, 0x7d38, 0x7c3c, 0x0078, 0x231f, 0x7824, 0xa09c, 0x00ff,
-       0xa39a, 0x0003, 0x00c8, 0x229c, 0x624c, 0xa084, 0xff00, 0x8007,
-       0xa206, 0x00c0, 0x256d, 0x2001, 0x6d40, 0x2009, 0x000c, 0x7a2c,
-       0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2a40, 0x81ff, 0x00c0, 0x229c,
-       0x1078, 0x2a1c, 0x0040, 0x22a0, 0x6004, 0xa084, 0x00ff, 0xa086,
-       0x0006, 0x00c0, 0x229c, 0x0c7e, 0x1078, 0x2a04, 0x0c7f, 0x0040,
-       0x229c, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x6223,
-       0x0040, 0x229c, 0x7007, 0x0003, 0x701b, 0x258f, 0x007c, 0x6830,
-       0xa086, 0x0100, 0x0040, 0x229c, 0xad80, 0x000e, 0x2009, 0x000c,
-       0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2a40, 0x1078, 0x2a04,
-       0x0040, 0x229c, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
-       0x1078, 0x2a3c, 0x701b, 0x25ad, 0x007c, 0xade8, 0x000d, 0x6800,
-       0xa005, 0x0040, 0x22a0, 0x6804, 0xd0ac, 0x0040, 0x25ba, 0xd0a4,
-       0x0040, 0x22a0, 0xd094, 0x0040, 0x25c5, 0x0c7e, 0x2061, 0x0100,
-       0x6104, 0xa18c, 0xffdf, 0x6106, 0x0c7f, 0xd08c, 0x0040, 0x25d0,
-       0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18d, 0x0010, 0x6106, 0x0c7f,
-       0x2009, 0x0100, 0x210c, 0xa18a, 0x0002, 0x0048, 0x25e5, 0xd084,
-       0x0040, 0x25e5, 0x6828, 0xa08a, 0x007f, 0x00c8, 0x22a0, 0xa088,
-       0x2091, 0x210c, 0xa18c, 0x00ff, 0x6152, 0xd0dc, 0x0040, 0x25ee,
-       0x6828, 0xa08a, 0x007f, 0x00c8, 0x22a0, 0x604e, 0x6808, 0xa08a,
-       0x0100, 0x0048, 0x22a0, 0xa08a, 0x0841, 0x00c8, 0x22a0, 0xa084,
-       0x0007, 0x00c0, 0x22a0, 0x680c, 0xa005, 0x0040, 0x22a0, 0x6810,
-       0xa005, 0x0040, 0x22a0, 0x6848, 0x6940, 0xa10a, 0x00c8, 0x22a0,
-       0x8001, 0x0040, 0x22a0, 0x684c, 0x6944, 0xa10a, 0x00c8, 0x22a0,
-       0x8001, 0x0040, 0x22a0, 0x20a9, 0x001c, 0x2d98, 0x2069, 0x6d51,
-       0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x613e, 0x8007, 0xa084,
-       0x00ff, 0x6042, 0x1078, 0x3890, 0x1078, 0x366e, 0x6000, 0xa086,
-       0x0000, 0x00c0, 0x265b, 0x6808, 0x602a, 0x1078, 0x1bcc, 0x6818,
-       0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016,
-       0x611a, 0x621e, 0x6322, 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e,
-       0x6312, 0x1078, 0x4168, 0x0c7e, 0x2061, 0x0100, 0x602f, 0x0040,
-       0x602f, 0x0000, 0x0c7f, 0x60b4, 0xa005, 0x0040, 0x2657, 0x6003,
-       0x0001, 0x2091, 0x301d, 0x1078, 0x31cb, 0x0078, 0x265b, 0x6003,
-       0x0004, 0x2091, 0x301d, 0x0078, 0x2272, 0x6000, 0xa086, 0x0000,
-       0x0040, 0x229c, 0x2069, 0x6d51, 0x7830, 0x6842, 0x7834, 0x6846,
-       0x2d00, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
-       0x2a40, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x31cb, 0x0078, 0x2272,
-       0x81ff, 0x00c0, 0x229c, 0x617c, 0x81ff, 0x0040, 0x2692, 0x703f,
-       0x0000, 0x2001, 0x73c0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c,
-       0x7d38, 0x127e, 0x2091, 0x8000, 0x1078, 0x2a40, 0x701b, 0x226f,
-       0x127f, 0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0x73c0, 0x20a9,
-       0x0040, 0x20a1, 0x73c0, 0x2019, 0xffff, 0x43a4, 0x654c, 0xa588,
-       0x2091, 0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002,
-       0x2100, 0xa506, 0x0040, 0x26c4, 0x1078, 0x3447, 0x00c0, 0x26c4,
-       0x6014, 0x821c, 0x0048, 0x26bc, 0xa398, 0x73c0, 0xa085, 0xff00,
-       0x8007, 0x201a, 0x0078, 0x26c3, 0xa398, 0x73c0, 0x2324, 0xa4a4,
-       0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8,
-       0x26cb, 0x0078, 0x26a8, 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a,
-       0x0d7f, 0x20a9, 0x0040, 0x20a1, 0x73c0, 0x2099, 0x73c0, 0x1078,
-       0x3213, 0x0078, 0x2681, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x0c7e,
-       0x1078, 0x2a04, 0x0c7f, 0x0040, 0x229c, 0x2001, 0x6d52, 0x2004,
-       0xd0b4, 0x0040, 0x2708, 0x6000, 0xd08c, 0x00c0, 0x2708, 0x6004,
-       0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2708, 0x6837, 0x0000,
-       0x6838, 0xc0fd, 0x683a, 0x1078, 0x625b, 0x0040, 0x229c, 0x7007,
-       0x0003, 0x701b, 0x2704, 0x007c, 0x1078, 0x2a1c, 0x0040, 0x22a0,
-       0x20a9, 0x0029, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9,
-       0x0002, 0xac80, 0x0004, 0x2098, 0xad80, 0x0004, 0x20a0, 0x1078,
-       0x3213, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, 0xad80, 0x0006,
-       0x20a0, 0x1078, 0x3213, 0x20a9, 0x0004, 0xac80, 0x000a, 0x2098,
-       0xad80, 0x000a, 0x20a0, 0x1078, 0x3213, 0x2d00, 0x2009, 0x0029,
-       0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2a40, 0x81ff, 0x00c0,
-       0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078, 0x35ae, 0x0078,
-       0x2272, 0x81ff, 0x00c0, 0x229c, 0x7828, 0xa08a, 0x1000, 0x00c8,
-       0x22a0, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x2031, 0x000f, 0x1078,
-       0x34d7, 0x8631, 0x00c8, 0x274f, 0x2019, 0x0004, 0x1078, 0x35c4,
-       0x7924, 0x810f, 0x7a28, 0x1078, 0x275f, 0x0078, 0x2272, 0xa186,
-       0x00ff, 0x0040, 0x2767, 0x1078, 0x2777, 0x0078, 0x2776, 0x2029,
-       0x007e, 0x2061, 0x6d00, 0x644c, 0x2400, 0xa506, 0x0040, 0x2773,
-       0x2508, 0x1078, 0x2777, 0x8529, 0x00c8, 0x276c, 0x007c, 0x1078,
-       0x3447, 0x00c0, 0x2782, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108,
-       0x1078, 0x40de, 0x007c, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c,
-       0x0040, 0x22a0, 0x1078, 0x34d7, 0x1078, 0x35b9, 0x0078, 0x2272,
-       0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a1c, 0x0040, 0x22a0, 0x1078,
-       0x34d7, 0x1078, 0x35a3, 0x0078, 0x2272, 0x6100, 0x0078, 0x2272,
-       0x1078, 0x2a1c, 0x0040, 0x22a0, 0x6004, 0xa086, 0x0707, 0x0040,
-       0x22a0, 0x2001, 0x6d00, 0x2004, 0xa086, 0x0003, 0x00c0, 0x229c,
-       0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x27b9, 0xace8,
-       0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04,
-       0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200, 0x0078,
-       0x2272, 0x81ff, 0x00c0, 0x229c, 0x7828, 0xa08a, 0x1000, 0x00c8,
-       0x22a0, 0x7924, 0xa184, 0x00ff, 0xa082, 0x0010, 0x00c8, 0x22a0,
-       0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0040, 0x27e6, 0xa182,
-       0x007f, 0x00c8, 0x22a0, 0x2100, 0x1078, 0x1e30, 0x027e, 0x0c7e,
-       0x127e, 0x2091, 0x8000, 0x2061, 0x6f23, 0x601b, 0x0000, 0x601f,
-       0x0000, 0x2061, 0x6d00, 0x6003, 0x0001, 0x2061, 0x0100, 0x6030,
-       0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043,
-       0x0010, 0x2009, 0x001e, 0x2011, 0x31f0, 0x1078, 0x415f, 0x7924,
-       0x810f, 0x7a28, 0x1078, 0x275f, 0x127f, 0x0c7f, 0x027f, 0x0078,
-       0x2272, 0x7924, 0xa18c, 0xff00, 0x810f, 0x0c7e, 0x1078, 0x3410,
-       0x2c08, 0x0c7f, 0x00c0, 0x22a0, 0x0078, 0x2272, 0x81ff, 0x00c0,
-       0x229c, 0x60bc, 0xd09c, 0x0040, 0x229c, 0x1078, 0x2a04, 0x0040,
-       0x229c, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2a3c,
-       0x701b, 0x2833, 0x007c, 0x2009, 0x0080, 0x1078, 0x3447, 0x00c0,
-       0x229c, 0x0d7e, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10,
-       0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0040, 0x28a7, 0xa0be,
-       0x0112, 0x0040, 0x28a7, 0xa0be, 0x0113, 0x0040, 0x28a7, 0xa0be,
-       0x0114, 0x0040, 0x28a7, 0xa0be, 0x0117, 0x0040, 0x28a7, 0xa0be,
-       0x011a, 0x0040, 0x28a7, 0xa0be, 0x0121, 0x0040, 0x289d, 0xa0be,
-       0x0131, 0x0040, 0x289d, 0xa0be, 0x0171, 0x0040, 0x28a7, 0xa0be,
-       0x01a1, 0x00c0, 0x2870, 0x6830, 0x8007, 0x6832, 0x0078, 0x28ad,
-       0xa0be, 0x0212, 0x0040, 0x28a3, 0xa0be, 0x0213, 0x0040, 0x28a3,
-       0xa0be, 0x0214, 0x0040, 0x2895, 0xa0be, 0x0217, 0x0040, 0x288f,
-       0xa0be, 0x021a, 0x00c0, 0x2889, 0x6838, 0x8007, 0x683a, 0x0078,
-       0x28a7, 0xa0be, 0x0300, 0x0040, 0x28a7, 0x0078, 0x229c, 0xad80,
-       0x0010, 0x20a9, 0x0007, 0x1078, 0x28d9, 0xad80, 0x000e, 0x20a9,
-       0x0001, 0x1078, 0x28d9, 0x0078, 0x28a7, 0xad80, 0x000c, 0x1078,
-       0x28e7, 0x0078, 0x28ad, 0xad80, 0x000e, 0x1078, 0x28e7, 0xad80,
-       0x000c, 0x20a9, 0x0001, 0x1078, 0x28d9, 0x0c7e, 0x1078, 0x2a04,
-       0x0040, 0x28ce, 0x6837, 0x0119, 0x684f, 0x0020, 0x685b, 0x0001,
-       0x810b, 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92,
-       0x6996, 0x689b, 0x0000, 0x0c7f, 0x0d7f, 0x1078, 0x623f, 0x0040,
-       0x229c, 0x7007, 0x0003, 0x701b, 0x28d2, 0x007c, 0x0c7f, 0x0d7f,
-       0x0078, 0x229c, 0x6820, 0xa086, 0x8001, 0x0040, 0x229c, 0x0078,
-       0x2272, 0x017e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a,
-       0x8108, 0x280a, 0x8108, 0x00f0, 0x28db, 0x017f, 0x007c, 0x017e,
-       0x0a7e, 0x0b7e, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054,
-       0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108,
-       0x280a, 0x0b7f, 0x0a7f, 0x017f, 0x007c, 0x81ff, 0x00c0, 0x229c,
-       0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0081, 0x0048, 0x22a0,
-       0xa182, 0x00ff, 0x00c8, 0x22a0, 0x7a2c, 0x7b28, 0x6064, 0xa306,
-       0x00c0, 0x2918, 0x6068, 0xa206, 0x00c0, 0x2918, 0x0078, 0x22a0,
-       0x0c7e, 0x1078, 0x297b, 0x2c68, 0x0c7f, 0x0040, 0x2939, 0xa0c6,
-       0x4007, 0x00c0, 0x2926, 0x7c26, 0x0078, 0x2936, 0xa0c6, 0x4008,
-       0x00c0, 0x292e, 0x7f26, 0x7e2a, 0x0078, 0x2936, 0xa0c6, 0x4009,
-       0x00c0, 0x2934, 0x0078, 0x2936, 0x2001, 0x4006, 0x2020, 0x0078,
-       0x2274, 0x017e, 0x0b7e, 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x5504,
-       0x0040, 0x2969, 0x2d00, 0x601a, 0x2e58, 0x0e7f, 0x0e7e, 0x0c7e,
-       0x1078, 0x2a04, 0x0c7f, 0x2b70, 0x0040, 0x229c, 0x6837, 0x0000,
-       0x2d00, 0x6012, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x33df,
-       0x2001, 0x0002, 0x1078, 0x33f3, 0x127e, 0x2091, 0x8000, 0x7088,
-       0x8000, 0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5591, 0xa085,
-       0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f, 0x0040, 0x229c, 0x7007,
-       0x0003, 0x701b, 0x2974, 0x007c, 0x6830, 0xa086, 0x0100, 0x00c0,
-       0x2272, 0x0078, 0x229c, 0x0e7e, 0x0d7e, 0x2029, 0x0000, 0x2021,
-       0x0081, 0x20a9, 0x007e, 0x2071, 0x6e81, 0x2e04, 0xa005, 0x00c0,
-       0x298f, 0x2100, 0xa406, 0x0040, 0x29c0, 0x0078, 0x29b4, 0x2068,
-       0x6f10, 0x2700, 0xa306, 0x00c0, 0x29a5, 0x6e14, 0x2600, 0xa206,
-       0x00c0, 0x29a5, 0x2400, 0xa106, 0x00c0, 0x29a1, 0x2d60, 0x0078,
-       0x29c6, 0x2001, 0x4007, 0x0078, 0x29c7, 0x2400, 0xa106, 0x00c0,
-       0x29b4, 0x6e14, 0x87ff, 0x00c0, 0x29b0, 0x86ff, 0x0040, 0x29c0,
-       0x2001, 0x4008, 0x0078, 0x29c7, 0x8420, 0x8e70, 0x00f0, 0x2985,
-       0x2001, 0x4009, 0x0078, 0x29c7, 0x2001, 0x0001, 0x0078, 0x29c7,
-       0x1078, 0x3410, 0x00c0, 0x29bc, 0x6312, 0x6216, 0xa006, 0xa005,
-       0x0d7f, 0x0e7f, 0x007c, 0x81ff, 0x00c0, 0x229c, 0x1078, 0x2a04,
-       0x0040, 0x229c, 0x6837, 0x0000, 0x7824, 0xa005, 0x0040, 0x22a0,
-       0xa096, 0x00ff, 0x0040, 0x29e0, 0xa092, 0x0004, 0x00c8, 0x22a0,
-       0x2010, 0x2d18, 0x1078, 0x2013, 0x0040, 0x229c, 0x7007, 0x0003,
-       0x701b, 0x29eb, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x229c,
-       0x0078, 0x2272, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0081,
-       0x0048, 0x22a0, 0xa182, 0x00ff, 0x00c8, 0x22a0, 0x1078, 0x615b,
-       0x1078, 0x342f, 0x0078, 0x2272, 0x1078, 0x12f4, 0x0040, 0x2a1b,
-       0xa006, 0x6802, 0x7010, 0xa005, 0x00c0, 0x2a13, 0x2d00, 0x7012,
-       0x7016, 0x0078, 0x2a19, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006,
-       0x7016, 0xad80, 0x000d, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff,
-       0x1078, 0x3447, 0x00c0, 0x2a2a, 0xa6b4, 0x00ff, 0xa682, 0x0010,
-       0x0048, 0x2a2b, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff,
-       0x0040, 0x2a38, 0x2168, 0x6904, 0x1078, 0x1328, 0x0078, 0x2a2f,
-       0x7112, 0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x2a42,
-       0x2031, 0x0000, 0x2061, 0x6d9d, 0x6606, 0x6112, 0x600e, 0x6226,
-       0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x135f, 0x7007, 0x0002,
-       0x701b, 0x2272, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079,
-       0x0000, 0x2001, 0x6d7b, 0x2004, 0xa005, 0x00c0, 0x2a6e, 0x0068,
-       0x2a6e, 0x7818, 0xd084, 0x00c0, 0x2a6e, 0x781b, 0x0001, 0x7a22,
-       0x7b26, 0x7c2a, 0x2091, 0x4080, 0x0078, 0x2a93, 0x017e, 0x0c7e,
-       0x0e7e, 0x2071, 0x6d6d, 0x7138, 0xa182, 0x0004, 0x0048, 0x2a7c,
-       0x7030, 0x2060, 0x0078, 0x2a8d, 0x7030, 0xa0e0, 0x0008, 0xac82,
-       0x6d9d, 0x0048, 0x2a85, 0x2061, 0x6d7d, 0x2c00, 0x7032, 0x81ff,
-       0x00c0, 0x2a8b, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a,
-       0x0e7f, 0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071,
-       0x6d6d, 0x7038, 0xa005, 0x0040, 0x2acf, 0x127e, 0x2091, 0x8000,
-       0x0068, 0x2ace, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0,
-       0x2acd, 0x0c7e, 0x781b, 0x0001, 0x7034, 0x2060, 0x2c04, 0x7822,
-       0x6004, 0x7826, 0x6008, 0x782a, 0x2091, 0x4080, 0x7038, 0x8001,
-       0x703a, 0xa005, 0x00c0, 0x2ac3, 0x7033, 0x6d7d, 0x7037, 0x6d7d,
-       0x0c7f, 0x0078, 0x2acd, 0xac80, 0x0008, 0xa0fa, 0x6d9d, 0x0048,
-       0x2acb, 0x2001, 0x6d7d, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f,
-       0x007c, 0x027e, 0x2001, 0x6d52, 0x2004, 0xd0c4, 0x0040, 0x2adc,
-       0x2011, 0x8014, 0x1078, 0x2a53, 0x027f, 0x007c, 0x81ff, 0x00c0,
-       0x229c, 0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0x6032, 0x1078,
-       0x31cb, 0x127f, 0x0078, 0x2272, 0x127e, 0x0c7e, 0x0e7e, 0x2061,
-       0x0100, 0x2071, 0x6d00, 0x6044, 0xd0a4, 0x00c0, 0x2b11, 0xd084,
-       0x0040, 0x2afe, 0x1078, 0x2c34, 0x0078, 0x2b11, 0xd08c, 0x0040,
-       0x2b05, 0x1078, 0x2b4b, 0x0078, 0x2b11, 0xd094, 0x0040, 0x2b0c,
-       0x1078, 0x2b2c, 0x0078, 0x2b11, 0xd09c, 0x0040, 0x2b11, 0x1078,
-       0x2b15, 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x6043, 0x0040, 0x6043,
+       0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071,
+       0x766d, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e,
+       0x7033, 0x767d, 0x7037, 0x767d, 0x7007, 0x0001, 0x2061, 0x76bd,
+       0x6003, 0x0002, 0x007c, 0x0090, 0x2456, 0x0068, 0x2456, 0x2071,
+       0x766d, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2456, 0x2a60, 0x7820,
+       0xa08e, 0x0069, 0x00c0, 0x253d, 0x0079, 0x24da, 0x007c, 0x2071,
+       0x766d, 0x7004, 0x0079, 0x245c, 0x2460, 0x2461, 0x246b, 0x247d,
+       0x007c, 0x0090, 0x246a, 0x0068, 0x246a, 0x2b78, 0x7818, 0xd084,
+       0x0040, 0x2489, 0x007c, 0x2b78, 0x2061, 0x76bd, 0x6008, 0xa08e,
+       0x0100, 0x0040, 0x2478, 0xa086, 0x0200, 0x0040, 0x2535, 0x007c,
+       0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068, 0x6834,
+       0xa086, 0x0103, 0x0040, 0x2485, 0x007c, 0x2a60, 0x2b78, 0x7018,
+       0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2492, 0x61b0,
+       0x0079, 0x249a, 0x2100, 0xa08a, 0x0036, 0x00c8, 0x2531, 0x61b0,
+       0x0079, 0x24da, 0x2513, 0x2545, 0x254d, 0x2551, 0x2559, 0x255f,
+       0x2563, 0x256c, 0x2570, 0x2578, 0x257c, 0x2531, 0x2531, 0x2531,
+       0x2580, 0x2531, 0x2590, 0x25a7, 0x25be, 0x263a, 0x263f, 0x266c,
+       0x26b9, 0x26c8, 0x26e9, 0x271f, 0x2729, 0x2736, 0x2749, 0x2761,
+       0x276a, 0x27a7, 0x27ad, 0x2531, 0x27bd, 0x2531, 0x2531, 0x2531,
+       0x2531, 0x2531, 0x27c1, 0x27c7, 0x2531, 0x2531, 0x2531, 0x2531,
+       0x2531, 0x2531, 0x2531, 0x2531, 0x27cf, 0x2531, 0x2531, 0x2531,
+       0x2531, 0x2531, 0x27dc, 0x27e2, 0x2531, 0x2531, 0x2531, 0x2531,
+       0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531,
+       0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531,
+       0x2531, 0x2531, 0x2578, 0x257c, 0x2531, 0x2531, 0x27f4, 0x2531,
+       0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531, 0x2531,
+       0x2531, 0x2531, 0x2841, 0x290e, 0x2922, 0x2929, 0x298c, 0x29e7,
+       0x29f2, 0x2a34, 0x2a41, 0x2a4e, 0x2a51, 0x27f8, 0x2a7a, 0x2ac1,
+       0x2ace, 0x2bc8, 0x2cb6, 0x2cdd, 0x2dd5, 0x2de3, 0x2df0, 0x2e2a,
+       0x713c, 0x0078, 0x2513, 0x2021, 0x4000, 0x1078, 0x2d24, 0x127e,
+       0x2091, 0x8000, 0x0068, 0x2520, 0x7818, 0xd084, 0x0040, 0x2523,
+       0x127f, 0x0078, 0x2517, 0x781b, 0x0001, 0x7c22, 0x7926, 0x7a2a,
+       0x7b2e, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x127f,
+       0x007c, 0x2021, 0x4001, 0x0078, 0x2515, 0x2021, 0x4002, 0x0078,
+       0x2515, 0x2021, 0x4003, 0x0078, 0x2515, 0x2021, 0x4005, 0x0078,
+       0x2515, 0x2021, 0x4006, 0x0078, 0x2515, 0xa02e, 0x2520, 0x7b28,
+       0x7a2c, 0x7824, 0x7930, 0x0078, 0x2d33, 0x7823, 0x0004, 0x7824,
+       0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078,
+       0x2d37, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078, 0x2513, 0x7924,
+       0x2114, 0x0078, 0x2513, 0x2099, 0x0009, 0x20a1, 0x0009, 0x20a9,
+       0x0007, 0x53a3, 0x0078, 0x2513, 0x7824, 0x2060, 0x0078, 0x2582,
+       0x2009, 0x0001, 0x2011, 0x000f, 0x2019, 0x0013, 0x0078, 0x2513,
+       0x7d38, 0x7c3c, 0x0078, 0x2547, 0x7d38, 0x7c3c, 0x0078, 0x2553,
+       0x2061, 0x1000, 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109,
+       0x00c0, 0x2584, 0x2010, 0xa005, 0x0040, 0x2513, 0x0078, 0x2539,
+       0x2061, 0x7651, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2541, 0x8019,
+       0x0040, 0x2541, 0x604a, 0x6142, 0x782c, 0x6052, 0x7828, 0x6056,
+       0xa006, 0x605a, 0x605e, 0x1078, 0x3c71, 0x0078, 0x2513, 0x2061,
+       0x7651, 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2541, 0x8019, 0x0040,
+       0x2541, 0x604e, 0x6146, 0x782c, 0x6062, 0x7828, 0x6066, 0xa006,
+       0x606a, 0x606e, 0x1078, 0x3a47, 0x0078, 0x2513, 0xa02e, 0x2520,
+       0x81ff, 0x00c0, 0x253d, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005,
+       0x20a1, 0x7674, 0x41a1, 0x1078, 0x2cfb, 0x0040, 0x253d, 0x2009,
+       0x0020, 0x1078, 0x2d33, 0x701b, 0x25d6, 0x007c, 0x6834, 0x2008,
+       0xa084, 0x00ff, 0xa096, 0x0011, 0x0040, 0x25e2, 0xa096, 0x0019,
+       0x00c0, 0x253d, 0x810f, 0xa18c, 0x00ff, 0x0040, 0x253d, 0x710e,
+       0x700c, 0x8001, 0x0040, 0x2613, 0x700e, 0x1078, 0x2cfb, 0x0040,
+       0x253d, 0x2009, 0x0020, 0x2061, 0x76bd, 0x6224, 0x6328, 0x642c,
+       0x6530, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9,
+       0x0000, 0x1078, 0x2d33, 0x701b, 0x2606, 0x007c, 0x6834, 0xa084,
+       0x00ff, 0xa096, 0x0002, 0x0040, 0x2611, 0xa096, 0x000a, 0x00c0,
+       0x253d, 0x0078, 0x25e8, 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a,
+       0x1078, 0x3722, 0x00c0, 0x2621, 0x7007, 0x0003, 0x701b, 0x2623,
+       0x007c, 0x1078, 0x3b0a, 0x127e, 0x2091, 0x8000, 0x20a9, 0x0005,
+       0x2099, 0x7674, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1,
+       0x0000, 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, 0x127f,
+       0x0078, 0x2d37, 0x6198, 0x7824, 0x609a, 0x0078, 0x2513, 0x2091,
+       0x8000, 0x7823, 0x4000, 0x7827, 0x4953, 0x782b, 0x5020, 0x782f,
+       0x2020, 0x2009, 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836, 0x2061,
+       0x0100, 0x6200, 0x2061, 0x0200, 0x603c, 0x8007, 0xa205, 0x783a,
+       0x2009, 0x04fd, 0x2104, 0x783e, 0x781b, 0x0001, 0x2091, 0x5000,
+       0x2091, 0x4080, 0x2071, 0x0010, 0x20c1, 0x00f0, 0xa08a, 0x0003,
+       0x00c8, 0x0427, 0x0078, 0x0423, 0x81ff, 0x00c0, 0x253d, 0x1078,
+       0x2d13, 0x0040, 0x2541, 0x7c28, 0x7d2c, 0x1078, 0x3969, 0xd28c,
+       0x00c0, 0x267e, 0x1078, 0x38f9, 0x0078, 0x2680, 0x1078, 0x3935,
+       0x00c0, 0x26aa, 0x2061, 0x7d00, 0x127e, 0x2091, 0x8000, 0x6000,
+       0xa086, 0x0000, 0x0040, 0x2698, 0x6010, 0xa06d, 0x0040, 0x2698,
+       0x683c, 0xa406, 0x00c0, 0x2698, 0x6840, 0xa506, 0x0040, 0x26a3,
+       0x127f, 0xace0, 0x0008, 0x2001, 0x7615, 0x2004, 0xac02, 0x00c8,
+       0x253d, 0x0078, 0x2684, 0x1078, 0x6738, 0x127f, 0x0040, 0x253d,
+       0x0078, 0x2513, 0xa00e, 0x2001, 0x0005, 0x1078, 0x3b0a, 0x127e,
+       0x2091, 0x8000, 0x1078, 0x6b47, 0x1078, 0x3a7a, 0x127f, 0x0078,
+       0x2513, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541,
+       0x1078, 0x38ae, 0x1078, 0x397a, 0x0040, 0x253d, 0x0078, 0x2513,
+       0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x2031,
+       0x000f, 0x1078, 0x38ae, 0x8631, 0x00c8, 0x26d1, 0x2019, 0x0005,
+       0x1078, 0x399b, 0x0040, 0x253d, 0x7828, 0xa08a, 0x1000, 0x00c8,
+       0x2541, 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x457b, 0x0078,
+       0x2513, 0x127e, 0x2091, 0x8000, 0x81ff, 0x00c0, 0x2719, 0x2029,
+       0x00ff, 0x644c, 0x2400, 0xa506, 0x0040, 0x2713, 0x2508, 0x1078,
+       0x3825, 0x00c0, 0x2713, 0x2031, 0x000f, 0x1078, 0x38ae, 0x8631,
+       0x00c8, 0x26fd, 0x2019, 0x0004, 0x1078, 0x399b, 0x0040, 0x2719,
+       0x7824, 0xa08a, 0x1000, 0x00c8, 0x271c, 0x8003, 0x800b, 0x810b,
+       0xa108, 0x1078, 0x457b, 0x8529, 0x00c8, 0x26f2, 0x127f, 0x0078,
+       0x2513, 0x127f, 0x0078, 0x253d, 0x127f, 0x0078, 0x2541, 0x1078,
+       0x2d13, 0x0040, 0x2541, 0x1078, 0x38de, 0x1078, 0x3969, 0x0078,
+       0x2513, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541,
+       0x1078, 0x38c7, 0x1078, 0x3969, 0x0078, 0x2513, 0x81ff, 0x00c0,
+       0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x3938, 0x0040,
+       0x253d, 0x1078, 0x376a, 0x1078, 0x38f2, 0x1078, 0x3969, 0x0078,
+       0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x38ae, 0x62a0,
+       0x2019, 0x0005, 0x0c7e, 0x1078, 0x39a6, 0x0c7f, 0x1078, 0x4962,
+       0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b, 0x1078, 0x3969, 0x0078,
+       0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x3969, 0x2208,
+       0x0078, 0x2513, 0x157e, 0x0d7e, 0x0e7e, 0x2069, 0x76ff, 0x6810,
+       0x6914, 0xa10a, 0x00c8, 0x2776, 0x2009, 0x0000, 0x6816, 0x2011,
+       0x0000, 0x2019, 0x0000, 0x20a9, 0x007e, 0x2069, 0x7720, 0x2d04,
+       0xa075, 0x0040, 0x278b, 0x704c, 0x1078, 0x2795, 0xa210, 0x7080,
+       0x1078, 0x2795, 0xa318, 0x8d68, 0x00f0, 0x277f, 0x2300, 0xa218,
+       0x0e7f, 0x0d7f, 0x157f, 0x0078, 0x2513, 0x0f7e, 0x017e, 0xa07d,
+       0x0040, 0x27a4, 0x2001, 0x0000, 0x8000, 0x2f0c, 0x81ff, 0x0040,
+       0x27a4, 0x2178, 0x0078, 0x279c, 0x017f, 0x0f7f, 0x007c, 0x2069,
+       0x76ff, 0x6910, 0x629c, 0x0078, 0x2513, 0x81ff, 0x00c0, 0x253d,
+       0x614c, 0xa190, 0x232f, 0x2214, 0xa294, 0x00ff, 0x6068, 0xa084,
+       0xff00, 0xa215, 0x6364, 0x0078, 0x2513, 0x613c, 0x6240, 0x0078,
+       0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x0078, 0x2513, 0x1078,
+       0x2d13, 0x0040, 0x2541, 0x6244, 0x6338, 0x0078, 0x2513, 0x613c,
+       0x6240, 0x7824, 0x603e, 0x7b28, 0x6342, 0x2069, 0x7651, 0x831f,
+       0xa305, 0x6816, 0x0078, 0x2513, 0x1078, 0x2d13, 0x0040, 0x2541,
+       0x0078, 0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x7828, 0xa00d,
+       0x0040, 0x2541, 0x782c, 0xa005, 0x0040, 0x2541, 0x6244, 0x6146,
+       0x6338, 0x603a, 0x0078, 0x2513, 0x7d38, 0x7c3c, 0x0078, 0x25c0,
+       0x7824, 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x253d, 0x624c,
+       0xa084, 0xff00, 0x8007, 0xa206, 0x00c0, 0x2810, 0x2001, 0x7640,
+       0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d37,
+       0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x6004,
+       0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x253d, 0x0c7e, 0x1078,
+       0x2cfb, 0x0c7f, 0x0040, 0x253d, 0x6837, 0x0000, 0x6838, 0xc0fd,
+       0x683a, 0x1078, 0x6a41, 0x0040, 0x253d, 0x7007, 0x0003, 0x701b,
+       0x2832, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x253d, 0xad80,
+       0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078,
+       0x2d37, 0x1078, 0x2cfb, 0x0040, 0x253d, 0x2009, 0x001c, 0x7a2c,
+       0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2d33, 0x701b, 0x2850, 0x007c,
+       0xade8, 0x000d, 0x6800, 0xa005, 0x0040, 0x2541, 0x6804, 0xd0ac,
+       0x0040, 0x285d, 0xd0a4, 0x0040, 0x2541, 0xd094, 0x0040, 0x2868,
+       0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c, 0xffdf, 0x6106, 0x0c7f,
+       0xd08c, 0x0040, 0x2873, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18d,
+       0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100, 0x210c, 0xa18a, 0x0002,
+       0x0048, 0x2888, 0xd084, 0x0040, 0x2888, 0x6a28, 0xa28a, 0x007f,
+       0x00c8, 0x2541, 0xa288, 0x232f, 0x210c, 0xa18c, 0x00ff, 0x6152,
+       0xd0dc, 0x0040, 0x2891, 0x6828, 0xa08a, 0x007f, 0x00c8, 0x2541,
+       0x604e, 0x6808, 0xa08a, 0x0100, 0x0048, 0x2541, 0xa08a, 0x0841,
+       0x00c8, 0x2541, 0xa084, 0x0007, 0x00c0, 0x2541, 0x680c, 0xa005,
+       0x0040, 0x2541, 0x6810, 0xa005, 0x0040, 0x2541, 0x6848, 0x6940,
+       0xa10a, 0x00c8, 0x2541, 0x8001, 0x0040, 0x2541, 0x684c, 0x6944,
+       0xa10a, 0x00c8, 0x2541, 0x8001, 0x0040, 0x2541, 0x20a9, 0x001c,
+       0x2d98, 0x2069, 0x7651, 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff,
+       0x613e, 0x8007, 0xa084, 0x00ff, 0x6042, 0x1078, 0x3c71, 0x1078,
+       0x3a47, 0x6000, 0xa086, 0x0000, 0x00c0, 0x290c, 0x6808, 0x602a,
+       0x1078, 0x1dea, 0x6818, 0x691c, 0x6a20, 0x6b24, 0x8007, 0x810f,
+       0x8217, 0x831f, 0x6016, 0x611a, 0x621e, 0x6322, 0x6c04, 0xd4f4,
+       0x0040, 0x28ec, 0x6830, 0x6934, 0x6a38, 0x6b3c, 0x8007, 0x810f,
+       0x8217, 0x831f, 0x0078, 0x28ee, 0xa084, 0xf0ff, 0x6006, 0x610a,
+       0x620e, 0x6312, 0x1078, 0x4607, 0x0c7e, 0x2061, 0x0100, 0x602f,
+       0x0040, 0x602f, 0x0000, 0x0c7f, 0x60b4, 0xa005, 0x0040, 0x2908,
+       0x6003, 0x0001, 0x2091, 0x301d, 0x1078, 0x357b, 0x0078, 0x290c,
+       0x6003, 0x0004, 0x2091, 0x301d, 0x0078, 0x2513, 0x6000, 0xa086,
+       0x0000, 0x0040, 0x253d, 0x2069, 0x7651, 0x7830, 0x6842, 0x7834,
+       0x6846, 0x2d00, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
+       0x0078, 0x2d37, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x357b, 0x0078,
+       0x2513, 0x81ff, 0x00c0, 0x253d, 0x617c, 0x81ff, 0x0040, 0x2943,
+       0x703f, 0x0000, 0x2001, 0x7cc0, 0x2009, 0x0040, 0x7a2c, 0x7b28,
+       0x7c3c, 0x7d38, 0x127e, 0x2091, 0x8000, 0x1078, 0x2d37, 0x701b,
+       0x2510, 0x127f, 0x007c, 0x703f, 0x0001, 0x0d7e, 0x2069, 0x7cc0,
+       0x20a9, 0x0040, 0x20a1, 0x7cc0, 0x2019, 0xffff, 0x43a4, 0x654c,
+       0xa588, 0x232f, 0x210c, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011,
+       0x0002, 0x2100, 0xa506, 0x0040, 0x2975, 0x1078, 0x3825, 0x00c0,
+       0x2975, 0x6014, 0x821c, 0x0048, 0x296d, 0xa398, 0x7cc0, 0xa085,
+       0xff00, 0x8007, 0x201a, 0x0078, 0x2974, 0xa398, 0x7cc0, 0x2324,
+       0xa4a4, 0xff00, 0xa405, 0x201a, 0x8210, 0x8108, 0xa182, 0x0080,
+       0x00c8, 0x297c, 0x0078, 0x2959, 0x8201, 0x8007, 0x2d0c, 0xa105,
+       0x206a, 0x0d7f, 0x20a9, 0x0040, 0x20a1, 0x7cc0, 0x2099, 0x7cc0,
+       0x1078, 0x35c4, 0x0078, 0x2932, 0x1078, 0x2d13, 0x0040, 0x2541,
+       0x0c7e, 0x1078, 0x2cfb, 0x0c7f, 0x0040, 0x253d, 0x2001, 0x7652,
+       0x2004, 0xd0b4, 0x0040, 0x29b9, 0x6000, 0xd08c, 0x00c0, 0x29b9,
+       0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x29b9, 0x6837,
+       0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x6a79, 0x0040, 0x253d,
+       0x7007, 0x0003, 0x701b, 0x29b5, 0x007c, 0x1078, 0x2d13, 0x0040,
+       0x2541, 0x20a9, 0x0029, 0x2c98, 0xade8, 0x0002, 0x2da0, 0x53a3,
+       0x20a9, 0x0002, 0xac80, 0x0004, 0x2098, 0xad80, 0x0004, 0x20a0,
+       0x1078, 0x35c4, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, 0xad80,
+       0x0006, 0x20a0, 0x1078, 0x35c4, 0x20a9, 0x0004, 0xac80, 0x000a,
+       0x2098, 0xad80, 0x000a, 0x20a0, 0x1078, 0x35c4, 0x2d00, 0x2009,
+       0x0029, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x2d37, 0x81ff,
+       0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541, 0x1078, 0x3985,
+       0x0078, 0x2513, 0x81ff, 0x00c0, 0x253d, 0x7828, 0xa08a, 0x1000,
+       0x00c8, 0x2541, 0x1078, 0x2d13, 0x0040, 0x2541, 0x2031, 0x000f,
+       0x1078, 0x38ae, 0x8631, 0x00c8, 0x2a00, 0x2019, 0x0004, 0x1078,
+       0x399b, 0x7924, 0x810f, 0x7a28, 0x1078, 0x2a10, 0x0078, 0x2513,
+       0xa186, 0x00ff, 0x0040, 0x2a18, 0x1078, 0x2a28, 0x0078, 0x2a27,
+       0x2029, 0x007e, 0x2061, 0x7600, 0x644c, 0x2400, 0xa506, 0x0040,
+       0x2a24, 0x2508, 0x1078, 0x2a28, 0x8529, 0x00c8, 0x2a1d, 0x007c,
+       0x1078, 0x3825, 0x00c0, 0x2a33, 0x2200, 0x8003, 0x800b, 0x810b,
+       0xa108, 0x1078, 0x457b, 0x007c, 0x81ff, 0x00c0, 0x253d, 0x1078,
+       0x2d13, 0x0040, 0x2541, 0x1078, 0x38ae, 0x1078, 0x3990, 0x0078,
+       0x2513, 0x81ff, 0x00c0, 0x253d, 0x1078, 0x2d13, 0x0040, 0x2541,
+       0x1078, 0x38ae, 0x1078, 0x397a, 0x0078, 0x2513, 0x6100, 0x0078,
+       0x2513, 0x1078, 0x2d13, 0x0040, 0x2541, 0x6004, 0xa086, 0x0707,
+       0x0040, 0x2541, 0x2001, 0x7600, 0x2004, 0xa086, 0x0003, 0x00c0,
+       0x253d, 0x0d7e, 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x2a6a,
+       0xace8, 0x0006, 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a,
+       0x6b04, 0x831f, 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200,
+       0x0078, 0x2513, 0x7824, 0xa084, 0x00ff, 0xa086, 0x00ff, 0x0040,
+       0x2a84, 0x81ff, 0x00c0, 0x253d, 0x7828, 0xa08a, 0x1000, 0x00c8,
+       0x2541, 0x7924, 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0040,
+       0x2a98, 0xa182, 0x007f, 0x00c8, 0x2541, 0x2100, 0x1078, 0x209a,
+       0x027e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x2061, 0x7849, 0x601b,
+       0x0000, 0x601f, 0x0000, 0x2061, 0x0100, 0x6030, 0xa084, 0x00ff,
+       0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009,
+       0x001e, 0x2011, 0x35a0, 0x1078, 0x45fe, 0x7924, 0xa18c, 0xff00,
+       0x810f, 0x7a28, 0x1078, 0x2a10, 0x127f, 0x0c7f, 0x027f, 0x0078,
+       0x2513, 0x7924, 0xa18c, 0xff00, 0x810f, 0x0c7e, 0x1078, 0x37ee,
+       0x2c08, 0x0c7f, 0x00c0, 0x2541, 0x0078, 0x2513, 0x81ff, 0x00c0,
+       0x253d, 0x60bc, 0xd09c, 0x0040, 0x253d, 0x1078, 0x2cfb, 0x0040,
+       0x253d, 0x6823, 0x0000, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38,
+       0x1078, 0x2d33, 0x701b, 0x2ae5, 0x007c, 0x2009, 0x0080, 0x1078,
+       0x3825, 0x00c0, 0x2af2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006,
+       0x0040, 0x2af6, 0x2021, 0x400a, 0x0078, 0x2515, 0x0d7e, 0xade8,
+       0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820,
+       0xa0be, 0x0100, 0x0040, 0x2b68, 0xa0be, 0x0112, 0x0040, 0x2b68,
+       0xa0be, 0x0113, 0x0040, 0x2b68, 0xa0be, 0x0114, 0x0040, 0x2b68,
+       0xa0be, 0x0117, 0x0040, 0x2b68, 0xa0be, 0x011a, 0x0040, 0x2b68,
+       0xa0be, 0x0121, 0x0040, 0x2b5e, 0xa0be, 0x0131, 0x0040, 0x2b5e,
+       0xa0be, 0x0171, 0x0040, 0x2b68, 0xa0be, 0x0173, 0x0040, 0x2b68,
+       0xa0be, 0x01a1, 0x00c0, 0x2b31, 0x6830, 0x8007, 0x6832, 0x0078,
+       0x2b6e, 0xa0be, 0x0212, 0x0040, 0x2b64, 0xa0be, 0x0213, 0x0040,
+       0x2b64, 0xa0be, 0x0214, 0x0040, 0x2b56, 0xa0be, 0x0217, 0x0040,
+       0x2b50, 0xa0be, 0x021a, 0x00c0, 0x2b4a, 0x6838, 0x8007, 0x683a,
+       0x0078, 0x2b68, 0xa0be, 0x0300, 0x0040, 0x2b68, 0x0078, 0x2541,
+       0xad80, 0x0010, 0x20a9, 0x0007, 0x1078, 0x2ba4, 0xad80, 0x000e,
+       0x20a9, 0x0001, 0x1078, 0x2ba4, 0x0078, 0x2b68, 0xad80, 0x000c,
+       0x1078, 0x2bb2, 0x0078, 0x2b6e, 0xad80, 0x000e, 0x1078, 0x2bb2,
+       0xad80, 0x000c, 0x20a9, 0x0001, 0x1078, 0x2ba4, 0x0c7e, 0x1078,
+       0x2cfb, 0x0040, 0x2b99, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119,
+       0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e, 0x6883, 0x0000,
+       0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, 0x0000, 0x0c7f,
+       0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000,
+       0x1078, 0x6a5d, 0x0040, 0x253d, 0x7007, 0x0003, 0x701b, 0x2b9d,
+       0x007c, 0x0c7f, 0x0d7f, 0x0078, 0x253d, 0x6820, 0xa086, 0x8001,
+       0x0040, 0x253d, 0x0078, 0x2513, 0x017e, 0x2008, 0x2044, 0x8000,
+       0x204c, 0x8000, 0x290a, 0x8108, 0x280a, 0x8108, 0x00f0, 0x2ba6,
+       0x017f, 0x007c, 0x017e, 0x0a7e, 0x0b7e, 0x2008, 0x2044, 0x8000,
+       0x204c, 0x8000, 0x2054, 0x8000, 0x205c, 0x2b0a, 0x8108, 0x2a0a,
+       0x8108, 0x290a, 0x8108, 0x280a, 0x0b7f, 0x0a7f, 0x017f, 0x007c,
+       0x81ff, 0x00c0, 0x253d, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f,
+       0xa182, 0x0080, 0x0048, 0x2541, 0xa182, 0x00ff, 0x00c8, 0x2541,
+       0x7a2c, 0x7b28, 0x6064, 0xa306, 0x00c0, 0x2be6, 0x6068, 0xa24e,
+       0x0040, 0x2541, 0xa9cc, 0xff00, 0x0040, 0x2541, 0x0c7e, 0x1078,
+       0x2c5a, 0x2c68, 0x0c7f, 0x0040, 0x2c0d, 0xa0c6, 0x4000, 0x00c0,
+       0x2bf3, 0x0078, 0x2c0a, 0xa0c6, 0x4007, 0x00c0, 0x2bfa, 0x2408,
+       0x0078, 0x2c0a, 0xa0c6, 0x4008, 0x00c0, 0x2c02, 0x2708, 0x2610,
+       0x0078, 0x2c0a, 0xa0c6, 0x4009, 0x00c0, 0x2c08, 0x0078, 0x2c0a,
+       0x2001, 0x4006, 0x2020, 0x0078, 0x2515, 0x017e, 0x0b7e, 0x0c7e,
+       0x0e7e, 0x2c70, 0x1078, 0x5b9c, 0x0040, 0x2c48, 0x2d00, 0x601a,
+       0x2e58, 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x2cfb, 0x0c7f, 0x2b70,
+       0x0040, 0x253d, 0x6837, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000,
+       0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x22bb,
+       0x127f, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+       0x0002, 0x1078, 0x37d1, 0x127e, 0x2091, 0x8000, 0x7088, 0x8000,
+       0x708a, 0x127f, 0x2009, 0x0002, 0x1078, 0x5c29, 0xa085, 0x0001,
+       0x0e7f, 0x0c7f, 0x0b7f, 0x017f, 0x0040, 0x253d, 0x7007, 0x0003,
+       0x701b, 0x2c53, 0x007c, 0x6830, 0xa086, 0x0100, 0x00c0, 0x2513,
+       0x0078, 0x253d, 0x0e7e, 0x0d7e, 0x2029, 0x0000, 0x2021, 0x0080,
+       0x20a9, 0x007f, 0x2071, 0x77a0, 0x2e04, 0xa005, 0x00c0, 0x2c6e,
+       0x2100, 0xa406, 0x0040, 0x2cab, 0x0078, 0x2c9f, 0x2068, 0x6f10,
+       0x2700, 0xa306, 0x00c0, 0x2c90, 0x6e14, 0x2600, 0xa206, 0x00c0,
+       0x2c90, 0x2400, 0xa106, 0x00c0, 0x2c8c, 0x2d60, 0xd884, 0x0040,
+       0x2cb1, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2cb1,
+       0x2001, 0x4000, 0x0078, 0x2cb2, 0x2001, 0x4007, 0x0078, 0x2cb2,
+       0x2400, 0xa106, 0x00c0, 0x2c9f, 0x6e14, 0x87ff, 0x00c0, 0x2c9b,
+       0x86ff, 0x0040, 0x2cab, 0x2001, 0x4008, 0x0078, 0x2cb2, 0x8420,
+       0x8e70, 0x00f0, 0x2c64, 0x2001, 0x4009, 0x0078, 0x2cb2, 0x2001,
+       0x0001, 0x0078, 0x2cb2, 0x1078, 0x37ee, 0x00c0, 0x2ca7, 0x6312,
+       0x6216, 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff, 0x00c0,
+       0x253d, 0x1078, 0x2cfb, 0x0040, 0x253d, 0x6837, 0x0000, 0x7824,
+       0xa005, 0x0040, 0x2541, 0xa096, 0x00ff, 0x0040, 0x2ccb, 0xa092,
+       0x0004, 0x00c8, 0x2541, 0x2010, 0x2d18, 0x1078, 0x227d, 0x0040,
+       0x253d, 0x7007, 0x0003, 0x701b, 0x2cd6, 0x007c, 0x6830, 0xa086,
+       0x0100, 0x0040, 0x253d, 0x0078, 0x2513, 0x81ff, 0x00c0, 0x253d,
+       0x7924, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048, 0x2541,
+       0xa182, 0x00ff, 0x00c8, 0x2541, 0x127e, 0x2091, 0x8000, 0x1078,
+       0x697f, 0x00c0, 0x2cf8, 0x1078, 0x380d, 0x127f, 0x0078, 0x2513,
+       0x127f, 0x0078, 0x253d, 0x1078, 0x132f, 0x0040, 0x2d12, 0xa006,
+       0x6802, 0x7010, 0xa005, 0x00c0, 0x2d0a, 0x2d00, 0x7012, 0x7016,
+       0x0078, 0x2d10, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016,
+       0xad80, 0x000d, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x1078,
+       0x3825, 0x00c0, 0x2d21, 0xa6b4, 0x00ff, 0xa682, 0x0010, 0x0048,
+       0x2d22, 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, 0x0040,
+       0x2d2f, 0x2168, 0x6904, 0x1078, 0x1348, 0x0078, 0x2d26, 0x7112,
+       0x7116, 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x2d39, 0x2031,
+       0x0000, 0x2061, 0x76bd, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a,
+       0x642e, 0x6532, 0x2c10, 0x1078, 0x137f, 0x7007, 0x0002, 0x701b,
+       0x2513, 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, 0x0000,
+       0x2001, 0x767b, 0x2004, 0xa005, 0x00c0, 0x2d65, 0x0068, 0x2d65,
+       0x7818, 0xd084, 0x00c0, 0x2d65, 0x781b, 0x0001, 0x7a22, 0x7b26,
+       0x7c2a, 0x2091, 0x4080, 0x0078, 0x2d8a, 0x017e, 0x0c7e, 0x0e7e,
+       0x2071, 0x766d, 0x7138, 0xa182, 0x0008, 0x0048, 0x2d73, 0x7030,
+       0x2060, 0x0078, 0x2d84, 0x7030, 0xa0e0, 0x0008, 0xac82, 0x76bd,
+       0x0048, 0x2d7c, 0x2061, 0x767d, 0x2c00, 0x7032, 0x81ff, 0x00c0,
+       0x2d82, 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, 0x0e7f,
+       0x0c7f, 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, 0x766d,
+       0x7038, 0xa005, 0x0040, 0x2dc6, 0x127e, 0x2091, 0x8000, 0x0068,
+       0x2dc5, 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x2dc4,
+       0x0c7e, 0x781b, 0x0001, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004,
+       0x7826, 0x6008, 0x782a, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a,
+       0xa005, 0x00c0, 0x2dba, 0x7033, 0x767d, 0x7037, 0x767d, 0x0c7f,
+       0x0078, 0x2dc4, 0xac80, 0x0008, 0xa0fa, 0x76bd, 0x0048, 0x2dc2,
+       0x2001, 0x767d, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, 0x007c,
+       0x027e, 0x2001, 0x7652, 0x2004, 0xd0c4, 0x0040, 0x2dd3, 0x2011,
+       0x8014, 0x1078, 0x2d4a, 0x027f, 0x007c, 0x81ff, 0x00c0, 0x253d,
+       0x127e, 0x2091, 0x8000, 0x6030, 0xc08d, 0x6032, 0x1078, 0x357b,
+       0x127f, 0x0078, 0x2513, 0x7824, 0x2008, 0xa18c, 0xfffd, 0x00c0,
+       0x2dee, 0x61c8, 0xa10d, 0x61ca, 0x0078, 0x2513, 0x0078, 0x2541,
+       0x81ff, 0x00c0, 0x253d, 0x6000, 0xa086, 0x0003, 0x00c0, 0x253d,
+       0x2001, 0x7652, 0x2004, 0xd0a4, 0x00c0, 0x253d, 0x1078, 0x2d13,
+       0x0040, 0x2541, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0,
+       0x2e0d, 0x7828, 0xa005, 0x0040, 0x2513, 0x0c7e, 0x1078, 0x2cfb,
+       0x0c7f, 0x0040, 0x253d, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838,
+       0xc0fd, 0x683a, 0x1078, 0x6ae6, 0x0040, 0x253d, 0x7007, 0x0003,
+       0x701b, 0x2e23, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x253d,
+       0x0078, 0x2513, 0x2001, 0x7600, 0x2004, 0xa086, 0x0003, 0x00c0,
+       0x253d, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x2cfb,
+       0x0040, 0x253d, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000,
+       0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, 0x3825,
+       0x00c0, 0x2e70, 0x6004, 0xa0c6, 0x0707, 0x0040, 0x2e70, 0xa084,
+       0x00ff, 0xa0c6, 0x0006, 0x00c0, 0x2e70, 0x87ff, 0x0040, 0x2e63,
+       0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078,
+       0x2bb2, 0x0078, 0x2e6c, 0xac80, 0x000a, 0x2098, 0x3400, 0x20a9,
+       0x0004, 0x53a3, 0x1078, 0x2bb2, 0x21a2, 0x94a0, 0xa6b0, 0x0005,
+       0x8108, 0xa186, 0x007e, 0x0040, 0x2e7b, 0xa686, 0x0028, 0x0040,
+       0x2e84, 0x0078, 0x2e46, 0x86ff, 0x00c0, 0x2e82, 0x7120, 0x810b,
+       0x0078, 0x2513, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600, 0x7022,
+       0x772a, 0x2061, 0x76bd, 0x6007, 0x0000, 0x6612, 0x7024, 0x600e,
+       0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x137f, 0x7007,
+       0x0002, 0x701b, 0x2e9c, 0x007c, 0x702c, 0xa005, 0x00c0, 0x2eae,
+       0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0x76bd,
+       0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x2e46, 0x7120, 0x810b,
+       0x0078, 0x2513, 0x127e, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071,
+       0x7600, 0x6044, 0xd0a4, 0x00c0, 0x2edb, 0xd084, 0x0040, 0x2ec4,
+       0x1078, 0x3004, 0x0078, 0x2ed7, 0xd08c, 0x0040, 0x2ecb, 0x1078,
+       0x2f1b, 0x0078, 0x2ed7, 0xd094, 0x0040, 0x2ed2, 0x1078, 0x2efe,
+       0x0078, 0x2ed7, 0xd09c, 0x0040, 0x2ed7, 0x1078, 0x2ee5, 0x0e7f,
+       0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, 0x00c0, 0x2ee2,
+       0xc19d, 0x612a, 0x017f, 0x0078, 0x2ed7, 0x6043, 0x0040, 0x6043,
        0x0000, 0x706f, 0x0000, 0x7087, 0x0001, 0x70a7, 0x0000, 0x2009,
-       0x73c0, 0x200b, 0x0000, 0x7073, 0x000f, 0x2009, 0x000f, 0x2011,
-       0x3187, 0x1078, 0x415f, 0x007c, 0x7070, 0xa005, 0x00c0, 0x2b4a,
-       0x2011, 0x3187, 0x1078, 0x40d1, 0x6043, 0x0020, 0x6043, 0x0000,
-       0x6044, 0xd08c, 0x00c0, 0x2b46, 0x7003, 0x0001, 0x7083, 0x0000,
-       0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x2b4a, 0x7077, 0x0000,
-       0x0078, 0x2b4a, 0x007c, 0x7074, 0xa08a, 0x0003, 0x00c8, 0x2b54,
-       0x1079, 0x2b57, 0x0078, 0x2b56, 0x1078, 0x12b7, 0x007c, 0x2b5a,
-       0x2ba9, 0x2c33, 0x0f7e, 0x7077, 0x0001, 0x20e1, 0xa000, 0x20e1,
-       0x8700, 0x1078, 0x1bcc, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079,
-       0x7200, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f,
+       0x7cc0, 0x200b, 0x0000, 0x707f, 0x0000, 0x7073, 0x000f, 0x2009,
+       0x000f, 0x2011, 0x353b, 0x1078, 0x45fe, 0x007c, 0x7070, 0xa005,
+       0x00c0, 0x2f1a, 0x2011, 0x353b, 0x1078, 0x456e, 0x6043, 0x0020,
+       0x6043, 0x0000, 0x6044, 0xd08c, 0x00c0, 0x2f16, 0x7083, 0x0000,
+       0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x2f1a, 0x7077, 0x0000,
+       0x0078, 0x2f1a, 0x007c, 0x7074, 0xa08a, 0x0003, 0x00c8, 0x2f24,
+       0x1079, 0x2f27, 0x0078, 0x2f26, 0x1078, 0x12d5, 0x007c, 0x2f2a,
+       0x2f79, 0x3003, 0x0f7e, 0x7077, 0x0001, 0x20e1, 0xa000, 0x20e1,
+       0x8700, 0x1078, 0x1dea, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079,
+       0x7b00, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f,
        0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, 0x781f,
        0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, 0x782f,
-       0x0000, 0x2079, 0x720c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099,
-       0x6d05, 0x20a1, 0x720e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0x7212,
-       0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x7200, 0x20a1, 0x020b,
+       0x0000, 0x2079, 0x7b0c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099,
+       0x7605, 0x20a1, 0x7b0e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0x7b12,
+       0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0x7b00, 0x20a1, 0x020b,
        0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, 0x1078,
-       0x31b2, 0x0f7f, 0x707b, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000,
-       0x007c, 0x0d7e, 0x7078, 0x707b, 0x0000, 0xa025, 0x0040, 0x2c1d,
-       0x6020, 0xd0b4, 0x00c0, 0x2c1b, 0x7184, 0x81ff, 0x0040, 0x2c04,
-       0xa486, 0x000c, 0x00c0, 0x2c0f, 0xa480, 0x0018, 0x8004, 0x20a8,
-       0x2011, 0x7280, 0x2019, 0x7200, 0x220c, 0x2304, 0xa106, 0x00c0,
-       0x2bdb, 0x8210, 0x8318, 0x00f0, 0x2bc4, 0x6043, 0x0004, 0x608b,
+       0x3562, 0x0f7f, 0x707b, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000,
+       0x007c, 0x0d7e, 0x7078, 0x707b, 0x0000, 0xa025, 0x0040, 0x2fed,
+       0x6020, 0xd0b4, 0x00c0, 0x2feb, 0x7184, 0x81ff, 0x0040, 0x2fd4,
+       0xa486, 0x000c, 0x00c0, 0x2fdf, 0xa480, 0x0018, 0x8004, 0x20a8,
+       0x2011, 0x7b80, 0x2019, 0x7b00, 0x220c, 0x2304, 0xa106, 0x00c0,
+       0x2fab, 0x8210, 0x8318, 0x00f0, 0x2f94, 0x6043, 0x0004, 0x608b,
        0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x7077, 0x0002, 0x7083,
-       0x0002, 0x0078, 0x2c1b, 0x2069, 0x7280, 0x6930, 0xa18e, 0x1101,
-       0x00c0, 0x2c0f, 0x6834, 0xa005, 0x00c0, 0x2c0f, 0x6900, 0xa18c,
-       0x00ff, 0x00c0, 0x2bef, 0x6804, 0xa005, 0x0040, 0x2c04, 0x2011,
-       0x728e, 0x2019, 0x6d05, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102,
-       0x0048, 0x2c02, 0x00c0, 0x2c0f, 0x8210, 0x8318, 0x00f0, 0x2bf5,
-       0x0078, 0x2c0f, 0x7087, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000,
-       0x2099, 0x7280, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043,
-       0x0008, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2c1b, 0x60c3,
-       0x000c, 0x1078, 0x31b2, 0x0d7f, 0x007c, 0x6020, 0xd0b4, 0x00c0,
-       0x2c1b, 0x60c3, 0x000c, 0x2011, 0x6f1a, 0x2013, 0x0000, 0x707b,
+       0x0002, 0x0078, 0x2feb, 0x2069, 0x7b80, 0x6930, 0xa18e, 0x1101,
+       0x00c0, 0x2fdf, 0x6834, 0xa005, 0x00c0, 0x2fdf, 0x6900, 0xa18c,
+       0x00ff, 0x00c0, 0x2fbf, 0x6804, 0xa005, 0x0040, 0x2fd4, 0x2011,
+       0x7b8e, 0x2019, 0x7605, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102,
+       0x0048, 0x2fd2, 0x00c0, 0x2fdf, 0x8210, 0x8318, 0x00f0, 0x2fc5,
+       0x0078, 0x2fdf, 0x7087, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000,
+       0x2099, 0x7b80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043,
+       0x0008, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2feb, 0x60c3,
+       0x000c, 0x1078, 0x3562, 0x0d7f, 0x007c, 0x6020, 0xd0b4, 0x00c0,
+       0x2feb, 0x60c3, 0x000c, 0x2011, 0x7840, 0x2013, 0x0000, 0x707b,
        0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078,
-       0x4fdc, 0x0078, 0x2c1b, 0x007c, 0x7080, 0xa08a, 0x001d, 0x00c8,
-       0x2c3d, 0x1079, 0x2c40, 0x0078, 0x2c3f, 0x1078, 0x12b7, 0x007c,
-       0x2c64, 0x2c73, 0x2ca6, 0x2cbb, 0x2ced, 0x2d17, 0x2d49, 0x2d73,
-       0x2da5, 0x2dcb, 0x2e1a, 0x2e3c, 0x2e60, 0x2e76, 0x2e9c, 0x2eaf,
-       0x2eb8, 0x2ed1, 0x2f01, 0x2f2b, 0x2f5b, 0x2f85, 0x2fce, 0x3003,
-       0x3025, 0x3063, 0x3087, 0x30a0, 0x30ad, 0x7003, 0x0007, 0x6004,
+       0x5579, 0x0078, 0x2feb, 0x007c, 0x7080, 0xa08a, 0x001d, 0x00c8,
+       0x300d, 0x1079, 0x3010, 0x0078, 0x300f, 0x1078, 0x12d5, 0x007c,
+       0x3034, 0x3043, 0x3074, 0x3089, 0x30b9, 0x30e1, 0x3111, 0x313b,
+       0x316b, 0x3191, 0x31da, 0x31fc, 0x3220, 0x3236, 0x325e, 0x3271,
+       0x327a, 0x3293, 0x32c1, 0x32e9, 0x3317, 0x3341, 0x3384, 0x33b5,
+       0x33d7, 0x3415, 0x343b, 0x3454, 0x3461, 0x7003, 0x0007, 0x6004,
        0xa084, 0xfff9, 0x6006, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0,
-       0x6043, 0x0002, 0x7083, 0x0001, 0x2009, 0x07d0, 0x2011, 0x318e,
-       0x1078, 0x40c4, 0x007c, 0x0f7e, 0x7078, 0xa086, 0x0014, 0x00c0,
-       0x2ca4, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x2ca4, 0x2079,
-       0x7280, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x2ca2, 0x7834, 0xa005,
-       0x00c0, 0x2ca2, 0x7a38, 0xd2fc, 0x0040, 0x2c98, 0x70a4, 0xa005,
-       0x00c0, 0x2c98, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7, 0x0001,
-       0x2011, 0x318e, 0x1078, 0x40d1, 0x7083, 0x0010, 0x1078, 0x2eb8,
-       0x0078, 0x2ca4, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0003,
-       0x6043, 0x0004, 0x1078, 0x321b, 0x20a3, 0x1102, 0x20a3, 0x0000,
-       0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x2cb2, 0x60c3, 0x0014,
-       0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2ceb,
-       0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2ce7,
-       0x2079, 0x7280, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x2ce7, 0x7834,
-       0xa005, 0x00c0, 0x2ce7, 0x7a38, 0xd2fc, 0x0040, 0x2ce1, 0x70a4,
-       0xa005, 0x00c0, 0x2ce1, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7,
-       0x0001, 0x7083, 0x0004, 0x1078, 0x2ced, 0x0078, 0x2ceb, 0x7083,
-       0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0005, 0x1078,
-       0x321b, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0x728e,
-       0x706c, 0xa005, 0x00c0, 0x2d09, 0x714c, 0xa186, 0xffff, 0x0040,
-       0x2d09, 0x1078, 0x3152, 0x0040, 0x2d09, 0x2019, 0x002a, 0x1078,
-       0x202f, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-       0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x31b2, 0x007c, 0x0f7e,
-       0x7078, 0xa005, 0x0040, 0x2d47, 0x2011, 0x318e, 0x1078, 0x40d1,
-       0xa086, 0x0014, 0x00c0, 0x2d43, 0x2079, 0x7280, 0x7a30, 0xa296,
-       0x1103, 0x00c0, 0x2d43, 0x7834, 0xa005, 0x00c0, 0x2d43, 0x7a38,
-       0xd2fc, 0x0040, 0x2d3d, 0x70a4, 0xa005, 0x00c0, 0x2d3d, 0x2019,
-       0x002a, 0x1078, 0x202f, 0x70a7, 0x0001, 0x7083, 0x0006, 0x1078,
-       0x2d49, 0x0078, 0x2d47, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
-       0x007c, 0x7083, 0x0007, 0x1078, 0x321b, 0x20a3, 0x1104, 0x20a3,
-       0x0000, 0x3430, 0x2011, 0x728e, 0x706c, 0xa005, 0x00c0, 0x2d65,
-       0x7150, 0xa186, 0xffff, 0x0040, 0x2d65, 0xa180, 0x2091, 0x200c,
-       0xa18c, 0xff00, 0x810f, 0x1078, 0x3152, 0x20a9, 0x0008, 0x2298,
+       0x6043, 0x0002, 0x7083, 0x0001, 0x2009, 0x07d0, 0x2011, 0x3542,
+       0x1078, 0x4561, 0x007c, 0x0f7e, 0x7078, 0xa086, 0x0014, 0x00c0,
+       0x3072, 0x6043, 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3072, 0x2079,
+       0x7b80, 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3070, 0x7834, 0xa005,
+       0x00c0, 0x3070, 0x7a38, 0xd2fc, 0x0040, 0x3066, 0x70a4, 0xa005,
+       0x00c0, 0x3066, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x2011, 0x3542,
+       0x1078, 0x456e, 0x7083, 0x0010, 0x1078, 0x327a, 0x0078, 0x3072,
+       0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0003, 0x6043, 0x0004,
+       0x1078, 0x35cc, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, 0x000a,
+       0x20a3, 0x0000, 0x00f0, 0x3080, 0x60c3, 0x0014, 0x1078, 0x3562,
+       0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x30b7, 0x2011, 0x3542,
+       0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x30b3, 0x2079, 0x7b80,
+       0x7a30, 0xa296, 0x1102, 0x00c0, 0x30b3, 0x7834, 0xa005, 0x00c0,
+       0x30b3, 0x7a38, 0xd2fc, 0x0040, 0x30ad, 0x70a4, 0xa005, 0x00c0,
+       0x30ad, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083, 0x0004, 0x1078,
+       0x30b9, 0x0078, 0x30b7, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
+       0x007c, 0x7083, 0x0005, 0x1078, 0x35cc, 0x20a3, 0x1103, 0x20a3,
+       0x0000, 0x3430, 0x2011, 0x7b8e, 0x706c, 0xa005, 0x00c0, 0x30d3,
+       0x714c, 0xa186, 0xffff, 0x0040, 0x30d3, 0x1078, 0x3506, 0x0040,
+       0x30d3, 0x1078, 0x35fb, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6,
+       0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+       0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x310f, 0x2011, 0x3542,
+       0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x310b, 0x2079, 0x7b80,
+       0x7a30, 0xa296, 0x1103, 0x00c0, 0x310b, 0x7834, 0xa005, 0x00c0,
+       0x310b, 0x7a38, 0xd2fc, 0x0040, 0x3105, 0x70a4, 0xa005, 0x00c0,
+       0x3105, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083, 0x0006, 0x1078,
+       0x3111, 0x0078, 0x310f, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f,
+       0x007c, 0x7083, 0x0007, 0x1078, 0x35cc, 0x20a3, 0x1104, 0x20a3,
+       0x0000, 0x3430, 0x2011, 0x7b8e, 0x706c, 0xa005, 0x00c0, 0x312d,
+       0x7150, 0xa186, 0xffff, 0x0040, 0x312d, 0xa180, 0x232f, 0x200c,
+       0xa18c, 0xff00, 0x810f, 0x1078, 0x3506, 0x20a9, 0x0008, 0x2298,
        0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-       0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2da3,
-       0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2d9f,
-       0x2079, 0x7280, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x2d9f, 0x7834,
-       0xa005, 0x00c0, 0x2d9f, 0x7a38, 0xd2fc, 0x0040, 0x2d99, 0x70a4,
-       0xa005, 0x00c0, 0x2d99, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7,
-       0x0001, 0x7083, 0x0008, 0x1078, 0x2da5, 0x0078, 0x2da3, 0x7083,
-       0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0009, 0x1078,
-       0x321b, 0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, 0x706c, 0xa005,
-       0x00c0, 0x2db8, 0x1078, 0x30bc, 0x0040, 0x2dc8, 0x0078, 0x2dc2,
-       0x20a9, 0x0008, 0x2099, 0x728e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-       0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x31b2, 0x0078, 0x2dca,
-       0x1078, 0x2c5d, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2e18,
-       0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2e14,
-       0x2079, 0x7280, 0x7a30, 0xa296, 0x1105, 0x00c0, 0x2e14, 0x7834,
-       0x2011, 0x0100, 0xa21e, 0x00c0, 0x2dfb, 0x7a38, 0xd2fc, 0x0040,
-       0x2df3, 0x70a4, 0xa005, 0x00c0, 0x2df3, 0x2019, 0x002a, 0x1078,
-       0x202f, 0x70a7, 0x0001, 0x707f, 0x0001, 0x7083, 0x000a, 0x1078,
-       0x2e1a, 0x0078, 0x2e18, 0xa005, 0x00c0, 0x2e14, 0x7a38, 0xd2fc,
-       0x0040, 0x2e0c, 0x70a4, 0xa005, 0x00c0, 0x2e0c, 0x2019, 0x002a,
-       0x1078, 0x202f, 0x70a7, 0x0001, 0x707f, 0x0000, 0x7083, 0x000e,
-       0x1078, 0x2e9c, 0x0078, 0x2e18, 0x7083, 0x0002, 0x707b, 0x0000,
-       0x0f7f, 0x007c, 0x7083, 0x000b, 0x2011, 0x720e, 0x22a0, 0x20a9,
+       0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3169,
+       0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x3165,
+       0x2079, 0x7b80, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3165, 0x7834,
+       0xa005, 0x00c0, 0x3165, 0x7a38, 0xd2fc, 0x0040, 0x315f, 0x70a4,
+       0xa005, 0x00c0, 0x315f, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083,
+       0x0008, 0x1078, 0x316b, 0x0078, 0x3169, 0x7083, 0x0002, 0x707b,
+       0x0000, 0x0f7f, 0x007c, 0x7083, 0x0009, 0x1078, 0x35cc, 0x20a3,
+       0x1105, 0x20a3, 0x0100, 0x3430, 0x706c, 0xa005, 0x00c0, 0x317e,
+       0x1078, 0x3470, 0x0040, 0x318e, 0x0078, 0x3188, 0x20a9, 0x0008,
+       0x2099, 0x7b8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
+       0x60c3, 0x0014, 0x1078, 0x3562, 0x0078, 0x3190, 0x1078, 0x302d,
+       0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x31d8, 0x2011, 0x3542,
+       0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x31d4, 0x2079, 0x7b80,
+       0x7a30, 0xa296, 0x1105, 0x00c0, 0x31d4, 0x7834, 0x2011, 0x0100,
+       0xa21e, 0x00c0, 0x31bd, 0x7a38, 0xd2fc, 0x0040, 0x31b7, 0x70a4,
+       0xa005, 0x00c0, 0x31b7, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083,
+       0x000a, 0x1078, 0x31da, 0x0078, 0x31d8, 0xa005, 0x00c0, 0x31d4,
+       0x7a38, 0xd2fc, 0x0040, 0x31cc, 0x70a4, 0xa005, 0x00c0, 0x31cc,
+       0x1078, 0x35fb, 0x70a7, 0x0001, 0x707f, 0x0000, 0x7083, 0x000e,
+       0x1078, 0x325e, 0x0078, 0x31d8, 0x7083, 0x0002, 0x707b, 0x0000,
+       0x0f7f, 0x007c, 0x7083, 0x000b, 0x2011, 0x7b0e, 0x22a0, 0x20a9,
        0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000,
-       0x41a4, 0x1078, 0x321b, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x6030,
+       0x41a4, 0x1078, 0x35cc, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x6030,
        0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3,
-       0x0084, 0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
-       0x2e5e, 0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0084, 0x00c0,
-       0x2e5a, 0x2079, 0x7280, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x2e5a,
-       0x7834, 0xa005, 0x00c0, 0x2e5a, 0x7083, 0x000c, 0x1078, 0x2e60,
-       0x0078, 0x2e5e, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c,
-       0x7083, 0x000d, 0x1078, 0x321b, 0x20a3, 0x1107, 0x20a3, 0x0000,
-       0x2099, 0x728e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3,
-       0x0000, 0x60c3, 0x0084, 0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078,
-       0xa005, 0x0040, 0x2e9a, 0x2011, 0x318e, 0x1078, 0x40d1, 0xa086,
-       0x0084, 0x00c0, 0x2e96, 0x2079, 0x7280, 0x7a30, 0xa296, 0x1107,
-       0x00c0, 0x2e96, 0x7834, 0xa005, 0x00c0, 0x2e96, 0x1078, 0x320d,
-       0x7083, 0x000e, 0x1078, 0x2e9c, 0x0078, 0x2e9a, 0x7083, 0x0002,
-       0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x000f, 0x707b, 0x0000,
-       0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004,
-       0x2009, 0x07d0, 0x2011, 0x318e, 0x1078, 0x40c4, 0x007c, 0x7078,
-       0xa005, 0x0040, 0x2eb7, 0x2011, 0x318e, 0x1078, 0x40d1, 0x007c,
-       0x7083, 0x0011, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7280,
-       0x20a1, 0x020b, 0x7478, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084,
-       0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x1078, 0x31b2,
-       0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2eff, 0x2011, 0x318e,
-       0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2efd, 0x2079, 0x7280,
-       0x7a30, 0xa296, 0x1103, 0x00c0, 0x2efd, 0x7834, 0xa005, 0x00c0,
-       0x2efd, 0x7a38, 0xd2fc, 0x0040, 0x2ef7, 0x70a4, 0xa005, 0x00c0,
-       0x2ef7, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7, 0x0001, 0x7083,
-       0x0012, 0x1078, 0x2f01, 0x0078, 0x2eff, 0x707b, 0x0000, 0x0f7f,
-       0x007c, 0x7083, 0x0013, 0x1078, 0x3227, 0x20a3, 0x1103, 0x20a3,
-       0x0000, 0x3430, 0x2011, 0x728e, 0x706c, 0xa005, 0x00c0, 0x2f1d,
-       0x714c, 0xa186, 0xffff, 0x0040, 0x2f1d, 0x1078, 0x3152, 0x0040,
-       0x2f1d, 0x2019, 0x002a, 0x1078, 0x202f, 0x20a9, 0x0008, 0x2298,
-       0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014,
-       0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x2f59,
-       0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014, 0x00c0, 0x2f57,
-       0x2079, 0x7280, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x2f57, 0x7834,
-       0xa005, 0x00c0, 0x2f57, 0x7a38, 0xd2fc, 0x0040, 0x2f51, 0x70a4,
-       0xa005, 0x00c0, 0x2f51, 0x2019, 0x002a, 0x1078, 0x202f, 0x70a7,
-       0x0001, 0x7083, 0x0014, 0x1078, 0x2f5b, 0x0078, 0x2f59, 0x707b,
-       0x0000, 0x0f7f, 0x007c, 0x7083, 0x0015, 0x1078, 0x3227, 0x20a3,
-       0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0x728e, 0x706c, 0xa006,
-       0x00c0, 0x2f77, 0x7150, 0xa186, 0xffff, 0x0040, 0x2f77, 0xa180,
-       0x2091, 0x200c, 0xa18c, 0xff00, 0x810f, 0x1078, 0x3152, 0x20a9,
-       0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
-       0x60c3, 0x0014, 0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005,
-       0x0040, 0x2fcc, 0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0014,
-       0x00c0, 0x2fca, 0x2079, 0x7280, 0x7a30, 0xa296, 0x1105, 0x00c0,
-       0x2fca, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, 0x2fb1, 0x7a38,
-       0xd2fc, 0x0040, 0x2fad, 0x70a4, 0xa005, 0x00c0, 0x2fad, 0x2019,
-       0x002a, 0x1078, 0x202f, 0x70a7, 0x0001, 0x707f, 0x0001, 0x0078,
-       0x2fc4, 0xa005, 0x00c0, 0x2fca, 0x7a38, 0xd2fc, 0x0040, 0x2fc2,
-       0x70a4, 0xa005, 0x00c0, 0x2fc2, 0x2019, 0x002a, 0x1078, 0x202f,
-       0x70a7, 0x0001, 0x707f, 0x0000, 0x7083, 0x0016, 0x1078, 0x2fce,
-       0x0078, 0x2fcc, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x20e1, 0x9080,
-       0x20e1, 0x4000, 0x2099, 0x7280, 0x20a1, 0x020b, 0x20a9, 0x000e,
-       0x53a6, 0x3430, 0x2011, 0x728e, 0x707c, 0xa005, 0x0040, 0x2fe4,
-       0x7083, 0x0017, 0x0078, 0x2fe6, 0x7083, 0x001b, 0x706c, 0xa005,
-       0x00c0, 0x2ff0, 0x1078, 0x30bc, 0x0040, 0x3000, 0x0078, 0x2ffa,
-       0x20a9, 0x0008, 0x2099, 0x728e, 0x26a0, 0x53a6, 0x20a3, 0x0000,
-       0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x31b2, 0x0078, 0x3002,
-       0x1078, 0x2c5d, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3023,
-       0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0084, 0x00c0, 0x3021,
-       0x2079, 0x7280, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x3021, 0x7834,
-       0xa005, 0x00c0, 0x3021, 0x7083, 0x0018, 0x1078, 0x3025, 0x0078,
-       0x3023, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x0019, 0x1078,
-       0x3227, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0x728e,
-       0x2039, 0x720e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x2728, 0x2514,
-       0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007,
-       0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0, 0x720e, 0x2414,
-       0xa38c, 0x0001, 0x0040, 0x3050, 0xa294, 0xff00, 0x0078, 0x3053,
-       0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9,
-       0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084,
-       0x1078, 0x31b2, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3085,
-       0x2011, 0x318e, 0x1078, 0x40d1, 0xa086, 0x0084, 0x00c0, 0x3083,
-       0x2079, 0x7280, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x3083, 0x7834,
-       0xa005, 0x00c0, 0x3083, 0x1078, 0x320d, 0x7083, 0x001a, 0x1078,
-       0x3087, 0x0078, 0x3085, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
-       0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7280, 0x20a1,
-       0x020b, 0x7478, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8,
-       0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078, 0x31b2, 0x007c,
-       0x7078, 0xa005, 0x0040, 0x30ac, 0x2011, 0x318e, 0x1078, 0x40d1,
-       0x7083, 0x001c, 0x1078, 0x30ad, 0x007c, 0x707b, 0x0000, 0x608b,
-       0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0001, 0x2009, 0x07d0, 0x2011,
-       0x318e, 0x1078, 0x40c4, 0x007c, 0x087e, 0x097e, 0x2029, 0x6d52,
-       0x252c, 0x20a9, 0x0008, 0x2041, 0x720e, 0x28a0, 0x2099, 0x728e,
-       0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0040, 0x30d2,
-       0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0,
-       0x30e4, 0xd5d4, 0x0040, 0x30df, 0x8210, 0x0078, 0x30e0, 0x8211,
-       0x00f0, 0x30d2, 0x0078, 0x3149, 0x82ff, 0x00c0, 0x30f6, 0xd5d4,
-       0x0040, 0x30f0, 0xa1a6, 0x3fff, 0x0040, 0x30dc, 0x0078, 0x30f4,
-       0xa1a6, 0x3fff, 0x0040, 0x3149, 0xa18d, 0xc000, 0x20a9, 0x0010,
-       0x2019, 0x0001, 0xd5d4, 0x0040, 0x30ff, 0x2019, 0x0010, 0x2120,
-       0xd5d4, 0x0040, 0x3106, 0x8423, 0x0078, 0x3107, 0x8424, 0x00c8,
-       0x3114, 0xd5d4, 0x0040, 0x310f, 0x8319, 0x0078, 0x3110, 0x8318,
-       0x00f0, 0x3100, 0x0078, 0x3149, 0x23a8, 0x2021, 0x0001, 0x8426,
-       0x8425, 0x00f0, 0x3118, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040,
-       0x312c, 0x007e, 0x2039, 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8,
-       0xa5a8, 0x0010, 0x00f0, 0x3128, 0x754e, 0xa5c8, 0x2091, 0x292c,
-       0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304,
-       0xa405, 0x201a, 0x706f, 0x0001, 0x26a0, 0x2898, 0x20a9, 0x0008,
-       0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085, 0x0001, 0x0078,
-       0x314f, 0xa006, 0x0078, 0x314f, 0xa006, 0x1078, 0x12b7, 0x097f,
-       0x087f, 0x007c, 0x2118, 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a,
-       0x0010, 0x0048, 0x315f, 0x8420, 0x8001, 0x0078, 0x3157, 0x2118,
-       0x84ff, 0x0040, 0x3168, 0xa39a, 0x0010, 0x8421, 0x00c0, 0x3163,
-       0x2021, 0x0001, 0x83ff, 0x0040, 0x3171, 0x8423, 0x8319, 0x00c0,
-       0x316d, 0xa238, 0x2704, 0xa42c, 0x00c0, 0x3186, 0xa405, 0x203a,
-       0x714e, 0xa1a0, 0x2091, 0x242c, 0xa5ac, 0x00ff, 0x6532, 0x60e7,
-       0x0000, 0x65ea, 0x706f, 0x0001, 0xa084, 0x0000, 0x007c, 0x0e7e,
-       0x2071, 0x6d00, 0x7073, 0x0000, 0x0e7f, 0x007c, 0x0e7e, 0x0f7e,
-       0x2079, 0x0100, 0x2071, 0x0140, 0x1078, 0x4fe5, 0x7004, 0xa084,
-       0x4000, 0x0040, 0x319f, 0x7003, 0x1000, 0x7003, 0x0000, 0x127e,
-       0x2091, 0x8000, 0x2071, 0x6d00, 0x7003, 0x0001, 0x2071, 0x6d20,
+       0x0084, 0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040,
+       0x321e, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0084, 0x00c0,
+       0x321a, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x321a,
+       0x7834, 0xa005, 0x00c0, 0x321a, 0x7083, 0x000c, 0x1078, 0x3220,
+       0x0078, 0x321e, 0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c,
+       0x7083, 0x000d, 0x1078, 0x35cc, 0x20a3, 0x1107, 0x20a3, 0x0000,
+       0x2099, 0x7b8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0x60c3, 0x0084, 0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078,
+       0xa005, 0x0040, 0x325c, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086,
+       0x0084, 0x00c0, 0x3258, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1107,
+       0x00c0, 0x3258, 0x7834, 0xa005, 0x00c0, 0x3258, 0x707f, 0x0001,
+       0x1078, 0x35be, 0x7083, 0x000e, 0x1078, 0x325e, 0x0078, 0x325c,
+       0x7083, 0x0002, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083, 0x000f,
+       0x707b, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005,
+       0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x3542, 0x1078, 0x4561,
+       0x007c, 0x7078, 0xa005, 0x0040, 0x3279, 0x2011, 0x3542, 0x1078,
+       0x456e, 0x007c, 0x7083, 0x0011, 0x20e1, 0x9080, 0x20e1, 0x4000,
+       0x2099, 0x7b80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018, 0xa080,
+       0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014,
+       0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x32bf,
+       0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x32bd,
+       0x2079, 0x7b80, 0x7a30, 0xa296, 0x1103, 0x00c0, 0x32bd, 0x7834,
+       0xa005, 0x00c0, 0x32bd, 0x7a38, 0xd2fc, 0x0040, 0x32b7, 0x70a4,
+       0xa005, 0x00c0, 0x32b7, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083,
+       0x0012, 0x1078, 0x32c1, 0x0078, 0x32bf, 0x707b, 0x0000, 0x0f7f,
+       0x007c, 0x7083, 0x0013, 0x1078, 0x35d8, 0x20a3, 0x1103, 0x20a3,
+       0x0000, 0x3430, 0x2011, 0x7b8e, 0x706c, 0xa005, 0x00c0, 0x32db,
+       0x714c, 0xa186, 0xffff, 0x0040, 0x32db, 0x1078, 0x3506, 0x0040,
+       0x32db, 0x1078, 0x35fb, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6,
+       0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+       0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3315, 0x2011, 0x3542,
+       0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x3313, 0x2079, 0x7b80,
+       0x7a30, 0xa296, 0x1104, 0x00c0, 0x3313, 0x7834, 0xa005, 0x00c0,
+       0x3313, 0x7a38, 0xd2fc, 0x0040, 0x330d, 0x70a4, 0xa005, 0x00c0,
+       0x330d, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x7083, 0x0014, 0x1078,
+       0x3317, 0x0078, 0x3315, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
+       0x0015, 0x1078, 0x35d8, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430,
+       0x2011, 0x7b8e, 0x706c, 0xa006, 0x00c0, 0x3333, 0x7150, 0xa186,
+       0xffff, 0x0040, 0x3333, 0xa180, 0x232f, 0x200c, 0xa18c, 0xff00,
+       0x810f, 0x1078, 0x3506, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6,
+       0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+       0x007c, 0x0f7e, 0x7078, 0xa005, 0x0040, 0x3382, 0x2011, 0x3542,
+       0x1078, 0x456e, 0xa086, 0x0014, 0x00c0, 0x3380, 0x2079, 0x7b80,
+       0x7a30, 0xa296, 0x1105, 0x00c0, 0x3380, 0x7834, 0x2011, 0x0100,
+       0xa21e, 0x00c0, 0x3369, 0x7a38, 0xd2fc, 0x0040, 0x3367, 0x70a4,
+       0xa005, 0x00c0, 0x3367, 0x1078, 0x35fb, 0x70a7, 0x0001, 0x0078,
+       0x337a, 0xa005, 0x00c0, 0x3380, 0x7a38, 0xd2fc, 0x0040, 0x3378,
+       0x70a4, 0xa005, 0x00c0, 0x3378, 0x1078, 0x35fb, 0x70a7, 0x0001,
+       0x707f, 0x0000, 0x7083, 0x0016, 0x1078, 0x3384, 0x0078, 0x3382,
+       0x707b, 0x0000, 0x0f7f, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000,
+       0x2099, 0x7b80, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430,
+       0x2011, 0x7b8e, 0x7083, 0x0017, 0x0078, 0x3398, 0x7083, 0x001b,
+       0x706c, 0xa005, 0x00c0, 0x33a2, 0x1078, 0x3470, 0x0040, 0x33b2,
+       0x0078, 0x33ac, 0x20a9, 0x0008, 0x2099, 0x7b8e, 0x26a0, 0x53a6,
+       0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x3562,
+       0x0078, 0x33b4, 0x1078, 0x302d, 0x007c, 0x0f7e, 0x7078, 0xa005,
+       0x0040, 0x33d5, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0084,
+       0x00c0, 0x33d3, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1106, 0x00c0,
+       0x33d3, 0x7834, 0xa005, 0x00c0, 0x33d3, 0x7083, 0x0018, 0x1078,
+       0x33d7, 0x0078, 0x33d5, 0x707b, 0x0000, 0x0f7f, 0x007c, 0x7083,
+       0x0019, 0x1078, 0x35d8, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430,
+       0x2099, 0x7b8e, 0x2039, 0x7b0e, 0x27a0, 0x20a9, 0x0040, 0x53a3,
+       0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294,
+       0x00ff, 0x8007, 0xa205, 0x202a, 0x6030, 0x2310, 0x8214, 0xa2a0,
+       0x7b0e, 0x2414, 0xa38c, 0x0001, 0x0040, 0x3402, 0xa294, 0xff00,
+       0x0078, 0x3405, 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798,
+       0x26a0, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000,
+       0x60c3, 0x0084, 0x1078, 0x3562, 0x007c, 0x0f7e, 0x7078, 0xa005,
+       0x0040, 0x3439, 0x2011, 0x3542, 0x1078, 0x456e, 0xa086, 0x0084,
+       0x00c0, 0x3437, 0x2079, 0x7b80, 0x7a30, 0xa296, 0x1107, 0x00c0,
+       0x3437, 0x7834, 0xa005, 0x00c0, 0x3437, 0x707f, 0x0001, 0x1078,
+       0x35be, 0x7083, 0x001a, 0x1078, 0x343b, 0x0078, 0x3439, 0x707b,
+       0x0000, 0x0f7f, 0x007c, 0x7083, 0x001b, 0x20e1, 0x9080, 0x20e1,
+       0x4000, 0x2099, 0x7b80, 0x20a1, 0x020b, 0x7478, 0xa480, 0x0018,
+       0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3,
+       0x0084, 0x1078, 0x3562, 0x007c, 0x7078, 0xa005, 0x0040, 0x3460,
+       0x2011, 0x3542, 0x1078, 0x456e, 0x7083, 0x001c, 0x1078, 0x3461,
+       0x007c, 0x707b, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043,
+       0x0001, 0x2009, 0x07d0, 0x2011, 0x3542, 0x1078, 0x4561, 0x007c,
+       0x087e, 0x097e, 0x2029, 0x7652, 0x252c, 0x20a9, 0x0008, 0x2041,
+       0x7b0e, 0x28a0, 0x2099, 0x7b8e, 0x53a3, 0x20a9, 0x0008, 0x2011,
+       0x0007, 0xd5d4, 0x0040, 0x3486, 0x2011, 0x0000, 0x2800, 0xa200,
+       0x200c, 0xa1a6, 0xffff, 0x00c0, 0x3498, 0xd5d4, 0x0040, 0x3493,
+       0x8210, 0x0078, 0x3494, 0x8211, 0x00f0, 0x3486, 0x0078, 0x34fd,
+       0x82ff, 0x00c0, 0x34aa, 0xd5d4, 0x0040, 0x34a4, 0xa1a6, 0x3fff,
+       0x0040, 0x3490, 0x0078, 0x34a8, 0xa1a6, 0x3fff, 0x0040, 0x34fd,
+       0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0040,
+       0x34b3, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0040, 0x34ba, 0x8423,
+       0x0078, 0x34bb, 0x8424, 0x00c8, 0x34c8, 0xd5d4, 0x0040, 0x34c3,
+       0x8319, 0x0078, 0x34c4, 0x8318, 0x00f0, 0x34b4, 0x0078, 0x34fd,
+       0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x00f0, 0x34cc, 0x2328,
+       0x8529, 0xa2be, 0x0007, 0x0040, 0x34e0, 0x007e, 0x2039, 0x0007,
+       0x2200, 0xa73a, 0x007f, 0x27a8, 0xa5a8, 0x0010, 0x00f0, 0x34dc,
+       0x754e, 0xa5c8, 0x232f, 0x292c, 0xa5ac, 0x00ff, 0x6532, 0x60e7,
+       0x0000, 0x65ea, 0x2018, 0x2304, 0xa405, 0x201a, 0x706f, 0x0001,
+       0x26a0, 0x2898, 0x20a9, 0x0008, 0x53a6, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0xa085, 0x0001, 0x0078, 0x3503, 0xa006, 0x0078, 0x3503,
+       0xa006, 0x1078, 0x12d5, 0x097f, 0x087f, 0x007c, 0x2118, 0x2021,
+       0x0000, 0x2001, 0x0007, 0xa39a, 0x0010, 0x0048, 0x3513, 0x8420,
+       0x8001, 0x0078, 0x350b, 0x2118, 0x84ff, 0x0040, 0x351c, 0xa39a,
+       0x0010, 0x8421, 0x00c0, 0x3517, 0x2021, 0x0001, 0x83ff, 0x0040,
+       0x3525, 0x8423, 0x8319, 0x00c0, 0x3521, 0xa238, 0x2704, 0xa42c,
+       0x00c0, 0x353a, 0xa405, 0x203a, 0x714e, 0xa1a0, 0x232f, 0x242c,
+       0xa5ac, 0x00ff, 0x6532, 0x60e7, 0x0000, 0x65ea, 0x706f, 0x0001,
+       0xa084, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x7600, 0x7073, 0x0000,
+       0x0e7f, 0x007c, 0x0e7e, 0x0f7e, 0x2079, 0x0100, 0x2071, 0x0140,
+       0x1078, 0x5582, 0x7004, 0xa084, 0x4000, 0x0040, 0x3553, 0x7003,
+       0x1000, 0x7003, 0x0000, 0x127e, 0x2091, 0x8000, 0x2071, 0x7620,
        0x2073, 0x0000, 0x7843, 0x0090, 0x7843, 0x0010, 0x127f, 0x0f7f,
-       0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0x6f1a, 0x2013,
+       0x0e7f, 0x007c, 0x127e, 0x2091, 0x8000, 0x2011, 0x7840, 0x2013,
        0x0000, 0x707b, 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, 0x0056,
-       0x60a7, 0x9575, 0x1078, 0x4fdc, 0x2009, 0x07d0, 0x2011, 0x318e,
-       0x1078, 0x415f, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091,
-       0x8000, 0x2009, 0x00f7, 0x1078, 0x3233, 0x2061, 0x6f23, 0x601b,
-       0x0000, 0x601f, 0x0000, 0x2061, 0x6d00, 0x6003, 0x0001, 0x2061,
+       0x60a7, 0x9575, 0x1078, 0x5579, 0x2009, 0x07d0, 0x2011, 0x3542,
+       0x1078, 0x45fe, 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091,
+       0x8000, 0x2009, 0x00f7, 0x1078, 0x35e4, 0x2061, 0x7849, 0x601b,
+       0x0000, 0x601f, 0x0000, 0x2061, 0x7600, 0x6003, 0x0001, 0x2061,
        0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x001e, 0x2011,
-       0x31f0, 0x1078, 0x40c4, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c,
+       0x35a0, 0x1078, 0x4561, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c,
        0x0e7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x0100, 0x1078,
-       0x4fe5, 0x2071, 0x0140, 0xa084, 0x4000, 0x0040, 0x3203, 0x7003,
-       0x1000, 0x7003, 0x0000, 0x2001, 0x0001, 0x1078, 0x1dc9, 0x1078,
-       0x31cb, 0x127f, 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040, 0x20a1,
-       0x73c0, 0x2099, 0x728e, 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0,
-       0x00f0, 0x3213, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099,
-       0x7200, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x20e1,
-       0x9080, 0x20e1, 0x4000, 0x2099, 0x7280, 0x20a1, 0x020b, 0x20a9,
-       0x000c, 0x53a6, 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100, 0x810f,
-       0x2001, 0x6d2c, 0x2004, 0xa005, 0x00c0, 0x3244, 0x6030, 0xa084,
-       0x00ff, 0xa105, 0x0078, 0x3246, 0xa185, 0x00f7, 0x604a, 0x007f,
-       0x0c7f, 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009, 0x6e00, 0xa006,
-       0x200a, 0x8108, 0x00f0, 0x3250, 0x157f, 0x007c, 0x0d7e, 0x037e,
-       0x157e, 0x137e, 0x147e, 0x2069, 0x6d51, 0xa006, 0x6002, 0x6007,
-       0x0707, 0x600a, 0x600e, 0x6012, 0xa198, 0x2091, 0x231c, 0xa39c,
-       0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0, 0x40a4,
-       0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e, 0x6042,
-       0x604e, 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066, 0x606a,
-       0x606e, 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086, 0x608a,
-       0x608e, 0x6092, 0x6096, 0x609a, 0x609e, 0x61a2, 0x604a, 0x6810,
-       0x603a, 0x680c, 0x6046, 0x147f, 0x137f, 0x157f, 0x037f, 0x0d7f,
-       0x007c, 0x127e, 0x2091, 0x8000, 0x6944, 0xa1b4, 0x00ff, 0xa682,
-       0x0010, 0x00c8, 0x3337, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff,
-       0x00c8, 0x333d, 0xa188, 0x6e00, 0x2104, 0xa065, 0x0040, 0x3316,
-       0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x331c, 0x6078,
-       0xa00d, 0x0040, 0x32c1, 0xa680, 0x6c84, 0x2004, 0xa10c, 0x00c0,
-       0x3310, 0x607c, 0xa00d, 0x0040, 0x32dd, 0xa680, 0x6c84, 0x2004,
-       0xa10c, 0x0040, 0x32dd, 0x694c, 0xd1fc, 0x00c0, 0x32d3, 0x1078,
-       0x33d0, 0x0078, 0x330b, 0x1078, 0x33a1, 0x694c, 0xd1ec, 0x00c0,
-       0x330b, 0x1078, 0x34f0, 0x0078, 0x330b, 0x694c, 0xa184, 0xa000,
-       0x0040, 0x32fb, 0xd1ec, 0x0040, 0x32f4, 0xd1fc, 0x0040, 0x32ec,
-       0x1078, 0x3507, 0x0078, 0x32f7, 0xa680, 0x6c84, 0x200c, 0x607c,
-       0xa105, 0x607e, 0x0078, 0x32fb, 0xd1fc, 0x0040, 0x32fb, 0x1078,
-       0x33a1, 0x0078, 0x330b, 0x6050, 0xa00d, 0x0040, 0x3306, 0x2d00,
-       0x200a, 0x6803, 0x0000, 0x6052, 0x0078, 0x330b, 0x2d00, 0x6052,
-       0x604e, 0x6803, 0x0000, 0x1078, 0x4346, 0xa006, 0x127f, 0x007c,
-       0x2001, 0x0005, 0x2009, 0x0000, 0x0078, 0x3341, 0x2001, 0x0028,
-       0x2009, 0x0000, 0x0078, 0x3341, 0xa082, 0x0006, 0x0048, 0x32b7,
-       0x2009, 0x6d0c, 0x210c, 0xd18c, 0x0040, 0x332a, 0x2001, 0x0004,
-       0x0078, 0x3333, 0xd184, 0x0040, 0x3331, 0x2001, 0x0004, 0x0078,
-       0x3333, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x3341, 0x2001,
-       0x0029, 0x2009, 0x0000, 0x0078, 0x3341, 0x2001, 0x0029, 0x2009,
-       0x0000, 0xa005, 0x127f, 0x007c, 0x6944, 0xa1b4, 0x00ff, 0xa682,
-       0x0010, 0x00c8, 0x3386, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff,
-       0x00c8, 0x3376, 0xa188, 0x6e00, 0x2104, 0xa065, 0x0040, 0x3376,
-       0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x337c, 0x684c,
-       0xd0ec, 0x0040, 0x3369, 0x1078, 0x3507, 0x1078, 0x33a1, 0x0078,
-       0x3371, 0x1078, 0x33a1, 0x684c, 0xd0fc, 0x0040, 0x3371, 0x1078,
-       0x34f0, 0x1078, 0x351b, 0xa006, 0x0078, 0x338a, 0x2001, 0x0028,
-       0x2009, 0x0000, 0x0078, 0x338a, 0xa082, 0x0006, 0x0048, 0x335f,
-       0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x338a, 0x2001, 0x0029,
-       0x2009, 0x0000, 0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050,
-       0xa00d, 0x0040, 0x339a, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052,
-       0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078,
-       0x3398, 0x127e, 0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x33ad,
-       0x6802, 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e,
-       0x6803, 0x0000, 0x0078, 0x33ab, 0x127e, 0x2091, 0x8000, 0x604c,
-       0xa06d, 0x0040, 0x33c2, 0x6800, 0xa005, 0x00c0, 0x33c0, 0x6052,
-       0x604e, 0xad05, 0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x33cf,
-       0x6800, 0xa005, 0x00c0, 0x33cd, 0x6052, 0x604e, 0xad05, 0x007c,
-       0x6803, 0x0000, 0x6084, 0xa00d, 0x0040, 0x33da, 0x2d00, 0x200a,
-       0x6086, 0x007c, 0x2d00, 0x6086, 0x6082, 0x0078, 0x33d9, 0x127e,
-       0x0c7e, 0x027e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005,
-       0x0040, 0x33ed, 0xc285, 0x0078, 0x33ee, 0xc284, 0x6202, 0x027f,
-       0x0c7f, 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218,
-       0x2260, 0x6204, 0xa294, 0xff00, 0xa215, 0x6206, 0x0c7f, 0x127f,
+       0x5582, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, 0x0040, 0x35b4,
+       0x7003, 0x1000, 0x7003, 0x0000, 0x2001, 0x0001, 0x1078, 0x202b,
+       0x1078, 0x357b, 0x127f, 0x007f, 0x0e7f, 0x007c, 0x20a9, 0x0040,
+       0x20a1, 0x7cc0, 0x2099, 0x7b8e, 0x3304, 0x8007, 0x20a2, 0x9398,
+       0x94a0, 0x00f0, 0x35c4, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000,
+       0x2099, 0x7b00, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c,
+       0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0x7b80, 0x20a1, 0x020b,
+       0x20a9, 0x000c, 0x53a6, 0x007c, 0x0c7e, 0x007e, 0x2061, 0x0100,
+       0x810f, 0x2001, 0x762c, 0x2004, 0xa005, 0x00c0, 0x35f5, 0x6030,
+       0xa084, 0x00ff, 0xa105, 0x0078, 0x35f7, 0xa185, 0x00f7, 0x604a,
+       0x007f, 0x0c7f, 0x007c, 0x017e, 0x047e, 0x2001, 0x7652, 0x2004,
+       0xd0a4, 0x0040, 0x360e, 0xa006, 0x2020, 0x2009, 0x002a, 0x1078,
+       0x7541, 0x2001, 0x760c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a,
+       0x1078, 0x2299, 0x047f, 0x017f, 0x007c, 0x157e, 0x20a9, 0x00ff,
+       0x2009, 0x7720, 0xa006, 0x200a, 0x8108, 0x00f0, 0x361b, 0x157f,
+       0x007c, 0x0d7e, 0x037e, 0x157e, 0x137e, 0x147e, 0x2069, 0x7651,
+       0xa006, 0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, 0xa198,
+       0x232f, 0x231c, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, 0xac98,
+       0x0006, 0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, 0x23a0,
+       0x40a4, 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, 0x605e,
+       0x6062, 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, 0x607e,
+       0x6082, 0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, 0x609e,
+       0x61a2, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814, 0xa084,
+       0x00ff, 0x6042, 0x147f, 0x137f, 0x157f, 0x037f, 0x0d7f, 0x007c,
+       0x127e, 0x2091, 0x8000, 0x6944, 0xa1b4, 0x00ff, 0xa682, 0x0010,
+       0x00c8, 0x3715, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8,
+       0x371b, 0x2001, 0x760c, 0x2004, 0xa084, 0x0003, 0x00c0, 0x36fe,
+       0xa188, 0x7720, 0x2104, 0xa065, 0x0040, 0x36ec, 0x6004, 0xa084,
+       0x00ff, 0xa08e, 0x0006, 0x00c0, 0x36f2, 0x6078, 0xa00d, 0x0040,
+       0x3697, 0xa680, 0x75d5, 0x2004, 0xa10c, 0x00c0, 0x36e6, 0x607c,
+       0xa00d, 0x0040, 0x36b3, 0xa680, 0x75d5, 0x2004, 0xa10c, 0x0040,
+       0x36b3, 0x694c, 0xd1fc, 0x00c0, 0x36a9, 0x1078, 0x37ae, 0x0078,
+       0x36e1, 0x1078, 0x377f, 0x694c, 0xd1ec, 0x00c0, 0x36e1, 0x1078,
+       0x38c7, 0x0078, 0x36e1, 0x694c, 0xa184, 0xa000, 0x0040, 0x36d1,
+       0xd1ec, 0x0040, 0x36ca, 0xd1fc, 0x0040, 0x36c2, 0x1078, 0x38de,
+       0x0078, 0x36cd, 0xa680, 0x75d5, 0x200c, 0x607c, 0xa105, 0x607e,
+       0x0078, 0x36d1, 0xd1fc, 0x0040, 0x36d1, 0x1078, 0x377f, 0x0078,
+       0x36e1, 0x6050, 0xa00d, 0x0040, 0x36dc, 0x2d00, 0x200a, 0x6803,
+       0x0000, 0x6052, 0x0078, 0x36e1, 0x2d00, 0x6052, 0x604e, 0x6803,
+       0x0000, 0x1078, 0x4844, 0xa006, 0x127f, 0x007c, 0x2001, 0x0005,
+       0x2009, 0x0000, 0x0078, 0x371f, 0x2001, 0x0028, 0x2009, 0x0000,
+       0x0078, 0x371f, 0xa082, 0x0006, 0x00c8, 0x36fe, 0x60a0, 0xd0bc,
+       0x0040, 0x368d, 0x2001, 0x0028, 0x0078, 0x3711, 0x2009, 0x760c,
+       0x210c, 0xd18c, 0x0040, 0x3708, 0x2001, 0x0004, 0x0078, 0x3711,
+       0xd184, 0x0040, 0x370f, 0x2001, 0x0004, 0x0078, 0x3711, 0x2001,
+       0x0029, 0x2009, 0x0000, 0x0078, 0x371f, 0x2001, 0x0029, 0x2009,
+       0x0000, 0x0078, 0x371f, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005,
+       0x127f, 0x007c, 0x6944, 0xa1b4, 0x00ff, 0xa682, 0x0010, 0x00c8,
+       0x3764, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x00c8, 0x3754,
+       0xa188, 0x7720, 0x2104, 0xa065, 0x0040, 0x3754, 0x6004, 0xa084,
+       0x00ff, 0xa08e, 0x0006, 0x00c0, 0x375a, 0x684c, 0xd0ec, 0x0040,
+       0x3747, 0x1078, 0x38de, 0x1078, 0x377f, 0x0078, 0x374f, 0x1078,
+       0x377f, 0x684c, 0xd0fc, 0x0040, 0x374f, 0x1078, 0x38c7, 0x1078,
+       0x38f2, 0xa006, 0x0078, 0x3768, 0x2001, 0x0028, 0x2009, 0x0000,
+       0x0078, 0x3768, 0xa082, 0x0006, 0x0048, 0x373d, 0x2001, 0x0029,
+       0x2009, 0x0000, 0x0078, 0x3768, 0x2001, 0x0029, 0x2009, 0x0000,
+       0xa005, 0x007c, 0x127e, 0x2091, 0x8000, 0x6050, 0xa00d, 0x0040,
+       0x3778, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x127f, 0x007c,
+       0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x3776, 0x127e,
+       0x2091, 0x8000, 0x604c, 0xa005, 0x0040, 0x378b, 0x6802, 0x2d00,
+       0x604e, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000,
+       0x0078, 0x3789, 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0040,
+       0x37a0, 0x6800, 0xa005, 0x00c0, 0x379e, 0x6052, 0x604e, 0xad05,
+       0x127f, 0x007c, 0x604c, 0xa06d, 0x0040, 0x37ad, 0x6800, 0xa005,
+       0x00c0, 0x37ab, 0x6052, 0x604e, 0xad05, 0x007c, 0x6803, 0x0000,
+       0x6084, 0xa00d, 0x0040, 0x37b8, 0x2d00, 0x200a, 0x6086, 0x007c,
+       0x2d00, 0x6086, 0x6082, 0x0078, 0x37b7, 0x127e, 0x0c7e, 0x027e,
+       0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0040, 0x37cb,
+       0xc285, 0x0078, 0x37cc, 0xc284, 0x6202, 0x027f, 0x0c7f, 0x127f,
        0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204,
-       0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x0c7f, 0x127f, 0x007c,
-       0x027e, 0xa182, 0x00ff, 0x0048, 0x3419, 0xa085, 0x0001, 0x0078,
-       0x342d, 0xa190, 0x6e00, 0x2204, 0xa065, 0x00c0, 0x342c, 0x017e,
-       0x0d7e, 0x1078, 0x12f4, 0x2d60, 0x0d7f, 0x017f, 0x0040, 0x3415,
-       0x2c00, 0x2012, 0x1078, 0x3256, 0xa006, 0x027f, 0x007c, 0x027e,
-       0xa182, 0x00ff, 0x0048, 0x3438, 0xa085, 0x0001, 0x0078, 0x3445,
-       0x0d7e, 0xa190, 0x6e00, 0x2204, 0xa06d, 0x0040, 0x3443, 0x2013,
-       0x0000, 0x1078, 0x1328, 0x0d7f, 0xa006, 0x027f, 0x007c, 0x017e,
-       0xa182, 0x00ff, 0x0048, 0x3450, 0xa085, 0x0001, 0x0078, 0x3457,
-       0xa188, 0x6e00, 0x2104, 0xa065, 0x0040, 0x344c, 0xa006, 0x017f,
-       0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x600b, 0x0000, 0x600f,
-       0x0000, 0x6000, 0xc08c, 0x6002, 0x2069, 0x728e, 0x6808, 0x605e,
-       0x6810, 0x6062, 0x6138, 0xa10a, 0x0048, 0x346f, 0x603a, 0x6814,
-       0x6066, 0x2099, 0x7296, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004,
-       0x53a3, 0x2099, 0x729a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004,
-       0x53a3, 0x2069, 0x72ae, 0x6904, 0xa18c, 0x00ff, 0x810f, 0x6808,
-       0xa084, 0x00ff, 0xa105, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072,
-       0x6818, 0x6076, 0xa182, 0x0211, 0x00c8, 0x349a, 0x2009, 0x0008,
-       0x0078, 0x34c4, 0xa182, 0x0259, 0x00c8, 0x34a2, 0x2009, 0x0007,
-       0x0078, 0x34c4, 0xa182, 0x02c1, 0x00c8, 0x34aa, 0x2009, 0x0006,
-       0x0078, 0x34c4, 0xa182, 0x0349, 0x00c8, 0x34b2, 0x2009, 0x0005,
-       0x0078, 0x34c4, 0xa182, 0x0421, 0x00c8, 0x34ba, 0x2009, 0x0004,
-       0x0078, 0x34c4, 0xa182, 0x0581, 0x00c8, 0x34c2, 0x2009, 0x0003,
-       0x0078, 0x34c4, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f,
-       0x0d7f, 0x007c, 0x0e7e, 0x2071, 0x728d, 0x2e04, 0x6896, 0x2071,
-       0x728e, 0x7004, 0x689a, 0x701c, 0x689e, 0x0e7f, 0x007c, 0x2001,
-       0x6c84, 0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x6178, 0xa10d,
-       0x617a, 0x127f, 0x007c, 0x2001, 0x6c84, 0xa600, 0x2004, 0x8002,
-       0x127e, 0x2091, 0x8000, 0x6178, 0xa10c, 0x617a, 0x127f, 0x007c,
-       0x2001, 0x6c84, 0xa600, 0x2004, 0x8002, 0x127e, 0x2091, 0x8000,
-       0x617c, 0xa10c, 0x617e, 0x127f, 0x0078, 0x3500, 0x1078, 0x338c,
-       0x1078, 0x3561, 0x00c0, 0x34fe, 0x1078, 0x351b, 0x007c, 0x2001,
-       0x6c84, 0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x617c, 0xa10d,
-       0x617e, 0x127f, 0x0078, 0x3516, 0x1078, 0x33d0, 0x1078, 0x3525,
-       0x00c0, 0x3514, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4346,
-       0x127f, 0x007c, 0xa01e, 0x0078, 0x3527, 0x2019, 0x0001, 0xa00e,
-       0x127e, 0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0,
-       0x3547, 0x8dff, 0x0040, 0x355c, 0x83ff, 0x0040, 0x353f, 0x6844,
-       0xa084, 0x00ff, 0xa606, 0x0040, 0x354c, 0x0078, 0x3547, 0x683c,
-       0xa406, 0x00c0, 0x3547, 0x6840, 0xa506, 0x0040, 0x354c, 0x2d08,
-       0x6800, 0x2068, 0x0078, 0x3531, 0x6a00, 0x604c, 0xad06, 0x00c0,
-       0x3554, 0x624e, 0x0078, 0x3557, 0xa180, 0x0000, 0x2202, 0x82ff,
-       0x00c0, 0x355c, 0x6152, 0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078,
-       0x3563, 0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040,
-       0x3591, 0x83ff, 0x0040, 0x3574, 0x6844, 0xa084, 0x00ff, 0xa606,
-       0x0040, 0x3581, 0x0078, 0x357c, 0x683c, 0xa406, 0x00c0, 0x357c,
-       0x6840, 0xa506, 0x0040, 0x3581, 0x2d08, 0x6800, 0x2068, 0x0078,
-       0x3566, 0x6a00, 0x6080, 0xad06, 0x00c0, 0x3589, 0x6282, 0x0078,
-       0x358c, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x3591, 0x6186,
-       0x8dff, 0x007c, 0x2001, 0x6c84, 0xa600, 0x2004, 0x6178, 0xa10c,
-       0x0040, 0x359c, 0x2011, 0x0001, 0x617c, 0xa10c, 0x0040, 0x35a2,
-       0xa295, 0x0002, 0x007c, 0x1078, 0x35ec, 0x0040, 0x35ab, 0x1078,
-       0x61f8, 0x0078, 0x35ad, 0xa085, 0x0001, 0x007c, 0x1078, 0x35ec,
-       0x0040, 0x35b6, 0x1078, 0x6187, 0x0078, 0x35b8, 0xa085, 0x0001,
-       0x007c, 0x1078, 0x35ec, 0x0040, 0x35c1, 0x1078, 0x61cd, 0x0078,
-       0x35c3, 0xa085, 0x0001, 0x007c, 0x1078, 0x35ec, 0x0040, 0x35cc,
-       0x1078, 0x61a3, 0x0078, 0x35ce, 0xa085, 0x0001, 0x007c, 0x127e,
-       0x007e, 0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, 0x0040, 0x35e4,
-       0x6800, 0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
-       0x36a1, 0x007f, 0x0078, 0x35d5, 0x6083, 0x0000, 0x6087, 0x0000,
-       0x0d7f, 0x007f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e,
-       0x2079, 0x6d51, 0x7804, 0xd0a4, 0x0040, 0x3618, 0x157e, 0x0c7e,
-       0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3447, 0x00c0,
-       0x360c, 0x6004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006, 0x00c0,
-       0x360c, 0x6000, 0xc0ed, 0x6002, 0x017f, 0x8108, 0x00f0, 0x35fc,
-       0x0c7f, 0x157f, 0x2009, 0x07d0, 0x2011, 0x361a, 0x1078, 0x415f,
-       0x0f7f, 0x007c, 0x2011, 0x361a, 0x1078, 0x40d1, 0x157e, 0x0c7e,
-       0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3447, 0x00c0,
-       0x3646, 0x6000, 0xd0ec, 0x0040, 0x3646, 0x047e, 0x62a0, 0xa294,
-       0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0x6bf7, 0x6000,
-       0xc0e5, 0xc0ec, 0x6002, 0x2019, 0x0029, 0x1078, 0x445c, 0x1078,
-       0x43a9, 0x2009, 0x0000, 0x1078, 0x6a57, 0x047f, 0x017f, 0x8108,
-       0x00f0, 0x3624, 0x0c7f, 0x157f, 0x007c, 0x0c7e, 0x6018, 0x2060,
-       0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x2071, 0x6ddf, 0x7003,
-       0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b,
-       0x0000, 0x701f, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b,
-       0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x007c, 0x0e7e, 0x2071,
-       0x6ddf, 0x684c, 0xa005, 0x00c0, 0x367c, 0x7028, 0xc085, 0x702a,
-       0xa085, 0x0001, 0x0078, 0x369f, 0x6a60, 0x7236, 0x6b64, 0x733a,
-       0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e,
-       0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x8007, 0x8006, 0x8006,
-       0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x726e,
-       0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, 0x0e7f,
-       0x007c, 0x0e7e, 0x6838, 0xd0fc, 0x00c0, 0x36f2, 0x6804, 0xa00d,
-       0x0040, 0x36c0, 0x0d7e, 0x0e7e, 0x2071, 0x6d00, 0x027e, 0xa016,
-       0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x00c0,
-       0x36b1, 0x702e, 0x70a0, 0xa200, 0x70a2, 0x027f, 0x0e7f, 0x0d7f,
-       0x2071, 0x6ddf, 0x701c, 0xa005, 0x00c0, 0x3703, 0x0068, 0x3701,
-       0x2071, 0x6d51, 0x7004, 0xd09c, 0x0040, 0x3701, 0x6934, 0xa186,
-       0x0103, 0x00c0, 0x3714, 0x6948, 0x6844, 0xa105, 0x00c0, 0x36f4,
-       0x2009, 0x8020, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x3701,
-       0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091,
-       0x4080, 0x2071, 0x6d00, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70a0,
-       0x8000, 0x70a2, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0,
-       0x3701, 0x6868, 0xa005, 0x00c0, 0x3701, 0x2009, 0x8020, 0x0078,
-       0x36da, 0x2071, 0x6ddf, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000,
-       0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x3711, 0x6902, 0x0078,
-       0x3712, 0x711e, 0x0078, 0x36f2, 0xa18c, 0x00ff, 0xa18e, 0x0017,
-       0x0040, 0x371e, 0xa18e, 0x001f, 0x00c0, 0x3701, 0x684c, 0xd0cc,
-       0x0040, 0x3701, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0,
-       0x3701, 0x2009, 0x8021, 0x0078, 0x36da, 0x007e, 0x6837, 0x0103,
-       0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4,
-       0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0x6ddf, 0x7004, 0x0079,
-       0x3741, 0x3749, 0x3758, 0x37e4, 0x37e5, 0x37f5, 0x37fb, 0x374a,
-       0x37d2, 0x007c, 0x127e, 0x2091, 0x8000, 0x0068, 0x3757, 0x2009,
-       0x000d, 0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x127f,
-       0x701c, 0xa06d, 0x0040, 0x37d1, 0x0e7e, 0x2071, 0x6d51, 0x7004,
-       0xd09c, 0x0040, 0x37b3, 0x6934, 0xa186, 0x0103, 0x00c0, 0x378d,
-       0x6948, 0x6844, 0xa105, 0x00c0, 0x37a6, 0x2009, 0x8020, 0x127e,
-       0x2091, 0x8000, 0x0068, 0x3789, 0x2071, 0x0000, 0x7018, 0xd084,
-       0x00c0, 0x3789, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b,
-       0x0001, 0x2091, 0x4080, 0x127f, 0x0e7f, 0x1078, 0x382e, 0x0078,
-       0x37d1, 0x127f, 0x0e7f, 0x0078, 0x37d1, 0xa18c, 0x00ff, 0xa18e,
-       0x0017, 0x0040, 0x3797, 0xa18e, 0x001f, 0x00c0, 0x37b3, 0x684c,
-       0xd0cc, 0x0040, 0x37b3, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001,
-       0x00c0, 0x37b3, 0x2009, 0x8021, 0x0078, 0x376f, 0x6844, 0xa086,
-       0x0100, 0x00c0, 0x37b3, 0x6868, 0xa005, 0x00c0, 0x37b3, 0x2009,
-       0x8020, 0x0078, 0x376f, 0x0e7f, 0x1078, 0x3842, 0x0040, 0x37d1,
-       0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, 0x00c0,
-       0x37c8, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x37c8, 0x710e,
-       0x7007, 0x0003, 0x1078, 0x3862, 0x7050, 0xa086, 0x0100, 0x0040,
-       0x37e5, 0x007c, 0x701c, 0xa06d, 0x0040, 0x37e3, 0x1078, 0x3842,
-       0x0040, 0x37e3, 0x7007, 0x0003, 0x1078, 0x3862, 0x7050, 0xa086,
-       0x0100, 0x0040, 0x37e5, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100,
-       0x00c0, 0x37ee, 0x7007, 0x0004, 0x0078, 0x37f5, 0xa086, 0x0200,
-       0x00c0, 0x37f4, 0x7007, 0x0005, 0x007c, 0x1078, 0x37fc, 0x7006,
-       0x1078, 0x382e, 0x007c, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102,
-       0x0048, 0x3809, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0078,
-       0x3813, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x3813, 0x7070,
-       0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e, 0x00c0,
-       0x3827, 0x127e, 0x2091, 0x8000, 0x0068, 0x382a, 0x2001, 0x000d,
-       0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x127f, 0x007c, 0x2001,
-       0x0007, 0x007c, 0x2001, 0x0006, 0x127f, 0x007c, 0x701c, 0xa06d,
-       0x0040, 0x3841, 0x127e, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012,
-       0x2d04, 0x701e, 0xa005, 0x00c0, 0x383e, 0x701a, 0x127f, 0x1078,
-       0x1328, 0x007c, 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040,
-       0x3851, 0x2304, 0x230c, 0xa10e, 0x0040, 0x3851, 0xa006, 0x0078,
-       0x3861, 0x732c, 0x8319, 0x7130, 0xa102, 0x00c0, 0x385b, 0x2300,
-       0xa005, 0x0078, 0x3861, 0x0048, 0x3860, 0xa302, 0x0078, 0x3861,
-       0x8002, 0x007c, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053,
-       0x0000, 0x127e, 0x2091, 0x8000, 0x2009, 0x6f31, 0x2104, 0xc08d,
-       0x200a, 0x127f, 0x1078, 0x1379, 0x007c, 0x2071, 0x6dad, 0x7003,
-       0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001, 0x704f,
-       0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040, 0x7083,
-       0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c,
-       0x0e7e, 0x2071, 0x6dad, 0x6848, 0xa005, 0x00c0, 0x389e, 0x7028,
-       0xc085, 0x702a, 0xa085, 0x0001, 0x0078, 0x38c3, 0x6a50, 0x7236,
-       0x6b54, 0x733a, 0x6858, 0x703e, 0x707a, 0x685c, 0x7042, 0x707e,
-       0x6848, 0x702e, 0x6840, 0x7032, 0x2009, 0x000c, 0x200a, 0x8007,
-       0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100,
-       0xa319, 0x7272, 0x7376, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001,
-       0x700f, 0x0000, 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071, 0x6dad,
-       0x7004, 0x1079, 0x3923, 0x700c, 0x0079, 0x38ce, 0x38d3, 0x38c8,
-       0x38c8, 0x38c8, 0x38c8, 0x007c, 0x700c, 0x0079, 0x38d7, 0x38dc,
-       0x3921, 0x3921, 0x3922, 0x3922, 0x7830, 0x7930, 0xa106, 0x0040,
-       0x38e6, 0x7830, 0x7930, 0xa106, 0x00c0, 0x390c, 0x7030, 0xa10a,
-       0x0040, 0x390c, 0x00c8, 0x38ee, 0x712c, 0xa10a, 0xa18a, 0x0002,
-       0x00c8, 0x390d, 0x1078, 0x12f4, 0x0040, 0x390c, 0x2d00, 0x705a,
-       0x7063, 0x0040, 0x2001, 0x0003, 0x7057, 0x0000, 0x127e, 0x007e,
-       0x2091, 0x8000, 0x2009, 0x6f31, 0x2104, 0xc085, 0x200a, 0x007f,
-       0x700e, 0x127f, 0x1078, 0x1379, 0x007c, 0x1078, 0x12f4, 0x0040,
-       0x390c, 0x2d00, 0x705a, 0x1078, 0x12f4, 0x00c0, 0x3919, 0x0078,
-       0x38f8, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x0078,
-       0x38fc, 0x007c, 0x007c, 0x3934, 0x3935, 0x396c, 0x396d, 0x3921,
-       0x39a3, 0x39a8, 0x39df, 0x39e0, 0x39fb, 0x39fc, 0x39fd, 0x39fe,
-       0x39ff, 0x3a00, 0x3a69, 0x3a93, 0x007c, 0x700c, 0x0079, 0x3938,
-       0x393d, 0x3940, 0x3950, 0x396b, 0x396b, 0x1078, 0x38d4, 0x007c,
-       0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x3d52, 0x0040,
-       0x394d, 0x2091, 0x8000, 0x1078, 0x38d4, 0x0d7f, 0x0078, 0x3959,
-       0x127e, 0x8001, 0x700e, 0x1078, 0x3d52, 0x7058, 0x2068, 0x7084,
-       0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff,
-       0xa08a, 0x0020, 0x00c8, 0x3968, 0x1079, 0x3983, 0x127f, 0x007c,
-       0x127f, 0x1078, 0x3a01, 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071,
-       0x6dad, 0x700c, 0x0079, 0x3974, 0x3979, 0x3979, 0x3979, 0x397b,
-       0x397f, 0x0e7f, 0x007c, 0x700f, 0x0001, 0x0078, 0x3981, 0x700f,
-       0x0002, 0x0e7f, 0x007c, 0x3a01, 0x3a01, 0x3a1d, 0x3a01, 0x3aff,
-       0x3a01, 0x3a01, 0x3a01, 0x3a01, 0x3a01, 0x3a1d, 0x3b44, 0x3b8d,
-       0x3be5, 0x3bf8, 0x3a01, 0x3a01, 0x3a39, 0x3a1d, 0x3a01, 0x3a01,
-       0x3a4f, 0x3c74, 0x3c91, 0x3a01, 0x3a39, 0x3a01, 0x3a01, 0x3a01,
-       0x3a01, 0x3a01, 0x3c91, 0x7020, 0x2068, 0x1078, 0x1328, 0x007c,
-       0x700c, 0x0079, 0x39ab, 0x39b0, 0x39b3, 0x39c3, 0x39de, 0x39de,
-       0x1078, 0x38d4, 0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e,
-       0x1078, 0x3d52, 0x0040, 0x39c0, 0x2091, 0x8000, 0x1078, 0x38d4,
-       0x0d7f, 0x0078, 0x39cc, 0x127e, 0x8001, 0x700e, 0x1078, 0x3d52,
-       0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000,
-       0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x39db, 0x1079,
-       0x39e1, 0x127f, 0x007c, 0x127f, 0x1078, 0x3a01, 0x007c, 0x007c,
-       0x007c, 0x3a01, 0x3a1d, 0x3ae9, 0x3a01, 0x3a1d, 0x3a01, 0x3a1d,
-       0x3a1d, 0x3a01, 0x3a1d, 0x3ae9, 0x3a1d, 0x3a1d, 0x3a1d, 0x3a1d,
-       0x3a1d, 0x3a01, 0x3a1d, 0x3ae9, 0x3a01, 0x3a01, 0x3a1d, 0x3a01,
-       0x3a01, 0x3a01, 0x3a1d, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c,
-       0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a,
-       0x127e, 0x2091, 0x8000, 0x1078, 0x36a1, 0x127f, 0x007c, 0x7007,
-       0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091,
-       0x8000, 0x1078, 0x36a1, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838,
-       0xa084, 0x00ff, 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078,
-       0x36a1, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff,
-       0xc0dd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x36a1, 0x127f,
-       0x007c, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3a0f, 0x8001,
-       0x00c0, 0x3a46, 0x7007, 0x0001, 0x0078, 0x3ac8, 0x7007, 0x0006,
-       0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x3ac8, 0x007c, 0x2d00,
-       0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1,
-       0x6dd8, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8, 0x3a2b,
-       0x6884, 0xa08a, 0x0003, 0x00c8, 0x3a2b, 0xa080, 0x3ab9, 0x2004,
-       0x70c6, 0x7010, 0xa015, 0x0040, 0x3ab3, 0x1078, 0x12f4, 0x00c0,
-       0x3a74, 0x7007, 0x000f, 0x007c, 0x2d00, 0x7022, 0x70c4, 0x2060,
-       0x6000, 0x6836, 0x6004, 0xad00, 0x7096, 0x6008, 0xa20a, 0x00c8,
-       0x3a83, 0xa00e, 0x2200, 0x7112, 0x620c, 0x8003, 0x800b, 0xa296,
-       0x0004, 0x0040, 0x3a8c, 0xa108, 0x719a, 0x810b, 0x719e, 0xae90,
-       0x0022, 0x1078, 0x135f, 0x7090, 0xa08e, 0x0100, 0x0040, 0x3aa7,
-       0xa086, 0x0200, 0x0040, 0x3a9f, 0x7007, 0x0010, 0x007c, 0x7020,
-       0x2068, 0x1078, 0x1328, 0x7014, 0x2068, 0x0078, 0x3a2b, 0x7020,
-       0x2068, 0x7018, 0x6802, 0x6807, 0x0000, 0x2d08, 0x2068, 0x6906,
-       0x711a, 0x0078, 0x3a69, 0x7014, 0x2068, 0x7007, 0x0001, 0x0078,
-       0x3ac8, 0x3abc, 0x3ac0, 0x3ac4, 0x0002, 0x0011, 0x0007, 0x0004,
+       0xa294, 0xff00, 0xa215, 0x6206, 0x0c7f, 0x127f, 0x007c, 0x127e,
+       0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0xa294, 0x00ff,
+       0x8007, 0xa215, 0x6206, 0x0c7f, 0x127f, 0x007c, 0x027e, 0xa182,
+       0x00ff, 0x0048, 0x37f7, 0xa085, 0x0001, 0x0078, 0x380b, 0xa190,
+       0x7720, 0x2204, 0xa065, 0x00c0, 0x380a, 0x017e, 0x0d7e, 0x1078,
+       0x1314, 0x2d60, 0x0d7f, 0x017f, 0x0040, 0x37f3, 0x2c00, 0x2012,
+       0x1078, 0x3621, 0xa006, 0x027f, 0x007c, 0x027e, 0xa182, 0x00ff,
+       0x0048, 0x3816, 0xa085, 0x0001, 0x0078, 0x3823, 0x0d7e, 0xa190,
+       0x7720, 0x2204, 0xa06d, 0x0040, 0x3821, 0x2013, 0x0000, 0x1078,
+       0x1348, 0x0d7f, 0xa006, 0x027f, 0x007c, 0x017e, 0xa182, 0x00ff,
+       0x0048, 0x382e, 0xa085, 0x0001, 0x0078, 0x3835, 0xa188, 0x7720,
+       0x2104, 0xa065, 0x0040, 0x382a, 0xa006, 0x017f, 0x007c, 0x0d7e,
+       0x157e, 0x137e, 0x147e, 0x600b, 0x0000, 0x600f, 0x0000, 0x6000,
+       0xc08c, 0x6002, 0x2069, 0x7b8e, 0x6808, 0x605e, 0x6810, 0x6062,
+       0x6138, 0xa10a, 0x0048, 0x384d, 0x603a, 0x6814, 0x6066, 0x2099,
+       0x7b96, 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099,
+       0x7b9a, 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069,
+       0x7bae, 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818,
+       0x6076, 0xa182, 0x0211, 0x00c8, 0x3871, 0x2009, 0x0008, 0x0078,
+       0x389b, 0xa182, 0x0259, 0x00c8, 0x3879, 0x2009, 0x0007, 0x0078,
+       0x389b, 0xa182, 0x02c1, 0x00c8, 0x3881, 0x2009, 0x0006, 0x0078,
+       0x389b, 0xa182, 0x0349, 0x00c8, 0x3889, 0x2009, 0x0005, 0x0078,
+       0x389b, 0xa182, 0x0421, 0x00c8, 0x3891, 0x2009, 0x0004, 0x0078,
+       0x389b, 0xa182, 0x0581, 0x00c8, 0x3899, 0x2009, 0x0003, 0x0078,
+       0x389b, 0x2009, 0x0002, 0x6192, 0x147f, 0x137f, 0x157f, 0x0d7f,
+       0x007c, 0x0e7e, 0x2071, 0x7b8d, 0x2e04, 0x6896, 0x2071, 0x7b8e,
+       0x7004, 0x689a, 0x701c, 0x689e, 0x0e7f, 0x007c, 0x2001, 0x75d5,
+       0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x6178, 0xa10d, 0x617a,
+       0x127f, 0x007c, 0x2001, 0x75d5, 0xa600, 0x2004, 0x8002, 0x127e,
+       0x2091, 0x8000, 0x6178, 0xa10c, 0x617a, 0x127f, 0x007c, 0x2001,
+       0x75d5, 0xa600, 0x2004, 0x8002, 0x127e, 0x2091, 0x8000, 0x617c,
+       0xa10c, 0x617e, 0x127f, 0x0078, 0x38d7, 0x1078, 0x376a, 0x1078,
+       0x3938, 0x00c0, 0x38d5, 0x1078, 0x38f2, 0x007c, 0x2001, 0x75d5,
+       0xa600, 0x2004, 0x127e, 0x2091, 0x8000, 0x617c, 0xa10d, 0x617e,
+       0x127f, 0x0078, 0x38ed, 0x1078, 0x37ae, 0x1078, 0x38fc, 0x00c0,
+       0x38eb, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4844, 0x127f,
+       0x007c, 0xa01e, 0x0078, 0x38fe, 0x2019, 0x0001, 0xa00e, 0x127e,
+       0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0, 0x391e,
+       0x8dff, 0x0040, 0x3933, 0x83ff, 0x0040, 0x3916, 0x6844, 0xa084,
+       0x00ff, 0xa606, 0x0040, 0x3923, 0x0078, 0x391e, 0x683c, 0xa406,
+       0x00c0, 0x391e, 0x6840, 0xa506, 0x0040, 0x3923, 0x2d08, 0x6800,
+       0x2068, 0x0078, 0x3908, 0x6a00, 0x604c, 0xad06, 0x00c0, 0x392b,
+       0x624e, 0x0078, 0x392e, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0,
+       0x3933, 0x6152, 0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078, 0x393a,
+       0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040, 0x3968,
+       0x83ff, 0x0040, 0x394b, 0x6844, 0xa084, 0x00ff, 0xa606, 0x0040,
+       0x3958, 0x0078, 0x3953, 0x683c, 0xa406, 0x00c0, 0x3953, 0x6840,
+       0xa506, 0x0040, 0x3958, 0x2d08, 0x6800, 0x2068, 0x0078, 0x393d,
+       0x6a00, 0x6080, 0xad06, 0x00c0, 0x3960, 0x6282, 0x0078, 0x3963,
+       0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x3968, 0x6186, 0x8dff,
+       0x007c, 0x2001, 0x75d5, 0xa600, 0x2004, 0x6178, 0xa10c, 0x0040,
+       0x3973, 0x2011, 0x0001, 0x617c, 0xa10c, 0x0040, 0x3979, 0xa295,
+       0x0002, 0x007c, 0x1078, 0x39c5, 0x0040, 0x3982, 0x1078, 0x6a16,
+       0x0078, 0x3984, 0xa085, 0x0001, 0x007c, 0x1078, 0x39c5, 0x0040,
+       0x398d, 0x1078, 0x69a5, 0x0078, 0x398f, 0xa085, 0x0001, 0x007c,
+       0x1078, 0x39c5, 0x0040, 0x3998, 0x1078, 0x69eb, 0x0078, 0x399a,
+       0xa085, 0x0001, 0x007c, 0x1078, 0x39c5, 0x0040, 0x39a3, 0x1078,
+       0x69c1, 0x0078, 0x39a5, 0xa085, 0x0001, 0x007c, 0x127e, 0x007e,
+       0x0d7e, 0x2091, 0x8000, 0x6080, 0xa06d, 0x0040, 0x39bd, 0x6800,
+       0x007e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6b3f,
+       0x1078, 0x3a7a, 0x007f, 0x0078, 0x39ac, 0x6083, 0x0000, 0x6087,
+       0x0000, 0x0d7f, 0x007f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c,
+       0x0f7e, 0x2079, 0x7651, 0x7804, 0xd0a4, 0x0040, 0x39f1, 0x157e,
+       0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3825,
+       0x00c0, 0x39e5, 0x6004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006,
+       0x00c0, 0x39e5, 0x6000, 0xc0ed, 0x6002, 0x017f, 0x8108, 0x00f0,
+       0x39d5, 0x0c7f, 0x157f, 0x2009, 0x07d0, 0x2011, 0x39f3, 0x1078,
+       0x45fe, 0x0f7f, 0x007c, 0x2011, 0x39f3, 0x1078, 0x456e, 0x157e,
+       0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x3825,
+       0x00c0, 0x3a1f, 0x6000, 0xd0ec, 0x0040, 0x3a1f, 0x047e, 0x62a0,
+       0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0x7541,
+       0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x2019, 0x0029, 0x1078, 0x4962,
+       0x1078, 0x48a5, 0x2009, 0x0000, 0x1078, 0x737b, 0x047f, 0x017f,
+       0x8108, 0x00f0, 0x39fd, 0x0c7f, 0x157f, 0x007c, 0x0c7e, 0x6018,
+       0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x2071, 0x76ff,
+       0x7003, 0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017, 0x0000,
+       0x701b, 0x0000, 0x701f, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000,
+       0x705b, 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x007c, 0x0e7e,
+       0x2071, 0x76ff, 0x684c, 0xa005, 0x00c0, 0x3a55, 0x7028, 0xc085,
+       0x702a, 0xa085, 0x0001, 0x0078, 0x3a78, 0x6a60, 0x7236, 0x6b64,
+       0x733a, 0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c,
+       0x702e, 0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x8007, 0x8006,
+       0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319,
+       0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006,
+       0x0e7f, 0x007c, 0x0e7e, 0x6838, 0xd0fc, 0x00c0, 0x3acb, 0x6804,
+       0xa00d, 0x0040, 0x3a99, 0x0d7e, 0x0e7e, 0x2071, 0x7600, 0x027e,
+       0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff,
+       0x00c0, 0x3a8a, 0x702e, 0x70a0, 0xa200, 0x70a2, 0x027f, 0x0e7f,
+       0x0d7f, 0x2071, 0x76ff, 0x701c, 0xa005, 0x00c0, 0x3adc, 0x0068,
+       0x3ada, 0x2071, 0x7651, 0x7004, 0xd09c, 0x0040, 0x3ada, 0x6934,
+       0xa186, 0x0103, 0x00c0, 0x3aed, 0x6948, 0x6844, 0xa105, 0x00c0,
+       0x3acd, 0x2009, 0x8020, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0,
+       0x3ada, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001,
+       0x2091, 0x4080, 0x2071, 0x7600, 0x702c, 0x206a, 0x2d00, 0x702e,
+       0x70a0, 0x8000, 0x70a2, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100,
+       0x00c0, 0x3ada, 0x6868, 0xa005, 0x00c0, 0x3ada, 0x2009, 0x8020,
+       0x0078, 0x3ab3, 0x2071, 0x76ff, 0x2d08, 0x206b, 0x0000, 0x7010,
+       0x8000, 0x7012, 0x7018, 0xa06d, 0x711a, 0x0040, 0x3aea, 0x6902,
+       0x0078, 0x3aeb, 0x711e, 0x0078, 0x3acb, 0xa18c, 0x00ff, 0xa186,
+       0x0017, 0x0040, 0x3afb, 0xa186, 0x001e, 0x0040, 0x3afb, 0xa18e,
+       0x001f, 0x00c0, 0x3ada, 0x684c, 0xd0cc, 0x0040, 0x3ada, 0x6850,
+       0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x3ada, 0x2009, 0x8021,
+       0x0078, 0x3ab3, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80,
+       0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0x684a, 0x6952,
+       0x007c, 0x2071, 0x76ff, 0x7004, 0x0079, 0x3b1e, 0x3b26, 0x3b35,
+       0x3bc5, 0x3bc6, 0x3bd6, 0x3bdc, 0x3b27, 0x3bb3, 0x007c, 0x127e,
+       0x2091, 0x8000, 0x0068, 0x3b34, 0x2009, 0x000d, 0x7030, 0x200a,
+       0x2091, 0x4080, 0x7007, 0x0001, 0x127f, 0x701c, 0xa06d, 0x0040,
+       0x3bb2, 0x0e7e, 0x2071, 0x7651, 0x7004, 0xd09c, 0x0040, 0x3b94,
+       0x6934, 0xa186, 0x0103, 0x00c0, 0x3b6a, 0x6948, 0x6844, 0xa105,
+       0x00c0, 0x3b87, 0x2009, 0x8020, 0x127e, 0x2091, 0x8000, 0x0068,
+       0x3b66, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x3b66, 0x7122,
+       0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080,
+       0x127f, 0x0e7f, 0x1078, 0x3c0f, 0x0078, 0x3bb2, 0x127f, 0x0e7f,
+       0x0078, 0x3bb2, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0040, 0x3b78,
+       0xa186, 0x001e, 0x0040, 0x3b78, 0xa18e, 0x001f, 0x00c0, 0x3b94,
+       0x684c, 0xd0cc, 0x0040, 0x3b94, 0x6850, 0xa084, 0x00ff, 0xa086,
+       0x0001, 0x00c0, 0x3b94, 0x2009, 0x8021, 0x0078, 0x3b4c, 0x6844,
+       0xa086, 0x0100, 0x00c0, 0x3b94, 0x6868, 0xa005, 0x00c0, 0x3b94,
+       0x2009, 0x8020, 0x0078, 0x3b4c, 0x0e7f, 0x1078, 0x3c23, 0x0040,
+       0x3bb2, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003,
+       0x00c0, 0x3ba9, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x3ba9,
+       0x710e, 0x7007, 0x0003, 0x1078, 0x3c43, 0x7050, 0xa086, 0x0100,
+       0x0040, 0x3bc6, 0x007c, 0x701c, 0xa06d, 0x0040, 0x3bc4, 0x1078,
+       0x3c23, 0x0040, 0x3bc4, 0x7007, 0x0003, 0x1078, 0x3c43, 0x7050,
+       0xa086, 0x0100, 0x0040, 0x3bc6, 0x007c, 0x007c, 0x7050, 0xa09e,
+       0x0100, 0x00c0, 0x3bcf, 0x7007, 0x0004, 0x0078, 0x3bd6, 0xa086,
+       0x0200, 0x00c0, 0x3bd5, 0x7007, 0x0005, 0x007c, 0x1078, 0x3bdd,
+       0x7006, 0x1078, 0x3c0f, 0x007c, 0x007c, 0x702c, 0x7130, 0x8108,
+       0xa102, 0x0048, 0x3bea, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072,
+       0x0078, 0x3bf4, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x3bf4,
+       0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e,
+       0x00c0, 0x3c08, 0x127e, 0x2091, 0x8000, 0x0068, 0x3c0b, 0x2001,
+       0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x127f, 0x007c,
+       0x2001, 0x0007, 0x007c, 0x2001, 0x0006, 0x127f, 0x007c, 0x701c,
+       0xa06d, 0x0040, 0x3c22, 0x127e, 0x2091, 0x8000, 0x7010, 0x8001,
+       0x7012, 0x2d04, 0x701e, 0xa005, 0x00c0, 0x3c1f, 0x701a, 0x127f,
+       0x1078, 0x1348, 0x007c, 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e,
+       0x0040, 0x3c32, 0x2304, 0x230c, 0xa10e, 0x0040, 0x3c32, 0xa006,
+       0x0078, 0x3c42, 0x732c, 0x8319, 0x7130, 0xa102, 0x00c0, 0x3c3c,
+       0x2300, 0xa005, 0x0078, 0x3c42, 0x0048, 0x3c41, 0xa302, 0x0078,
+       0x3c42, 0x8002, 0x007c, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056,
+       0x7053, 0x0000, 0x127e, 0x2091, 0x8000, 0x2009, 0x7859, 0x2104,
+       0xc08d, 0x200a, 0x127f, 0x1078, 0x1399, 0x007c, 0x2071, 0x76cd,
+       0x7003, 0x0000, 0x7007, 0x0000, 0x700f, 0x0000, 0x702b, 0x0001,
+       0x704f, 0x0000, 0x7053, 0x0001, 0x705f, 0x0020, 0x7063, 0x0040,
+       0x7083, 0x0000, 0x708b, 0x0000, 0x708f, 0x0001, 0x70bf, 0x0000,
+       0x007c, 0x0e7e, 0x2071, 0x76cd, 0x6848, 0xa005, 0x00c0, 0x3c7f,
+       0x7028, 0xc085, 0x702a, 0xa085, 0x0001, 0x0078, 0x3ca4, 0x6a50,
+       0x7236, 0x6b54, 0x733a, 0x6858, 0x703e, 0x707a, 0x685c, 0x7042,
+       0x707e, 0x6848, 0x702e, 0x6840, 0x7032, 0x2009, 0x000c, 0x200a,
+       0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210,
+       0x2100, 0xa319, 0x7272, 0x7376, 0x7028, 0xc084, 0x702a, 0x7007,
+       0x0001, 0x700f, 0x0000, 0xa006, 0x0e7f, 0x007c, 0x2b78, 0x2071,
+       0x76cd, 0x7004, 0x1079, 0x3d04, 0x700c, 0x0079, 0x3caf, 0x3cb4,
+       0x3ca9, 0x3ca9, 0x3ca9, 0x3ca9, 0x007c, 0x700c, 0x0079, 0x3cb8,
+       0x3cbd, 0x3d02, 0x3d02, 0x3d03, 0x3d03, 0x7830, 0x7930, 0xa106,
+       0x0040, 0x3cc7, 0x7830, 0x7930, 0xa106, 0x00c0, 0x3ced, 0x7030,
+       0xa10a, 0x0040, 0x3ced, 0x00c8, 0x3ccf, 0x712c, 0xa10a, 0xa18a,
+       0x0002, 0x00c8, 0x3cee, 0x1078, 0x1314, 0x0040, 0x3ced, 0x2d00,
+       0x705a, 0x7063, 0x0040, 0x2001, 0x0003, 0x7057, 0x0000, 0x127e,
+       0x007e, 0x2091, 0x8000, 0x2009, 0x7859, 0x2104, 0xc085, 0x200a,
+       0x007f, 0x700e, 0x127f, 0x1078, 0x1399, 0x007c, 0x1078, 0x1314,
+       0x0040, 0x3ced, 0x2d00, 0x705a, 0x1078, 0x1314, 0x00c0, 0x3cfa,
+       0x0078, 0x3cd9, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004,
+       0x0078, 0x3cdd, 0x007c, 0x007c, 0x3d15, 0x3d16, 0x3d4d, 0x3d4e,
+       0x3d02, 0x3d84, 0x3d89, 0x3dc0, 0x3dc1, 0x3ddc, 0x3ddd, 0x3dde,
+       0x3ddf, 0x3de0, 0x3de1, 0x3e4a, 0x3e74, 0x007c, 0x700c, 0x0079,
+       0x3d19, 0x3d1e, 0x3d21, 0x3d31, 0x3d4c, 0x3d4c, 0x1078, 0x3cb5,
+       0x007c, 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x4153,
+       0x0040, 0x3d2e, 0x2091, 0x8000, 0x1078, 0x3cb5, 0x0d7f, 0x0078,
+       0x3d3a, 0x127e, 0x8001, 0x700e, 0x1078, 0x4153, 0x7058, 0x2068,
+       0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084,
+       0x00ff, 0xa08a, 0x0020, 0x00c8, 0x3d49, 0x1079, 0x3d64, 0x127f,
+       0x007c, 0x127f, 0x1078, 0x3de2, 0x007c, 0x007c, 0x007c, 0x0e7e,
+       0x2071, 0x76cd, 0x700c, 0x0079, 0x3d55, 0x3d5a, 0x3d5a, 0x3d5a,
+       0x3d5c, 0x3d60, 0x0e7f, 0x007c, 0x700f, 0x0001, 0x0078, 0x3d62,
+       0x700f, 0x0002, 0x0e7f, 0x007c, 0x3de2, 0x3de2, 0x3dfe, 0x3de2,
+       0x3ee9, 0x3de2, 0x3de2, 0x3de2, 0x3de2, 0x3de2, 0x3dfe, 0x3f2e,
+       0x3f77, 0x3fcf, 0x3fe2, 0x3de2, 0x3de2, 0x3e1a, 0x3dfe, 0x3de2,
+       0x3de2, 0x3e30, 0x4069, 0x4086, 0x3de2, 0x3e1a, 0x3de2, 0x3de2,
+       0x3de2, 0x3de2, 0x3e30, 0x4086, 0x7020, 0x2068, 0x1078, 0x1348,
+       0x007c, 0x700c, 0x0079, 0x3d8c, 0x3d91, 0x3d94, 0x3da4, 0x3dbf,
+       0x3dbf, 0x1078, 0x3cb5, 0x007c, 0x127e, 0x8001, 0x700e, 0x7058,
+       0x007e, 0x1078, 0x4153, 0x0040, 0x3da1, 0x2091, 0x8000, 0x1078,
+       0x3cb5, 0x0d7f, 0x0078, 0x3dad, 0x127e, 0x8001, 0x700e, 0x1078,
+       0x4153, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807,
+       0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x00c8, 0x3dbc,
+       0x1079, 0x3dc2, 0x127f, 0x007c, 0x127f, 0x1078, 0x3de2, 0x007c,
+       0x007c, 0x007c, 0x3de2, 0x3dfe, 0x3ed3, 0x3de2, 0x3dfe, 0x3de2,
+       0x3dfe, 0x3dfe, 0x3de2, 0x3dfe, 0x3ed3, 0x3dfe, 0x3dfe, 0x3dfe,
+       0x3dfe, 0x3dfe, 0x3de2, 0x3dfe, 0x3ed3, 0x3de2, 0x3de2, 0x3dfe,
+       0x3de2, 0x3de2, 0x3de2, 0x3dfe, 0x007c, 0x007c, 0x007c, 0x007c,
+       0x007c, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5,
+       0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3a7a, 0x127f, 0x007c,
+       0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x127e,
+       0x2091, 0x8000, 0x1078, 0x3a7a, 0x127f, 0x007c, 0x7007, 0x0001,
+       0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, 0x127e, 0x2091, 0x8000,
+       0x1078, 0x3a7a, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084,
+       0x00ff, 0xc0dd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x3a7a,
+       0x127f, 0x007c, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3df0,
+       0x8001, 0x00c0, 0x3e27, 0x7007, 0x0001, 0x0078, 0x3eb0, 0x7007,
+       0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x3eb0, 0x007c,
+       0x2d00, 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098,
+       0x20a1, 0x76f8, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8,
+       0x3e0c, 0x6884, 0xa08a, 0x0003, 0x00c8, 0x3e0c, 0xa080, 0x3ea1,
+       0x2004, 0x70c6, 0x7010, 0xa015, 0x0040, 0x3e94, 0x1078, 0x1314,
+       0x00c0, 0x3e55, 0x7007, 0x000f, 0x007c, 0x2d00, 0x7022, 0x70c4,
+       0x2060, 0x6000, 0x6836, 0x6004, 0xad00, 0x7096, 0x6008, 0xa20a,
+       0x00c8, 0x3e64, 0xa00e, 0x2200, 0x7112, 0x620c, 0x8003, 0x800b,
+       0xa296, 0x0004, 0x0040, 0x3e6d, 0xa108, 0x719a, 0x810b, 0x719e,
+       0xae90, 0x0022, 0x1078, 0x137f, 0x7090, 0xa08e, 0x0100, 0x0040,
+       0x3e88, 0xa086, 0x0200, 0x0040, 0x3e80, 0x7007, 0x0010, 0x007c,
+       0x7020, 0x2068, 0x1078, 0x1348, 0x7014, 0x2068, 0x0078, 0x3e0c,
+       0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, 0x2d08, 0x2068,
+       0x6906, 0x711a, 0x0078, 0x3e4a, 0x7014, 0x2068, 0x7007, 0x0001,
+       0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0040, 0x40a3, 0x0078,
+       0x3eb0, 0x3ea4, 0x3ea8, 0x3eac, 0x0002, 0x0011, 0x0007, 0x0004,
        0x000a, 0x000f, 0x0005, 0x0006, 0x0012, 0x000f, 0x0005, 0x0006,
-       0x2009, 0x6d2c, 0x210c, 0x81ff, 0x00c0, 0x3ae3, 0x6838, 0xa084,
-       0x00ff, 0x683a, 0x6853, 0x0000, 0x1078, 0x3299, 0x00c0, 0x3ad9,
-       0x007c, 0x1078, 0x372d, 0x127e, 0x2091, 0x8000, 0x1078, 0x36a1,
-       0x127f, 0x0078, 0x3ad8, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078,
-       0x3ad9, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a, 0x7010,
-       0x8001, 0x7012, 0x0040, 0x3af8, 0x7007, 0x0006, 0x0078, 0x3afe,
-       0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a, 0x007c, 0x7007,
-       0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, 0x00ff,
-       0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x3b2a, 0x2009, 0x0000,
-       0x20a9, 0x007e, 0xa096, 0x0002, 0x0040, 0x3b2a, 0xa005, 0x00c0,
-       0x3b41, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x3447, 0x00c0,
-       0x3b41, 0x067e, 0x6e44, 0xa6b4, 0x000f, 0x1078, 0x34e3, 0x067f,
-       0x0078, 0x3b41, 0x047e, 0x2011, 0x6d0c, 0x2224, 0xc484, 0xc48c,
-       0x2412, 0x047f, 0x0c7e, 0x1078, 0x3447, 0x00c0, 0x3b3d, 0x2091,
-       0x8000, 0x607b, 0x0000, 0x2091, 0x8001, 0x8108, 0x00f0, 0x3b33,
-       0x0c7f, 0x1078, 0x1328, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007,
-       0x0001, 0x2001, 0x6d52, 0x2004, 0xd0a4, 0x0040, 0x3b84, 0x6944,
-       0x1078, 0x3d6e, 0x6100, 0xd184, 0x0040, 0x3b69, 0x6858, 0xa084,
-       0x00ff, 0x00c0, 0x3b87, 0x6000, 0xd084, 0x0040, 0x3b84, 0x6004,
-       0xa005, 0x00c0, 0x3b8a, 0x6003, 0x0000, 0x600b, 0x0000, 0x0078,
-       0x3b81, 0x2011, 0x0001, 0x6860, 0xa005, 0x00c0, 0x3b71, 0x2001,
-       0x001e, 0x8000, 0x6016, 0x6858, 0xa084, 0x00ff, 0x0040, 0x3b84,
-       0x6006, 0x6858, 0x8007, 0xa084, 0x00ff, 0x0040, 0x3b84, 0x600a,
-       0x6202, 0x127f, 0x0078, 0x3d41, 0x127f, 0x0078, 0x3d39, 0x127f,
-       0x0078, 0x3d31, 0x127f, 0x0078, 0x3d35, 0x127e, 0x2091, 0x8000,
-       0x7007, 0x0001, 0x2001, 0x6d52, 0x2004, 0xd0a4, 0x0040, 0x3be2,
-       0x6944, 0x1078, 0x3d6e, 0x6000, 0xa084, 0x0001, 0x0040, 0x3be2,
-       0x6204, 0x6308, 0x6c48, 0xa484, 0x0003, 0x0040, 0x3bba, 0x6958,
-       0xa18c, 0x00ff, 0x8001, 0x00c0, 0x3bb3, 0x2100, 0xa210, 0x0048,
-       0x3bdf, 0x0078, 0x3bba, 0x8001, 0x00c0, 0x3bdf, 0x2100, 0xa212,
-       0x0048, 0x3bdf, 0xa484, 0x000c, 0x0040, 0x3bd4, 0x6958, 0x810f,
-       0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0, 0x3bcc, 0x2100, 0xa318,
-       0x0048, 0x3bdf, 0x0078, 0x3bd4, 0xa082, 0x0004, 0x00c0, 0x3bdf,
-       0x2100, 0xa31a, 0x0048, 0x3bdf, 0x6860, 0xa005, 0x0040, 0x3bda,
-       0x8000, 0x6016, 0x6206, 0x630a, 0x127f, 0x0078, 0x3d41, 0x127f,
-       0x0078, 0x3d3d, 0x127f, 0x0078, 0x3d39, 0x127e, 0x2091, 0x8000,
-       0x7007, 0x0001, 0x6944, 0x1078, 0x3d6e, 0x6308, 0x8318, 0x0048,
-       0x3bf5, 0x630a, 0x127f, 0x0078, 0x3d4f, 0x127f, 0x0078, 0x3d3d,
-       0x127e, 0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac,
-       0x0040, 0x3c0c, 0x027e, 0x2009, 0x0000, 0x2011, 0xfcff, 0x1078,
-       0x41f4, 0x027f, 0x0078, 0x3c42, 0x6858, 0xa005, 0x0040, 0x3c56,
-       0x685c, 0xa065, 0x0040, 0x3c52, 0x2001, 0x6d2c, 0x2004, 0xa005,
-       0x0040, 0x3c1e, 0x1078, 0x6283, 0x0078, 0x3c24, 0x6013, 0x0400,
-       0x2009, 0x0041, 0x1078, 0x5591, 0x6958, 0xa18c, 0xe600, 0xa186,
-       0x2000, 0x0040, 0x3c3a, 0xa186, 0x0400, 0x0040, 0x3c3a, 0x6944,
-       0x0c7e, 0x1078, 0x416d, 0x6000, 0xa084, 0xfdff, 0x6002, 0x0c7f,
-       0x0078, 0x3c42, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078,
-       0x41f4, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x3c4e, 0x6944, 0x1078,
-       0x416d, 0x6008, 0x8000, 0x0048, 0x3c4e, 0x600a, 0x0c7f, 0x127f,
-       0x0078, 0x3d41, 0x0c7f, 0x127f, 0x0078, 0x3d39, 0x6954, 0xa186,
-       0x0020, 0x0040, 0x3c6c, 0xa186, 0x0029, 0x00c0, 0x3c52, 0x6944,
-       0xa18c, 0xff00, 0x810f, 0x1078, 0x3447, 0x00c0, 0x3c42, 0x6000,
-       0xc0e4, 0x6002, 0x0078, 0x3c42, 0x685c, 0xa065, 0x0040, 0x3c52,
-       0x6017, 0x0014, 0x0078, 0x3c42, 0x6944, 0x1078, 0x3d6e, 0x6000,
-       0xa084, 0x0001, 0x0040, 0x3c8d, 0x2091, 0x8000, 0x6204, 0x8210,
-       0x0048, 0x3c87, 0x6206, 0x2091, 0x8001, 0x0078, 0x3d4f, 0x2091,
-       0x8001, 0x6853, 0x0016, 0x0078, 0x3d48, 0x6853, 0x0007, 0x0078,
-       0x3d48, 0x6834, 0x8007, 0xa084, 0x00ff, 0x00c0, 0x3c9b, 0x1078,
-       0x3a0f, 0x0078, 0x3cad, 0x2030, 0x8001, 0x00c0, 0x3ca5, 0x7007,
-       0x0001, 0x1078, 0x3cae, 0x0078, 0x3cad, 0x7007, 0x0006, 0x7012,
-       0x2d00, 0x7016, 0x701a, 0x704b, 0x3cae, 0x007c, 0x0e7e, 0x2009,
-       0x6d2c, 0x210c, 0x81ff, 0x00c0, 0x3d28, 0x6848, 0x2070, 0xae82,
-       0x7400, 0x0048, 0x3d18, 0x2001, 0x6d15, 0x2004, 0xae02, 0x00c8,
-       0x3d18, 0x6944, 0x1078, 0x3d6e, 0x6100, 0xa184, 0x0001, 0x0040,
-       0x3cfe, 0xa184, 0x0100, 0x00c0, 0x3d1c, 0xa184, 0x0200, 0x00c0,
-       0x3d20, 0x601c, 0xa005, 0x00c0, 0x3d24, 0x711c, 0xa186, 0x0006,
-       0x00c0, 0x3d03, 0x6853, 0x0000, 0x6803, 0x0000, 0x2d08, 0x127e,
-       0x2091, 0x8000, 0x7010, 0xa005, 0x00c0, 0x3cf5, 0x7112, 0x7018,
-       0xa065, 0x0040, 0x3d28, 0x6000, 0xd0e4, 0x00c0, 0x3d2c, 0x2e60,
-       0x1078, 0x4176, 0x127f, 0x0e7f, 0x007c, 0x2068, 0x6800, 0xa005,
-       0x00c0, 0x3cf5, 0x6902, 0x127f, 0x0e7f, 0x007c, 0x0e7f, 0x6853,
-       0x0006, 0x0078, 0x3d48, 0x6944, 0xa18c, 0xff00, 0x810f, 0x1078,
-       0x3447, 0x00c0, 0x3d2c, 0x6000, 0xd0e4, 0x00c0, 0x3d2c, 0x711c,
-       0xa186, 0x0007, 0x00c0, 0x3d18, 0x6853, 0x0002, 0x0078, 0x3d2e,
-       0x6853, 0x0008, 0x0078, 0x3d2e, 0x6853, 0x000e, 0x0078, 0x3d2e,
-       0x6853, 0x0017, 0x0078, 0x3d2e, 0x6853, 0x0035, 0x0078, 0x3d2e,
-       0x6853, 0x0028, 0x0078, 0x3d2e, 0x6853, 0x0029, 0x0e7f, 0x0078,
-       0x3d48, 0x2009, 0x003e, 0x0078, 0x3d43, 0x2009, 0x0004, 0x0078,
-       0x3d43, 0x2009, 0x0006, 0x0078, 0x3d43, 0x2009, 0x0016, 0x0078,
-       0x3d43, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00, 0xa105, 0x6856,
-       0x2091, 0x8000, 0x1078, 0x36a1, 0x2091, 0x8001, 0x007c, 0x1078,
-       0x1328, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102, 0x0048, 0x3d5f,
-       0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078, 0x3d6b, 0x7070,
-       0xa080, 0x0040, 0x7072, 0x00c8, 0x3d6b, 0x7074, 0xa081, 0x0000,
-       0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c, 0x0d7e, 0x1078,
-       0x416d, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004, 0x2204, 0xa085,
-       0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002, 0x3d08, 0x20e1,
-       0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x3d8a, 0xa086, 0x1000,
-       0x00c0, 0x3dab, 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x3d91,
-       0x3e60, 0xac84, 0x0007, 0x00c0, 0x3dab, 0xac82, 0x7400, 0x0048,
-       0x3dab, 0x6854, 0xac02, 0x00c8, 0x3dab, 0x2009, 0x0047, 0x1078,
-       0x5591, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x7a28, 0x7a1c, 0xd284,
-       0x00c0, 0x3d7c, 0x007c, 0xa016, 0x1078, 0x1532, 0x0078, 0x3da1,
-       0x157e, 0x137e, 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584,
-       0x0070, 0x00c0, 0x3dd9, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0,
-       0x3dd9, 0x1078, 0x3de6, 0x0040, 0x3dd9, 0x20e1, 0x3000, 0x7828,
-       0x7828, 0x1078, 0x3e04, 0x147f, 0x137f, 0x157f, 0x2009, 0x6f18,
-       0x2104, 0xa005, 0x00c0, 0x3dd5, 0x007c, 0x1078, 0x476a, 0x0078,
-       0x3dd4, 0x1078, 0x6c23, 0x1078, 0x3de6, 0x20e1, 0x3000, 0x7828,
-       0x7828, 0x147f, 0x137f, 0x157f, 0x0078, 0x3dd4, 0xa484, 0x01ff,
-       0x687a, 0xa005, 0x0040, 0x3df8, 0xa080, 0x001f, 0xa084, 0x03f8,
-       0x80ac, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c,
-       0x20a9, 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5,
-       0xa085, 0x0001, 0x0078, 0x3df7, 0x7000, 0xa084, 0xff00, 0xa08c,
-       0xf000, 0x8007, 0xa196, 0x0000, 0x00c0, 0x3e11, 0x0078, 0x3f51,
-       0x007c, 0xa196, 0x2000, 0x00c0, 0x3e22, 0x6900, 0xa18e, 0x0001,
-       0x00c0, 0x3e1e, 0x1078, 0x2aec, 0x0078, 0x3e10, 0x1078, 0x3e2a,
-       0x0078, 0x3e10, 0xa196, 0x8000, 0x00c0, 0x3e10, 0x1078, 0x3fd7,
-       0x0078, 0x3e10, 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196,
-       0x0001, 0x0040, 0x3e37, 0xa196, 0x0023, 0x00c0, 0x3ef8, 0xa08e,
-       0x0023, 0x00c0, 0x3e68, 0x1078, 0x404e, 0x0040, 0x3ef8, 0x7124,
-       0x610a, 0x7030, 0xa08e, 0x0200, 0x00c0, 0x3e50, 0x7034, 0xa005,
-       0x00c0, 0x3ef8, 0x2009, 0x0015, 0x1078, 0x5591, 0x0078, 0x3ef8,
-       0xa08e, 0x0210, 0x00c0, 0x3e5a, 0x2009, 0x0015, 0x1078, 0x5591,
-       0x0078, 0x3ef8, 0xa08e, 0x0100, 0x00c0, 0x3ef8, 0x7034, 0xa005,
-       0x00c0, 0x3ef8, 0x2009, 0x0016, 0x1078, 0x5591, 0x0078, 0x3ef8,
-       0xa08e, 0x0022, 0x00c0, 0x3ef8, 0x7030, 0xa08e, 0x0300, 0x00c0,
-       0x3e79, 0x7034, 0xa005, 0x00c0, 0x3ef8, 0x2009, 0x0017, 0x0078,
-       0x3eda, 0xa08e, 0x0500, 0x00c0, 0x3e85, 0x7034, 0xa005, 0x00c0,
-       0x3ef8, 0x2009, 0x0018, 0x0078, 0x3eda, 0xa08e, 0x2010, 0x00c0,
-       0x3e8d, 0x2009, 0x0019, 0x0078, 0x3eda, 0xa08e, 0x2110, 0x00c0,
-       0x3e95, 0x2009, 0x001a, 0x0078, 0x3eda, 0xa08e, 0x5200, 0x00c0,
-       0x3ea1, 0x7034, 0xa005, 0x00c0, 0x3ef8, 0x2009, 0x001b, 0x0078,
-       0x3eda, 0xa08e, 0x5000, 0x00c0, 0x3ead, 0x7034, 0xa005, 0x00c0,
-       0x3ef8, 0x2009, 0x001c, 0x0078, 0x3eda, 0xa08e, 0x2400, 0x00c0,
-       0x3eb3, 0x0078, 0x3ed8, 0xa08e, 0x5300, 0x00c0, 0x3eb9, 0x0078,
-       0x3ed8, 0xa08e, 0x0f00, 0x00c0, 0x3ec1, 0x2009, 0x0020, 0x0078,
-       0x3eda, 0xa08e, 0x5300, 0x00c0, 0x3ec7, 0x0078, 0x3ed8, 0xa08e,
-       0x6104, 0x00c0, 0x3ed8, 0x2009, 0x728e, 0x2011, 0x8015, 0x211c,
-       0x8108, 0x2124, 0x1078, 0x2a53, 0x2009, 0x0023, 0x0078, 0x3eda,
-       0x2009, 0x001d, 0x017e, 0x2011, 0x7283, 0x2204, 0x8211, 0x220c,
-       0x1078, 0x1e1b, 0x00c0, 0x3efa, 0x1078, 0x3410, 0x00c0, 0x3efa,
-       0x6612, 0x6516, 0x0c7e, 0x1078, 0x5504, 0x0040, 0x3efd, 0x017f,
-       0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x5591,
-       0x0c7f, 0x007c, 0x017f, 0x0078, 0x3ef8, 0x0c7f, 0x0078, 0x3efa,
-       0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff, 0x00c0, 0x3f20,
-       0xa596, 0xfffd, 0x00c0, 0x3f10, 0x2009, 0x007f, 0x0078, 0x3f4d,
-       0xa596, 0xfffe, 0x00c0, 0x3f18, 0x2009, 0x007e, 0x0078, 0x3f4d,
-       0xa596, 0xfffc, 0x00c0, 0x3f20, 0x2009, 0x0080, 0x0078, 0x3f4d,
-       0x2011, 0x0000, 0x2021, 0x007e, 0x20a9, 0x0082, 0x2071, 0x6e7e,
-       0x2e1c, 0x83ff, 0x00c0, 0x3f32, 0x82ff, 0x00c0, 0x3f41, 0x2410,
-       0x0078, 0x3f41, 0x2368, 0x6b10, 0x007e, 0x2100, 0xa31e, 0x007f,
-       0x00c0, 0x3f41, 0x6b14, 0xa31e, 0x00c0, 0x3f41, 0x2408, 0x0078,
-       0x3f4d, 0x8420, 0x8e70, 0x00f0, 0x3f28, 0x82ff, 0x00c0, 0x3f4c,
-       0xa085, 0x0001, 0x0078, 0x3f4e, 0x2208, 0xa006, 0x0d7f, 0x0e7f,
-       0x007c, 0xa084, 0x0007, 0x0079, 0x3f56, 0x007c, 0x3f5e, 0x3f5e,
-       0x3f5e, 0x3f5e, 0x3f5e, 0x3f5f, 0x3f78, 0x3fc0, 0x007c, 0x7110,
-       0xd1bc, 0x0040, 0x3f77, 0x7120, 0x2160, 0xac8c, 0x0007, 0x00c0,
-       0x3f77, 0xac8a, 0x7400, 0x0048, 0x3f77, 0x6854, 0xac02, 0x00c8,
-       0x3f77, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x5591, 0x007c,
-       0x0c7e, 0x7110, 0xd1bc, 0x00c0, 0x3fbe, 0x2011, 0x7283, 0x2204,
-       0x8211, 0x220c, 0x1078, 0x1e1b, 0x00c0, 0x3fbe, 0x1078, 0x3447,
-       0x00c0, 0x3fbe, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006,
-       0x00c0, 0x3fa3, 0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040, 0x3fbe,
+       0x2009, 0x762c, 0x210c, 0x81ff, 0x00c0, 0x3ecd, 0x6838, 0xa084,
+       0x00ff, 0x683a, 0x6853, 0x0000, 0x1078, 0x3668, 0x00c0, 0x3ec1,
+       0x007c, 0x1078, 0x3b0a, 0x127e, 0x2091, 0x8000, 0x1078, 0x6b3f,
+       0x1078, 0x3a7a, 0x127f, 0x0078, 0x3ec0, 0x2001, 0x0028, 0x2009,
+       0x0000, 0x0078, 0x3ec1, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906,
+       0x711a, 0x7010, 0x8001, 0x7012, 0x0040, 0x3ee2, 0x7007, 0x0006,
+       0x0078, 0x3ee8, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a,
+       0x007c, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848,
+       0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x3f14,
+       0x2009, 0x0000, 0x20a9, 0x007e, 0xa096, 0x0002, 0x0040, 0x3f14,
+       0xa005, 0x00c0, 0x3f2b, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078,
+       0x3825, 0x00c0, 0x3f2b, 0x067e, 0x6e44, 0xa6b4, 0x000f, 0x1078,
+       0x38ba, 0x067f, 0x0078, 0x3f2b, 0x047e, 0x2011, 0x760c, 0x2224,
+       0xc484, 0xc48c, 0x2412, 0x047f, 0x0c7e, 0x1078, 0x3825, 0x00c0,
+       0x3f27, 0x2091, 0x8000, 0x607b, 0x0000, 0x2091, 0x8001, 0x8108,
+       0x00f0, 0x3f1d, 0x0c7f, 0x1078, 0x1348, 0x007c, 0x127e, 0x2091,
+       0x8000, 0x7007, 0x0001, 0x2001, 0x7652, 0x2004, 0xd0a4, 0x0040,
+       0x3f6e, 0x6944, 0x1078, 0x416f, 0x6100, 0xd184, 0x0040, 0x3f53,
+       0x6858, 0xa084, 0x00ff, 0x00c0, 0x3f71, 0x6000, 0xd084, 0x0040,
+       0x3f6e, 0x6004, 0xa005, 0x00c0, 0x3f74, 0x6003, 0x0000, 0x600b,
+       0x0000, 0x0078, 0x3f6b, 0x2011, 0x0001, 0x6860, 0xa005, 0x00c0,
+       0x3f5b, 0x2001, 0x001e, 0x8000, 0x6016, 0x6858, 0xa084, 0x00ff,
+       0x0040, 0x3f6e, 0x6006, 0x6858, 0x8007, 0xa084, 0x00ff, 0x0040,
+       0x3f6e, 0x600a, 0x6202, 0x127f, 0x0078, 0x4142, 0x127f, 0x0078,
+       0x413a, 0x127f, 0x0078, 0x4132, 0x127f, 0x0078, 0x4136, 0x127e,
+       0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0x7652, 0x2004, 0xd0a4,
+       0x0040, 0x3fcc, 0x6944, 0x1078, 0x416f, 0x6000, 0xa084, 0x0001,
+       0x0040, 0x3fcc, 0x6204, 0x6308, 0x6c48, 0xa484, 0x0003, 0x0040,
+       0x3fa4, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0, 0x3f9d, 0x2100,
+       0xa210, 0x0048, 0x3fc9, 0x0078, 0x3fa4, 0x8001, 0x00c0, 0x3fc9,
+       0x2100, 0xa212, 0x0048, 0x3fc9, 0xa484, 0x000c, 0x0040, 0x3fbe,
+       0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0, 0x3fb6,
+       0x2100, 0xa318, 0x0048, 0x3fc9, 0x0078, 0x3fbe, 0xa082, 0x0004,
+       0x00c0, 0x3fc9, 0x2100, 0xa31a, 0x0048, 0x3fc9, 0x6860, 0xa005,
+       0x0040, 0x3fc4, 0x8000, 0x6016, 0x6206, 0x630a, 0x127f, 0x0078,
+       0x4142, 0x127f, 0x0078, 0x413e, 0x127f, 0x0078, 0x413a, 0x127e,
+       0x2091, 0x8000, 0x7007, 0x0001, 0x6944, 0x1078, 0x416f, 0x6308,
+       0x8318, 0x0048, 0x3fdf, 0x630a, 0x127f, 0x0078, 0x4150, 0x127f,
+       0x0078, 0x413e, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x7007, 0x0001,
+       0x684c, 0xd0ac, 0x0040, 0x3ff6, 0x027e, 0x2009, 0x0000, 0x2011,
+       0xfcff, 0x1078, 0x46b4, 0x027f, 0x0078, 0x402c, 0x6858, 0xa005,
+       0x0040, 0x4040, 0x685c, 0xa065, 0x0040, 0x403c, 0x2001, 0x762c,
+       0x2004, 0xa005, 0x0040, 0x4008, 0x1078, 0x6aa1, 0x0078, 0x400e,
+       0x6013, 0x0400, 0x2009, 0x0041, 0x1078, 0x5c29, 0x6958, 0xa18c,
+       0xe600, 0xa186, 0x2000, 0x0040, 0x4024, 0xa186, 0x0400, 0x0040,
+       0x4024, 0x6944, 0x0c7e, 0x1078, 0x460c, 0x6000, 0xa084, 0xfdff,
+       0x6002, 0x0c7f, 0x0078, 0x402c, 0x027e, 0x2009, 0x0000, 0x2011,
+       0xfdff, 0x1078, 0x46b4, 0x027f, 0x684c, 0xd0c4, 0x0040, 0x4038,
+       0x6944, 0x1078, 0x460c, 0x6008, 0x8000, 0x0048, 0x4038, 0x600a,
+       0x0c7f, 0x127f, 0x0078, 0x4142, 0x0c7f, 0x127f, 0x0078, 0x413a,
+       0x6954, 0xa186, 0x002a, 0x00c0, 0x404c, 0x2001, 0x760c, 0x200c,
+       0xc194, 0x2102, 0x0078, 0x402c, 0xa186, 0x0020, 0x0040, 0x4061,
+       0xa186, 0x0029, 0x00c0, 0x403c, 0x6944, 0xa18c, 0xff00, 0x810f,
+       0x1078, 0x3825, 0x00c0, 0x402c, 0x6000, 0xc0e4, 0x6002, 0x0078,
+       0x402c, 0x685c, 0xa065, 0x0040, 0x403c, 0x6017, 0x0014, 0x0078,
+       0x402c, 0x6944, 0x1078, 0x416f, 0x6000, 0xa084, 0x0001, 0x0040,
+       0x4082, 0x2091, 0x8000, 0x6204, 0x8210, 0x0048, 0x407c, 0x6206,
+       0x2091, 0x8001, 0x0078, 0x4150, 0x2091, 0x8001, 0x6853, 0x0016,
+       0x0078, 0x4149, 0x6853, 0x0007, 0x0078, 0x4149, 0x6834, 0x8007,
+       0xa084, 0x00ff, 0x00c0, 0x4090, 0x1078, 0x3df0, 0x0078, 0x40a2,
+       0x2030, 0x8001, 0x00c0, 0x409a, 0x7007, 0x0001, 0x1078, 0x40a3,
+       0x0078, 0x40a2, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a,
+       0x704b, 0x40a3, 0x007c, 0x0e7e, 0x2009, 0x762c, 0x210c, 0x81ff,
+       0x00c0, 0x4124, 0x2009, 0x760c, 0x210c, 0xd194, 0x00c0, 0x412e,
+       0x6848, 0x2070, 0xae82, 0x7d00, 0x0048, 0x4113, 0x2001, 0x7615,
+       0x2004, 0xae02, 0x00c8, 0x4113, 0x6944, 0x1078, 0x416f, 0x6100,
+       0xa184, 0x0001, 0x0040, 0x40f9, 0xa184, 0x0100, 0x00c0, 0x4117,
+       0xa184, 0x0200, 0x00c0, 0x411b, 0x601c, 0xa005, 0x00c0, 0x411f,
+       0x711c, 0xa186, 0x0006, 0x00c0, 0x40fe, 0x6853, 0x0000, 0x6803,
+       0x0000, 0x2d08, 0x127e, 0x2091, 0x8000, 0x7010, 0xa005, 0x00c0,
+       0x40f0, 0x7112, 0x7018, 0xa065, 0x0040, 0x4123, 0x6000, 0xd0e4,
+       0x00c0, 0x4128, 0x2e60, 0x1078, 0x4615, 0x127f, 0x0e7f, 0x007c,
+       0x2068, 0x6800, 0xa005, 0x00c0, 0x40f0, 0x6902, 0x127f, 0x0e7f,
+       0x007c, 0x0e7f, 0x6853, 0x0006, 0x0078, 0x4149, 0x6944, 0xa18c,
+       0xff00, 0x810f, 0x1078, 0x3825, 0x00c0, 0x4129, 0x6000, 0xd0e4,
+       0x00c0, 0x4129, 0x711c, 0xa186, 0x0007, 0x00c0, 0x4113, 0x6853,
+       0x0002, 0x0078, 0x412b, 0x6853, 0x0008, 0x0078, 0x412b, 0x6853,
+       0x000e, 0x0078, 0x412b, 0x6853, 0x0017, 0x0078, 0x412b, 0x6853,
+       0x0035, 0x0078, 0x412b, 0x127f, 0x6853, 0x0028, 0x0078, 0x412b,
+       0x127f, 0x6853, 0x0029, 0x0e7f, 0x0078, 0x4149, 0x6853, 0x002a,
+       0x0078, 0x412b, 0x2009, 0x003e, 0x0078, 0x4144, 0x2009, 0x0004,
+       0x0078, 0x4144, 0x2009, 0x0006, 0x0078, 0x4144, 0x2009, 0x0016,
+       0x0078, 0x4144, 0x2009, 0x0001, 0x6854, 0xa084, 0xff00, 0xa105,
+       0x6856, 0x2091, 0x8000, 0x1078, 0x3a7a, 0x2091, 0x8001, 0x007c,
+       0x1078, 0x1348, 0x007c, 0x702c, 0x7130, 0x8108, 0xa102, 0x0048,
+       0x4160, 0xa00e, 0x7034, 0x7072, 0x7038, 0x7076, 0x0078, 0x416c,
+       0x7070, 0xa080, 0x0040, 0x7072, 0x00c8, 0x416c, 0x7074, 0xa081,
+       0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, 0x007c, 0x0d7e,
+       0x1078, 0x460c, 0x0d7f, 0x007c, 0x0d7e, 0x2011, 0x0004, 0x2204,
+       0xa085, 0x8002, 0x2012, 0x0d7f, 0x007c, 0x20e1, 0x0002, 0x3d08,
+       0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0040, 0x418b, 0xa086,
+       0x1000, 0x00c0, 0x41a7, 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x00c0,
+       0x4192, 0x3e60, 0xac84, 0x0007, 0x00c0, 0x41a7, 0xac82, 0x7d00,
+       0x0048, 0x41a7, 0x6854, 0xac02, 0x00c8, 0x41a7, 0x2009, 0x0047,
+       0x1078, 0x5c29, 0x7a1c, 0xd284, 0x00c0, 0x417d, 0x007c, 0xa016,
+       0x1078, 0x1572, 0x0078, 0x41a2, 0x157e, 0x137e, 0x147e, 0x20e1,
+       0x3000, 0x3d20, 0x3e28, 0xa584, 0x0070, 0x00c0, 0x41d5, 0xa484,
+       0x7000, 0xa086, 0x1000, 0x00c0, 0x41d5, 0x1078, 0x41e2, 0x0040,
+       0x41d5, 0x20e1, 0x3000, 0x7828, 0x7828, 0x1078, 0x4200, 0x147f,
+       0x137f, 0x157f, 0x2009, 0x783e, 0x2104, 0xa005, 0x00c0, 0x41d1,
+       0x007c, 0x1078, 0x4c7a, 0x0078, 0x41d0, 0x1078, 0x7574, 0x1078,
+       0x41e2, 0x20e1, 0x3000, 0x7828, 0x7828, 0x147f, 0x137f, 0x157f,
+       0x0078, 0x41d0, 0xa484, 0x01ff, 0x687a, 0xa005, 0x0040, 0x41f4,
+       0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac, 0x20e1, 0x1000, 0x2ea0,
+       0x2099, 0x020a, 0x53a5, 0x007c, 0x20a9, 0x000c, 0x20e1, 0x1000,
+       0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085, 0x0001, 0x0078, 0x41f3,
+       0x7000, 0xa084, 0xff00, 0xa08c, 0xf000, 0x8007, 0xa196, 0x0000,
+       0x00c0, 0x420d, 0x0078, 0x4381, 0x007c, 0xa196, 0x2000, 0x00c0,
+       0x421e, 0x6900, 0xa18e, 0x0001, 0x00c0, 0x421a, 0x1078, 0x2eb2,
+       0x0078, 0x420c, 0x1078, 0x4226, 0x0078, 0x420c, 0xa196, 0x8000,
+       0x00c0, 0x420c, 0x1078, 0x4407, 0x0078, 0x420c, 0x0c7e, 0x7110,
+       0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0040, 0x4233, 0xa196,
+       0x0023, 0x00c0, 0x4328, 0xa08e, 0x0023, 0x00c0, 0x4264, 0x1078,
+       0x447e, 0x0040, 0x4328, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200,
+       0x00c0, 0x424c, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x0015,
+       0x1078, 0x5c29, 0x0078, 0x4328, 0xa08e, 0x0210, 0x00c0, 0x4256,
+       0x2009, 0x0015, 0x1078, 0x5c29, 0x0078, 0x4328, 0xa08e, 0x0100,
+       0x00c0, 0x4328, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x0016,
+       0x1078, 0x5c29, 0x0078, 0x4328, 0xa08e, 0x0022, 0x00c0, 0x4328,
+       0x7030, 0xa08e, 0x0300, 0x00c0, 0x4275, 0x7034, 0xa005, 0x00c0,
+       0x4328, 0x2009, 0x0017, 0x0078, 0x42f4, 0xa08e, 0x0500, 0x00c0,
+       0x4281, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x0018, 0x0078,
+       0x42f4, 0xa08e, 0x2010, 0x00c0, 0x4289, 0x2009, 0x0019, 0x0078,
+       0x42f4, 0xa08e, 0x2110, 0x00c0, 0x4291, 0x2009, 0x001a, 0x0078,
+       0x42f4, 0xa08e, 0x5200, 0x00c0, 0x429d, 0x7034, 0xa005, 0x00c0,
+       0x4328, 0x2009, 0x001b, 0x0078, 0x42f4, 0xa08e, 0x5000, 0x00c0,
+       0x42a9, 0x7034, 0xa005, 0x00c0, 0x4328, 0x2009, 0x001c, 0x0078,
+       0x42f4, 0xa08e, 0x1200, 0x00c0, 0x42b5, 0x7034, 0xa005, 0x00c0,
+       0x4328, 0x2009, 0x0024, 0x0078, 0x42f4, 0xa08c, 0xff00, 0xa18e,
+       0x2400, 0x00c0, 0x42bf, 0x2009, 0x002d, 0x0078, 0x42f4, 0xa08c,
+       0xff00, 0xa18e, 0x5300, 0x00c0, 0x42c9, 0x2009, 0x002a, 0x0078,
+       0x42f4, 0xa08e, 0x0f00, 0x00c0, 0x42d1, 0x2009, 0x0020, 0x0078,
+       0x42f4, 0xa08e, 0x5300, 0x00c0, 0x42d7, 0x0078, 0x42f2, 0xa08e,
+       0x6104, 0x00c0, 0x42f2, 0x2011, 0x7b8d, 0x8208, 0x2204, 0xa082,
+       0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108,
+       0x2124, 0x1078, 0x2d4a, 0x8108, 0x00f0, 0x42e4, 0x2009, 0x0023,
+       0x0078, 0x42f4, 0x2009, 0x001d, 0x017e, 0x2011, 0x7b83, 0x2204,
+       0x8211, 0x220c, 0x1078, 0x2085, 0x00c0, 0x432a, 0x1078, 0x37ee,
+       0x00c0, 0x432a, 0x6612, 0x6516, 0x86ff, 0x0040, 0x431a, 0x017f,
+       0x017e, 0xa186, 0x0017, 0x00c0, 0x431a, 0x6864, 0xa606, 0x00c0,
+       0x431a, 0x6868, 0xa506, 0xa084, 0xff00, 0x00c0, 0x431a, 0x6000,
+       0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x5b9c, 0x0040, 0x432d, 0x017f,
+       0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x5c29,
+       0x0c7f, 0x007c, 0x017f, 0x0078, 0x4328, 0x0c7f, 0x0078, 0x432a,
+       0x0e7e, 0x0d7e, 0x2028, 0x2130, 0xa696, 0x00ff, 0x00c0, 0x4350,
+       0xa596, 0xfffd, 0x00c0, 0x4340, 0x2009, 0x007f, 0x0078, 0x437d,
+       0xa596, 0xfffe, 0x00c0, 0x4348, 0x2009, 0x007e, 0x0078, 0x437d,
+       0xa596, 0xfffc, 0x00c0, 0x4350, 0x2009, 0x0080, 0x0078, 0x437d,
+       0x2011, 0x0000, 0x2021, 0x007e, 0x20a9, 0x0082, 0x2071, 0x779e,
+       0x2e1c, 0x83ff, 0x00c0, 0x4362, 0x82ff, 0x00c0, 0x4371, 0x2410,
+       0x0078, 0x4371, 0x2368, 0x6b10, 0x007e, 0x2100, 0xa31e, 0x007f,
+       0x00c0, 0x4371, 0x6b14, 0xa31e, 0x00c0, 0x4371, 0x2408, 0x0078,
+       0x437d, 0x8420, 0x8e70, 0x00f0, 0x4358, 0x82ff, 0x00c0, 0x437c,
+       0xa085, 0x0001, 0x0078, 0x437e, 0x2208, 0xa006, 0x0d7f, 0x0e7f,
+       0x007c, 0xa084, 0x0007, 0x0079, 0x4386, 0x007c, 0x438e, 0x438e,
+       0x438e, 0x438e, 0x438e, 0x438f, 0x43a8, 0x43f0, 0x007c, 0x7110,
+       0xd1bc, 0x0040, 0x43a7, 0x7120, 0x2160, 0xac8c, 0x0007, 0x00c0,
+       0x43a7, 0xac8a, 0x7d00, 0x0048, 0x43a7, 0x6854, 0xac02, 0x00c8,
+       0x43a7, 0x7124, 0x610a, 0x2009, 0x0046, 0x1078, 0x5c29, 0x007c,
+       0x0c7e, 0x7110, 0xd1bc, 0x00c0, 0x43ee, 0x2011, 0x7b83, 0x2204,
+       0x8211, 0x220c, 0x1078, 0x2085, 0x00c0, 0x43ee, 0x1078, 0x3825,
+       0x00c0, 0x43ee, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006,
+       0x00c0, 0x43d3, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x43ee,
        0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x2009, 0x0044, 0x1078,
-       0x5591, 0x0078, 0x3fbe, 0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040,
-       0x3fbe, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
-       0x00c0, 0x3fb6, 0x6007, 0x0005, 0x0078, 0x3fb8, 0x6007, 0x0001,
-       0x6003, 0x0001, 0x1078, 0x4376, 0x1078, 0x476a, 0x0c7f, 0x007c,
-       0x7110, 0xd1bc, 0x0040, 0x3fd6, 0x7020, 0x2060, 0xac84, 0x0007,
-       0x00c0, 0x3fd6, 0xac82, 0x7400, 0x0048, 0x3fd6, 0x6854, 0xac02,
-       0x00c8, 0x3fd6, 0x2009, 0x0045, 0x1078, 0x5591, 0x007c, 0x7110,
-       0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x3fe7, 0xa084,
-       0x000f, 0xa08a, 0x0006, 0x10c8, 0x12b7, 0x1079, 0x3fe8, 0x007c,
-       0x3fee, 0x3fef, 0x3fee, 0x3fee, 0x4030, 0x403f, 0x007c, 0x7110,
-       0xd1bc, 0x00c0, 0x402f, 0x700c, 0x7108, 0x1078, 0x1e1b, 0x00c0,
-       0x402f, 0x1078, 0x3410, 0x00c0, 0x402f, 0x6612, 0x6516, 0x6204,
-       0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x00c0, 0x4018, 0x0c7e,
-       0x1078, 0x5504, 0x017f, 0x0040, 0x402f, 0x611a, 0x601f, 0x0005,
-       0x7120, 0x610a, 0x2009, 0x0028, 0x1078, 0x5591, 0x0078, 0x402f,
-       0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040, 0x402f, 0x611a, 0x601f,
-       0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x402b, 0x2009,
-       0x0005, 0x0078, 0x402d, 0x2009, 0x0001, 0x1078, 0x5591, 0x007c,
-       0x7110, 0xd1bc, 0x0040, 0x403e, 0x1078, 0x404e, 0x0040, 0x403e,
-       0x7124, 0x610a, 0x2009, 0x0029, 0x1078, 0x5591, 0x007c, 0x7110,
-       0xd1bc, 0x0040, 0x404d, 0x1078, 0x404e, 0x0040, 0x404d, 0x7124,
-       0x610a, 0x2009, 0x002a, 0x1078, 0x5591, 0x007c, 0x7020, 0x2060,
-       0xac84, 0x0007, 0x00c0, 0x4061, 0xac82, 0x7400, 0x0048, 0x4061,
-       0x2001, 0x6d15, 0x2004, 0xac02, 0x00c8, 0x4061, 0xa085, 0x0001,
-       0x007c, 0xa006, 0x0078, 0x4060, 0x2071, 0x6f23, 0x7003, 0x0003,
-       0x700f, 0x0361, 0xa006, 0x701a, 0x7012, 0x7017, 0x7400, 0x7007,
-       0x0000, 0x7026, 0x702b, 0x4ff2, 0x7032, 0x7037, 0x503e, 0x007c,
-       0x2071, 0x6f23, 0x00e0, 0x40be, 0x2091, 0x6000, 0x700c, 0x8001,
-       0x700e, 0x00c0, 0x4087, 0x700f, 0x0361, 0x7007, 0x0001, 0x127e,
-       0x2091, 0x8000, 0x7024, 0xa00d, 0x0040, 0x409b, 0x7020, 0x8001,
-       0x7022, 0x00c0, 0x409b, 0x7023, 0x0009, 0x8109, 0x7126, 0x00c0,
-       0x409b, 0x7028, 0x107a, 0x7030, 0xa00d, 0x0040, 0x40ac, 0x702c,
-       0x8001, 0x702e, 0x00c0, 0x40ac, 0x702f, 0x0009, 0x8109, 0x7132,
-       0x00c0, 0x40ac, 0x7034, 0x107a, 0x7018, 0xa00d, 0x0040, 0x40bd,
-       0x7008, 0x8001, 0x700a, 0x00c0, 0x40bd, 0x700b, 0x0009, 0x8109,
-       0x711a, 0x00c0, 0x40bd, 0x701c, 0x107a, 0x127f, 0x7004, 0x0079,
-       0x40c1, 0x40e8, 0x40e9, 0x4105, 0x0e7e, 0x2071, 0x6f23, 0x7018,
-       0xa005, 0x00c0, 0x40cf, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f,
-       0x007c, 0x0e7e, 0x007e, 0x2071, 0x6f23, 0x701c, 0xa206, 0x00c0,
-       0x40db, 0x701a, 0x701e, 0x007f, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
-       0x6f23, 0x6088, 0xa102, 0x0048, 0x40e6, 0x618a, 0x0e7f, 0x007c,
-       0x007c, 0x7110, 0x1078, 0x3447, 0x00c0, 0x40fb, 0x6088, 0x8001,
-       0x0048, 0x40fb, 0x608a, 0x00c0, 0x40fb, 0x127e, 0x2091, 0x8000,
-       0x1078, 0x476a, 0x127f, 0x8108, 0xa182, 0x00ff, 0x0048, 0x4103,
-       0xa00e, 0x7007, 0x0002, 0x7112, 0x007c, 0x7014, 0x2060, 0x127e,
-       0x2091, 0x8000, 0x6014, 0xa005, 0x0040, 0x4134, 0x8001, 0x6016,
-       0x00c0, 0x4134, 0x611c, 0xa186, 0x0003, 0x0040, 0x411b, 0xa186,
-       0x0006, 0x00c0, 0x4132, 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a,
-       0x0048, 0x4132, 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048,
-       0x412b, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116,
-       0x0078, 0x4134, 0x1078, 0x5fea, 0x127f, 0xac88, 0x0008, 0x7116,
-       0x2001, 0x6d16, 0x2004, 0xa102, 0x0048, 0x4142, 0x7017, 0x7400,
-       0x7007, 0x0000, 0x007c, 0x0e7e, 0x2071, 0x6f23, 0x7027, 0x07d0,
-       0x7023, 0x0009, 0x0e7f, 0x007c, 0x2001, 0x6f2c, 0x2003, 0x0000,
-       0x007c, 0x0e7e, 0x2071, 0x6f23, 0x7033, 0x07d0, 0x702f, 0x0009,
-       0x0e7f, 0x007c, 0x2011, 0x6f2f, 0x2013, 0x0000, 0x007c, 0x0e7e,
-       0x2071, 0x6f23, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c,
-       0x0c7e, 0x2061, 0x6fb2, 0x0c7f, 0x007c, 0xa184, 0x000f, 0x8003,
-       0x8003, 0x8003, 0xa080, 0x6fb2, 0x2060, 0x007c, 0x684c, 0xa08c,
-       0x00c0, 0xa18e, 0x00c0, 0x0040, 0x41ac, 0xd0b4, 0x00c0, 0x4188,
-       0xd0bc, 0x00c0, 0x419a, 0x2009, 0x0006, 0x1078, 0x41cf, 0x007c,
-       0xd0fc, 0x0040, 0x4195, 0xa084, 0x0003, 0xa08e, 0x0003, 0x0040,
-       0x41c8, 0xa08e, 0x0000, 0x00c0, 0x41c8, 0x2009, 0x0043, 0x1078,
-       0x5591, 0x007c, 0xd0fc, 0x0040, 0x41a7, 0xa084, 0x0003, 0xa08e,
-       0x0003, 0x0040, 0x41c8, 0xa08e, 0x0000, 0x00c0, 0x41c8, 0x2009,
-       0x0042, 0x1078, 0x5591, 0x007c, 0xd0fc, 0x0040, 0x41be, 0xa084,
-       0x0003, 0xa08e, 0x0003, 0x0040, 0x41c8, 0xa08e, 0x0002, 0x0040,
-       0x41c2, 0x2009, 0x0041, 0x1078, 0x5591, 0x007c, 0x1078, 0x41cd,
-       0x0078, 0x41bd, 0x2009, 0x0043, 0x1078, 0x5591, 0x0078, 0x41bd,
-       0x2009, 0x0004, 0x1078, 0x41cf, 0x007c, 0x2009, 0x0001, 0x6010,
-       0xa0ec, 0xf000, 0x0040, 0x41f3, 0x2068, 0x6952, 0x6800, 0x6012,
-       0xa186, 0x0001, 0x00c0, 0x41ed, 0x694c, 0xa18c, 0x8100, 0xa18e,
-       0x8100, 0x00c0, 0x41ed, 0x0c7e, 0x6944, 0x1078, 0x416d, 0x6204,
-       0x8210, 0x0048, 0x41ec, 0x6206, 0x0c7f, 0x1078, 0x36a1, 0x6010,
-       0xa06d, 0x10c0, 0x4176, 0x007c, 0x157e, 0x0c7e, 0x20a9, 0x0010,
-       0x2061, 0x6fb2, 0x6000, 0x81ff, 0x0040, 0x4201, 0xa205, 0x0078,
-       0x4202, 0xa204, 0x6002, 0xace0, 0x0008, 0x00f0, 0x41fa, 0x0c7f,
-       0x157f, 0x007c, 0x6808, 0xa005, 0x0040, 0x4212, 0x8001, 0x680a,
-       0xa085, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x2079, 0x6f10,
-       0x127f, 0x0d7e, 0x2069, 0x6f10, 0x6803, 0x0005, 0x2069, 0x0004,
+       0x5c29, 0x0078, 0x43ee, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040,
+       0x43ee, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004,
+       0x00c0, 0x43e6, 0x6007, 0x0005, 0x0078, 0x43e8, 0x6007, 0x0001,
+       0x6003, 0x0001, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0c7f, 0x007c,
+       0x7110, 0xd1bc, 0x0040, 0x4406, 0x7020, 0x2060, 0xac84, 0x0007,
+       0x00c0, 0x4406, 0xac82, 0x7d00, 0x0048, 0x4406, 0x6854, 0xac02,
+       0x00c8, 0x4406, 0x2009, 0x0045, 0x1078, 0x5c29, 0x007c, 0x7110,
+       0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x00c0, 0x4417, 0xa084,
+       0x000f, 0xa08a, 0x0006, 0x10c8, 0x12d5, 0x1079, 0x4418, 0x007c,
+       0x441e, 0x441f, 0x441e, 0x441e, 0x4460, 0x446f, 0x007c, 0x7110,
+       0xd1bc, 0x00c0, 0x445f, 0x700c, 0x7108, 0x1078, 0x2085, 0x00c0,
+       0x445f, 0x1078, 0x37ee, 0x00c0, 0x445f, 0x6612, 0x6516, 0x6204,
+       0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x00c0, 0x4448, 0x0c7e,
+       0x1078, 0x5b9c, 0x017f, 0x0040, 0x445f, 0x611a, 0x601f, 0x0005,
+       0x7120, 0x610a, 0x2009, 0x0088, 0x1078, 0x5c29, 0x0078, 0x445f,
+       0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x445f, 0x611a, 0x601f,
+       0x0004, 0x7120, 0x610a, 0xa286, 0x0004, 0x00c0, 0x445b, 0x2009,
+       0x0005, 0x0078, 0x445d, 0x2009, 0x0001, 0x1078, 0x5c29, 0x007c,
+       0x7110, 0xd1bc, 0x0040, 0x446e, 0x1078, 0x447e, 0x0040, 0x446e,
+       0x7124, 0x610a, 0x2009, 0x0089, 0x1078, 0x5c29, 0x007c, 0x7110,
+       0xd1bc, 0x0040, 0x447d, 0x1078, 0x447e, 0x0040, 0x447d, 0x7124,
+       0x610a, 0x2009, 0x008a, 0x1078, 0x5c29, 0x007c, 0x7020, 0x2060,
+       0xac84, 0x0007, 0x00c0, 0x4491, 0xac82, 0x7d00, 0x0048, 0x4491,
+       0x2001, 0x7615, 0x2004, 0xac02, 0x00c8, 0x4491, 0xa085, 0x0001,
+       0x007c, 0xa006, 0x0078, 0x4490, 0x2071, 0x7849, 0x7003, 0x0003,
+       0x700f, 0x0361, 0xa006, 0x701a, 0x7012, 0x7017, 0x7d00, 0x7007,
+       0x0000, 0x7026, 0x702b, 0x558f, 0x7032, 0x7037, 0x55d0, 0x703b,
+       0x0002, 0x703f, 0x0000, 0x007c, 0x2071, 0x7849, 0x00e0, 0x455b,
+       0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0, 0x4524, 0x700f,
+       0x0361, 0x7007, 0x0001, 0x127e, 0x2091, 0x8000, 0x7138, 0x8109,
+       0x713a, 0x00c0, 0x4522, 0x703b, 0x0002, 0x2009, 0x0100, 0x2104,
+       0xa082, 0x0003, 0x00c8, 0x4522, 0x703c, 0xa086, 0x0001, 0x00c0,
+       0x44ff, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040,
+       0x44dd, 0x6803, 0x1000, 0x0078, 0x44e4, 0x6804, 0xa084, 0x1000,
+       0x0040, 0x44e4, 0x6803, 0x0100, 0x6803, 0x0000, 0x703f, 0x0000,
+       0x2069, 0x7836, 0x6804, 0xa082, 0x0006, 0x00c0, 0x44f1, 0x6807,
+       0x0000, 0x6830, 0xa082, 0x0003, 0x00c0, 0x44f8, 0x6833, 0x0000,
+       0x1078, 0x4c7a, 0x1078, 0x4d3a, 0x0d7f, 0x0078, 0x4522, 0x0d7e,
+       0x2069, 0x7600, 0x6944, 0x6860, 0xa102, 0x00c8, 0x4521, 0x2069,
+       0x7836, 0x6804, 0xa086, 0x0000, 0x00c0, 0x4521, 0x6830, 0xa086,
+       0x0000, 0x00c0, 0x4521, 0x703f, 0x0001, 0x6807, 0x0006, 0x6833,
+       0x0003, 0x2069, 0x0100, 0x6830, 0x689e, 0x2069, 0x0140, 0x6803,
+       0x0600, 0x0d7f, 0x0078, 0x4527, 0x127e, 0x2091, 0x8000, 0x7024,
+       0xa00d, 0x0040, 0x4538, 0x7020, 0x8001, 0x7022, 0x00c0, 0x4538,
+       0x7023, 0x0009, 0x8109, 0x7126, 0x00c0, 0x4538, 0x7028, 0x107a,
+       0x7030, 0xa00d, 0x0040, 0x4549, 0x702c, 0x8001, 0x702e, 0x00c0,
+       0x4549, 0x702f, 0x0009, 0x8109, 0x7132, 0x00c0, 0x4549, 0x7034,
+       0x107a, 0x7018, 0xa00d, 0x0040, 0x455a, 0x7008, 0x8001, 0x700a,
+       0x00c0, 0x455a, 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x455a,
+       0x701c, 0x107a, 0x127f, 0x7004, 0x0079, 0x455e, 0x4585, 0x4586,
+       0x45a2, 0x0e7e, 0x2071, 0x7849, 0x7018, 0xa005, 0x00c0, 0x456c,
+       0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e,
+       0x2071, 0x7849, 0x701c, 0xa206, 0x00c0, 0x4578, 0x701a, 0x701e,
+       0x007f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x7849, 0x6088, 0xa102,
+       0x0048, 0x4583, 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078,
+       0x3825, 0x00c0, 0x4598, 0x6088, 0x8001, 0x0048, 0x4598, 0x608a,
+       0x00c0, 0x4598, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f,
+       0x8108, 0xa182, 0x00ff, 0x0048, 0x45a0, 0xa00e, 0x7007, 0x0002,
+       0x7112, 0x007c, 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x6014,
+       0xa005, 0x0040, 0x45d1, 0x8001, 0x6016, 0x00c0, 0x45d1, 0x611c,
+       0xa186, 0x0003, 0x0040, 0x45b8, 0xa186, 0x0006, 0x00c0, 0x45cf,
+       0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x45cf, 0xa082,
+       0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x45c8, 0x2001, 0x1999,
+       0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x45d1, 0x1078,
+       0x67c9, 0x127f, 0xac88, 0x0008, 0x7116, 0x2001, 0x7616, 0x2004,
+       0xa102, 0x0048, 0x45df, 0x7017, 0x7d00, 0x7007, 0x0000, 0x007c,
+       0x0e7e, 0x2071, 0x7849, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b,
+       0x0002, 0x0e7f, 0x007c, 0x2001, 0x7852, 0x2003, 0x0000, 0x007c,
+       0x0e7e, 0x2071, 0x7849, 0x7033, 0x07d0, 0x702f, 0x0009, 0x0e7f,
+       0x007c, 0x2011, 0x7855, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071,
+       0x7849, 0x711a, 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0c7e,
+       0x2061, 0x78da, 0x0c7f, 0x007c, 0xa184, 0x000f, 0x8003, 0x8003,
+       0x8003, 0xa080, 0x78da, 0x2060, 0x007c, 0x6854, 0xa08a, 0x199a,
+       0x0048, 0x461c, 0x2001, 0x1999, 0xa005, 0x00c0, 0x462c, 0x6944,
+       0x0c7e, 0x1078, 0x460c, 0x6014, 0x0c7f, 0xa005, 0x00c0, 0x4631,
+       0x2001, 0x001e, 0x0078, 0x4631, 0xa08e, 0xffff, 0x00c0, 0x4631,
+       0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c,
+       0x00c0, 0xa18e, 0x00c0, 0x0040, 0x466c, 0xd0b4, 0x00c0, 0x4648,
+       0xd0bc, 0x00c0, 0x465a, 0x2009, 0x0006, 0x1078, 0x468f, 0x007c,
+       0xd0fc, 0x0040, 0x4655, 0xa084, 0x0003, 0xa08e, 0x0003, 0x0040,
+       0x4688, 0xa08e, 0x0000, 0x00c0, 0x4688, 0x2009, 0x0043, 0x1078,
+       0x5c29, 0x007c, 0xd0fc, 0x0040, 0x4667, 0xa084, 0x0003, 0xa08e,
+       0x0003, 0x0040, 0x4688, 0xa08e, 0x0000, 0x00c0, 0x4688, 0x2009,
+       0x0042, 0x1078, 0x5c29, 0x007c, 0xd0fc, 0x0040, 0x467e, 0xa084,
+       0x0003, 0xa08e, 0x0003, 0x0040, 0x4688, 0xa08e, 0x0002, 0x0040,
+       0x4682, 0x2009, 0x0041, 0x1078, 0x5c29, 0x007c, 0x1078, 0x468d,
+       0x0078, 0x467d, 0x2009, 0x0043, 0x1078, 0x5c29, 0x0078, 0x467d,
+       0x2009, 0x0004, 0x1078, 0x468f, 0x007c, 0x2009, 0x0001, 0x6010,
+       0xa0ec, 0xf000, 0x0040, 0x46b3, 0x2068, 0x6952, 0x6800, 0x6012,
+       0xa186, 0x0001, 0x00c0, 0x46ad, 0x694c, 0xa18c, 0x8100, 0xa18e,
+       0x8100, 0x00c0, 0x46ad, 0x0c7e, 0x6944, 0x1078, 0x460c, 0x6204,
+       0x8210, 0x0048, 0x46ac, 0x6206, 0x0c7f, 0x1078, 0x3a7a, 0x6010,
+       0xa06d, 0x10c0, 0x4615, 0x007c, 0x157e, 0x0c7e, 0x20a9, 0x0010,
+       0x2061, 0x78da, 0x6000, 0x81ff, 0x0040, 0x46c1, 0xa205, 0x0078,
+       0x46c2, 0xa204, 0x6002, 0xace0, 0x0008, 0x00f0, 0x46ba, 0x0c7f,
+       0x157f, 0x007c, 0x6808, 0xa005, 0x0040, 0x46d2, 0x8001, 0x680a,
+       0xa085, 0x0001, 0x007c, 0x127e, 0x2091, 0x2200, 0x2079, 0x7836,
+       0x127f, 0x0d7e, 0x2069, 0x7836, 0x6803, 0x0005, 0x2069, 0x0004,
        0x2d04, 0xa085, 0x8001, 0x206a, 0x0d7f, 0x007c, 0x0c7e, 0x6027,
-       0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x422e, 0x4238, 0x425d,
-       0x428e, 0x423e, 0x425d, 0x4236, 0x4236, 0x4236, 0x1078, 0x12b7,
-       0x1078, 0x414c, 0x1078, 0x476a, 0x0c7f, 0x007c, 0x62c0, 0x82ff,
-       0x00c0, 0x4244, 0x0c7f, 0x007c, 0x2011, 0x318e, 0x1078, 0x40d1,
-       0x7828, 0xa092, 0x0002, 0x00c8, 0x4253, 0x8000, 0x782a, 0x1078,
-       0x31c2, 0x0078, 0x4242, 0x1078, 0x318e, 0x7807, 0x0003, 0x7827,
-       0x0000, 0x782b, 0x0000, 0x0078, 0x4242, 0x1078, 0x414c, 0x62c0,
-       0x82ff, 0x00c0, 0x426f, 0x782b, 0x0000, 0x7824, 0xa065, 0x1040,
-       0x12b7, 0x2009, 0x0013, 0x1078, 0x5591, 0x0c7f, 0x007c, 0x0c7e,
-       0x7824, 0xa065, 0x1040, 0x12b7, 0x7804, 0xa086, 0x0004, 0x0040,
-       0x42cc, 0x7828, 0xa092, 0x2710, 0x00c8, 0x4285, 0x8000, 0x782a,
-       0x0c7f, 0x1078, 0x4fd7, 0x0078, 0x426d, 0x1078, 0x6c76, 0x2009,
-       0x0014, 0x1078, 0x5591, 0x0c7f, 0x0078, 0x426d, 0x2001, 0x6f2c,
-       0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x42a2, 0x782b, 0x0000,
-       0x7824, 0xa065, 0x1040, 0x12b7, 0x2009, 0x0013, 0x1078, 0x55df,
-       0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x7824, 0xa005, 0x1040, 0x12b7,
-       0x781c, 0xa06d, 0x1040, 0x12b7, 0x6800, 0xc0dc, 0x6802, 0x7924,
-       0x2160, 0x1078, 0x556a, 0x693c, 0x81ff, 0x1040, 0x12b7, 0x8109,
-       0x693e, 0x6854, 0xa015, 0x0040, 0x42c0, 0x7a1e, 0x0078, 0x42c2,
-       0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f, 0x0c7f,
-       0x1078, 0x476a, 0x0078, 0x42a0, 0x6104, 0xa186, 0x0002, 0x0040,
-       0x42d7, 0xa186, 0x0004, 0x0040, 0x42d7, 0x0078, 0x4279, 0x7808,
-       0xac06, 0x0040, 0x4279, 0x1078, 0x4671, 0x1078, 0x4376, 0x0c7f,
-       0x1078, 0x476a, 0x0078, 0x426d, 0x0c7e, 0x6027, 0x0002, 0x2011,
-       0x6f2f, 0x2013, 0x0000, 0x62c8, 0x82ff, 0x00c0, 0x42fe, 0x62c4,
-       0x82ff, 0x00c0, 0x42fe, 0x793c, 0xa1e5, 0x0000, 0x0040, 0x42fc,
-       0x2009, 0x0049, 0x1078, 0x5591, 0x0c7f, 0x007c, 0x6017, 0x0010,
-       0x793c, 0x81ff, 0x0040, 0x42fc, 0x7944, 0xa192, 0x2710, 0x00c8,
-       0x431d, 0x8108, 0x7946, 0x1078, 0x4151, 0x793c, 0xa188, 0x0007,
-       0x210c, 0xa18e, 0x0006, 0x00c0, 0x4319, 0x6017, 0x0012, 0x0078,
-       0x42fc, 0x6017, 0x0016, 0x0078, 0x42fc, 0x1078, 0x6c76, 0x793c,
-       0x2160, 0x2009, 0x004a, 0x1078, 0x5591, 0x0078, 0x42fc, 0x007e,
-       0x017e, 0x0c7e, 0x127e, 0x600f, 0x0000, 0x2c08, 0x2061, 0x6f10,
-       0x2091, 0x8000, 0x6020, 0x8000, 0x6022, 0x6010, 0xa005, 0x0040,
-       0x4342, 0xa080, 0x0003, 0x2102, 0x6112, 0x127f, 0x0c7f, 0x017f,
-       0x007f, 0x007c, 0x6116, 0x6112, 0x0078, 0x433d, 0x0d7e, 0x2069,
-       0x6f10, 0x6000, 0xd0d4, 0x0040, 0x435d, 0x6820, 0x8000, 0x6822,
-       0xa086, 0x0001, 0x00c0, 0x4356, 0x2c00, 0x681e, 0x6804, 0xa084,
-       0x0007, 0x0079, 0x4772, 0x0d7f, 0x007c, 0xc0d5, 0x6002, 0x6818,
-       0xa005, 0x0040, 0x436f, 0x6056, 0x605b, 0x0000, 0x007e, 0x2c00,
-       0x681a, 0x0d7f, 0x685a, 0x2069, 0x6f10, 0x0078, 0x434d, 0x6056,
-       0x605a, 0x2c00, 0x681a, 0x681e, 0x0078, 0x434d, 0x007e, 0x017e,
-       0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061,
-       0x6f10, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, 0x4391,
-       0xa080, 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, 0x007f,
-       0x007c, 0x610e, 0x610a, 0x0078, 0x438c, 0x0c7e, 0x600f, 0x0000,
-       0x2c08, 0x2061, 0x6f10, 0x6034, 0xa005, 0x0040, 0x43a5, 0xa080,
-       0x0003, 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, 0x0078,
-       0x43a3, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e,
-       0x127e, 0x2071, 0x6f10, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000,
-       0x8cff, 0x0040, 0x4405, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
-       0x00c0, 0x4400, 0x703c, 0xac06, 0x00c0, 0x43cb, 0x6003, 0x000a,
-       0x630a, 0x0078, 0x4400, 0x7038, 0xac36, 0x00c0, 0x43d1, 0x660c,
-       0x763a, 0x7034, 0xac36, 0x00c0, 0x43df, 0x2c00, 0xaf36, 0x0040,
-       0x43dd, 0x2f00, 0x7036, 0x0078, 0x43df, 0x7037, 0x0000, 0x660c,
-       0x067e, 0x2c00, 0xaf06, 0x0040, 0x43e8, 0x7e0e, 0x0078, 0x43e9,
-       0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003,
-       0x00c0, 0x440e, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
-       0x36a1, 0x1078, 0x6276, 0x1078, 0x6283, 0x0c7f, 0x0078, 0x43b8,
-       0x2c78, 0x600c, 0x2060, 0x0078, 0x43b8, 0x127f, 0x007f, 0x027f,
-       0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
-       0x0006, 0x00c0, 0x43f2, 0x1078, 0x6bb3, 0x0078, 0x43fb, 0x007e,
-       0x067e, 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000, 0x127e, 0x2091,
-       0x8000, 0x2079, 0x6f10, 0x7838, 0xa065, 0x0040, 0x444a, 0x600c,
-       0x007e, 0x600f, 0x0000, 0x783c, 0xac06, 0x00c0, 0x4435, 0x6003,
-       0x000a, 0x630a, 0x2c30, 0x0078, 0x4447, 0x6010, 0x2068, 0x601c,
-       0xa086, 0x0003, 0x00c0, 0x4453, 0x6837, 0x0103, 0x6b4a, 0x6847,
-       0x0000, 0x1078, 0x36a1, 0x1078, 0x6276, 0x1078, 0x6283, 0x007f,
-       0x0078, 0x4424, 0x7e3a, 0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f,
-       0x067f, 0x007f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x443c,
-       0x1078, 0x6bb3, 0x0078, 0x4445, 0x027e, 0x1078, 0x4470, 0x1078,
-       0x4507, 0x027f, 0x007c, 0x0f7e, 0x127e, 0x2079, 0x6f10, 0x2091,
-       0x8000, 0x1078, 0x4599, 0x1078, 0x4601, 0x127f, 0x0f7f, 0x007c,
-       0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091,
-       0x8000, 0x2071, 0x6f10, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0040,
-       0x44f6, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x44f1,
-       0x7024, 0xac06, 0x00c0, 0x44b6, 0x2069, 0x0100, 0x68c0, 0xa005,
-       0x0040, 0x44b1, 0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4,
-       0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
-       0x0040, 0x44a6, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
-       0x6824, 0xd084, 0x0040, 0x44ae, 0x6827, 0x0001, 0x037f, 0x0078,
-       0x44b6, 0x6003, 0x0009, 0x630a, 0x0078, 0x44f1, 0x7014, 0xac36,
-       0x00c0, 0x44bc, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x44ca,
-       0x2c00, 0xaf36, 0x0040, 0x44c8, 0x2f00, 0x7012, 0x0078, 0x44ca,
-       0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x44d3,
-       0x7e0e, 0x0078, 0x44d4, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
-       0x1078, 0x6120, 0x0040, 0x44ea, 0x601c, 0xa086, 0x0003, 0x00c0,
-       0x44fe, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1,
-       0x1078, 0x6276, 0x1078, 0x6283, 0x1078, 0x5374, 0x0c7f, 0x0078,
-       0x447e, 0x2c78, 0x600c, 0x2060, 0x0078, 0x447e, 0x127f, 0x007f,
+       0x0001, 0x7804, 0xa084, 0x0007, 0x0079, 0x46ee, 0x46f8, 0x471d,
+       0x4778, 0x46fe, 0x471d, 0x46f6, 0x46f6, 0x46f6, 0x1078, 0x12d5,
+       0x1078, 0x45eb, 0x1078, 0x4c7a, 0x0c7f, 0x007c, 0x62c0, 0x82ff,
+       0x00c0, 0x4704, 0x0c7f, 0x007c, 0x2011, 0x3542, 0x1078, 0x456e,
+       0x7828, 0xa092, 0x0002, 0x00c8, 0x4713, 0x8000, 0x782a, 0x1078,
+       0x3572, 0x0078, 0x4702, 0x1078, 0x3542, 0x7807, 0x0003, 0x7827,
+       0x0000, 0x782b, 0x0000, 0x0078, 0x4702, 0x1078, 0x45eb, 0x3c00,
+       0x007e, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x007f, 0x20e0,
+       0x82ff, 0x0040, 0x473b, 0x62c0, 0x82ff, 0x00c0, 0x473b, 0x782b,
+       0x0000, 0x7824, 0xa065, 0x1040, 0x12d5, 0x2009, 0x0013, 0x1078,
+       0x5c29, 0x0c7f, 0x007c, 0x3900, 0xa082, 0x797a, 0x00c8, 0x4742,
+       0x1078, 0x5b2c, 0x0c7e, 0x7824, 0xa065, 0x1040, 0x12d5, 0x7804,
+       0xa086, 0x0004, 0x0040, 0x47bd, 0x7828, 0xa092, 0x2710, 0x00c8,
+       0x4758, 0x8000, 0x782a, 0x0c7f, 0x1078, 0x5574, 0x0078, 0x4739,
+       0x6104, 0xa186, 0x0003, 0x00c0, 0x476f, 0x0e7e, 0x2071, 0x7600,
+       0x70c8, 0x0e7f, 0xd08c, 0x0040, 0x476f, 0x0c7e, 0x0e7e, 0x2061,
+       0x0100, 0x2071, 0x7600, 0x1078, 0x357b, 0x0e7f, 0x0c7f, 0x1078,
+       0x75c7, 0x2009, 0x0014, 0x1078, 0x5c29, 0x0c7f, 0x0078, 0x4739,
+       0x2001, 0x7852, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x00c0, 0x478c,
+       0x782b, 0x0000, 0x7824, 0xa065, 0x1040, 0x12d5, 0x2009, 0x0013,
+       0x1078, 0x5c77, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x3900, 0xa082,
+       0x797a, 0x00c8, 0x4795, 0x1078, 0x5b2c, 0x7824, 0xa005, 0x1040,
+       0x12d5, 0x781c, 0xa06d, 0x1040, 0x12d5, 0x6800, 0xc0dc, 0x6802,
+       0x7924, 0x2160, 0x1078, 0x5c02, 0x693c, 0x81ff, 0x1040, 0x12d5,
+       0x8109, 0x693e, 0x6854, 0xa015, 0x0040, 0x47b1, 0x7a1e, 0x0078,
+       0x47b3, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x0d7f,
+       0x0c7f, 0x1078, 0x4c7a, 0x0078, 0x478a, 0x6104, 0xa186, 0x0002,
+       0x0040, 0x47c8, 0xa186, 0x0004, 0x0040, 0x47c8, 0x0078, 0x474c,
+       0x7808, 0xac06, 0x0040, 0x474c, 0x1078, 0x4b81, 0x1078, 0x4872,
+       0x0c7f, 0x1078, 0x4c7a, 0x0078, 0x4739, 0x0c7e, 0x6027, 0x0002,
+       0x2011, 0x7855, 0x2013, 0x0000, 0x62c8, 0x82ff, 0x00c0, 0x47ef,
+       0x62c4, 0x82ff, 0x00c0, 0x47ef, 0x793c, 0xa1e5, 0x0000, 0x0040,
+       0x47ed, 0x2009, 0x0049, 0x1078, 0x5c29, 0x0c7f, 0x007c, 0x3908,
+       0xa192, 0x797a, 0x00c8, 0x47f6, 0x1078, 0x5b2c, 0x6017, 0x0010,
+       0x793c, 0x81ff, 0x0040, 0x47ed, 0x7944, 0xa192, 0x7530, 0x00c8,
+       0x4815, 0x8108, 0x7946, 0x1078, 0x45f0, 0x793c, 0xa188, 0x0007,
+       0x210c, 0xa18e, 0x0006, 0x00c0, 0x4811, 0x6017, 0x0012, 0x0078,
+       0x47ed, 0x6017, 0x0016, 0x0078, 0x47ed, 0x037e, 0x2019, 0x0001,
+       0x1078, 0x5768, 0x037f, 0x1078, 0x75c7, 0x793c, 0x2160, 0x2009,
+       0x004a, 0x1078, 0x5c29, 0x0078, 0x47ed, 0x007e, 0x017e, 0x0c7e,
+       0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0x7836,
+       0x6020, 0x8000, 0x6022, 0x6010, 0xa005, 0x0040, 0x4840, 0xa080,
+       0x0003, 0x2102, 0x6112, 0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c,
+       0x6116, 0x6112, 0x0078, 0x483b, 0x0d7e, 0x2069, 0x7836, 0x6000,
+       0xd0d4, 0x0040, 0x4859, 0x6820, 0x8000, 0x6822, 0xa086, 0x0001,
+       0x00c0, 0x4854, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007, 0x0079,
+       0x4c82, 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0040, 0x486b, 0x6056,
+       0x605b, 0x0000, 0x007e, 0x2c00, 0x681a, 0x0d7f, 0x685a, 0x2069,
+       0x7836, 0x0078, 0x484b, 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e,
+       0x0078, 0x484b, 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000,
+       0x600f, 0x0000, 0x2c08, 0x2061, 0x7836, 0x6020, 0x8000, 0x6022,
+       0x6008, 0xa005, 0x0040, 0x488d, 0xa080, 0x0003, 0x2102, 0x610a,
+       0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, 0x610e, 0x610a, 0x0078,
+       0x4888, 0x0c7e, 0x600f, 0x0000, 0x2c08, 0x2061, 0x7836, 0x6034,
+       0xa005, 0x0040, 0x48a1, 0xa080, 0x0003, 0x2102, 0x6136, 0x0c7f,
+       0x007c, 0x613a, 0x6136, 0x0078, 0x489f, 0x0f7e, 0x0e7e, 0x0d7e,
+       0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2071, 0x7836, 0x7638,
+       0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x4907, 0x6018,
+       0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x4902, 0x703c, 0xac06,
+       0x00c0, 0x48c7, 0x6003, 0x000a, 0x630a, 0x0078, 0x4902, 0x7038,
+       0xac36, 0x00c0, 0x48cd, 0x660c, 0x763a, 0x7034, 0xac36, 0x00c0,
+       0x48db, 0x2c00, 0xaf36, 0x0040, 0x48d9, 0x2f00, 0x7036, 0x0078,
+       0x48db, 0x7037, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040,
+       0x48e4, 0x7e0e, 0x0078, 0x48e5, 0x2678, 0x600f, 0x0000, 0x1078,
+       0x693e, 0x0040, 0x48fd, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003,
+       0x00c0, 0x4910, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
+       0x6b3f, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x1078, 0x6aa1, 0x0c7f,
+       0x0078, 0x48b4, 0x2c78, 0x600c, 0x2060, 0x0078, 0x48b4, 0x127f,
+       0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c,
+       0x601c, 0xa086, 0x0006, 0x00c0, 0x48f2, 0x1078, 0x74fd, 0x0078,
+       0x48fd, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, 0x0000,
+       0x127e, 0x2091, 0x8000, 0x2079, 0x7836, 0x7838, 0xa065, 0x0040,
+       0x4950, 0x600c, 0x007e, 0x600f, 0x0000, 0x783c, 0xac06, 0x00c0,
+       0x4937, 0x6003, 0x000a, 0x630a, 0x2c30, 0x0078, 0x494d, 0x1078,
+       0x693e, 0x0040, 0x494b, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003,
+       0x00c0, 0x4959, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078,
+       0x3a7a, 0x1078, 0x6a94, 0x1078, 0x6aa1, 0x007f, 0x0078, 0x4926,
+       0x7e3a, 0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
+       0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x4942, 0x1078, 0x74fd,
+       0x0078, 0x494b, 0x027e, 0x1078, 0x4976, 0x1078, 0x4a0f, 0x027f,
+       0x007c, 0x0f7e, 0x127e, 0x2079, 0x7836, 0x2091, 0x8000, 0x1078,
+       0x4aa6, 0x1078, 0x4b0e, 0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e,
+       0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
+       0x7836, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0040, 0x49fe, 0x6018,
+       0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x49f9, 0x7024, 0xac06,
+       0x00c0, 0x49bc, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x49b7,
+       0x1078, 0x5582, 0x68c3, 0x0000, 0x1078, 0x5a32, 0x7027, 0x0000,
+       0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x49ac,
+       0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
+       0x0040, 0x49b4, 0x6827, 0x0001, 0x037f, 0x0078, 0x49bc, 0x6003,
+       0x0009, 0x630a, 0x0078, 0x49f9, 0x7014, 0xac36, 0x00c0, 0x49c2,
+       0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x49d0, 0x2c00, 0xaf36,
+       0x0040, 0x49ce, 0x2f00, 0x7012, 0x0078, 0x49d0, 0x7013, 0x0000,
+       0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x49d9, 0x7e0e, 0x0078,
+       0x49da, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x693e,
+       0x0040, 0x49f2, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4a06, 0x6837,
+       0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6b3f, 0x1078, 0x3a7a,
+       0x1078, 0x6a94, 0x1078, 0x6aa1, 0x1078, 0x5902, 0x0c7f, 0x0078,
+       0x4984, 0x2c78, 0x600c, 0x2060, 0x0078, 0x4984, 0x127f, 0x007f,
        0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086,
-       0x0006, 0x00c0, 0x44e1, 0x1078, 0x6bb3, 0x0078, 0x44ea, 0x0c7e,
-       0x007e, 0x127e, 0x2091, 0x8000, 0xa280, 0x6e00, 0x2004, 0xa065,
-       0x0040, 0x4595, 0x0f7e, 0x0e7e, 0x0d7e, 0x067e, 0x2071, 0x6f10,
-       0x6654, 0x7018, 0xac06, 0x00c0, 0x451e, 0x761a, 0x701c, 0xac06,
-       0x00c0, 0x452a, 0x86ff, 0x00c0, 0x4529, 0x7018, 0x701e, 0x0078,
-       0x452a, 0x761e, 0x6058, 0xa07d, 0x0040, 0x452f, 0x7e56, 0xa6ed,
-       0x0000, 0x0040, 0x4535, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b,
-       0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x33c4, 0x0040,
-       0x4591, 0x7624, 0x86ff, 0x0040, 0x4586, 0xa680, 0x0004, 0x2004,
-       0xad06, 0x00c0, 0x4586, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005,
-       0x0040, 0x457d, 0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4,
+       0x0006, 0x00c0, 0x49e7, 0x1078, 0x74fd, 0x0078, 0x49f2, 0x0c7e,
+       0x007e, 0x127e, 0x2091, 0x8000, 0xa280, 0x7720, 0x2004, 0xa065,
+       0x0040, 0x4aa2, 0x0f7e, 0x0e7e, 0x0d7e, 0x067e, 0x2071, 0x7836,
+       0x6654, 0x7018, 0xac06, 0x00c0, 0x4a26, 0x761a, 0x701c, 0xac06,
+       0x00c0, 0x4a32, 0x86ff, 0x00c0, 0x4a31, 0x7018, 0x701e, 0x0078,
+       0x4a32, 0x761e, 0x6058, 0xa07d, 0x0040, 0x4a37, 0x7e56, 0xa6ed,
+       0x0000, 0x0040, 0x4a3d, 0x2f00, 0x685a, 0x6057, 0x0000, 0x605b,
+       0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x37a2, 0x0040,
+       0x4a9e, 0x7624, 0x86ff, 0x0040, 0x4a8e, 0xa680, 0x0004, 0x2004,
+       0xad06, 0x00c0, 0x4a8e, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005,
+       0x0040, 0x4a85, 0x1078, 0x5582, 0x68c3, 0x0000, 0x1078, 0x5a32,
        0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
-       0x0040, 0x4566, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
-       0x6824, 0xd084, 0x0040, 0x456e, 0x6827, 0x0001, 0x037f, 0x0d7f,
-       0x0c7e, 0x603c, 0xa005, 0x0040, 0x4577, 0x8001, 0x603e, 0x2660,
-       0x1078, 0x6283, 0x0c7f, 0x0078, 0x4586, 0x0d7f, 0x0c7e, 0x2660,
-       0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x453d, 0x6837, 0x0103,
-       0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1, 0x1078, 0x5374, 0x0078,
-       0x453d, 0x067f, 0x0d7f, 0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f,
-       0x007c, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814,
-       0xa065, 0x0040, 0x45f1, 0x600c, 0x007e, 0x600f, 0x0000, 0x7824,
-       0xac06, 0x00c0, 0x45d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040,
-       0x45d0, 0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4, 0x7827,
-       0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040,
-       0x45c5, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824,
-       0xd084, 0x0040, 0x45cd, 0x6827, 0x0001, 0x037f, 0x0078, 0x45d6,
-       0x6003, 0x0009, 0x630a, 0x2c30, 0x0078, 0x45ee, 0x6010, 0x2068,
-       0x1078, 0x6120, 0x0040, 0x45ea, 0x601c, 0xa086, 0x0003, 0x00c0,
-       0x45f8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1,
-       0x1078, 0x6276, 0x1078, 0x6283, 0x1078, 0x5374, 0x007f, 0x0078,
-       0x45a0, 0x7e16, 0x7e12, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c,
-       0x601c, 0xa086, 0x0006, 0x00c0, 0x45e1, 0x1078, 0x6bb3, 0x0078,
-       0x45ea, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x7818, 0xa065, 0x0040,
-       0x466a, 0x6054, 0x007e, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000,
-       0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x33c4, 0x0040, 0x4667, 0x7e24,
-       0x86ff, 0x0040, 0x465c, 0xa680, 0x0004, 0x2004, 0xad06, 0x00c0,
-       0x465c, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x4653,
-       0x1078, 0x4fe5, 0x68c3, 0x0000, 0x1078, 0x54a4, 0x7827, 0x0000,
-       0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x463c,
-       0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084,
-       0x0040, 0x4644, 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c,
-       0xa005, 0x0040, 0x464d, 0x8001, 0x603e, 0x2660, 0x1078, 0x6283,
-       0x0c7f, 0x0078, 0x465c, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009,
-       0x630a, 0x0c7f, 0x0078, 0x4613, 0x6837, 0x0103, 0x6b4a, 0x6847,
-       0x0000, 0x1078, 0x36a1, 0x1078, 0x5374, 0x0078, 0x4613, 0x007f,
-       0x0078, 0x4606, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
-       0x007c, 0x0e7e, 0x0c7e, 0x2071, 0x6f10, 0x7004, 0xa084, 0x0007,
-       0x0079, 0x467a, 0x4684, 0x4687, 0x46a0, 0x46bc, 0x4701, 0x4684,
-       0x4682, 0x4682, 0x1078, 0x12b7, 0x0c7f, 0x0e7f, 0x007c, 0x7024,
-       0xa065, 0x0040, 0x4695, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015,
-       0x0040, 0x469c, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027,
-       0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7216, 0x7212, 0x0078, 0x4695,
-       0x6018, 0x2060, 0x1078, 0x33c4, 0x6000, 0xc0dc, 0x6002, 0x7020,
-       0x8001, 0x7022, 0x0040, 0x46b1, 0x6054, 0xa015, 0x0040, 0x46b8,
+       0x0040, 0x4a6e, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
+       0x6824, 0xd084, 0x0040, 0x4a76, 0x6827, 0x0001, 0x037f, 0x0d7f,
+       0x0c7e, 0x603c, 0xa005, 0x0040, 0x4a7f, 0x8001, 0x603e, 0x2660,
+       0x1078, 0x6aa1, 0x0c7f, 0x0078, 0x4a8e, 0x0d7f, 0x0c7e, 0x2660,
+       0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x4a45, 0x8dff, 0x0040,
+       0x4a9a, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x6b3f,
+       0x1078, 0x3a7a, 0x1078, 0x5902, 0x0078, 0x4a45, 0x067f, 0x0d7f,
+       0x0e7f, 0x0f7f, 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e,
+       0x0c7e, 0x0d7e, 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x4afe,
+       0x600c, 0x007e, 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x4ae3,
+       0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x4add, 0x1078, 0x5582,
+       0x68c3, 0x0000, 0x1078, 0x5a32, 0x7827, 0x0000, 0x037e, 0x2069,
+       0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x4ad2, 0x6803, 0x0100,
+       0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4ada,
+       0x6827, 0x0001, 0x037f, 0x0078, 0x4ae3, 0x6003, 0x0009, 0x630a,
+       0x2c30, 0x0078, 0x4afb, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040,
+       0x4af7, 0x601c, 0xa086, 0x0003, 0x00c0, 0x4b05, 0x6837, 0x0103,
+       0x6b4a, 0x6847, 0x0000, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x1078,
+       0x6aa1, 0x1078, 0x5902, 0x007f, 0x0078, 0x4aad, 0x7e16, 0x7e12,
+       0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c, 0xa086, 0x0006,
+       0x00c0, 0x4aee, 0x1078, 0x74fd, 0x0078, 0x4af7, 0x007e, 0x067e,
+       0x0c7e, 0x0d7e, 0x7818, 0xa065, 0x0040, 0x4b7a, 0x6054, 0x007e,
+       0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002,
+       0x1078, 0x37a2, 0x0040, 0x4b77, 0x7e24, 0x86ff, 0x0040, 0x4b69,
+       0xa680, 0x0004, 0x2004, 0xad06, 0x00c0, 0x4b69, 0x0d7e, 0x2069,
+       0x0100, 0x68c0, 0xa005, 0x0040, 0x4b60, 0x1078, 0x5582, 0x68c3,
+       0x0000, 0x1078, 0x5a32, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140,
+       0x6b04, 0xa384, 0x1000, 0x0040, 0x4b49, 0x6803, 0x0100, 0x6803,
+       0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x4b51, 0x6827,
+       0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x4b5a,
+       0x8001, 0x603e, 0x2660, 0x1078, 0x6aa1, 0x0c7f, 0x0078, 0x4b69,
+       0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078,
+       0x4b20, 0x8dff, 0x0040, 0x4b73, 0x6837, 0x0103, 0x6b4a, 0x6847,
+       0x0000, 0x1078, 0x3a7a, 0x1078, 0x5902, 0x0078, 0x4b20, 0x007f,
+       0x0078, 0x4b13, 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f,
+       0x007c, 0x0e7e, 0x0c7e, 0x2071, 0x7836, 0x7004, 0xa084, 0x0007,
+       0x0079, 0x4b8a, 0x4b94, 0x4b97, 0x4bb0, 0x4bcc, 0x4c11, 0x4b94,
+       0x4b94, 0x4b92, 0x1078, 0x12d5, 0x0c7f, 0x0e7f, 0x007c, 0x7024,
+       0xa065, 0x0040, 0x4ba5, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015,
+       0x0040, 0x4bac, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027,
+       0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7216, 0x7212, 0x0078, 0x4ba5,
+       0x6018, 0x2060, 0x1078, 0x37a2, 0x6000, 0xc0dc, 0x6002, 0x7020,
+       0x8001, 0x7022, 0x0040, 0x4bc1, 0x6054, 0xa015, 0x0040, 0x4bc8,
        0x721e, 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c,
-       0x7218, 0x721e, 0x0078, 0x46b1, 0x7024, 0xa065, 0x0040, 0x46fe,
-       0x700c, 0xac06, 0x00c0, 0x46d3, 0x1078, 0x5374, 0x600c, 0xa015,
-       0x0040, 0x46cf, 0x720e, 0x600f, 0x0000, 0x0078, 0x46fc, 0x720e,
-       0x720a, 0x0078, 0x46fc, 0x7014, 0xac06, 0x00c0, 0x46e6, 0x1078,
-       0x5374, 0x600c, 0xa015, 0x0040, 0x46e2, 0x7216, 0x600f, 0x0000,
-       0x0078, 0x46fc, 0x7216, 0x7212, 0x0078, 0x46fc, 0x6018, 0x2060,
-       0x1078, 0x33c4, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x5374, 0x701c,
-       0xa065, 0x0040, 0x46fc, 0x6054, 0xa015, 0x0040, 0x46fa, 0x721e,
-       0x0078, 0x46fc, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, 0x0e7f,
-       0x007c, 0x7024, 0xa065, 0x0040, 0x470e, 0x1078, 0x5374, 0x600c,
-       0xa015, 0x0040, 0x4715, 0x720e, 0x600f, 0x0000, 0x1078, 0x54a4,
+       0x7218, 0x721e, 0x0078, 0x4bc1, 0x7024, 0xa065, 0x0040, 0x4c0e,
+       0x700c, 0xac06, 0x00c0, 0x4be3, 0x1078, 0x5902, 0x600c, 0xa015,
+       0x0040, 0x4bdf, 0x720e, 0x600f, 0x0000, 0x0078, 0x4c0c, 0x720e,
+       0x720a, 0x0078, 0x4c0c, 0x7014, 0xac06, 0x00c0, 0x4bf6, 0x1078,
+       0x5902, 0x600c, 0xa015, 0x0040, 0x4bf2, 0x7216, 0x600f, 0x0000,
+       0x0078, 0x4c0c, 0x7216, 0x7212, 0x0078, 0x4c0c, 0x6018, 0x2060,
+       0x1078, 0x37a2, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x5902, 0x701c,
+       0xa065, 0x0040, 0x4c0c, 0x6054, 0xa015, 0x0040, 0x4c0a, 0x721e,
+       0x0078, 0x4c0c, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, 0x0e7f,
+       0x007c, 0x7024, 0xa065, 0x0040, 0x4c1e, 0x1078, 0x5902, 0x600c,
+       0xa015, 0x0040, 0x4c25, 0x720e, 0x600f, 0x0000, 0x1078, 0x5a32,
        0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a, 0x0078,
-       0x470e, 0x0d7e, 0x2069, 0x6f10, 0x6830, 0xa084, 0x0003, 0x0079,
-       0x4721, 0x4727, 0x4729, 0x474f, 0x4725, 0x1078, 0x12b7, 0x0d7f,
-       0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x4745, 0x683c,
-       0xa065, 0x0040, 0x473a, 0x600c, 0xa015, 0x0040, 0x4741, 0x6a3a,
+       0x4c1e, 0x0d7e, 0x2069, 0x7836, 0x6830, 0xa084, 0x0003, 0x0079,
+       0x4c31, 0x4c37, 0x4c39, 0x4c5f, 0x4c37, 0x1078, 0x12d5, 0x0d7f,
+       0x007c, 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x4c55, 0x683c,
+       0xa065, 0x0040, 0x4c4a, 0x600c, 0xa015, 0x0040, 0x4c51, 0x6a3a,
        0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c7f, 0x0d7f,
-       0x007c, 0x683a, 0x6836, 0x0078, 0x473a, 0x6843, 0x0000, 0x6838,
-       0xa065, 0x0040, 0x473a, 0x6003, 0x0003, 0x0078, 0x473a, 0x0c7e,
-       0x6843, 0x0000, 0x6847, 0x0000, 0x683c, 0xa065, 0x0040, 0x4767,
-       0x600c, 0xa015, 0x0040, 0x4763, 0x6a3a, 0x600f, 0x0000, 0x683f,
-       0x0000, 0x0078, 0x4767, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f,
-       0x0d7f, 0x007c, 0x0d7e, 0x2069, 0x6f10, 0x6804, 0xa084, 0x0007,
-       0x0079, 0x4772, 0x477c, 0x4810, 0x4810, 0x4810, 0x4810, 0x4812,
-       0x477a, 0x477a, 0x1078, 0x12b7, 0x6820, 0xa005, 0x00c0, 0x4782,
-       0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x4791, 0x6807,
-       0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4858, 0x0c7f, 0x0d7f,
-       0x007c, 0x6814, 0xa065, 0x0040, 0x479f, 0x6807, 0x0001, 0x6826,
-       0x682b, 0x0000, 0x1078, 0x4858, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e,
-       0x037e, 0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x480b, 0x704c, 0xa00d,
-       0x0040, 0x47ae, 0x7088, 0xa005, 0x0040, 0x47c6, 0x7054, 0xa075,
-       0x0040, 0x47b7, 0xa20e, 0x0040, 0x480b, 0x0078, 0x47bc, 0x6818,
-       0xa20e, 0x0040, 0x480b, 0x2070, 0x704c, 0xa00d, 0x0040, 0x47ae,
-       0x7088, 0xa005, 0x00c0, 0x47ae, 0x2e00, 0x681e, 0x733c, 0x7038,
-       0xa302, 0x00c8, 0x47ae, 0x1078, 0x5539, 0x0040, 0x480b, 0x8318,
+       0x007c, 0x683a, 0x6836, 0x0078, 0x4c4a, 0x6843, 0x0000, 0x6838,
+       0xa065, 0x0040, 0x4c4a, 0x6003, 0x0003, 0x0078, 0x4c4a, 0x0c7e,
+       0x6843, 0x0000, 0x6847, 0x0000, 0x683c, 0xa065, 0x0040, 0x4c77,
+       0x600c, 0xa015, 0x0040, 0x4c73, 0x6a3a, 0x600f, 0x0000, 0x683f,
+       0x0000, 0x0078, 0x4c77, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f,
+       0x0d7f, 0x007c, 0x0d7e, 0x2069, 0x7836, 0x6804, 0xa084, 0x0007,
+       0x0079, 0x4c82, 0x4c8c, 0x4d29, 0x4d29, 0x4d29, 0x4d29, 0x4d2b,
+       0x4d29, 0x4c8a, 0x1078, 0x12d5, 0x6820, 0xa005, 0x00c0, 0x4c92,
+       0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x4ca1, 0x6807,
+       0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4d71, 0x0c7f, 0x0d7f,
+       0x007c, 0x6814, 0xa065, 0x0040, 0x4caf, 0x6807, 0x0001, 0x6826,
+       0x682b, 0x0000, 0x1078, 0x4d71, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e,
+       0x037e, 0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x4d24, 0x704c, 0xa00d,
+       0x0040, 0x4cbe, 0x7088, 0xa005, 0x0040, 0x4cd6, 0x7054, 0xa075,
+       0x0040, 0x4cc7, 0xa20e, 0x0040, 0x4d24, 0x0078, 0x4ccc, 0x6818,
+       0xa20e, 0x0040, 0x4d24, 0x2070, 0x704c, 0xa00d, 0x0040, 0x4cbe,
+       0x7088, 0xa005, 0x00c0, 0x4cbe, 0x2e00, 0x681e, 0x733c, 0x7038,
+       0xa302, 0x00c8, 0x4cbe, 0x1078, 0x5bd1, 0x0040, 0x4d24, 0x8318,
        0x733e, 0x6112, 0x2e10, 0x621a, 0xa180, 0x0015, 0x2004, 0xa08a,
-       0x199a, 0x0048, 0x47dd, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
+       0x199a, 0x0048, 0x4ced, 0x2001, 0x1999, 0x8003, 0x801b, 0x831b,
        0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc, 0x0040,
-       0x47ed, 0x2009, 0x0000, 0x0078, 0x47f2, 0xa1e0, 0x2091, 0x2c0c,
-       0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, 0x4c44, 0x7300,
-       0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000,
-       0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x0f7f, 0x0e7f,
-       0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, 0x0078, 0x4809,
-       0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x481e, 0x6807,
-       0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4858, 0x0c7f, 0x0d7f,
-       0x007c, 0x0f7e, 0x0d7e, 0x2069, 0x6f10, 0x6830, 0xa086, 0x0000,
-       0x00c0, 0x483f, 0x6838, 0xa07d, 0x0040, 0x483f, 0x6833, 0x0001,
-       0x683e, 0x6847, 0x0000, 0x127e, 0x0f7e, 0x2091, 0x2200, 0x027f,
-       0x1078, 0x1838, 0x00c0, 0x4842, 0x127f, 0x1078, 0x4ed5, 0x0d7f,
-       0x0f7f, 0x007c, 0x127f, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c,
-       0xa015, 0x0040, 0x4854, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000,
-       0x683f, 0x0000, 0x0078, 0x483f, 0x683a, 0x6836, 0x0078, 0x484e,
-       0x601c, 0xa084, 0x000f, 0x1079, 0x485e, 0x007c, 0x4867, 0x4869,
-       0x4b33, 0x4c15, 0x4869, 0x4b33, 0x4c15, 0x4867, 0x4869, 0x1078,
-       0x12b7, 0x157e, 0x137e, 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a,
-       0x0024, 0x10c8, 0x12b7, 0x6118, 0x2178, 0x79a0, 0xa1f8, 0x2091,
-       0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0x1079,
-       0x4887, 0x0f7f, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, 0x48ad,
-       0x48ec, 0x4904, 0x494c, 0x4979, 0x4981, 0x49a2, 0x49b3, 0x49c4,
-       0x49cc, 0x49dd, 0x49cc, 0x4a25, 0x49b3, 0x4a55, 0x4a5d, 0x49c4,
-       0x4a5d, 0x4a6e, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab,
-       0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x48ab, 0x50b8, 0x50cd,
-       0x50f0, 0x5114, 0x49a2, 0x1078, 0x12b7, 0x20a1, 0x020b, 0x1078,
-       0x4a83, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x0d7e, 0x2069, 0x6d51,
-       0x6804, 0xd084, 0x0040, 0x48ce, 0x6828, 0x017e, 0x2069, 0x6d00,
-       0x694c, 0xa106, 0x017f, 0x00c0, 0x48ce, 0x20a3, 0x0000, 0x6030,
-       0xa084, 0x00ff, 0x20a2, 0x0d7f, 0x0078, 0x48d3, 0x0d7f, 0x20a3,
-       0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x6d05, 0x53a6,
-       0x20a9, 0x0004, 0x2099, 0x6d01, 0x53a6, 0x20a3, 0x0000, 0x6030,
-       0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
-       0x001c, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83,
-       0x20a3, 0x0500, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x6030, 0xa084,
-       0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0x6d05, 0x53a6, 0x60c3,
-       0x0010, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83,
-       0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x4917,
-       0x20a3, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0078, 0x4919, 0x20a3,
-       0x0300, 0x20a3, 0x0000, 0x2099, 0x6f00, 0x20a9, 0x0008, 0x53a6,
-       0x20a9, 0x0004, 0x2099, 0x6d05, 0x53a6, 0x20a9, 0x0004, 0x2099,
-       0x6d01, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x492c,
-       0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x4932, 0x2099, 0x6f08,
+       0x4d06, 0x7100, 0xd1f4, 0x0040, 0x4d02, 0x7114, 0xa18c, 0x00ff,
+       0x0078, 0x4d0b, 0x2009, 0x0000, 0x0078, 0x4d0b, 0xa1e0, 0x232f,
+       0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, 0x51c2,
+       0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b,
+       0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, 0x0f7f,
+       0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, 0x0078,
+       0x4d22, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x4d37,
+       0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x4d71, 0x0c7f,
+       0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0x7836, 0x6830, 0xa086,
+       0x0000, 0x00c0, 0x4d58, 0x6838, 0xa07d, 0x0040, 0x4d58, 0x6833,
+       0x0001, 0x683e, 0x6847, 0x0000, 0x127e, 0x0f7e, 0x2091, 0x2200,
+       0x027f, 0x1078, 0x1a4c, 0x00c0, 0x4d5b, 0x127f, 0x1078, 0x5457,
+       0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843, 0x0000, 0x7803, 0x0002,
+       0x780c, 0xa015, 0x0040, 0x4d6d, 0x6a3a, 0x780f, 0x0000, 0x6833,
+       0x0000, 0x683f, 0x0000, 0x0078, 0x4d58, 0x683a, 0x6836, 0x0078,
+       0x4d67, 0x601c, 0xa084, 0x000f, 0x1079, 0x4d77, 0x007c, 0x4d80,
+       0x4d85, 0x508c, 0x5182, 0x4d85, 0x508c, 0x5182, 0x4d80, 0x4d85,
+       0x1078, 0x4b81, 0x1078, 0x4c7a, 0x007c, 0x157e, 0x137e, 0x147e,
+       0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0030, 0x10c8, 0x12d5, 0x6118,
+       0x2178, 0x79a0, 0xd1bc, 0x0040, 0x4da2, 0x7900, 0xd1f4, 0x0040,
+       0x4d9e, 0x7914, 0xa18c, 0x00ff, 0x0078, 0x4da7, 0x2009, 0x0000,
+       0x0078, 0x4da7, 0xa1f8, 0x232f, 0x2f0c, 0xa18c, 0x00ff, 0x2c78,
+       0x2061, 0x0100, 0x619a, 0x1079, 0x4db3, 0x0f7f, 0x0c7f, 0x147f,
+       0x137f, 0x157f, 0x007c, 0x4de5, 0x4e1d, 0x4e35, 0x4eb4, 0x4ee1,
+       0x4ee9, 0x4f0a, 0x4f1b, 0x4f2c, 0x4f34, 0x4f45, 0x4f34, 0x4f8d,
+       0x4f1b, 0x4fae, 0x4fb6, 0x4f2c, 0x4fb6, 0x4fc7, 0x4de3, 0x4de3,
+       0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3, 0x4de3,
+       0x4de3, 0x4de3, 0x5640, 0x5655, 0x5678, 0x569c, 0x4f0a, 0x4de3,
+       0x4f0a, 0x4f34, 0x4de3, 0x4e35, 0x4eb4, 0x4de3, 0x5b4c, 0x4f34,
+       0x4de3, 0x5b6f, 0x4f34, 0x1078, 0x12d5, 0x20a1, 0x020b, 0x1078,
+       0x4fdc, 0x20a3, 0x5200, 0x20a3, 0x0000, 0x0d7e, 0x2069, 0x7651,
+       0x6804, 0xd084, 0x0040, 0x4dff, 0x6828, 0x20a3, 0x0000, 0x017e,
+       0x1078, 0x209a, 0x21a2, 0x017f, 0x0d7f, 0x0078, 0x4e04, 0x0d7f,
+       0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0x7605,
+       0x53a6, 0x20a9, 0x0004, 0x2099, 0x7601, 0x53a6, 0x20a3, 0x0000,
+       0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000,
+       0x60c3, 0x001c, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078,
+       0x4fdc, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x6030,
+       0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0x7605, 0x53a6,
+       0x60c3, 0x0010, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078,
+       0x4fdc, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0,
+       0x4e48, 0x20a3, 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0078, 0x4e4a,
+       0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818, 0xa080, 0x0028, 0x2004,
+       0xa086, 0x007e, 0x00c0, 0x4e83, 0x2099, 0x7820, 0x33a6, 0x9398,
+       0x33a6, 0x9398, 0x3304, 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6,
+       0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
+       0x20a9, 0x0004, 0x2099, 0x7605, 0x53a6, 0x20a9, 0x0004, 0x2099,
+       0x7601, 0x53a6, 0x20a9, 0x0010, 0x20a3, 0x0000, 0x00f0, 0x4e74,
+       0x2099, 0x7828, 0x33a6, 0x20a9, 0x0007, 0x20a3, 0x0000, 0x00f0,
+       0x4e7d, 0x0078, 0x4ea3, 0x2099, 0x7820, 0x20a9, 0x0008, 0x53a6,
+       0x20a9, 0x0004, 0x2099, 0x7605, 0x53a6, 0x20a9, 0x0004, 0x2099,
+       0x7601, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x4e94,
+       0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x4e9a, 0x2099, 0x7828,
        0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0,
-       0x493d, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x4943, 0x60c3,
-       0x0074, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83,
+       0x4ea5, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x4eab, 0x60c3,
+       0x0074, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4fdc,
        0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000,
        0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079,
-       0x6d51, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x4968, 0xa085, 0x0020,
-       0xd1a4, 0x0040, 0x496d, 0xa085, 0x0010, 0xa085, 0x0002, 0x20a2,
-       0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x4fd1,
-       0x007c, 0x20a1, 0x020b, 0x1078, 0x4a83, 0x20a3, 0x5000, 0x0078,
-       0x4919, 0x20a1, 0x020b, 0x1078, 0x4a83, 0x20a3, 0x2110, 0x20a3,
-       0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0x20a3, 0x0000, 0x20a3,
+       0x7651, 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x4ed0, 0xa085, 0x0020,
+       0xd1a4, 0x0040, 0x4ed5, 0xa085, 0x0010, 0xa085, 0x0002, 0x20a2,
+       0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x556e,
+       0x007c, 0x20a1, 0x020b, 0x1078, 0x4fdc, 0x20a3, 0x5000, 0x0078,
+       0x4e4a, 0x20a1, 0x020b, 0x1078, 0x4fdc, 0x20a3, 0x2110, 0x20a3,
+       0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
        0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
-       0x0022, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
-       0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4afa, 0x20a3, 0x0200,
+       0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078,
+       0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5053, 0x20a3, 0x0200,
        0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004,
-       0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4afa, 0x20a3,
+       0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5053, 0x20a3,
        0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3,
-       0x0008, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078, 0x4afa,
-       0x20a3, 0x0200, 0x0078, 0x4919, 0x20a1, 0x020b, 0x1078, 0x4afa,
+       0x0008, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x1078, 0x5053,
+       0x20a3, 0x0200, 0x0078, 0x4e4a, 0x20a1, 0x020b, 0x1078, 0x5053,
        0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x7810, 0x20a2,
-       0x60c3, 0x0008, 0x1078, 0x4fd1, 0x007c, 0x0d7e, 0x20a1, 0x020b,
-       0x1078, 0x4afa, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800,
-       0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x4a03, 0x6998,
-       0xa184, 0xc000, 0x00c0, 0x49ff, 0xd1ec, 0x0040, 0x49fb, 0x20a3,
-       0x2100, 0x0078, 0x4a05, 0x20a3, 0x0100, 0x0078, 0x4a05, 0x20a3,
-       0x0400, 0x0078, 0x4a05, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2,
-       0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0x6d51, 0x7904, 0x0f7f,
-       0xd1ac, 0x00c0, 0x4a15, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x4a1a,
+       0x60c3, 0x0008, 0x1078, 0x556e, 0x007c, 0x0d7e, 0x20a1, 0x020b,
+       0x1078, 0x5053, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800,
+       0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x4f6b, 0x6998,
+       0xa184, 0xc000, 0x00c0, 0x4f67, 0xd1ec, 0x0040, 0x4f63, 0x20a3,
+       0x2100, 0x0078, 0x4f6d, 0x20a3, 0x0100, 0x0078, 0x4f6d, 0x20a3,
+       0x0400, 0x0078, 0x4f6d, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2,
+       0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0x7651, 0x7904, 0x0f7f,
+       0xd1ac, 0x00c0, 0x4f7d, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x4f82,
        0xa085, 0x0010, 0xa085, 0x0002, 0x20a2, 0x20a2, 0x20a2, 0x60c3,
-       0x0014, 0x1078, 0x4fd1, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078,
-       0x4afa, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x6018,
-       0x0d7e, 0x2068, 0x6804, 0x0d7f, 0xa084, 0x00ff, 0xa086, 0x0006,
-       0x0040, 0x4a3e, 0x20a3, 0x0400, 0x0078, 0x4a40, 0x20a3, 0x0100,
-       0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-       0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000,
-       0x60c3, 0x0014, 0x1078, 0x4fd1, 0x007c, 0x20a1, 0x020b, 0x1078,
-       0x4afa, 0x20a3, 0x0200, 0x0078, 0x48b3, 0x20a1, 0x020b, 0x1078,
-       0x4afa, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3,
-       0x2a00, 0x60c3, 0x0008, 0x1078, 0x4fd1, 0x007c, 0x20e1, 0x9080,
-       0x20e1, 0x4000, 0x20a1, 0x020b, 0x1078, 0x4afa, 0x20a3, 0x0100,
-       0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008,
-       0x1078, 0x4fd1, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
-       0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0, 0x4a96,
-       0x20a3, 0x22ff, 0x20a3, 0xfffe, 0x0078, 0x4ac4, 0xa286, 0x007f,
-       0x00c0, 0x4aa1, 0x0d7e, 0x20a3, 0x22ff, 0x20a3, 0xfffd, 0x0078,
-       0x4ab8, 0xd2bc, 0x0040, 0x4ac0, 0xa286, 0x0080, 0x0d7e, 0x00c0,
-       0x4aaf, 0x20a3, 0x22ff, 0x20a3, 0xfffc, 0x0078, 0x4ab8, 0xa2e8,
-       0x6e00, 0x2d6c, 0x6810, 0xa085, 0x2200, 0x20a2, 0x6814, 0x20a2,
-       0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4ac8,
-       0x20a3, 0x2200, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
-       0x20a3, 0x0129, 0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2, 0x20a3,
-       0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000,
-       0x027f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3,
-       0x02ff, 0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0x6d19, 0x2da6,
-       0x8d68, 0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078,
-       0x4acc, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3,
-       0x0000, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
-       0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x4b19, 0x0d7e,
-       0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x2300, 0x20a2, 0x6814,
-       0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
-       0x4b21, 0x20a3, 0x2300, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230,
-       0x22a2, 0x20a3, 0x0198, 0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2,
-       0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3,
-       0x0000, 0x027f, 0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0025,
-       0x1048, 0x12b7, 0xa08a, 0x002c, 0x10c8, 0x12b7, 0x6118, 0x2178,
-       0x79a0, 0xa1f8, 0x2091, 0x2f0c, 0xa18c, 0x00ff, 0x2c78, 0x2061,
-       0x0100, 0x619a, 0xa082, 0x0025, 0x1079, 0x4b51, 0x0f7f, 0x0c7f,
-       0x007c, 0x4b5a, 0x4b65, 0x4b7f, 0x4b58, 0x4b58, 0x4b58, 0x4b5a,
-       0x1078, 0x12b7, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4b8e, 0x60c3,
-       0x0000, 0x1078, 0x4fd1, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b,
-       0x1078, 0x4bbb, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2,
-       0x2fa2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3,
-       0x0000, 0x60c3, 0x000c, 0x1078, 0x4fd1, 0x147f, 0x007c, 0x147e,
-       0x20a1, 0x020b, 0x1078, 0x4be8, 0x20a3, 0x0003, 0x20a3, 0x0300,
-       0x60c3, 0x0004, 0x1078, 0x4fd1, 0x147f, 0x007c, 0x027e, 0x20e1,
-       0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092,
-       0x007e, 0x0048, 0x4bad, 0x0d7e, 0xa0e8, 0x6e00, 0x2d6c, 0x6810,
-       0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x6d19, 0x2da6,
-       0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4bb5, 0x20a3, 0x8100, 0x6298,
-       0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0009, 0x20a3,
-       0x0000, 0x0078, 0x4acc, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
-       0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x4bda,
-       0x0d7e, 0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2,
-       0x6814, 0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
-       0x0078, 0x4be2, 0x20a3, 0x8400, 0x6298, 0x22a2, 0x20a3, 0x0000,
-       0x6230, 0x22a2, 0x20a3, 0x00d1, 0x20a3, 0x0000, 0x0078, 0x4b25,
-       0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
-       0x2004, 0xa092, 0x007e, 0x0048, 0x4c07, 0x0d7e, 0xa0e8, 0x6e00,
-       0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069,
-       0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4c0f, 0x20a3,
-       0x8500, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
-       0x00d1, 0x20a3, 0x0000, 0x0078, 0x4b25, 0x0c7e, 0x0f7e, 0x2c78,
-       0x7804, 0xa08a, 0x0040, 0x1048, 0x12b7, 0xa08a, 0x004f, 0x10c8,
-       0x12b7, 0x7918, 0x2160, 0x61a0, 0xa1e0, 0x2091, 0x2c0c, 0xa18c,
-       0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x1079, 0x4c33,
-       0x0f7f, 0x0c7f, 0x007c, 0x4c44, 0x4d28, 0x4cd0, 0x4e50, 0x4c42,
-       0x4c42, 0x4c42, 0x4c42, 0x4c42, 0x4c42, 0x4c42, 0x528d, 0x529e,
-       0x52af, 0x52c0, 0x1078, 0x12b7, 0x0d7e, 0x157e, 0x147e, 0x20a1,
-       0x020b, 0x1078, 0x4c93, 0x7910, 0x2168, 0x6944, 0xa18c, 0x00ff,
-       0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, 0x0006,
-       0x8004, 0x20a2, 0xd1ac, 0x0040, 0x4c61, 0x20a3, 0x0002, 0x0078,
-       0x4c6d, 0xd1b4, 0x0040, 0x4c68, 0x20a3, 0x0001, 0x0078, 0x4c6d,
-       0x20a3, 0x0000, 0x2230, 0x0078, 0x4c6f, 0x6a80, 0x6e7c, 0x20a9,
-       0x0008, 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0,
-       0x4c73, 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014,
-       0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0x6f2c, 0x2003,
-       0x07d0, 0x2001, 0x6f2b, 0x2003, 0x0009, 0x1078, 0x14e4, 0x147f,
-       0x157f, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18,
-       0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217,
-       0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x4cb9, 0x0d7e,
-       0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814,
-       0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
-       0x4cc1, 0x20a3, 0x0600, 0x6198, 0x21a2, 0x20a3, 0x0000, 0x6130,
-       0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2, 0x20a3, 0x0000,
-       0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c,
-       0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4cf0,
-       0x7810, 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2, 0x6880, 0x20a2,
-       0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x60c3,
-       0x000c, 0x1078, 0x4fd1, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c,
-       0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
-       0x2004, 0xd0bc, 0x0040, 0x4d0e, 0x0d7e, 0xa0e8, 0x6e00, 0x2d6c,
-       0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x6d19,
-       0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4d16, 0x20a3, 0x0500,
-       0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0889,
-       0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2, 0x20a3, 0x0000, 0x7a08,
-       0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c,
-       0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4e18,
-       0x7810, 0x2068, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
-       0x7810, 0xa084, 0xf000, 0x00c0, 0x4d45, 0x7810, 0xa084, 0x0700,
-       0x8007, 0x1079, 0x4d4d, 0x0078, 0x4d48, 0xa006, 0x1079, 0x4d4d,
-       0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x4d57, 0x4db9, 0x4dbd,
-       0x4de0, 0x4ded, 0x4dff, 0x4e03, 0x4d55, 0x1078, 0x12b7, 0x017e,
-       0x037e, 0x694c, 0xa18c, 0x0003, 0xa186, 0x0000, 0x00c0, 0x4d6a,
-       0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x037f, 0x017f,
-       0x0078, 0x4de4, 0xa186, 0x0001, 0x00c0, 0x4db4, 0x6b78, 0x23a2,
-       0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, 0x22a2,
-       0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0040, 0x4db3,
-       0xd3c4, 0x0040, 0x4d85, 0x687c, 0xa108, 0xd3cc, 0x0040, 0x4d8a,
-       0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80, 0x0020, 0x201c,
-       0x831f, 0x23a2, 0x8000, 0x00f0, 0x4d8f, 0x157f, 0x22a2, 0x22a2,
-       0x22a2, 0xa184, 0x0003, 0x0040, 0x4db3, 0x20a1, 0x020b, 0x20e1,
-       0x9080, 0x20e1, 0x4000, 0x20a3, 0x0700, 0x6298, 0x22a2, 0x20a3,
-       0x0000, 0x6230, 0x22a2, 0x20a3, 0x0898, 0x20a2, 0x1078, 0x4fc0,
-       0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f, 0x017f, 0x1078, 0x4fd1,
-       0x007c, 0x20a3, 0x0008, 0x0078, 0x4de2, 0x20a3, 0x0302, 0x22a2,
-       0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008, 0x22a2,
-       0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500, 0x22a2,
-       0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2, 0x22a2,
-       0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078, 0x4fd1, 0x007c,
-       0x20a3, 0x0028, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
-       0x60c3, 0x0018, 0x1078, 0x4fd1, 0x007c, 0x20a3, 0x0100, 0x22a2,
-       0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x22a2,
-       0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x4fd1, 0x007c, 0x20a3,
-       0x0008, 0x0078, 0x4de2, 0x037e, 0x7b10, 0xa384, 0xff00, 0x7812,
-       0xa384, 0x00ff, 0x8001, 0x00c0, 0x4e11, 0x22a2, 0x037f, 0x0078,
-       0x4de2, 0x20a3, 0x0800, 0x22a2, 0x20a2, 0x037f, 0x0078, 0x4de4,
+       0x0014, 0x1078, 0x556e, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078,
+       0x5053, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3,
+       0x0100, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0x60c3, 0x0014, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b,
+       0x1078, 0x5053, 0x20a3, 0x0200, 0x0078, 0x4deb, 0x20a1, 0x020b,
+       0x1078, 0x5053, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003,
+       0x20a3, 0x2a00, 0x60c3, 0x0008, 0x1078, 0x556e, 0x007c, 0x20e1,
+       0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b, 0x1078, 0x5053, 0x20a3,
+       0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3,
+       0x0008, 0x1078, 0x556e, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1,
+       0x4000, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0,
+       0x4fef, 0x20a3, 0x22ff, 0x20a3, 0xfffe, 0x0078, 0x501d, 0xa286,
+       0x007f, 0x00c0, 0x4ffa, 0x0d7e, 0x20a3, 0x22ff, 0x20a3, 0xfffd,
+       0x0078, 0x5011, 0xd2bc, 0x0040, 0x5019, 0xa286, 0x0080, 0x0d7e,
+       0x00c0, 0x5008, 0x20a3, 0x22ff, 0x20a3, 0xfffc, 0x0078, 0x5011,
+       0xa2e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x2200, 0x20a2, 0x6814,
+       0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078,
+       0x5021, 0x20a3, 0x2200, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230,
+       0x22a2, 0x20a3, 0x0129, 0x20a3, 0x0000, 0x1078, 0x555d, 0x22a2,
+       0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0x027f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
+       0x20a3, 0x02ff, 0x2011, 0xfffc, 0x22a2, 0x0d7e, 0x2069, 0x7619,
+       0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x20a3, 0x2029, 0x20a3, 0x0000,
+       0x0078, 0x5025, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02,
+       0x20a3, 0x0000, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
+       0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x5072,
+       0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x2300, 0x20a2,
+       0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
+       0x0078, 0x507a, 0x20a3, 0x2300, 0x6298, 0x22a2, 0x20a3, 0x0000,
+       0x6230, 0x22a2, 0x20a3, 0x0198, 0x20a3, 0x0000, 0x1078, 0x555d,
+       0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000,
+       0x20a3, 0x0000, 0x027f, 0x007c, 0x0c7e, 0x0f7e, 0x6004, 0xa08a,
+       0x0085, 0x1048, 0x12d5, 0xa08a, 0x008c, 0x10c8, 0x12d5, 0x6118,
+       0x2178, 0x79a0, 0xd1bc, 0x0040, 0x50aa, 0x7900, 0xd1f4, 0x0040,
+       0x50a6, 0x7914, 0xa18c, 0x00ff, 0x0078, 0x50af, 0x2009, 0x0000,
+       0x0078, 0x50af, 0xa1f8, 0x232f, 0x2f0c, 0xa18c, 0x00ff, 0x2c78,
+       0x2061, 0x0100, 0x619a, 0xa082, 0x0085, 0x1079, 0x50ba, 0x0f7f,
+       0x0c7f, 0x007c, 0x50c3, 0x50ce, 0x50e8, 0x50c1, 0x50c1, 0x50c1,
+       0x50c3, 0x1078, 0x12d5, 0x147e, 0x20a1, 0x020b, 0x1078, 0x50fb,
+       0x60c3, 0x0000, 0x1078, 0x556e, 0x147f, 0x007c, 0x147e, 0x20a1,
+       0x020b, 0x1078, 0x5128, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808,
+       0x20a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000,
+       0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x556e, 0x147f, 0x007c,
+       0x147e, 0x20a1, 0x020b, 0x1078, 0x5155, 0x20a3, 0x0003, 0x20a3,
+       0x0300, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x1078,
+       0x556e, 0x147f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000,
+       0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x511a,
+       0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2,
+       0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
+       0x0078, 0x5122, 0x20a3, 0x8100, 0x6298, 0x22a2, 0x20a3, 0x0000,
+       0x6230, 0x22a2, 0x20a3, 0x0009, 0x20a3, 0x0000, 0x0078, 0x5025,
        0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028,
-       0x2004, 0xd0bc, 0x0040, 0x4e36, 0x0d7e, 0xa0e8, 0x6e00, 0x2d6c,
-       0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x6d19,
-       0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x4e3e, 0x20a3, 0x0700,
-       0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0898,
-       0x20a3, 0x0000, 0x1078, 0x4fc0, 0x22a2, 0x20a3, 0x0000, 0x7a08,
-       0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c,
-       0x0d7e, 0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, 0xa084,
-       0x0700, 0x8007, 0x1079, 0x4e63, 0x037f, 0x017f, 0x147f, 0x137f,
-       0x157f, 0x0d7f, 0x007c, 0x4e6b, 0x4e6b, 0x4e6d, 0x4e6b, 0x4e6b,
-       0x4e6b, 0x4e92, 0x4e6b, 0x1078, 0x12b7, 0x7910, 0xa18c, 0xf8ff,
-       0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078,
-       0x4e9c, 0x0d7e, 0x2069, 0x6d51, 0x6804, 0xd0bc, 0x0040, 0x4e87,
-       0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x4e89, 0x20a3,
-       0x3f00, 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x1078,
-       0x4fd1, 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, 0x4e9c,
-       0x20a3, 0x7f00, 0x0078, 0x4e8a, 0x027e, 0x20e1, 0x9080, 0x20e1,
-       0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x4eba,
-       0x0d7e, 0xa0e8, 0x6e00, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2,
-       0x6814, 0x20a2, 0x2069, 0x6d19, 0x2da6, 0x8d68, 0x2da6, 0x0d7f,
-       0x0078, 0x4ec2, 0x20a3, 0x0100, 0x6298, 0x22a2, 0x20a3, 0x0000,
-       0x6230, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078,
-       0x4fc0, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3,
-       0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e,
-       0x057e, 0x047e, 0x037e, 0x2061, 0x0100, 0x2071, 0x6d00, 0x6130,
-       0x7818, 0x2068, 0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x4eee, 0xa080,
-       0x2091, 0x2014, 0xa294, 0x00ff, 0x0078, 0x4ef2, 0x6910, 0x6a14,
-       0x7364, 0x7468, 0x781c, 0xa086, 0x0006, 0x0040, 0x4f3d, 0xd5bc,
-       0x0040, 0x4f02, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e,
-       0x0078, 0x4f08, 0x6063, 0x0100, 0x6266, 0x606b, 0x0000, 0x616e,
-       0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff,
-       0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808,
-       0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c,
-       0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af,
-       0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x4f31, 0x2011,
-       0x0000, 0x629e, 0x6017, 0x0016, 0x1078, 0x4151, 0x037f, 0x047f,
-       0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, 0x2070, 0x704c,
-       0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x4f83, 0xd5bc, 0x0040,
-       0x4f51, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078,
-       0x4f57, 0x6063, 0x0100, 0x6266, 0x606b, 0x0000, 0x616e, 0x6073,
-       0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e,
-       0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082,
-       0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, 0x707c, 0x60ca,
-       0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000,
-       0xa582, 0x0080, 0x0048, 0x4f7e, 0x2011, 0x0000, 0x629e, 0x6017,
-       0x0012, 0x0078, 0x4f34, 0xd5bc, 0x0040, 0x4f8e, 0xa185, 0x0700,
-       0x20a2, 0x6266, 0x636a, 0x646e, 0x0078, 0x4f94, 0x6063, 0x0700,
-       0x6266, 0x606b, 0x0000, 0x616e, 0x6073, 0x0898, 0x6077, 0x0000,
-       0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f,
-       0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, 0x7014, 0x608a, 0x7010,
+       0x2004, 0xa092, 0x007e, 0x0048, 0x5147, 0x0d7e, 0xa0e8, 0x7720,
+       0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069,
+       0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x514f, 0x20a3,
+       0x8400, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3,
+       0x00d1, 0x20a3, 0x0000, 0x0078, 0x507e, 0x027e, 0x20e1, 0x9080,
+       0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e,
+       0x0048, 0x5174, 0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085,
+       0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68,
+       0x2da6, 0x0d7f, 0x0078, 0x517c, 0x20a3, 0x8500, 0x6298, 0x22a2,
+       0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x00d1, 0x20a3, 0x0000,
+       0x0078, 0x507e, 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040,
+       0x1048, 0x12d5, 0xa08a, 0x0050, 0x10c8, 0x12d5, 0x7918, 0x2160,
+       0x61a0, 0xd1bc, 0x0040, 0x51a1, 0x6100, 0xd1f4, 0x0040, 0x519d,
+       0x6114, 0xa18c, 0x00ff, 0x0078, 0x51a6, 0x2009, 0x0000, 0x0078,
+       0x51a6, 0xa1e0, 0x232f, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100,
+       0x619a, 0xa082, 0x0040, 0x1079, 0x51b0, 0x0f7f, 0x0c7f, 0x007c,
+       0x51c2, 0x52aa, 0x5252, 0x53d2, 0x51c0, 0x51c0, 0x51c0, 0x51c0,
+       0x51c0, 0x51c0, 0x51c0, 0x581b, 0x582c, 0x583d, 0x584e, 0x51c0,
+       0x1078, 0x12d5, 0x0d7e, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
+       0x5215, 0x7910, 0x2168, 0x6944, 0xa18c, 0x00ff, 0x21a2, 0xa016,
+       0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, 0x0006, 0x8004, 0x20a2,
+       0xd1ac, 0x0040, 0x51df, 0x20a3, 0x0002, 0x0078, 0x51eb, 0xd1b4,
+       0x0040, 0x51e6, 0x20a3, 0x0001, 0x0078, 0x51eb, 0x20a3, 0x0000,
+       0x2230, 0x0078, 0x51ed, 0x6a80, 0x6e7c, 0x20a9, 0x0008, 0xad80,
+       0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0, 0x51f1, 0x22a2,
+       0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014, 0xa084, 0x0004,
+       0xa085, 0x0009, 0x6016, 0x2001, 0x7852, 0x2003, 0x07d0, 0x2001,
+       0x7851, 0x2003, 0x0009, 0x2001, 0x7857, 0x2003, 0x0002, 0x1078,
+       0x1504, 0x147f, 0x157f, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x20e1,
+       0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff,
+       0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040,
+       0x523b, 0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085, 0x0600,
+       0x20a2, 0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6,
+       0x0d7f, 0x0078, 0x5243, 0x20a3, 0x0600, 0x6198, 0x21a2, 0x20a3,
+       0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2,
+       0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b,
+       0x1078, 0x5272, 0x7810, 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2,
+       0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
+       0x20a2, 0x60c3, 0x000c, 0x1078, 0x556e, 0x147f, 0x137f, 0x157f,
+       0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
+       0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x5290, 0x0d7e, 0xa0e8,
+       0x7720, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2,
+       0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x5298,
+       0x20a3, 0x0500, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
+       0x20a3, 0x0889, 0x20a3, 0x0000, 0x1078, 0x555d, 0x22a2, 0x20a3,
+       0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
+       0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b,
+       0x1078, 0x539a, 0x7810, 0x2068, 0xa016, 0x22a2, 0x22a2, 0x22a2,
+       0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x00c0, 0x52c7, 0x7810,
+       0xa084, 0x0700, 0x8007, 0x1079, 0x52cf, 0x0078, 0x52ca, 0xa006,
+       0x1079, 0x52cf, 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x52d9,
+       0x533b, 0x533f, 0x5362, 0x536f, 0x5381, 0x5385, 0x52d7, 0x1078,
+       0x12d5, 0x017e, 0x037e, 0x694c, 0xa18c, 0x0003, 0xa186, 0x0000,
+       0x00c0, 0x52ec, 0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2,
+       0x037f, 0x017f, 0x0078, 0x5366, 0xa186, 0x0001, 0x00c0, 0x5336,
+       0x6b78, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874,
+       0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300,
+       0x0040, 0x5335, 0xd3c4, 0x0040, 0x5307, 0x687c, 0xa108, 0xd3cc,
+       0x0040, 0x530c, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, 0xad80,
+       0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x5311, 0x157f,
+       0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x5335, 0x20a1,
+       0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x0700, 0x6298,
+       0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0898, 0x20a2,
+       0x1078, 0x555d, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x037f, 0x017f,
+       0x1078, 0x556e, 0x007c, 0x20a3, 0x0008, 0x0078, 0x5364, 0x20a3,
+       0x0302, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3,
+       0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3,
+       0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500,
+       0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x1078,
+       0x556e, 0x007c, 0x20a3, 0x0028, 0x22a2, 0x22a2, 0x22a2, 0x22a2,
+       0x22a2, 0x22a2, 0x60c3, 0x0018, 0x1078, 0x556e, 0x007c, 0x20a3,
+       0x0100, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008,
+       0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x1078, 0x556e,
+       0x007c, 0x20a3, 0x0008, 0x0078, 0x5364, 0x037e, 0x7b10, 0xa384,
+       0xff00, 0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x5393, 0x22a2,
+       0x037f, 0x0078, 0x5364, 0x20a3, 0x0800, 0x22a2, 0x20a2, 0x037f,
+       0x0078, 0x5366, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818,
+       0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x53b8, 0x0d7e, 0xa0e8,
+       0x7720, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2,
+       0x2069, 0x7619, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x53c0,
+       0x20a3, 0x0700, 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2,
+       0x20a3, 0x0898, 0x20a3, 0x0000, 0x1078, 0x555d, 0x22a2, 0x20a3,
+       0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000,
+       0x027f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x017e, 0x037e,
+       0x7810, 0xa084, 0x0700, 0x8007, 0x1079, 0x53e5, 0x037f, 0x017f,
+       0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x53ed, 0x53ed, 0x53ef,
+       0x53ed, 0x53ed, 0x53ed, 0x5414, 0x53ed, 0x1078, 0x12d5, 0x7910,
+       0xa18c, 0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009,
+       0x0003, 0x1078, 0x541e, 0x0d7e, 0x2069, 0x7651, 0x6804, 0xd0bc,
+       0x0040, 0x5409, 0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078,
+       0x540b, 0x20a3, 0x3f00, 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3,
+       0x0001, 0x1078, 0x556e, 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003,
+       0x1078, 0x541e, 0x20a3, 0x7f00, 0x0078, 0x540c, 0x027e, 0x20e1,
+       0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc,
+       0x0040, 0x543c, 0x0d7e, 0xa0e8, 0x7720, 0x2d6c, 0x6810, 0xa085,
+       0x0100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0x7619, 0x2da6, 0x8d68,
+       0x2da6, 0x0d7f, 0x0078, 0x5444, 0x20a3, 0x0100, 0x6298, 0x22a2,
+       0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008,
+       0x21a2, 0x1078, 0x555d, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2,
+       0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0e7e,
+       0x0d7e, 0x0c7e, 0x057e, 0x047e, 0x037e, 0x2061, 0x0100, 0x2071,
+       0x7600, 0x6130, 0x7818, 0x2068, 0x68a0, 0x2028, 0xd0bc, 0x00c0,
+       0x5470, 0xa080, 0x232f, 0x2014, 0xa294, 0x00ff, 0x0078, 0x5474,
+       0x6910, 0x6a14, 0x7364, 0x7468, 0x781c, 0xa086, 0x0006, 0x0040,
+       0x54c8, 0xd5bc, 0x0040, 0x5484, 0xa185, 0x0100, 0x6062, 0x6266,
+       0x636a, 0x646e, 0x0078, 0x548a, 0x6063, 0x0100, 0x6266, 0x606b,
+       0x0000, 0x616e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000,
+       0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
+       0x6082, 0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010,
        0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab,
        0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048,
-       0x4fbb, 0x2011, 0x0000, 0x629e, 0x6017, 0x0016, 0x0078, 0x4f34,
-       0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202,
-       0x8217, 0x007c, 0x0d7e, 0x2069, 0x6f10, 0x6843, 0x0001, 0x0d7f,
-       0x007c, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078,
-       0x4fdc, 0x1078, 0x4143, 0x007c, 0x007e, 0x6014, 0xa084, 0x0004,
-       0xa085, 0x0009, 0x6016, 0x007f, 0x007c, 0x007e, 0x0c7e, 0x2061,
-       0x0100, 0x6014, 0xa084, 0x0004, 0xa085, 0x0008, 0x6016, 0x0c7f,
-       0x007f, 0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x027e, 0x1078, 0x414c,
-       0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, 0x4000, 0x0040,
-       0x503a, 0x1078, 0x4fe5, 0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e,
-       0x2061, 0x6f10, 0x6128, 0xa192, 0x0002, 0x00c8, 0x5027, 0x8108,
-       0x612a, 0x613c, 0x0c7f, 0x81ff, 0x0040, 0x5035, 0x1078, 0x4143,
-       0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x5023, 0x6017,
-       0x0012, 0x0078, 0x5035, 0x1078, 0x4fdc, 0x0078, 0x5035, 0x6124,
-       0xa1e5, 0x0000, 0x0040, 0x5032, 0x1078, 0x6c76, 0x2009, 0x0014,
-       0x1078, 0x5591, 0x0c7f, 0x0078, 0x5035, 0x027f, 0x017f, 0x0d7f,
-       0x0c7f, 0x007c, 0x1078, 0x31cb, 0x0078, 0x5035, 0x0c7e, 0x0d7e,
-       0x0e7e, 0x017e, 0x027e, 0x1078, 0x415a, 0x2071, 0x6f10, 0x713c,
-       0x81ff, 0x0040, 0x5079, 0x2061, 0x0100, 0x2069, 0x0140, 0x6904,
-       0x017e, 0x017f, 0xa194, 0x4000, 0x0040, 0x507f, 0x6017, 0x0010,
-       0x7144, 0xa192, 0x0002, 0x00c8, 0x5071, 0x8108, 0x7146, 0x1078,
-       0x4151, 0x713c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0,
-       0x506d, 0x6017, 0x0012, 0x0078, 0x5079, 0x6017, 0x0016, 0x0078,
-       0x5079, 0x1078, 0x6c76, 0x2009, 0x004a, 0x1078, 0x5591, 0x0078,
-       0x5079, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x1078,
-       0x4151, 0x0078, 0x5079, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e,
+       0x54bc, 0x6a00, 0xd2f4, 0x0040, 0x54ba, 0x6a14, 0xa294, 0x00ff,
+       0x0078, 0x54bc, 0x2011, 0x0000, 0x629e, 0x6017, 0x0016, 0x1078,
+       0x45f0, 0x037f, 0x047f, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
+       0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040,
+       0x5517, 0xd5bc, 0x0040, 0x54dc, 0xa185, 0x0100, 0x6062, 0x6266,
+       0x636a, 0x646e, 0x0078, 0x54e2, 0x6063, 0x0100, 0x6266, 0x606b,
+       0x0000, 0x616e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000,
+       0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00,
+       0x6086, 0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080,
+       0x60c6, 0x707c, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af,
+       0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x5512, 0x6a00,
+       0xd2f4, 0x0040, 0x5510, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x5512,
+       0x2011, 0x0000, 0x629e, 0x6017, 0x0012, 0x0078, 0x54bf, 0xd5bc,
+       0x0040, 0x5522, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e,
+       0x0078, 0x5528, 0x6063, 0x0700, 0x6266, 0x606b, 0x0000, 0x616e,
+       0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff,
+       0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808,
+       0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008,
+       0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7,
+       0x0000, 0xa582, 0x0080, 0x0048, 0x5558, 0x6a00, 0xd2f4, 0x0040,
+       0x5556, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x5558, 0x2011, 0x0000,
+       0x629e, 0x6017, 0x0016, 0x0078, 0x54bf, 0x7a18, 0xa280, 0x0023,
+       0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e,
+       0x2069, 0x7836, 0x6843, 0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080,
+       0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078, 0x5579, 0x1078, 0x45e0,
+       0x007c, 0x007e, 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016,
+       0x007f, 0x007c, 0x007e, 0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084,
+       0x0004, 0xa085, 0x0008, 0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e,
+       0x0d7e, 0x017e, 0x027e, 0x1078, 0x45eb, 0x2061, 0x0100, 0x2069,
+       0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x55cc, 0x1078, 0x5582,
+       0x6803, 0x1000, 0x6803, 0x0000, 0x0c7e, 0x2061, 0x7836, 0x6128,
+       0xa192, 0x0002, 0x00c8, 0x55b9, 0x8108, 0x612a, 0x6124, 0x0c7f,
+       0x81ff, 0x0040, 0x55c7, 0x1078, 0x45e0, 0x1078, 0x5579, 0x0078,
+       0x55c7, 0x6124, 0xa1e5, 0x0000, 0x0040, 0x55c4, 0x1078, 0x75c7,
+       0x2009, 0x0014, 0x1078, 0x5c29, 0x0c7f, 0x0078, 0x55c7, 0x027f,
+       0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x1078, 0x357b, 0x0078, 0x55c7,
+       0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x45f9, 0x2071,
+       0x7836, 0x713c, 0x81ff, 0x0040, 0x55fa, 0x2061, 0x0100, 0x2069,
+       0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x5600, 0x6803, 0x1000,
+       0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x5768, 0x037f,
+       0x713c, 0x2160, 0x1078, 0x75c7, 0x2009, 0x004a, 0x1078, 0x5c29,
+       0x0078, 0x55fa, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c,
+       0x7144, 0xa192, 0x0002, 0x00c8, 0x55ea, 0x8108, 0x7146, 0x1078,
+       0x45f0, 0x0078, 0x55fa, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e,
        0x047e, 0x007e, 0x127e, 0x2091, 0x8000, 0x6018, 0x2068, 0x6ca0,
-       0x2071, 0x6f10, 0x7018, 0x2068, 0x8dff, 0x0040, 0x50af, 0x68a0,
-       0xa406, 0x0040, 0x509f, 0x6854, 0x2068, 0x0078, 0x5094, 0x6010,
+       0x2071, 0x7836, 0x7018, 0x2068, 0x8dff, 0x0040, 0x5637, 0x68a0,
+       0xa406, 0x0040, 0x5627, 0x6854, 0x2068, 0x0078, 0x561c, 0x6010,
        0x2060, 0x643c, 0x6540, 0x6644, 0xa6b4, 0x000f, 0x2d60, 0x1078,
-       0x3522, 0x0040, 0x50af, 0x1078, 0x5374, 0xa085, 0x0001, 0x127f,
+       0x38f9, 0x0040, 0x5637, 0x1078, 0x5902, 0xa085, 0x0001, 0x127f,
        0x007f, 0x047f, 0x057f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c,
-       0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4a83, 0x20a3, 0x0f00,
+       0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4fdc, 0x20a3, 0x0f00,
        0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, 0x0008,
-       0x1078, 0x4fd1, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
-       0x020b, 0x1078, 0x4afa, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9,
-       0x0006, 0x2011, 0x6d40, 0x2019, 0x6d40, 0x23a6, 0x22a6, 0xa398,
-       0x0002, 0xa290, 0x0002, 0x00f0, 0x50dd, 0x20a3, 0x0000, 0x20a3,
-       0x0000, 0x60c3, 0x001c, 0x1078, 0x4fd1, 0x147f, 0x157f, 0x007c,
-       0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x4ada,
-       0x1078, 0x4af1, 0x7810, 0x007e, 0xa080, 0x0015, 0x2098, 0x7808,
+       0x1078, 0x556e, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1,
+       0x020b, 0x1078, 0x5053, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9,
+       0x0006, 0x2011, 0x7640, 0x2019, 0x7641, 0x23a6, 0x22a6, 0xa398,
+       0x0002, 0xa290, 0x0002, 0x00f0, 0x5665, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0x60c3, 0x001c, 0x1078, 0x556e, 0x147f, 0x157f, 0x007c,
+       0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x5033,
+       0x1078, 0x504a, 0x7810, 0x007e, 0xa080, 0x0015, 0x2098, 0x7808,
        0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2,
-       0x007f, 0xa080, 0x0001, 0x2004, 0x7812, 0x1078, 0x4fd1, 0x027f,
+       0x007f, 0xa080, 0x0001, 0x2004, 0x7812, 0x1078, 0x556e, 0x027f,
        0x017f, 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b,
-       0x1078, 0x4a83, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000,
-       0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x4fd1, 0x147f, 0x157f,
+       0x1078, 0x4fdc, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000,
+       0x7808, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x556e, 0x147f, 0x157f,
        0x007c, 0x0e7e, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
-       0x6f10, 0x700c, 0x2060, 0x8cff, 0x0040, 0x513f, 0x600c, 0x007e,
-       0x1078, 0x556a, 0x1078, 0x5374, 0x0c7f, 0x0078, 0x5133, 0x700f,
-       0x0000, 0x700b, 0x0000, 0x127f, 0x007f, 0x0c7f, 0x0e7f, 0x007c,
+       0x7836, 0x700c, 0x2060, 0x8cff, 0x0040, 0x56cd, 0x1078, 0x6ace,
+       0x00c0, 0x56c4, 0x1078, 0x5e57, 0x600c, 0x007e, 0x1078, 0x5c02,
+       0x1078, 0x5902, 0x0c7f, 0x0078, 0x56bb, 0x700f, 0x0000, 0x700b,
+       0x0000, 0x127f, 0x007f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x157e,
+       0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091,
+       0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x7836, 0x7024,
+       0x2060, 0x8cff, 0x0040, 0x5726, 0x1078, 0x5582, 0x68c3, 0x0000,
+       0x1078, 0x45eb, 0x2009, 0x0013, 0x1078, 0x5c29, 0x20a9, 0x01f4,
+       0x6824, 0xd094, 0x0040, 0x5709, 0x6827, 0x0004, 0x7804, 0xa084,
+       0x4000, 0x0040, 0x571b, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078,
+       0x571b, 0xd084, 0x0040, 0x5710, 0x6827, 0x0001, 0x0078, 0x5712,
+       0x00f0, 0x56f8, 0x7804, 0xa084, 0x1000, 0x0040, 0x571b, 0x7803,
+       0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f, 0x027f, 0x0c7f,
+       0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c, 0x2001, 0x7600,
+       0x2004, 0xa096, 0x0001, 0x0040, 0x575e, 0xa096, 0x0004, 0x0040,
+       0x575e, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x3542, 0x1078,
+       0x456e, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x574c, 0x6827,
+       0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x575e, 0x7803, 0x1000,
+       0x7803, 0x0000, 0x0078, 0x575e, 0xd084, 0x0040, 0x5753, 0x6827,
+       0x0001, 0x0078, 0x5755, 0x00f0, 0x573b, 0x7804, 0xa084, 0x1000,
+       0x0040, 0x575e, 0x7803, 0x0100, 0x7803, 0x0000, 0x007f, 0x017f,
+       0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
        0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x027e, 0x017e,
        0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071,
-       0x6f10, 0x7024, 0x2060, 0x8cff, 0x0040, 0x5198, 0x1078, 0x4fe5,
-       0x68c3, 0x0000, 0x1078, 0x414c, 0x2009, 0x0013, 0x1078, 0x5591,
-       0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x517b, 0x6827, 0x0004,
-       0x7804, 0xa084, 0x4000, 0x0040, 0x518d, 0x7803, 0x1000, 0x7803,
-       0x0000, 0x0078, 0x518d, 0xd084, 0x0040, 0x5182, 0x6827, 0x0001,
-       0x0078, 0x5184, 0x00f0, 0x516a, 0x7804, 0xa084, 0x1000, 0x0040,
-       0x518d, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
+       0x7836, 0x703c, 0x2060, 0x8cff, 0x0040, 0x57b6, 0x6817, 0x0010,
+       0x68cb, 0x0000, 0x68c7, 0x0000, 0x1078, 0x45f9, 0x1078, 0x1c19,
+       0xa39d, 0x0000, 0x00c0, 0x5790, 0x2009, 0x0049, 0x1078, 0x5c29,
+       0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x57a3, 0x6827, 0x0004,
+       0x7804, 0xa084, 0x4000, 0x0040, 0x57b5, 0x7803, 0x1000, 0x7803,
+       0x0000, 0x0078, 0x57b5, 0xd094, 0x0040, 0x57aa, 0x6827, 0x0002,
+       0x0078, 0x57ac, 0x00f0, 0x5792, 0x7804, 0xa084, 0x1000, 0x0040,
+       0x57b5, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x007f, 0x017f,
        0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, 0x127f, 0x007c,
-       0x2001, 0x6d00, 0x2004, 0xa096, 0x0001, 0x0040, 0x51d0, 0xa096,
-       0x0004, 0x0040, 0x51d0, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011,
-       0x318e, 0x1078, 0x40d1, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040,
-       0x51be, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x51d0,
-       0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x51d0, 0xd084, 0x0040,
-       0x51c5, 0x6827, 0x0001, 0x0078, 0x51c7, 0x00f0, 0x51ad, 0x7804,
-       0xa084, 0x1000, 0x0040, 0x51d0, 0x7803, 0x0100, 0x7803, 0x0000,
-       0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f,
-       0x127f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e,
-       0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079,
-       0x0140, 0x2071, 0x6f10, 0x703c, 0x2060, 0x8cff, 0x0040, 0x5228,
-       0x6817, 0x0010, 0x68cb, 0x0000, 0x68c7, 0x0000, 0x1078, 0x415a,
-       0x1078, 0x1a20, 0xa39d, 0x0000, 0x00c0, 0x5202, 0x2009, 0x0049,
-       0x1078, 0x5591, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x5215,
-       0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x5227, 0x7803,
-       0x1000, 0x7803, 0x0000, 0x0078, 0x5227, 0xd094, 0x0040, 0x521c,
-       0x6827, 0x0002, 0x0078, 0x521e, 0x00f0, 0x5204, 0x7804, 0xa084,
-       0x1000, 0x0040, 0x5227, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824,
-       0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f,
-       0x127f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x6f10,
-       0x6a06, 0x127f, 0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000,
-       0x2069, 0x6f10, 0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e,
-       0x0c7e, 0x067e, 0x007e, 0x127e, 0x2071, 0x6f10, 0x7614, 0x2660,
-       0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x5286, 0x601c, 0xa206,
-       0x00c0, 0x5281, 0x7014, 0xac36, 0x00c0, 0x5260, 0x660c, 0x7616,
-       0x7010, 0xac36, 0x00c0, 0x526e, 0x2c00, 0xaf36, 0x0040, 0x526c,
-       0x2f00, 0x7012, 0x0078, 0x526e, 0x7013, 0x0000, 0x660c, 0x067e,
-       0x2c00, 0xaf06, 0x0040, 0x5277, 0x7e0e, 0x0078, 0x5278, 0x2678,
-       0x600f, 0x0000, 0x1078, 0x6283, 0x1078, 0x5374, 0x0c7f, 0x0078,
-       0x5253, 0x2c78, 0x600c, 0x2060, 0x0078, 0x5253, 0x127f, 0x007f,
-       0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1,
-       0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
-       0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0078, 0x52cf, 0x157e, 0x147e,
-       0x20a1, 0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2, 0xa006, 0x20a2,
-       0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x52cf, 0x157e,
-       0x147e, 0x20a1, 0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2, 0xa006,
-       0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x52cf,
-       0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x4c93, 0x7810, 0x20a2,
-       0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078,
-       0x537f, 0x60c3, 0x0020, 0x1078, 0x4fd1, 0x147f, 0x157f, 0x007c,
-       0x127e, 0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4,
-       0x00c0, 0x52e7, 0xd1bc, 0x00c0, 0x5331, 0x0078, 0x5371, 0x2009,
+       0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7836, 0x6a06, 0x127f,
+       0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0x7836,
+       0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
+       0x007e, 0x127e, 0x2071, 0x7836, 0x7614, 0x2660, 0x2678, 0x2091,
+       0x8000, 0x8cff, 0x0040, 0x5814, 0x601c, 0xa206, 0x00c0, 0x580f,
+       0x7014, 0xac36, 0x00c0, 0x57ee, 0x660c, 0x7616, 0x7010, 0xac36,
+       0x00c0, 0x57fc, 0x2c00, 0xaf36, 0x0040, 0x57fa, 0x2f00, 0x7012,
+       0x0078, 0x57fc, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
+       0x0040, 0x5805, 0x7e0e, 0x0078, 0x5806, 0x2678, 0x600f, 0x0000,
+       0x1078, 0x6aa1, 0x1078, 0x5902, 0x0c7f, 0x0078, 0x57e1, 0x2c78,
+       0x600c, 0x2060, 0x0078, 0x57e1, 0x127f, 0x007f, 0x067f, 0x0c7f,
+       0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078,
+       0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2,
+       0x20a3, 0x4000, 0x0078, 0x585d, 0x157e, 0x147e, 0x20a1, 0x020b,
+       0x1078, 0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2,
+       0x20a2, 0x20a3, 0x2000, 0x0078, 0x585d, 0x157e, 0x147e, 0x20a1,
+       0x020b, 0x1078, 0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2,
+       0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x585d, 0x157e, 0x147e,
+       0x20a1, 0x020b, 0x1078, 0x5215, 0x7810, 0x20a2, 0xa006, 0x20a2,
+       0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x1078, 0x590d, 0x60c3,
+       0x0020, 0x1078, 0x556e, 0x147f, 0x157f, 0x007c, 0x127e, 0x0c7e,
+       0x2091, 0x8000, 0x2061, 0x0100, 0x6120, 0xd1b4, 0x00c0, 0x5875,
+       0xd1bc, 0x00c0, 0x58bf, 0x0078, 0x58ff, 0x2009, 0x017f, 0x200b,
+       0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140, 0x20a9, 0x001e,
+       0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040, 0x58b6, 0x6020,
+       0xd0b4, 0x0040, 0x58b6, 0x6024, 0xd094, 0x00c0, 0x58b6, 0x2104,
+       0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x58b6, 0x00f0, 0x5882,
+       0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff,
+       0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91, 0x6043, 0x0001,
+       0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094, 0x00c0, 0x58b5,
+       0x6a04, 0xa294, 0x4000, 0x00c0, 0x58ac, 0x027f, 0x0d7f, 0x007f,
+       0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078, 0x58ff, 0x2009,
        0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, 0x0140,
        0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, 0x0040,
-       0x5328, 0x6020, 0xd0b4, 0x0040, 0x5328, 0x6024, 0xd094, 0x00c0,
-       0x5328, 0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x5328,
-       0x00f0, 0x52f4, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, 0x6130,
-       0xa18c, 0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, 0xbc91,
-       0x6043, 0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, 0xd094,
-       0x00c0, 0x5327, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x531e, 0x027f,
-       0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0078,
-       0x5371, 0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e,
-       0x2069, 0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084,
-       0x4000, 0x0040, 0x536a, 0x6020, 0xd0bc, 0x0040, 0x536a, 0x2104,
-       0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x536a, 0x00f0, 0x533e,
-       0x027e, 0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff,
-       0xa10d, 0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001,
-       0x6043, 0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0,
-       0x5364, 0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b,
-       0x0000, 0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0x6f10, 0x7020,
-       0xa005, 0x0040, 0x537d, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9,
-       0x0008, 0x20a2, 0x00f0, 0x5381, 0x20a2, 0x20a2, 0x007c, 0x0f7e,
-       0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091,
-       0x8000, 0x2071, 0x6f10, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001,
-       0x87ff, 0x0040, 0x5417, 0x8cff, 0x0040, 0x5417, 0x601c, 0xa086,
-       0x0006, 0x00c0, 0x5412, 0x88ff, 0x0040, 0x53ae, 0x2800, 0xac06,
-       0x00c0, 0x5412, 0x2039, 0x0000, 0x0078, 0x53b2, 0x6018, 0xa206,
-       0x00c0, 0x5412, 0x7024, 0xac06, 0x00c0, 0x53e0, 0x2069, 0x0100,
-       0x68c0, 0xa005, 0x0040, 0x53db, 0x6817, 0x0008, 0x68c3, 0x0000,
-       0x1078, 0x54a4, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
-       0xa384, 0x1000, 0x0040, 0x53d0, 0x6803, 0x0100, 0x6803, 0x0000,
-       0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x53d8, 0x6827, 0x0001,
-       0x037f, 0x0078, 0x53e0, 0x6003, 0x0009, 0x630a, 0x0078, 0x5412,
-       0x7014, 0xac36, 0x00c0, 0x53e6, 0x660c, 0x7616, 0x7010, 0xac36,
-       0x00c0, 0x53f4, 0x2c00, 0xaf36, 0x0040, 0x53f2, 0x2f00, 0x7012,
-       0x0078, 0x53f4, 0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06,
-       0x0040, 0x53fd, 0x7e0e, 0x0078, 0x53fe, 0x2678, 0x600f, 0x0000,
-       0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x5408, 0x1078, 0x6bb3,
-       0x1078, 0x6283, 0x1078, 0x5374, 0x88ff, 0x00c0, 0x5421, 0x0c7f,
-       0x0078, 0x5398, 0x2c78, 0x600c, 0x2060, 0x0078, 0x5398, 0xa006,
-       0x127f, 0x007f, 0x067f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f,
-       0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x5418,
-       0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e,
-       0x2091, 0x8000, 0x2071, 0x6f10, 0x7638, 0x2660, 0x2678, 0x8cff,
-       0x0040, 0x5493, 0x601c, 0xa086, 0x0006, 0x00c0, 0x548e, 0x88ff,
-       0x0040, 0x5448, 0x2800, 0xac06, 0x00c0, 0x548e, 0x0078, 0x544c,
-       0x6018, 0xa206, 0x00c0, 0x548e, 0x703c, 0xac06, 0x00c0, 0x545e,
-       0x037e, 0x2019, 0x0001, 0x1078, 0x51da, 0x7033, 0x0000, 0x703f,
-       0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x037f, 0x7038, 0xac36,
-       0x00c0, 0x5464, 0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5472,
-       0x2c00, 0xaf36, 0x0040, 0x5470, 0x2f00, 0x7036, 0x0078, 0x5472,
-       0x7037, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x547b,
-       0x7e0e, 0x0078, 0x547c, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
-       0x1078, 0x6120, 0x0040, 0x5486, 0x1078, 0x6bb3, 0x1078, 0x6283,
-       0x88ff, 0x00c0, 0x549d, 0x0c7f, 0x0078, 0x5437, 0x2c78, 0x600c,
-       0x2060, 0x0078, 0x5437, 0xa006, 0x127f, 0x007f, 0x027f, 0x067f,
-       0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f,
-       0xa8c5, 0x0001, 0x0078, 0x5494, 0x0e7e, 0x2071, 0x6f10, 0x2001,
-       0x6d00, 0x2004, 0xa086, 0x0002, 0x00c0, 0x54b2, 0x7007, 0x0005,
-       0x0078, 0x54b4, 0x7007, 0x0000, 0x0e7f, 0x007c, 0x0f7e, 0x0e7e,
-       0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
-       0x6f10, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x54f4,
-       0x2200, 0xac06, 0x00c0, 0x54ef, 0x7038, 0xac36, 0x00c0, 0x54d2,
-       0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x54e0, 0x2c00, 0xaf36,
-       0x0040, 0x54de, 0x2f00, 0x7036, 0x0078, 0x54e0, 0x7037, 0x0000,
-       0x660c, 0x2c00, 0xaf06, 0x0040, 0x54e8, 0x7e0e, 0x0078, 0x54e9,
-       0x2678, 0x600f, 0x0000, 0xa085, 0x0001, 0x0078, 0x54f4, 0x2c78,
-       0x600c, 0x2060, 0x0078, 0x54c5, 0x127f, 0x007f, 0x027f, 0x067f,
-       0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0x2061, 0x7400, 0x2a70, 0x7060,
-       0x7046, 0x704b, 0x7400, 0x007c, 0x0e7e, 0x127e, 0x2071, 0x6d00,
-       0x2091, 0x8000, 0x7544, 0xa582, 0x0001, 0x0048, 0x5536, 0x7048,
-       0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5522, 0xace0, 0x0008,
-       0x7054, 0xac02, 0x00c8, 0x551e, 0x0078, 0x5511, 0x2061, 0x7400,
-       0x0078, 0x5511, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x0008,
-       0x7054, 0xa502, 0x00c8, 0x5532, 0x754a, 0xa085, 0x0001, 0x127f,
-       0x0e7f, 0x007c, 0x704b, 0x7400, 0x0078, 0x552d, 0xa006, 0x0078,
-       0x552f, 0x0e7e, 0x2071, 0x6d00, 0x7544, 0xa582, 0x0001, 0x0048,
-       0x5567, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5554,
-       0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x5550, 0x0078, 0x5543,
-       0x2061, 0x7400, 0x0078, 0x5543, 0x6003, 0x0008, 0x8529, 0x7546,
-       0xaca8, 0x0008, 0x7054, 0xa502, 0x00c8, 0x5563, 0x754a, 0xa085,
-       0x0001, 0x0e7f, 0x007c, 0x704b, 0x7400, 0x0078, 0x555f, 0xa006,
-       0x0078, 0x5561, 0xac82, 0x7400, 0x1048, 0x12b7, 0x2001, 0x6d15,
-       0x2004, 0xac02, 0x10c8, 0x12b7, 0xa006, 0x6006, 0x600a, 0x600e,
+       0x58f8, 0x6020, 0xd0bc, 0x0040, 0x58f8, 0x2104, 0xa084, 0x000f,
+       0xa086, 0x0004, 0x00c0, 0x58f8, 0x00f0, 0x58cc, 0x027e, 0x6164,
+       0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, 0x00ff, 0xa10d, 0x6088,
+       0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, 0x0001, 0x6043, 0x0000,
+       0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x58f2, 0x027f,
+       0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, 0x0c7f,
+       0x127f, 0x007c, 0x0e7e, 0x2071, 0x7836, 0x7020, 0xa005, 0x0040,
+       0x590b, 0x8001, 0x7022, 0x0e7f, 0x007c, 0x20a9, 0x0008, 0x20a2,
+       0x00f0, 0x590f, 0x20a2, 0x20a2, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e,
+       0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071,
+       0x7836, 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0040,
+       0x59a5, 0x8cff, 0x0040, 0x59a5, 0x601c, 0xa086, 0x0006, 0x00c0,
+       0x59a0, 0x88ff, 0x0040, 0x593c, 0x2800, 0xac06, 0x00c0, 0x59a0,
+       0x2039, 0x0000, 0x0078, 0x5940, 0x6018, 0xa206, 0x00c0, 0x59a0,
+       0x7024, 0xac06, 0x00c0, 0x596e, 0x2069, 0x0100, 0x68c0, 0xa005,
+       0x0040, 0x5969, 0x6817, 0x0008, 0x68c3, 0x0000, 0x1078, 0x5a32,
+       0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000,
+       0x0040, 0x595e, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100,
+       0x6824, 0xd084, 0x0040, 0x5966, 0x6827, 0x0001, 0x037f, 0x0078,
+       0x596e, 0x6003, 0x0009, 0x630a, 0x0078, 0x59a0, 0x7014, 0xac36,
+       0x00c0, 0x5974, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x5982,
+       0x2c00, 0xaf36, 0x0040, 0x5980, 0x2f00, 0x7012, 0x0078, 0x5982,
+       0x7013, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x598b,
+       0x7e0e, 0x0078, 0x598c, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068,
+       0x1078, 0x693e, 0x0040, 0x5996, 0x1078, 0x74fd, 0x1078, 0x6aa1,
+       0x1078, 0x5902, 0x88ff, 0x00c0, 0x59af, 0x0c7f, 0x0078, 0x5926,
+       0x2c78, 0x600c, 0x2060, 0x0078, 0x5926, 0xa006, 0x127f, 0x007f,
+       0x067f, 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017,
+       0x0000, 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x59a6, 0x0f7e, 0x0e7e,
+       0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000,
+       0x2071, 0x7836, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5a21,
+       0x601c, 0xa086, 0x0006, 0x00c0, 0x5a1c, 0x88ff, 0x0040, 0x59d6,
+       0x2800, 0xac06, 0x00c0, 0x5a1c, 0x0078, 0x59da, 0x6018, 0xa206,
+       0x00c0, 0x5a1c, 0x703c, 0xac06, 0x00c0, 0x59ec, 0x037e, 0x2019,
+       0x0001, 0x1078, 0x5768, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043,
+       0x0000, 0x7047, 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x59f2,
+       0x660c, 0x763a, 0x7034, 0xac36, 0x00c0, 0x5a00, 0x2c00, 0xaf36,
+       0x0040, 0x59fe, 0x2f00, 0x7036, 0x0078, 0x5a00, 0x7037, 0x0000,
+       0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5a09, 0x7e0e, 0x0078,
+       0x5a0a, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x693e,
+       0x0040, 0x5a14, 0x1078, 0x74fd, 0x1078, 0x6aa1, 0x88ff, 0x00c0,
+       0x5a2b, 0x0c7f, 0x0078, 0x59c5, 0x2c78, 0x600c, 0x2060, 0x0078,
+       0x59c5, 0xa006, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f,
+       0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa8c5, 0x0001,
+       0x0078, 0x5a22, 0x0e7e, 0x2071, 0x7836, 0x2001, 0x7600, 0x2004,
+       0xa086, 0x0002, 0x00c0, 0x5a40, 0x7007, 0x0005, 0x0078, 0x5a42,
+       0x7007, 0x0000, 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e,
+       0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, 0x7836, 0x2c10,
+       0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5a82, 0x2200, 0xac06,
+       0x00c0, 0x5a7d, 0x7038, 0xac36, 0x00c0, 0x5a60, 0x660c, 0x763a,
+       0x7034, 0xac36, 0x00c0, 0x5a6e, 0x2c00, 0xaf36, 0x0040, 0x5a6c,
+       0x2f00, 0x7036, 0x0078, 0x5a6e, 0x7037, 0x0000, 0x660c, 0x2c00,
+       0xaf06, 0x0040, 0x5a76, 0x7e0e, 0x0078, 0x5a77, 0x2678, 0x600f,
+       0x0000, 0xa085, 0x0001, 0x0078, 0x5a82, 0x2c78, 0x600c, 0x2060,
+       0x0078, 0x5a53, 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f,
+       0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e,
+       0x127e, 0x2091, 0x8000, 0x2071, 0x7836, 0x760c, 0x2660, 0x2678,
+       0x8cff, 0x0040, 0x5b1b, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206,
+       0x00c0, 0x5b16, 0x7024, 0xac06, 0x00c0, 0x5ac9, 0x2069, 0x0100,
+       0x68c0, 0xa005, 0x0040, 0x5ac9, 0x1078, 0x5582, 0x68c3, 0x0000,
+       0x1078, 0x5a32, 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04,
+       0xa384, 0x1000, 0x0040, 0x5ac0, 0x6803, 0x0100, 0x6803, 0x0000,
+       0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x5ac8, 0x6827, 0x0001,
+       0x037f, 0x700c, 0xac36, 0x00c0, 0x5acf, 0x660c, 0x760e, 0x7008,
+       0xac36, 0x00c0, 0x5add, 0x2c00, 0xaf36, 0x0040, 0x5adb, 0x2f00,
+       0x700a, 0x0078, 0x5add, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00,
+       0xaf06, 0x0040, 0x5ae6, 0x7e0e, 0x0078, 0x5ae7, 0x2678, 0x600f,
+       0x0000, 0x1078, 0x6aba, 0x00c0, 0x5af1, 0x1078, 0x22dd, 0x0078,
+       0x5b0d, 0x1078, 0x6ace, 0x00c0, 0x5af9, 0x1078, 0x5e57, 0x0078,
+       0x5b0d, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x5b0d, 0x601c,
+       0xa086, 0x0003, 0x00c0, 0x5b23, 0x6837, 0x0103, 0x6b4a, 0x6847,
+       0x0000, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x6003, 0x0000, 0x1078,
+       0x6aa1, 0x1078, 0x5902, 0x0c7f, 0x0078, 0x5a98, 0x2c78, 0x600c,
+       0x2060, 0x0078, 0x5a98, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f,
+       0x0e7f, 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x5b04,
+       0x1078, 0x74fd, 0x0078, 0x5b0d, 0x037e, 0x157e, 0x137e, 0x147e,
+       0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x214f, 0x00c0,
+       0x5b3d, 0x8210, 0x8000, 0x0078, 0x5b34, 0xa005, 0x0040, 0x5b47,
+       0x20a9, 0x0020, 0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x147f,
+       0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078,
+       0x5053, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3,
+       0x0000, 0x20a3, 0x0000, 0x20a3, 0x514c, 0x20a3, 0x4f47, 0x20a3,
+       0x4943, 0x20a3, 0x2020, 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3,
+       0x0000, 0x20a3, 0x0000, 0x1078, 0x556e, 0x0d7f, 0x007c, 0x20a1,
+       0x020b, 0x1078, 0x5053, 0x20a3, 0x0210, 0x20a3, 0x0018, 0x20a3,
+       0x0800, 0x7810, 0xa084, 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3,
+       0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7810,
+       0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3,
+       0x0018, 0x1078, 0x556e, 0x007c, 0x2061, 0x7d00, 0x2a70, 0x7060,
+       0x7046, 0x704b, 0x7d00, 0x007c, 0x0e7e, 0x127e, 0x2071, 0x7600,
+       0x2091, 0x8000, 0x7544, 0xa582, 0x0001, 0x0048, 0x5bce, 0x7048,
+       0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5bba, 0xace0, 0x0008,
+       0x7054, 0xac02, 0x00c8, 0x5bb6, 0x0078, 0x5ba9, 0x2061, 0x7d00,
+       0x0078, 0x5ba9, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x0008,
+       0x7054, 0xa502, 0x00c8, 0x5bca, 0x754a, 0xa085, 0x0001, 0x127f,
+       0x0e7f, 0x007c, 0x704b, 0x7d00, 0x0078, 0x5bc5, 0xa006, 0x0078,
+       0x5bc7, 0x0e7e, 0x2071, 0x7600, 0x7544, 0xa582, 0x0001, 0x0048,
+       0x5bff, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, 0x5bec,
+       0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x5be8, 0x0078, 0x5bdb,
+       0x2061, 0x7d00, 0x0078, 0x5bdb, 0x6003, 0x0008, 0x8529, 0x7546,
+       0xaca8, 0x0008, 0x7054, 0xa502, 0x00c8, 0x5bfb, 0x754a, 0xa085,
+       0x0001, 0x0e7f, 0x007c, 0x704b, 0x7d00, 0x0078, 0x5bf7, 0xa006,
+       0x0078, 0x5bf9, 0xac82, 0x7d00, 0x1048, 0x12d5, 0x2001, 0x7615,
+       0x2004, 0xac02, 0x10c8, 0x12d5, 0xa006, 0x6006, 0x600a, 0x600e,
        0x6012, 0x6016, 0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x2061,
-       0x6d00, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0040, 0x5589,
-       0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x0078,
-       0x5588, 0x601c, 0xa084, 0x000f, 0x0079, 0x5596, 0x559f, 0x55a7,
-       0x55c3, 0x55df, 0x629a, 0x62b6, 0x62d2, 0x559f, 0x55a7, 0xa18e,
-       0x0047, 0x00c0, 0x55a6, 0xa016, 0x1078, 0x1532, 0x007c, 0x067e,
-       0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x55b1, 0x067f,
-       0x007c, 0x55c1, 0x5698, 0x5792, 0x55c1, 0x57d7, 0x55c1, 0x55c1,
-       0x55c1, 0x5653, 0x5a4d, 0x55c1, 0x55c1, 0x55c1, 0x55c1, 0x55c1,
-       0x55c1, 0x1078, 0x12b7, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
-       0x12b7, 0x1079, 0x55cd, 0x067f, 0x007c, 0x55dd, 0x55dd, 0x55dd,
-       0x55dd, 0x55dd, 0x55dd, 0x55dd, 0x55dd, 0x5e10, 0x5edd, 0x55dd,
-       0x5e29, 0x5e8f, 0x5e29, 0x5e8f, 0x55dd, 0x1078, 0x12b7, 0x067e,
-       0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x55e9, 0x067f,
-       0x007c, 0x55f9, 0x5a96, 0x5b05, 0x5bbb, 0x5cd2, 0x55f9, 0x55f9,
-       0x55f9, 0x5a75, 0x5dc6, 0x5dca, 0x55f9, 0x55f9, 0x55f9, 0x55f9,
-       0x5df0, 0x1078, 0x12b7, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0,
+       0x7600, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0040, 0x5c21,
+       0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x0078,
+       0x5c20, 0x601c, 0xa084, 0x000f, 0x0079, 0x5c2e, 0x5c37, 0x5c3f,
+       0x5c5b, 0x5c77, 0x6b4b, 0x6b67, 0x6b83, 0x5c37, 0x5c3f, 0xa18e,
+       0x0047, 0x00c0, 0x5c3e, 0xa016, 0x1078, 0x1572, 0x007c, 0x067e,
+       0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d5, 0x1079, 0x5c49, 0x067f,
+       0x007c, 0x5c59, 0x5d40, 0x5e72, 0x5c59, 0x5ec9, 0x5c59, 0x5c59,
+       0x5c59, 0x5cef, 0x6182, 0x5c59, 0x5c59, 0x5c59, 0x5c59, 0x5c59,
+       0x5c59, 0x1078, 0x12d5, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
+       0x12d5, 0x1079, 0x5c65, 0x067f, 0x007c, 0x5c75, 0x5c75, 0x5c75,
+       0x5c75, 0x5c75, 0x5c75, 0x5c75, 0x5c75, 0x65f2, 0x66b8, 0x5c75,
+       0x660b, 0x6664, 0x660b, 0x6664, 0x5c75, 0x1078, 0x12d5, 0x067e,
+       0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d5, 0x1079, 0x5c81, 0x067f,
+       0x007c, 0x5c91, 0x61c0, 0x6266, 0x6328, 0x647c, 0x5c91, 0x5c91,
+       0x5c91, 0x619e, 0x65a7, 0x65ab, 0x5c91, 0x5c91, 0x5c91, 0x5c91,
+       0x65d1, 0x1078, 0x12d5, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0,
        0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, 0x3318,
        0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, 0xa398,
-       0x0002, 0xa4a0, 0x0002, 0x00f0, 0x5609, 0x0e7e, 0x6010, 0x2070,
-       0x7007, 0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x556a, 0x007c,
-       0x0d7e, 0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x562d, 0x6018,
-       0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040,
-       0x5637, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078,
-       0x556a, 0x037f, 0x0d7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98,
-       0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x5650, 0x6018,
-       0x2068, 0x7038, 0x680a, 0x703c, 0x680e, 0x6800, 0xc08d, 0x6802,
-       0x0d7f, 0x0078, 0x5615, 0x2100, 0xa1b2, 0x0024, 0x10c8, 0x12b7,
-       0x0079, 0x565a, 0x5680, 0x568c, 0x5680, 0x5680, 0x5680, 0x5680,
-       0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e,
-       0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e,
-       0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e, 0x567e,
-       0x567e, 0x5680, 0x567e, 0x5680, 0x5680, 0x567e, 0x1078, 0x12b7,
-       0x6003, 0x0001, 0x6106, 0x1078, 0x4376, 0x127e, 0x2091, 0x8000,
-       0x1078, 0x476a, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
-       0x4376, 0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x007c,
-       0x6004, 0xa0b2, 0x0024, 0x10c8, 0x12b7, 0xa1b6, 0x0013, 0x00c0,
-       0x56a4, 0x2008, 0x0079, 0x5706, 0xa1b6, 0x0014, 0x00c0, 0x56fd,
-       0x1078, 0x4671, 0x6004, 0xa08e, 0x0000, 0x0040, 0x56fe, 0xa08e,
-       0x0002, 0x0040, 0x56c9, 0xa08e, 0x0003, 0x0040, 0x56c9, 0xa08e,
-       0x0004, 0x0040, 0x56c9, 0xa08e, 0x001f, 0x0040, 0x56fe, 0xa08e,
-       0x0021, 0x0040, 0x5702, 0xa08e, 0x0022, 0x0040, 0x56fe, 0x0078,
-       0x56f9, 0x1078, 0x206f, 0x2001, 0x0007, 0x1078, 0x33f3, 0x6018,
-       0xa080, 0x0028, 0x200c, 0x1078, 0x5778, 0xa186, 0x007e, 0x00c0,
-       0x56df, 0x2001, 0x6d2f, 0x2014, 0xa295, 0x0001, 0x2202, 0x017e,
-       0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078, 0x445c, 0x1078,
-       0x43a9, 0x0c7e, 0x6018, 0xa065, 0x0040, 0x56f0, 0x1078, 0x35cf,
-       0x0c7f, 0x2c08, 0x1078, 0x6a57, 0x037f, 0x027f, 0x017f, 0x1078,
-       0x342f, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x1078, 0x5778,
-       0x0078, 0x56f9, 0x1078, 0x5786, 0x0078, 0x56f9, 0x572c, 0x572e,
-       0x5732, 0x5736, 0x573a, 0x573e, 0x572a, 0x572a, 0x572a, 0x572a,
-       0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a,
-       0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a, 0x572a,
-       0x572a, 0x572a, 0x572a, 0x572a, 0x5742, 0x5748, 0x572a, 0x5752,
-       0x5748, 0x572a, 0x1078, 0x12b7, 0x0078, 0x5748, 0x2001, 0x000b,
-       0x0078, 0x575b, 0x2001, 0x0003, 0x0078, 0x575b, 0x2001, 0x0005,
-       0x0078, 0x575b, 0x2001, 0x0001, 0x0078, 0x575b, 0x2001, 0x0009,
-       0x0078, 0x575b, 0x1078, 0x12b7, 0x0078, 0x575a, 0x1078, 0x33f3,
-       0x1078, 0x4671, 0x6003, 0x0002, 0x6017, 0x0028, 0x1078, 0x476a,
-       0x0078, 0x575a, 0x1078, 0x4671, 0x6003, 0x0004, 0x6017, 0x0028,
-       0x1078, 0x476a, 0x007c, 0x1078, 0x33f3, 0x1078, 0x4671, 0x6003,
-       0x0002, 0x037e, 0x2019, 0x6d5c, 0x2304, 0xa084, 0xff00, 0x00c0,
-       0x576d, 0x2019, 0x0028, 0x0078, 0x5772, 0x8007, 0x8003, 0x801b,
-       0x831b, 0xa318, 0x6316, 0x037f, 0x1078, 0x476a, 0x0078, 0x575a,
-       0x0e7e, 0x6010, 0xa005, 0x0040, 0x5784, 0x2070, 0x7007, 0x0000,
+       0x0002, 0xa4a0, 0x0002, 0x00f0, 0x5ca1, 0x0e7e, 0x1078, 0x693e,
+       0x0040, 0x5cb8, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103,
+       0x0e7f, 0x1078, 0x5c02, 0x007c, 0x0d7e, 0x037e, 0x7330, 0xa386,
+       0x0200, 0x00c0, 0x5cc9, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817,
+       0xfffd, 0x6010, 0xa005, 0x0040, 0x5cd3, 0x2068, 0x6807, 0x0000,
+       0x6837, 0x0103, 0x6b32, 0x1078, 0x5c02, 0x037f, 0x0d7f, 0x007c,
+       0x0d7e, 0x20a9, 0x000e, 0x2e98, 0x6010, 0x20a0, 0x53a3, 0xa1b6,
+       0x0015, 0x00c0, 0x5cec, 0x6018, 0x2068, 0x7038, 0x680a, 0x703c,
+       0x680e, 0x6800, 0xc08d, 0x6802, 0x0d7f, 0x0078, 0x5cad, 0x2100,
+       0xa1b2, 0x0030, 0x10c8, 0x12d5, 0x0079, 0x5cf6, 0x5d28, 0x5d34,
+       0x5d28, 0x5d28, 0x5d28, 0x5d28, 0x5d26, 0x5d26, 0x5d26, 0x5d26,
+       0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26,
+       0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26,
+       0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d28, 0x5d26, 0x5d28,
+       0x5d28, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d28, 0x5d26,
+       0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x5d26, 0x1078, 0x12d5,
+       0x6003, 0x0001, 0x6106, 0x1078, 0x4872, 0x127e, 0x2091, 0x8000,
+       0x1078, 0x4c7a, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
+       0x4872, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x007c,
+       0x6004, 0xa0b2, 0x0030, 0x10c8, 0x12d5, 0xa1b6, 0x0013, 0x00c0,
+       0x5d4c, 0x2008, 0x0079, 0x5dd5, 0xa1b6, 0x0027, 0x00c0, 0x5da2,
+       0x1078, 0x4b81, 0x6004, 0x1078, 0x6aba, 0x0040, 0x5d65, 0x1078,
+       0x6ace, 0x0040, 0x5d9a, 0xa08e, 0x0021, 0x0040, 0x5d9e, 0xa08e,
+       0x0022, 0x0040, 0x5d9a, 0x0078, 0x5d95, 0x1078, 0x22dd, 0x2001,
+       0x0007, 0x1078, 0x37d1, 0x6018, 0xa080, 0x0028, 0x200c, 0x1078,
+       0x5e57, 0xa186, 0x007e, 0x00c0, 0x5d7b, 0x2001, 0x762f, 0x2014,
+       0xa295, 0x0001, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019,
+       0x0028, 0x1078, 0x4962, 0x1078, 0x48a5, 0x0c7e, 0x6018, 0xa065,
+       0x0040, 0x5d8c, 0x1078, 0x39a6, 0x0c7f, 0x2c08, 0x1078, 0x737b,
+       0x037f, 0x027f, 0x017f, 0x1078, 0x380d, 0x1078, 0x5c02, 0x1078,
+       0x4c7a, 0x007c, 0x1078, 0x5e57, 0x0078, 0x5d95, 0x1078, 0x5e66,
+       0x0078, 0x5d95, 0xa186, 0x0014, 0x00c0, 0x5d99, 0x1078, 0x4b81,
+       0x1078, 0x22bb, 0x1078, 0x6aba, 0x00c0, 0x5dc2, 0x1078, 0x22dd,
+       0x6018, 0xa080, 0x0028, 0x200c, 0x1078, 0x5e57, 0xa186, 0x007e,
+       0x00c0, 0x5dc0, 0x2001, 0x762f, 0x200c, 0xa18d, 0x0001, 0x2102,
+       0x0078, 0x5d95, 0x1078, 0x6ace, 0x00c0, 0x5dca, 0x1078, 0x5e57,
+       0x0078, 0x5d95, 0x6004, 0xa08e, 0x0021, 0x0040, 0x5dc6, 0xa08e,
+       0x0022, 0x1040, 0x5e66, 0x0078, 0x5d95, 0x5e07, 0x5e09, 0x5e0d,
+       0x5e11, 0x5e15, 0x5e19, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05,
+       0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05,
+       0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05,
+       0x5e05, 0x5e05, 0x5e05, 0x5e1d, 0x5e23, 0x5e05, 0x5e2d, 0x5e23,
+       0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e23, 0x5e23, 0x5e05,
+       0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x5e05, 0x1078, 0x12d5, 0x0078,
+       0x5e23, 0x2001, 0x000b, 0x0078, 0x5e36, 0x2001, 0x0003, 0x0078,
+       0x5e36, 0x2001, 0x0005, 0x0078, 0x5e36, 0x2001, 0x0001, 0x0078,
+       0x5e36, 0x2001, 0x0009, 0x0078, 0x5e36, 0x1078, 0x12d5, 0x0078,
+       0x5e35, 0x1078, 0x37d1, 0x1078, 0x4b81, 0x6003, 0x0002, 0x6017,
+       0x0028, 0x1078, 0x4c7a, 0x0078, 0x5e35, 0x1078, 0x4b81, 0x6003,
+       0x0004, 0x6017, 0x0028, 0x1078, 0x4c7a, 0x007c, 0x1078, 0x37d1,
+       0x1078, 0x4b81, 0x6003, 0x0002, 0x037e, 0x2019, 0x765c, 0x2304,
+       0xa084, 0xff00, 0x00c0, 0x5e48, 0x2019, 0x0028, 0x0078, 0x5e51,
+       0x8007, 0xa09a, 0x0004, 0x0048, 0x5e44, 0x8003, 0x801b, 0x831b,
+       0xa318, 0x6316, 0x037f, 0x1078, 0x4c7a, 0x0078, 0x5e35, 0x0e7e,
+       0x1078, 0x693e, 0x0040, 0x5e64, 0x6010, 0x2070, 0x7007, 0x0000,
        0x7037, 0x0103, 0x7033, 0x0100, 0x0e7f, 0x007c, 0x0e7e, 0xacf0,
        0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x7023, 0x8001,
        0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, 0x00ff,
-       0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12b7, 0x6604, 0xa6b6, 0x001f,
-       0x00c0, 0x57a6, 0x1078, 0x55fb, 0x0078, 0x57c6, 0x6604, 0xa6b6,
-       0x0000, 0x00c0, 0x57af, 0x1078, 0x563c, 0x0078, 0x57c6, 0x6604,
-       0xa6b6, 0x0022, 0x00c0, 0x57b8, 0x1078, 0x5620, 0x0078, 0x57c6,
-       0xa1b6, 0x0015, 0x00c0, 0x57c0, 0x1079, 0x57cb, 0x0078, 0x57c6,
-       0xa1b6, 0x0016, 0x00c0, 0x57c7, 0x1079, 0x58f6, 0x007c, 0x1078,
-       0x559f, 0x0078, 0x57c6, 0x57ef, 0x57f2, 0x57ef, 0x5833, 0x57ef,
-       0x5892, 0x57ef, 0x57ef, 0x57ef, 0x58ce, 0x57ef, 0x58e4, 0xa1b6,
-       0x0048, 0x0040, 0x57e3, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
-       0x1078, 0x1532, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000,
-       0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x556a, 0x007c, 0x0005,
-       0x0005, 0x007c, 0x0e7e, 0x2071, 0x6d00, 0x7078, 0xa086, 0x0074,
-       0x00c0, 0x581c, 0x1078, 0x6a2b, 0x00c0, 0x580e, 0x0d7e, 0x6018,
-       0x2068, 0x1078, 0x5820, 0x0d7f, 0x2001, 0x0006, 0x1078, 0x33f3,
-       0x1078, 0x206f, 0x1078, 0x556a, 0x0078, 0x581e, 0x2001, 0x000a,
-       0x1078, 0x33f3, 0x1078, 0x206f, 0x6003, 0x0001, 0x6007, 0x0001,
-       0x1078, 0x4376, 0x0078, 0x581e, 0x1078, 0x5889, 0x0e7f, 0x007c,
-       0x6800, 0xd084, 0x0040, 0x5832, 0x2001, 0x0000, 0x1078, 0x33df,
-       0x2069, 0x6d51, 0x6804, 0xd0a4, 0x0040, 0x5832, 0x2001, 0x0006,
-       0x1078, 0x3401, 0x007c, 0x0d7e, 0x2011, 0x6d1e, 0x2204, 0xa086,
-       0x0074, 0x00c0, 0x5885, 0x1078, 0x599f, 0x6018, 0x2068, 0xa080,
-       0x0028, 0x2014, 0xa286, 0x007e, 0x0040, 0x5850, 0xa286, 0x0080,
-       0x00c0, 0x5879, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x0078, 0x586f,
-       0x0e7e, 0x0f7e, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0x6d2f,
-       0x2e04, 0xa085, 0x0003, 0x2072, 0x2071, 0x7280, 0x2079, 0x0100,
-       0x2e04, 0xa084, 0x00ff, 0x2069, 0x6d19, 0x206a, 0x78e6, 0x8e70,
-       0x2e04, 0x2069, 0x6d1a, 0x206a, 0x78ea, 0x0f7f, 0x0e7f, 0x2001,
-       0x0006, 0x1078, 0x33f3, 0x1078, 0x206f, 0x1078, 0x556a, 0x0078,
-       0x5887, 0x2001, 0x0004, 0x1078, 0x33f3, 0x6003, 0x0001, 0x6007,
-       0x0003, 0x1078, 0x4376, 0x0078, 0x5887, 0x1078, 0x5889, 0x0d7f,
-       0x007c, 0x2001, 0x0007, 0x1078, 0x33f3, 0x1078, 0x206f, 0x1078,
-       0x556a, 0x007c, 0x0e7e, 0x2071, 0x6d00, 0x7078, 0xa086, 0x0014,
-       0x00c0, 0x58c8, 0x7000, 0xa086, 0x0003, 0x00c0, 0x58a5, 0x6010,
-       0xa005, 0x00c0, 0x58a5, 0x1078, 0x2ad1, 0x0d7e, 0x6018, 0x2068,
-       0x1078, 0x34ca, 0x1078, 0x5820, 0x0d7f, 0x1078, 0x59a9, 0x00c0,
-       0x58c8, 0x2001, 0x0006, 0x1078, 0x33f3, 0x0e7e, 0x6010, 0xa005,
-       0x0040, 0x58c1, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103, 0x7033,
-       0x0200, 0x0e7f, 0x1078, 0x206f, 0x1078, 0x556a, 0x0078, 0x58cc,
-       0x1078, 0x5778, 0x1078, 0x5889, 0x0e7f, 0x007c, 0x2011, 0x6d1e,
-       0x2204, 0xa086, 0x0014, 0x00c0, 0x58e1, 0x2001, 0x0002, 0x1078,
-       0x33f3, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x4376, 0x0078,
-       0x58e3, 0x1078, 0x5889, 0x007c, 0x2011, 0x6d1e, 0x2204, 0xa086,
-       0x0004, 0x00c0, 0x58f3, 0x2001, 0x0007, 0x1078, 0x33f3, 0x1078,
-       0x556a, 0x0078, 0x58f5, 0x1078, 0x5889, 0x007c, 0x57ef, 0x5902,
-       0x57ef, 0x5928, 0x57ef, 0x5952, 0x57ef, 0x57ef, 0x57ef, 0x5967,
-       0x57ef, 0x597a, 0x0c7e, 0x1078, 0x598d, 0x00c0, 0x5917, 0x2001,
-       0x0000, 0x1078, 0x33df, 0x2001, 0x0002, 0x1078, 0x33f3, 0x6003,
-       0x0001, 0x6007, 0x0002, 0x1078, 0x4376, 0x0078, 0x5926, 0x2009,
-       0x728f, 0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x00c0, 0x5924,
-       0x1078, 0x556a, 0x0078, 0x5926, 0x1078, 0x5889, 0x0c7f, 0x007c,
-       0x1078, 0x599c, 0x00c0, 0x593c, 0x2001, 0x0000, 0x1078, 0x33df,
-       0x2001, 0x0002, 0x1078, 0x33f3, 0x6003, 0x0001, 0x6007, 0x0002,
-       0x1078, 0x4376, 0x0078, 0x5951, 0x1078, 0x5778, 0x2009, 0x728f,
-       0x2104, 0xa084, 0xff00, 0xa086, 0x1900, 0x00c0, 0x594f, 0x2001,
-       0x0004, 0x1078, 0x33f3, 0x1078, 0x556a, 0x0078, 0x5951, 0x1078,
-       0x5889, 0x007c, 0x1078, 0x599c, 0x00c0, 0x5962, 0x2001, 0x0004,
-       0x1078, 0x33f3, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078, 0x4376,
-       0x0078, 0x5966, 0x1078, 0x5778, 0x1078, 0x5889, 0x007c, 0x1078,
-       0x599c, 0x00c0, 0x5977, 0x2001, 0x0008, 0x1078, 0x33f3, 0x6003,
-       0x0001, 0x6007, 0x0005, 0x1078, 0x4376, 0x0078, 0x5979, 0x1078,
-       0x5889, 0x007c, 0x1078, 0x599c, 0x00c0, 0x598a, 0x2001, 0x000a,
-       0x1078, 0x33f3, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x4376,
-       0x0078, 0x598c, 0x1078, 0x5889, 0x007c, 0x2009, 0x728e, 0x2104,
-       0xa086, 0x0003, 0x00c0, 0x599b, 0x2009, 0x728f, 0x2104, 0xa084,
-       0xff00, 0xa086, 0x2a00, 0x007c, 0xa085, 0x0001, 0x007c, 0x0c7e,
-       0x017e, 0xac88, 0x0006, 0x2164, 0x1078, 0x3459, 0x017f, 0x0c7f,
-       0x007c, 0x0e7e, 0x2071, 0x728c, 0x7004, 0xa086, 0x0014, 0x00c0,
-       0x59cc, 0x7008, 0xa086, 0x0800, 0x00c0, 0x59cc, 0x700c, 0xd0ec,
-       0x0040, 0x59ca, 0xa084, 0x0f00, 0xa086, 0x0100, 0x00c0, 0x59ca,
-       0x7024, 0xd0a4, 0x0040, 0x59ca, 0xd08c, 0x0040, 0x59ca, 0xa006,
-       0x0078, 0x59cc, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e,
-       0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e, 0x127e, 0x2091,
-       0x8000, 0x2029, 0x6f19, 0x252c, 0x2021, 0x6f1f, 0x2424, 0x2061,
-       0x7400, 0x2071, 0x6d00, 0x7244, 0x7060, 0xa202, 0x00c8, 0x5a23,
-       0x1078, 0x6c0f, 0x0040, 0x5a1b, 0x671c, 0xa786, 0x0001, 0x0040,
-       0x5a1b, 0xa786, 0x0007, 0x0040, 0x5a1b, 0x2500, 0xac06, 0x0040,
-       0x5a1b, 0x2400, 0xac06, 0x0040, 0x5a1b, 0x0c7e, 0x6010, 0x2068,
-       0x1078, 0x6120, 0x0040, 0x5a11, 0xa786, 0x0003, 0x00c0, 0x5a2d,
-       0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x36a1, 0x1078,
-       0x6276, 0x6000, 0xa086, 0x0004, 0x00c0, 0x5a18, 0x1078, 0x15f2,
-       0x1078, 0x6283, 0x0c7f, 0xace0, 0x0008, 0x7054, 0xac02, 0x00c8,
-       0x5a23, 0x0078, 0x59e3, 0x127f, 0x007f, 0x027f, 0x047f, 0x057f,
-       0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0,
-       0x5a08, 0x1078, 0x6bb3, 0x0078, 0x5a11, 0x220c, 0x2304, 0xa106,
-       0x00c0, 0x5a40, 0x8210, 0x8318, 0x00f0, 0x5a35, 0xa006, 0x007c,
-       0x2304, 0xa102, 0x0048, 0x5a48, 0x2001, 0x0001, 0x0078, 0x5a4a,
-       0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a, 0x0024,
-       0x10c8, 0x12b7, 0xa08e, 0x0000, 0x0040, 0x5a71, 0xa08e, 0x0002,
-       0x0040, 0x5a68, 0xa08e, 0x0003, 0x0040, 0x5a68, 0xa08e, 0x0004,
-       0x0040, 0x5a68, 0xa08e, 0x001f, 0x0040, 0x5a71, 0x0078, 0x5a6a,
-       0x1078, 0x206f, 0x1078, 0x4671, 0x1078, 0x556a, 0x1078, 0x476a,
-       0x007c, 0x1078, 0x5778, 0x0078, 0x5a6a, 0xa182, 0x0040, 0x0079,
-       0x5a79, 0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a88,
-       0x5a88, 0x5a88, 0x5a88, 0x5a88, 0x5a8a, 0x5a8a, 0x5a8a, 0x5a8a,
-       0x1078, 0x12b7, 0x6003, 0x0001, 0x6106, 0x1078, 0x4327, 0x127e,
-       0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x007c, 0xa186, 0x0013,
-       0x00c0, 0x5a9f, 0x6004, 0xa082, 0x0040, 0x0079, 0x5adf, 0xa186,
-       0x0014, 0x10c0, 0x12b7, 0x6004, 0xa082, 0x0040, 0x0079, 0x5aa8,
-       0x5ab9, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7, 0x5ab7,
-       0x5ab7, 0x5ab7, 0x5ab7, 0x5ad4, 0x5ad4, 0x5ad4, 0x5ad4, 0x1078,
-       0x12b7, 0x2001, 0x0007, 0x1078, 0x33f3, 0x1078, 0x4671, 0x0d7e,
-       0x6110, 0x2168, 0x1078, 0x6120, 0x0040, 0x5ace, 0x6837, 0x0103,
-       0x684b, 0x0028, 0x1078, 0x36a1, 0x1078, 0x6276, 0x0d7f, 0x1078,
-       0x556a, 0x1078, 0x476a, 0x007c, 0x2001, 0x0007, 0x1078, 0x33f3,
-       0x1078, 0x4671, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x5af0,
-       0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee, 0x5aee,
-       0x5aee, 0x5aee, 0x5afe, 0x5afe, 0x5afe, 0x5afe, 0x1078, 0x12b7,
-       0x1078, 0x4671, 0x6003, 0x0002, 0x1078, 0x476a, 0x6010, 0xa088,
-       0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c, 0x1078, 0x4671,
-       0x6003, 0x000f, 0x1078, 0x476a, 0x007c, 0xa182, 0x0040, 0x0079,
-       0x5b09, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b1a, 0x5b98,
-       0x5bb0, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18, 0x5b18,
-       0x1078, 0x12b7, 0x0e7e, 0x0d7e, 0x2071, 0x728c, 0x6110, 0x2168,
-       0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, 0x5b87, 0xa68c, 0x00ff,
-       0xa186, 0x0002, 0x0040, 0x5b4c, 0xa186, 0x0028, 0x00c0, 0x5b36,
-       0x1078, 0x628a, 0x684b, 0x001c, 0x0078, 0x5b4e, 0xd6dc, 0x0040,
-       0x5b41, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078,
-       0x5b4e, 0xd6d4, 0x0040, 0x5b4c, 0x684b, 0x0007, 0x7318, 0x6b62,
-       0x731c, 0x6b5e, 0x0078, 0x5b4e, 0x684b, 0x0000, 0x6837, 0x0103,
-       0x6e46, 0xa01e, 0xd6c4, 0x0040, 0x5b61, 0x7328, 0x732c, 0x6b56,
-       0x037e, 0x2308, 0x2019, 0x7298, 0xad90, 0x0019, 0x1078, 0x5f4c,
-       0x037f, 0xd6cc, 0x0040, 0x5b8c, 0x7124, 0x695a, 0xa192, 0x0021,
-       0x00c8, 0x5b75, 0x2071, 0x7298, 0x831c, 0x2300, 0xae18, 0xad90,
-       0x001d, 0x1078, 0x5f4c, 0x0078, 0x5b8c, 0x6838, 0xd0fc, 0x0040,
-       0x5b7e, 0x2009, 0x0020, 0x695a, 0x0078, 0x5b6a, 0x0f7e, 0x2d78,
-       0x1078, 0x5ee4, 0x0f7f, 0x1078, 0x5f39, 0x0078, 0x5b8e, 0x684b,
-       0x0000, 0x6837, 0x0103, 0x6e46, 0x1078, 0x36a1, 0x6218, 0x2268,
-       0x6a3c, 0x8211, 0x6a3e, 0x0d7f, 0x0e7f, 0x1078, 0x556a, 0x007c,
-       0x0f7e, 0x6003, 0x0003, 0x2079, 0x728c, 0x7c04, 0x7b00, 0x7e0c,
-       0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f,
-       0x2c10, 0x1078, 0x17de, 0x1078, 0x4395, 0x1078, 0x4821, 0x007c,
-       0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10,
-       0x1078, 0x1532, 0x007c, 0xa182, 0x0040, 0x0079, 0x5bbf, 0x5bce,
-       0x5bce, 0x5bce, 0x5bce, 0x5bce, 0x5bd0, 0x5c5e, 0x5bce, 0x5bce,
-       0x5c74, 0x5cb4, 0x5bce, 0x5bce, 0x5bce, 0x5bce, 0x1078, 0x12b7,
-       0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0x728c, 0x6110, 0x2178,
-       0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218,
-       0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x5c59, 0xa694,
-       0xff00, 0xa284, 0x0c00, 0x0040, 0x5bf1, 0x7018, 0x7862, 0x701c,
-       0x785e, 0xa284, 0x0300, 0x0040, 0x5c59, 0x1078, 0x130f, 0x1040,
-       0x12b7, 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103,
-       0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c,
-       0x00ff, 0xa186, 0x0002, 0x0040, 0x5c2b, 0xa186, 0x0028, 0x00c0,
-       0x5c15, 0x684b, 0x001c, 0x0078, 0x5c2d, 0xd6dc, 0x0040, 0x5c20,
-       0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x5c2d,
-       0xd6d4, 0x0040, 0x5c2b, 0x684b, 0x0007, 0x7318, 0x6b62, 0x731c,
-       0x6b5e, 0x0078, 0x5c2d, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852,
-       0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x5c42, 0x7328, 0x732c,
-       0x6b56, 0x037e, 0x2308, 0x2019, 0x7298, 0xad90, 0x0019, 0x1078,
-       0x5f4c, 0x037f, 0xd6cc, 0x0040, 0x5c59, 0x7124, 0x695a, 0xa192,
-       0x0021, 0x00c8, 0x5c56, 0x2071, 0x7298, 0x831c, 0x2300, 0xae18,
-       0xad90, 0x001d, 0x1078, 0x5f4c, 0x0078, 0x5c59, 0x2d78, 0x1078,
-       0x5ee4, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003,
-       0x0003, 0x2079, 0x728c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010,
-       0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078,
-       0x17de, 0x1078, 0x4fca, 0x007c, 0x0d7e, 0x6003, 0x0002, 0x1078,
-       0x4719, 0x1078, 0x4821, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040,
-       0x5cb2, 0xd1cc, 0x0040, 0x5c8d, 0x6948, 0x017e, 0x1078, 0x1338,
-       0x0d7f, 0x1078, 0x5f39, 0x0078, 0x5cb0, 0x6837, 0x0103, 0x6944,
-       0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x5cac, 0xa086, 0x0028,
-       0x00c0, 0x5c9e, 0x684b, 0x001c, 0x0078, 0x5cae, 0xd1dc, 0x0040,
-       0x5ca5, 0x684b, 0x0015, 0x0078, 0x5cae, 0xd1d4, 0x0040, 0x5cac,
-       0x684b, 0x0007, 0x0078, 0x5cae, 0x684b, 0x0000, 0x1078, 0x36a1,
-       0x1078, 0x556a, 0x0d7f, 0x007c, 0x2001, 0x0007, 0x1078, 0x33f3,
-       0x1078, 0x4719, 0x0f7e, 0x0d7e, 0x6110, 0x2178, 0x1078, 0x6120,
-       0x0040, 0x5ccb, 0x7837, 0x0103, 0x784b, 0x0028, 0x2f68, 0x1078,
-       0x36a1, 0x1078, 0x6276, 0x0d7f, 0x0f7f, 0x1078, 0x556a, 0x1078,
-       0x4821, 0x007c, 0xa182, 0x0040, 0x0079, 0x5cd6, 0x5ce5, 0x5ce5,
-       0x5ce5, 0x5ce5, 0x5ce5, 0x5ce7, 0x5ce5, 0x5d82, 0x5d8a, 0x5ce5,
-       0x5ce5, 0x5ce5, 0x5ce5, 0x5ce5, 0x5ce5, 0x1078, 0x12b7, 0x077e,
-       0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0x728c, 0x6110, 0x2178, 0x7614,
-       0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268,
-       0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x5d74, 0xa694, 0xff00,
-       0xa284, 0x0c00, 0x0040, 0x5d08, 0x7018, 0x7862, 0x701c, 0x785e,
-       0xa284, 0x0300, 0x0040, 0x5d71, 0x1078, 0x130f, 0x1040, 0x12b7,
-       0x2d00, 0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103,
-       0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c,
-       0x00ff, 0xa186, 0x0002, 0x0040, 0x5d43, 0xa186, 0x0028, 0x00c0,
-       0x5d2d, 0x684b, 0x001c, 0x0078, 0x5d45, 0xd6dc, 0x0040, 0x5d38,
-       0x684b, 0x0015, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x5d45,
-       0xd6d4, 0x0040, 0x5d43, 0x684b, 0x0007, 0x7318, 0x6b62, 0x731c,
-       0x6b5e, 0x0078, 0x5d45, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852,
-       0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x5d5a, 0x7328, 0x732c,
-       0x6b56, 0x037e, 0x2308, 0x2019, 0x7298, 0xad90, 0x0019, 0x1078,
-       0x5f4c, 0x037f, 0xd6cc, 0x0040, 0x5d71, 0x7124, 0x695a, 0xa192,
-       0x0021, 0x00c8, 0x5d6e, 0x2071, 0x7298, 0x831c, 0x2300, 0xae18,
-       0xad90, 0x001d, 0x1078, 0x5f4c, 0x0078, 0x5d71, 0x2d78, 0x1078,
-       0x5ee4, 0xd6dc, 0x00c0, 0x5d77, 0xa006, 0x0078, 0x5d7b, 0x2001,
-       0x0001, 0x7218, 0x731c, 0x1078, 0x156f, 0x0d7f, 0x0e7f, 0x0f7f,
-       0x077f, 0x007c, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
-       0x1532, 0x007c, 0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, 0x694c,
-       0xd1e4, 0x0040, 0x5dc4, 0xd1cc, 0x0040, 0x5d9f, 0x6948, 0x017e,
-       0x1078, 0x1338, 0x0d7f, 0x1078, 0x5f39, 0x0078, 0x5dc2, 0x6837,
-       0x0103, 0x6944, 0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x5dbe,
-       0xa086, 0x0028, 0x00c0, 0x5db0, 0x684b, 0x001c, 0x0078, 0x5dc0,
-       0xd1dc, 0x0040, 0x5db7, 0x684b, 0x0015, 0x0078, 0x5dc0, 0xd1d4,
-       0x0040, 0x5dbe, 0x684b, 0x0007, 0x0078, 0x5dc0, 0x684b, 0x0000,
-       0x1078, 0x36a1, 0x1078, 0x556a, 0x0d7f, 0x007c, 0x1078, 0x4671,
-       0x0078, 0x5dcc, 0x1078, 0x4719, 0x1078, 0x6120, 0x0040, 0x5de3,
-       0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0x6d0c, 0x210c,
-       0xd18c, 0x00c0, 0x5dec, 0xd184, 0x00c0, 0x5de8, 0x6108, 0x694a,
-       0x1078, 0x36a1, 0x0d7f, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c,
-       0x684b, 0x0004, 0x0078, 0x5de0, 0x684b, 0x0004, 0x0078, 0x5de0,
-       0xa182, 0x0040, 0x0079, 0x5df4, 0x5e03, 0x5e03, 0x5e03, 0x5e03,
-       0x5e03, 0x5e05, 0x5e03, 0x5e08, 0x5e03, 0x5e03, 0x5e03, 0x5e03,
-       0x5e03, 0x5e03, 0x5e03, 0x1078, 0x12b7, 0x1078, 0x556a, 0x007c,
-       0x007e, 0x027e, 0xa016, 0x1078, 0x1532, 0x027f, 0x007f, 0x007c,
-       0xa182, 0x0025, 0x0079, 0x5e14, 0x5e1d, 0x5e1b, 0x5e1b, 0x5e1b,
-       0x5e1b, 0x5e1b, 0x5e1b, 0x1078, 0x12b7, 0x6003, 0x0001, 0x6106,
-       0x1078, 0x4327, 0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f,
-       0x007c, 0xa186, 0x0013, 0x00c0, 0x5e33, 0x6004, 0xa082, 0x0025,
-       0x2008, 0x0079, 0x5e74, 0xa186, 0x0014, 0x00c0, 0x5e70, 0x1078,
-       0x4671, 0x2001, 0x0007, 0x1078, 0x33f3, 0x6018, 0xa080, 0x0028,
-       0x200c, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, 0x0028, 0x1078,
-       0x445c, 0x1078, 0x43a9, 0x0c7e, 0x6018, 0xa065, 0x0040, 0x5e52,
-       0x1078, 0x35cf, 0x0c7f, 0x2c08, 0x1078, 0x6a57, 0x037f, 0x027f,
-       0x017f, 0x1078, 0x342f, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6120,
-       0x0040, 0x5e6a, 0x6837, 0x0103, 0x684b, 0x0006, 0x1078, 0x36a1,
-       0x1078, 0x6276, 0x0d7f, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c,
-       0x1078, 0x559f, 0x0078, 0x5e6f, 0x5e7d, 0x5e7b, 0x5e7b, 0x5e7b,
-       0x5e7b, 0x5e7b, 0x5e86, 0x1078, 0x12b7, 0x1078, 0x4671, 0x6017,
-       0x0014, 0x6003, 0x000c, 0x1078, 0x476a, 0x007c, 0x1078, 0x4671,
-       0x6017, 0x0014, 0x6003, 0x000e, 0x1078, 0x476a, 0x007c, 0xa182,
-       0x002c, 0x00c8, 0x5e99, 0xa182, 0x0025, 0x0048, 0x5e99, 0x0079,
-       0x5e9c, 0x1078, 0x559f, 0x007c, 0x5ea3, 0x5ea3, 0x5ea3, 0x5ea3,
-       0x5ea5, 0x5ebf, 0x5ea3, 0x1078, 0x12b7, 0x0d7e, 0x1078, 0x6276,
-       0x6010, 0x2068, 0x6837, 0x0103, 0x6850, 0xa084, 0x0040, 0x0040,
-       0x5eb5, 0x684b, 0x0006, 0x0078, 0x5eb7, 0x684b, 0x0005, 0x6847,
-       0x0000, 0x1078, 0x36a1, 0x1078, 0x556a, 0x0d7f, 0x007c, 0x0d7e,
-       0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x5ed9, 0x6837, 0x0103,
-       0x6850, 0xa084, 0x0040, 0x0040, 0x5ed1, 0x684b, 0x0006, 0x0078,
-       0x5ed3, 0x684b, 0x0005, 0x6847, 0x0000, 0x1078, 0x36a1, 0x1078,
-       0x6276, 0x0d7f, 0x1078, 0x556a, 0x007c, 0x1078, 0x4671, 0x1078,
-       0x556a, 0x1078, 0x476a, 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e,
-       0x2029, 0x0001, 0xa182, 0x0101, 0x00c8, 0x5ef0, 0x0078, 0x5ef2,
-       0x2009, 0x0100, 0x2130, 0x2069, 0x7298, 0x831c, 0x2300, 0xad18,
-       0x2009, 0x0020, 0xaf90, 0x001d, 0x1078, 0x5f4c, 0xa6b2, 0x0020,
-       0x7804, 0xa06d, 0x0040, 0x5f06, 0x1078, 0x1338, 0x1078, 0x130f,
-       0x0040, 0x5f30, 0x8528, 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20,
-       0x7c06, 0xa68a, 0x003d, 0x00c8, 0x5f1c, 0x2608, 0xad90, 0x000f,
-       0x1078, 0x5f4c, 0x0078, 0x5f30, 0xa6b2, 0x003c, 0x2009, 0x003c,
-       0x2d78, 0xad90, 0x000f, 0x1078, 0x5f4c, 0x0078, 0x5f06, 0x0f7f,
-       0x852f, 0xa5ad, 0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x5f35,
-       0x0f7f, 0x852f, 0xa5ad, 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f,
-       0x007c, 0x0f7e, 0x8dff, 0x0040, 0x5f4a, 0x6804, 0xa07d, 0x0040,
-       0x5f48, 0x6807, 0x0000, 0x1078, 0x36a1, 0x2f68, 0x0078, 0x5f3d,
-       0x1078, 0x36a1, 0x0f7f, 0x007c, 0x157e, 0xa184, 0x0001, 0x0040,
-       0x5f52, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318,
-       0x8210, 0x00f0, 0x5f54, 0x157f, 0x007c, 0x127e, 0x2091, 0x8000,
-       0x601c, 0xa084, 0x000f, 0x1079, 0x5f67, 0x127f, 0x007c, 0x5f76,
-       0x5f6f, 0x5f71, 0x5f8d, 0x5f6f, 0x5f71, 0x5f71, 0x5f71, 0x1078,
-       0x12b7, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0x0d7e, 0x6010,
-       0x2068, 0x1078, 0x6120, 0x0040, 0x5f8a, 0xa00e, 0x2001, 0x0005,
-       0x1078, 0x372d, 0x1078, 0x36a1, 0x1078, 0x556a, 0xa085, 0x0001,
-       0x0d7f, 0x007c, 0xa006, 0x0078, 0x5f88, 0x6000, 0xa08a, 0x0010,
-       0x10c8, 0x12b7, 0x1079, 0x5f95, 0x007c, 0x5fa5, 0x5fc4, 0x5fa7,
-       0x5fd5, 0x5fc0, 0x5fa5, 0x5f71, 0x5f76, 0x5f76, 0x5f71, 0x5f71,
-       0x5f71, 0x5f71, 0x5f71, 0x5f71, 0x5f71, 0x1078, 0x12b7, 0x0d7e,
-       0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x5fb2, 0x6850, 0xa085,
-       0x0005, 0x6852, 0x0d7f, 0x6007, 0x0025, 0x6003, 0x000b, 0x601f,
-       0x0002, 0x1078, 0x4327, 0x1078, 0x476a, 0xa085, 0x0001, 0x007c,
-       0x1078, 0x15f2, 0x0078, 0x5fa7, 0x0e7e, 0x2071, 0x6f10, 0x7024,
-       0xac06, 0x00c0, 0x5fcd, 0x1078, 0x5148, 0x1078, 0x5083, 0x0e7f,
-       0x00c0, 0x5fa7, 0x1078, 0x5f71, 0x007c, 0x037e, 0x0e7e, 0x2071,
-       0x6f10, 0x703c, 0xac06, 0x00c0, 0x5fe1, 0x2019, 0x0000, 0x1078,
-       0x51da, 0x1078, 0x54b6, 0x0e7f, 0x037f, 0x00c0, 0x5fa7, 0x1078,
-       0x5f71, 0x007c, 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079, 0x5ff2,
-       0x0c7f, 0x007c, 0x5ffb, 0x605b, 0x60c8, 0x5fff, 0x5ffb, 0x5ffb,
-       0x5ffb, 0x556a, 0x605b, 0x007c, 0x6017, 0x0001, 0x007c, 0x6000,
-       0xa08a, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x6007, 0x007c, 0x6017,
-       0x6019, 0x603a, 0x604d, 0x604d, 0x6017, 0x5ffb, 0x5ffb, 0x5ffb,
-       0x604d, 0x604d, 0x6017, 0x6017, 0x6017, 0x6017, 0x6058, 0x1078,
-       0x12b7, 0x0e7e, 0x6010, 0x2070, 0x7050, 0xa085, 0x0040, 0x7052,
-       0x2071, 0x6f10, 0x7024, 0xac06, 0x0040, 0x6036, 0x1078, 0x5083,
-       0x6007, 0x0025, 0x6003, 0x000b, 0x601f, 0x0002, 0x6017, 0x0014,
-       0x1078, 0x4327, 0x1078, 0x476a, 0x0e7f, 0x007c, 0x6017, 0x0001,
-       0x0078, 0x6034, 0x0d7e, 0x6010, 0x2068, 0x6850, 0xa085, 0x0040,
-       0x6852, 0x0d7f, 0x6007, 0x0025, 0x6003, 0x000b, 0x601f, 0x0002,
-       0x1078, 0x4327, 0x1078, 0x476a, 0x007c, 0x0d7e, 0x6017, 0x0001,
-       0x6010, 0x2068, 0x6850, 0xa085, 0x0040, 0x6852, 0x0d7f, 0x007c,
-       0x1078, 0x556a, 0x007c, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12b7,
-       0x1079, 0x6063, 0x007c, 0x6073, 0x5ffc, 0x6075, 0x6073, 0x6075,
-       0x6073, 0x6073, 0x6073, 0x5ffb, 0x5ffb, 0x6073, 0x6073, 0x6073,
-       0x6073, 0x6073, 0x6073, 0x1078, 0x12b7, 0x0d7e, 0x6018, 0x2068,
-       0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa08a, 0x000c, 0x10c8, 0x12b7,
-       0x1079, 0x6083, 0x007c, 0x608f, 0x60b1, 0x608f, 0x60b1, 0x608f,
-       0x60b1, 0x6091, 0x609a, 0x608f, 0x60b1, 0x608f, 0x60aa, 0x1078,
-       0x12b7, 0x6004, 0xa08e, 0x0004, 0x0040, 0x60ac, 0xa08e, 0x0002,
-       0x0040, 0x60ac, 0xa08e, 0x0000, 0x0040, 0x60c0, 0xa08e, 0x001f,
-       0x0040, 0x60c0, 0xa08e, 0x0021, 0x0040, 0x60c4, 0xa08e, 0x0022,
-       0x0040, 0x60c0, 0x1078, 0x2051, 0x1078, 0x5778, 0x1078, 0x556a,
-       0x007c, 0x1078, 0x5778, 0x1078, 0x2051, 0x0e7e, 0x127e, 0x2091,
-       0x8000, 0x1078, 0x206f, 0x127f, 0x0e7f, 0x1078, 0x556a, 0x007c,
-       0x1078, 0x5778, 0x0078, 0x60ac, 0x1078, 0x5786, 0x0078, 0x60ac,
-       0x6000, 0xa08a, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x60d0, 0x007c,
-       0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0, 0x60e0,
-       0x60e0, 0x5ffb, 0x60e0, 0x5ffc, 0x60e2, 0x5ffc, 0x60eb, 0x60e0,
-       0x1078, 0x12b7, 0x6007, 0x002b, 0x6003, 0x000d, 0x1078, 0x4327,
-       0x1078, 0x476a, 0x007c, 0x1078, 0x6276, 0x1078, 0x6120, 0x0040,
-       0x6109, 0x1078, 0x2051, 0x0d7e, 0x6010, 0x2068, 0x6837, 0x0103,
-       0x684b, 0x0006, 0x1078, 0x36a1, 0x0d7f, 0x601f, 0x0001, 0x6007,
-       0x0001, 0x6003, 0x0001, 0x1078, 0x4376, 0x1078, 0x476a, 0x0078,
-       0x610b, 0x1078, 0x556a, 0x007c, 0xa284, 0x0007, 0x00c0, 0x611d,
-       0xa282, 0x7400, 0x0048, 0x611d, 0x2001, 0x6d15, 0x2004, 0xa202,
-       0x00c8, 0x611d, 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x611c,
-       0x027e, 0x0e7e, 0x2071, 0x6d00, 0x6210, 0x7058, 0xa202, 0x0048,
-       0x6132, 0x705c, 0xa202, 0x00c8, 0x6132, 0xa085, 0x0001, 0x0e7f,
-       0x027f, 0x007c, 0xa006, 0x0078, 0x612f, 0x0e7e, 0x0c7e, 0x037e,
-       0x007e, 0x127e, 0x2091, 0x8000, 0x2061, 0x7400, 0x2071, 0x6d00,
-       0x7344, 0x7060, 0xa302, 0x00c8, 0x6155, 0x601c, 0xa206, 0x00c0,
-       0x614d, 0x0c7e, 0x1078, 0x556a, 0x0c7f, 0xace0, 0x0008, 0x7054,
-       0xac02, 0x00c8, 0x6155, 0x0078, 0x6140, 0x127f, 0x007f, 0x037f,
-       0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0x127e, 0x2091,
-       0x8000, 0xa188, 0x6e00, 0x210c, 0x81ff, 0x0040, 0x6182, 0x2061,
-       0x7400, 0x2071, 0x6d00, 0x7344, 0x7060, 0xa302, 0x00c8, 0x6182,
-       0x6018, 0xa106, 0x00c0, 0x617c, 0x1078, 0x2051, 0x017e, 0x0c7e,
-       0x1078, 0x556a, 0x0c7f, 0x017f, 0xace0, 0x0008, 0x7054, 0xac02,
-       0x0048, 0x6170, 0x127f, 0x017f, 0x0c7f, 0x0e7f, 0x007c, 0x0c7e,
-       0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5504, 0x057f,
-       0x0040, 0x61a0, 0x6612, 0x651a, 0x601f, 0x0003, 0x2009, 0x004b,
-       0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
-       0xa006, 0x0078, 0x619c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000,
-       0x62a0, 0x0c7e, 0x1078, 0x5504, 0x057f, 0x0040, 0x61ca, 0x6013,
-       0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e, 0x2560, 0x1078, 0x35cf,
-       0x0c7f, 0x1078, 0x445c, 0x1078, 0x43a9, 0x2c08, 0x1078, 0x6a57,
-       0x2009, 0x004c, 0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x057f,
-       0x0c7f, 0x007c, 0xa006, 0x0078, 0x61c6, 0x0c7e, 0x057e, 0x127e,
-       0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x5504, 0x057f, 0x0040,
-       0x61f5, 0x6612, 0x651a, 0x601f, 0x0003, 0x2019, 0x0005, 0x0c7e,
-       0x2560, 0x1078, 0x35cf, 0x0c7f, 0x1078, 0x445c, 0x1078, 0x43a9,
-       0x2c08, 0x1078, 0x6a57, 0x2009, 0x004d, 0x1078, 0x5591, 0xa085,
-       0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x61f1,
-       0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078,
-       0x5504, 0x057f, 0x0040, 0x6220, 0x6612, 0x651a, 0x601f, 0x0003,
-       0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078, 0x35cf, 0x0c7f, 0x1078,
-       0x445c, 0x1078, 0x43a9, 0x2c08, 0x1078, 0x6a57, 0x2009, 0x004e,
-       0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
-       0xa006, 0x0078, 0x621c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e,
-       0x1078, 0x5504, 0x017f, 0x0040, 0x623c, 0x660a, 0x611a, 0x601f,
-       0x0001, 0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, 0x5591, 0xa085,
-       0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6239, 0x0c7e,
-       0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5504, 0x017f, 0x0040,
-       0x6258, 0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009,
-       0x0021, 0x1078, 0x5591, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c,
-       0xa006, 0x0078, 0x6255, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e,
-       0x1078, 0x5504, 0x017f, 0x0040, 0x6273, 0x611a, 0x601f, 0x0001,
-       0x2d00, 0x6012, 0x2009, 0x0000, 0x1078, 0x5591, 0xa085, 0x0001,
-       0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6270, 0x027e, 0x0d7e,
-       0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0040, 0x6280, 0x8211, 0x6a3e,
-       0x0d7f, 0x027f, 0x007c, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017,
-       0x0014, 0x007c, 0x067e, 0x0c7e, 0x2031, 0x6d52, 0x2634, 0xd6e4,
-       0x0040, 0x6297, 0x6618, 0x2660, 0x6e44, 0x1078, 0x3507, 0x0c7f,
-       0x067f, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7,
-       0x1079, 0x62a4, 0x067f, 0x007c, 0x62b4, 0x640b, 0x64d4, 0x62b4,
-       0x62b4, 0x62b4, 0x62b4, 0x62b4, 0x62ee, 0x6542, 0x62b4, 0x62b4,
-       0x62b4, 0x62b4, 0x62b4, 0x62b4, 0x1078, 0x12b7, 0x067e, 0x6000,
-       0xa0b2, 0x0010, 0x10c8, 0x12b7, 0x1079, 0x62c0, 0x067f, 0x007c,
-       0x62d0, 0x6837, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0,
-       0x6812, 0x687d, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0, 0x62d0,
-       0x1078, 0x12b7, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12b7,
-       0x1079, 0x62dc, 0x067f, 0x007c, 0x62ec, 0x668f, 0x66fb, 0x671c,
-       0x6769, 0x62ec, 0x62ec, 0x67be, 0x654e, 0x67fa, 0x67fe, 0x62ec,
-       0x62ec, 0x62ec, 0x62ec, 0x62ec, 0x1078, 0x12b7, 0xa1b2, 0x0024,
-       0x10c8, 0x12b7, 0x2100, 0x0079, 0x62f5, 0x6319, 0x63f5, 0x6319,
-       0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319,
-       0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319, 0x6319,
-       0x6319, 0x6319, 0x6319, 0x6319, 0x631b, 0x634a, 0x6354, 0x637c,
-       0x6382, 0x63b6, 0x63ee, 0x6319, 0x6319, 0x63fd, 0x6319, 0x6319,
-       0x6404, 0x1078, 0x12b7, 0x1078, 0x364d, 0x6618, 0x0c7e, 0x2660,
-       0x1078, 0x3459, 0x0c7f, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff,
-       0xa082, 0x0006, 0x0048, 0x633c, 0x1078, 0x6993, 0x00c0, 0x6376,
-       0x1078, 0x6931, 0x00c0, 0x6338, 0x6007, 0x0008, 0x0078, 0x63f0,
-       0x6007, 0x0009, 0x0078, 0x63f0, 0x1078, 0x6b02, 0x0040, 0x6346,
-       0x1078, 0x6993, 0x0040, 0x6330, 0x0078, 0x6376, 0x6013, 0x1900,
-       0x0078, 0x6338, 0x1078, 0x68b7, 0x6007, 0x0006, 0x0078, 0x63f0,
-       0x6007, 0x0007, 0x0078, 0x63f0, 0x0d7e, 0x6618, 0x2668, 0x6e04,
-       0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6366, 0xa686,
-       0x0004, 0x0040, 0x6366, 0x0d7f, 0x0078, 0x6376, 0x1078, 0x69f1,
-       0x00c0, 0x6371, 0x1078, 0x34ca, 0x6007, 0x000a, 0x0d7f, 0x0078,
-       0x63f0, 0x6007, 0x000b, 0x0d7f, 0x0078, 0x63f0, 0x1078, 0x2051,
-       0x6007, 0x0001, 0x0078, 0x63f0, 0x1078, 0x2051, 0x6007, 0x000c,
-       0x0078, 0x63f0, 0x1078, 0x364d, 0x6618, 0xa6b0, 0x0001, 0x2634,
-       0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x63a3, 0xa6b4, 0xff00,
-       0x8637, 0xa686, 0x0006, 0x00c0, 0x6376, 0x1078, 0x6a00, 0x00c0,
-       0x639d, 0x6007, 0x000e, 0x0078, 0x63f0, 0x1078, 0x2051, 0x6007,
-       0x000f, 0x0078, 0x63f0, 0x1078, 0x6b02, 0x0040, 0x63b0, 0xa6b4,
-       0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6395, 0x0078, 0x6376,
-       0x6013, 0x1900, 0x6007, 0x0009, 0x0078, 0x63f0, 0x1078, 0x364d,
-       0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006,
-       0x0048, 0x63db, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x00c0,
-       0x6376, 0x1078, 0x6a2b, 0x00c0, 0x63d5, 0x1078, 0x6931, 0x00c0,
-       0x63d5, 0x6007, 0x0010, 0x0078, 0x63f0, 0x1078, 0x2051, 0x6007,
-       0x0011, 0x0078, 0x63f0, 0x1078, 0x6b02, 0x0040, 0x63e8, 0xa6b4,
-       0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x63c9, 0x0078, 0x6376,
-       0x6013, 0x1900, 0x6007, 0x0009, 0x0078, 0x63f0, 0x6007, 0x0012,
-       0x6003, 0x0001, 0x1078, 0x4376, 0x007c, 0x6007, 0x0001, 0x6003,
-       0x0001, 0x1078, 0x4376, 0x0078, 0x63f4, 0x6007, 0x0020, 0x6003,
-       0x0001, 0x1078, 0x4376, 0x007c, 0x6007, 0x0023, 0x6003, 0x0001,
-       0x1078, 0x4376, 0x007c, 0x6004, 0xa0b2, 0x0024, 0x10c8, 0x12b7,
-       0xa1b6, 0x0013, 0x00c0, 0x6417, 0x2008, 0x0079, 0x6426, 0xa1b6,
-       0x0014, 0x10c0, 0x12b7, 0x2001, 0x0007, 0x1078, 0x3401, 0x1078,
-       0x4671, 0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0x644a, 0x644c,
-       0x644a, 0x644a, 0x644a, 0x644c, 0x6454, 0x64af, 0x6472, 0x64af,
-       0x6486, 0x64af, 0x6454, 0x64af, 0x64a7, 0x64af, 0x64a7, 0x64af,
-       0x64af, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a,
-       0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x644a, 0x64af, 0x644a,
-       0x644a, 0x64af, 0x1078, 0x12b7, 0x1078, 0x4671, 0x6003, 0x0002,
-       0x1078, 0x476a, 0x0078, 0x64b5, 0x0f7e, 0x2079, 0x6d51, 0x7804,
-       0x0f7f, 0xd0ac, 0x00c0, 0x64af, 0x2001, 0x0000, 0x1078, 0x33df,
-       0x2001, 0x0002, 0x1078, 0x33f3, 0x1078, 0x4671, 0x601f, 0x0001,
-       0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x4376, 0x1078, 0x476a,
-       0x0078, 0x64b5, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4,
-       0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x64af, 0xa686, 0x0004,
-       0x0040, 0x64af, 0x2001, 0x0004, 0x0078, 0x64ad, 0x2001, 0x6d00,
-       0x2004, 0xa086, 0x0003, 0x00c0, 0x648f, 0x1078, 0x2ad1, 0x2001,
-       0x0006, 0x1078, 0x64b6, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f,
-       0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x64af, 0x2001,
-       0x0006, 0x0078, 0x64ad, 0x2001, 0x0004, 0x0078, 0x64ad, 0x2001,
-       0x0006, 0x1078, 0x64b6, 0x0078, 0x64af, 0x1078, 0x3401, 0x1078,
-       0x4671, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x017e, 0x0d7e,
-       0x6118, 0x2168, 0x6900, 0xd184, 0x0040, 0x64d1, 0x6104, 0xa18e,
-       0x000a, 0x00c0, 0x64c9, 0x699c, 0xd1a4, 0x00c0, 0x64c9, 0x2001,
-       0x0007, 0x1078, 0x33f3, 0x2001, 0x0000, 0x1078, 0x33df, 0x1078,
-       0x206f, 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804,
-       0xa084, 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12b7,
-       0xa1b6, 0x0015, 0x00c0, 0x64e8, 0x1079, 0x64ef, 0x0078, 0x64ee,
-       0xa1b6, 0x0016, 0x10c0, 0x12b7, 0x1079, 0x6527, 0x007c, 0x57ef,
-       0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x64fb, 0x57ef,
-       0x57ef, 0x57ef, 0x57ef, 0x0f7e, 0x2079, 0x6d51, 0x7804, 0x0f7f,
-       0xd0ac, 0x00c0, 0x6517, 0x2001, 0x0000, 0x1078, 0x33df, 0x2001,
-       0x0002, 0x1078, 0x33f3, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007,
-       0x0002, 0x1078, 0x4376, 0x1078, 0x476a, 0x0078, 0x6526, 0x2011,
-       0x7283, 0x220c, 0x017e, 0x0c7e, 0x1078, 0x3447, 0x00c0, 0x6526,
-       0x1078, 0x3256, 0x0c7f, 0x017f, 0x1078, 0x556a, 0x007c, 0x57ef,
-       0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x57ef, 0x6533, 0x57ef,
-       0x57ef, 0x57ef, 0x57ef, 0x1078, 0x599c, 0x00c0, 0x653f, 0x6003,
-       0x0001, 0x6007, 0x0001, 0x1078, 0x4376, 0x0078, 0x6541, 0x1078,
-       0x556a, 0x007c, 0x6004, 0xa08a, 0x0024, 0x10c8, 0x12b7, 0x1078,
-       0x4671, 0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0xa182, 0x0040,
-       0x0079, 0x6552, 0x6561, 0x6561, 0x6561, 0x6561, 0x6563, 0x6561,
-       0x6561, 0x6561, 0x6561, 0x6561, 0x6561, 0x6561, 0x6561, 0x6561,
-       0x6561, 0x1078, 0x12b7, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e,
-       0x027e, 0x2071, 0x7280, 0x7444, 0xa4a4, 0xe600, 0x0040, 0x65d4,
-       0xa486, 0x2000, 0x0040, 0x6592, 0xa486, 0x0400, 0x0040, 0x6592,
-       0x7130, 0xa18c, 0x00ff, 0xa182, 0x0010, 0x00c8, 0x6663, 0x0c7e,
-       0x1078, 0x416d, 0x2c68, 0x0c7f, 0x6a00, 0xa284, 0x0001, 0x0040,
-       0x6644, 0x1078, 0x420a, 0x0040, 0x666f, 0xa295, 0x0200, 0x6a02,
-       0x0078, 0x6598, 0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x41f4,
-       0x1078, 0x130f, 0x1040, 0x12b7, 0x6003, 0x0007, 0x6106, 0x2d00,
-       0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00,
-       0x685e, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0xa18c, 0x00ff,
-       0xa10d, 0x6946, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x36a1,
-       0xa486, 0x2000, 0x00c0, 0x65c2, 0x2019, 0x0017, 0x1078, 0x6b8f,
-       0x0078, 0x6631, 0xa486, 0x0400, 0x00c0, 0x65cc, 0x2019, 0x0002,
-       0x1078, 0x6b8f, 0x0078, 0x6631, 0xa486, 0x0200, 0x00c0, 0x65d2,
-       0x1078, 0x6b80, 0x0078, 0x6631, 0x7130, 0xa18c, 0x00ff, 0xa182,
-       0x0010, 0x00c8, 0x6687, 0x0c7e, 0x1078, 0x416d, 0x2c68, 0x0c7f,
-       0x6a00, 0xa284, 0x0001, 0x0040, 0x668b, 0xa284, 0x0300, 0x00c0,
-       0x6683, 0x6804, 0xa005, 0x0040, 0x666f, 0x8001, 0x6806, 0x6003,
-       0x0007, 0x6106, 0x1078, 0x12f4, 0x0040, 0x6638, 0x6013, 0x0000,
-       0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x2c00, 0x684a,
-       0x6018, 0x2078, 0x78a0, 0x8007, 0xa10d, 0x6946, 0x6853, 0x003d,
-       0x7044, 0xa084, 0x0003, 0xa086, 0x0002, 0x00c0, 0x6613, 0x684f,
-       0x0040, 0x0078, 0x661d, 0xa086, 0x0001, 0x00c0, 0x661b, 0x684f,
-       0x0080, 0x0078, 0x661d, 0x684f, 0x0000, 0x20a9, 0x000a, 0x2001,
-       0x7290, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, 0x8000, 0x8210,
-       0x00f0, 0x6623, 0x200c, 0x6982, 0x8000, 0x200c, 0x697e, 0x1078,
-       0x36a1, 0x027f, 0x047f, 0x157f, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c,
-       0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4327,
-       0x1078, 0x476a, 0x0078, 0x6631, 0x2069, 0x7292, 0x2d04, 0xa084,
-       0xff00, 0xa086, 0x1200, 0x00c0, 0x6663, 0x2069, 0x7280, 0x686c,
-       0xa084, 0x00ff, 0x017e, 0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112,
-       0x017f, 0x6003, 0x0001, 0x6007, 0x0043, 0x1078, 0x4327, 0x1078,
-       0x476a, 0x0078, 0x6631, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007,
-       0x0041, 0x1078, 0x4327, 0x1078, 0x476a, 0x0078, 0x6631, 0xa284,
-       0x0004, 0x00c0, 0x6677, 0x6013, 0x0300, 0x0078, 0x6679, 0x6013,
-       0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4327, 0x1078,
-       0x476a, 0x0078, 0x6631, 0x6013, 0x0500, 0x0078, 0x6679, 0x6013,
-       0x0600, 0x0078, 0x6644, 0x6013, 0x0200, 0x0078, 0x6644, 0xa186,
-       0x0013, 0x00c0, 0x66a1, 0x6004, 0xa08a, 0x0040, 0x1048, 0x12b7,
-       0xa08a, 0x004f, 0x10c8, 0x12b7, 0xa082, 0x0040, 0x2008, 0x0079,
-       0x66cd, 0xa186, 0x0047, 0x00c0, 0x66a7, 0x0078, 0x66fb, 0xa186,
-       0x0014, 0x10c0, 0x12b7, 0x6004, 0xa082, 0x0040, 0x2008, 0x0079,
-       0x66b1, 0x66c0, 0x66c2, 0x66c2, 0x66c0, 0x66c0, 0x66c0, 0x66c0,
-       0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0, 0x66c0,
-       0x1078, 0x12b7, 0x2001, 0x0007, 0x1078, 0x3401, 0x1078, 0x4671,
-       0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0x66dc, 0x66ec, 0x66e5,
-       0x66f5, 0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x66dc,
-       0x66dc, 0x66dc, 0x66dc, 0x66dc, 0x1078, 0x12b7, 0x6010, 0xa088,
-       0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x4671, 0x6003,
-       0x0002, 0x1078, 0x476a, 0x007c, 0x1078, 0x4671, 0x1078, 0x41cd,
-       0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0x1078, 0x4671, 0x2009,
-       0x0041, 0x0078, 0x67be, 0xa182, 0x0040, 0x0079, 0x66ff, 0x670e,
-       0x6710, 0x670e, 0x670e, 0x670e, 0x670e, 0x670e, 0x6711, 0x670e,
-       0x670e, 0x670e, 0x670e, 0x670e, 0x670e, 0x670e, 0x1078, 0x12b7,
+       0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x12d5, 0x6604, 0xa6b6, 0x0028,
+       0x00c0, 0x5e86, 0x1078, 0x6b03, 0x0078, 0x5eb8, 0x6604, 0xa6b6,
+       0x0029, 0x00c0, 0x5e8f, 0x1078, 0x6b1d, 0x0078, 0x5eb8, 0x6604,
+       0xa6b6, 0x001f, 0x00c0, 0x5e98, 0x1078, 0x5c93, 0x0078, 0x5eb8,
+       0x6604, 0xa6b6, 0x0000, 0x00c0, 0x5ea1, 0x1078, 0x5cd8, 0x0078,
+       0x5eb8, 0x6604, 0xa6b6, 0x0022, 0x00c0, 0x5eaa, 0x1078, 0x5cbc,
+       0x0078, 0x5eb8, 0xa1b6, 0x0015, 0x00c0, 0x5eb2, 0x1079, 0x5ebd,
+       0x0078, 0x5eb8, 0xa1b6, 0x0016, 0x00c0, 0x5eb9, 0x1079, 0x5ffa,
+       0x007c, 0x1078, 0x5c37, 0x0078, 0x5eb8, 0x5ee1, 0x5ee4, 0x5ee1,
+       0x5f25, 0x5ee1, 0x5f96, 0x5ee1, 0x5ee1, 0x5ee1, 0x5fd2, 0x5ee1,
+       0x5fe8, 0xa1b6, 0x0048, 0x0040, 0x5ed5, 0x20e1, 0x0005, 0x3d18,
+       0x3e20, 0x2c10, 0x1078, 0x1572, 0x007c, 0x0e7e, 0xacf0, 0x0004,
+       0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x5c02,
+       0x007c, 0x0005, 0x0005, 0x007c, 0x0e7e, 0x2071, 0x7600, 0x7078,
+       0xa086, 0x0074, 0x00c0, 0x5f0e, 0x1078, 0x734f, 0x00c0, 0x5f00,
+       0x0d7e, 0x6018, 0x2068, 0x1078, 0x5f12, 0x0d7f, 0x2001, 0x0006,
+       0x1078, 0x37d1, 0x1078, 0x22dd, 0x1078, 0x5c02, 0x0078, 0x5f10,
+       0x2001, 0x000a, 0x1078, 0x37d1, 0x1078, 0x22dd, 0x6003, 0x0001,
+       0x6007, 0x0001, 0x1078, 0x4872, 0x0078, 0x5f10, 0x1078, 0x5f86,
+       0x0e7f, 0x007c, 0x6800, 0xd084, 0x0040, 0x5f24, 0x2001, 0x0000,
+       0x1078, 0x37bd, 0x2069, 0x7651, 0x6804, 0xd0a4, 0x0040, 0x5f24,
+       0x2001, 0x0006, 0x1078, 0x37df, 0x007c, 0x0d7e, 0x2011, 0x761e,
+       0x2204, 0xa086, 0x0074, 0x00c0, 0x5f82, 0x1078, 0x60d4, 0x6018,
+       0x2068, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x0040, 0x5f4d,
+       0xa286, 0x0080, 0x00c0, 0x5f76, 0x6813, 0x00ff, 0x6817, 0xfffc,
+       0x6010, 0xa005, 0x0040, 0x5f6c, 0x2068, 0x6807, 0x0000, 0x6837,
+       0x0103, 0x6833, 0x0200, 0x0078, 0x5f6c, 0x0e7e, 0x0f7e, 0x6813,
+       0x00ff, 0x6817, 0xfffe, 0x2071, 0x762f, 0x2e04, 0xa085, 0x0003,
+       0x2072, 0x2071, 0x7b80, 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff,
+       0x2069, 0x7619, 0x206a, 0x78e6, 0x8e70, 0x2e04, 0x2069, 0x761a,
+       0x206a, 0x78ea, 0x0f7f, 0x0e7f, 0x2001, 0x0006, 0x1078, 0x37d1,
+       0x1078, 0x22dd, 0x1078, 0x5c02, 0x0078, 0x5f84, 0x2001, 0x0004,
+       0x1078, 0x37d1, 0x6003, 0x0001, 0x6007, 0x0003, 0x1078, 0x4872,
+       0x0078, 0x5f84, 0x1078, 0x5f86, 0x0d7f, 0x007c, 0x2001, 0x7600,
+       0x2004, 0xa086, 0x0003, 0x0040, 0x5f91, 0x2001, 0x0007, 0x1078,
+       0x37d1, 0x1078, 0x22dd, 0x1078, 0x5c02, 0x007c, 0x0e7e, 0x2071,
+       0x7600, 0x7078, 0xa086, 0x0014, 0x00c0, 0x5fcc, 0x7000, 0xa086,
+       0x0003, 0x00c0, 0x5fa9, 0x6010, 0xa005, 0x00c0, 0x5fa9, 0x1078,
+       0x2dc8, 0x0d7e, 0x6018, 0x2068, 0x1078, 0x38a1, 0x1078, 0x5f12,
+       0x0d7f, 0x1078, 0x60de, 0x00c0, 0x5fcc, 0x2001, 0x0006, 0x1078,
+       0x37d1, 0x0e7e, 0x6010, 0xa005, 0x0040, 0x5fc5, 0x2070, 0x7007,
+       0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x0e7f, 0x1078, 0x22dd,
+       0x1078, 0x5c02, 0x0078, 0x5fd0, 0x1078, 0x5e57, 0x1078, 0x5f86,
+       0x0e7f, 0x007c, 0x2011, 0x761e, 0x2204, 0xa086, 0x0014, 0x00c0,
+       0x5fe5, 0x2001, 0x0002, 0x1078, 0x37d1, 0x6003, 0x0001, 0x6007,
+       0x0001, 0x1078, 0x4872, 0x0078, 0x5fe7, 0x1078, 0x5f86, 0x007c,
+       0x2011, 0x761e, 0x2204, 0xa086, 0x0004, 0x00c0, 0x5ff7, 0x2001,
+       0x0007, 0x1078, 0x37d1, 0x1078, 0x5c02, 0x0078, 0x5ff9, 0x1078,
+       0x5f86, 0x007c, 0x5ee1, 0x6006, 0x5ee1, 0x602c, 0x5ee1, 0x6087,
+       0x5ee1, 0x5ee1, 0x5ee1, 0x609c, 0x5ee1, 0x60af, 0x0c7e, 0x1078,
+       0x60c2, 0x00c0, 0x601b, 0x2001, 0x0000, 0x1078, 0x37bd, 0x2001,
+       0x0002, 0x1078, 0x37d1, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078,
+       0x4872, 0x0078, 0x602a, 0x2009, 0x7b8f, 0x2104, 0xa084, 0xff00,
+       0xa086, 0x1900, 0x00c0, 0x6028, 0x1078, 0x5c02, 0x0078, 0x602a,
+       0x1078, 0x5f86, 0x0c7f, 0x007c, 0x1078, 0x60d1, 0x00c0, 0x6040,
+       0x2001, 0x0000, 0x1078, 0x37bd, 0x2001, 0x0002, 0x1078, 0x37d1,
+       0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x4872, 0x0078, 0x6062,
+       0x1078, 0x5e57, 0x2009, 0x7b8e, 0x2134, 0xa6b4, 0x00ff, 0xa686,
+       0x0005, 0x0040, 0x6063, 0x2009, 0x7b8f, 0x2104, 0xa084, 0xff00,
+       0xa086, 0x1900, 0x00c0, 0x6060, 0xa686, 0x0009, 0x0040, 0x6063,
+       0x2001, 0x0004, 0x1078, 0x37d1, 0x1078, 0x5c02, 0x0078, 0x6062,
+       0x1078, 0x5f86, 0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x693e,
+       0x0040, 0x6071, 0x6838, 0xd0fc, 0x0040, 0x6071, 0x0d7f, 0x0078,
+       0x6060, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040,
+       0x6082, 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x0d7f,
+       0x0078, 0x6062, 0x1078, 0x22bb, 0x0d7f, 0x0078, 0x6060, 0x1078,
+       0x60d1, 0x00c0, 0x6097, 0x2001, 0x0004, 0x1078, 0x37d1, 0x6003,
+       0x0001, 0x6007, 0x0003, 0x1078, 0x4872, 0x0078, 0x609b, 0x1078,
+       0x5e57, 0x1078, 0x5f86, 0x007c, 0x1078, 0x60d1, 0x00c0, 0x60ac,
+       0x2001, 0x0008, 0x1078, 0x37d1, 0x6003, 0x0001, 0x6007, 0x0005,
+       0x1078, 0x4872, 0x0078, 0x60ae, 0x1078, 0x5f86, 0x007c, 0x1078,
+       0x60d1, 0x00c0, 0x60bf, 0x2001, 0x000a, 0x1078, 0x37d1, 0x6003,
+       0x0001, 0x6007, 0x0001, 0x1078, 0x4872, 0x0078, 0x60c1, 0x1078,
+       0x5f86, 0x007c, 0x2009, 0x7b8e, 0x2104, 0xa086, 0x0003, 0x00c0,
+       0x60d0, 0x2009, 0x7b8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00,
+       0x007c, 0xa085, 0x0001, 0x007c, 0x0c7e, 0x017e, 0xac88, 0x0006,
+       0x2164, 0x1078, 0x3837, 0x017f, 0x0c7f, 0x007c, 0x0e7e, 0x2071,
+       0x7b8c, 0x7004, 0xa086, 0x0014, 0x00c0, 0x6101, 0x7008, 0xa086,
+       0x0800, 0x00c0, 0x6101, 0x700c, 0xd0ec, 0x0040, 0x60ff, 0xa084,
+       0x0f00, 0xa086, 0x0100, 0x00c0, 0x60ff, 0x7024, 0xd0a4, 0x0040,
+       0x60ff, 0xd08c, 0x0040, 0x60ff, 0xa006, 0x0078, 0x6101, 0xa085,
+       0x0001, 0x0e7f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x057e,
+       0x047e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2029, 0x783f,
+       0x252c, 0x2021, 0x7845, 0x2424, 0x2061, 0x7d00, 0x2071, 0x7600,
+       0x7244, 0x7060, 0xa202, 0x00c8, 0x6158, 0x1078, 0x7559, 0x0040,
+       0x6150, 0x671c, 0xa786, 0x0001, 0x0040, 0x6150, 0xa786, 0x0007,
+       0x0040, 0x6150, 0x2500, 0xac06, 0x0040, 0x6150, 0x2400, 0xac06,
+       0x0040, 0x6150, 0x0c7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x613a,
+       0x1078, 0x1676, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x614d,
+       0xa786, 0x0003, 0x00c0, 0x6162, 0x6837, 0x0103, 0x6b4a, 0x6847,
+       0x0000, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x1078, 0x6aa1, 0x0c7f,
+       0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x6158, 0x0078, 0x6118,
+       0x127f, 0x007f, 0x027f, 0x047f, 0x057f, 0x077f, 0x0c7f, 0x0d7f,
+       0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0, 0x6144, 0x1078, 0x74fd,
+       0x0078, 0x614d, 0x220c, 0x2304, 0xa106, 0x00c0, 0x6175, 0x8210,
+       0x8318, 0x00f0, 0x616a, 0xa006, 0x007c, 0x2304, 0xa102, 0x0048,
+       0x617d, 0x2001, 0x0001, 0x0078, 0x617f, 0x2001, 0x0000, 0xa18d,
+       0x0001, 0x007c, 0x6004, 0xa08a, 0x0030, 0x10c8, 0x12d5, 0x1078,
+       0x6aba, 0x0040, 0x6191, 0x1078, 0x6ace, 0x0040, 0x619a, 0x0078,
+       0x6193, 0x1078, 0x22dd, 0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078,
+       0x4c7a, 0x007c, 0x1078, 0x5e57, 0x0078, 0x6193, 0xa182, 0x0040,
+       0x0079, 0x61a2, 0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b2,
+       0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b2, 0x61b4, 0x61b4, 0x61b4,
+       0x61b4, 0x61b2, 0x1078, 0x12d5, 0x6003, 0x0001, 0x6106, 0x1078,
+       0x4825, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x007c,
+       0xa186, 0x0013, 0x00c0, 0x61c9, 0x6004, 0xa082, 0x0040, 0x0079,
+       0x623f, 0xa186, 0x0027, 0x00c0, 0x61e6, 0x1078, 0x4b81, 0x1078,
+       0x22bb, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x693e, 0x0040, 0x61e0,
+       0x6837, 0x0103, 0x684b, 0x0029, 0x1078, 0x3a7a, 0x1078, 0x6a94,
+       0x0d7f, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0xa186, 0x0014,
+       0x00c0, 0x61ef, 0x6004, 0xa082, 0x0040, 0x0079, 0x620f, 0xa186,
+       0x0047, 0x10c0, 0x12d5, 0x2001, 0x0109, 0x2004, 0xd084, 0x0040,
+       0x620c, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x1078,
+       0x46e6, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, 0x0002,
+       0x00c0, 0x620c, 0x0078, 0x6266, 0x1078, 0x5c37, 0x007c, 0x6221,
+       0x621f, 0x621f, 0x621f, 0x621f, 0x621f, 0x621f, 0x621f, 0x621f,
+       0x621f, 0x621f, 0x6238, 0x6238, 0x6238, 0x6238, 0x621f, 0x1078,
+       0x12d5, 0x1078, 0x4b81, 0x0d7e, 0x6110, 0x2168, 0x1078, 0x693e,
+       0x0040, 0x6232, 0x6837, 0x0103, 0x684b, 0x0006, 0x1078, 0x3a7a,
+       0x1078, 0x6a94, 0x0d7f, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c,
+       0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0x6251,
+       0x624f, 0x624f, 0x624f, 0x624f, 0x624f, 0x624f, 0x624f, 0x624f,
+       0x624f, 0x624f, 0x625f, 0x625f, 0x625f, 0x625f, 0x624f, 0x1078,
+       0x12d5, 0x1078, 0x4b81, 0x6003, 0x0002, 0x1078, 0x4c7a, 0x6010,
+       0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c, 0x1078,
+       0x4b81, 0x6003, 0x000f, 0x1078, 0x4c7a, 0x007c, 0xa182, 0x0040,
+       0x0079, 0x626a, 0x627a, 0x627a, 0x627a, 0x627a, 0x627a, 0x627c,
+       0x6305, 0x631d, 0x627a, 0x627a, 0x627a, 0x627a, 0x627a, 0x627a,
+       0x627a, 0x627a, 0x1078, 0x12d5, 0x0e7e, 0x0d7e, 0x2071, 0x7b8c,
+       0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0040, 0x62e9,
+       0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x62ae, 0xa186, 0x0028,
+       0x00c0, 0x6298, 0x1078, 0x6aa8, 0x684b, 0x001c, 0x0078, 0x62b0,
+       0xd6dc, 0x0040, 0x62a3, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c,
+       0x6b5e, 0x0078, 0x62b0, 0xd6d4, 0x0040, 0x62ae, 0x684b, 0x0007,
+       0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x62b0, 0x684b, 0x0000,
+       0x6837, 0x0103, 0x6e46, 0xa01e, 0xd6c4, 0x0040, 0x62c3, 0x7328,
+       0x732c, 0x6b56, 0x037e, 0x2308, 0x2019, 0x7b98, 0xad90, 0x0019,
+       0x1078, 0x6727, 0x037f, 0xd6cc, 0x0040, 0x62f9, 0x7124, 0x695a,
+       0xa192, 0x0021, 0x00c8, 0x62d7, 0x2071, 0x7b98, 0x831c, 0x2300,
+       0xae18, 0xad90, 0x001d, 0x1078, 0x6727, 0x0078, 0x62f9, 0x6838,
+       0xd0fc, 0x0040, 0x62e0, 0x2009, 0x0020, 0x695a, 0x0078, 0x62cc,
+       0x0f7e, 0x2d78, 0x1078, 0x66bf, 0x0f7f, 0x1078, 0x6714, 0x0078,
+       0x62fb, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac,
+       0x0040, 0x62f9, 0x6810, 0x6914, 0xa115, 0x0040, 0x62f9, 0x1078,
+       0x646d, 0x1078, 0x3a7a, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e,
+       0x0d7f, 0x0e7f, 0x1078, 0x5c02, 0x007c, 0x0f7e, 0x6003, 0x0003,
+       0x2079, 0x7b8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078,
+       0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19cf,
+       0x1078, 0x4891, 0x1078, 0x4d3a, 0x007c, 0x6003, 0x0004, 0x6110,
+       0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1572, 0x007c,
+       0xa182, 0x0040, 0x0079, 0x632c, 0x633c, 0x633c, 0x633c, 0x633c,
+       0x633c, 0x633e, 0x63d5, 0x633c, 0x633c, 0x63eb, 0x644d, 0x633c,
+       0x633c, 0x633c, 0x633c, 0x6454, 0x1078, 0x12d5, 0x077e, 0x0f7e,
+       0x0e7e, 0x0d7e, 0x2071, 0x7b8c, 0x6110, 0x2178, 0x7614, 0xa6b4,
+       0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c,
+       0x8211, 0x6a3e, 0x86ff, 0x0040, 0x63d0, 0xa694, 0xff00, 0xa284,
+       0x0c00, 0x0040, 0x635f, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284,
+       0x0300, 0x0040, 0x63d0, 0x1078, 0x132f, 0x1040, 0x12d5, 0x2d00,
+       0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a,
+       0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186,
+       0x0002, 0x0040, 0x6399, 0xa186, 0x0028, 0x00c0, 0x6383, 0x684b,
+       0x001c, 0x0078, 0x639b, 0xd6dc, 0x0040, 0x638e, 0x684b, 0x0015,
+       0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x639b, 0xd6d4, 0x0040,
+       0x6399, 0x684b, 0x0007, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078,
+       0x639b, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856,
+       0xa01e, 0xd6c4, 0x0040, 0x63b0, 0x7328, 0x732c, 0x6b56, 0x037e,
+       0x2308, 0x2019, 0x7b98, 0xad90, 0x0019, 0x1078, 0x6727, 0x037f,
+       0xd6cc, 0x0040, 0x63d0, 0x7124, 0x695a, 0xa192, 0x0021, 0x00c8,
+       0x63c4, 0x2071, 0x7b98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d,
+       0x1078, 0x6727, 0x0078, 0x63d0, 0x7838, 0xd0fc, 0x0040, 0x63cd,
+       0x2009, 0x0020, 0x695a, 0x0078, 0x63b9, 0x2d78, 0x1078, 0x66bf,
+       0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003,
+       0x2079, 0x7b8c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078,
+       0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x19cf,
+       0x1078, 0x5567, 0x007c, 0x0d7e, 0x6003, 0x0002, 0x1078, 0x4c29,
+       0x1078, 0x4d3a, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x644b,
+       0xd1cc, 0x0040, 0x6426, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x641e,
+       0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198,
+       0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318,
+       0x8210, 0x00f0, 0x640d, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e,
+       0x017f, 0x2168, 0x1078, 0x1358, 0x0078, 0x6449, 0x017e, 0x1078,
+       0x1358, 0x0d7f, 0x1078, 0x6714, 0x0078, 0x6449, 0x6837, 0x0103,
+       0x6944, 0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x6445, 0xa086,
+       0x0028, 0x00c0, 0x6437, 0x684b, 0x001c, 0x0078, 0x6447, 0xd1dc,
+       0x0040, 0x643e, 0x684b, 0x0015, 0x0078, 0x6447, 0xd1d4, 0x0040,
+       0x6445, 0x684b, 0x0007, 0x0078, 0x6447, 0x684b, 0x0000, 0x1078,
+       0x3a7a, 0x1078, 0x5c02, 0x0d7f, 0x007c, 0x6003, 0x0002, 0x1078,
+       0x4c29, 0x1078, 0x4d3a, 0x007c, 0x1078, 0x4c29, 0x1078, 0x22bb,
+       0x0d7e, 0x6110, 0x2168, 0x1078, 0x693e, 0x0040, 0x6467, 0x6837,
+       0x0103, 0x684b, 0x0029, 0x1078, 0x3a7a, 0x1078, 0x6a94, 0x0d7f,
+       0x1078, 0x5c02, 0x1078, 0x4d3a, 0x007c, 0x684b, 0x0015, 0xd1fc,
+       0x0040, 0x6479, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189,
+       0x0000, 0x6962, 0x685e, 0x007c, 0xa182, 0x0040, 0x0079, 0x6480,
+       0x6490, 0x6490, 0x6490, 0x6490, 0x6490, 0x6492, 0x6490, 0x6536,
+       0x653e, 0x6490, 0x6490, 0x6490, 0x6490, 0x6490, 0x6490, 0x6490,
+       0x1078, 0x12d5, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0x7b8c,
+       0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5,
+       0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040,
+       0x6528, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x64b3, 0x7018,
+       0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x6525, 0x1078,
+       0x132f, 0x1040, 0x12d5, 0x2d00, 0x784a, 0x7f4c, 0xa7bd, 0x0200,
+       0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840,
+       0x6842, 0x6e46, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x64ee,
+       0xa186, 0x0028, 0x00c0, 0x64d8, 0x684b, 0x001c, 0x0078, 0x64f0,
+       0xd6dc, 0x0040, 0x64e3, 0x684b, 0x0015, 0x7318, 0x6b62, 0x731c,
+       0x6b5e, 0x0078, 0x64f0, 0xd6d4, 0x0040, 0x64ee, 0x684b, 0x0007,
+       0x7318, 0x6b62, 0x731c, 0x6b5e, 0x0078, 0x64f0, 0x684b, 0x0000,
+       0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040,
+       0x6505, 0x7328, 0x732c, 0x6b56, 0x037e, 0x2308, 0x2019, 0x7b98,
+       0xad90, 0x0019, 0x1078, 0x6727, 0x037f, 0xd6cc, 0x0040, 0x6525,
+       0x7124, 0x695a, 0xa192, 0x0021, 0x00c8, 0x6519, 0x2071, 0x7b98,
+       0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x6727, 0x0078,
+       0x6525, 0x7838, 0xd0fc, 0x0040, 0x6522, 0x2009, 0x0020, 0x695a,
+       0x0078, 0x650e, 0x2d78, 0x1078, 0x66bf, 0xd6dc, 0x00c0, 0x652b,
+       0xa006, 0x0078, 0x652f, 0x2001, 0x0001, 0x7218, 0x731c, 0x1078,
+       0x15b6, 0x0d7f, 0x0e7f, 0x0f7f, 0x077f, 0x007c, 0x20e1, 0x0005,
+       0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1572, 0x007c, 0x0d7e, 0x6003,
+       0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x65a5, 0xd1cc,
+       0x0040, 0x6575, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x656d, 0x017e,
+       0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198, 0x000d,
+       0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210,
+       0x00f0, 0x655c, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e, 0x017f,
+       0x2168, 0x1078, 0x1358, 0x0078, 0x65a3, 0x017e, 0x1078, 0x1358,
+       0x0d7f, 0x1078, 0x6714, 0x0078, 0x65a3, 0x6837, 0x0103, 0x6944,
+       0xa184, 0x00ff, 0xa186, 0x0002, 0x0040, 0x6594, 0xa086, 0x0028,
+       0x00c0, 0x6586, 0x684b, 0x001c, 0x0078, 0x65a1, 0xd1dc, 0x0040,
+       0x658d, 0x684b, 0x0015, 0x0078, 0x65a1, 0xd1d4, 0x0040, 0x6594,
+       0x684b, 0x0007, 0x0078, 0x65a1, 0x684b, 0x0000, 0x684c, 0xd0ac,
+       0x0040, 0x65a1, 0x6810, 0x6914, 0xa115, 0x0040, 0x65a1, 0x1078,
+       0x646d, 0x1078, 0x3a7a, 0x1078, 0x5c02, 0x0d7f, 0x007c, 0x1078,
+       0x4b81, 0x0078, 0x65ad, 0x1078, 0x4c29, 0x1078, 0x693e, 0x0040,
+       0x65c4, 0x0d7e, 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0x760c,
+       0x210c, 0xd18c, 0x00c0, 0x65cd, 0xd184, 0x00c0, 0x65c9, 0x6108,
+       0x694a, 0x1078, 0x3a7a, 0x0d7f, 0x1078, 0x5c02, 0x1078, 0x4c7a,
+       0x007c, 0x684b, 0x0004, 0x0078, 0x65c1, 0x684b, 0x0004, 0x0078,
+       0x65c1, 0xa182, 0x0040, 0x0079, 0x65d5, 0x65e5, 0x65e5, 0x65e5,
+       0x65e5, 0x65e5, 0x65e7, 0x65e5, 0x65ea, 0x65e5, 0x65e5, 0x65e5,
+       0x65e5, 0x65e5, 0x65e5, 0x65e5, 0x65e5, 0x1078, 0x12d5, 0x1078,
+       0x5c02, 0x007c, 0x007e, 0x027e, 0xa016, 0x1078, 0x1572, 0x027f,
+       0x007f, 0x007c, 0xa182, 0x0085, 0x0079, 0x65f6, 0x65ff, 0x65fd,
+       0x65fd, 0x65fd, 0x65fd, 0x65fd, 0x65fd, 0x1078, 0x12d5, 0x6003,
+       0x0001, 0x6106, 0x1078, 0x4825, 0x127e, 0x2091, 0x8000, 0x1078,
+       0x4c7a, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x6615, 0x6004,
+       0xa082, 0x0085, 0x2008, 0x0079, 0x6649, 0xa186, 0x0027, 0x00c0,
+       0x6636, 0x1078, 0x4b81, 0x1078, 0x22bb, 0x0d7e, 0x6010, 0x2068,
+       0x1078, 0x693e, 0x0040, 0x662c, 0x6837, 0x0103, 0x684b, 0x0029,
+       0x1078, 0x3a7a, 0x1078, 0x6a94, 0x0d7f, 0x1078, 0x5c02, 0x1078,
+       0x4c7a, 0x007c, 0x1078, 0x5c37, 0x0078, 0x6631, 0xa186, 0x0014,
+       0x00c0, 0x6632, 0x1078, 0x4b81, 0x0d7e, 0x6010, 0x2068, 0x1078,
+       0x693e, 0x0040, 0x662c, 0x6837, 0x0103, 0x684b, 0x0006, 0x0078,
+       0x6628, 0x6652, 0x6650, 0x6650, 0x6650, 0x6650, 0x6650, 0x665b,
+       0x1078, 0x12d5, 0x1078, 0x4b81, 0x6017, 0x0014, 0x6003, 0x000c,
+       0x1078, 0x4c7a, 0x007c, 0x1078, 0x4b81, 0x6017, 0x0014, 0x6003,
+       0x000e, 0x1078, 0x4c7a, 0x007c, 0xa182, 0x008c, 0x00c8, 0x666e,
+       0xa182, 0x0085, 0x0048, 0x666e, 0x0079, 0x6671, 0x1078, 0x5c37,
+       0x007c, 0x6678, 0x6678, 0x6678, 0x6678, 0x667a, 0x6699, 0x6678,
+       0x1078, 0x12d5, 0x0d7e, 0x1078, 0x6a94, 0x1078, 0x693e, 0x0040,
+       0x6695, 0x6010, 0x2068, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040,
+       0x668d, 0x684b, 0x0006, 0x0078, 0x6691, 0x684b, 0x0005, 0x1078,
+       0x6b47, 0x6847, 0x0000, 0x1078, 0x3a7a, 0x1078, 0x5c02, 0x0d7f,
+       0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x66b4,
+       0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x66aa, 0x684b, 0x0006,
+       0x0078, 0x66ae, 0x684b, 0x0005, 0x1078, 0x6b47, 0x6847, 0x0000,
+       0x1078, 0x3a7a, 0x1078, 0x6a94, 0x0d7f, 0x1078, 0x5c02, 0x007c,
+       0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0x057e,
+       0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, 0xa182, 0x0101, 0x00c8,
+       0x66cb, 0x0078, 0x66cd, 0x2009, 0x0100, 0x2130, 0x2069, 0x7b98,
+       0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, 0x001d, 0x1078,
+       0x6727, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0040, 0x66e1, 0x1078,
+       0x1358, 0x1078, 0x132f, 0x0040, 0x670b, 0x8528, 0x6837, 0x0110,
+       0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d, 0x00c8, 0x66f7,
+       0x2608, 0xad90, 0x000f, 0x1078, 0x6727, 0x0078, 0x670b, 0xa6b2,
+       0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, 0x000f, 0x1078, 0x6727,
+       0x0078, 0x66e1, 0x0f7f, 0x852f, 0xa5ad, 0x0003, 0x7d36, 0xa5ac,
+       0x0000, 0x0078, 0x6710, 0x0f7f, 0x852f, 0xa5ad, 0x0003, 0x7d36,
+       0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, 0x8dff, 0x0040, 0x6725,
+       0x6804, 0xa07d, 0x0040, 0x6723, 0x6807, 0x0000, 0x1078, 0x3a7a,
+       0x2f68, 0x0078, 0x6718, 0x1078, 0x3a7a, 0x0f7f, 0x007c, 0x157e,
+       0xa184, 0x0001, 0x0040, 0x672d, 0x8108, 0x810c, 0x21a8, 0x2304,
+       0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, 0x672f, 0x157f, 0x007c,
+       0x127e, 0x2091, 0x8000, 0x601c, 0xa084, 0x000f, 0x1079, 0x6742,
+       0x127f, 0x007c, 0x6751, 0x674a, 0x674c, 0x676a, 0x674a, 0x674c,
+       0x674c, 0x674c, 0x1078, 0x12d5, 0xa006, 0x007c, 0xa085, 0x0001,
+       0x007c, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040, 0x6767,
+       0xa00e, 0x2001, 0x0005, 0x1078, 0x3b0a, 0x1078, 0x6b47, 0x1078,
+       0x3a7a, 0x1078, 0x5c02, 0xa085, 0x0001, 0x0d7f, 0x007c, 0xa006,
+       0x0078, 0x6765, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12d5, 0x1079,
+       0x6772, 0x007c, 0x6782, 0x679f, 0x6784, 0x67b0, 0x679b, 0x6782,
+       0x674c, 0x6751, 0x6751, 0x674c, 0x674c, 0x674c, 0x674c, 0x674c,
+       0x674c, 0x674c, 0x1078, 0x12d5, 0x0d7e, 0x6010, 0x2068, 0x1078,
+       0x693e, 0x0040, 0x678d, 0x1078, 0x6b47, 0x0d7f, 0x6007, 0x0085,
+       0x6003, 0x000b, 0x601f, 0x0002, 0x1078, 0x4825, 0x1078, 0x4c7a,
+       0xa085, 0x0001, 0x007c, 0x1078, 0x1676, 0x0078, 0x6784, 0x0e7e,
+       0x2071, 0x7836, 0x7024, 0xac06, 0x00c0, 0x67a8, 0x1078, 0x56d6,
+       0x1078, 0x560b, 0x0e7f, 0x00c0, 0x6784, 0x1078, 0x674c, 0x007c,
+       0x037e, 0x0e7e, 0x2071, 0x7836, 0x703c, 0xac06, 0x00c0, 0x67c0,
+       0x2019, 0x0000, 0x1078, 0x5768, 0x0e7f, 0x037f, 0x0078, 0x6784,
+       0x1078, 0x5a44, 0x0e7f, 0x037f, 0x00c0, 0x6784, 0x1078, 0x674c,
+       0x007c, 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079, 0x67d1, 0x0c7f,
+       0x007c, 0x67e0, 0x683d, 0x68e2, 0x67e4, 0x67e0, 0x67e0, 0x71dd,
+       0x5c02, 0x683d, 0x1078, 0x6ace, 0x00c0, 0x67e0, 0x1078, 0x5e57,
+       0x007c, 0x6017, 0x0001, 0x007c, 0x6000, 0xa08a, 0x0010, 0x10c8,
+       0x12d5, 0x1079, 0x67ec, 0x007c, 0x67fc, 0x67fe, 0x681e, 0x6830,
+       0x6830, 0x67fc, 0x67e0, 0x67e0, 0x67e0, 0x6830, 0x6830, 0x67fc,
+       0x67fc, 0x67fc, 0x67fc, 0x683a, 0x1078, 0x12d5, 0x0e7e, 0x6010,
+       0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0x7836, 0x7024, 0xac06,
+       0x0040, 0x681a, 0x1078, 0x560b, 0x6007, 0x0085, 0x6003, 0x000b,
+       0x601f, 0x0002, 0x6017, 0x0014, 0x1078, 0x4825, 0x1078, 0x4c7a,
+       0x0e7f, 0x007c, 0x6017, 0x0001, 0x0078, 0x6818, 0x0d7e, 0x6010,
+       0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x6007, 0x0085, 0x6003,
+       0x000b, 0x601f, 0x0002, 0x1078, 0x4825, 0x1078, 0x4c7a, 0x007c,
+       0x0d7e, 0x6017, 0x0001, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852,
+       0x0d7f, 0x007c, 0x1078, 0x5c02, 0x007c, 0x6000, 0xa08a, 0x0010,
+       0x10c8, 0x12d5, 0x1079, 0x6845, 0x007c, 0x6855, 0x67e1, 0x6857,
+       0x6855, 0x6857, 0x6855, 0x6855, 0x6855, 0x67da, 0x67da, 0x6855,
+       0x6855, 0x6855, 0x6855, 0x6855, 0x6855, 0x1078, 0x12d5, 0x0d7e,
+       0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa08a, 0x000c,
+       0x10c8, 0x12d5, 0x1079, 0x6865, 0x007c, 0x6871, 0x6890, 0x6871,
+       0x6890, 0x6871, 0x6890, 0x6873, 0x687c, 0x6871, 0x6890, 0x6871,
+       0x6889, 0x1078, 0x12d5, 0x6004, 0xa08e, 0x0004, 0x0040, 0x688b,
+       0xa08e, 0x0002, 0x0040, 0x688b, 0x6004, 0x1078, 0x6ace, 0x0040,
+       0x68da, 0xa08e, 0x0021, 0x0040, 0x68de, 0xa08e, 0x0022, 0x0040,
+       0x68da, 0x1078, 0x22bb, 0x1078, 0x5e57, 0x1078, 0x5c02, 0x007c,
+       0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, 0x0040, 0x68ca, 0xa186,
+       0x0002, 0x00c0, 0x68b9, 0x6018, 0x2068, 0x68a0, 0xd0bc, 0x00c0,
+       0x68b9, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, 0x68b9, 0x8001,
+       0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x1078,
+       0x5b9c, 0x0040, 0x68b9, 0x2d00, 0x601a, 0x601f, 0x0001, 0x0078,
+       0x68ca, 0x0d7f, 0x0c7f, 0x1078, 0x5e57, 0x1078, 0x22bb, 0x0e7e,
+       0x127e, 0x2091, 0x8000, 0x1078, 0x22dd, 0x127f, 0x0e7f, 0x1078,
+       0x5c02, 0x007c, 0x2001, 0x0002, 0x1078, 0x37d1, 0x6003, 0x0001,
+       0x6007, 0x0002, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0d7f, 0x0c7f,
+       0x0078, 0x68c9, 0x1078, 0x5e57, 0x0078, 0x688d, 0x1078, 0x5e66,
+       0x0078, 0x688d, 0x6000, 0xa08a, 0x0010, 0x10c8, 0x12d5, 0x1079,
+       0x68ea, 0x007c, 0x68fa, 0x68fa, 0x68fa, 0x68fa, 0x68fa, 0x68fa,
+       0x68fa, 0x68fa, 0x68fa, 0x67e0, 0x68fa, 0x67e1, 0x68fc, 0x67e1,
+       0x6905, 0x68fa, 0x1078, 0x12d5, 0x6007, 0x008b, 0x6003, 0x000d,
+       0x1078, 0x4825, 0x1078, 0x4c7a, 0x007c, 0x1078, 0x6a94, 0x1078,
+       0x693e, 0x0040, 0x6927, 0x1078, 0x22bb, 0x0d7e, 0x1078, 0x693e,
+       0x0040, 0x691a, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006,
+       0x1078, 0x3a7a, 0x0d7f, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003,
+       0x0001, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0078, 0x6929, 0x1078,
+       0x5c02, 0x007c, 0xa284, 0x0007, 0x00c0, 0x693b, 0xa282, 0x7d00,
+       0x0048, 0x693b, 0x2001, 0x7615, 0x2004, 0xa202, 0x00c8, 0x693b,
+       0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x693a, 0x027e, 0x0e7e,
+       0x2071, 0x7600, 0x6210, 0x7058, 0xa202, 0x0048, 0x6950, 0x705c,
+       0xa202, 0x00c8, 0x6950, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c,
+       0xa006, 0x0078, 0x694d, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e,
+       0x2091, 0x8000, 0x2061, 0x7d00, 0x2071, 0x7600, 0x7344, 0x7060,
+       0xa302, 0x00c8, 0x6979, 0x601c, 0xa206, 0x00c0, 0x6971, 0x1078,
+       0x6ace, 0x00c0, 0x696d, 0x1078, 0x5e57, 0x0c7e, 0x1078, 0x5c02,
+       0x0c7f, 0xace0, 0x0008, 0x7054, 0xac02, 0x00c8, 0x6979, 0x0078,
+       0x695e, 0x127f, 0x007f, 0x037f, 0x0c7f, 0x0e7f, 0x007c, 0x0e7e,
+       0x0c7e, 0x017e, 0xa188, 0x7720, 0x210c, 0x81ff, 0x0040, 0x699c,
+       0x2061, 0x7d00, 0x2071, 0x7600, 0x7344, 0x7060, 0xa302, 0x00c8,
+       0x699c, 0x017e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x699f, 0x611a,
+       0x1078, 0x22bb, 0x1078, 0x5c02, 0xa006, 0x0078, 0x69a1, 0xa085,
+       0x0001, 0x017f, 0x0c7f, 0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e,
+       0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c, 0x057f, 0x0040, 0x69be,
+       0x6612, 0x651a, 0x601f, 0x0003, 0x2009, 0x004b, 0x1078, 0x5c29,
+       0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078,
+       0x69ba, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e,
+       0x1078, 0x5b9c, 0x057f, 0x0040, 0x69e8, 0x6013, 0x0000, 0x651a,
+       0x601f, 0x0003, 0x0c7e, 0x2560, 0x1078, 0x39a6, 0x0c7f, 0x1078,
+       0x4962, 0x1078, 0x48a5, 0x2c08, 0x1078, 0x737b, 0x2009, 0x004c,
+       0x1078, 0x5c29, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c,
+       0xa006, 0x0078, 0x69e4, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000,
+       0x62a0, 0x0c7e, 0x1078, 0x5b9c, 0x057f, 0x0040, 0x6a13, 0x6612,
+       0x651a, 0x601f, 0x0003, 0x2019, 0x0005, 0x0c7e, 0x2560, 0x1078,
+       0x39a6, 0x0c7f, 0x1078, 0x4962, 0x1078, 0x48a5, 0x2c08, 0x1078,
+       0x737b, 0x2009, 0x004d, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f,
+       0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x6a0f, 0x0c7e, 0x057e,
+       0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x5b9c, 0x057f,
+       0x0040, 0x6a3e, 0x6612, 0x651a, 0x601f, 0x0003, 0x2019, 0x0005,
+       0x0c7e, 0x2560, 0x1078, 0x39a6, 0x0c7f, 0x1078, 0x4962, 0x1078,
+       0x48a5, 0x2c08, 0x1078, 0x737b, 0x2009, 0x004e, 0x1078, 0x5c29,
+       0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078,
+       0x6a3a, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c,
+       0x017f, 0x0040, 0x6a5a, 0x660a, 0x611a, 0x601f, 0x0001, 0x2d00,
+       0x6012, 0x2009, 0x001f, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f,
+       0x0c7f, 0x007c, 0xa006, 0x0078, 0x6a57, 0x0c7e, 0x127e, 0x2091,
+       0x8000, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x6a76, 0x660a,
+       0x611a, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x1078,
+       0x5c29, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078,
+       0x6a73, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c,
+       0x017f, 0x0040, 0x6a91, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012,
+       0x2009, 0x0000, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f, 0x0c7f,
+       0x007c, 0xa006, 0x0078, 0x6a8e, 0x027e, 0x0d7e, 0x6218, 0x2268,
+       0x6a3c, 0x82ff, 0x0040, 0x6a9e, 0x8211, 0x6a3e, 0x0d7f, 0x027f,
+       0x007c, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0014, 0x007c,
+       0x067e, 0x0c7e, 0x0d7e, 0x2031, 0x7652, 0x2634, 0xd6e4, 0x0040,
+       0x6ab6, 0x6618, 0x2660, 0x6e44, 0x1078, 0x38de, 0x0d7f, 0x0c7f,
+       0x067f, 0x007c, 0x007e, 0x017e, 0x6004, 0xa08e, 0x0002, 0x0040,
+       0x6acb, 0xa08e, 0x0003, 0x0040, 0x6acb, 0xa08e, 0x0004, 0x0040,
+       0x6acb, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c, 0x007e, 0x017e,
+       0x6004, 0xa08e, 0x0000, 0x0040, 0x6ae3, 0xa08e, 0x001f, 0x0040,
+       0x6ae3, 0xa08e, 0x0028, 0x0040, 0x6ae3, 0xa08e, 0x0029, 0x0040,
+       0x6ae3, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c, 0x0c7e, 0x127e,
+       0x2091, 0x8000, 0x0c7e, 0x1078, 0x5b9c, 0x017f, 0x0040, 0x6b00,
+       0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x1078, 0x22bb, 0x2009,
+       0x0028, 0x1078, 0x5c29, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c,
+       0xa006, 0x0078, 0x6afd, 0xa186, 0x0015, 0x00c0, 0x6b18, 0x2011,
+       0x761e, 0x2204, 0xa086, 0x0074, 0x00c0, 0x6b18, 0x1078, 0x60d4,
+       0x6003, 0x0001, 0x6007, 0x0029, 0x1078, 0x4872, 0x0078, 0x6b1c,
+       0x1078, 0x5e57, 0x1078, 0x5c02, 0x007c, 0xa186, 0x0015, 0x00c0,
+       0x6b3a, 0x2011, 0x761e, 0x2204, 0xa086, 0x0014, 0x00c0, 0x6b3a,
+       0x0d7e, 0x6018, 0x2068, 0x1078, 0x38a1, 0x0d7f, 0x1078, 0x60de,
+       0x00c0, 0x6b3a, 0x2001, 0x0006, 0x1078, 0x37d1, 0x1078, 0x5cad,
+       0x0078, 0x6b3e, 0x1078, 0x5e57, 0x1078, 0x5c02, 0x007c, 0x6848,
+       0xa086, 0x0005, 0x00c0, 0x6b46, 0x1078, 0x6b47, 0x007c, 0x6850,
+       0xc0ad, 0x6852, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
+       0x12d5, 0x1079, 0x6b55, 0x067f, 0x007c, 0x6b65, 0x6d3c, 0x6e1d,
+       0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x6b9f, 0x6e8b, 0x6b65,
+       0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x6b65, 0x1078, 0x12d5, 0x067e,
+       0x6000, 0xa0b2, 0x0010, 0x10c8, 0x12d5, 0x1079, 0x6b71, 0x067f,
+       0x007c, 0x6b81, 0x718c, 0x6b81, 0x6b81, 0x6b81, 0x6b81, 0x6b81,
+       0x6b81, 0x7167, 0x71d6, 0x6b81, 0x6b81, 0x6b81, 0x6b81, 0x6b81,
+       0x6b81, 0x1078, 0x12d5, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8,
+       0x12d5, 0x1079, 0x6b8d, 0x067f, 0x007c, 0x6b9d, 0x6fd8, 0x704a,
+       0x706c, 0x70b8, 0x6b9d, 0x6b9d, 0x7112, 0x6e97, 0x714f, 0x7153,
+       0x6b9d, 0x6b9d, 0x6b9d, 0x6b9d, 0x6b9d, 0x1078, 0x12d5, 0xa1b2,
+       0x0030, 0x10c8, 0x12d5, 0x2100, 0x0079, 0x6ba6, 0x6bd6, 0x6cb3,
+       0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6,
+       0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6,
+       0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd8, 0x6c07, 0x6c12,
+       0x6c3a, 0x6c40, 0x6c74, 0x6cac, 0x6bd6, 0x6bd6, 0x6cbb, 0x6bd6,
+       0x6bd6, 0x6cc2, 0x6cc9, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6, 0x6bd6,
+       0x6ce6, 0x6bd6, 0x6bd6, 0x6cf1, 0x6bd6, 0x6bd6, 0x1078, 0x12d5,
+       0x1078, 0x3a26, 0x6618, 0x0c7e, 0x2660, 0x1078, 0x3837, 0x0c7f,
+       0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048,
+       0x6bf9, 0x1078, 0x72b7, 0x00c0, 0x6c34, 0x1078, 0x7255, 0x00c0,
+       0x6bf5, 0x6007, 0x0008, 0x0078, 0x6cae, 0x6007, 0x0009, 0x0078,
+       0x6cae, 0x1078, 0x744c, 0x0040, 0x6c03, 0x1078, 0x72b7, 0x0040,
+       0x6bed, 0x0078, 0x6c34, 0x6013, 0x1900, 0x0078, 0x6bf5, 0x6106,
+       0x1078, 0x7217, 0x6007, 0x0006, 0x0078, 0x6cae, 0x6007, 0x0007,
+       0x0078, 0x6cae, 0x0d7e, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00,
+       0x8637, 0xa686, 0x0006, 0x0040, 0x6c24, 0xa686, 0x0004, 0x0040,
+       0x6c24, 0x0d7f, 0x0078, 0x6c34, 0x1078, 0x7315, 0x00c0, 0x6c2f,
+       0x1078, 0x38a1, 0x6007, 0x000a, 0x0d7f, 0x0078, 0x6cae, 0x6007,
+       0x000b, 0x0d7f, 0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x0001,
+       0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x000c, 0x0078, 0x6cae,
+       0x1078, 0x3a26, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff,
+       0xa082, 0x0006, 0x0048, 0x6c61, 0xa6b4, 0xff00, 0x8637, 0xa686,
+       0x0006, 0x00c0, 0x6c34, 0x1078, 0x7324, 0x00c0, 0x6c5b, 0x6007,
+       0x000e, 0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x000f, 0x0078,
+       0x6cae, 0x1078, 0x744c, 0x0040, 0x6c6e, 0xa6b4, 0xff00, 0x8637,
+       0xa686, 0x0006, 0x0040, 0x6c53, 0x0078, 0x6c34, 0x6013, 0x1900,
+       0x6007, 0x0009, 0x0078, 0x6cae, 0x1078, 0x3a26, 0x6618, 0xa6b0,
+       0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x6c99,
+       0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x00c0, 0x6c34, 0x1078,
+       0x734f, 0x00c0, 0x6c93, 0x1078, 0x7255, 0x00c0, 0x6c93, 0x6007,
+       0x0010, 0x0078, 0x6cae, 0x1078, 0x22bb, 0x6007, 0x0011, 0x0078,
+       0x6cae, 0x1078, 0x744c, 0x0040, 0x6ca6, 0xa6b4, 0xff00, 0x8637,
+       0xa686, 0x0006, 0x0040, 0x6c87, 0x0078, 0x6c34, 0x6013, 0x1900,
+       0x6007, 0x0009, 0x0078, 0x6cae, 0x6007, 0x0012, 0x6003, 0x0001,
+       0x1078, 0x4872, 0x007c, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078,
+       0x4872, 0x0078, 0x6cb2, 0x6007, 0x0020, 0x6003, 0x0001, 0x1078,
+       0x4872, 0x007c, 0x6007, 0x0023, 0x6003, 0x0001, 0x1078, 0x4872,
+       0x007c, 0x017e, 0x027e, 0x2011, 0x7b88, 0x2214, 0x2c08, 0x1078,
+       0x7514, 0x00c0, 0x6cda, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700,
+       0x0078, 0x6cdf, 0x1078, 0x5c02, 0x2160, 0x6007, 0x0025, 0x6003,
+       0x0001, 0x1078, 0x4872, 0x027f, 0x017f, 0x007c, 0x6106, 0x1078,
+       0x6cf8, 0x6007, 0x002b, 0x0078, 0x6cae, 0x6007, 0x002c, 0x0078,
+       0x6cae, 0x6106, 0x1078, 0x6cfd, 0x6007, 0x002e, 0x0078, 0x6cae,
+       0x0d7e, 0x1078, 0x6d23, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x6d32,
+       0x00c0, 0x6d1c, 0x680c, 0xa08c, 0xff00, 0x6824, 0xa084, 0x00ff,
+       0xa115, 0x6212, 0xd1e4, 0x0040, 0x6d11, 0x2009, 0x0001, 0x0078,
+       0x6d18, 0xd1ec, 0x0040, 0x6d1c, 0x2009, 0x0000, 0xa294, 0x00ff,
+       0x1078, 0x22ff, 0x0078, 0x6d20, 0xa085, 0x0001, 0x0078, 0x6d21,
+       0xa006, 0x0d7f, 0x007c, 0x2069, 0x7b8d, 0x6800, 0xa082, 0x0010,
+       0x00c8, 0x6d30, 0x6013, 0x0000, 0xa085, 0x0001, 0x0078, 0x6d31,
+       0xa006, 0x007c, 0x6013, 0x0000, 0x2069, 0x7b8c, 0x6808, 0xa084,
+       0xff00, 0xa086, 0x0800, 0x007c, 0x6004, 0xa0b2, 0x0030, 0x10c8,
+       0x12d5, 0xa1b6, 0x0013, 0x00c0, 0x6d48, 0x2008, 0x0079, 0x6d5b,
+       0xa1b6, 0x0027, 0x0040, 0x6d50, 0xa1b6, 0x0014, 0x10c0, 0x12d5,
+       0x2001, 0x0007, 0x1078, 0x37df, 0x1078, 0x4b81, 0x1078, 0x6aa1,
+       0x1078, 0x4c7a, 0x007c, 0x6d8b, 0x6d8d, 0x6d8b, 0x6d8b, 0x6d8b,
+       0x6d8d, 0x6d95, 0x6df8, 0x6dbb, 0x6df8, 0x6dcf, 0x6df8, 0x6d95,
+       0x6df8, 0x6df0, 0x6df8, 0x6df0, 0x6df8, 0x6df8, 0x6d8b, 0x6d8b,
+       0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b,
+       0x6d8b, 0x6d8b, 0x6d8b, 0x6df8, 0x6d8b, 0x6d8b, 0x6df8, 0x6d8b,
+       0x6df8, 0x6df8, 0x6d8b, 0x6d8b, 0x6d8b, 0x6d8b, 0x6df8, 0x6df8,
+       0x6d8b, 0x6df8, 0x6df8, 0x1078, 0x12d5, 0x1078, 0x4b81, 0x6003,
+       0x0002, 0x1078, 0x4c7a, 0x0078, 0x6dfe, 0x0f7e, 0x2079, 0x7651,
+       0x7804, 0x0f7f, 0xd0ac, 0x00c0, 0x6df8, 0x2001, 0x0000, 0x1078,
+       0x37bd, 0x2001, 0x0002, 0x1078, 0x37d1, 0x1078, 0x4b81, 0x601f,
+       0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x4872, 0x1078,
+       0x4c7a, 0x0c7e, 0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x457b,
+       0x0c7f, 0x0078, 0x6dfe, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f,
+       0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6df8, 0xa686,
+       0x0004, 0x0040, 0x6df8, 0x2001, 0x0004, 0x0078, 0x6df6, 0x2001,
+       0x7600, 0x2004, 0xa086, 0x0003, 0x00c0, 0x6dd8, 0x1078, 0x2dc8,
+       0x2001, 0x0006, 0x1078, 0x6dff, 0x6618, 0x0d7e, 0x2668, 0x6e04,
+       0x0d7f, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x6df8,
+       0x2001, 0x0006, 0x0078, 0x6df6, 0x2001, 0x0004, 0x0078, 0x6df6,
+       0x2001, 0x0006, 0x1078, 0x6dff, 0x0078, 0x6df8, 0x1078, 0x37df,
+       0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c, 0x017e,
+       0x0d7e, 0x6118, 0x2168, 0x6900, 0xd184, 0x0040, 0x6e1a, 0x6104,
+       0xa18e, 0x000a, 0x00c0, 0x6e12, 0x699c, 0xd1a4, 0x00c0, 0x6e12,
+       0x2001, 0x0007, 0x1078, 0x37d1, 0x2001, 0x0000, 0x1078, 0x37bd,
+       0x1078, 0x22dd, 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668,
+       0x6804, 0xa084, 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8,
+       0x12d5, 0xa1b6, 0x0015, 0x00c0, 0x6e31, 0x1079, 0x6e38, 0x0078,
+       0x6e37, 0xa1b6, 0x0016, 0x10c0, 0x12d5, 0x1079, 0x6e70, 0x007c,
+       0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x6e44,
+       0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x0f7e, 0x2079, 0x7651, 0x7804,
+       0x0f7f, 0xd0ac, 0x00c0, 0x6e60, 0x2001, 0x0000, 0x1078, 0x37bd,
+       0x2001, 0x0002, 0x1078, 0x37d1, 0x601f, 0x0001, 0x6003, 0x0001,
+       0x6007, 0x0002, 0x1078, 0x4872, 0x1078, 0x4c7a, 0x0078, 0x6e6f,
+       0x2011, 0x7b83, 0x220c, 0x017e, 0x0c7e, 0x1078, 0x3825, 0x00c0,
+       0x6e6f, 0x1078, 0x3621, 0x0c7f, 0x017f, 0x1078, 0x5c02, 0x007c,
+       0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x6e7c,
+       0x5ee1, 0x5ee1, 0x5ee1, 0x5ee1, 0x1078, 0x60d1, 0x00c0, 0x6e88,
+       0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x4872, 0x0078, 0x6e8a,
+       0x1078, 0x5c02, 0x007c, 0x6004, 0xa08a, 0x0030, 0x10c8, 0x12d5,
+       0x1078, 0x4b81, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0xa182,
+       0x0040, 0x0079, 0x6e9b, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6ead,
+       0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab, 0x6eab,
+       0x6eab, 0x6eab, 0x6eab, 0x1078, 0x12d5, 0x0d7e, 0x0e7e, 0x0f7e,
+       0x157e, 0x047e, 0x027e, 0x6106, 0x2071, 0x7b80, 0x7444, 0xa4a4,
+       0xe600, 0x0040, 0x6f1e, 0xa486, 0x2000, 0x0040, 0x6edd, 0xa486,
+       0x0400, 0x0040, 0x6edd, 0x7130, 0xa18c, 0x00ff, 0xa182, 0x0010,
+       0x00c8, 0x6fb0, 0x0c7e, 0x1078, 0x460c, 0x2c68, 0x0c7f, 0x6a00,
+       0xa284, 0x0001, 0x0040, 0x6f91, 0x1078, 0x46ca, 0x0040, 0x6fbc,
+       0xa295, 0x0200, 0x6a02, 0x0078, 0x6ee3, 0x2009, 0x0001, 0x2011,
+       0x0200, 0x1078, 0x46b4, 0x1078, 0x132f, 0x1040, 0x12d5, 0x6003,
+       0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000,
+       0x6c5a, 0x2c00, 0x685e, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130,
+       0xa18c, 0x00ff, 0xa10d, 0x6946, 0x684f, 0x0000, 0x6857, 0x0036,
+       0x1078, 0x3a7a, 0xa486, 0x2000, 0x00c0, 0x6f0c, 0x2019, 0x0017,
+       0x1078, 0x74d9, 0x0078, 0x6f7e, 0xa486, 0x0400, 0x00c0, 0x6f16,
+       0x2019, 0x0002, 0x1078, 0x74d9, 0x0078, 0x6f7e, 0xa486, 0x0200,
+       0x00c0, 0x6f1c, 0x1078, 0x74ca, 0x0078, 0x6f7e, 0x7130, 0xa184,
+       0xff00, 0x00c0, 0x6fd0, 0xa18c, 0x00ff, 0xa182, 0x0010, 0x00c8,
+       0x6fd0, 0x0c7e, 0x1078, 0x460c, 0x2c68, 0x0c7f, 0x6a00, 0xa284,
+       0x0001, 0x0040, 0x6fd4, 0xa284, 0x0300, 0x00c0, 0x6fcc, 0x6804,
+       0xa005, 0x0040, 0x6fbc, 0x8001, 0x6806, 0x6003, 0x0007, 0x1078,
+       0x1314, 0x0040, 0x6f85, 0x6013, 0x0000, 0x6803, 0x0000, 0x6837,
+       0x0116, 0x683b, 0x0000, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0,
+       0x8007, 0xa10d, 0x6946, 0x6853, 0x003d, 0x7044, 0xa084, 0x0003,
+       0xa086, 0x0002, 0x00c0, 0x6f60, 0x684f, 0x0040, 0x0078, 0x6f6a,
+       0xa086, 0x0001, 0x00c0, 0x6f68, 0x684f, 0x0080, 0x0078, 0x6f6a,
+       0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0x7b90, 0xad90, 0x0015,
+       0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x6f70, 0x200c,
+       0x6982, 0x8000, 0x200c, 0x697e, 0x1078, 0x3a7a, 0x027f, 0x047f,
+       0x157f, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x6013, 0x0100, 0x6003,
+       0x0001, 0x6007, 0x0041, 0x1078, 0x4825, 0x1078, 0x4c7a, 0x0078,
+       0x6f7e, 0x2069, 0x7b92, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200,
+       0x00c0, 0x6fb0, 0x2069, 0x7b80, 0x686c, 0xa084, 0x00ff, 0x017e,
+       0x6110, 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003, 0x0001,
+       0x6007, 0x0043, 0x1078, 0x4825, 0x1078, 0x4c7a, 0x0078, 0x6f7e,
+       0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4825,
+       0x1078, 0x4c7a, 0x0078, 0x6f7e, 0x6013, 0x0300, 0x0078, 0x6fc2,
+       0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x4825,
+       0x1078, 0x4c7a, 0x0078, 0x6f7e, 0x6013, 0x0500, 0x0078, 0x6fc2,
+       0x6013, 0x0600, 0x0078, 0x6f91, 0x6013, 0x0200, 0x0078, 0x6f91,
+       0xa186, 0x0013, 0x00c0, 0x6fea, 0x6004, 0xa08a, 0x0040, 0x1048,
+       0x12d5, 0xa08a, 0x0050, 0x10c8, 0x12d5, 0xa082, 0x0040, 0x2008,
+       0x0079, 0x701b, 0xa186, 0x0047, 0x00c0, 0x6ff0, 0x0078, 0x704a,
+       0xa186, 0x0027, 0x0040, 0x6ff8, 0xa186, 0x0014, 0x10c0, 0x12d5,
+       0x6004, 0xa082, 0x0040, 0x2008, 0x0079, 0x6ffe, 0x700e, 0x7010,
+       0x7010, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e,
+       0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x700e, 0x1078, 0x12d5,
+       0x2001, 0x0007, 0x1078, 0x37df, 0x1078, 0x4b81, 0x1078, 0x6aa1,
+       0x1078, 0x4c7a, 0x007c, 0x702b, 0x703b, 0x7034, 0x7044, 0x702b,
+       0x702b, 0x702b, 0x702b, 0x702b, 0x702b, 0x702b, 0x702b, 0x702b,
+       0x702b, 0x702b, 0x702b, 0x1078, 0x12d5, 0x6010, 0xa088, 0x0013,
+       0x2104, 0xa085, 0x0400, 0x200a, 0x1078, 0x4b81, 0x6003, 0x0002,
+       0x1078, 0x4c7a, 0x007c, 0x1078, 0x4b81, 0x1078, 0x468d, 0x1078,
+       0x5c02, 0x1078, 0x4c7a, 0x007c, 0x1078, 0x4b81, 0x2009, 0x0041,
+       0x0078, 0x7112, 0xa182, 0x0040, 0x0079, 0x704e, 0x705e, 0x7060,
+       0x705e, 0x705e, 0x705e, 0x705e, 0x705e, 0x7061, 0x705e, 0x705e,
+       0x705e, 0x705e, 0x705e, 0x705e, 0x705e, 0x705e, 0x1078, 0x12d5,
        0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20,
-       0x2c10, 0x1078, 0x1532, 0x007c, 0xa182, 0x0040, 0x0079, 0x6720,
-       0x672f, 0x672f, 0x672f, 0x672f, 0x672f, 0x672f, 0x672f, 0x672f,
-       0x672f, 0x6731, 0x6754, 0x672f, 0x672f, 0x672f, 0x672f, 0x1078,
-       0x12b7, 0x1078, 0x4719, 0x1078, 0x4821, 0x6010, 0x0d7e, 0x2068,
-       0x684c, 0xd0fc, 0x0040, 0x6747, 0xa08c, 0x0003, 0xa18e, 0x0002,
-       0x0040, 0x674d, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x67be, 0x6003,
-       0x0007, 0x1078, 0x41cd, 0x0d7f, 0x007c, 0x1078, 0x41cd, 0x1078,
-       0x556a, 0x0d7f, 0x0078, 0x674c, 0x2001, 0x0007, 0x1078, 0x3401,
-       0x1078, 0x4719, 0x1078, 0x4821, 0x6010, 0x0d7e, 0x2068, 0x037e,
-       0x2019, 0x0004, 0x1078, 0x6bb3, 0x037f, 0x1078, 0x6283, 0x0d7f,
-       0x007c, 0xa186, 0x0013, 0x00c0, 0x6777, 0x6004, 0xa086, 0x0042,
-       0x10c0, 0x12b7, 0x1078, 0x4671, 0x1078, 0x476a, 0x007c, 0xa186,
-       0x0014, 0x00c0, 0x678b, 0x6004, 0xa086, 0x0042, 0x10c0, 0x12b7,
-       0x2001, 0x0007, 0x1078, 0x3401, 0x1078, 0x4671, 0x1078, 0x6283,
-       0x1078, 0x476a, 0x007c, 0xa182, 0x0040, 0x0079, 0x678f, 0x679e,
-       0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x67a0, 0x67ac,
-       0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x679e, 0x1078, 0x12b7,
-       0x037e, 0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078,
-       0x1532, 0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, 0x2068, 0x684c,
-       0xd0fc, 0x0040, 0x67b8, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x67be,
-       0x6003, 0x0007, 0x1078, 0x41cd, 0x0d7f, 0x007c, 0xa182, 0x0040,
-       0x0079, 0x67c2, 0x67d1, 0x67d3, 0x67df, 0x67eb, 0x67d1, 0x67d1,
-       0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1, 0x67d1,
-       0x67d1, 0x1078, 0x12b7, 0x6003, 0x0001, 0x6106, 0x1078, 0x4327,
-       0x127e, 0x2091, 0x8000, 0x1078, 0x476a, 0x127f, 0x007c, 0x6003,
-       0x0001, 0x6106, 0x1078, 0x4327, 0x127e, 0x2091, 0x8000, 0x1078,
-       0x476a, 0x127f, 0x007c, 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078,
-       0x17de, 0x127e, 0x2091, 0x8000, 0x1078, 0x4395, 0x1078, 0x4821,
-       0x127f, 0x007c, 0x1078, 0x4671, 0x0078, 0x6800, 0x1078, 0x4719,
-       0x6110, 0x81ff, 0x0040, 0x680d, 0x0d7e, 0x2168, 0x037e, 0x2019,
-       0x0029, 0x1078, 0x6bb3, 0x037f, 0x0d7f, 0x1078, 0x6283, 0x1078,
-       0x476a, 0x007c, 0xa182, 0x0025, 0x0079, 0x6816, 0x681d, 0x681d,
-       0x681d, 0x681f, 0x681d, 0x681d, 0x681d, 0x1078, 0x12b7, 0x027e,
-       0x0e7e, 0x2071, 0x7280, 0x7220, 0x1078, 0x6ad1, 0x0040, 0x682c,
-       0x6007, 0x0026, 0x0078, 0x682e, 0x6007, 0x0027, 0x6003, 0x0001,
-       0x1078, 0x4327, 0x1078, 0x476a, 0x0e7f, 0x027f, 0x007c, 0xa186,
-       0x0013, 0x00c0, 0x6848, 0x6004, 0xa08a, 0x0025, 0x1048, 0x12b7,
-       0xa08a, 0x002c, 0x10c8, 0x12b7, 0xa082, 0x0025, 0x0079, 0x6857,
-       0xa186, 0x0014, 0x10c0, 0x12b7, 0x2001, 0x0007, 0x1078, 0x3401,
-       0x1078, 0x4671, 0x1078, 0x6283, 0x1078, 0x476a, 0x007c, 0x685e,
-       0x6860, 0x6860, 0x685e, 0x685e, 0x685e, 0x685e, 0x1078, 0x12b7,
-       0x1078, 0x4671, 0x1078, 0x556a, 0x1078, 0x476a, 0x007c, 0xa182,
-       0x0025, 0x1048, 0x12b7, 0xa182, 0x002c, 0x10c8, 0x12b7, 0xa182,
-       0x0025, 0x0079, 0x6873, 0x687a, 0x687a, 0x687a, 0x687c, 0x687a,
-       0x687a, 0x687a, 0x1078, 0x12b7, 0x007c, 0x1078, 0x4671, 0x1078,
-       0x6283, 0x1078, 0x476a, 0x007c, 0x127e, 0x037e, 0x087e, 0x2091,
-       0x8000, 0x2c40, 0x2019, 0x0002, 0x1078, 0x5387, 0x00c0, 0x68b3,
-       0x1078, 0x5428, 0x00c0, 0x68b3, 0x6000, 0xa086, 0x0000, 0x0040,
-       0x68b3, 0x601c, 0xa086, 0x0007, 0x0040, 0x68b3, 0x0d7e, 0x6010,
-       0x2068, 0x1078, 0x6120, 0x0040, 0x68a7, 0x1078, 0x6bb3, 0x0d7f,
-       0x6000, 0xa086, 0x0004, 0x00c0, 0x68af, 0x1078, 0x15f2, 0x6013,
+       0x2c10, 0x1078, 0x1572, 0x007c, 0xa182, 0x0040, 0x0079, 0x7070,
+       0x7080, 0x7080, 0x7080, 0x7080, 0x7080, 0x7080, 0x7080, 0x7080,
+       0x7080, 0x7082, 0x70a5, 0x7080, 0x7080, 0x7080, 0x7080, 0x70a5,
+       0x1078, 0x12d5, 0x1078, 0x4c29, 0x1078, 0x4d3a, 0x6010, 0x0d7e,
+       0x2068, 0x684c, 0xd0fc, 0x0040, 0x7098, 0xa08c, 0x0003, 0xa18e,
+       0x0002, 0x0040, 0x709e, 0x2009, 0x0041, 0x0d7f, 0x0078, 0x7112,
+       0x6003, 0x0007, 0x1078, 0x468d, 0x0d7f, 0x007c, 0x1078, 0x468d,
+       0x1078, 0x5c02, 0x0d7f, 0x0078, 0x709d, 0x037e, 0x1078, 0x4c29,
+       0x1078, 0x4d3a, 0x6010, 0x0d7e, 0x2068, 0x2019, 0x0004, 0x1078,
+       0x74fd, 0x1078, 0x6aa1, 0x6017, 0x0028, 0x0d7f, 0x037f, 0x007c,
+       0xa186, 0x0013, 0x00c0, 0x70c6, 0x6004, 0xa086, 0x0042, 0x10c0,
+       0x12d5, 0x1078, 0x4b81, 0x1078, 0x4c7a, 0x007c, 0xa186, 0x0027,
+       0x0040, 0x70ce, 0xa186, 0x0014, 0x00c0, 0x70de, 0x6004, 0xa086,
+       0x0042, 0x10c0, 0x12d5, 0x2001, 0x0007, 0x1078, 0x37df, 0x1078,
+       0x4b81, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0xa182, 0x0040,
+       0x0079, 0x70e2, 0x70f2, 0x70f2, 0x70f2, 0x70f2, 0x70f2, 0x70f2,
+       0x70f2, 0x70f4, 0x7100, 0x70f2, 0x70f2, 0x70f2, 0x70f2, 0x70f2,
+       0x70f2, 0x70f2, 0x1078, 0x12d5, 0x037e, 0x047e, 0x20e1, 0x0005,
+       0x3d18, 0x3e20, 0x2c10, 0x1078, 0x1572, 0x047f, 0x037f, 0x007c,
+       0x6010, 0x0d7e, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x710c, 0x2009,
+       0x0041, 0x0d7f, 0x0078, 0x7112, 0x6003, 0x0007, 0x1078, 0x468d,
+       0x0d7f, 0x007c, 0xa182, 0x0040, 0x0079, 0x7116, 0x7126, 0x7128,
+       0x7134, 0x7140, 0x7126, 0x7126, 0x7126, 0x7126, 0x7126, 0x7126,
+       0x7126, 0x7126, 0x7126, 0x7126, 0x7126, 0x7126, 0x1078, 0x12d5,
+       0x6003, 0x0001, 0x6106, 0x1078, 0x4825, 0x127e, 0x2091, 0x8000,
+       0x1078, 0x4c7a, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078,
+       0x4825, 0x127e, 0x2091, 0x8000, 0x1078, 0x4c7a, 0x127f, 0x007c,
+       0x6003, 0x0003, 0x6106, 0x2c10, 0x1078, 0x19cf, 0x127e, 0x2091,
+       0x8000, 0x1078, 0x4891, 0x1078, 0x4d3a, 0x127f, 0x007c, 0x1078,
+       0x4b81, 0x0078, 0x7155, 0x1078, 0x4c29, 0x6110, 0x81ff, 0x0040,
+       0x7162, 0x0d7e, 0x2168, 0x037e, 0x2019, 0x0029, 0x1078, 0x74fd,
+       0x037f, 0x0d7f, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0xa182,
+       0x0085, 0x0079, 0x716b, 0x7172, 0x7172, 0x7172, 0x7174, 0x7172,
+       0x7172, 0x7172, 0x1078, 0x12d5, 0x027e, 0x0e7e, 0x2071, 0x7b80,
+       0x7220, 0x1078, 0x7417, 0x0040, 0x7181, 0x6007, 0x0086, 0x0078,
+       0x7183, 0x6007, 0x0087, 0x6003, 0x0001, 0x1078, 0x4825, 0x1078,
+       0x4c7a, 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x719d,
+       0x6004, 0xa08a, 0x0085, 0x1048, 0x12d5, 0xa08a, 0x008c, 0x10c8,
+       0x12d5, 0xa082, 0x0085, 0x0079, 0x71b0, 0xa186, 0x0027, 0x0040,
+       0x71a5, 0xa186, 0x0014, 0x10c0, 0x12d5, 0x2001, 0x0007, 0x1078,
+       0x37df, 0x1078, 0x4b81, 0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c,
+       0x71b7, 0x71b9, 0x71b9, 0x71b7, 0x71b7, 0x71b7, 0x71b7, 0x1078,
+       0x12d5, 0x1078, 0x4b81, 0x1078, 0x5c02, 0x1078, 0x4c7a, 0x007c,
+       0xa182, 0x0085, 0x1048, 0x12d5, 0xa182, 0x008c, 0x10c8, 0x12d5,
+       0xa182, 0x0085, 0x0079, 0x71cc, 0x71d3, 0x71d3, 0x71d3, 0x71d5,
+       0x71d3, 0x71d3, 0x71d3, 0x1078, 0x12d5, 0x007c, 0x1078, 0x4b81,
+       0x1078, 0x6aa1, 0x1078, 0x4c7a, 0x007c, 0x037e, 0x2019, 0x000b,
+       0x1078, 0x71e6, 0x601f, 0x0006, 0x037f, 0x007c, 0x127e, 0x037e,
+       0x087e, 0x2091, 0x8000, 0x2c40, 0x1078, 0x5915, 0x00c0, 0x7213,
+       0x1078, 0x59b6, 0x00c0, 0x7213, 0x6000, 0xa086, 0x0000, 0x0040,
+       0x7213, 0x601c, 0xa086, 0x0007, 0x0040, 0x7213, 0x0d7e, 0x6000,
+       0xa086, 0x0004, 0x00c0, 0x7206, 0x1078, 0x1676, 0x6010, 0x2068,
+       0x1078, 0x693e, 0x0040, 0x720e, 0x1078, 0x74fd, 0x0d7f, 0x6013,
        0x0000, 0x601f, 0x0007, 0x087f, 0x037f, 0x127f, 0x007c, 0x0f7e,
-       0x0c7e, 0x037e, 0x157e, 0x2079, 0x7280, 0x7938, 0x783c, 0x1078,
-       0x1e1b, 0x00c0, 0x68e8, 0x017e, 0x0c7e, 0x1078, 0x3447, 0x00c0,
-       0x68e8, 0x2011, 0x7290, 0xac98, 0x000a, 0x20a9, 0x0004, 0x1078,
-       0x5a35, 0x00c0, 0x68e8, 0x017f, 0x027f, 0x027e, 0x017e, 0x2019,
-       0x0029, 0x1078, 0x445c, 0x1078, 0x43a9, 0x017f, 0x1078, 0x6a57,
-       0x1078, 0x35cf, 0x017f, 0x1078, 0x3256, 0xa006, 0x0078, 0x68ea,
-       0x0c7f, 0x017f, 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0e7e,
-       0x0d7e, 0x0c7e, 0x047e, 0x037e, 0x027e, 0x2061, 0x7400, 0x2071,
-       0x6d00, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8, 0x6929, 0x2100,
-       0xac06, 0x0040, 0x691b, 0x6000, 0xa086, 0x0000, 0x0040, 0x691b,
-       0x6018, 0x2068, 0x68a0, 0xa206, 0x00c0, 0x691b, 0x631c, 0xa386,
-       0x0004, 0x0040, 0x6925, 0xa386, 0x0005, 0x0040, 0x6925, 0xa386,
-       0x0006, 0x0040, 0x6925, 0xace0, 0x0008, 0x2001, 0x6d15, 0x2004,
-       0xac02, 0x00c8, 0x6929, 0x0078, 0x68f7, 0xa085, 0x0001, 0x0078,
-       0x692a, 0xa006, 0x027f, 0x037f, 0x047f, 0x0c7f, 0x0d7f, 0x0e7f,
-       0x007c, 0x0c7e, 0x0d7e, 0x017e, 0x2009, 0x6d1e, 0x2104, 0xa086,
-       0x0074, 0x00c0, 0x6988, 0x2069, 0x728e, 0x690c, 0xa182, 0x0100,
-       0x0048, 0x6978, 0x6908, 0xa184, 0x8000, 0x0040, 0x6984, 0xa184,
-       0x0800, 0x0040, 0x6984, 0x6910, 0xa18a, 0x0001, 0x0048, 0x697c,
-       0x6914, 0x2069, 0x72ae, 0x6904, 0x81ff, 0x00c0, 0x6970, 0x690c,
-       0xa182, 0x0100, 0x0048, 0x6978, 0x6908, 0x81ff, 0x00c0, 0x6974,
-       0x6910, 0xa18a, 0x0001, 0x0048, 0x697c, 0x6918, 0xa18a, 0x0001,
-       0x0048, 0x6984, 0x0078, 0x698e, 0x6013, 0x0100, 0x0078, 0x698a,
-       0x6013, 0x0300, 0x0078, 0x698a, 0x6013, 0x0500, 0x0078, 0x698a,
-       0x6013, 0x0700, 0x0078, 0x698a, 0x6013, 0x0900, 0x0078, 0x698a,
-       0x6013, 0x0b00, 0x0078, 0x698a, 0x6013, 0x0f00, 0x0078, 0x698a,
-       0x6013, 0x2d00, 0xa085, 0x0001, 0x0078, 0x698f, 0xa006, 0x017f,
-       0x0d7f, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x027e, 0x037e, 0x157e,
-       0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, 0x0040,
-       0x69b7, 0xa286, 0x0004, 0x0040, 0x69b7, 0xa394, 0xff00, 0x8217,
-       0xa286, 0x0006, 0x0040, 0x69b7, 0xa286, 0x0004, 0x0040, 0x69b7,
-       0x0c7e, 0x2d60, 0x1078, 0x3459, 0x0c7f, 0x0078, 0x69ea, 0x2011,
-       0x7296, 0xad98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x5a35, 0x00c0,
-       0x69eb, 0x2011, 0x729a, 0xad98, 0x0006, 0x20a9, 0x0004, 0x1078,
-       0x5a35, 0x00c0, 0x69eb, 0x047e, 0x017e, 0x6aa0, 0xa294, 0x00ff,
-       0x8227, 0xa006, 0x2009, 0x6d52, 0x210c, 0xd1a4, 0x0040, 0x69df,
-       0x2009, 0x0029, 0x1078, 0x6bf7, 0x6800, 0xc0e5, 0x6802, 0x2019,
-       0x0029, 0x1078, 0x445c, 0x1078, 0x43a9, 0x2c08, 0x1078, 0x6a57,
-       0x017f, 0x047f, 0xa006, 0x157f, 0x037f, 0x027f, 0x0d7f, 0x0c7f,
-       0x007c, 0x0d7e, 0x2069, 0x728e, 0x6800, 0xa086, 0x0800, 0x0040,
-       0x69fd, 0x6013, 0x0000, 0x0078, 0x69fe, 0xa006, 0x0d7f, 0x007c,
-       0x0c7e, 0x0f7e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2079, 0x728c,
-       0x7930, 0x7834, 0x1078, 0x1e1b, 0x00c0, 0x6a24, 0x1078, 0x3447,
-       0x00c0, 0x6a24, 0x2011, 0x7290, 0xac98, 0x000a, 0x20a9, 0x0004,
-       0x1078, 0x5a35, 0x00c0, 0x6a24, 0x2011, 0x7294, 0xac98, 0x0006,
-       0x20a9, 0x0004, 0x1078, 0x5a35, 0x157f, 0x037f, 0x027f, 0x017f,
-       0x0f7f, 0x0c7f, 0x007c, 0x0c7e, 0x007e, 0x017e, 0x027e, 0x037e,
-       0x157e, 0x2011, 0x7283, 0x2204, 0x8211, 0x220c, 0x1078, 0x1e1b,
-       0x00c0, 0x6a50, 0x1078, 0x3447, 0x00c0, 0x6a50, 0x2011, 0x7296,
-       0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x5a35, 0x00c0, 0x6a50,
-       0x2011, 0x729a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x5a35,
-       0x157f, 0x037f, 0x027f, 0x017f, 0x007f, 0x0c7f, 0x007c, 0x0e7e,
-       0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e, 0x127e, 0x2091,
-       0x8000, 0x2029, 0x6f19, 0x252c, 0x2021, 0x6f1f, 0x2424, 0x2061,
-       0x7400, 0x2071, 0x6d00, 0x7644, 0x7060, 0x8001, 0xa602, 0x00c8,
-       0x6abc, 0x2100, 0xac06, 0x0040, 0x6ab2, 0x1078, 0x6c0f, 0x0040,
-       0x6ab2, 0x671c, 0xa786, 0x0001, 0x0040, 0x6ab2, 0xa786, 0x0007,
-       0x0040, 0x6ab2, 0x2500, 0xac06, 0x0040, 0x6ab2, 0x2400, 0xac06,
-       0x0040, 0x6ab2, 0x6018, 0x2070, 0x70a0, 0xa206, 0x00c0, 0x6ab2,
-       0x0d7e, 0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x6aa6, 0xa786,
-       0x0003, 0x00c0, 0x6ac5, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000,
-       0x017e, 0x1078, 0x36a1, 0x017f, 0x1078, 0x6276, 0x0d7f, 0x6000,
-       0xa086, 0x0004, 0x00c0, 0x6ab0, 0x017e, 0x1078, 0x15f2, 0x017f,
-       0x1078, 0x6283, 0xace0, 0x0008, 0x2001, 0x6d15, 0x2004, 0xac02,
-       0x00c8, 0x6abc, 0x0078, 0x6a69, 0x127f, 0x027f, 0x047f, 0x057f,
-       0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0,
-       0x6a9b, 0xa386, 0x0005, 0x0040, 0x6ab2, 0x1078, 0x6bb3, 0x0078,
-       0x6aa6, 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0x1078, 0x6bca,
-       0x017f, 0x0040, 0x6ae0, 0x601c, 0xa084, 0x000f, 0x1079, 0x6ae3,
-       0x0e7f, 0x0c7f, 0x007c, 0x6aeb, 0x6aeb, 0x6aeb, 0x6aeb, 0x6aeb,
-       0x6aeb, 0x6aed, 0x6aeb, 0xa006, 0x007c, 0x047e, 0x017e, 0x7018,
-       0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009,
-       0x0020, 0x1078, 0x6bf7, 0x017f, 0x047f, 0x1078, 0x6884, 0xa085,
-       0x0001, 0x007c, 0x2001, 0x0001, 0x1078, 0x33df, 0x157e, 0x017e,
-       0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, 0x6d05, 0x2011, 0x7296,
-       0x1078, 0x5a35, 0x037f, 0x027f, 0x017f, 0x157f, 0xa005, 0x007c,
-       0x0f7e, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x027e, 0x127e, 0x2091,
-       0x8000, 0x2061, 0x7400, 0x2079, 0x0001, 0x8fff, 0x0040, 0x6b73,
-       0x2071, 0x6d00, 0x7644, 0x7060, 0x8001, 0xa602, 0x00c8, 0x6b73,
-       0x88ff, 0x0040, 0x6b39, 0x2800, 0xac06, 0x00c0, 0x6b69, 0x2079,
-       0x0000, 0x1078, 0x6c0f, 0x0040, 0x6b69, 0x2400, 0xac06, 0x0040,
-       0x6b69, 0x671c, 0xa786, 0x0006, 0x00c0, 0x6b69, 0xa786, 0x0007,
-       0x0040, 0x6b69, 0x88ff, 0x00c0, 0x6b51, 0x6018, 0xa206, 0x00c0,
-       0x6b69, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x6120, 0x0040, 0x6b5c,
-       0x047e, 0x1078, 0x6bb3, 0x047f, 0x0d7f, 0x6000, 0xa086, 0x0004,
-       0x00c0, 0x6b64, 0x1078, 0x15f2, 0x1078, 0x6283, 0x88ff, 0x00c0,
-       0x6b7c, 0xace0, 0x0008, 0x2001, 0x6d15, 0x2004, 0xac02, 0x00c8,
-       0x6b73, 0x0078, 0x6b25, 0xa006, 0x127f, 0x027f, 0x067f, 0x077f,
-       0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001, 0x0078, 0x6b74,
-       0x087e, 0x2041, 0x0000, 0x2c20, 0x2019, 0x0002, 0x6218, 0x1078,
-       0x5387, 0x1078, 0x5428, 0x1078, 0x6b18, 0x087f, 0x007c, 0x027e,
-       0x047e, 0x087e, 0x0c7e, 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009,
-       0x0000, 0x017e, 0x037e, 0x1078, 0x3447, 0x00c0, 0x6ba8, 0x2c10,
-       0x2041, 0x0000, 0x1078, 0x5387, 0x1078, 0x5428, 0x1078, 0x6b18,
-       0x037f, 0x017f, 0x8108, 0x00f0, 0x6b99, 0x157f, 0x0c7f, 0x087f,
-       0x047f, 0x027f, 0x007c, 0x017e, 0x0f7e, 0x8dff, 0x0040, 0x6bc7,
-       0x6800, 0xa07d, 0x0040, 0x6bc4, 0x6803, 0x0000, 0x6b52, 0x1078,
-       0x36a1, 0x2f68, 0x0078, 0x6bb8, 0x6b52, 0x1078, 0x36a1, 0x0f7f,
-       0x017f, 0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061, 0x7400, 0x2071,
-       0x6d00, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8, 0x6bf2, 0x2100,
-       0xac06, 0x0040, 0x6be4, 0x6000, 0xa086, 0x0000, 0x0040, 0x6be4,
-       0x6008, 0xa206, 0x0040, 0x6bee, 0xace0, 0x0008, 0x2001, 0x6d15,
-       0x2004, 0xac02, 0x00c8, 0x6bf2, 0x0078, 0x6bcf, 0xa085, 0x0001,
-       0x0078, 0x6bf3, 0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, 0x0d7e,
-       0x007e, 0x1078, 0x130f, 0x007f, 0x1040, 0x12b7, 0x6837, 0x010d,
-       0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000, 0x685e, 0x6956,
-       0x6c46, 0x684f, 0x0000, 0x1078, 0x36a1, 0x0d7f, 0x007c, 0x6700,
-       0xa786, 0x0000, 0x0040, 0x6c22, 0xa786, 0x0001, 0x0040, 0x6c22,
-       0xa786, 0x000a, 0x0040, 0x6c22, 0xa786, 0x0009, 0x0040, 0x6c22,
-       0xa085, 0x0001, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000,
-       0x2071, 0x6d00, 0xd5a4, 0x0040, 0x6c30, 0x7034, 0x8000, 0x7036,
-       0xd5b4, 0x0040, 0x6c36, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040,
-       0x6c3d, 0x2071, 0x6d0a, 0x1078, 0x6c6c, 0x0e7f, 0x007f, 0x127f,
-       0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x6d00,
-       0xd5a4, 0x0040, 0x6c4e, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040,
-       0x6c54, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0x6c5b, 0x2071,
-       0x6d0a, 0x1078, 0x6c6c, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e,
-       0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x6d02, 0x1078, 0x6c6c,
-       0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072, 0x00c8,
-       0x6c75, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e, 0x2071,
-       0x6d00, 0x1078, 0x6c6c, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0x6d04,
-       0x1078, 0x6c6c, 0x0e7f, 0x007c, 0x0001, 0x0002, 0x0004, 0x0008,
-       0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800,
-       0x1000, 0x2000, 0x4000, 0x8000, 0x614c
+       0x0c7e, 0x037e, 0x157e, 0x2079, 0x7b80, 0x7838, 0xa08c, 0x00ff,
+       0x783c, 0x1078, 0x2085, 0x00c0, 0x724e, 0x017e, 0x0c7e, 0x1078,
+       0x3825, 0x00c0, 0x724e, 0x2011, 0x7b90, 0xac98, 0x000a, 0x20a9,
+       0x0004, 0x1078, 0x616a, 0x00c0, 0x724e, 0x017f, 0x027f, 0x027e,
+       0x017e, 0x2019, 0x0029, 0x1078, 0x5a8a, 0x1078, 0x4962, 0x1078,
+       0x48a5, 0x017f, 0x1078, 0x737b, 0x1078, 0x39a6, 0x017f, 0x1078,
+       0x3621, 0x6612, 0x6516, 0xa006, 0x0078, 0x7250, 0x0c7f, 0x017f,
+       0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0c7e, 0x0d7e, 0x017e,
+       0x2009, 0x761e, 0x2104, 0xa086, 0x0074, 0x00c0, 0x72ac, 0x2069,
+       0x7b8e, 0x690c, 0xa182, 0x0100, 0x0048, 0x729c, 0x6908, 0xa184,
+       0x8000, 0x0040, 0x72a8, 0xa184, 0x0800, 0x0040, 0x72a8, 0x6910,
+       0xa18a, 0x0001, 0x0048, 0x72a0, 0x6914, 0x2069, 0x7bae, 0x6904,
+       0x81ff, 0x00c0, 0x7294, 0x690c, 0xa182, 0x0100, 0x0048, 0x729c,
+       0x6908, 0x81ff, 0x00c0, 0x7298, 0x6910, 0xa18a, 0x0001, 0x0048,
+       0x72a0, 0x6918, 0xa18a, 0x0001, 0x0048, 0x72a8, 0x0078, 0x72b2,
+       0x6013, 0x0100, 0x0078, 0x72ae, 0x6013, 0x0300, 0x0078, 0x72ae,
+       0x6013, 0x0500, 0x0078, 0x72ae, 0x6013, 0x0700, 0x0078, 0x72ae,
+       0x6013, 0x0900, 0x0078, 0x72ae, 0x6013, 0x0b00, 0x0078, 0x72ae,
+       0x6013, 0x0f00, 0x0078, 0x72ae, 0x6013, 0x2d00, 0xa085, 0x0001,
+       0x0078, 0x72b3, 0xa006, 0x017f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e,
+       0x0d7e, 0x027e, 0x037e, 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394,
+       0x00ff, 0xa286, 0x0006, 0x0040, 0x72db, 0xa286, 0x0004, 0x0040,
+       0x72db, 0xa394, 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x72db,
+       0xa286, 0x0004, 0x0040, 0x72db, 0x0c7e, 0x2d60, 0x1078, 0x3837,
+       0x0c7f, 0x0078, 0x730e, 0x2011, 0x7b96, 0xad98, 0x000a, 0x20a9,
+       0x0004, 0x1078, 0x616a, 0x00c0, 0x730f, 0x2011, 0x7b9a, 0xad98,
+       0x0006, 0x20a9, 0x0004, 0x1078, 0x616a, 0x00c0, 0x730f, 0x047e,
+       0x017e, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x7652,
+       0x210c, 0xd1a4, 0x0040, 0x7303, 0x2009, 0x0029, 0x1078, 0x7541,
+       0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, 0x1078, 0x4962, 0x1078,
+       0x48a5, 0x2c08, 0x1078, 0x737b, 0x017f, 0x047f, 0xa006, 0x157f,
+       0x037f, 0x027f, 0x0d7f, 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0x7b8e,
+       0x6800, 0xa086, 0x0800, 0x0040, 0x7321, 0x6013, 0x0000, 0x0078,
+       0x7322, 0xa006, 0x0d7f, 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e,
+       0x037e, 0x157e, 0x2079, 0x7b8c, 0x7930, 0x7834, 0x1078, 0x2085,
+       0x00c0, 0x7348, 0x1078, 0x3825, 0x00c0, 0x7348, 0x2011, 0x7b90,
+       0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x616a, 0x00c0, 0x7348,
+       0x2011, 0x7b94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, 0x616a,
+       0x157f, 0x037f, 0x027f, 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e,
+       0x007e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2011, 0x7b83, 0x2204,
+       0x8211, 0x220c, 0x1078, 0x2085, 0x00c0, 0x7374, 0x1078, 0x3825,
+       0x00c0, 0x7374, 0x2011, 0x7b96, 0xac98, 0x000a, 0x20a9, 0x0004,
+       0x1078, 0x616a, 0x00c0, 0x7374, 0x2011, 0x7b9a, 0xac98, 0x0006,
+       0x20a9, 0x0004, 0x1078, 0x616a, 0x157f, 0x037f, 0x027f, 0x017f,
+       0x007f, 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e,
+       0x047e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2029, 0x783f, 0x252c,
+       0x2021, 0x7845, 0x2424, 0x2061, 0x7d00, 0x2071, 0x7600, 0x7644,
+       0x7060, 0x8001, 0xa602, 0x00c8, 0x73e0, 0x2100, 0xac06, 0x0040,
+       0x73d6, 0x1078, 0x7559, 0x0040, 0x73d6, 0x671c, 0xa786, 0x0001,
+       0x0040, 0x73f5, 0xa786, 0x0007, 0x0040, 0x73d6, 0x2500, 0xac06,
+       0x0040, 0x73d6, 0x2400, 0xac06, 0x0040, 0x73d6, 0x1078, 0x756d,
+       0x00c0, 0x73d6, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x73bc,
+       0x017e, 0x1078, 0x1676, 0x017f, 0x6010, 0x2068, 0x1078, 0x693e,
+       0x0040, 0x73d3, 0xa786, 0x0003, 0x00c0, 0x73e9, 0x6837, 0x0103,
+       0x6b4a, 0x6847, 0x0000, 0x017e, 0x1078, 0x6b3f, 0x1078, 0x3a7a,
+       0x017f, 0x1078, 0x6a94, 0x0d7f, 0x1078, 0x6aa1, 0xace0, 0x0008,
+       0x2001, 0x7615, 0x2004, 0xac02, 0x00c8, 0x73e0, 0x0078, 0x738d,
+       0x127f, 0x027f, 0x047f, 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f,
+       0x007c, 0xa786, 0x0006, 0x00c0, 0x73c6, 0xa386, 0x0005, 0x0040,
+       0x73d6, 0x1078, 0x74fd, 0x0078, 0x73d3, 0x1078, 0x756d, 0x00c0,
+       0x73d6, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x00c0, 0x73d6,
+       0x6000, 0xa086, 0x0002, 0x00c0, 0x73d6, 0x1078, 0x6aba, 0x0040,
+       0x7411, 0x1078, 0x6ace, 0x00c0, 0x73d6, 0x1078, 0x5e57, 0x0078,
+       0x7413, 0x1078, 0x22dd, 0x1078, 0x6aa1, 0x0078, 0x73d6, 0x0c7e,
+       0x0e7e, 0x017e, 0x2c08, 0x2170, 0x1078, 0x7514, 0x017f, 0x0040,
+       0x7426, 0x601c, 0xa084, 0x000f, 0x1079, 0x7429, 0x0e7f, 0x0c7f,
+       0x007c, 0x7431, 0x7431, 0x7431, 0x7431, 0x7431, 0x7431, 0x7433,
+       0x7431, 0xa006, 0x007c, 0x047e, 0x017e, 0x7018, 0xa080, 0x0028,
+       0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x1078,
+       0x7541, 0x017f, 0x047f, 0x037e, 0x2019, 0x0002, 0x1078, 0x71e6,
+       0x037f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0001, 0x1078, 0x37bd,
+       0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, 0x7605,
+       0x2011, 0x7b96, 0x1078, 0x616a, 0x037f, 0x027f, 0x017f, 0x157f,
+       0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x027e,
+       0x127e, 0x2091, 0x8000, 0x2061, 0x7d00, 0x2079, 0x0001, 0x8fff,
+       0x0040, 0x74bd, 0x2071, 0x7600, 0x7644, 0x7060, 0x8001, 0xa602,
+       0x00c8, 0x74bd, 0x88ff, 0x0040, 0x7483, 0x2800, 0xac06, 0x00c0,
+       0x74b3, 0x2079, 0x0000, 0x1078, 0x7559, 0x0040, 0x74b3, 0x2400,
+       0xac06, 0x0040, 0x74b3, 0x671c, 0xa786, 0x0006, 0x00c0, 0x74b3,
+       0xa786, 0x0007, 0x0040, 0x74b3, 0x88ff, 0x00c0, 0x749b, 0x6018,
+       0xa206, 0x00c0, 0x74b3, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0,
+       0x74a3, 0x1078, 0x1676, 0x6010, 0x2068, 0x1078, 0x693e, 0x0040,
+       0x74ad, 0x047e, 0x1078, 0x74fd, 0x047f, 0x0d7f, 0x1078, 0x6aa1,
+       0x88ff, 0x00c0, 0x74c6, 0xace0, 0x0008, 0x2001, 0x7615, 0x2004,
+       0xac02, 0x00c8, 0x74bd, 0x0078, 0x746f, 0xa006, 0x127f, 0x027f,
+       0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001,
+       0x0078, 0x74be, 0x087e, 0x2041, 0x0000, 0x2c20, 0x2019, 0x0002,
+       0x6218, 0x1078, 0x5915, 0x1078, 0x59b6, 0x1078, 0x7462, 0x087f,
+       0x007c, 0x027e, 0x047e, 0x087e, 0x0c7e, 0x157e, 0x2c20, 0x20a9,
+       0x007f, 0x2009, 0x0000, 0x017e, 0x037e, 0x1078, 0x3825, 0x00c0,
+       0x74f2, 0x2c10, 0x2041, 0x0000, 0x1078, 0x5915, 0x1078, 0x59b6,
+       0x1078, 0x7462, 0x037f, 0x017f, 0x8108, 0x00f0, 0x74e3, 0x157f,
+       0x0c7f, 0x087f, 0x047f, 0x027f, 0x007c, 0x017e, 0x0f7e, 0x8dff,
+       0x0040, 0x7511, 0x6800, 0xa07d, 0x0040, 0x750e, 0x6803, 0x0000,
+       0x6b52, 0x1078, 0x3a7a, 0x2f68, 0x0078, 0x7502, 0x6b52, 0x1078,
+       0x3a7a, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061,
+       0x7d00, 0x2071, 0x7600, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8,
+       0x753c, 0x2100, 0xac06, 0x0040, 0x752e, 0x6000, 0xa086, 0x0000,
+       0x0040, 0x752e, 0x6008, 0xa206, 0x0040, 0x7538, 0xace0, 0x0008,
+       0x2001, 0x7615, 0x2004, 0xac02, 0x00c8, 0x753c, 0x0078, 0x7519,
+       0xa085, 0x0001, 0x0078, 0x753d, 0xa006, 0x037f, 0x047f, 0x0e7f,
+       0x007c, 0x0d7e, 0x007e, 0x1078, 0x132f, 0x007f, 0x1040, 0x12d5,
+       0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, 0x0000,
+       0x685e, 0x6956, 0x6c46, 0x684f, 0x0000, 0x1078, 0x3a7a, 0x0d7f,
+       0x007c, 0x6700, 0xa786, 0x0000, 0x0040, 0x756c, 0xa786, 0x0001,
+       0x0040, 0x756c, 0xa786, 0x000a, 0x0040, 0x756c, 0xa786, 0x0009,
+       0x0040, 0x756c, 0xa085, 0x0001, 0x007c, 0x0e7e, 0x6018, 0x2070,
+       0x70a0, 0xa206, 0x0e7f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091,
+       0x8000, 0x2071, 0x7640, 0xd5a4, 0x0040, 0x7581, 0x7034, 0x8000,
+       0x7036, 0xd5b4, 0x0040, 0x7587, 0x7030, 0x8000, 0x7032, 0xd5ac,
+       0x0040, 0x758e, 0x2071, 0x764a, 0x1078, 0x75bd, 0x0e7f, 0x007f,
+       0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071,
+       0x7640, 0xd5a4, 0x0040, 0x759f, 0x7034, 0x8000, 0x7036, 0xd5b4,
+       0x0040, 0x75a5, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0040, 0x75ac,
+       0x2071, 0x764a, 0x1078, 0x75bd, 0x0e7f, 0x007f, 0x127f, 0x007c,
+       0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, 0x7642, 0x1078,
+       0x75bd, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04, 0x8000, 0x2072,
+       0x00c8, 0x75c6, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x007c, 0x0e7e,
+       0x2071, 0x7640, 0x1078, 0x75bd, 0x0e7f, 0x007c, 0x0e7e, 0x2071,
+       0x7644, 0x1078, 0x75bd, 0x0e7f, 0x007c, 0x0001, 0x0002, 0x0004,
+       0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400,
+       0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0xaaff
 };
-unsigned short   risc_code_length01 = 0x5c95;
+unsigned short   risc_code_length01 = 0x65e6;
 
index 8faeb2344e862bf45a9e06a17d099c82bf932069..f975a6735b9b8b6c66dc36493f18bb9c129bdd7e 100644 (file)
@@ -366,7 +366,6 @@ fat_read_super(struct super_block *sb, void *data, int silent)
                fat32 = 1;
                MSDOS_SB(sb)->fat_length= CF_LE_W(b->fat32_length)*sector_mult;
                MSDOS_SB(sb)->root_cluster = CF_LE_L(b->root_cluster);
-                       CF_LE_W(b->info_sector), logical_sector_size);
 
                /* MC - if info_sector is 0, don't multiply by 0 */
                if(CF_LE_W(b->info_sector) == 0) {
index 6858456b7ca3994cc2ff570b41191d384c50da64..3eab050e6c9058eb72be31b33034e2e10cc9d994 100644 (file)
@@ -528,15 +528,6 @@ void clean_inode(struct inode *inode)
        sema_init(&inode->i_sem, 1);
 }
 
-/*
- * This gets called with I_LOCK held: it needs
- * to read the inode and then unlock it
- */
-static inline void read_inode(struct inode *inode, struct super_block *sb)
-{
-       sb->s_op->read_inode(inode);
-}
-
 /*
  * This is called by things like the networking layer
  * etc that want to get an inode without any inode
@@ -606,7 +597,7 @@ add_new_inode:
                spin_unlock(&inode_lock);
 
                clean_inode(inode);
-               read_inode(inode, sb);
+               sb->s_op->read_inode(inode);
 
                /*
                 * This is special!  We do not need the spinlock
index e8b1e76604d861f886f08a6b44283289b671c965..382a869b1cf56ddb969df0d3c242780658f62668 100644 (file)
@@ -195,8 +195,8 @@ static struct super_block *minix_read_super(struct super_block *s, void *data,
        s->u.minix_sb.s_ms = ms;
        s->u.minix_sb.s_sbh = bh;
        s->u.minix_sb.s_mount_state = ms->s_state;
-       s->s_blocksize = 1024;
-       s->s_blocksize_bits = 10;
+       s->s_blocksize = BLOCK_SIZE;
+       s->s_blocksize_bits = BLOCK_SIZE_BITS;
        s->u.minix_sb.s_ninodes = ms->s_ninodes;
        s->u.minix_sb.s_nzones = ms->s_nzones;
        s->u.minix_sb.s_imap_blocks = ms->s_imap_blocks;
index 04b0121dc2382ee7cad40399698da362bc2f53c7..21de93da4ad85d03e112a98605e8c02c6863b183 100644 (file)
@@ -1032,17 +1032,13 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry)
        int error;
 
        error = may_delete(dir, dentry, 0);
-       if (error)
-               goto exit_lock;
-
-       if (!dir->i_op || !dir->i_op->unlink)
-               goto exit_lock;
-
-       DQUOT_INIT(dir);
-
-       error = dir->i_op->unlink(dir, dentry);
-
-exit_lock:
+       if (!error) {
+               error = -EPERM;
+               if (dir->i_op && dir->i_op->unlink) {
+                       DQUOT_INIT(dir);
+                       error = dir->i_op->unlink(dir, dentry);
+               }
+       }
        return error;
 }
 
index 3074ba8fbfdd840862b327d257c067f6d352fe5c..dc976cb5fca71750b6053e894806da37d9356fbe 100644 (file)
@@ -287,7 +287,7 @@ static inline void iounmap(void *addr)
  * String version of IO memory access ops:
  */
 extern void _memcpy_fromio(void *, unsigned long, long);
-extern void _memcpy_toio(unsigned long, void *, long);
+extern void _memcpy_toio(unsigned long, const void *, long);
 extern void _memset_c_io(unsigned long, unsigned long, long);
 
 #define memcpy_fromio(to,from,len) \
index 0f4b04b5eb40b109e7e5b6ff8e854b0c5666348f..0577d2c93fca5e6aefee2106a0ceba5fcaea0a58 100644 (file)
@@ -50,7 +50,7 @@ waking_non_zero(struct semaphore *sem)
  *     0       go to sleep
  *     -EINTR  interrupted
  *
- * We must undo the sem->count down_interruptible increment
+ * We must undo the sem->count down_interruptible decrement
  * simultaneously and atomicly with the sem->waking adjustment,
  * otherwise we can race with wake_one_more.
  *
index 3ef76a0205d6fee701b530b9ae4852c37a052317..faea0310b83471449911e7fddf986ef37d7fca3b 100644 (file)
@@ -115,42 +115,43 @@ extern inline int down_interruptible(struct semaphore * sem)
 
 extern inline int down_trylock(struct semaphore * sem)
 {
-       long ret, tmp, tmp2;
+       long ret, tmp, tmp2, sub;
 
        /* "Equivalent" C.  Note that we have to do this all without
           (taken) branches in order to be a valid ll/sc sequence.
 
           do {
               tmp = ldq_l;
-              ret = 0;
-              tmp -= 1;
-              if ((int)tmp < 0)                // count
-                  break;
-              if ((long)tmp < 0)               // waking
-                  break;
-              tmp += 0xffffffff00000000;
-              ret = 1;
+              sub = 0x0000000100000000;
+              ret = ((int)tmp <= 0);           // count <= 0 ?
+              // If we're subtracting one from count, we don't need 
+              // one from waking and vice versa.
+              if ((int)tmp > 0) sub = 1;       // count > 0 ?
+              if ((long)tmp >= 0) ret = 0;     // waking >= 0 ?
+              if (ret) break;  
+              tmp -= sub;
               tmp = stq_c = tmp;
           } while (tmp == 0);
        */
 
        __asm__ __volatile__(
-               "1:     ldq_l   %1,%3\n"
-               "       lda     %0,0\n"
-               "       subl    %1,1,%2\n"
-               "       subq    %1,1,%1\n"
-               "       blt     %2,2f\n"
-               "       blt     %1,2f\n"
-               "       ldah    %1,-32768(%1)\n"
-               "       ldah    %1,-32768(%1)\n"
-               "       lda     %0,1\n"
-               "       stq_c   %1,%3\n"
+               "1:     ldq_l   %1,%4\n"
+               "       lda     %3,1\n"
+               "       addl    %1,0,%2\n"
+               "       sll     %3,32,%3\n"
+               "       cmple   %2,0,%0\n"
+               "       cmovgt  %2,1,%3\n"
+               "       cmovge  %1,0,%0\n"
+               "       bne     %0,2f\n"
+               "       subq    %1,%3,%1\n"
+               "       stq_c   %1,%4\n"
                "       beq     %1,3f\n"
-               "2:     mb\n"
+               "       mb\n"
+               "2:\n"
                ".section .text2,\"ax\"\n"
                "3:     br      1b\n"
                ".previous"
-               : "=&r"(ret), "=&r"(tmp), "=&r"(tmp2)
+               : "=&r"(ret), "=&r"(tmp), "=&r"(tmp2), "=&r"(sub)
                : "m"(*sem)
                : "memory");
 
index 665acc31363c99b1ca1aa543e07403368cadafa6..f44914e3e36a058757b7b075249679b8d1954929 100644 (file)
@@ -358,43 +358,55 @@ __asm__ __volatile__("1: stb %r2,%1\n"                            \
  * Complex access routines
  */
 
-#define __copy_to_user(to,from,n)   __copy_tofrom_user_nocheck((to),(from),(n))
-#define __copy_from_user(to,from,n) __copy_tofrom_user_nocheck((to),(from),(n))
+extern void __copy_user(void);
 
-#define copy_to_user(to,from,n)   __copy_tofrom_user((to),(from),(n),__cu_to)
-#define copy_from_user(to,from,n) __copy_tofrom_user((to),(from),(n),__cu_from)
+extern inline long
+__copy_tofrom_user_nocheck(void *to, const void *from, long len)
+{
+       register void * __cu_to __asm__("$6") = to;
+       register const void * __cu_from __asm__("$7") = from;
+       register long __cu_len __asm__("$0") = len;
 
-extern void __copy_user(void);
+       __asm__ __volatile__(
+               "jsr $28,__copy_user"
+               : "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)
+               : "0" (__cu_len), "1" (__cu_from), "2" (__cu_to)
+               : "$1","$2","$3","$4","$5","$27","$28","memory");
 
-#define __copy_tofrom_user_nocheck(to,from,n)                          \
-({                                                                     \
-       register void * __cu_to __asm__("$6") = (to);                   \
-       register const void * __cu_from __asm__("$7") = (from);         \
-       register long __cu_len __asm__("$0") = (n);                     \
-       __asm__ __volatile__(                                           \
-               "jsr $28,(%3),__copy_user"                              \
-               : "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)     \
-               : "r" (__copy_user), "0" (__cu_len),                    \
-                 "1" (__cu_from), "2" (__cu_to)                        \
-               : "$1","$2","$3","$4","$5","$28","memory");             \
-       __cu_len;                                                       \
-})
+       return __cu_len;
+}
 
-#define __copy_tofrom_user(to,from,n,v)                                            \
-({                                                                         \
-       register void * __cu_to __asm__("$6") = (to);                       \
-       register const void * __cu_from __asm__("$7") = (from);             \
-       register long __cu_len __asm__("$0") = (n);                         \
-       if (__access_ok(((long)(v)),__cu_len,get_fs())) {                   \
-               __asm__ __volatile__(                                       \
-                       "jsr $28,(%3),__copy_user"                          \
-                       : "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to) \
-                       : "r" (__copy_user), "0" (__cu_len),                \
-                         "1" (__cu_from), "2" (__cu_to)                    \
-                       : "$1","$2","$3","$4","$5","$28","memory");         \
-       }                                                                   \
-       __cu_len;                                                           \
-})
+extern inline long
+__copy_tofrom_user(void *to, const void *from, long len, const void *validate)
+{
+       if (__access_ok((long)validate, len, get_fs())) {
+               register void * __cu_to __asm__("$6") = to;
+               register const void * __cu_from __asm__("$7") = from;
+               register long __cu_len __asm__("$0") = len;
+               __asm__ __volatile__(
+                       "jsr $28,__copy_user"
+                       : "=r" (__cu_len), "=r" (__cu_from), "=r" (__cu_to)
+                       : "0" (__cu_len), "1" (__cu_from), "2" (__cu_to)
+                       : "$1","$2","$3","$4","$5","$27","$28","memory");
+               len = __cu_len;
+       }
+       return len;
+}
+
+#define __copy_to_user(to,from,n)   __copy_tofrom_user_nocheck((to),(from),(n))
+#define __copy_from_user(to,from,n) __copy_tofrom_user_nocheck((to),(from),(n))
+
+extern inline long
+copy_to_user(void *to, const void *from, long n)
+{
+       return __copy_tofrom_user(to, from, n, to);
+}
+
+extern inline long
+copy_from_user(void *to, const void *from, long n)
+{
+       return __copy_tofrom_user(to, from, n, from);
+}
 
 #define copy_to_user_ret(to,from,n,retval) ({ \
 if (copy_to_user(to,from,n)) \
@@ -408,46 +420,48 @@ if (copy_from_user(to,from,n)) \
 
 extern void __do_clear_user(void);
 
-#define __clear_user(to,n)                                             \
-({                                                                     \
-       register void * __cl_to __asm__("$6") = (to);                   \
-       register long __cl_len __asm__("$0") = (n);                     \
-       __asm__ __volatile__(                                           \
-               "jsr $28,(%2),__do_clear_user"                          \
-               : "=r"(__cl_len), "=r"(__cl_to)                         \
-               : "r"(__do_clear_user), "0"(__cl_len), "1"(__cl_to)     \
-               : "$1","$2","$3","$4","$5","$28","memory");             \
-       __cl_len;                                                       \
-})
+extern inline long
+__clear_user(void *to, long len)
+{
+       register void * __cl_to __asm__("$6") = to;
+       register long __cl_len __asm__("$0") = len;
+       __asm__ __volatile__(
+               "jsr $28,__do_clear_user"
+               : "=r"(__cl_len), "=r"(__cl_to)
+               : "0"(__cl_len), "1"(__cl_to)
+               : "$1","$2","$3","$4","$5","$27","$28","memory");
+       return __cl_len;
+}
 
-#define clear_user(to,n)                                               \
-({                                                                     \
-       register void * __cl_to __asm__("$6") = (to);                   \
-       register long __cl_len __asm__("$0") = (n);                     \
-       if (__access_ok(((long)__cl_to),__cl_len,get_fs())) {           \
-               __asm__ __volatile__(                                   \
-                       "jsr $28,(%2),__do_clear_user"                  \
-                       : "=r"(__cl_len), "=r"(__cl_to)                 \
-                       : "r"(__do_clear_user), "0"(__cl_len), "1"(__cl_to)\
-                       : "$1","$2","$3","$4","$5","$28","memory");     \
-       }                                                               \
-       __cl_len;                                                       \
-})
+extern inline long
+clear_user(void *to, long len)
+{
+       if (__access_ok((long)to, len, get_fs())) {
+               register void * __cl_to __asm__("$6") = to;
+               register long __cl_len __asm__("$0") = len;
+               __asm__ __volatile__(
+                       "jsr $28,__do_clear_user"
+                       : "=r"(__cl_len), "=r"(__cl_to)
+                       : "0"(__cl_len), "1"(__cl_to)
+                       : "$1","$2","$3","$4","$5","$27","$28","memory");
+               len = __cl_len;
+       }
+       return len;
+}
 
 /* Returns: -EFAULT if exception before terminator, N if the entire
    buffer filled, else strlen.  */
 
 extern long __strncpy_from_user(char *__to, const char *__from, long __to_len);
 
-#define strncpy_from_user(to,from,n)                                      \
-({                                                                        \
-       char * __sfu_to = (to);                                            \
-       const char * __sfu_from = (from);                                  \
-       long __sfu_ret = -EFAULT;                                          \
-       if (__access_ok(((long)__sfu_from),0,get_fs()))                    \
-               __sfu_ret = __strncpy_from_user(__sfu_to,__sfu_from,(n));  \
-       __sfu_ret;                                                         \
-})
+extern inline long
+strncpy_from_user(char *to, const char *from, long n)
+{
+       long ret = -EFAULT;
+       if (__access_ok((long)from, 0, get_fs()))
+               ret = __strncpy_from_user(to, from, n);
+       return ret;
+}
 
 /* Returns: 0 if bad, string length+1 (memory size) of string if ok */
 extern long __strlen_user(const char *);
index 9dc61d00b2be88aae4beaa0165b9d0ef2f457558..5b6a6ebf08b4fc784272e4677ee60347c5567c4e 100644 (file)
@@ -39,27 +39,27 @@ things. */
 specify a starting slot beyond zero, to deal with detecting multiple
 devices.  Returns MCA_NOTFOUND if id not found.  Also checks the
 integrated adapters. */
-extern int mca_find_adapter( int id, int start );
-extern int mca_find_unused_adapter( int id, int start );
+extern int mca_find_adapter(int id, int start);
+extern int mca_find_unused_adapter(int id, int start);
 
 /* adapter state info - returns 0 if no */
-extern int mca_isadapter( int slot );
-extern int mca_isenabled( int slot );
+extern int mca_isadapter(int slot);
+extern int mca_isenabled(int slot);
 
-extern int mca_is_adapter_used( int slot );
-extern int mca_mark_as_used( int slot );
-extern void mca_mark_as_unused( int slot );
+extern int mca_is_adapter_used(int slot);
+extern int mca_mark_as_used(int slot);
+extern void mca_mark_as_unused(int slot);
 
 /* gets a byte out of POS register (stored in memory) */
-extern unsigned char mca_read_stored_pos( int slot, int reg );
+extern unsigned char mca_read_stored_pos(int slot, int reg);
 
 /*
        This can be expanded later.  Right now, it gives us a way of
        getting meaningful information into the MCA_info structure,
        so we can have a more interesting /proc/mca.
 */
-extern void mca_set_adapter_name( int slot, char* name );
-extern char* mca_get_adapter_name( int slot );
+extern void mca_set_adapter_name(int slot, char* name);
+extern char* mca_get_adapter_name(int slot);
 
 /*
        This sets up an information callback for /proc/mca/slot?.  The
@@ -73,8 +73,8 @@ extern char* mca_get_adapter_name( int slot );
        unregisters, thus preventing kernel crashes and other such
        nastiness.
 */
-typedef int (*MCA_ProcFn)( char* buf, int slot, void* dev );
-extern void mca_set_adapter_procfn( int slot, MCA_ProcFn, void* dev );
+typedef int (*MCA_ProcFn)(char* buf, int slot, void* dev);
+extern void mca_set_adapter_procfn(int slot, MCA_ProcFn, void* dev);
 
 /* These routines actually mess with the hardware POS registers.  They
 temporarily disable the device (and interrupts), so make sure you know
@@ -88,13 +88,13 @@ limits.
 */
 
 /* read a byte from the specified POS register. */
-extern unsigned char mca_read_pos( int slot, int reg );
+extern unsigned char mca_read_pos(int slot, int reg);
 
 /* write a byte to the specified POS register. */
-extern void mca_write_pos( int slot, int reg, unsigned char byte );
+extern void mca_write_pos(int slot, int reg, unsigned char byte);
 
 /* Should only be called by the NMI interrupt handler, this will do some
 fancy stuff to figure out what might have generated a NMI. */
-extern void mca_handle_nmi( void );
+extern void mca_handle_nmi(void);
 
 #endif /* _LINUX_MCA_H */
index ef3963ba3e6c4ebec5599d7fac69403158540558..919ebac3284994f7720b4f11c5c49368d341086e 100644 (file)
@@ -246,6 +246,7 @@ struct ucred {
 #define SOL_PACKET     263
 #define SOL_ATM                264     /* ATM layer (cell level) */
 #define SOL_AAL                265     /* ATM Adaption Layer (packet level) */
+#define SOL_IRDA        266
 
 /* IPX options */
 #define IPX_TYPE       1
diff --git a/include/net/irda/discovery.h b/include/net/irda/discovery.h
new file mode 100644 (file)
index 0000000..99e4704
--- /dev/null
@@ -0,0 +1,65 @@
+/*********************************************************************
+ *                
+ * Filename:      discovery.h
+ * Version:       
+ * Description:   
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Tue Apr  6 16:53:53 1999
+ * Modified at:   Tue Apr  6 20:44:35 1999
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *     
+ *     This program is free software; you can redistribute it and/or 
+ *     modify it under the terms of the GNU General Public License as 
+ *     published by the Free Software Foundation; either version 2 of 
+ *     the License, or (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License 
+ *     along with this program; if not, write to the Free Software 
+ *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
+ *     MA 02111-1307 USA
+ *     
+ ********************************************************************/
+
+#ifndef DISCOVERY_H
+#define DISCOVERY_H
+
+#include <asm/param.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irqueue.h>
+
+#define DISCOVERY_EXPIRE_TIMEOUT 6*HZ
+
+/*
+ * The DISCOVERY structure is used for both discovery requests and responses
+ */
+typedef struct {
+       QUEUE queue;             /* Must be first! */
+
+       __u32      saddr;        /* Which link the device was discovered */
+       __u32      daddr;        /* Remote device address */
+       LAP_REASON condition;    /* More info about the discovery */
+
+       __u16_host_order hints;  /* Discovery hint bits */
+       __u8       charset;
+       char       info[32];     /* Usually the name of the device */
+       __u8       info_len;     /* Length of device info field */
+
+       int        gen_addr_bit; /* Need to generate a new device address? */
+       int        nslots;       /* Number of slots to use when discovering */
+       int        timestamp;    /* Time discovered */
+} discovery_t;
+
+void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *discovery);
+void irlmp_add_discovery_log(hashbin_t *cachelog, hashbin_t *log);
+void irlmp_expire_discoveries(hashbin_t *log, int saddr, int force);
+
+#endif
index 9ef035889554a1670de029e13b1316c08966e114..e2b2ae507c5750333823b1d0cfadb721dad77199 100644 (file)
@@ -19,6 +19,9 @@
  *
  ********************************************************************/
 
+#ifndef IRCOMM_H
+#define IRCOMM_H
+
 /* #define DEBUG(n, args...) printk( KERN_DEBUG args) */ /* enable all debug message */
 
 #include <linux/types.h>
@@ -52,16 +55,23 @@ typedef enum {
        IRCOMM_CONTROL_REQUEST,
 } IRCOMM_EVENT;
 
+typedef enum {
+       TX_READY,
+       TX_BUSY,
+
+       IAS_PARAM,
+       CONTROL_CHANNEL,
+} IRCOMM_CMD;
+
+
 
 #define IRCOMM_MAGIC            0x434f4d4d
 #define COMM_INIT_CTRL_PARAM    3          /* length of initial control parameters */
-#define COMM_CTRL_MIN           1          /* length of clen field */
-#define COMM_HEADER_SIZE        (LAP_HEADER+LMP_HEADER+TTP_HEADER+COMM_CTRL_MIN)
+#define COMM_HEADER             1          /* length of clen field */
+#define COMM_HEADER_SIZE        (LAP_HEADER+LMP_HEADER+TTP_HEADER+COMM_HEADER)
 #define COMM_DEFAULT_DATA_SIZE  64
-#define IRCOMM_MAX_CONNECTION   1          /* Don't change */
+#define IRCOMM_MAX_CONNECTION   1          /* Don't change for now */
 
-#define IAS_PARAM               1
-#define CONTROL_CHANNEL         2
 
 
 
@@ -78,7 +88,7 @@ typedef enum {
 
 
 #define SERVICETYPE 0x00
-#define PORT_TYPE 0x02
+#define PORT_TYPE 0x01
 #define PORT_NAME 0x02
 #define FIXED_PORT_NAME 0x82
 
@@ -101,10 +111,6 @@ typedef enum {
 #define IEEE1284_MODE 0x34
 #define IEEE1284_ECP_EPP_DATA_TRANSFER 0x35
 
-#define TX_READY 0xFE  /* FIXME: this is not defined in IrCOMM spec */
-#define TX_BUSY  0XFF  /*         so we should find another way */
-
-
 /*  parameters of FLOW_CONTROL  */
 
 #define USE_RTS 0x08  /* use RTS on output */
@@ -131,6 +137,20 @@ typedef enum {
 
 /*  parameters of DATA_FORMAT */
 
+#define IRCOMM_WLEN5   0x00       /* word length is 5bit */
+#define IRCOMM_WLEN6   0x01       /* word length is 6bit */
+#define IRCOMM_WLEN7   0x02       /* word length is 7bit */
+#define IRCOMM_WLEN8   0x03       /* word length is 8bit */
+
+#define IRCOMM_STOP2   0x04       /* 2 stop bits mode */
+#define IRCOMM_PARENB  0x08       /* parity enable */
+#define IRCOMM_PARODD  0x00       /*  odd parity */
+#define IRCOMM_PAREVEN 0x10       /*  even parity */
+#define IRCOMM_PARMARK 0x20
+#define IRCOMM_PARSPC  0x30
+
+/*  parameters of LINE_STATUS */
+
 #define LSR_OE     0x02    /* Overrun error indicator */
 #define LSR_PE     0x04    /* Parity error indicator */
 #define LSR_FE     0x08    /* Frame error indicator */
@@ -146,31 +166,46 @@ struct ircomm_cb{
        int in_use;
        int null_modem_mode;     /* switch for null modem emulation */
        int ttp_stop;
+
        int max_txbuff_size;          
-       int maxsdusize;
+       __u32 maxsdusize;
+
        __u32 daddr;        /* Device address of the peer device */ 
        __u32 saddr;
-
-       void (*d_handler)(struct ircomm_cb *self);
+       int                 ias_type;
+       int disconnect_priority; /* P_NORMAL or P_HIGH. see irttp.h */
        struct notify_t notify;     /* container of callbacks */
+       void (*d_handler)(struct ircomm_cb *self);
 
+       int control_ch_pending;
        struct sk_buff *ctrl_skb;   /* queue of control channel */
 
+       __u8 dlsap;          /* IrLMP dlsap */
+       __u8 lsap;           /* sap of local device */ 
        struct tsap_cb *tsap;          /* IrTTP/LMP handle */
        struct qos_info *qos;         /* Quality of Service */
-       
        int reason;          /* I don't know about reason: 
                                see Irlmp.c or somewhere :p)*/ 
+       int peer_cap;        /* capability of peer device */
+
+       struct wait_queue   *discovery_wait;
+       struct wait_queue   *ias_wait;
+
+       /* statistics */
+       int                 tx_packets;
+       int                 rx_packets;
+       int                 tx_controls;
+       int                 pending_control_tuples;
+       int                 ignored_control_tuples;
+
 
-       __u8 dlsap;          /* IrLMP dlsap */
-       __u8 lsap;           /* sap of local device */ 
 
        __u8 pi ;            /* instruction of control channel*/ 
+
        __u8 port_type;
        __u8 peer_port_type;
 
        __u8 servicetype;    
-       __u8 peer_servicetype;
        __u8 data_format;   
        __u8 peer_data_format;   
        __u8 flow_ctrl;
@@ -200,35 +235,26 @@ struct ircomm_cb{
        
        __u32 data_rate;
        __u32 peer_data_rate;
-       char port_name[60];
-
+       char port_name[33];
+       int port_name_critical;
 };
 
 
 
-void ircomm_connect_request(struct ircomm_cb *self, int maxsdusize);
+int  ircomm_query_ias_and_connect(struct ircomm_cb *self, __u8 servicetype); 
+void ircomm_connect_request(struct ircomm_cb *self);
 void ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata,
-                            int maxsdusize);
+                            __u32 maxsdusize);
 void ircomm_disconnect_request(struct ircomm_cb *self,
-                                     struct sk_buff *userdata);
-void ircomm_data_request(struct ircomm_cb *self,
-                        struct sk_buff *userdata);
-void ircomm_control_request(struct ircomm_cb *self);
-void ircomm_append_ctrl(struct ircomm_cb *self, __u8 instruction);
-struct ircomm_cb *ircomm_attach_cable( __u8 servicetype, struct notify_t notify, 
-                        void *handler);
-int ircomm_detach_cable(struct ircomm_cb *self);
-
-
-void ircomm_accept_data_indication(void *instance, void *sap, struct sk_buff *skb);
-void ircomm_accept_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
-                                  int maxsdusize, struct sk_buff *skb);
-void ircomm_accept_connect_indication(void *instance, void *sap,
-                                     struct qos_info *qos, 
-                                     int maxsdusize, struct sk_buff *skb);
-void ircomm_accept_disconnect_indication(void *instance, void *sap, LM_REASON reason,
-                                        struct sk_buff *skb);
-void ircomm_accept_flow_indication(void *instance, void *sap, LOCAL_FLOW flow);
-void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state);
+                              struct sk_buff *userdata, int priority);
+int ircomm_data_request(struct ircomm_cb *self,
+                       struct sk_buff *userdata);
+void ircomm_control_request(struct ircomm_cb *self, __u8 instruction);
+
+void ircomm_parse_tuples(struct ircomm_cb *self, struct sk_buff *skb, int type);
+
+struct ircomm_cb *ircomm_open_instance(struct notify_t notify);
+int ircomm_close_instance(struct ircomm_cb *self);
 
 
+#endif
index 30835b9a941986144e23f90bef7080d220c9733e..d51e159f5b246ac5f256e3f1c23875a02522b247 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Dec  9 21:13:12 1997
- * Modified at:   Wed Jan 27 14:15:50 1999
+ * Modified at:   Tue Apr  6 20:31:08 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
  *     
  ********************************************************************/
 
-#ifndef IRDA_H
-#define IRDA_H
+#ifndef NET_IRDA_H
+#define NET_IRDA_H
 
 #include <linux/config.h>
 #include <linux/skbuff.h>
+#include <linux/kernel.h>
+
+#include <net/irda/qos.h>
+#include <net/irda/irqueue.h>
 
 #ifndef TRUE
 #define TRUE 1
@@ -57,47 +61,6 @@ if(!(expr)) { \
 #define ASSERT(expr, func)
 #endif /* CONFIG_IRDA_DEBUG */
 
-#ifdef CHECK_SKB
-static unsigned int check_skb = CHECK_SKB;
-
-#define SK_FREED_SKB    0x0DE2C0DE
-#define SK_GOOD_SKB     0xDEC0DED1
-#define SK_HEAD_SKB     0x12231298
-
-extern int skb_check(struct sk_buff *skb,int,int, char *);
-
-#ifdef IS_SKB
-#undef IS_SKB
-#endif
-
-#define IS_SKB(skb, func) \
-if( skb_check((skb), 0, __LINE__,__FILE__) == -1) { \
-       ##func}
-
-#ifdef IS_SKB_HEAD
-#undef IS_SKB_HEAD
-#endif
-
-#define IS_SKB_HEAD(skb)  skb_check((skb), 1, __LINE__,__FILE__)
-
-#define ALLOC_SKB_MAGIC(skb) \
-if( check_skb) \
-        skb->magic_debug_cookie = SK_GOOD_SKB;
-
-#define FREE_SKB_MAGIC(skb) \
-if( check_skb) {\
-       skb->magic_debug_cookie = SK_FREED_SKB; \
-}
-
-#else
-#undef IS_SKB
-#define IS_SKB(skb, func)
-#undef IS_SKB_HEAD
-#define IS_SKB_HEAD(skb) 
-#define ALLOC_SKB_MAGIC(skb) 
-#define FREE_SKB_MAGIC(skb)
-#endif /* CHECK_SKB */
-
 /*
  *  Magic numbers used by Linux/IR. Random numbers which must be unique to 
  *  give the best protection
@@ -117,39 +80,153 @@ if( check_skb) {\
 #define IAS_OBJECT_MAGIC   0x34234
 #define IAS_ATTRIB_MAGIC   0x45232
 
-#define IAS_DEVICE_ID 0x5342
+#define IAS_DEVICE_ID 0x5342 
 #define IAS_PNP_ID    0xd342
 #define IAS_OBEX_ID   0x34323
 #define IAS_IRLAN_ID  0x34234
 #define IAS_IRCOMM_ID 0x2343
 #define IAS_IRLPT_ID  0x9876
 
-#endif /* IRDA_H */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+typedef enum { FLOW_STOP, FLOW_START } LOCAL_FLOW;
 
+/* IrDA Socket */
+struct tsap_cb;
+struct irda_sock {
+       __u32 saddr;          /* my local address */
+       __u32 daddr;          /* peer address */
 
+       struct ias_object *ias_obj;
+       struct tsap_cb *tsap; /* TSAP used by this connection */
+       __u8 dtsap_sel;       /* remote TSAP address */
+       __u8 stsap_sel;       /* local TSAP address */
+       
+       __u32 max_sdu_size_rx;
+       __u32 max_sdu_size_tx;
+       struct qos_info qos_tx;
 
+       __u16 mask;           /* Hint bits mask */
+       __u16 hints;          /* Hint bits */
 
+       __u32 ckey;           /* IrLMP client handle */
+       __u32 skey;           /* IrLMP service handle */
 
+       int nslots;           /* Number of slots to use for discovery */
 
+       struct sock *sk;
+       struct wait_queue *ias_wait;       /* Wait for LM-IAS answer */
 
+       LOCAL_FLOW tx_flow;
+       LOCAL_FLOW rx_flow;
+};
 
+/*
+ *  This type is used by the protocols that transmit 16 bits words in 
+ *  little endian format. A little endian machine stores MSB of word in
+ *  byte[1] and LSB in byte[0]. A big endian machine stores MSB in byte[0] 
+ *  and LSB in byte[1].
+ */
+typedef union {
+       __u16 word;
+       __u8  byte[2];
+} __u16_host_order;
 
+/*
+ *  Information monitored by some layers
+ */
+struct irda_statistics
+{
+        int     rx_packets;             /* total packets received       */
+        int     tx_packets;             /* total packets transmitted    */
+        int     rx_errors;              /* bad packets received         */
+        int     tx_errors;              /* packet transmit problems     */
+        int     rx_dropped;             /* no space in linux buffers    */
+        int     tx_dropped;             /* no space available in linux  */
+       int     rx_compressed;
+       int     tx_compressed;
+       int     rx_bytes;               /* total bytes received         */
+       int     tx_bytes;               /* total bytes transmitted      */
+
+        int     multicast;              /* multicast packets received   */
+        int     collisions;
+       
+        /* detailed rx_errors: */
+        int     rx_length_errors;
+        int     rx_over_errors;         /* receiver ring buff overflow  */
+        int     rx_crc_errors;          /* recved pkt with crc error    */
+        int     rx_frame_errors;        /* recv'd frame alignment error */
+        int     rx_fifo_errors;         /* recv'r fifo overrun          */
+        int     rx_missed_errors;       /* receiver missed packet       */
+
+        /* detailed tx_errors */
+        int     tx_aborted_errors;
+        int     tx_carrier_errors;
+        int     tx_fifo_errors;
+        int     tx_heartbeat_errors;
+        int     tx_window_errors;
+};
+
+/* Misc status information */
+typedef enum {
+       STATUS_OK,
+       STATUS_ABORTED,
+       STATUS_NO_ACTIVITY,
+       STATUS_NOISY,
+       STATUS_REMOTE,
+} LINK_STATUS;
+
+typedef enum {
+       LOCK_NO_CHANGE,
+       LOCK_LOCKED,
+       LOCK_UNLOCKED,
+} LOCK_STATUS;
+
+typedef enum { /* FIXME check the two first reason codes */
+       LAP_DISC_INDICATION=1, /* Received a disconnect request from peer */
+       LAP_NO_RESPONSE,       /* To many retransmits without response */
+       LAP_RESET_INDICATION,  /* To many retransmits, or invalid nr/ns */
+       LAP_FOUND_NONE,        /* No devices were discovered */
+       LAP_MEDIA_BUSY,
+       LAP_PRIMARY_CONFLICT,
+} LAP_REASON;
+
+/*  
+ *  IrLMP disconnect reasons. The order is very important, since they 
+ *  correspond to disconnect reasons sent in IrLMP disconnect frames, so
+ *  please do not touch :-)
+ */
+typedef enum {
+       LM_USER_REQUEST = 1,  /* User request */
+       LM_LAP_DISCONNECT,    /* Unexpected IrLAP disconnect */
+       LM_CONNECT_FAILURE,   /* Failed to establish IrLAP connection */
+       LM_LAP_RESET,         /* IrLAP reset */
+       LM_INIT_DISCONNECT,   /* Link Management initiated disconnect */
+       LM_LSAP_NOTCONN,      /* Data delivered on unconnected LSAP */
+       LM_NON_RESP_CLIENT,   /* Non responsive LM-MUX client */
+       LM_NO_AVAIL_CLIENT,   /* No available LM-MUX client */
+       LM_CONN_HALF_OPEN,    /* Connection is half open */
+       LM_BAD_SOURCE_ADDR,   /* Illegal source address (i.e 0x00) */
+} LM_REASON;
+#define LM_UNKNOWN 0xff       /* Unspecified disconnect reason */
 
+/*
+ *  Notify structure used between transport and link management layers
+ */
+struct notify_t {
+       int (*data_indication)(void *priv, void *sap, struct sk_buff *skb);
+       int (*udata_indication)(void *priv, void *sap, struct sk_buff *skb);
+       void (*connect_confirm)(void *instance, void *sap, 
+                               struct qos_info *qos, __u32 max_sdu_size,
+                               struct sk_buff *skb);
+       void (*connect_indication)(void *instance, void *sap, 
+                                  struct qos_info *qos, __u32 max_sdu_size,
+                                  struct sk_buff *skb);
+       void (*disconnect_indication)(void *instance, void *sap, 
+                                     LM_REASON reason, struct sk_buff *);
+       void (*flow_indication)(void *instance, void *sap, LOCAL_FLOW flow);
+       void *instance; /* Layer instance pointer */
+       char name[16];  /* Name of layer */
+};
+
+#define NOTIFY_MAX_NAME 16
+
+#endif /* NET_IRDA_H */
index 7439f5ffb49a036b95f39fd14ecd2946b445f091..3f61a4e71b29236053bfb434a4618176e84f907c 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Haris Zukanovic <haris@stud.cs.uit.no>
  * Created at:    Tue Apr 14 12:41:42 1998
- * Modified at:   Tue Feb  9 14:01:50 1999
+ * Modified at:   Wed Apr  7 17:17:16 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Haris Zukanovic, <haris@stud.cs.uit.no>
 #include <linux/tty.h>
 #include <linux/netdevice.h>
 
+#include <asm/spinlock.h>
+
 #include <net/irda/irda.h>
 #include <net/irda/qos.h>
 #include <net/irda/irqueue.h>
 
-/* Some non-standard interface flags (should not conflict with any in if.h */
+/* Some non-standard interface flags (should not conflict with any in if.h) */
 #define IFF_SIR        0x01 /* Supports SIR speeds */
 #define IFF_MIR        0x02 /* Supports MIR speeds */
 #define IFF_FIR        0x04 /* Supports FIR speeds */
 #define IFF_PIO        0x08 /* Supports PIO transfer of data */
 #define IFF_DMA                0x10 /* Supports DMA transfer of data */
-#define IFF_DONGLE      0x20 /* Interface has a dongle attached */
+#define IFF_SHM         0x20 /* Supports shared memory data transfers */
+#define IFF_DONGLE      0x40 /* Interface has a dongle attached */
 
 #define IO_XMIT 0x01
 #define IO_RECV 0x02
 struct chipio_t {
         int iobase, iobase2;  /* IO base */
         int io_ext, io_ext2;  /* Length of iobase */
+       int membase;          /* Shared memory base */
         int irq, irq2;        /* Interrupts used */
         int fifo_size;        /* FIFO size */
 
         int dma, dma2;        /* DMA channel used */
         int irqflags;         /* interrupt flags (ie, SA_SHIRQ|SA_INTERRUPT) */
-       int direction;        /* Used by some FIR drivers */
+       int direction;        /* Link direction, used by some FIR drivers */
 
        int baudrate;         /* Currently used baudrate */
        int dongle_id;        /* Dongle or transceiver currently used */
@@ -107,50 +111,40 @@ struct irda_device {
 
        int xbofs;
        int media_busy;
+       /* spinlock_t lock; */ /* For serializing operations */
        
        /* Media busy stuff */
        struct timer_list media_busy_timer;
-       struct timer_list todo_timer;
-
-       int  (*hard_xmit)( struct sk_buff *skb, struct device *dev);
-        void (*change_speed)( struct irda_device *driver, int baud);
 
+       /* Driver specific implementation */
+        void (*change_speed)(struct irda_device *driver, int baud);
        int (*is_receiving)(struct irda_device *);     /* receiving? */
        /* int (*is_tbusy)(struct irda_device *); */   /* transmitting? */
        void (*wait_until_sent)(struct irda_device *);
-
-       int new_speed; /* Will be removed in future */
 };
 
 extern hashbin_t *irda_device;
 
 /* Function prototypes */
-int  irda_device_init( void);
-void irda_device_cleanup( void);
+int  irda_device_init(void);
+void irda_device_cleanup(void);
 
-int  irda_device_open( struct irda_device *, char *name, void *priv);
-void irda_device_close( struct irda_device *);
+int  irda_device_open(struct irda_device *, char *name, void *priv);
+void irda_device_close(struct irda_device *);
 
 /* Interface to be uses by IrLAP */
-inline void irda_device_set_media_busy( struct irda_device *, int status);
-inline int  irda_device_is_media_busy( struct irda_device *);
-inline int  irda_device_is_receiving( struct irda_device *);
-inline void irda_device_change_speed( struct irda_device *, int);
+inline void irda_device_set_media_busy(struct irda_device *, int status);
+inline int  irda_device_is_media_busy(struct irda_device *);
+inline int  irda_device_is_receiving(struct irda_device *);
+inline void irda_device_change_speed(struct irda_device *, int);
 
-inline struct qos_info *irda_device_get_qos( struct irda_device *self);
-int irda_device_txqueue_empty( struct irda_device *self);
+inline struct qos_info *irda_device_get_qos(struct irda_device *self);
+int irda_device_txqueue_empty(struct irda_device *self);
 
-int irda_device_setup( struct device *dev);
+int irda_device_setup(struct device *dev);
 
-__inline__ int irda_get_mtt( struct sk_buff *skb);
+inline unsigned short irda_get_mtt(struct sk_buff *skb);
 
-void setup_dma( int channel, char *buffer, int count, int mode);
+void setup_dma(int channel, char *buffer, int count, int mode);
 
 #endif
-
-
-
-
-
-
-
index df214129d247d17edc7eba09182400d8b2c15cf7..470a9477be5a7d730980269b954d8e2ffeaebf35 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Aug 21 00:02:07 1997
- * Modified at:   Tue Jan 26 11:50:33 1999
+ * Modified at:   Mon Mar 22 13:15:04 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -34,8 +34,8 @@
 #include <net/irda/irqueue.h>
 #include <net/irda/timer.h>
 
-#define LST 0x80
-#define ACK 0x40
+#define IAP_LST 0x80
+#define IAP_ACK 0x40
 
 #define IAS_SERVER 0
 #define IAS_CLIENT 1
@@ -91,13 +91,9 @@ void iriap_getvaluebyclass_request( char *name, char *attr,
 void iriap_getvaluebyclass_confirm(struct iriap_cb *self, struct sk_buff *skb);
 
 void iriap_send_ack( struct iriap_cb *self);
-void iriap_data_indication( void *instance, void *sap, struct sk_buff *skb);
-void iriap_connect_confirm( void *instance, void *sap, struct qos_info *qos, 
-                           int max_sdu_size, struct sk_buff *skb);
-void iriap_connect_indication( void *instance, void *sap, 
-                              struct qos_info *qos, int max_sdu_size,
-                              struct sk_buff *skb);
-void iriap_call_indication( struct iriap_cb *self, struct sk_buff *skb);
+void iriap_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
+                          __u32 max_sdu_size, struct sk_buff *skb);
+void iriap_call_indication(struct iriap_cb *self, struct sk_buff *skb);
 
 void iriap_register_server(void);
 
diff --git a/include/net/irda/irkbd.h b/include/net/irda/irkbd.h
new file mode 100644 (file)
index 0000000..819df24
--- /dev/null
@@ -0,0 +1,91 @@
+/*********************************************************************
+ *                
+ * Filename:      irkbd.h
+ * Version:       0.2
+ * Description:   IrDA Keyboard/Mouse driver (Tekram IR-660)
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Mon Mar  1 00:24:19 1999
+ * Modified at:   Thu Mar 11 14:54:00 1999
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *      
+ *     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.
+ *  
+ *     Neither Dag Brattli nor University of Tromsø admit liability nor
+ *     provide warranty for any of this software. This material is 
+ *     provided "AS-IS" and at no charge.
+ *     
+ ********************************************************************/
+
+#ifndef IRKBD_H
+#define IRKBD_H
+
+/* Some commands */
+#define IRKBD_CMD_INIT_KBD   0xfe
+#define IRKBD_CMD_INIT_MOUSE 0xff
+#define IRKBD_CMD_ENABLE     0x41
+#define IRKBD_CMD_LED        0x31
+#define IRKBD_CMD_KDB_SPEED  0x33
+
+/* Some responses */
+#define IRKBD_RSP_KBDOK      0x11
+#define IRKBD_RSP_KBDERR     0x12
+#define IRKBD_RSP_MSOK       0x21
+#define IRKBD_RSP_MSERR      0x22
+#define IRKBD_RSP_LEDOK      0x31
+#define IRKBD_RSP_KBDSPEEDOK 0x33
+#define IRKBD_RSP_RSPN41     0x41
+
+#define IRKBD_RATE       2 /* Polling rate, should be 15 ms */
+#define IRKBD_TIMEOUT  100 /* 1000 ms */
+
+#define SUBFRAME_MASK     0xc0
+#define SUBFRAME_MOUSE    0x80
+#define SUBFRAME_KEYBOARD 0x40
+#define SUBFRAME_RESPONSE 0x00
+
+#define IRKBD_MAX_HEADER (TTP_HEADER+LMP_HEADER+LAP_HEADER)
+
+#define IRKBD_BUF_SIZE 4096 /* Must be power of 2! */
+
+enum {
+       IRKBD_IDLE,       /* Not connected */
+       IRKBD_INIT_KBD,   /* Initializing keyboard */
+       IRKBD_INIT_MOUSE, /* Initializing mouse */
+       IRKBD_POLLING,    /* Polling device */
+};
+
+/* Main structure */
+struct irkbd_cb {
+       struct miscdevice dev;
+       char devname[9];    /* name of the registered device */
+       int state;
+
+       int count;          /* Open count */
+
+       __u32 saddr;        /* my local address */
+       __u32 daddr;        /* peer address */
+
+       struct tsap_cb *tsap;           
+       __u8 dtsap_sel;     /* remote TSAP address */
+       __u8 stsap_sel;     /* local TSAP address */
+
+       struct timer_list watchdog_timer;
+
+       LOCAL_FLOW tx_flow;
+       LOCAL_FLOW rx_flow;
+
+       __u8 scancodes[IRKBD_BUF_SIZE]; /* Buffer for mouse events */
+       int head;
+       int tail;
+
+       struct wait_queue *read_wait;
+       struct fasync_struct *async;
+};
+
+#endif /* IRKBD_H */
index 547868c6a26b4eddcd9f8da60599f8c4b519eea1..a2d65155712da2ee6e70f5b3d3ef60157fe5dfee 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb  3 14:29:49 1999
+ * Modified at:   Thu Feb 25 21:05:53 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -33,7 +33,7 @@
 #include <net/irda/irlan_event.h>
 
 void irlan_client_start_kick_timer(struct irlan_cb *self, int timeout);
-void irlan_client_discovery_indication(DISCOVERY*);
+void irlan_client_discovery_indication(discovery_t *);
 void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr);
 
 void irlan_client_open_ctrl_tsap( struct irlan_cb *self);
index a07fdfd2f365b85011acbbe6b8e93dfed18dcfab..f3103628e4c70e2dd52392898ff75dac27b2a76c 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb 17 23:28:53 1999
+ * Modified at:   Tue Apr  6 16:19:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -25,6 +25,8 @@
 #ifndef IRLAN_H
 #define IRLAN_H
 
+#include <asm/param.h>  /* for HZ */
+
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/skbuff.h>
@@ -34,7 +36,7 @@
 #include <net/irda/irttp.h>
 
 #define IRLAN_MTU        1518
-#define IRLAN_TIMEOUT    1000
+#define IRLAN_TIMEOUT    10*HZ /* 10 seconds */
 
 /* Command packet types */
 #define CMD_GET_PROVIDER_INFO   0
index 4cc2b12a875c0bbcdab669bbf0c15783a7bca10b..257a719f460396397133ebfdc999f231557ab186 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Oct 15 08:36:58 1998
- * Modified at:   Fri Jan 29 15:20:45 1999
+ * Modified at:   Mon Mar 22 12:57:11 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -25,8 +25,8 @@
 #ifndef IRLAN_ETH_H
 #define IRLAN_ETH_H
 
-void irlan_eth_receive( void *instance, void *sap, struct sk_buff *skb);
-int  irlan_eth_xmit( struct sk_buff *skb, struct device *dev);
+int  irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb);
+int  irlan_eth_xmit(struct sk_buff *skb, struct device *dev);
 
 void irlan_eth_flow_indication( void *instance, void *sap, LOCAL_FLOW flow);
 
index a95b490955dec9884ef4a23c078930fd59aa92f5..05b6736173eaeaffe766385608498342c7c4bd8e 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Sat Jan 30 16:22:24 1999
+ * Modified at:   Mon Mar  8 15:32:35 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -40,7 +40,8 @@ void irlan_provider_ctrl_data_indication(void *instance, void *sap,
                                         struct sk_buff *skb);
 
 void irlan_provider_connect_indication(void *instance, void *sap, 
-                                      struct qos_info *qos, int max_sdu_size,
+                                      struct qos_info *qos, 
+                                      __u32 max_sdu_size,
                                       struct sk_buff *skb);
 void irlan_provider_connect_response(struct irlan_cb *, struct tsap_cb *);
 
index dd958b86b51d945665eebb8348cedabc98056d3a..1de71bfd118be2da7cda3a599062713d2a4b6976 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Mon Jan 25 13:58:59 1999
+ * Modified at:   Fri Mar 26 15:15:17 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -157,23 +157,19 @@ struct irlap_cb {
 
        int discovery_count;
        hashbin_t *discovery_log;
-       DISCOVERY *discovery_cmd;
+       discovery_t *discovery_cmd;
 
        struct qos_info qos_tx;    /* QoS requested by peer */
        struct qos_info qos_rx;    /* QoS requested by self */
 
        struct notify_t notify; /* Callbacks to IrLMP */
 
-       int     mtt_required;  /* Minumum turnaround time required */
-       int     xbofs_delay;   /* Nr of XBOF's used to MTT */
-       int     bofs_count;    /* Negotiated extra BOFs */
+       int    mtt_required;  /* Minumum turnaround time required */
+       int    xbofs_delay;   /* Nr of XBOF's used to MTT */
+       int    bofs_count;    /* Negotiated extra BOFs */
 
        struct irda_statistics stats;
 
-#ifdef CONFIG_IRDA_RECYCLE_RR
-       struct sk_buff *recycle_rr_skb;
-#endif
-
 #ifdef CONFIG_IRDA_COMPRESSION
        struct irda_compressor compressor;
         struct irda_compressor decompressor;
@@ -210,9 +206,9 @@ void irlap_status_indication( int quality_of_link);
 
 void irlap_test_request( __u8 *info, int len);
 
-void irlap_discovery_request( struct irlap_cb *, DISCOVERY *discovery);
-void irlap_discovery_confirm( struct irlap_cb *, hashbin_t *discovery_log);
-void irlap_discovery_indication( struct irlap_cb *, DISCOVERY *discovery);
+void irlap_discovery_request(struct irlap_cb *, discovery_t *discovery);
+void irlap_discovery_confirm(struct irlap_cb *, hashbin_t *discovery_log);
+void irlap_discovery_indication(struct irlap_cb *, discovery_t *discovery);
 
 void irlap_reset_indication( struct irlap_cb *self);
 void irlap_reset_confirm(void);
index db77cf5d93673516e591cd780e6bdd78c61830a6..015814b45f0375a7f8a6185065f201b0c2295c82 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Aug 16 00:59:29 1997
- * Modified at:   Thu Feb 11 00:41:02 1999
+ * Modified at:   Tue Apr  6 17:10:38 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -25,7 +25,8 @@
 #ifndef IRLAP_EVENT_H
 #define IRLAP_EVENT_H
 
-#include "irmod.h"
+#include <net/irda/irda.h>
+#include <net/irda/discovery.h>
 
 struct irlap_cb;
 
@@ -67,6 +68,7 @@ typedef enum {
        RECV_DISCOVERY_XID_RSP,
        RECV_SNRM_CMD,
        RECV_TEST_CMD,
+       RECV_TEST_RSP,
        RECV_UA_RSP,
        RECV_DM_RSP,
        RECV_I_CMD,
@@ -108,7 +110,7 @@ struct irlap_info {
        int  slot;     /* Random chosen slot */
        int  s;        /* Current slot */
 
-       DISCOVERY *discovery; /* Discovery information */
+       discovery_t *discovery; /* Discovery information */
 };
 
 extern const char *irlap_state[];
index 6b661e4b5d2927bc8a5cf0c70f98288aba06fc95..7db0825f7d76c71506e132ece351920a1690abd2 100644 (file)
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlap_frame.h
- * Version:       0.3
+ * Version:       0.9
  * Description:   Build and transmit IrLAP frames
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 10:27:26 1997
- * Modified at:   Mon Dec 14 14:22:23 1998
+ * Modified at:   Fri Mar 26 14:10:53 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -27,7 +27,7 @@
 
 #include <linux/skbuff.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/irlap.h>
 #include <net/irda/qos.h>
 
 #define I_FRAME   0x00 /* Information Format */
 #define UI_FRAME  0x03 /* Unnumbered Information */
 
-#define CMD_FRAME  0x01
-#define RSP_FRAME  0x00
+#define CMD_FRAME 0x01
+#define RSP_FRAME 0x00
 
-#define PF_BIT 0x10 /* Poll/final bit */
-
-#define IR_S                  0x01    /* Supervisory frames */
-#define IR_RR                 0x01    /* Receiver ready */
-#define IR_RNR                0x05    /* Receiver not ready */
-#define IR_REJ                0x09    /* Reject */
-#define IR_U                  0x03    /* Unnumbered frames */
-#define IR_SNRM               0x2f    /* Set Asynchronous Balanced Mode */
-
-#define IR_DISC               0x43    /* Disconnect */
-#define IR_DM                 0x0f    /* Disconnected mode */
-#define IR_UA                 0x63    /* Unnumbered acknowledge */
-#define IR_FRMR               0x87    /* Frame reject */
-#define IR_UI                 0x03    /* Unnumbered information */
+#define PF_BIT    0x10 /* Poll/final bit */
 
 struct xid_frame {
-       __u8  caddr     __attribute__((packed)); /* Connection address */
-       __u8  control   __attribute__((packed));
-       __u8  ident     __attribute__((packed)); /* Should always be XID_FORMAT */ 
-       __u32 saddr     __attribute__((packed)); /* Source device address */
-       __u32 daddr     __attribute__((packed)); /* Destination device address */
-       __u8  flags     __attribute__((packed)); /* Discovery flags */
-       __u8  slotnr    __attribute__((packed));
-       __u8  version   __attribute__((packed));
-       __u8  discovery_info[0]  __attribute__((packed));
-};
+       __u8  caddr; /* Connection address */
+       __u8  control;
+       __u8  ident; /* Should always be XID_FORMAT */ 
+       __u32 saddr; /* Source device address */
+       __u32 daddr; /* Destination device address */
+       __u8  flags; /* Discovery flags */
+       __u8  slotnr;
+       __u8  version;
+       __u8  discovery_info[0];
+} PACK;
 
 struct test_frame {
        __u8 caddr;          /* Connection address */
        __u8 control;
-       __u8 saddr;          /* Source device address */
-       __u8 daddr;          /* Destination device address */
-       __u8 *info;          /* Information */
-};
+       __u32 saddr;         /* Source device address */
+       __u32 daddr;         /* Destination device address */
+       __u8 info[0];        /* Information */
+} PACK;
 
 struct ua_frame {
-       __u8 caddr   __attribute__((packed));
-       __u8 control __attribute__((packed));
+       __u8 caddr;
+       __u8 control;
 
-       __u32 saddr     __attribute__((packed)); /* Source device address */
-       __u32 daddr     __attribute__((packed)); /* Dest device address */
+       __u32 saddr; /* Source device address */
+       __u32 daddr; /* Dest device address */
        __u8  params[0];
-};
+} PACK;
        
 struct i_frame {
-       __u8 caddr   __attribute__((packed));
-       __u8 control __attribute__((packed));
-       __u8 data[0] __attribute__((packed));
-};
+       __u8 caddr;
+       __u8 control;
+       __u8 data[0];
+} PACK;
 
 struct snrm_frame {
-       __u8  caddr   __attribute__((packed));
-       __u8  control __attribute__((packed));
-       __u32 saddr   __attribute__((packed));
-       __u32 daddr   __attribute__((packed));
-       __u8  ncaddr  __attribute__((packed));
+       __u8  caddr;
+       __u8  control;
+       __u32 saddr;
+       __u32 daddr;
+       __u8  ncaddr;
        __u8  params[0];
-};
+} PACK;
 
 /* Per-packet information we need to hide inside sk_buff */
 struct irlap_skb_cb {
+       int magic; /* Be sure that we can trust the information */
        int mtt;   /* minimum turn around time */
        int xbofs; /* number of xbofs required */
        int vs;    /* next frame to send */
@@ -132,8 +120,10 @@ struct irlap_skb_cb {
 __inline__ void irlap_insert_mtt( struct irlap_cb *self, struct sk_buff *skb);
 
 void irlap_send_discovery_xid_frame( struct irlap_cb *, int S, __u8 s, 
-                                    __u8 command, DISCOVERY *discovery);
+                                    __u8 command, discovery_t *discovery);
 void irlap_send_snrm_frame( struct irlap_cb *, struct qos_info *);
+void irlap_send_test_frame(struct irlap_cb *self, __u32 daddr, 
+                          struct sk_buff *cmd);
 void irlap_send_ua_response_frame( struct irlap_cb *, struct qos_info *);
 void irlap_send_ui_frame( struct irlap_cb *self, struct sk_buff *skb,
                          int command);
@@ -150,6 +140,4 @@ void irlap_resend_rejected_frames( struct irlap_cb *, int command);
 void irlap_send_i_frame( struct irlap_cb *, struct sk_buff *, int command);
 void irlap_send_ui_frame( struct irlap_cb *, struct sk_buff *, int command);
 
-/* void irlap_input( struct irlap_cb *self, struct sk_buff *skb); */
-
 #endif
index 82690a34aed5b619efabd6bbf2fd05f7775e65c2..b5c9daae41c8d5cc258bcbf25833b93ba982996a 100644 (file)
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlmp.h
- * Version:       0.3
+ * Version:       0.9
  * Description:   IrDA Link Management Protocol (LMP) layer
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 17 20:54:32 1997
- * Modified at:   Thu Feb  4 11:06:24 1999
+ * Modified at:   Tue Apr  6 20:05:14 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
 #ifndef IRLMP_H
 #define IRLMP_H
 
+#include <asm/param.h>  /* for HZ */
+
 #include <linux/config.h>
 #include <linux/types.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/qos.h>
 #include <net/irda/irlap.h>
 #include <net/irda/irlmp_event.h>
 #include <net/irda/irqueue.h>
+#include <net/irda/discovery.h>
 
 /* LSAP-SEL's */
 #define LSAP_MASK     0x7f
 
 #define LM_MAX_CONNECTIONS  10
 
-/* Hint bit positions for first hint byte */
-#define HINT_PNP         0x01
-#define HINT_PDA         0x02
-#define HINT_COMPUTER    0x04
-#define HINT_PRINTER     0x08
-#define HINT_MODEM       0x10
-#define HINT_FAX         0x20
-#define HINT_LAN         0x40
-#define HINT_EXTENSION   0x80
-
-/* Hint bit positions for second hint byte (first extension byte) */
-#define HINT_TELEPHONY   0x01
-#define HINT_FILE_SERVER 0x02
-#define HINT_COMM        0x04
-#define HINT_MESSAGE     0x08
-#define HINT_HTTP        0x10
-#define HINT_OBEX        0x20
-
-#define LM_IDLE_TIMEOUT  200 /* 2 seconds for now */
+#define LM_IDLE_TIMEOUT     2*HZ /* 2 seconds for now */
 
 typedef enum {
        S_PNP,
@@ -84,23 +69,27 @@ typedef enum {
        S_TELEPHONY,
        S_COMM,
        S_OBEX,
+       S_ANY,
+       S_END,
 } SERVICE;
 
-#define S_END 0xff
+typedef void (*DISCOVERY_CALLBACK1) (discovery_t *);
+typedef void (*DISCOVERY_CALLBACK2) (hashbin_t *);
 
-#define CLIENT 1
-#define SERVER 2
+typedef struct {
+       QUEUE queue; /* Must be first */
 
-typedef void (*DISCOVERY_CALLBACK) ( DISCOVERY*);
+       __u16 hints; /* Hint bits */
+} irlmp_service_t;
 
-struct irlmp_registration {
+typedef struct {
        QUEUE queue; /* Must be first */
 
-       int service; /* LAN, OBEX, COMM etc. */
-       int type;    /* Client or server or both */
+       __u16 hint_mask;
 
-       DISCOVERY_CALLBACK discovery_callback;
-};
+       DISCOVERY_CALLBACK1 callback1;
+       DISCOVERY_CALLBACK2 callback2;
+} irlmp_client_t;
 
 struct lap_cb; /* Forward decl. */
 
@@ -142,17 +131,13 @@ struct lap_cb {
 
        IRLMP_STATE lap_state;
 
-       struct irlap_cb *irlap; /* Instance of IrLAP layer */
-
+       struct irlap_cb *irlap;    /* Instance of IrLAP layer */
        hashbin_t *lsaps;         /* LSAP associated with this link */
 
-       __u8  caddr;            /* Connection address */
-
+       __u8  caddr;  /* Connection address */
        __u32 saddr;  /* Source device address */
        __u32 daddr;  /* Destination device address */
        
-       hashbin_t *cachelog;    /* Discovered devices for this link */
-
        struct qos_info *qos;  /* LAP QoS for this session */
        struct timer_list idle_timer;
 };
@@ -176,8 +161,8 @@ struct irlmp_cb {
 
        __u8 conflict_flag;
        
-       DISCOVERY  discovery_cmd; /* Discovery command to use by IrLAP */
-       DISCOVERY  discovery_rsp; /* Discovery response to use by IrLAP */
+       discovery_t discovery_cmd; /* Discovery command to use by IrLAP */
+       discovery_t discovery_rsp; /* Discovery response to use by IrLAP */
 
        int free_lsap_sel;
 
@@ -188,25 +173,34 @@ struct irlmp_cb {
 
        hashbin_t *links;         /* IrLAP connection table */
        hashbin_t *unconnected_lsaps;
-       hashbin_t *registry;
+       hashbin_t *clients;
+       hashbin_t *services;
+
+       hashbin_t *cachelog;
+       int running;
 
-       __u8 hint[2]; /* Hint bits */
+       spinlock_t lock;
+
+       __u16_host_order hints; /* Hint bits */
 };
 
 /* Prototype declarations */
 int  irlmp_init(void);
 void irlmp_cleanup(void);
-
 struct lsap_cb *irlmp_open_lsap( __u8 slsap, struct notify_t *notify);
 void irlmp_close_lsap( struct lsap_cb *self);
 
-void irlmp_register_layer( int service, int type, int do_discovery, 
-                             DISCOVERY_CALLBACK);
-void irlmp_unregister_layer( int service, int type);
+__u16 irlmp_service_to_hint(int service);
+__u32 irlmp_register_service(__u16 hints);
+int irlmp_unregister_service(__u32 handle);
+__u32 irlmp_register_client(__u16 hint_mask, DISCOVERY_CALLBACK1 callback1,
+                           DISCOVERY_CALLBACK2 callback2);
+int irlmp_unregister_client(__u32 handle);
+int irlmp_update_client(__u32 handle, __u16 hint_mask, 
+                       DISCOVERY_CALLBACK1, DISCOVERY_CALLBACK2);
 
-void irlmp_register_irlap( struct irlap_cb *self, __u32 saddr, 
-                          struct notify_t *);
-void irlmp_unregister_irlap( __u32 saddr);
+void irlmp_register_link(struct irlap_cb *, __u32 saddr, struct notify_t *);
+void irlmp_unregister_link(__u32 saddr);
 
 int  irlmp_connect_request( struct lsap_cb *, __u8 dlsap_sel, 
                            __u32 saddr, __u32 daddr,
@@ -214,16 +208,16 @@ int  irlmp_connect_request( struct lsap_cb *, __u8 dlsap_sel,
 void irlmp_connect_indication( struct lsap_cb *self, struct sk_buff *skb);
 void irlmp_connect_response( struct lsap_cb *, struct sk_buff *);
 void irlmp_connect_confirm( struct lsap_cb *, struct sk_buff *);
+struct lsap_cb *irlmp_dup(struct lsap_cb *self, void *instance);
 
+void irlmp_disconnect_indication(struct lsap_cb *self, LM_REASON reason, 
+                                struct sk_buff *userdata);
+void irlmp_disconnect_request(struct lsap_cb *, struct sk_buff *userdata);
 
-void irlmp_disconnect_indication( struct lsap_cb *self, LM_REASON reason, 
-                                 struct sk_buff *userdata);
-void irlmp_disconnect_request( struct lsap_cb *, struct sk_buff *userdata);
-
-void irlmp_discovery_confirm( struct lap_cb *, hashbin_t *discovery_log);
-void irlmp_discovery_indication( struct lap_cb *, DISCOVERY *discovery);
-void irlmp_discovery_request( int nslots);
-DISCOVERY *irlmp_get_discovery_response(void);
+void irlmp_discovery_confirm(hashbin_t *discovery_log);
+void irlmp_discovery_request(int nslots);
+void irlmp_do_discovery(int nslots);
+discovery_t *irlmp_get_discovery_response(void);
 
 void irlmp_data_request( struct lsap_cb *, struct sk_buff *);
 void irlmp_udata_request( struct lsap_cb *, struct sk_buff *);
@@ -240,9 +234,11 @@ LM_REASON irlmp_convert_lap_reason( LAP_REASON);
 __u32 irlmp_get_saddr(struct lsap_cb *self);
 __u32 irlmp_get_daddr(struct lsap_cb *self);
 
-
 extern char *lmp_reasons[];
 extern int sysctl_discovery_slots;
+extern int sysctl_discovery;
 extern struct irlmp_cb *irlmp;
 
+static inline hashbin_t *irlmp_get_cachelog(void) { return irlmp->cachelog; }
+
 #endif
index 88076a9709288dbecef4d46be5f966a4f364aec9..b836279835ad8575901e112f6173eb7e6a053cdf 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Thu Feb 11 00:42:41 1999
+ * Modified at:   Thu Feb 25 20:49:16 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -92,7 +92,7 @@ struct irlmp_event {
 
        int reason;
 
-       DISCOVERY *discovery;
+       discovery_t *discovery;
 };
 
 extern const char *irlmp_state[];
index 84e5136c7464168a32385ae7e5501aa96ea86b73..d0584f1a76373980fde8a18f56684883f019d2ee 100644 (file)
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlmp_frame.h
- * Version:       0.1
+ * Version:       0.9
  * Description:   
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 02:09:59 1997
- * Modified at:   Tue Feb  2 11:07:45 1999
+ * Modified at:   Tue Apr  6 17:12:57 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
 
 #include <linux/skbuff.h>
 
-/* Frame opcodes */
+#include <net/irda/discovery.h>
+
+/* IrLMP frame opcodes */
 #define CONNECT_CMD    0x01
 #define CONNECT_CNF    0x81
 #define DISCONNECT     0x02
 #define ACCESSMODE_CMD 0x03
 #define ACCESSMODE_CNF 0x83
 
-#define CONTROL_BIT 0x80
+#define CONTROL_BIT    0x80
 
-inline void irlmp_send_data_pdu( struct lap_cb *self, __u8 dlsap, __u8 slsap, 
-                                int expedited, struct sk_buff *skb);
-void irlmp_send_lcf_pdu( struct lap_cb *self, __u8 dlsap, __u8 slsap, 
-                        __u8 opcode, struct sk_buff *skb);
-void irlmp_link_data_indication( struct lap_cb *, int reliable, 
-                                struct sk_buff *);
-void irlmp_link_connect_indication( struct lap_cb *, __u32 saddr, __u32 daddr,
-                                   struct qos_info *qos, struct sk_buff *skb);
-void irlmp_link_connect_request( __u32 daddr);
-void irlmp_link_connect_confirm( struct lap_cb *self, struct qos_info *qos, 
-                                struct sk_buff *skb);
-void irlmp_link_disconnect_indication( struct lap_cb *self, 
-                                      struct irlap_cb *irlap, 
-                                      LAP_REASON reason, 
-                                      struct sk_buff *); 
-void irlmp_link_discovery_confirm( struct lap_cb *self, hashbin_t *log);
-/* void irlmp_link_disconnect_request( void); */
+inline void irlmp_send_data_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap, 
+                               int expedited, struct sk_buff *skb);
+void irlmp_send_lcf_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap, 
+                       __u8 opcode, struct sk_buff *skb);
+void irlmp_link_data_indication(struct lap_cb *, int reliable, 
+                               struct sk_buff *);
+void irlmp_link_connect_indication(struct lap_cb *, __u32 saddr, __u32 daddr,
+                                  struct qos_info *qos, struct sk_buff *skb);
+void irlmp_link_connect_request(__u32 daddr);
+void irlmp_link_connect_confirm(struct lap_cb *self, struct qos_info *qos, 
+                               struct sk_buff *skb);
+void irlmp_link_disconnect_indication(struct lap_cb *, struct irlap_cb *, 
+                                     LAP_REASON reason, struct sk_buff *); 
+void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log);
+void irlmp_link_discovery_indication(struct lap_cb *, discovery_t *discovery);
 
 #endif
index 52d49330affe497787ae04e8c9c6199ab772627d..4605b1b7799ae655adc780b8f6c4a00aa1f00ce2 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Dec 15 13:58:52 1997
- * Modified at:   Thu Feb 11 15:14:30 1999
+ * Modified at:   Tue Mar 16 22:27:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  *
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -29,7 +29,6 @@
 #include <linux/miscdevice.h>
 
 #include <net/irda/irqueue.h>
-#include <net/irda/qos.h>
 
 #define IRMGR_IOC_MAGIC 'm'
 #define IRMGR_IOCTNPC     _IO(IRMGR_IOC_MAGIC, 1)
@@ -45,7 +44,6 @@ typedef enum {
        EVENT_IRLAN_STOP,
        EVENT_IRLPT_START,
        EVENT_IRLPT_STOP,
-/*     EVENT_IROBEX_INIT, */
        EVENT_IROBEX_START,
        EVENT_IROBEX_STOP,
        EVENT_IRDA_STOP,
@@ -100,176 +98,28 @@ struct irda_cb {
        QUEUE *todo_queue;  /* Todo list */
 };
 
-typedef struct {
-        char irda_call[7];  /* 6 call + SSID (shifted ascii!) */
-} irda_address;
-
-struct sockaddr_irda {
-       short sirda_family;
-       irda_address sirda_call;
-        int sirda_ndigis;
-};
-
-/*
- *  This type is used by the protocols that transmit 16 bits words in 
- *  little endian format. A little endian machine stores MSB of word in
- *  byte[1] and LSB in byte[0]. A big endian machine stores MSB in byte[0] 
- *  and LSB in byte[1].
- */
-typedef union {
-       __u16 word;
-       __u8  byte[2];
-} __u16_host_order;
-
-/*
- *  Information monitored by some layers
- */
-struct irda_statistics
-{
-        int     rx_packets;             /* total packets received       */
-        int     tx_packets;             /* total packets transmitted    */
-        int     rx_errors;              /* bad packets received         */
-        int     tx_errors;              /* packet transmit problems     */
-        int     rx_dropped;             /* no space in linux buffers    */
-        int     tx_dropped;             /* no space available in linux  */
-       int     rx_compressed;
-       int     tx_compressed;
-       int     rx_bytes;               /* total bytes received         */
-       int     tx_bytes;               /* total bytes transmitted      */
-
-        int     multicast;              /* multicast packets received   */
-        int     collisions;
-       
-        /* detailed rx_errors: */
-        int     rx_length_errors;
-        int     rx_over_errors;         /* receiver ring buff overflow  */
-        int     rx_crc_errors;          /* recved pkt with crc error    */
-        int     rx_frame_errors;        /* recv'd frame alignment error */
-        int     rx_fifo_errors;         /* recv'r fifo overrun          */
-        int     rx_missed_errors;       /* receiver missed packet       */
-
-        /* detailed tx_errors */
-        int     tx_aborted_errors;
-        int     tx_carrier_errors;
-        int     tx_fifo_errors;
-        int     tx_heartbeat_errors;
-        int     tx_window_errors;
-};
-
-typedef enum {
-       NO_CHANGE,
-       LOCKED,
-       UNLOCKED,
-} LOCK_STATUS;
-
-/* Misc status information */
-typedef enum {
-       STATUS_OK,
-       STATUS_ABORTED,
-       STATUS_NO_ACTIVITY,
-       STATUS_NOISY,
-       STATUS_REMOTE,
-} LINK_STATUS;
-
-typedef enum { /* FIXME check the two first reason codes */
-       LAP_DISC_INDICATION=1, /* Received a disconnect request from peer */
-       LAP_NO_RESPONSE,       /* To many retransmits without response */
-       LAP_RESET_INDICATION,  /* To many retransmits, or invalid nr/ns */
-       LAP_FOUND_NONE,        /* No devices were discovered */
-       LAP_MEDIA_BUSY,
-       LAP_PRIMARY_CONFLICT,
-} LAP_REASON;
+int irmod_init_module(void);
+void irmod_cleanup_module(void);
 
-/*  
- *  IrLMP disconnect reasons. The order is very important, since they 
- *  correspond to disconnect reasons sent in IrLMP disconnect frames, so
- *  please do not touch :-)
- */
-typedef enum {
-       LM_USER_REQUEST = 1,  /* User request */
-       LM_LAP_DISCONNECT,    /* Unexpected IrLAP disconnect */
-       LM_CONNECT_FAILURE,   /* Failed to establish IrLAP connection */
-       LM_LAP_RESET,         /* IrLAP reset */
-       LM_INIT_DISCONNECT,   /* Link Management initiated disconnect */
-       LM_LSAP_NOTCONN,      /* Data delivered on unconnected LSAP */
-       LM_NON_RESP_CLIENT,   /* Non responsive LM-MUX client */
-       LM_NO_AVAIL_CLIENT,   /* No available LM-MUX client */
-       LM_CONN_HALF_OPEN,    /* Connection is half open */
-       LM_BAD_SOURCE_ADDR,   /* Illegal source address (i.e 0x00) */
-} LM_REASON;
-#define LM_UNKNOWN 0xff       /* Unspecified disconnect reason */
+inline int irda_lock(int *lock);
+inline int irda_unlock(int *lock);
 
-/*
- *  IrLMP character code values
- */
-#define CS_ASCII       0x00
-#define        CS_ISO_8859_1  0x01
-#define        CS_ISO_8859_2  0x02
-#define        CS_ISO_8859_3  0x03
-#define        CS_ISO_8859_4  0x04
-#define        CS_ISO_8859_5  0x05
-#define        CS_ISO_8859_6  0x06
-#define        CS_ISO_8859_7  0x07
-#define        CS_ISO_8859_8  0x08
-#define        CS_ISO_8859_9  0x09
-#define CS_UNICODE     0xff
-       
-/*
- * The DISCOVERY structure is used for both discovery requests and responses
- */
-#define DISCOVERY struct discovery_t
-struct discovery_t {
-       QUEUE queue;              /* Must be first! */
+void irda_notify_init(struct notify_t *notify);
 
-       __u32      saddr;        /* Which link the device was discovered */
-       __u32      daddr;        /* Remote device address */
-       LAP_REASON condition;    /* More info about the discovery */
+void irda_execute_as_process(void *self, TODO_CALLBACK callback, __u32 param);
+void irmanager_notify(struct irmanager_event *event);
 
-       __u8       hint[2];      /* Discovery hint bits */
-       __u8       charset;
-       char       info[32];     /* Usually the name of the device */
-       __u8       info_len;     /* Length of device info field */
+extern void irda_proc_modcount(struct inode *, int);
+void irda_mod_inc_use_count(void);
+void irda_mod_dec_use_count(void);
 
-       int        gen_addr_bit; /* Need to generate a new device address? */
-       int        nslots;       /* Number of slots to use when discovering */
-};
+#endif /* IRMOD_H */
 
-typedef enum { FLOW_STOP, FLOW_START } LOCAL_FLOW;
 
-/*
- *  Notify structure used between transport and link management layers
- */
-struct notify_t {
-       void (*data_indication)( void *instance, void *sap, 
-                                struct sk_buff *skb);
-       void (*udata_indication)( void *instance, void *sap, 
-                                 struct sk_buff *skb);
-       void (*connect_confirm)( void *instance, void *sap, 
-                                struct qos_info *qos, int max_sdu_size,
-                                struct sk_buff *skb);
-       void (*connect_indication)( void *instance, void *sap, 
-                                   struct qos_info *qos, int max_sdu_size,
-                                   struct sk_buff *skb);
-       void (*disconnect_indication)( void *instance, void *sap, 
-                                      LM_REASON reason, struct sk_buff *);
-       void (*flow_indication)( void *instance, void *sap, LOCAL_FLOW flow);
-       void *instance; /* Layer instance pointer */
-       char name[16];  /* Name of layer */
-};
 
-#define NOTIFY_MAX_NAME 16
 
-int irmod_init_module(void);
-void irmod_cleanup_module(void);
 
-inline int irda_lock(int *lock);
-inline int irda_unlock(int *lock);
 
-void irda_notify_init(struct notify_t *notify);
 
-void irda_execute_as_process(void *self, TODO_CALLBACK callback, __u32 param);
-void irmanager_notify(struct irmanager_event *event);
 
-extern void irda_proc_modcount(struct inode *, int);
 
-#endif
index b07da06abe82eac902aaeb04951b22ee29768ccc..0a5adcfbb42a6a593a9b18fb871334adfc2e8795 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Jul  4 22:43:57 1998
- * Modified at:   Tue Jan 26 11:49:55 1999
+ * Modified at:   Thu Mar 11 16:11:54 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -70,6 +70,9 @@ struct irobex_cb {
        __u32 daddr;        /* peer address */
        unsigned long time_discovered;
 
+       __u32 ckey;           /* IrLMP client handle */
+       __u32 skey;           /* IrLMP service handle */
+
         char devname[9];    /* name of the registered device */
        struct tsap_cb *tsap;
        int eof;
index 0551e3b523c6f19f6897fd55b3096c759cf320c3..1e208ccf460878e533ada0e79e88b656bed105ed 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Jun  9 13:26:50 1998
- * Modified at:   Sun Oct 25 00:26:31 1998
+ * Modified at:   Thu Feb 25 20:34:21 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (C) 1998, Aage Kvalnes <aage@cs.uit.no>
@@ -30,7 +30,7 @@
 #include <linux/types.h>
 #include <asm/spinlock.h>
 
-#include <net/irda/irda.h>
+/* #include <net/irda/irda.h> */
 
 #ifndef QUEUE_H
 #define QUEUE_H
 #define HASHBIN_SIZE   8
 #define HASHBIN_MASK   0x7
 
+#ifndef ALIGN 
+#define ALIGN __attribute__((aligned))
+#endif
+
 typedef void (*FREE_FUNC)( void *arg);
 
 /*
index 4b75d8fa654f79473c3c8d8ec8cdb8e778105bc4..78fab8a88447c053d97b3d67a8607be4473232a0 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:31 1997
- * Modified at:   Tue Feb  2 10:55:18 1999
+ * Modified at:   Mon Mar 22 13:17:30 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -27,8 +27,9 @@
 
 #include <linux/types.h>
 #include <linux/skbuff.h>
+#include <asm/spinlock.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/qos.h>
 #include <net/irda/irqueue.h>
@@ -50,6 +51,7 @@
 #define P_HIGH      1
 
 #define SAR_DISABLE 0
+#define SAR_UNBOUND 0xffffffff
 
 /*
  *  This structure contains all data assosiated with one instance of a TTP 
@@ -79,23 +81,22 @@ struct tsap_cb {
        struct sk_buff_head rx_fragments;
        int tx_queue_lock;
        int rx_queue_lock;
+       spinlock_t lock;
 
        struct notify_t notify;       /* Callbacks to client layer */
 
        struct irda_statistics stats;
        struct timer_list todo_timer; 
        
-       int rx_sdu_busy;     /* RxSdu.busy */
-       int rx_sdu_size;     /* Current size of a partially received frame */
-       int rx_max_sdu_size; /* Max receive user data size */
+       int   rx_sdu_busy;     /* RxSdu.busy */
+       __u32 rx_sdu_size;     /* Current size of a partially received frame */
+       __u32 rx_max_sdu_size; /* Max receive user data size */
 
-       int tx_sdu_busy;     /* TxSdu.busy */
-       int tx_max_sdu_size; /* Max transmit user data size */
+       int tx_sdu_busy;       /* TxSdu.busy */
+       int tx_max_sdu_size;   /* Max transmit user data size */
 
-        int no_defrag;       /* Don't reassemble received fragments */
-
-       int close_pend;      /* Close, but disconnect_pend */
-       int disconnect_pend; /* Disconnect, but still data to send */
+       int close_pend;        /* Close, but disconnect_pend */
+       int disconnect_pend;   /* Disconnect, but still data to send */
        struct sk_buff *disconnect_skb;
 };
 
@@ -115,24 +116,19 @@ int irttp_close_tsap(struct tsap_cb *self);
 int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb);
 int irttp_udata_request(struct tsap_cb *self, struct sk_buff *skb);
 
-void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
-                          __u32 saddr, __u32 daddr,
-                          struct qos_info *qos, int max_sdu_size, 
-                          struct sk_buff *userdata);
+int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
+                         __u32 saddr, __u32 daddr,
+                         struct qos_info *qos, __u32 max_sdu_size, 
+                         struct sk_buff *userdata);
 void irttp_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
-                          int max_sdu_size, struct sk_buff *skb);
-void irttp_connect_response(struct tsap_cb *self, int max_sdu_size, 
+                          __u32 max_sdu_size, struct sk_buff *skb);
+void irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size, 
                            struct sk_buff *userdata);
-
+struct tsap_cb *irttp_dup(struct tsap_cb *self, void *instance);
 void irttp_disconnect_request(struct tsap_cb *self, struct sk_buff *skb,
                              int priority);
 void irttp_flow_request(struct tsap_cb *self, LOCAL_FLOW flow);
 
-static __inline__ void irttp_no_reassemble(struct tsap_cb *self)
-{
-       self->no_defrag = TRUE;
-}
-
 static __inline __u32 irttp_get_saddr(struct tsap_cb *self)
 {
        return irlmp_get_saddr(self->lsap);
index 43d61c9c08be34724d3fec44799a06192d9646a9..1fc7d6b0f6ad11a15031636ef2a127606907cb6f 100644 (file)
  *
  ********************************************************************/
 
-#ifndef IRCOMM_H
-#define IRCOMM_H
+#ifndef IRVTD_H
+#define IRVTD_H
 
 #include <linux/types.h>
 #include <linux/ioctl.h>
 #include <linux/tqueue.h>
+#include <linux/serial.h>
 
 #include <net/irda/irmod.h>
 #include <net/irda/qos.h>
 #define IRVTD_RX_QUEUE_HIGH 10
 #define IRVTD_RX_QUEUE_LOW  2
 
+#define IRCOMM_MAJOR  60;  /* Zero means automatic allocation
+                              60,61,62,and 63 is reserved for experiment */
+#define IRVTD_MINOR 64
+
 
-/*
- * Serial input interrupt line counters -- external structure
- * Four lines can interrupt: CTS, DSR, RI, DCD
- *
- * this structure must be compatible with serial_icounter_struct defined in
- * <linux/serial.h>.
- */
-struct icounter_struct {
-        int cts, dsr, rng, dcd;
-        int reserved[16];
-};
 
 struct irvtd_cb {
 
@@ -53,9 +47,10 @@ struct irvtd_cb {
 
        /* if daddr is NULL, remote device have not been discovered yet */
 
+       int tx_disable;
        int rx_disable;
-       struct sk_buff *txbuff;     /* buffer queue */
-       struct sk_buff_head rxbuff;     /* buffer queue */
+       struct sk_buff *txbuff;     
+       struct sk_buff_head rxbuff; 
        struct ircomm_cb *comm;     /* ircomm instance */
 
        /* 
@@ -63,7 +58,6 @@ struct irvtd_cb {
         * See linux/serial.h
         */
 
-       int baud_base;
        int flags;
        struct tty_struct *tty;
 
@@ -75,30 +69,24 @@ struct irvtd_cb {
        struct wait_queue       *delta_msr_wait;
        struct wait_queue       *tx_wait;
 
-       struct tq_struct        rx_tqueue;
+       struct timer_list       timer;
 
        long pgrp;
        long session;  
-       struct termios normal_termios;
-       struct termios callout_termios;
        unsigned short  closing_wait;     /* time to wait before closing */
        unsigned short  close_delay;
        
+       int custom_divisor;
        int mcr;
        int msr;
        int cts_stoptx;
        int ttp_stoptx;
        int ttp_stoprx;
-       struct icounter_struct icount;
+       int disconnect_pend;
+       struct serial_icounter_struct icount;
        int read_status_mask;
        int ignore_status_mask;
 };
 
 
-/* Debug function */
-
-/* #define CHECK_SKB(skb) check_skb((skb),  __LINE__,__FILE__) */
-
-
-
 #endif
diff --git a/include/net/irda/irvtd_driver.h b/include/net/irda/irvtd_driver.h
deleted file mode 100644 (file)
index 4983b3d..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      irvtd_driver.h
- * Version:       0.1
- * 
- *     Copyright (c) 1998, Takahide Higuchi <thiguchi@pluto.dti.ne.jp>, 
- *     All Rights Reserved.
- *     
- *     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.
- *
- *     I, Takahide Higuchi, provide no warranty for any of this software. 
- *     This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-#include <linux/tty.h>
-
-#include <net/irda/irlap.h>
-#include <net/irda/irlmp.h>
-#include <net/irda/irttp.h>
-
-
-#define VSP_TYPE_NORMAL   1
-#define VSP_TYPE_CALLOUT  2
-#define IRCOMM_MAJOR  60;  /* Zero means automatic allocation
-                              60,61,62,and 63 is reserved for experiment */
-#define IRVTD_MINOR 64
-#define IRVTD_CALLOUT_MINOR 32
-
-#define IRVTD_TYPE_NORMAL 11
-#define IRVTD_TYPE_CALLOUT 12
-
-
-#define IRCOMM_HEADER 1       
-#define IRCOMM_RESERVE LAP_HEADER+LMP_HEADER+TTP_HEADER+IRCOMM_HEADER
-
-
-
-
-
-/*
- * Definitions for ircomm_cb_struct flags field
- *  this section is "stolen" from linux-kernel (drivers/char/serial.c)
- */
-#define IRVTD_ASYNC_HUP_NOTIFY 0x0001 /* Notify getty on hangups and closes 
-                                  on the callout port */
-/* #define IRVTD_ASYNC_FOURPORT  0x0002 */
-/* Set OU1, OUT2 per AST Fourport settings */
-
-#define IRVTD_ASYNC_SAK        0x0004  /* Secure Attention Key (Orange book) */
-
-#define IRVTD_ASYNC_SPLIT_TERMIOS 0x0008 /* Separate termios for dialin/callout */
-
-#define IRVTD_ASYNC_SPD_MASK   0x0030
-#define IRVTD_ASYNC_SPD_HI     0x0010  /* Use 56000 instead of 38400 bps */
-
-#define IRVTD_ASYNC_SPD_VHI    0x0020  /* Use 115200 instead of 38400 bps */
-#define IRVTD_ASYNC_SPD_CUST   0x0030  /* Use user-specified divisor */
-
-#define IRVTD_ASYNC_SKIP_TEST  0x0040  /* Skip UART test during autoconfiguration */
-#define IRVTD_ASYNC_AUTO_IRQ    0x0080  /* Do automatic IRQ during autoconfiguration */
-#define IRVTD_ASYNC_SESSION_LOCKOUT 0x0100 /* Lock out cua opens based on session */
-#define IRVTD_ASYNC_PGRP_LOCKOUT    0x0200  /* Lock out cua opens based on pgrp */
-#define IRVTD_ASYNC_CALLOUT_NOHUP   0x0400 /* Don't do hangups for cua device */
-
-#define IRVTD_ASYNC_FLAGS      0x0FFF  /* Possible legal async flags */
-#define IRVTD_ASYNC_USR_MASK 0x0430    /* Legal flags that non-privileged
-                                * users can set or reset */
-
-/* Internal flags used only by kernel/chr_drv/serial.c */
-#define IRVTD_ASYNC_INITIALIZED        0x80000000 /* Serial port was initialized */
-#define IRVTD_ASYNC_CALLOUT_ACTIVE     0x40000000 /* Call out device is active */
-#define IRVTD_ASYNC_NORMAL_ACTIVE      0x20000000 /* Normal device is active */
-#define IRVTD_ASYNC_BOOT_AUTOCONF      0x10000000 /* Autoconfigure port on bootup */
-#define IRVTD_ASYNC_CLOSING            0x08000000 /* Serial port is closing */
-#define IRVTD_ASYNC_CTS_FLOW           0x04000000 /* Do CTS flow control */
-#define IRVTD_ASYNC_CHECK_CD           0x02000000 /* i.e., CLOCAL */
-#define IRVTD_ASYNC_SHARE_IRQ          0x01000000 /* for multifunction cards */
-
-
-#define IRVTD_ASYNC_CLOSING_WAIT_INF  0
-#define IRVTD_ASYNC_CLOSING_WAIT_NONE 65535
-
-/**************************************/
-
-#define DELTA_DTR 0x01
-#define DELTA_RTS 0x02
-#define MCR_DTR 0x04
-#define MCR_RTS 0x08
-
-#define DELTA_CTS 0x01
-#define DELTA_DSR 0x02
-#define DELTA_RI  0x04 
-#define DELTA_DCD 0x08
-#define MSR_CTS   0x10
-#define MSR_DSR   0x20
-#define MSR_RI    0x40 
-#define MSR_DCD   0x80
-
-#define LSR_OE     0x02    /* Overrun error indicator */
-#define LSR_PE     0x04    /* Parity error indicator */
-#define LSR_FE     0x08    /* Frame error indicator */
-#define LSR_BI     0x01    /* Break interrupt indicator */
-
-
-
-/**************************************/
-
-
-
-
-int irvtd_register_ttydriver(void);
-void irvtd_unregister_ttydriver(void);
-
-void irvtd_flush_chars(struct tty_struct *tty);
-
-
-
-
index 39719b5e3a6e4e2bb98e2c033d19157a0782e65f..6c194a3d40eaee98c4d0d1b512694c4280d7f987 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Aug 16 00:59:29 1997
- * Modified at:   Thu Feb  4 11:05:24 1999
+ * Modified at:   Tue Apr  6 16:17:16 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997, 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -26,6 +26,8 @@
 #ifndef TIMER_H
 #define TIMER_H
 
+#include <asm/param.h>  /* for HZ */
+
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
 #include <net/irda/irlap.h>
 /* 
  *  Timeout definitions, some defined in IrLAP p. 92
  */
-#define POLL_TIMEOUT        45             /* Must never exceed 500 ms */
-#define FINAL_TIMEOUT       50             /* Must never exceed 500 ms */
+#define POLL_TIMEOUT        450*HZ/1000    /* Must never exceed 500 ms */
+#define FINAL_TIMEOUT       500*HZ/1000    /* Must never exceed 500 ms */
 
 /* 
  *  Normally twice of p-timer. Note 3, IrLAP p. 60 suggests at least twice 
  *  duration of the P-timer.
  */
 #define WD_TIMEOUT          POLL_TIMEOUT*2
-#define MEDIABUSY_TIMEOUT   50             /* 500 msec */
+#define MEDIABUSY_TIMEOUT   500*HZ/1000    /* 500 msec */
 
 /*
  *  Slot timer must never exceed 85 ms, and must always be at least 25 ms, 
  *  suggested to  75-85 msec by IrDA lite
  */
-#define SLOT_TIMEOUT             8
-#define QUERY_TIMEOUT          100
+#define SLOT_TIMEOUT            80*HZ/1000
+#define QUERY_TIMEOUT           HZ          /* 1 sec */
 
-#define WATCHDOG_TIMEOUT      2000                /* 20 sec */
+#define WATCHDOG_TIMEOUT        20*HZ       /* 20 sec */
 
-typedef void (*TIMER_CALLBACK)( unsigned long);
+typedef void (*TIMER_CALLBACK)(unsigned long);
 
-void irda_start_timer( struct timer_list *ptimer, int timeout, int data,
-                      TIMER_CALLBACK callback);
+void irda_start_timer(struct timer_list *ptimer, int timeout, int data,
+                     TIMER_CALLBACK callback);
 
-inline void irlap_start_slot_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_query_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_final_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_wd_timer( struct irlap_cb *self, int timeout);
-inline void irlap_start_backoff_timer( struct irlap_cb *self, int timeout);
+inline void irlap_start_slot_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_query_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_final_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_wd_timer(struct irlap_cb *self, int timeout);
+inline void irlap_start_backoff_timer(struct irlap_cb *self, int timeout);
 
-inline void irda_device_start_mbusy_timer( struct irda_device *self);
+inline void irda_device_start_mbusy_timer(struct irda_device *self);
 
 struct lsap_cb;
 struct lap_cb;
-inline void irlmp_start_watchdog_timer( struct lsap_cb *, int timeout);
-inline void irlmp_start_discovery_timer( struct irlmp_cb *, int timeout);
+inline void irlmp_start_watchdog_timer(struct lsap_cb *, int timeout);
+inline void irlmp_start_discovery_timer(struct irlmp_cb *, int timeout);
 inline void irlmp_start_idle_timer(struct lap_cb *, int timeout);
 
 struct irobex_cb;
-inline void irobex_start_watchdog_timer( struct irobex_cb *, int timeout);
+inline void irobex_start_watchdog_timer(struct irobex_cb *, int timeout);
 
 #endif
 
index a8b4c02dd306ffb7d776172d8d53c9f0c7aa2f4d..adab0c74f392da2a711a458ac07d0e2c124002a3 100644 (file)
@@ -7,7 +7,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Dec 26 11:00:49 1998
- * Modified at:   Tue Jan 19 23:52:46 1999
+ * Modified at:   Thu Mar 11 01:37:20 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -77,6 +77,7 @@
 
 #define UIRCC_CR12          0x0c /* Timer counter initial value (low byte) */
 #define UIRCC_CR13          0x0d /* Timer counter initial value (high byte) */
+#define UIRCC_CR15          0x0f
 
 /* Status registers (read only) */
 #define UIRCC_SR0           0x00 /* Transmit/receive status register */
 #define UIRCC_SR9           0x09 /* System status 1 */
 
 #define UIRCC_SR10          0x0a /* Modem select status */
-
+#define UIRCC_SR11          0x0b
 #define UIRCC_SR12          0x0c /* Timer counter status (low byte) */
 #define UIRCC_SR13          0x0d /* Timer counter status (high byte) */
+#define UIRCC_SR15          0x0f
 
 /* Private data for each instance */
 struct uircc_cb {
index 6c7f51202f8eeddaf4dd1166bee7ec44fb5ba7f3..caefe614609bad6a73e7368a41135af3e88dd553 100644 (file)
 #include <net/dn.h>
 #endif
 
+#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
+#include <net/irda/irda.h>
+#endif
+
 #ifdef CONFIG_FILTER
 #include <linux/filter.h>
 #endif
@@ -490,6 +494,9 @@ struct sock {
 #endif
 #if defined(CONFIG_ECONET) || defined(CONFIG_ECONET_MODULE)
                struct econet_opt       *af_econet;
+#endif
+#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
+               struct irda_sock        *irda;
 #endif
        } protinfo;             
 
index f73a0576690d3c1f280ecebb823f2eaf3bec5d53..8912d6cb989a406b1c7636e0ab01b0e3ebd95552 100644 (file)
@@ -12,7 +12,6 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
     if [ "$CONFIG_IRDA" != "n" ] ; then
       comment 'IrDA protocols'
       source net/irda/irlan/Config.in
-      source net/irda/irobex/Config.in
       source net/irda/ircomm/Config.in
       source net/irda/irlpt/Config.in
 
@@ -21,7 +20,6 @@ if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
         comment '   IrDA options'
         bool '   Cache last LSAP' CONFIG_IRDA_CACHE_LAST_LSAP
        bool '   Fast RRs' CONFIG_IRDA_FAST_RR
-        bool '   Recycle RRs' CONFIG_IRDA_RECYCLE_RR
        bool '   Debug information' CONFIG_IRDA_DEBUG
       fi
     fi
index 495614172cbb80e17e9dfe5e5b53ef8fc5a1a94b..b3a4a371bd3d524979a0d1ed024cd19395ed254a 100644 (file)
@@ -15,7 +15,8 @@ OX_OBJS :=
 O_TARGET := irda.o
 O_OBJS  := iriap.o iriap_event.o irlmp.o irlmp_event.o irlmp_frame.o \
             irlap.o irlap_event.o irlap_frame.o timer.o qos.o irqueue.o \
-            irttp.o irda_device.o irias_object.o crc.o wrapper.o af_irda.o
+            irttp.o irda_device.o irias_object.o crc.o wrapper.o af_irda.o \
+           discovery.o
 OX_OBJS := irmod.o
 
 MOD_LIST_NAME := IRDA_MODULES
@@ -54,15 +55,6 @@ else
   endif
 endif
 
-ifeq ($(CONFIG_IROBEX),y)
-SUB_DIRS += irobex
-O_OBJS += irobex/irobex.o
-else
-  ifeq ($(CONFIG_IROBEX),m)
-  MOD_SUB_DIRS += irobex
-  endif
-endif
-
 ifeq ($(CONFIG_IRDA_COMPRESSION),y)
 SUB_DIRS += compressors
 MOD_IN_SUB_DIRS += compressors
index 67e102a240e09c65979df6ab6cbdf07e6a861792..c46dde279c092e5b4ea633c56ff1b2c3d5b9d7e5 100644 (file)
@@ -1,16 +1,16 @@
 /*********************************************************************
  *                
  * Filename:      af_irda.c
- * Version:       0.1
+ * Version:       0.6
  * Description:   IrDA sockets implementation
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun May 31 10:12:43 1998
- * Modified at:   Sat Feb 20 01:31:15 1999
+ * Modified at:   Wed Apr  7 17:32:27 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * Sources:       af_netroom.c, af_ax25.x
+ * Sources:       af_netroom.c, af_ax25.c, af_rose.c, af_x25.c etc.
  * 
- *     Copyright (c) 1997 Dag Brattli, All Rights Reserved.
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
  *      
  *     This program is free software; you can redistribute it and/or 
  *     modify it under the terms of the GNU General Public License as 
 #include <linux/init.h>
 #include <linux/if_arp.h>
 #include <linux/net.h>
+#include <linux/irda.h>
 
 #include <asm/uaccess.h>
 
 #include <net/sock.h>
 
 #include <net/irda/irda.h>
-#include <net/irda/irmod.h>
+#include <net/irda/iriap.h>
+#include <net/irda/irias_object.h>
 #include <net/irda/irttp.h>
 
-extern int irda_init(void);
+extern int  irda_init(void);
 extern void irda_cleanup(void);
-extern int irlap_input(struct sk_buff *, struct device *, struct packet_type *);
+extern int  irlap_driver_rcv(struct sk_buff *, struct device *, 
+                            struct packet_type *);
 
 static struct proto_ops irda_proto_ops;
+static hashbin_t *cachelog = NULL;
+static struct wait_queue *discovery_wait; /* Wait for discovery */
 
 #define IRDA_MAX_HEADER (TTP_HEADER+LMP_HEADER+LAP_HEADER)
 
-#define IRDA_SOCKETS
+/*
+ * Function irda_data_indication (instance, sap, skb)
+ *
+ *    Received some data from TinyTP. Just queue it on the receive queue
+ *
+ */
+static int irda_data_indication(void *instance, void *sap, struct sk_buff *skb)
+{
+       struct irda_sock *self;
+       struct sock *sk;
+       int err;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       self = (struct irda_sock *) instance;
+       ASSERT(self != NULL, return -1;);
+
+       sk = self->sk;
+       ASSERT(sk != NULL, return -1;);
+
+       err = sock_queue_rcv_skb(sk, skb);
+       if (err) {
+               DEBUG(1, __FUNCTION__ "(), error: no more mem!\n");
+               self->rx_flow = FLOW_STOP;
+
+               /* When we return error, TTP will need to requeue the skb */
+               return err;
+       }
+
+       return 0;
+}
+
+/*
+ * Function irda_disconnect_indication (instance, sap, reason, skb)
+ *
+ *    Connection has been closed. Chech reason to find out why
+ *
+ */
+static void irda_disconnect_indication(void *instance, void *sap, 
+                                      LM_REASON reason, struct sk_buff *skb)
+{
+       struct irda_sock *self;
+       struct sock *sk;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       self = (struct irda_sock *) instance;
+
+       sk = self->sk;
+       if (sk == NULL)
+               return;
+
+       sk->state     = TCP_CLOSE;
+        sk->err       = reason;
+        sk->shutdown |= SEND_SHUTDOWN;
+       if (!sk->dead) {
+               sk->state_change(sk);
+                sk->dead = 1;
+        }
+}
+
+/*
+ * Function irda_connect_confirm (instance, sap, qos, max_sdu_size, skb)
+ *
+ *    Connections has been confirmed by the remote device
+ *
+ */
+static void irda_connect_confirm(void *instance, void *sap, 
+                                struct qos_info *qos,
+                                __u32 max_sdu_size, struct sk_buff *skb)
+{
+       struct irda_sock *self;
+       struct sock *sk;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       self = (struct irda_sock *) instance;
+
+       self->max_sdu_size_tx = max_sdu_size;
+       memcpy(&self->qos_tx, qos, sizeof(struct qos_info));
+
+       sk = self->sk;
+       if (sk == NULL)
+               return;
+
+       /* We are now connected! */
+       sk->state = TCP_ESTABLISHED;
+       sk->state_change(sk);
+}
+
+/*
+ * Function irda_connect_indication(instance, sap, qos, max_sdu_size, userdata)
+ *
+ *    Incomming connection
+ *
+ */
+static void irda_connect_indication(void *instance, void *sap, 
+                                   struct qos_info *qos, __u32 max_sdu_size,
+                                   struct sk_buff *skb)
+{
+       struct irda_sock *self;
+       struct sock *sk;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       self = (struct irda_sock *) instance;
+       
+       self->max_sdu_size_tx = max_sdu_size;
+       memcpy(&self->qos_tx, qos, sizeof(struct qos_info));
+
+       sk = self->sk;
+       if (sk == NULL)
+               return;
+       
+       skb_queue_tail(&sk->receive_queue, skb);
+
+       sk->state_change(sk);
+}
+
+/*
+ * Function irda_connect_response (handle)
+ *
+ *    Accept incomming connection
+ *
+ */
+void irda_connect_response(struct irda_sock *self)
+{
+       struct sk_buff *skb;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       ASSERT(self != NULL, return;);
+
+       skb = dev_alloc_skb(64);
+       if (skb == NULL) {
+               DEBUG( 0, __FUNCTION__ "() Could not allocate sk_buff!\n");
+               return;
+       }
+
+       /* Reserve space for MUX_CONTROL and LAP header */
+       skb_reserve(skb, TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER);
+
+       irttp_connect_response(self->tsap, self->max_sdu_size_rx, skb);
+}
+
+
+/*
+ * Function irda_flow_indication (instance, sap, flow)
+ *
+ *    Used by TinyTP to tell us if it can accept more data or not
+ *
+ */
+static void irda_flow_indication(void *instance, void *sap, LOCAL_FLOW flow) 
+{
+       struct irda_sock *self;
+       struct sock *sk;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+       
+       self = (struct irda_sock *) instance;
+       ASSERT(self != NULL, return;);
+
+       sk = self->sk;
+       ASSERT(sk != NULL, return;);
+       
+       switch (flow) {
+       case FLOW_STOP:
+               DEBUG( 0, __FUNCTION__ "(), IrTTP wants us to slow down\n");
+               self->tx_flow = flow;
+               break;
+       case FLOW_START:
+               self->tx_flow = flow;
+               DEBUG(0, __FUNCTION__ "(), IrTTP wants us to start again\n");
+               wake_up_interruptible(sk->sleep);
+               break;
+       default:
+               DEBUG( 0, __FUNCTION__ "(), Unknown flow command!\n");
+       }
+}
 
-#ifdef IRDA_SOCKETS
+/*
+ * Function irda_get_value_confirm (obj_id, value, priv)
+ *
+ *    Got answer from remote LM-IAS
+ *
+ */
+static void irda_get_value_confirm(__u16 obj_id, struct ias_value *value, 
+                                  void *priv)
+{
+       struct irda_sock *self;
+       
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       ASSERT(priv != NULL, return;);
+       self = (struct irda_sock *) priv;
+       
+       if (!self)
+               return;
+
+       /* Check if request succeeded */
+       if (!value) {
+               DEBUG(0, __FUNCTION__ "(), IAS query failed!\n");
+
+               /* Wake up any processes waiting for result */
+               wake_up_interruptible(&self->ias_wait);
+               return;
+       }
+
+       switch (value->type) {
+       case IAS_INTEGER:
+               DEBUG(4, __FUNCTION__ "() int=%d\n", value->t.integer);
+               
+               if (value->t.integer != -1) {
+                       self->dtsap_sel = value->t.integer;
+               } else 
+                       self->dtsap_sel = 0;
+               break;
+       default:
+               DEBUG(0, __FUNCTION__ "(), bad type!\n");
+               break;
+       }
+       /* Wake up any processes waiting for result */
+       wake_up_interruptible(&self->ias_wait);
+}
+
+/*
+ * Function irda_discovery_indication (log)
+ *
+ *    Got a discovery log from IrLMP, wake ut any process waiting for answer
+ *
+ */
+static void irda_discovery_indication(hashbin_t *log)
+{
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       cachelog = log;
+
+       /* Wake up process if its waiting for device to be discovered */
+       wake_up_interruptible(&discovery_wait);
+}
+
+/*
+ * Function irda_open_tsap (self)
+ *
+ *    Open local Transport Service Access Point (TSAP)
+ *
+ */
+static int irda_open_tsap(struct irda_sock *self, __u8 tsap_sel, char *name)
+{
+       struct notify_t notify;
+       
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       /* Initialize callbacks to be used by the IrDA stack */
+       irda_notify_init(&notify);
+       notify.connect_confirm       = irda_connect_confirm;
+       notify.connect_indication    = irda_connect_indication;
+       notify.disconnect_indication = irda_disconnect_indication;
+       notify.data_indication       = irda_data_indication;
+       notify.flow_indication       = irda_flow_indication;
+       notify.instance = self;
+       strncpy(notify.name, name, NOTIFY_MAX_NAME);
+
+       self->tsap = irttp_open_tsap(tsap_sel, DEFAULT_INITIAL_CREDIT,
+                                    &notify);  
+       if (self->tsap == NULL) {
+               DEBUG( 0, __FUNCTION__ "(), Unable to allocate TSAP!\n");
+               return -1;
+       }
+       /* Remember which TSAP selector we actually got */
+       self->stsap_sel = self->tsap->stsap_sel;
+
+       return 0;
+}
+
+/*
+ * Function irda_find_lsap_sel (self, name)
+ *
+ *    Try to lookup LSAP selector in remote LM-IAS
+ *
+ */
+static int irda_find_lsap_sel(struct irda_sock *self, char *name)
+{
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       ASSERT(self != NULL, return -1;);
+
+       /* Query remote LM-IAS */
+       iriap_getvaluebyclass_request(name, "IrDA:TinyTP:LsapSel",
+                                     self->saddr, self->daddr,
+                                     irda_get_value_confirm, self);
+       /* Wait for answer */
+       interruptible_sleep_on(&self->ias_wait);
+
+       if (self->dtsap_sel)
+               return 0;
+
+       return -ENETUNREACH; /* May not be true */
+}
 
 /*
  * Function irda_getname (sock, uaddr, uaddr_len, peer)
  *
- *    
+ *    Return the our own, or peers socket address (sockaddr_irda)
  *
  */
-static int irda_getname( struct socket *sock, struct sockaddr *uaddr,
-                        int *uaddr_len, int peer)
+static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
+                       int *uaddr_len, int peer)
 {
-       DEBUG( 0, __FUNCTION__ "(), Not implemented!\n");
+       struct sockaddr_irda saddr;
+       struct sock *sk = sock->sk;
+
+       if (peer) {
+               if (sk->state != TCP_ESTABLISHED)
+                       return -ENOTCONN;
+               
+               saddr.sir_family = AF_IRDA;
+               saddr.sir_lsap_sel = sk->protinfo.irda->dtsap_sel;
+               saddr.sir_addr = sk->protinfo.irda->daddr;
+       } else {
+               saddr.sir_family = AF_IRDA;
+               saddr.sir_lsap_sel = sk->protinfo.irda->stsap_sel;
+               saddr.sir_addr = sk->protinfo.irda->saddr;
+       }
+       
+       DEBUG(1, __FUNCTION__ "(), tsap_sel = %#x\n", saddr.sir_lsap_sel);
+       DEBUG(1, __FUNCTION__ "(), addr = %08x\n", saddr.sir_addr);
+
+       if (*uaddr_len > sizeof (struct sockaddr_irda))
+               *uaddr_len = sizeof (struct sockaddr_irda);
+       memcpy(uaddr, &saddr, *uaddr_len);
 
        return 0;
 }
@@ -68,22 +390,148 @@ static int irda_getname( struct socket *sock, struct sockaddr *uaddr,
 /*
  * Function irda_listen (sock, backlog)
  *
- *    
+ *    Just move to the listen state
  *
  */
 static int irda_listen( struct socket *sock, int backlog)
 {
        struct sock *sk = sock->sk;
 
-       if (sk->type == SOCK_SEQPACKET && sk->state != TCP_LISTEN) {
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       if (sk->type == SOCK_STREAM && sk->state != TCP_LISTEN) {
                sk->max_ack_backlog = backlog;
                sk->state           = TCP_LISTEN;
+
                return 0;
        }
-
+       
        return -EOPNOTSUPP;
 }
 
+/*
+ * Function irda_bind (sock, uaddr, addr_len)
+ *
+ *    Used by servers to register their well known TSAP
+ *
+ */
+static int irda_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
+{
+       struct sock *sk = sock->sk;
+       struct sockaddr_irda *addr = (struct sockaddr_irda *) uaddr;
+       struct irda_sock *self;
+       __u16 hints = 0;
+       int err;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       self = sk->protinfo.irda;
+       ASSERT(self != NULL, return -1;);
+
+       if ((addr_len < sizeof(struct sockaddr_irda)) || 
+           (addr_len > sizeof(struct sockaddr_irda)))
+               return -EINVAL;
+
+       err = irda_open_tsap(self, addr->sir_lsap_sel, addr->sir_name);
+       if (err < 0)
+               return -ENOMEM;
+       
+       /*  Register with LM-IAS */
+       self->ias_obj = irias_new_object(addr->sir_name, jiffies);
+       irias_add_integer_attrib(self->ias_obj, "IrDA:TinyTP:LsapSel", 
+                                self->stsap_sel);
+       irias_insert_object(self->ias_obj);
+
+       /* Fill in some default hint bits values */
+       if (strncmp(addr->sir_name, "OBEX", 4) == 0)
+               hints = irlmp_service_to_hint(S_OBEX);
+       
+       if (hints)
+               self->skey = irlmp_register_service(hints);
+
+       return 0;
+}
+
+/*
+ * Function irda_accept (sock, newsock, flags)
+ *
+ *    Wait for incomming connection
+ *
+ */
+static int irda_accept(struct socket *sock, struct socket *newsock, int flags)
+{
+       struct irda_sock *self, *new;
+       struct sock *sk = sock->sk;
+       struct sock *newsk;
+       struct sk_buff *skb;
+
+       self = sk->protinfo.irda;
+       ASSERT(self != NULL, return -1;);
+
+       if (sock->state != SS_UNCONNECTED)
+               return -EINVAL;
+
+       if ((sk = sock->sk) == NULL)
+               return -EINVAL;
+
+       if (sk->type != SOCK_STREAM)
+               return -EOPNOTSUPP;
+
+       if (sk->state != TCP_LISTEN)
+               return -EINVAL;
+
+       /*
+        *      The read queue this time is holding sockets ready to use
+        *      hooked into the SABM we saved
+        */
+       do {
+               if ((skb = skb_dequeue(&sk->receive_queue)) == NULL) {
+                       if (flags & O_NONBLOCK)
+                               return -EWOULDBLOCK;
+
+                       interruptible_sleep_on(sk->sleep);
+                       if (signal_pending(current)) 
+                               return -ERESTARTSYS;
+               }
+       } while (skb == NULL);
+
+       newsk = newsock->sk;
+       newsk->state = TCP_ESTABLISHED;
+
+       new = newsk->protinfo.irda;
+       ASSERT(new != NULL, return -1;);
+
+       /* Now attach up the new socket */
+       new->tsap = irttp_dup(self->tsap, new);
+       if (!new->tsap) {
+               DEBUG(0, __FUNCTION__ "(), dup failed!\n");
+               return -1;
+       }
+               
+       new->stsap_sel = new->tsap->stsap_sel;
+       new->dtsap_sel = new->tsap->dtsap_sel;
+       new->saddr = irttp_get_saddr(new->tsap);
+       new->saddr = irttp_get_saddr(new->tsap);
+
+       new->max_sdu_size_tx = self->max_sdu_size_tx;
+       new->max_sdu_size_rx = self->max_sdu_size_rx;
+       memcpy(&new->qos_tx, &self->qos_tx, sizeof(struct qos_info));
+
+       /* Clean up the original one to keep it in listen state */
+       self->tsap->dtsap_sel = self->tsap->lsap->dlsap_sel = LSAP_ANY;
+       self->tsap->lsap->lsap_state = LSAP_DISCONNECTED;
+
+       skb->sk = NULL;
+       skb->destructor = NULL;
+       kfree_skb(skb);
+       sk->ack_backlog--;
+
+       newsock->state = SS_CONNECTED;
+
+       irda_connect_response(new);
+
+       return 0;
+}
 
 /*
  * Function irda_connect (sock, uaddr, addr_len, flags)
@@ -91,17 +539,18 @@ static int irda_listen( struct socket *sock, int backlog)
  *    Connect to a IrDA device
  *
  */
-static int irda_connect( struct socket *sock, struct sockaddr *uaddr,
-       int addr_len, int flags)
+static int irda_connect(struct socket *sock, struct sockaddr *uaddr,
+                       int addr_len, int flags)
 {
-#if 0
-       struct sock *sk = (struct sock *)sock->data;
-       struct sockaddr_irda *addr = (struct sockaddr_irda *)uaddr;
-       irda_address *user, *source = NULL;
-       struct device *dev;
+       struct sock *sk = sock->sk;
+       struct sockaddr_irda *addr = (struct sockaddr_irda *) uaddr;
+       struct irda_sock *self;
+       int err;
+
+       self = sk->protinfo.irda;
+
+       DEBUG(1, __FUNCTION__ "()\n");
 
-       DEBUG( 0, __FUNCTION__ "()\n");
-       
        if (sk->state == TCP_ESTABLISHED && sock->state == SS_CONNECTING) {
                sock->state = SS_CONNECTED;
                return 0;   /* Connect completed during a ERESTARTSYS event */
@@ -121,6 +570,36 @@ static int irda_connect( struct socket *sock, struct sockaddr *uaddr,
        if (addr_len != sizeof(struct sockaddr_irda))
                return -EINVAL;
 
+       /* Check if user supplied the required destination device address */
+       if (!addr->sir_addr)
+               return -EINVAL;
+
+       self->daddr = addr->sir_addr;
+       DEBUG(1, __FUNCTION__ "(), daddr = %08x\n", self->daddr);
+
+       /* Query remote LM-IAS */
+       err = irda_find_lsap_sel(self, addr->sir_name);
+       if (err) {
+               DEBUG(0, __FUNCTION__ "(), connect failed!\n");
+               return err;
+       }
+
+       /* Check if we have opened a local TSAP */
+       if (!self->tsap)
+               irda_open_tsap(self, LSAP_ANY, addr->sir_name);
+       
+       /* Move to connecting socket, start sending Connect Requests */
+       sock->state = SS_CONNECTING;
+       sk->state   = TCP_SYN_SENT;
+
+       /* Connect to remote device */
+       err = irttp_connect_request(self->tsap, self->dtsap_sel, 
+                                   self->saddr, self->daddr, NULL, 
+                                   self->max_sdu_size_rx, NULL);
+       if (err) {
+               DEBUG(0, __FUNCTION__ "(), connect failed!\n");
+               return err;
+       }
 
        /* Now the loop */
        if (sk->state != TCP_ESTABLISHED && (flags & O_NONBLOCK))
@@ -130,9 +609,9 @@ static int irda_connect( struct socket *sock, struct sockaddr *uaddr,
        
        /* A Connect Ack with Choke or timeout or failed routing will go to
         * closed.  */
-       while ( sk->state == TCP_SYN_SENT) {
-               interruptible_sleep_on( sk->sleep);
-               if (current->signal & ~current->blocked) {
+       while (sk->state == TCP_SYN_SENT) {
+               interruptible_sleep_on(sk->sleep);
+               if (signal_pending(current)) {
                        sti();
                        return -ERESTARTSYS;
                }
@@ -141,13 +620,13 @@ static int irda_connect( struct socket *sock, struct sockaddr *uaddr,
        if (sk->state != TCP_ESTABLISHED) {
                sti();
                sock->state = SS_UNCONNECTED;
-               return sock_error( sk); /* Always set at this point */
+               return sock_error(sk);  /* Always set at this point */
        }
        
        sock->state = SS_CONNECTED;
-
+       
        sti();
-#endif
+       
        return 0;
 }
 
@@ -160,51 +639,79 @@ static int irda_connect( struct socket *sock, struct sockaddr *uaddr,
 static int irda_create(struct socket *sock, int protocol)
 {
        struct sock *sk;
+       struct irda_sock *self;
 
-       DEBUG( 0, __FUNCTION__ "()\n");
-
-       /* Compatibility */
-       if (sock->type == SOCK_PACKET) {
-               static int warned; 
-               if (net_families[PF_PACKET]==NULL)
-               {
-#if defined(CONFIG_KMOD) && defined(CONFIG_PACKET_MODULE)
-                       char module_name[30];
-                       sprintf(module_name,"net-pf-%d", PF_PACKET);
-                       request_module(module_name);
-                       if (net_families[PF_PACKET] == NULL)
-#endif
-                               return -ESOCKTNOSUPPORT;
-               }
-               if (!warned++)
-                       printk(KERN_INFO "%s uses obsolete (PF_INET,SOCK_PACKET)\n", current->comm);
-               return net_families[PF_PACKET]->create(sock, protocol);
-       }
+       DEBUG(2, __FUNCTION__ "()\n");
        
-/*     if (sock->type != SOCK_SEQPACKET || protocol != 0) */
-/*             return -ESOCKTNOSUPPORT; */
+       /* Check for valid socket type */
+       switch (sock->type) {
+       case SOCK_STREAM:   /* FALLTHROUGH */
+       case SOCK_SEQPACKET:
+               break;
+       default:
+               return -ESOCKTNOSUPPORT;
+       }
 
        /* Allocate socket */
        if ((sk = sk_alloc(PF_IRDA, GFP_ATOMIC, 1)) == NULL)
                return -ENOMEM;
        
+       self = kmalloc(sizeof(struct irda_sock), GFP_ATOMIC);
+       if (self == NULL)
+               return -ENOMEM;
+       memset(self, 0, sizeof(struct irda_sock));
+
+       self->sk = sk;
+       sk->protinfo.irda = self;
+
        sock_init_data(sock, sk);
 
        sock->ops    = &irda_proto_ops;
        sk->protocol = protocol;
 
+       /* Register as a client with IrLMP */
+       self->ckey = irlmp_register_client(0, NULL, NULL);
+       self->mask = 0xffff;
+       self->rx_flow = self->tx_flow = FLOW_START;
+       self->max_sdu_size_rx = SAR_DISABLE; /* Default value */
+       self->nslots = 6; /* Default for now */
+
+       /* Notify that we are using the irda module, so nobody removes it */
+       irda_mod_inc_use_count();
+
        return 0;
 }
 
 /*
- * Function irda_destroy_socket (tsap)
+ * Function irda_destroy_socket (self)
  *
  *    Destroy socket
  *
  */
-void irda_destroy_socket(struct tsap_cb *tsap)
+void irda_destroy_socket(struct irda_sock *self)
 {
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(2, __FUNCTION__ "()\n");
+
+       ASSERT(self != NULL, return;);
+
+       /* Unregister with IrLMP */
+       irlmp_unregister_client(self->ckey);
+       irlmp_unregister_service(self->skey);
+
+       /* Unregister with LM-IAS */
+       if (self->ias_obj)
+               irias_delete_object(self->ias_obj->name);
+
+       if (self->tsap) {
+               irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
+               irttp_close_tsap(self->tsap);
+               self->tsap = NULL;
+       }
+
+       kfree(self);
+
+       /* Notify that we are not using the irda module anymore */
+       irda_mod_dec_use_count();
 
        return;
 }
@@ -215,41 +722,108 @@ void irda_destroy_socket(struct tsap_cb *tsap)
  *    
  *
  */
-static int irda_release( struct socket *sock, struct socket *peer)
+static int irda_release(struct socket *sock, struct socket *peer)
 {
-#if 0
-        struct sock *sk = (struct sock *)sock->data;
+       struct sock *sk = sock->sk;
        
-       DEBUG( 0, __FUNCTION__ "()\n");
-
+       DEBUG(1, __FUNCTION__ "()\n");
 
-        if (sk == NULL) return 0;
+        if (sk == NULL) 
+               return 0;
        
-        if (sk->type == SOCK_SEQPACKET) {                    
+       sk->state       = TCP_CLOSE;
+       sk->shutdown   |= SEND_SHUTDOWN;
+       sk->state_change(sk);
+       sk->dead        = 1;
 
-       
-       } else {
-               sk->state       = TCP_CLOSE;
-                sk->shutdown   |= SEND_SHUTDOWN;
-                sk->state_change(sk);
-                sk->dead        = 1;
-                irda_destroy_socket( sk->protinfo.irda);
-        }
+       irda_destroy_socket(sk->protinfo.irda);
+
+        sock->sk   = NULL;      
+        sk->socket = NULL;      /* Not used, but we should do this. */
 
-        sock->data = NULL;      
-        sk->socket = NULL;      /* Not used, but we should do this. **/
-#endif
         return 0;
 }
 
+/*
+ * Function irda_sendmsg (sock, msg, len, scm)
+ *
+ *    Send message down to TinyTP
+ *
+ */
+static int irda_sendmsg(struct socket *sock, struct msghdr *msg, int len, 
+                       struct scm_cookie *scm)
+{
+       struct sock *sk = sock->sk;
+/*     struct sockaddr_irda *addr = (struct sockaddr_irda *) msg->msg_name; */
+       struct irda_sock *self;
+       struct sk_buff *skb;
+       unsigned char *asmptr;
+       int err;
+
+       DEBUG(4, __FUNCTION__ "(), len=%d\n", len);
+
+       if (msg->msg_flags & ~MSG_DONTWAIT)
+               return -EINVAL;
+
+       if (sk->shutdown & SEND_SHUTDOWN) {
+               send_sig(SIGPIPE, current, 0);
+               return -EPIPE;
+       }
+
+       self = sk->protinfo.irda;
+       ASSERT(self != NULL, return -1;);
+
+       /* Check if IrTTP is wants us to slow down */
+       while (self->tx_flow == FLOW_STOP) {
+               DEBUG(2, __FUNCTION__ "(), IrTTP is busy, going to sleep!\n");
+               interruptible_sleep_on(sk->sleep);
+               
+               /* Check if we are still connected */
+               if (sk->state != TCP_ESTABLISHED)
+                       return -ENOTCONN;
+       }
+
+       skb = sock_alloc_send_skb(sk, len + IRDA_MAX_HEADER, 0, 
+                                 msg->msg_flags & MSG_DONTWAIT, &err);
+       if (!skb)
+               return -ENOBUFS;
+
+       skb_reserve(skb, IRDA_MAX_HEADER);
+       
+       DEBUG(4, __FUNCTION__ "(), appending user data\n");
+       asmptr = skb->h.raw = skb_put(skb, len);
+       memcpy_fromiovec(asmptr, msg->msg_iov, len);
+
+       /* 
+        * Just send the message to TinyTP, and let it deal with possible 
+        * errors. No need to duplicate all that here
+        */
+       err = irttp_data_request(self->tsap, skb);
+       if (err) {
+               DEBUG(0, __FUNCTION__ "(), err=%d\n", err);
+               return err;
+       }
+       return len;
+}
+
+/*
+ * Function irda_recvmsg (sock, msg, size, flags, scm)
+ *
+ *    Try to receive message and copy it to user
+ *
+ */
 static int irda_recvmsg(struct socket *sock, struct msghdr *msg, int size,
                        int flags, struct scm_cookie *scm)
 {
+       struct irda_sock *self;
        struct sock *sk = sock->sk;
        struct sk_buff *skb;
        int copied, err;
 
-       DEBUG(0, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
+
+       self = sk->protinfo.irda;
+       ASSERT(self != NULL, return -1;);
 
        skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT, 
                                flags & MSG_DONTWAIT, &err);
@@ -267,6 +841,20 @@ static int irda_recvmsg(struct socket *sock, struct msghdr *msg, int size,
 
        skb_free_datagram(sk, skb);
 
+       /*
+        *  Check if we have previously stopped IrTTP and we know
+        *  have more free space in our rx_queue. If so tell IrTTP
+        *  to start delivering frames again before our rx_queue gets
+        *  empty
+        */
+       if (self->rx_flow == FLOW_STOP) {
+               if ((atomic_read(&sk->rmem_alloc) << 2) <= sk->rcvbuf) {
+                       DEBUG(2, __FUNCTION__ "(), Starting IrTTP\n");
+                       self->rx_flow = FLOW_START;
+                       irttp_flow_request(self->tsap, FLOW_START);
+               }
+       }
+
        return copied;
 }
 
@@ -279,10 +867,11 @@ static int irda_shutdown( struct socket *sk, int how)
 }
 
 
-unsigned int irda_poll( struct file *file, struct socket *sock, 
-                       struct poll_table_struct *wait)
+unsigned int irda_poll(struct file *file, struct socket *sock, 
+                      struct poll_table_struct *wait)
 {
        DEBUG(0, __FUNCTION__ "()\n");
+
        return 0;
 }
 
@@ -296,7 +885,7 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
 
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(0, __FUNCTION__ "(), cmd=%#x\n", cmd);
        
        switch (cmd) {
        case TIOCOUTQ: {
@@ -343,13 +932,163 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                return -EINVAL;
                
        default:
-               return dev_ioctl(cmd, (void *)arg);
+               return dev_ioctl(cmd, (void *) arg);
        }
 
        /*NOTREACHED*/
        return 0;
 }
 
+/*
+ * Function irda_setsockopt (sock, level, optname, optval, optlen)
+ *
+ *    Set some options for the socket
+ *
+ */
+static int irda_setsockopt(struct socket *sock, int level, int optname, 
+                          char *optval, int optlen)
+{
+       struct sock *sk = sock->sk;
+       struct irda_sock *self;
+       int opt;
+       
+       DEBUG(0, __FUNCTION__ "()\n");
+
+       self = sk->protinfo.irda;
+       ASSERT(self != NULL, return -1;);
+
+       if (level != SOL_IRLMP)
+               return -ENOPROTOOPT;
+       
+       if (optlen < sizeof(int))
+               return -EINVAL;
+       
+       if (get_user(opt, (int *)optval))
+               return -EFAULT;
+       
+       switch (optname) {
+       case IRLMP_IAS_SET:
+               DEBUG(0, __FUNCTION__ "(), sorry not impl. yet!\n");
+               return 0;
+       case IRTTP_MAX_SDU_SIZE:
+               DEBUG(0, __FUNCTION__ "(), setting max_sdu_size = %d\n", opt);
+               self->max_sdu_size_rx = opt;
+               break;
+       default:
+               return -ENOPROTOOPT;
+       }
+       return 0;
+}
+
+/*
+ * Function irda_getsockopt (sock, level, optname, optval, optlen)
+ *
+ *    
+ *
+ */
+static int irda_getsockopt(struct socket *sock, int level, int optname, 
+                          char *optval, int *optlen)
+{
+       struct sock *sk = sock->sk;
+       struct irda_sock *self;
+       struct irda_device_list *list;
+       __u8 optbuf[sizeof(struct irda_device_list) +
+                  sizeof(struct irda_device_info)*10];
+       discovery_t *discovery;
+       int val = 0;
+       int len = 0;
+       int i = 0;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       self = sk->protinfo.irda;
+
+       if (level != SOL_IRLMP)
+               return -ENOPROTOOPT;
+
+       if (get_user(len, optlen))
+               return -EFAULT;
+
+       switch (optname) {
+       case IRLMP_ENUMDEVICES:
+               DEBUG(1, __FUNCTION__ "(), IRLMP_ENUMDEVICES\n");
+               
+               /* Tell IrLMP we want to be notified */
+               irlmp_update_client(self->ckey, self->mask, NULL, 
+                                   irda_discovery_indication);
+
+               /* Do some discovery */
+               irlmp_discovery_request(self->nslots);
+
+               /* Devices my be discovered already */
+               if (!cachelog) {
+                       DEBUG(2, __FUNCTION__ "(), no log!\n");
+
+                       /* Sleep until device(s) discovered */
+                       interruptible_sleep_on(&discovery_wait);
+                       if (!cachelog)
+                               return -1;
+               }
+
+               list = (struct irda_device_list *) optbuf;
+               /* 
+                * Now, check all discovered devices (if any), and notify
+                * client only about the services that the client is
+                * interested in 
+                */
+               discovery = (discovery_t *) hashbin_get_first(cachelog);
+               while (discovery != NULL) {
+                       /* Mask out the ones we don't want */
+                       if (discovery->hints.word & self->mask) {
+                               /* Copy discovery information */
+                               list->dev[i].saddr = discovery->saddr;
+                               list->dev[i].daddr = discovery->daddr;
+                               list->dev[i].charset = discovery->charset;
+                               list->dev[i].hints[0] = discovery->hints.byte[0];
+                               list->dev[i].hints[1] = discovery->hints.byte[1];
+                               strncpy(list->dev[i].info, discovery->info, 22);
+                               if (++i >= 10)
+                                       break;
+                       }
+                       discovery = (discovery_t *) hashbin_get_next(cachelog);
+               }
+               cachelog = NULL;
+
+               list->len = i;
+               len = sizeof(struct irda_device_list) +
+                       sizeof(struct irda_device_info) * i;
+
+               DEBUG(1, __FUNCTION__ "(), len=%d, i=%d\n", len, i);
+
+               if (put_user(len, optlen))
+                       return -EFAULT;
+               
+               if (copy_to_user(optval, &optbuf, len))
+                       return -EFAULT;
+               break;
+       case IRTTP_MAX_SDU_SIZE:
+               if (self->max_sdu_size_tx != SAR_DISABLE)
+                       val = self->max_sdu_size_tx;
+               else
+                       /* SAR is disabled, so use the IrLAP data size
+                        * instead */
+                       val = self->qos_tx.data_size.value - IRDA_MAX_HEADER;
+
+               DEBUG(0, __FUNCTION__ "(), getting max_sdu_size = %d\n", val);
+               len = sizeof(int);
+               if (put_user(len, optlen))
+                       return -EFAULT;
+               
+               if (copy_to_user(optval, &val, len))
+                       return -EFAULT;
+               break;
+       default:
+               return -ENOPROTOOPT;
+       }
+
+       return 0;
+}
+
 static struct net_proto_family irda_family_ops =
 {
        PF_IRDA,
@@ -361,24 +1100,28 @@ static struct proto_ops irda_proto_ops = {
        
        sock_no_dup,
        irda_release,
-       sock_no_bind,
+       irda_bind,
        irda_connect,
        sock_no_socketpair,
-       sock_no_accept,
+       irda_accept,
        irda_getname,
        irda_poll,
        irda_ioctl,
        irda_listen,
        irda_shutdown,
-       sock_no_setsockopt,
-       sock_no_getsockopt,
+       irda_setsockopt,
+       irda_getsockopt,
        sock_no_fcntl,
-       sock_no_sendmsg,
+       irda_sendmsg,
        irda_recvmsg
 };
 
-#endif /* IRDA_SOCKETS */
-
+/*
+ * Function irda_device_event (this, event, ptr)
+ *
+ *    
+ *
+ */
 static int irda_device_event(struct notifier_block *this, unsigned long event,
                             void *ptr)
 {
@@ -412,7 +1155,7 @@ static struct packet_type irda_packet_type =
 {
        0,      /* MUTTER ntohs(ETH_P_IRDA),*/
        NULL,
-       irlap_input, /* irda_driver_rcv, */
+       irlap_driver_rcv,
        NULL,
        NULL,
 };
@@ -449,6 +1192,7 @@ __initfunc(void irda_proto_init(struct net_proto *pro))
  *    Remove IrDA protocol layer
  *
  */
+#ifdef MODULE
 void irda_proto_cleanup(void)
 {
        DEBUG( 4, __FUNCTION__ "\n");
@@ -463,4 +1207,4 @@ void irda_proto_cleanup(void)
        
         return;
 }
-
+#endif /* MODULE */
diff --git a/net/irda/discovery.c b/net/irda/discovery.c
new file mode 100644 (file)
index 0000000..f6561db
--- /dev/null
@@ -0,0 +1,245 @@
+/*********************************************************************
+ *                
+ * Filename:      discovery.c
+ * Version:       0.1
+ * Description:   Routines for handling discoveries at the IrLMP layer
+ * Status:        Experimental.
+ * Author:        Dag Brattli <dagb@cs.uit.no>
+ * Created at:    Tue Apr  6 15:33:50 1999
+ * Modified at:   Tue Apr  6 20:26:46 1999
+ * Modified by:   Dag Brattli <dagb@cs.uit.no>
+ * 
+ *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *     
+ *     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 <linux/socket.h>
+#include <linux/irda.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irlmp.h>
+
+#include <net/irda/discovery.h>
+
+/*
+ * Function irlmp_add_discovery (cachelog, discovery)
+ *
+ *    
+ *
+ */
+void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *discovery)
+{
+       discovery_t *old;
+
+       DEBUG(2, __FUNCTION__ "()\n");
+
+       /* Check if we have discovered this device before */
+       old = hashbin_remove(cachelog, discovery->daddr, NULL);
+       if (old)
+               kfree(old);
+
+       /* Insert the new and updated version */
+       hashbin_insert(cachelog, (QUEUE *) discovery, discovery->daddr, NULL);
+}
+
+/*
+ * Function irlmp_add_discovery_log (cachelog, log)
+ *
+ *    
+ *
+ */
+void irlmp_add_discovery_log(hashbin_t *cachelog, hashbin_t *log)
+{
+       discovery_t *discovery;
+
+       DEBUG(2, __FUNCTION__ "()\n");
+
+       /*
+        *  If log is missing this means that IrLAP was unable to perform the
+        *  discovery, so restart discovery again with just the half timeout
+        *  of the normal one.
+        */
+       if (log == NULL) {
+               /* irlmp_start_discovery_timer(irlmp, 150); */
+               return;
+       }
+
+       discovery = (discovery_t *) hashbin_remove_first(log);
+       while (discovery != NULL) {
+               irlmp_add_discovery(cachelog, discovery);
+
+               discovery = (discovery_t *) hashbin_remove_first(log);
+       }
+       
+       /* Delete the now empty log */
+       hashbin_delete(log, (FREE_FUNC) kfree);
+}
+
+/*
+ * Function irlmp_expire_discoveries (log, saddr, force)
+ *
+ *    Go through all discoveries and expire all that has stayed to long
+ *
+ */
+void irlmp_expire_discoveries(hashbin_t *log, int saddr, int force)
+{
+       discovery_t *discovery, *curr;
+
+       DEBUG(3, __FUNCTION__ "()\n");
+
+       discovery = (discovery_t *) hashbin_get_first(log);
+       while (discovery != NULL) {
+               curr = discovery;
+
+               /* Be sure to be one item ahead */
+               discovery = (discovery_t *) hashbin_get_next(log);
+
+               /* Test if it's time to expire this discovery */
+               if ((curr->saddr == saddr) && (force ||
+                   ((jiffies - curr->timestamp) > DISCOVERY_EXPIRE_TIMEOUT)))
+               {
+                       curr = hashbin_remove(log, curr->daddr, NULL);
+                       if (curr)
+                               kfree(curr);
+               }
+       }
+}
+
+/*
+ * Function irlmp_dump_discoveries (log)
+ *
+ *    Print out all discoveries in log
+ *
+ */
+void irlmp_dump_discoveries(hashbin_t *log)
+{
+       discovery_t *discovery;
+
+       ASSERT(log != NULL, return;);
+
+       discovery = (discovery_t *) hashbin_get_first(log);
+       while (discovery != NULL) {
+               DEBUG(0, "Discovery:\n");
+               DEBUG(0, "  daddr=%08x\n", discovery->daddr);
+               DEBUG(0, "  saddr=%08x\n", discovery->saddr); 
+               DEBUG(0, "  name=%s\n", discovery->info);
+
+               discovery = (discovery_t *) hashbin_get_next(log);
+       }
+}
+
+/*
+ * Function irlmp_find_device (name, saddr)
+ *
+ *    Look through the discovery log at each of the links and try to find 
+ *    the device with the given name. Return daddr and saddr. If saddr is
+ *    specified, that look at that particular link only (not impl).
+ */
+__u32 irlmp_find_device(hashbin_t *cachelog, char *name, __u32 *saddr)
+{
+       discovery_t *d;
+       unsigned long flags;
+
+       spin_lock_irqsave(&irlmp->lock, flags);
+
+       /* Look at all discoveries for that link */
+       d = (discovery_t *) hashbin_get_first(cachelog);
+       while (d != NULL) {
+               DEBUG(1, "Discovery:\n");
+               DEBUG(1, "  daddr=%08x\n", d->daddr);
+               DEBUG(1, "  name=%s\n", d->info);
+               
+               if (strcmp(name, d->info) == 0) {
+                       *saddr = d->saddr;
+                       
+                       spin_unlock_irqrestore(&irlmp->lock, flags);
+                       return d->daddr;
+               }
+               d = (discovery_t *) hashbin_get_next(cachelog);
+       }
+
+       spin_unlock_irqrestore(&irlmp->lock, flags);
+
+       return 0;
+}
+
+/*
+ * Function proc_discovery_read (buf, start, offset, len, unused)
+ *
+ *    Print discovery information in /proc file system
+ *
+ */
+int discovery_proc_read(char *buf, char **start, off_t offset, int len, 
+                       int unused)
+{
+       discovery_t *discovery;
+       unsigned long flags;
+       hashbin_t *cachelog = irlmp_get_cachelog();
+
+       if (!irlmp)
+               return len;
+
+       len = sprintf(buf, "IrLMP: Discovery log:\n\n");        
+       
+       save_flags(flags);
+       cli();
+       
+       discovery = (discovery_t *) hashbin_get_first(cachelog);
+       while ( discovery != NULL) {
+               len += sprintf( buf+len, "  name: %s,", 
+                               discovery->info);
+               
+               len += sprintf( buf+len, " hint: ");
+               if ( discovery->hints.byte[0] & HINT_PNP)
+                       len += sprintf( buf+len, "PnP Compatible ");
+               if ( discovery->hints.byte[0] & HINT_PDA)
+                       len += sprintf( buf+len, "PDA/Palmtop ");
+               if ( discovery->hints.byte[0] & HINT_COMPUTER)
+                       len += sprintf( buf+len, "Computer ");
+               if ( discovery->hints.byte[0] & HINT_PRINTER)
+                       len += sprintf( buf+len, "Printer ");
+               if ( discovery->hints.byte[0] & HINT_MODEM)
+                       len += sprintf( buf+len, "Modem ");
+               if ( discovery->hints.byte[0] & HINT_FAX)
+                       len += sprintf( buf+len, "Fax ");
+               if ( discovery->hints.byte[0] & HINT_LAN)
+                       len += sprintf( buf+len, "LAN Access ");
+               
+               if ( discovery->hints.byte[1] & HINT_TELEPHONY)
+                       len += sprintf( buf+len, "Telephony ");
+               if ( discovery->hints.byte[1] & HINT_FILE_SERVER)
+                       len += sprintf( buf+len, "File Server ");       
+               if ( discovery->hints.byte[1] & HINT_COMM)
+                       len += sprintf( buf+len, "IrCOMM ");
+               if ( discovery->hints.byte[1] & HINT_OBEX)
+                       len += sprintf( buf+len, "IrOBEX ");
+               
+               len += sprintf(buf+len, ", saddr: 0x%08x", 
+                              discovery->saddr);
+
+               len += sprintf(buf+len, ", daddr: 0x%08x\n", 
+                              discovery->daddr);
+               
+               len += sprintf( buf+len, "\n");
+               
+               discovery = (discovery_t *) hashbin_get_next(cachelog);
+       }
+       restore_flags(flags);
+
+       return len;
+}
index 1ff2e45be43fbd9ac6918ba5c9d21872591129b0..7df055ea1f18d406ab8360d70ea0ae054a2bf4f4 100644 (file)
@@ -8,9 +8,9 @@
 # Note 2! The CFLAGS definition is now in the main makefile...
 
 O_TARGET := ircomm_n_vtd.o
-O_OBJS  := ircomm_common.o attach.o irvtd.o irvtd_driver.o
+O_OBJS  := ircomm_common.o irvtd_driver.o
 M_OBJS   := ircomm.o ircomm_tty.o
-MI_OBJS  := ircomm_common.o attach.o irvtd.o irvtd_driver.o
+MI_OBJS  := ircomm_common.o irvtd_driver.o
 
 OX_OBJS  += 
 
@@ -18,10 +18,10 @@ OX_OBJS  +=
 
 ifeq ($(CONFIG_IRCOMM),m)
 ircomm.o:  $(MI_OBJS)
-       $(LD) $(LD_RFLAG) -r -o $@ ircomm_common.o attach.o
+       $(LD) $(LD_RFLAG) -r -o $@ ircomm_common.o
 
 ircomm_tty.o: $(MI_OBJS)
-       $(LD) $(LD_RFLAG) -r -o $@ irvtd.o irvtd_driver.o
+       $(LD) $(LD_RFLAG) -r -o $@ irvtd_driver.o
 endif
 
 include $(TOPDIR)/Rules.make
diff --git a/net/irda/ircomm/attach.c b/net/irda/ircomm/attach.c
deleted file mode 100644 (file)
index 7ec8e46..0000000
+++ /dev/null
@@ -1,360 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      attach.c
- * Version:       
- * Description:   An implementation of IrCOMM service interface.
- * Status:        Experimental.
- * Author:        Takahide Higuchi <thiguchi@pluto.dti.ne.jp>
- *
- *     Copyright (c) 1998, Takahide Higuchi, <thiguchi@pluto.dti.ne.jp>,
- *     All Rights Reserved.
- *
- *     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.
- *
- *     I, Takahide Higuchi, provide no warranty for any of this software.
- *     This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-
-/*
- * ----------------------------------------------------------------------
- * IrIAS related things for IrCOMM
- * If you are to use ircomm layer, use ircomm_attach_cable to
- * setup it and register your program.
- * ----------------------------------------------------------------------
- */
-
-
-#include <linux/sched.h>
-#include <linux/tqueue.h>
-
-#include <net/irda/irlap.h>
-#include <net/irda/irttp.h>
-#include <net/irda/iriap.h>
-#include <net/irda/irias_object.h>
-
-#include <net/irda/ircomm_common.h>
-
-extern struct ircomm_cb **ircomm;
-struct ircomm_cb *discovering_instance;
-
-static void got_lsapsel(struct ircomm_cb * info);
-static void query_lsapsel(struct ircomm_cb * self);
-void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value, 
-                             void *priv);
-
-#if 0
-static char *rcsid = "$Id: attach.c,v 1.11 1998/10/22 12:02:20 dagb Exp $";
-#endif
-
-
-/*
- * handler for iriap_getvaluebyclass_request() 
- *
- */
-void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value,void *priv)
-{
-       struct ircomm_cb *self = (struct ircomm_cb *) priv;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRCOMM_MAGIC, return;);
-
-       /* Check if request succeeded */
-       if ( !value) {
-               DEBUG( 0, __FUNCTION__ "(), got NULL value!\n");
-
-               return;
-       }
-
-       DEBUG(0, __FUNCTION__"type(%d)\n", value->type);
-
-       switch(value->type){
-
-       case IAS_OCT_SEQ:
-               /* 
-                * FIXME:we should use data which came here
-                * it is used for nothing at this time 
-                */
-               
-#if 1
-               DEBUG(0, "octet sequence is:\n");
-               {
-                       int i;
-                       for ( i=0;i<value->len;i++)
-                               printk("%02x",
-                                      (int)(*value->t.oct_seq + i) );
-                       printk("\n");
-               }
-#endif
-               query_lsapsel(self);
-               break;
-
-       case IAS_INTEGER:
-               /* LsapSel seems to be sent to me */    
-
-               if ( value->t.integer == -1){
-                       DEBUG( 0, "ircomm_getvalue_confirm: invalid value!\n");
-                       return;
-               }
-               if(self->state == COMM_IDLE){
-                       self->dlsap = value->t.integer;
-                       got_lsapsel(self);
-               }
-               break;
-
-       case IAS_STRING:
-               DEBUG(0, __FUNCTION__":STRING is not implemented\n");
-               DEBUG(0, __FUNCTION__":received string:%s\n", value->t.string);
-               query_lsapsel(self);  /* experiment */
-               break;
-
-       case IAS_MISSING:
-               DEBUG( 0, __FUNCTION__":MISSING is not implemented\n");
-               break;
-   
-       default:
-               DEBUG( 0, __FUNCTION__":unknown type!\n");
-               break;
-       }
-}
-
-static void got_lsapsel(struct ircomm_cb * self)
-{
-       struct notify_t notify;
-
-       DEBUG(0, "ircomm:got_lsapsel: got peersap!(%d)\n", self->dlsap );
-
-       /* remove tsap for server */
-       irttp_close_tsap(self->tsap);
-
-       /* create TSAP for initiater ... */
-       irda_notify_init(&notify);
-       notify.data_indication = ircomm_accept_data_indication;
-       notify.connect_confirm = ircomm_accept_connect_confirm;
-       notify.connect_indication = ircomm_accept_connect_indication;
-       notify.flow_indication = ircomm_accept_flow_indication;
-       notify.disconnect_indication = ircomm_accept_disconnect_indication;
-       strncpy( notify.name, "IrCOMM cli", NOTIFY_MAX_NAME);
-       notify.instance = self;
-       
-       self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, 
-                                    &notify);
-       ASSERT(self->tsap != NULL, return;);
-
-       /*
-        * invoke state machine  
-        * and notify that I'm ready to accept connect_request
-        */
-
-       ircomm_next_state(self, COMM_IDLE);     
-       if(self->d_handler)
-               self->d_handler(self);
-}
-               
-static void query_lsapsel(struct ircomm_cb * self)
-{
-       DEBUG(0, "ircomm:query_lsapsel..\n");
-
-       /*  
-        *  since we've got Parameters field of IAS, we are to get peersap.
-        */
-       
-       if (!(self->servicetype & THREE_WIRE_RAW)) {
-               iriap_getvaluebyclass_request( 
-                       "IrDA:IrCOMM", "IrDA:TinyTP:LsapSel",
-                       self->saddr, self->daddr,
-                       ircomm_getvalue_confirm, self );
-       } else {
-               DEBUG(0, __FUNCTION__ "THREE_WIRE_RAW is not implemented!\n");
-       }
-}
-
-
-
-/*
- * ircomm_discovery_indication()
- *    Remote device is discovered, try query the remote IAS to see which
- *    device it is, and which services it has.
- */
-
-void ircomm_discovery_indication( DISCOVERY *discovery)
-{
-       struct ircomm_cb *self;
-
-       DEBUG( 0, "ircomm_discovery_indication\n");
-       
-       self = discovering_instance;
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == IRCOMM_MAGIC, return;);
-
-       self->daddr = discovery->daddr;
-       self->saddr = discovery->saddr;
-
-       DEBUG( 0, "ircomm_discovery_indication:daddr=%08x\n", self->daddr);
-
-       /* query "Parameters" attribute of LM-IAS */
-
-       DEBUG(0, "ircomm:querying parameters..\n");
-#if 0
-       iriap_getvaluebyclass_request(self->daddr, "IrDA:IrCOMM",
-                                     "Parameters",
-                                     ircomm_getvalue_confirm,
-                                     self);
-#else
-       query_lsapsel(self);
-#endif
-       return;
-}
-
-
-struct ircomm_cb * ircomm_attach_cable( __u8 servicetype,
-                                       struct notify_t notify, 
-                                       void *handler )
-{
-       int i;
-       struct ircomm_cb *self = NULL;
-       struct notify_t server_notify;
-       struct ias_object* obj;
-
-       /* FIXME: it should not be hard coded */
-       __u8 oct_seq[6] = { 0,1,4,1,1,1 }; 
-
-       ASSERT(ircomm != NULL,return NULL;);
-       DEBUG(0,"ircomm_attach_cable:\n");
-
-
-       /* find free handle */
-
-       for(i = 0; i < IRCOMM_MAX_CONNECTION; i++){
-               ASSERT(ircomm[i] != NULL,return(NULL););
-               if(!ircomm[i]->in_use){
-                       self = ircomm[i];
-                       break;
-               }
-       }
-
-       if (!self){
-               DEBUG(0,"ircomm_attach_cable:no free handle!\n");
-               return (NULL);
-       }
-
-       self->in_use = 1;
-       self->servicetype = servicetype;
-
-       DEBUG(0,"attach_cable:servicetype:%d\n",servicetype);
-       self->d_handler = handler;
-       self->notify = notify;
-
-       /* register server.. */
-
-       /*
-        * TODO: since server TSAP is currentry hard coded,
-        * we can use *only one* IrCOMM connection.
-        * We have to create one more TSAP and register IAS entry dynamically 
-        * each time when we are to allocate new server here.
-        */
-       irda_notify_init(&server_notify);
-       server_notify.data_indication = ircomm_accept_data_indication;
-       server_notify.connect_confirm = ircomm_accept_connect_confirm;
-       server_notify.connect_indication = ircomm_accept_connect_indication;
-       server_notify.flow_indication = ircomm_accept_flow_indication;
-       server_notify.disconnect_indication = ircomm_accept_disconnect_indication;
-       server_notify.instance = self;
-       strncpy( server_notify.name, "IrCOMM srv", NOTIFY_MAX_NAME);
-
-       self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT,
-                                    &server_notify);
-       if(!self->tsap){
-               DEBUG(0,"ircomm:Sorry, failed to allocate server_tsap\n");
-               return NULL;
-       }
-
-        /* 
-         *  Register with LM-IAS
-         */
-       obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID);
-       irias_add_integer_attrib( obj, "IrDA:TinyTP:LsapSel", 
-                                 self->tsap->stsap_sel );
-
-       /* FIXME: it should not be hard coded */
-
-       irias_add_octseq_attrib( obj, "Parameters", 
-                                &oct_seq[0], 6);
-       irias_insert_object( obj);
-
-/*     obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID); */
-/*     irias_add_octseq_attrib( obj, "Parameters", len, &octseq); */
-/*     irias_insert_object( obj); */
-
-
-
-       /* and start discovering .. */
-       discovering_instance = self;
-
-       switch(servicetype){
-       case NINE_WIRE:
-               DEBUG(0,"ircomm_attach_cable:discovering..\n");
-               irlmp_register_layer(S_COMM , CLIENT|SERVER, TRUE,
-                                    ircomm_discovery_indication);
-               break;
-
-/*     case CENTRONICS: */
-/*     case THREE_WIRE: */
-/*     case THREE_WIRE_RAW: */
-
-       default:
-               DEBUG(0,"ircomm_attach_cable:requested servicetype is not "
-                     "implemented!\n");
-               return NULL;
-       }
-
-       ircomm_next_state(self, COMM_IDLE);     
-       return (self);
-}
-
-int ircomm_detach_cable(struct ircomm_cb *self)
-{
-       ASSERT( self != NULL, return -EIO;);
-       ASSERT( self->magic == IRCOMM_MAGIC, return -EIO;);
-
-       DEBUG(0,"ircomm_detach_cable:\n");
-
-       /* shutdown ircomm layer */
-       if(self->state != COMM_IDLE ){
-               DEBUG(0,"ircomm:detach_cable:not IDLE\n");
-               if(self->state != COMM_WAITI)
-                       ircomm_disconnect_request(self, NULL);
-       }
-
-
-       switch(self->servicetype){
-/*     case CENTRONICS: */
-       case NINE_WIRE:
-/*     case THREE_WIRE: */
-               irlmp_unregister_layer( S_COMM, CLIENT|SERVER );
-               break;
-
-/*     case THREE_WIRE_RAW: */
-/*             irlmp_unregister( S_COMM ) */
-/*             irlmp_unregister( S_PRINTER) */
-/*             break; */
-
-       default:
-               DEBUG(0,"ircomm_detach_cable:requested servicetype is not "
-                     "implemented!\n");
-               return -ENODEV;
-       }
-
-       /* remove tsaps */
-       if(self->tsap)
-               irttp_close_tsap(self->tsap);
-
-       self->tsap = NULL;
-       self->in_use = 0;
-
-       return 0;
-}
index d6004ed00e77e960de0926ba9947a558cd02065b..5796ced173abaf35a9171a8958d2abceab11e911 100644 (file)
 #include <linux/proc_fs.h>
 #include <linux/init.h>
 
-#include <net/irda/irmod.h>
+#include <net/irda/irda.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/iriap.h>
 #include <net/irda/irttp.h>
+#include <net/irda/irias_object.h>
 
 #include <net/irda/ircomm_common.h>
 
-#if 0
-static char *rcsid = "$Id: ircomm_common.c,v 1.13 1998/10/13 12:59:05 takahide Exp $";
-#endif
-static char *version = "IrCOMM_common, $Revision: 1.13 $ $Date: 1998/10/13 12:59:05 $ (Takahide Higuchi)";
-
-
+static char *revision_date = "Tue Mar  2 02:03:58 1999";
 
 
-static void ircomm_state_discovery( struct ircomm_cb *self,
-                                 IRCOMM_EVENT event, struct sk_buff *skb );
+static void ircomm_state_discovery(struct ircomm_cb *self,
+                                  IRCOMM_EVENT event, struct sk_buff *skb );
 static void ircomm_state_idle( struct ircomm_cb *self, IRCOMM_EVENT event, 
                               struct sk_buff *skb );
 static void ircomm_state_waiti( struct ircomm_cb *self, IRCOMM_EVENT event, 
@@ -60,12 +56,35 @@ static void ircomm_state_conn( struct ircomm_cb *self, IRCOMM_EVENT event,
                               struct sk_buff *skb );
 static void ircomm_do_event( struct ircomm_cb *self, IRCOMM_EVENT event,
                             struct sk_buff *skb);
-void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state);
+static void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state);
+
+static void ircomm_discovery_indication(discovery_t *discovery);
+static void ircomm_tx_controlchannel(struct ircomm_cb *self );
+static int ircomm_proc_read(char *buf, char **start, off_t offset,
+                           int len, int unused);
+
+static void query_lsapsel(struct ircomm_cb * self);
+static void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value, 
+                                    void *priv);
+
+
+static __u32 ckey;
+static __u32 skey;
+struct ircomm_cb *discovering_instance;
+
+/*
+ * debug parameter ircomm_cs:
+ *  0 = client/server, 1 = client only 2 = server only
+ * usage for example: 
+ *  insmod ircomm ircomm_cs=1
+ *  LILO boot : Linux ircomm_cs=2   etc.
+ */
+
+static int ircomm_cs = 0;
+MODULE_PARM(ircomm_cs, "i");
+
 
-int ircomm_check_handle(int handle);
 
-static void ircomm_parse_control(struct ircomm_cb *self, struct sk_buff *skb,
-                                int type);
 static char *ircommstate[] = {
        "DISCOVERY",
        "IDLE",
@@ -109,9 +128,6 @@ static char *ircommevent[] = {
        "IRCOMM_CONTROL_REQUEST",
 };
 
-int ircomm_proc_read(char *buf, char **start, off_t offset,
-                    int len, int unused);
-
 #ifdef CONFIG_PROC_FS
 extern struct proc_dir_entry proc_irda;
 struct proc_dir_entry proc_ircomm = {
@@ -132,13 +148,13 @@ static void (*state[])( struct ircomm_cb *self, IRCOMM_EVENT event,
        ircomm_state_conn,
 };
 
-
 __initfunc(int ircomm_init(void))
 {
        int i;
 
-       printk( KERN_INFO "%s\n", version);
-       DEBUG( 4, "ircomm_common:init_module\n");
+       printk( "Linux-IrDA: IrCOMM protocol ( revision:%s ) \n",
+               revision_date);
+       DEBUG( 4, __FUNCTION__"()\n");
 
        /* allocate master array */
 
@@ -146,7 +162,7 @@ __initfunc(int ircomm_init(void))
                                                IRCOMM_MAX_CONNECTION,
                                                GFP_KERNEL);
        if ( ircomm == NULL) {
-               printk( KERN_WARNING "IrCOMM: Can't allocate ircomm array!\n");
+               printk( KERN_ERR __FUNCTION__"(): kmalloc failed!\n");
                return -ENOMEM;
        }
 
@@ -158,7 +174,7 @@ __initfunc(int ircomm_init(void))
                ircomm[i] = kmalloc( sizeof(struct ircomm_cb), GFP_KERNEL );
 
                if(!ircomm[i]){
-                       printk(KERN_ERR "ircomm:kmalloc failed!\n");
+                       printk( KERN_ERR __FUNCTION__"(): kmalloc failed!\n");
                        return -ENOMEM;
                } 
 
@@ -194,14 +210,17 @@ __initfunc(int ircomm_init(void))
        proc_register( &proc_irda, &proc_ircomm);
 #endif /* CONFIG_PROC_FS */
 
+
+       discovering_instance = NULL;
        return 0;
 }
 
+#ifdef MODULE
 void ircomm_cleanup(void)
 {
        int i;
 
-       DEBUG( 4, "ircomm_common:cleanup_module\n");
+       DEBUG( 4, "ircomm:cleanup_module\n");
        /*
         * free some resources
         */
@@ -227,8 +246,9 @@ void ircomm_cleanup(void)
 
 #ifdef CONFIG_PROC_FS
        proc_unregister( &proc_irda, proc_ircomm.low_ino);
-#endif
+#endif /* CONFIG_PROC_FS */
 }
+#endif /* MODULE */
 
 /*
  * ---------------------------------------------------------------------- 
@@ -236,23 +256,26 @@ void ircomm_cleanup(void)
  * ---------------------------------------------------------------------- 
  */
 
-void ircomm_accept_data_indication(void *instance, void *sap, 
-                                  struct sk_buff *skb)
+static int ircomm_accept_data_indication(void *instance, void *sap, 
+                                        struct sk_buff *skb)
 {
        
        struct ircomm_cb *self = (struct ircomm_cb *)instance;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRCOMM_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
+       ASSERT( self != NULL, return -1;);
+       ASSERT( self->magic == IRCOMM_MAGIC, return -1;);
+       ASSERT( skb != NULL, return -1;);
        
-       DEBUG(4,"ircomm_accept_data_indication:\n");
+       DEBUG(4,__FUNCTION__"():\n");
        ircomm_do_event( self, TTP_DATA_INDICATION, skb);
+       self->rx_packets++;
+       
+       return 0;
 }
 
-void ircomm_accept_connect_confirm(void *instance, void *sap,
+static void ircomm_accept_connect_confirm(void *instance, void *sap,
                                   struct qos_info *qos, 
-                                  int maxsdusize, struct sk_buff *skb)
+                                  __u32 maxsdusize, struct sk_buff *skb)
 {
 
        struct ircomm_cb *self = (struct ircomm_cb *)instance;
@@ -262,7 +285,7 @@ void ircomm_accept_connect_confirm(void *instance, void *sap,
        ASSERT( skb != NULL, return;);
        ASSERT( qos != NULL, return;);
 
-       DEBUG(0,"ircomm_accept_connect_confirm:\n");
+       DEBUG(0,__FUNCTION__"(): got connected!\n");
 
        if(maxsdusize == SAR_DISABLE)
                self->max_txbuff_size = qos->data_size.value; 
@@ -277,9 +300,9 @@ void ircomm_accept_connect_confirm(void *instance, void *sap,
        ircomm_do_event( self, TTP_CONNECT_CONFIRM, skb);
 }
 
-void ircomm_accept_connect_indication(void *instance, void *sap,
+static void ircomm_accept_connect_indication(void *instance, void *sap,
                                      struct qos_info *qos,
-                                     int maxsdusize,
+                                     __u32 maxsdusize,
                                      struct sk_buff *skb )
 {
        struct ircomm_cb *self = (struct ircomm_cb *)instance;
@@ -289,7 +312,7 @@ void ircomm_accept_connect_indication(void *instance, void *sap,
        ASSERT( skb != NULL, return;);
        ASSERT( qos != NULL, return;);
 
-       DEBUG(0,"ircomm_accept_connect_indication:\n");
+       DEBUG(0,__FUNCTION__"()\n");
 
        if(maxsdusize == SAR_DISABLE)
                self->max_txbuff_size = qos->data_size.value;
@@ -298,9 +321,14 @@ void ircomm_accept_connect_indication(void *instance, void *sap,
 
        self->qos = qos;
        ircomm_do_event( self, TTP_CONNECT_INDICATION, skb);
+
+       /* stop connecting */
+       wake_up_interruptible( &self->discovery_wait);
+       wake_up_interruptible( &self->ias_wait);
+
 }
 
-void ircomm_accept_disconnect_indication(void *instance, void *sap, 
+static void ircomm_accept_disconnect_indication(void *instance, void *sap, 
                                         LM_REASON reason,
                                         struct sk_buff *skb)
 {
@@ -308,15 +336,16 @@ void ircomm_accept_disconnect_indication(void *instance, void *sap,
 
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == IRCOMM_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
 
-       DEBUG(0,"ircomm_accept_disconnect_indication:\n");
+       DEBUG(0,__FUNCTION__"():\n");
        ircomm_do_event( self, TTP_DISCONNECT_INDICATION, skb);
+
 }
 
-void ircomm_accept_flow_indication( void *instance, void *sap, LOCAL_FLOW cmd)
+static void ircomm_accept_flow_indication( void *instance, void *sap,
+                                          LOCAL_FLOW cmd)
 {
-       
+       IRCOMM_CMD command;
        struct ircomm_cb *self = (struct ircomm_cb *)instance;
 
        ASSERT( self != NULL, return;);
@@ -324,34 +353,32 @@ void ircomm_accept_flow_indication( void *instance, void *sap, LOCAL_FLOW cmd)
 
        switch(cmd){
        case FLOW_START:
-               DEBUG(0,"ircomm_accept_flow_indication:START\n"); 
-
-               self->pi = TX_READY;
+               DEBUG(4,__FUNCTION__"():START\n"); 
+               command = TX_READY;
                self->ttp_stop = 0;
                if(self->notify.flow_indication)
                        self->notify.flow_indication( self->notify.instance, 
-                                                     self, cmd);
-               ircomm_control_request(self);
+                                                     self, command);
                break;
                
        case FLOW_STOP:
-               DEBUG(0,"ircomm_accept_flow_indication:STOP\n"); 
-               self->pi = TX_BUSY;
+               DEBUG(4,__FUNCTION__":STOP\n"); 
+               command = TX_BUSY;
                self->ttp_stop = 1;
                if(self->notify.flow_indication)
                        self->notify.flow_indication( self->notify.instance, 
-                                                     self, cmd);
+                                                     self, command);
                break;
 
        default:
-               DEBUG(0,"ircomm_accept_flow_indication:unknown status!\n"); 
+               DEBUG(0,__FUNCTION__"();unknown status!\n"); 
        }
 
 }
 
 /* 
  * ----------------------------------------------------------------------
- * Implementation of actions,descrived in section 7.4 of the reference.
+ * Impl. of actions (descrived in section 7.4 of the reference)
  * ----------------------------------------------------------------------
  */
 
@@ -360,33 +387,25 @@ static void issue_connect_request(struct ircomm_cb *self,
 {
        /* TODO: we have to send/build userdata field which contains 
           InitialControlParameters */
-       /* but userdata field is not implemeted in irttp.c.. */
 
        switch(self->servicetype){
        case THREE_WIRE_RAW:
-               /* not implemented yet! Do nothing */
-               DEBUG(0, "ircomm:issue_connect_request:"
-                     "not implemented servicetype!");
+               DEBUG(0, __FUNCTION__"():THREE_WIRE_RAW is not implemented\n");
                break;
 
        case DEFAULT: 
-               irttp_connect_request(self->tsap, self->dlsap, 
-                                     self->saddr, self->daddr,
-                                     NULL, self->maxsdusize, NULL);  
-               break; 
-               
        case THREE_WIRE:
        case NINE_WIRE:
        case CENTRONICS:
 
                irttp_connect_request(self->tsap, self->dlsap, 
                                      self->saddr, self->daddr, 
-                                     NULL, self->maxsdusize, NULL); 
+                                     NULL, self->maxsdusize, userdata); 
                break;
 
        default:
-               DEBUG(0,"ircomm:issue_connect_request:Illegal servicetype %d\n"
-                     ,self->servicetype);
+               printk(KERN_ERR __FUNCTION__"():Illegal servicetype %d\n"
+                      ,self->servicetype);
        }
 }      
 
@@ -401,7 +420,7 @@ static void disconnect_indication(struct ircomm_cb *self, struct sk_buff *skb)
        if(self->notify.disconnect_indication)
                self->notify.disconnect_indication( self->notify.instance,
                                                    self,
-                                                   self->reason,skb);
+                                                   self->reason, skb);
                                                    
 }
 
@@ -429,6 +448,7 @@ static void connect_indication_three_wire_raw(void)
 
 static void connect_confirmation(struct ircomm_cb *self, struct sk_buff *skb)
 {
+       DEBUG(4 ,__FUNCTION__"()\n");
 
        /* give a connect_confirm to the client */
        if( self->notify.connect_confirm )
@@ -440,11 +460,10 @@ static void issue_connect_response(struct ircomm_cb *self,
                                   struct sk_buff *skb)
 {
 
-       DEBUG(0,"ircomm:issue_connect_response:\n");
+       DEBUG(0,__FUNCTION__"()\n");
        
        if( self->servicetype == THREE_WIRE_RAW){
-               DEBUG(0,"ircomm:issue_connect_response():3WIRE-RAW is not " 
-                     "implemented yet !\n");
+               DEBUG(0,__FUNCTION__"():THREE_WIRE_RAW is not implemented yet\n");
                /* irlmp_connect_rsp(); */
        } else {
                irttp_connect_response(self->tsap, self->maxsdusize, skb);
@@ -455,10 +474,11 @@ static void issue_disconnect_request(struct ircomm_cb *self,
                                     struct sk_buff *userdata)
 {
        if(self->servicetype == THREE_WIRE_RAW){
-               DEBUG(0,"ircomm:issue_disconnect_request():3wireraw is not implemented!");
+               DEBUG(0,__FUNCTION__"():3wireraw is not implemented\n");
        }
        else
-               irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
+               irttp_disconnect_request(self->tsap, userdata, 
+                                        self->disconnect_priority);
 }
     
 static void issue_data_request(struct ircomm_cb *self,
@@ -468,52 +488,74 @@ static void issue_data_request(struct ircomm_cb *self,
 
        if(self->servicetype == THREE_WIRE_RAW){
                /* irlmp_data_request(self->lmhandle,userdata); */
-               DEBUG(0,"ircomm:issue_data_request():not implemented!");
+               DEBUG(0,__FUNCTION__"():not implemented!");
                return;
        }
 
-       DEBUG(4,"ircomm:issue_data_request():sending frame\n");
+       DEBUG(4,__FUNCTION__"():sending frame\n");
        err = irttp_data_request(self->tsap , userdata  );
-       if(err)
-               DEBUG(0,"ircomm:ttp_data_request failed\n");
-       if(userdata && err)
-               dev_kfree_skb( userdata);
-
+       if(err){
+               printk(KERN_ERR __FUNCTION__":ttp_data_request failed\n");
+               if(userdata)
+                       dev_kfree_skb( userdata);
+       }
+       self->tx_packets++;
 }
 
 static void issue_control_request(struct ircomm_cb *self,
                                  struct sk_buff *userdata )
 {
-       if(self->servicetype == THREE_WIRE_RAW){
-               DEBUG(0,"THREE_WIRE_RAW is not implemented\n");
+       int err;
+
+       DEBUG(4,__FUNCTION__"()\n"); 
+       if(self->servicetype == THREE_WIRE_RAW)
+       {
+               DEBUG(0,__FUNCTION__"():THREE_WIRE_RAW is not implemented\n");
                
-       }else {
-               irttp_data_request(self->tsap,userdata);
+       }
+       else 
+       {
+               err = irttp_data_request(self->tsap,userdata);
+               if(err)
+               {
+                       printk( __FUNCTION__"():ttp_data_request failed\n");
+                       if(userdata)
+                               dev_kfree_skb( userdata);
+               }
+               else
+                       self->tx_controls++;
+
+               self->pending_control_tuples = 0;
        }
 }
 
 static void process_data(struct ircomm_cb *self, struct sk_buff *skb )
 {
        
-       DEBUG(4,"ircomm:process_data:skb_len is(%d),clen_is(%d)\n",
+       DEBUG(4,__FUNCTION__":skb->len=%d, ircomm header = 1, clen=%d\n",
              (int)skb->len ,(int)skb->data[0]);
 
-       /* 
-        * we always have to parse control channel
-        *  (see page17 of IrCOMM standard) 
+       /* we have to parse control channel when receiving.  (see
+        * page17 of IrCOMM standard) but it is not parsed here since
+        * upper layer may have some receive buffer.
+        *
+        * hence upper layer have to parse it when it consumes a packet.
+        *   -- TH
         */
 
-       ircomm_parse_control(self, skb, CONTROL_CHANNEL);
+       /* ircomm_parse_control(self, skb, CONTROL_CHANNEL); */
 
        if(self->notify.data_indication && skb->len)
                self->notify.data_indication(self->notify.instance, self,
                                             skb);
 }
 
-void ircomm_data_indication(struct ircomm_cb *self, struct sk_buff *skb)
+int ircomm_data_indication(struct ircomm_cb *self, struct sk_buff *skb)
 {
        /* Not implemented yet:THREE_WIRE_RAW service uses this function.  */
        DEBUG(0,"ircomm_data_indication:not implemented yet!\n");
+
+       return 0;
 }
 
 
@@ -528,15 +570,15 @@ static void ircomm_do_event( struct ircomm_cb *self, IRCOMM_EVENT event,
                             struct sk_buff *skb) 
 {
        
-       DEBUG( 4, "ircomm_do_event: STATE = %s, EVENT = %s\n",
+       DEBUG( 4, __FUNCTION__": STATE = %s, EVENT = %s\n",
               ircommstate[self->state], ircommevent[event]);
        (*state[ self->state ]) ( self, event, skb);
 }
 
-void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state) 
+static void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state) 
 {
        self->state = state;
-       DEBUG( 0, "ircomm_next_state: NEXT STATE = %d(%s), sv(%d)\n", 
+       DEBUG( 0, __FUNCTION__": NEXT STATE=%d(%s), servicetype=(%d)\n", 
               (int)state, ircommstate[self->state],self->servicetype);
 }
 
@@ -549,8 +591,7 @@ void ircomm_next_state( struct ircomm_cb *self, IRCOMM_STATE state)
 static void ircomm_state_discovery( struct ircomm_cb *self,
                                    IRCOMM_EVENT event, struct sk_buff *skb )
 {
-       DEBUG(0,"ircomm_state_discovery: "
-             "why call me? \n");
+       printk(KERN_ERR __FUNCTION__"():why call me? something is wrong..\n");
        if(skb)
                dev_kfree_skb( skb);
 }
@@ -578,15 +619,13 @@ static void ircomm_state_idle( struct ircomm_cb *self, IRCOMM_EVENT event,
 
        case LMP_CONNECT_INDICATION:
 
-               /* I think this is already done in irlpt_event.c */
-
-               DEBUG(0,"ircomm_state_idle():LMP_CONNECT_IND is notimplemented!");
+               DEBUG(0,__FUNCTION__"():LMP_CONNECT_IND is notimplemented!");
                /* connect_indication_three_wire_raw(); */
                /* ircomm_next_state(self, COMM_WAITR); */
                break;
 
        default:
-               DEBUG(0,"ircomm_state_idle():unknown event =%d(%s)\n",
+               DEBUG(0,__FUNCTION__"():unknown event =%d(%s)\n",
                      event, ircommevent[event]);
        }
 }
@@ -616,7 +655,7 @@ static void ircomm_state_waiti(struct ircomm_cb *self, IRCOMM_EVENT event,
 /*             ircomm_next_state(self, COMM_IDLE); */
 /*             break; */
        default:
-               DEBUG(0,"ircomm_state_waiti:unknown event =%d(%s)\n",
+               DEBUG(0,__FUNCTION__"():unknown event =%d(%s)\n",
                      event, ircommevent[event]);
        }
 }
@@ -636,8 +675,7 @@ static void ircomm_state_waitr(struct ircomm_cb *self, IRCOMM_EVENT event,
                /* issue_connect_response */
                
                if(self->servicetype==THREE_WIRE_RAW){
-                       DEBUG(0,"ircomm:issue_connect_response:"
-                             "THREE_WIRE_RAW is not implemented!\n");
+                       DEBUG(0,__FUNCTION__"():3WIRE_RAW is not implemented\n");
                        /* irlmp_connect_response(Vpeersap,
                         *                         ACCEPT,null);
                         */
@@ -677,19 +715,15 @@ static void ircomm_state_conn(struct ircomm_cb *self, IRCOMM_EVENT event,
        switch(event){
        case TTP_DATA_INDICATION:
                process_data(self, skb);
-               /* stay CONN state*/
                break;
        case IRCOMM_DATA_REQUEST:
                issue_data_request(self, skb);
-               /* stay CONN state*/
                break;
 /*     case LMP_DATA_INDICATION: */
 /*             ircomm_data_indicated(); */
-/*              stay CONN state */
 /*             break; */
        case IRCOMM_CONTROL_REQUEST:
                issue_control_request(self, skb);
-               /* stay CONN state*/
                break;
        case TTP_DISCONNECT_INDICATION:
                ircomm_next_state(self, COMM_IDLE);
@@ -712,15 +746,188 @@ static void ircomm_state_conn(struct ircomm_cb *self, IRCOMM_EVENT event,
 
 /*
  *  ----------------------------------------------------------------------
- *  ircomm requests
+ *  IrCOMM service interfaces and supporting functions
  *
  *  ----------------------------------------------------------------------
  */
 
-
-void ircomm_connect_request(struct ircomm_cb *self, int maxsdusize)
+int ircomm_query_ias_and_connect(struct ircomm_cb *self, __u8 servicetype)
 {
+       int retval=0;
+       __u16 hints;
+
+       ASSERT( self != NULL, return -EFAULT;);
+       ASSERT( self->magic == IRCOMM_MAGIC, return -EFAULT;);
+       DEBUG(4,__FUNCTION__"():servicetype = %d\n",servicetype);
 
+       /*
+        * wait if another instance is discovering now
+        */  
+       if(discovering_instance){
+               interruptible_sleep_on( &self->discovery_wait);
+               if(signal_pending(current)){
+                       return -EINTR; /* cought a signal */
+               }
+               if(self->state == COMM_CONN)
+                       return 0;  /* got connected */
+       }
+       ASSERT(discovering_instance == NULL, return -EFAULT;);
+       discovering_instance = self;
+       
+       /*
+        * start discovering
+        */
+       hints = irlmp_service_to_hint(S_COMM);
+
+       DEBUG(0,__FUNCTION__"():start discovering..\n");
+       switch (ircomm_cs) {
+       case 0:
+               skey = irlmp_register_service(hints);
+               ckey = irlmp_register_client(hints, ircomm_discovery_indication,
+                                            NULL);
+               break;
+               
+       case 1:    /* client only */
+               DEBUG( 0, __FUNCTION__"():client only mode\n");
+               ckey = irlmp_register_client(hints, ircomm_discovery_indication,
+                                            NULL);
+               break;
+
+       case 2:     /*  server only  */
+       default:
+               DEBUG( 0, __FUNCTION__"():server only mode\n");
+               skey = irlmp_register_service(hints);
+               discovering_instance = NULL;
+               return 0;
+       }
+
+
+       /*
+        * waiting for discovery
+        */
+       interruptible_sleep_on( &self->discovery_wait);
+       if(signal_pending(current)){
+               retval = -EINTR; goto bailout; /* cought a signal */
+       }
+       if(self->state == COMM_CONN)
+               goto bailout;     /* got connected */
+
+       /*
+        * query Parameters field of IAS and waiting for answer
+        */
+
+       self->servicetype = 0;
+       DEBUG(0, __FUNCTION__"():querying IAS: Parameters..\n");
+       iriap_getvaluebyclass_request( "IrDA:IrCOMM", "Parameters",
+                                      self->saddr, self->daddr,
+                                      ircomm_getvalue_confirm, self );
+
+       interruptible_sleep_on( &self->ias_wait);
+       if(signal_pending(current)){
+               retval = -EINTR; goto bailout; /* cought a signal */
+       }
+       if(self->state == COMM_CONN)
+               goto bailout;     /* got connected */
+
+
+       /* really got Parameters field? */
+       if(self->ias_type != IAS_OCT_SEQ){
+               retval = -EFAULT;
+               goto bailout;
+       }
+
+       /* 
+        * check if servicetype we want is available 
+        */
+       self->peer_cap = self->servicetype;
+
+       DEBUG(0,__FUNCTION__"():peer capability is:\n");
+       DEBUG(0,"3wire raw: %s\n",((self->servicetype & THREE_WIRE_RAW) ? "yes":"no"));
+       DEBUG(0,"3wire    : %s\n",((self->servicetype & THREE_WIRE) ? "yes":"no"));
+       DEBUG(0,"9wire    : %s\n",((self->servicetype & NINE_WIRE) ? "yes":"no"));
+       DEBUG(0,"IEEE1284 : %s\n",((self->servicetype & CENTRONICS) ? "yes":"no"));
+
+       self->servicetype &= servicetype;
+       if(!(self->servicetype)){
+               retval = -ENODEV;
+               goto bailout;
+       }
+
+       /*
+        * then choose better one 
+        */
+
+       if(self->servicetype & THREE_WIRE_RAW)
+               servicetype = THREE_WIRE_RAW;
+       if(self->servicetype & THREE_WIRE)
+               servicetype = THREE_WIRE;
+       if(self->servicetype & NINE_WIRE)
+               servicetype = NINE_WIRE;
+       if(self->servicetype & CENTRONICS)
+               servicetype = CENTRONICS;
+
+       self->servicetype = servicetype;
+#if 1
+       /*
+        * waiting for discovery again 
+        */
+       interruptible_sleep_on( &self->discovery_wait);
+       if(signal_pending(current)){
+               retval = -EINTR; goto bailout; /* cought a signal */
+       }
+       if(self->state == COMM_CONN)
+               goto bailout;     /* got connected */
+#endif
+       /*
+        * query lsapsel field and waiting for answer
+        */
+       query_lsapsel(self);
+       interruptible_sleep_on( &self->ias_wait);
+       if(signal_pending(current)){
+               retval = -EINTR; goto bailout; /* cought a signal */
+       }
+       if(self->state == COMM_CONN)
+               goto bailout;     /* got connected */
+
+       /* really got Lsapsel field? */
+       if(self->ias_type != IAS_INTEGER){
+               retval = -EFAULT;
+               goto bailout;
+       } 
+#if 1
+       /*
+        * waiting for discovery again...
+        */
+       interruptible_sleep_on( &self->discovery_wait);
+       if(signal_pending(current)){
+               retval = -EINTR; goto bailout; /* cought a signal */
+       }
+       if(self->state == COMM_CONN)
+               goto bailout;     /* got connected */
+#endif
+
+       /* succeed! ready to connect */
+       discovering_instance = NULL;
+       ircomm_connect_request(self);
+       return 0; 
+
+ bailout:
+       /* failed.  not ready to connect */
+       discovering_instance = NULL;
+       irlmp_unregister_service(skey);
+       irlmp_unregister_client(ckey);
+       return retval;
+}
+
+/* 
+ * ircomm_connect_request()
+ * Impl. of this function is differ from one of the reference.
+ * This functin does discovery as well as sending connect request
+ */
+
+
+void ircomm_connect_request(struct ircomm_cb *self)
+{
        /*
         * TODO:build a packet which contains "initial control parameters"
         * and send it with connect_request
@@ -729,14 +936,17 @@ void ircomm_connect_request(struct ircomm_cb *self, int maxsdusize)
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == IRCOMM_MAGIC, return;);
 
-       DEBUG(0,"ircomm_connect_request:\n");
 
-       self->maxsdusize = maxsdusize;
+       DEBUG(0, __FUNCTION__"():sending connect_request...\n");
+
+       ircomm_control_request(self, SERVICETYPE); /*servictype*/
+
+       self->maxsdusize = SAR_DISABLE;
        ircomm_do_event( self, IRCOMM_CONNECT_REQUEST, NULL);
 }
 
 void ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata,
-                            int maxsdusize)
+                            __u32 maxsdusize)
 {
 
        ASSERT( self != NULL, return;);
@@ -753,11 +963,8 @@ void ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata,
        if(!userdata){
                /* FIXME: check for errors and initialize? DB */
                userdata = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE);
-               if(!userdata){
-                 DEBUG(0, __FUNCTION__"alloc_skb failed\n");
-                 return;
-               }
-               IS_SKB(userdata, return;);
+               ASSERT(userdata != NULL, return;);
+
                skb_reserve(userdata,COMM_HEADER_SIZE);
        }
 
@@ -771,33 +978,70 @@ void ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata,
 }      
 
 void ircomm_disconnect_request(struct ircomm_cb *self, 
-                              struct sk_buff *userdata)
+                              struct sk_buff *userdata,
+                              int priority)
 {
 
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == IRCOMM_MAGIC, return;);
+       DEBUG(0,__FUNCTION__"()\n");
+
+       /* unregister layer */
+       switch (ircomm_cs) {
+       case 1:    /* client only */
+               irlmp_unregister_client(ckey);
+               break;
+
+       case 2:     /*  server only  */
+               irlmp_unregister_service(skey);
+               break;
+       case 0:
+       default:
+               irlmp_unregister_client(ckey);
+               irlmp_unregister_service(skey);
+               break;
+       }
 
-       DEBUG(0,"ircomm_disconnect_request\n");
-       ircomm_do_event(self, IRCOMM_DISCONNECT_REQUEST, NULL);
+       self->disconnect_priority = priority;
+       if(priority != P_HIGH)
+               self->disconnect_priority = P_NORMAL;
+
+       ircomm_do_event(self, IRCOMM_DISCONNECT_REQUEST, userdata);
 }      
 
 
-void ircomm_data_request(struct ircomm_cb *self, struct sk_buff *userdata)
+int ircomm_data_request(struct ircomm_cb *self, struct sk_buff *userdata)
 {
+       __u8 * frame;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRCOMM_MAGIC, return;);
-       ASSERT( userdata != NULL, return;);
+       DEBUG(4,__FUNCTION__"()\n");
+       ASSERT( self != NULL, return -EFAULT;);
+       ASSERT( self->magic == IRCOMM_MAGIC, return -EFAULT;);
+       ASSERT( userdata != NULL, return -EFAULT;);
        
+
        if(self->state != COMM_CONN){
-               DEBUG(4,"ignore IRCOMM_DATA_REQUEST:not connected\n");
-               if(userdata)
-                       dev_kfree_skb(userdata);
-               return;
+               DEBUG(4,__FUNCTION__"():not connected, data is ignored\n");
+               return -EINVAL;
+       }
+
+       if(self->ttp_stop)
+               return -EBUSY;
+
+       if(self->control_ch_pending){
+               /* send control_channel */
+               ircomm_tx_controlchannel(self);
        }
 
-       DEBUG(4,"ircomm_data_request\n");
+       if(self->ttp_stop)
+               return -EBUSY;
+
+       /* add "clen" field */
+       frame = skb_push(userdata,1);
+       frame[0]=0;          /* without control channel */
+
        ircomm_do_event(self, IRCOMM_DATA_REQUEST, userdata);
+       return 0;
 }
 
 /*
@@ -807,20 +1051,25 @@ void ircomm_data_request(struct ircomm_cb *self, struct sk_buff *userdata)
  *  ----------------------------------------------------------------------
  */
 
-static void ircomm_tx_ctrlbuffer(struct ircomm_cb *self )
+
+static void ircomm_tx_controlchannel(struct ircomm_cb *self )
 {
 
        __u8 clen;
        struct sk_buff *skb = self->ctrl_skb;
        
-       DEBUG(4,"ircomm_tx_ctrlbuffer:\n");
+       DEBUG(4,__FUNCTION__"()\n");
+       /* 'self' should have been checked */
+       ASSERT(!self->ttp_stop, return ;);
+       ASSERT(self->state == COMM_CONN, return ;);
 
        /* add "clen" field */
 
        clen=skb->len;
-       if(clen){
-               skb_push(skb,1);
-               skb->data[0]=clen;
+       ASSERT(clen != 0,return;);
+
+       skb_push(skb,1);
+       skb->data[0]=clen;
 
 #if 0
        printk("tx_ctrl:");
@@ -831,148 +1080,106 @@ static void ircomm_tx_ctrlbuffer(struct ircomm_cb *self )
                printk("\n");
        }
 #endif
-
-               ircomm_do_event(self, IRCOMM_CONTROL_REQUEST, skb);
-
-               skb = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE);
-               if (skb==NULL){
-                       DEBUG(0,"ircomm_tx_ctrlbuffer:alloc_skb failed!\n");
-                       return;
-               }
-               skb_reserve(skb,COMM_HEADER_SIZE);
-               self->ctrl_skb = skb;
-       }
-}
-
-
-void ircomm_control_request(struct ircomm_cb *self)
-{
        
-       struct sk_buff *skb;
+       ircomm_do_event(self, IRCOMM_CONTROL_REQUEST, skb);
+       self->control_ch_pending = 0;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRCOMM_MAGIC, return;);
+       skb = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE);
+       ASSERT(skb != NULL, return ;);
 
-       DEBUG(0, "ircomm_control_request:\n");
-
-       if(self->ttp_stop || self->state != COMM_CONN){
-               DEBUG(0,"ircomm_control_request:can't send it.. ignore it\n");
-               return;
-       }
-       
-       skb = self->ctrl_skb;
-       IS_SKB(skb,return;);
-               
-       if(skb->len)
-               ircomm_tx_ctrlbuffer(self);
+       skb_reserve(skb,COMM_HEADER_SIZE);
+       self->ctrl_skb = skb;
 }
 
 
 static void append_tuple(struct ircomm_cb *self, __u8 instruction, __u8 pl , 
                         __u8 *value)
 {
-
        __u8 *frame;
        struct sk_buff *skb;
-       int i,c;
+       int i,c = 0;
+       unsigned long flags;
+
+       save_flags(flags);cli();
 
        skb = self->ctrl_skb;
        ASSERT(skb != NULL, return;);
-       IS_SKB(skb,return;);
        
-       /*if there is little room in the packet... */
-
-       if(skb->len > COMM_DEFAULT_DATA_SIZE - COMM_HEADER_SIZE - (pl+2)){
-               if(!self->ttp_stop && self->state == COMM_CONN){
-
-                       /* send a packet if we can */
-                       ircomm_tx_ctrlbuffer(self);
-                       skb = self->ctrl_skb;
-               } else {
-                       DEBUG(0, "ircomm_append_ctrl:there's no room.. ignore it\n");
-
-                       /* TODO: we have to detect whether we have to resend some
-                          information after ttp_stop is cleared */
-
-                       /* self->resend_ctrl = 1; */
-                       return;
-               }
+       if(skb_tailroom(skb) < (pl+2)){
+               DEBUG(0, __FUNCTION__"there's no room.. ignore it\n");
+               self->ignored_control_tuples++;
+               restore_flags(flags);
+               return;
        }
 
        frame = skb_put(skb,pl+2);
-       c = 0;
        frame[c++] = instruction;     /* PI */
        frame[c++] = pl;              /* PL */
        for(i=0; i < pl ; i++)
                frame[c++] = *value++;   /* PV */
-       
+       restore_flags(flags);   
+       self->pending_control_tuples++;
+       self->control_ch_pending = 1;
 }
 
 
 
 /*
- * ircomm_append_ctrl();
+ * ircomm_control_request();
  * this function is exported as a request to send some control-channel tuples
  * to peer device
  */
 
-void ircomm_append_ctrl(struct ircomm_cb *self,  __u8 instruction)
+void ircomm_control_request(struct ircomm_cb *self,  __u8 instruction)
 {
 
-       __u8  pv[70];
+       __u8  pv[32];      /* 32 max, for PORT_NAME */
        __u8  *value = &pv[0];
        __u32 temp;
+       int notsupp=0;
 
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == IRCOMM_MAGIC, return;);
 
-       if(self->state != COMM_CONN)
-               return;
-
        if(self->servicetype == THREE_WIRE_RAW){
-               DEBUG(0,"THREE_WIRE_RAW shuold not use me!\n");
+               DEBUG(0,__FUNCTION__"():THREE_WIRE_RAW shuold not use me!\n");
                return;
        }
 
-       DEBUG(4,"ircomm_append_ctrl:\n");
+       DEBUG(4,__FUNCTION__"()\n");
 
        /* find parameter and its length */
 
-       switch(instruction){
+       if(self->servicetype == THREE_WIRE) goto threewire;
+       if(self->servicetype == NINE_WIRE) goto ninewire;
 
-       case POLL_FOR_LINE_SETTINGS:
-       case STATUS_QUERY:
+
+       /* FIXME: centronics service is not fully implemented yet*/
+       switch(instruction){
        case IEEE1284_MODE_SUPPORT:
        case IEEE1284_DEVICEID:
                append_tuple(self,instruction,0,NULL);
                break;
-
-       case SERVICETYPE:
-               value[0] = self->servicetype;
-               append_tuple(self,instruction,1,value);
+       case STATUS_QUERY:
+               append_tuple(self,instruction,0,NULL);
                break;
-       case DATA_FORMAT:
-               value[0] = self->data_format;
+       case SET_BUSY_TIMEOUT:
+               value[0] = self->busy_timeout;
                append_tuple(self,instruction,1,value);
                break;
-       case FLOW_CONTROL:
-               if(self->null_modem_mode){
+       case IEEE1284_ECP_EPP_DATA_TRANSFER: 
+               value[0] = self->ecp_epp_mode;
+               value[1] = self->channel_or_addr;
+               append_tuple(self,instruction,2,value); 
+               break; 
+       default:
+               notsupp=1;
+       }
 
-                       /* inside out */
-                       value[0]  = (self->flow_ctrl & 0x55) << 1;
-                       value[0] |= (self->flow_ctrl & 0xAA) >> 1;
-               }else{
-                       value[0] = self->flow_ctrl;
-               }
-               append_tuple(self,instruction,1,value);
-               break;
-       case LINESTATUS:
-               value[0] = self->line_status;
-               append_tuple(self,instruction,1,value);
-               break;
-       case BREAK_SIGNAL:
-               value[0] = self->break_signal;
-               append_tuple(self,instruction,1,value);
+ ninewire:
+       switch(instruction){
+       case POLL_FOR_LINE_SETTINGS:
+               append_tuple(self,instruction,0,NULL);
                break;
        case DTELINE_STATE:             
                if(self->null_modem_mode){
@@ -1003,8 +1210,42 @@ void ircomm_append_ctrl(struct ircomm_cb *self,  __u8 instruction)
                value[0] = self->dce;
                append_tuple(self,instruction,1,value);
                break;
-       case SET_BUSY_TIMEOUT:
-               value[0] = self->busy_timeout;
+
+       default:
+               notsupp=1;
+       }
+
+ threewire:
+       switch(instruction){
+
+       case SERVICETYPE:
+               value[0] = self->servicetype;
+               append_tuple(self,instruction,1,value);
+               break;
+
+       case DATA_FORMAT:
+               value[0] = self->data_format;
+               append_tuple(self,instruction,1,value);
+               break;
+
+       case FLOW_CONTROL:
+               if(self->null_modem_mode){
+                       /* inside out */
+                       value[0]  = (self->flow_ctrl & 0x55) << 1;
+                       value[0] |= (self->flow_ctrl & 0xAA) >> 1;
+               }else{
+                       value[0] = self->flow_ctrl;
+               }
+               append_tuple(self,instruction,1,value);
+               break;
+
+       case LINESTATUS:
+               value[0] = self->line_status;
+               append_tuple(self,instruction,1,value);
+               break;
+
+       case BREAK_SIGNAL:
+               value[0] = self->break_signal;
                append_tuple(self,instruction,1,value);
                break;
 
@@ -1020,12 +1261,6 @@ void ircomm_append_ctrl(struct ircomm_cb *self,  __u8 instruction)
                append_tuple(self,instruction,2,value); 
                break; 
 
-       case IEEE1284_ECP_EPP_DATA_TRANSFER: 
-               value[0] = self->ecp_epp_mode;
-               value[1] = self->channel_or_addr;
-               append_tuple(self,instruction,2,value); 
-               break; 
-
        case DATA_RATE:
                temp = self->data_rate;
                value[3] = (__u8)((temp >> 24) & 0x000000ff);
@@ -1034,203 +1269,422 @@ void ircomm_append_ctrl(struct ircomm_cb *self,  __u8 instruction)
                value[0] = (__u8)(temp & 0x000000ff);
                append_tuple(self,instruction,4,value);
                break;
-
 #if 0
        case PORT_NAME:
        case FIXED_PORT_NAME:
                temp = strlen(&self->port_name);
-               if(temp < 70){
+               if(temp < 32){
                        value = (__u8) (self->port_name);
                        append_tuple(self,instruction,temp,value);
-               }
-               break;
+               }else
+                       DEBUG(0,__FUNCTION__"() PORT_NAME:too long\n");
 #endif
-
-/* TODO: control tuples for centronics emulation is not implemented */
-/*     case IEEE1284_MODE: */
+               break;
 
        default:
-               DEBUG(0,"ircomm_append_ctrl:instruction(0x%02x)is not"
-                     "implemented\n",instruction);
+               if(notsupp)
+                       DEBUG(0,__FUNCTION__"():instruction(0x%02x)is not"
+                             "implemented\n",instruction);
        }
 
 
 }
 
-static void ircomm_parse_control(struct ircomm_cb *self,
-                                struct sk_buff *skb,
-                                int type)
+void ircomm_parse_tuples(struct ircomm_cb *self, struct sk_buff *skb, int type)
 {
 
        __u8 *data;
-       __u8 pi,pl,pv[64];
+       __u8 pi,plen;
        int clen = 0;
-       int i,indicate,count = 0;
+       int indicate=0;
 
-       
-       data = skb->data;
-       if(type == IAS_PARAM) 
-               clen = ((data[count++] << 8) & data[count++]); /* MSB first */
-       else /* CONTROL_CHANNEL */
-               clen = data[count++];
+       ASSERT(skb != NULL, return;);
+       ASSERT(self != NULL, return ;);
+       ASSERT(self->magic == IRCOMM_MAGIC, return ;);
 
 
-       if(clen == 0){
-               skb_pull( skb, 1);  /* remove clen field */
-               return;
+#ifdef IRCOMM_DEBUG_TUPLE
+       DEBUG(0, __FUNCTION__"():tuple sequence is:\n");
+       {
+               int i;
+               for ( i=0;i< skb->len;i++)
+                       printk("%02x", (__u8)(skb->data[i]));
+               printk("\n");
        }
+#endif
 
+       data = skb->data;
+       if(type == IAS_PARAM)
+       {
+               clen = (data[0] << 8) & 0xff00;
+               clen |= data[1] & 0x00ff;
+               ASSERT( clen <= (skb->len - 2) && clen <= 1024, goto corrupted;);
+               DEBUG(4, __FUNCTION__"():IAS_PARAM len = %d\n",clen );
+               skb_pull( skb, 2);
+       }
+       else
+       {
+               /* CONTROL_CHANNEL */
+               clen = data[0];
+               ASSERT( clen < skb->len, goto corrupted;);
+               DEBUG(4, __FUNCTION__"():CONTROL_CHANNEL:len = %d\n",clen );
+               skb_pull( skb, 1);
+       }
 
+       while( clen >= 2 ){
+               data = skb->data;
+               indicate = 0;
 
-
-       while( count < clen ){
                /* 
                 * parse controlparameters and set value into structure 
                 */
-               pi = data[count++];
-               pl = data[count++];
-                       
-               DEBUG(0, "parse_control:instruction(0x%02x)\n",pi) ;
+               pi = data[0];
+               plen = data[1];
 
+               ASSERT( clen >= 2+plen, goto corrupted; );
+               DEBUG(4, __FUNCTION__"():instruction=0x%02x,len=%d\n",
+                     pi, plen) ;
 
-               /* copy a tuple into pv[] */
 
-#ifdef IRCOMM_DEBUG_TUPLE
-               printk("data:");
-               for(i=0; i < pl; i++){
-                       pv[i] = data[count++];
-                       printk("%02x",pv[i]);
-               }
-               printk("\n");
-#else
-               for(i=0; i < pl; i++)
-                       pv[i] = data[count++];
-#endif                 
+               switch(pi)
+               {
+               case POLL_FOR_LINE_SETTINGS:
+                       ircomm_control_request(self, DTELINE_STATE);
+                       break;
                
-
-               /* parse pv */
-               indicate = 0;
-
-               switch(pi){
-                       
-                       /*
-                        * for 3-wire/9-wire/centronics
-                        */
-                       
                case SERVICETYPE:
-                       self->peer_servicetype = pv[0];
+                       self->servicetype = data[2];
                        break;
+
                case PORT_TYPE:
-                       self->peer_port_type = pv[0];
-                       break;
-#if 0 
-               case PORT_NAME:
-                       self->peer_port_name = *pv;
-                       break;
-               case FIXED_PORT_NAME:
-                       self->peer_port_name = *pv;
-                       /* 
-                        * We should not connect if user of IrCOMM can't
-                        * recognize the port name
-                        */
-                       self->port_name_critical = TRUE;
-                       break;
-#endif
-               case DATA_RATE:     
-                       self->peer_data_rate    = (pv[3]<<24) & (pv[2]<<16)
-                               & (pv[1]<<8) & pv[0];
-                       indicate = 1;
+                       self->peer_port_type = data[2];
                        break;
+
                case DATA_FORMAT:   
-                       self->peer_data_format = pv[0];
+                       self->peer_data_format = data[2];
                        break;
+
                case FLOW_CONTROL:
-                       self->peer_flow_ctrl = pv[0];
-                       indicate = 1;
-                       break;
-               case XON_XOFF_CHAR:
-                       self->peer_xon_char = pv[0];
-                       self->peer_xoff_char = pv[1];
-                       indicate = 1;
-                       break;
-               case ENQ_ACK_CHAR:
-                       self->peer_enq_char = pv[0];
-                       self->peer_ack_char = pv[1];
+                       self->peer_flow_ctrl = data[2];
                        indicate = 1;
                        break;
+
                case LINESTATUS:
-                       self->peer_line_status = pv[0];
+                       self->peer_line_status = data[2];
                        indicate = 1;
                        break;
+
                case BREAK_SIGNAL:
-                       self->peer_break_signal = pv[0];
+                       self->peer_break_signal = data[2];
                        /* indicate = 1; */
                        break;
-                       
-                       /*
-                        * for 9-wire
-                        */
+
+               case DCELINE_STATE:
+                       self->peer_dce = data[2];
+                       indicate = 1;
+                       break;
 
                case DTELINE_STATE:
                        if(self->null_modem_mode){
                                /* input DTR as {DSR & CD & RI} */
                                self->peer_dce = 0;
-                               if(pv[0] & DELTA_DTR)
-                                       self->peer_dce |= DELTA_DSR|DELTA_RI|DELTA_DCD;
-                               if(pv[0] & MCR_DTR)
-                                       self->peer_dce |= MSR_DSR|MSR_RI|MSR_DCD;
-
+                               if(data[2] & DELTA_DTR)
+                                       self->peer_dce |= (DELTA_DSR|
+                                                          DELTA_RI|
+                                                          DELTA_DCD);
+                               if(data[2] & MCR_DTR)
+                                       self->peer_dce |= (MSR_DSR|
+                                                          MSR_RI|
+                                                          MSR_DCD);
                                /* rts as cts */
-                               if(pv[0] & DELTA_RTS)
+                               if(data[2] & DELTA_RTS)
                                        self->peer_dce |= DELTA_CTS;
-                               if(pv[0] & MCR_RTS)
+                               if(data[2] & MCR_RTS)
                                        self->peer_dce |= MSR_CTS;
                        }else{
-                               self->peer_dte = pv[0];
+                               self->peer_dte = data[2];
                        }
                        indicate = 1;                   
                        break;
+                       
+               case XON_XOFF_CHAR:
+                       self->peer_xon_char = data[2];
+                       self->peer_xoff_char = data[3];
+                       indicate = 1;
+                       break;
 
-               case DCELINE_STATE:
-                       self->peer_dce = pv[0];
+               case ENQ_ACK_CHAR:
+                       self->peer_enq_char = data[2];
+                       self->peer_ack_char = data[3];
                        indicate = 1;
                        break;
 
-               case POLL_FOR_LINE_SETTINGS:
-                       ircomm_append_ctrl(self, DTELINE_STATE);
-                       ircomm_control_request(self);
+               case DATA_RATE:
+                       self->peer_data_rate = (  data[5]<<24
+                                                 & data[4]<<16
+                                                 & data[3]<<8
+                                                 & data[2]);
+                       indicate = 1;
                        break;
 
-                       /*
-                        * for centronics .... not implemented yet
+               case PORT_NAME:
+                       ASSERT(plen <= 32 , goto corrupted;);
+                       memcpy(self->port_name, data + 2, plen);
+                       *(__u8 *)(self->port_name+plen) = 0;
+                       break;
+
+               case FIXED_PORT_NAME:
+                       ASSERT(plen <= 32 , goto corrupted;);
+                       memcpy(self->port_name, data + 2, plen);
+                       *(__u8 *)(self->port_name+plen) = 0;
+                       /* 
+                        * We should not connect if user of IrCOMM can't
+                        * recognize the port name
                         */
-/*                     case STATUS_QUERY: */
-/*                     case SET_BUSY_TIMEOUT: */
-/*                     case IEEE1284_MODE_SUPPORT: */
-/*                     case IEEE1284_DEVICEID: */
-/*                     case IEEE1284_MODE: */
-/*                     case IEEE1284_ECP_EPP_DATA_TRANSFER:     */
-                       
-               default:
-                       DEBUG(0, "ircomm_parse_control:not implemented "
-                             "instruction(%d)\n", pi);
+                       self->port_name_critical = TRUE;
                        break;
+
+               default:
+                       DEBUG(0, __FUNCTION__
+                             "():not implemented (PI=%d)\n", pi);
                }
 
-               if(indicate && self->notify.flow_indication 
-                  && type == CONTROL_CHANNEL){
-                       
-                       DEBUG(0,"ircomm:parse_control:indicating..:\n");
+
+               if(indicate && 
+                  self->notify.flow_indication && type == CONTROL_CHANNEL)
+               {
+                       DEBUG(4,__FUNCTION__":indicating..:\n");
                        self->pi = pi;
                        if(self->notify.flow_indication)
-                               self->notify.flow_indication(self->notify.instance, self, 0);
-                       indicate = 0;
+                               self->notify.flow_indication(self->notify.instance,
+                                                            self,
+                                                            CONTROL_CHANNEL);
+               }
+               skb_pull(skb, 2+plen);
+               clen -= (2+plen);
+       }
+
+       return;
+
+ corrupted:
+       skb_pull(skb, skb->len);   /* remove suspicious data */
+       return;
+}
+
+/*
+ * ----------------------------------------------------------------------
+ * Function ircomm_open_instance() ,ircomm_close_instance() and friends
+ *
+ * ircomm_open_instance discoveres the peer device and then issues a
+ * connect request
+ * ----------------------------------------------------------------------
+ */
+
+
+
+/*
+ * ircomm_getvalue_confirm()
+ * handler for iriap_getvaluebyclass_request() 
+ */
+
+static void ircomm_getvalue_confirm( __u16 obj_id, struct ias_value *value,
+                                    void *priv)
+{
+       struct ircomm_cb *self = (struct ircomm_cb *) priv;
+       struct sk_buff *skb= NULL;
+       __u8 *frame;
+       ASSERT( self != NULL, return;);
+       ASSERT( self->magic == IRCOMM_MAGIC, return;);
+
+       /* Check if request succeeded */
+       if ( !value) {
+               DEBUG( 0, __FUNCTION__ "(), got NULL value!\n");
+               return;
+       }
+
+       DEBUG(4, __FUNCTION__"():type(%d)\n", value->type);
+
+       self->ias_type = value->type;
+       switch(value->type){
+       case IAS_OCT_SEQ:
+               
+               DEBUG(4, __FUNCTION__"():got octet sequence:\n");
+#if 0
+               {
+                       int i;
+                       for ( i=0;i<value->len;i++)
+                               printk("%02x",
+                                      (__u8)(*(value->t.oct_seq + i)));
+                       printk("\n");
                }
+#endif
+               skb = dev_alloc_skb((value->len) + 2);
+               ASSERT(skb != NULL, return;);
+               frame = skb_put(skb,2);
+               /* MSB first */
+               frame[0] = ( value->len >> 8 ) & 0xff;
+               frame[1] = value->len & 0xff;
+               
+               frame = skb_put(skb,value->len);
+               memcpy(frame, value->t.oct_seq, value->len);
+               ircomm_parse_tuples(self, skb, IAS_PARAM);
+               kfree_skb(skb);
+
+               wake_up_interruptible( &self->ias_wait);
+               break;
+
+       case IAS_INTEGER:
+               /* LsapSel seems to be sent to me */    
+               DEBUG(0, __FUNCTION__"():got lsapsel = %d\n", value->t.integer);
+
+               if ( value->t.integer == -1){
+                       DEBUG( 0, __FUNCTION__"():invalid value!\n");
+                       return;
+               }
+
+               if(self->state == COMM_IDLE){
+                       self->dlsap = value->t.integer;
+
+                       wake_up_interruptible( &self->ias_wait);
+               }
+               break;
+
+       case IAS_MISSING:
+               DEBUG( 0, __FUNCTION__":got IAS_MISSING\n");
+               break;
+   
+       default:
+               DEBUG( 0, __FUNCTION__":got unknown (strange?)type!\n");
+               break;
+       }
+}
+
+
+/*
+ * query_lsapsel()
+ *    quering the remote IAS to ask which
+ *    dlsap we should use
+ */
+
+static void query_lsapsel(struct ircomm_cb * self)
+{
+       DEBUG(0, __FUNCTION__"():querying IAS: Lsapsel...\n");
+
+       if (!(self->servicetype & THREE_WIRE_RAW)) {
+               iriap_getvaluebyclass_request( 
+                       "IrDA:IrCOMM", "IrDA:TinyTP:LsapSel",
+                       self->saddr, self->daddr,
+                       ircomm_getvalue_confirm, self );
+       } else {
+               DEBUG(0, __FUNCTION__ "THREE_WIRE_RAW is not implemented!\n");
        }
-       skb_pull( skb, 1+clen);
+}
+
+/*
+ * ircomm_discovery_indication()
+ *    Remote device is discovered, try query the remote IAS to see which
+ *    device it is, and which services it has.
+ */
+
+static void ircomm_discovery_indication(discovery_t *discovery)
+{
+       struct ircomm_cb *self;
+
+       self = discovering_instance;
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IRCOMM_MAGIC, return;);
+
+       self->daddr = discovery->daddr;
+       self->saddr = discovery->saddr;
+
+       DEBUG( 0, __FUNCTION__"():daddr=%08x\n", self->daddr);
+
+       wake_up_interruptible( &self->discovery_wait);
        return;
 }
 
+
+struct ircomm_cb * ircomm_open_instance( struct notify_t client_notify)
+{
+       int i;
+       struct ircomm_cb *self = NULL;
+       struct notify_t notify;
+       unsigned long flags;
+
+       ASSERT(ircomm != NULL,return NULL;);
+       DEBUG(0,__FUNCTION__"():\n");
+
+       /* find free handle */
+
+       save_flags(flags);
+       cli();
+       for(i = 0; i < IRCOMM_MAX_CONNECTION; i++){
+               ASSERT(ircomm[i] != NULL,return(NULL););
+               if(!ircomm[i]->in_use){
+                       self = ircomm[i];
+                       break;
+               }
+       }
+
+       if (!self){
+               DEBUG(0,__FUNCTION__"():no free handle!\n");
+               return (NULL);
+       }
+
+       self->in_use = 1;
+       restore_flags(flags);
+
+       self->notify = client_notify;
+       self->ttp_stop = 0;
+       self->control_ch_pending = 0;
+
+       /* register callbacks */
+
+       irda_notify_init(&notify);
+       notify.data_indication = ircomm_accept_data_indication;
+       notify.connect_confirm = ircomm_accept_connect_confirm;
+       notify.connect_indication = ircomm_accept_connect_indication;
+       notify.flow_indication = ircomm_accept_flow_indication;
+       notify.disconnect_indication = ircomm_accept_disconnect_indication;
+       notify.instance = self;
+       strncpy( notify.name, "IrCOMM", NOTIFY_MAX_NAME);
+
+       self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT,
+                                    &notify);
+       if(!self->tsap){
+               DEBUG(0,__FUNCTION__"failed to allocate tsap\n");
+               return NULL;
+       }
+
+       ircomm_next_state(self, COMM_IDLE);     
+       return (self);
+}
+
+int ircomm_close_instance(struct ircomm_cb *self)
+{
+       ASSERT( self != NULL, return -EIO;);
+       ASSERT( self->magic == IRCOMM_MAGIC, return -EIO;);
+       ASSERT( self->ctrl_skb != NULL, return -EIO;);
+
+       DEBUG(0,__FUNCTION__"()\n");
+
+       /* shutdown ircomm layer */
+       if(self->state != COMM_IDLE && self->state != COMM_WAITI)
+       {
+               DEBUG(0,__FUNCTION__"():force disconnecting..\n");
+               ircomm_disconnect_request(self, NULL, P_HIGH);
+       }
+
+       skb_trim(self->ctrl_skb,0);
+       /* remove a tsap */
+       if(self->tsap)
+               irttp_close_tsap(self->tsap);
+       self->tsap = NULL;
+       self->in_use = 0;
+       return 0;
+}
+
+
 /*
  * ----------------------------------------------------------------------
  * Function init_module(void) ,cleanup_module()
@@ -1241,21 +1695,21 @@ static void ircomm_parse_control(struct ircomm_cb *self,
  */
 
 #ifdef MODULE
-
 int init_module(void) 
 {
-       ircomm_init();
+       int err;
 
-       DEBUG( 4, "ircomm:init_module:done\n");
-       return 0;
+       err = ircomm_init();
+
+       DEBUG( 4, __FUNCTION__"():done.\n");
+       return err;
 }
        
 void cleanup_module(void)
 {
        ircomm_cleanup();
-       DEBUG( 0, "ircomm_common:cleanup_module:done.\n");
+       DEBUG( 4, __FUNCTION__"():done.\n");
 }
-
 #endif /* MODULE */
 
 /************************************************************
@@ -1278,46 +1732,85 @@ int ircomm_proc_read(char *buf, char **start, off_t offset,
        len = 0;
        for (i=0; i<IRCOMM_MAX_CONNECTION; i++) {
 
+               len += sprintf(buf+len, "instance %d:\n",i);
+               if(ircomm[i]->in_use == 0){
+                       len += sprintf(buf+len, "\tunused\n");
+                       continue;
+               }
+
                if (ircomm[i] == NULL || ircomm[i]->magic != IRCOMM_MAGIC) {
-                       len += sprintf(buf+len, "???\t");
-               }else {
-                       switch (ircomm[i]->servicetype) {
-                       case UNKNOWN:
-                               index = 0;
-                               break;
-                       case THREE_WIRE_RAW:
-                               index = 1;
-                               break;
-                       case THREE_WIRE:
-                               index = 2;
-                               break;
-                       case NINE_WIRE:
-                               index = 3;
-                               break;
-                       case CENTRONICS:
-                               index = 4;
-                               break;
-                       default:
-                               index = 0;
-                               break;
-                       }
-                       len += sprintf(buf+len, "service: %s\t",
-                                      ircommservicetype[index]);
-                       if(index){
-                               len += sprintf(buf+len, "porttype: %s  ",
-                                              ircommporttype[ircomm[i]->port_type]);
-                               len += sprintf(buf+len, "state: %s  ",
-                                              ircommstate[ircomm[i]->state]);
-                               len += sprintf(buf+len, "user: %s  ",
-                                              ircomm[i]->notify.name);
-                               len += sprintf(buf+len, "nullmodem emulation: %s",
-                                              (ircomm[i]->null_modem_mode ? "yes":"no"));
-                       }
+                       len += sprintf(buf+len, "\tbroken???\n");
+                       continue;
+               }
+
+               switch (ircomm[i]->servicetype) {
+               case UNKNOWN:
+                       index = 0;
+                       break;
+               case THREE_WIRE_RAW:
+                       index = 1;
+                       break;
+               case THREE_WIRE:
+                       index = 2;
+                       break;
+               case NINE_WIRE:
+                       index = 3;
+                       break;
+               case CENTRONICS:
+                       index = 4;
+                       break;
+               default:
+                       index = 0;
+                       break;
                }
-               len += sprintf(buf+len, "\n");
+               len += sprintf(buf+len, "    service: %s  ",
+                              ircommservicetype[index]);
+               if(!index)
+                       continue;
+
+               len += sprintf(buf+len, "porttype: %s  ",
+                              ircommporttype[ircomm[i]->port_type]);
+               len += sprintf(buf+len, "state: %s  ",
+                              ircommstate[ircomm[i]->state]);
+               len += sprintf(buf+len, "user: %s\n",
+                              ircomm[i]->notify.name);
+               
+               len += sprintf(buf+len, "    tx packets: %d  ",
+                              ircomm[i]->tx_packets);
+               len += sprintf(buf+len, "rx packets: %d  ",
+                              ircomm[i]->rx_packets);
+               len += sprintf(buf+len, "tx controls: %d\n",
+                              ircomm[i]->tx_controls);
+               
+               len += sprintf(buf+len, "    pending tuples: %d  ",
+                              ircomm[i]->pending_control_tuples);
+               len += sprintf(buf+len, "    ignored tuples: %d\n",
+                              ircomm[i]->ignored_control_tuples);
+               
+               len += sprintf(buf+len, "    nullmodem emulation: %s  ",
+                              (ircomm[i]->null_modem_mode ? "yes":"no"));
+               len += sprintf(buf+len, "IrTTP: %s\n",
+                              (ircomm[i]->ttp_stop ? "BUSY":"READY"));
+
+               len += sprintf(buf+len, "    Peer capability: ");
+               if(ircomm[i]->peer_cap & THREE_WIRE_RAW)
+                       len += sprintf(buf+len, "3wire-raw ");
+               if(ircomm[i]->peer_cap & THREE_WIRE)
+                       len += sprintf(buf+len, "3wire ");
+               if(ircomm[i]->peer_cap & NINE_WIRE)
+                       len += sprintf(buf+len, "9wire ");
+               if(ircomm[i]->peer_cap & CENTRONICS)
+                       len += sprintf(buf+len, "centronics");
+
+               len += sprintf(buf+len, "\n    Port name: %s\n",
+                              (ircomm[i]->port_name));
        }
+
        return len;
 }
 
 #endif /* CONFIG_PROC_FS */
 
+
+
+
diff --git a/net/irda/ircomm/irvtd.c b/net/irda/ircomm/irvtd.c
deleted file mode 100644 (file)
index e017815..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      irvtd.c
- * Version:       
- * Description:   A virtual tty driver implementaion,
- *                which also may be called as "Port Emulation Entity"
- *                in IrCOMM specification.
- * Status:        Experimental.
- * Author:        Takahide Higuchi <thiguchi@pluto.dti.ne.jp>
- * Source:        irlpt.c
- *
- *     Copyright (c) 1998, Takahide Higuchi, <thiguchi@pluto.dti.ne.jp>,
- *     All Rights Reserved.
- *
- *     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.
- *
- *     I, Takahide Higuchi, provide no warranty for any of this software.
- *     This material is provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-/* #include <linux/module.h> */
-
-#include <linux/init.h>
-
-#include <net/irda/irda.h>
-#include <net/irda/irlmp.h>
-
-#include <net/irda/irvtd.h>
-#include <net/irda/irvtd_driver.h>
-
-struct irvtd_cb **irvtd = NULL;
-extern struct ircomm_cb **ircomm;
-
-#if 0
-static char *rcsid = "$Id: irvtd.c,v 1.2 1998/09/27 08:37:04 takahide Exp $";
-#endif
-static char *version = "IrVTD, $Revision: 1.2 $ $Date: 1998/09/27 08:37:04 $ (Takahide Higuchi)";
-
-
-/************************************************************
- *    init & cleanup this module 
- ************************************************************/
-
-/*
- * Function init_module(void)
- *
- *   Initializes the ircomm control structure
- *   This Function is called when you do insmod.
- */
-
-__initfunc(int irvtd_init(void))
-{
-       int i;
-
-       DEBUG( 4, "irvtd:init_module:\n");
-       printk( KERN_INFO "%s\n", version);
-
-       /* we allocate master array */
-
-       irvtd = (struct irvtd_cb **) kmalloc( sizeof(void *) *
-                                               COMM_MAX_TTY,GFP_KERNEL);
-       if ( irvtd == NULL) {
-               printk( KERN_WARNING "irvtd: Can't allocate array!\n");
-               return -ENOMEM;
-       }
-
-       memset( irvtd, 0, sizeof(void *) * COMM_MAX_TTY);
-
-
-       /* we initialize structure */
-
-       for (i=0; i < COMM_MAX_TTY; i++){
-               irvtd[i] = kmalloc( sizeof(struct irvtd_cb), GFP_KERNEL);       
-               if(irvtd[i] == NULL){
-                       printk(KERN_ERR "ircomm_open(): kmalloc failed!\n");
-                       return -ENOMEM;
-               }
-
-               memset( irvtd[i], 0, sizeof(struct irvtd_cb));
-               irvtd[i]->magic = IRVTD_MAGIC;
-       }
-
-       /* 
-        * initialize a "port emulation entity"
-        */
-
-       if(irvtd_register_ttydriver()){
-               printk( KERN_WARNING "IrCOMM: Error in ircomm_register_device\n");
-               return -ENODEV;
-       }
-
-
-       DEBUG( 4, "irvtd:init_module:done\n");
-       return 0;
-}
-
-void irvtd_cleanup(void)
-{
-       int i;
-       DEBUG( 4, "--> ircomm:cleanup_module\n");
-
-       /*
-        * free some resources
-        */
-       if (irvtd) {
-               for (i=0; i<COMM_MAX_TTY; i++) {
-                       if (irvtd[i]) {
-                               DEBUG( 4, "freeing structures\n");
-                               /* irvtd_close();  :{| */
-                               kfree(irvtd[i]);
-                               irvtd[i] = NULL;
-                       }
-               }
-               DEBUG( 4, "freeing master array\n");
-               kfree(irvtd);
-               irvtd = NULL;
-       }
-
-
-
-       DEBUG( 0, "unregister_ttydriver..\n");
-       irvtd_unregister_ttydriver();
-
-       DEBUG( 4, "ircomm:cleanup_module -->\n");
-}
-
-#ifdef MODULE
-
-int init_module(void) 
-{
-       irvtd_init();
-       return 0;
-}
-
-
-/*
- * Function ircomm_cleanup (void)
- *   This is called when you rmmod.
- */
-
-void cleanup_module(void)
-{
-       irvtd_cleanup();
-}
-
-#endif /* MODULE */
-
-
-
index 7738e3e786d0455096ddc1063c0c70ce67161df8..9e468ba90d9b8bee1c92c0f43eedc5c1e81cd9a0 100644 (file)
@@ -2,7 +2,7 @@
  *                
  * Filename:      irvtd_driver.c
  * Version:       
- * Description:   An implementation of "port emulation entity" of IrCOMM
+ * Description:   Virtual tty driver (the "port emulation entity" of IrCOMM)
  * Status:        Experimental.
  * Author:        Takahide Higuchi <thiguchi@pluto.dti.ne.jp>
  * Source:        serial.c by Linus Torvalds
  ********************************************************************/
 
 #include <linux/module.h>
+#include <linux/init.h>
+
 #include <linux/fs.h>
 #include <linux/sched.h>
 #include <linux/termios.h>
+#include <linux/tty.h>
 #include <asm/segment.h>
 #include <asm/uaccess.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irttp.h>
+#include <net/irda/irias_object.h>
 
 #include <net/irda/irvtd.h>
-#include <net/irda/irvtd_driver.h>
 
 #ifndef MIN
 #define MIN(a,b)        ((a) < (b) ? (a) : (b))
 #define DO_RESTART
 #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
 
-static char *irvtd_ttyname = "irnine";
-struct tty_driver irvtd_drv, irvtd_callout_driver;
+struct tty_driver irvtd_drv;
 struct tty_struct *irvtd_table[COMM_MAX_TTY];
 struct termios *irvtd_termios[COMM_MAX_TTY];
 struct termios *irvtd_termios_locked[COMM_MAX_TTY];
-static int ircomm_vsd_refcount;
-extern struct ircomm_cb **ircomm;
-extern struct irvtd_cb **irvtd;
+static int irvtd_refcount;
+struct irvtd_cb **irvtd = NULL;
+
+static char *revision_date = "Wed Mar 10 15:33:03 1999";
+
 
 /*
  * prototypes
@@ -71,157 +75,38 @@ void irvtd_start(struct tty_struct *tty);
 void irvtd_hangup(struct tty_struct *tty);
 void irvtd_flush_buffer(struct tty_struct *tty);
 
-static void flush_txbuff(struct irvtd_cb *info);
 static void change_speed(struct irvtd_cb *driver);
-static void irvtd_write_to_tty( void *instance );
-
+static void irvtd_write_to_tty( struct irvtd_cb *);
+static void irvtd_send_data_request( struct irvtd_cb *);
 static void irvtd_break(struct tty_struct *tty, int break_state);
 static void irvtd_send_xchar(struct tty_struct *tty, char ch);
+static void irvtd_wait_until_sent(struct tty_struct *tty, int timeout);
 
-#if 0
-static char *rcsid = "$Id: irvtd_driver.c,v 1.13 1998/12/06 10:09:07 takahide Exp $";
-#endif
-
-
-
-
-/*
- * Function ircomm_register_device(void) 
- *   we register "port emulation entity"(see IrCOMM specification) here
- *   as a tty device.
- *   it will be called when you insmod.
- *   ( This function derives from linux/drivers/char/serial.c )
- */
-
-int irvtd_register_ttydriver(void){
-
-        DEBUG( 4, "-->irvtd_register_ttydriver\n");
-
-       /* setup virtual serial port device */
-
-        /* Initialize the tty_driver structure ,which is defined in 
-          tty_driver.h */
-        
-        memset(&irvtd_drv, 0, sizeof(struct tty_driver));
-       irvtd_drv.magic = IRVTD_MAGIC;
-       irvtd_drv.name = irvtd_ttyname;
-       irvtd_drv.major = IRCOMM_MAJOR;
-       irvtd_drv.minor_start = IRVTD_MINOR;
-       irvtd_drv.num = COMM_MAX_TTY;
-       irvtd_drv.type = TTY_DRIVER_TYPE_SERIAL;  /* see tty_driver.h */
-       irvtd_drv.subtype = IRVTD_TYPE_NORMAL;      /* private type */
-
-       /*
-        * see drivers/char/tty_io.c and termios(3)
-        */
-
-        irvtd_drv.init_termios = tty_std_termios;
-        irvtd_drv.init_termios.c_cflag =
-               B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-        irvtd_drv.flags = TTY_DRIVER_REAL_RAW;   /* see tty_driver.h */
-        irvtd_drv.refcount = &ircomm_vsd_refcount;
-
-       /* pointer to the tty data structures */
-
-        irvtd_drv.table = irvtd_table;  
-        irvtd_drv.termios = irvtd_termios;
-        irvtd_drv.termios_locked = irvtd_termios_locked;
-
-        /*
-         * Interface table from the kernel(tty driver) to the ircomm
-         * layer
-         */
-
-        irvtd_drv.open = irvtd_open;
-        irvtd_drv.close = irvtd_close;
-        irvtd_drv.write = irvtd_write;
-        irvtd_drv.put_char = irvtd_put_char;
-       irvtd_drv.flush_chars = irvtd_flush_chars;
-        irvtd_drv.write_room = irvtd_write_room;
-       irvtd_drv.chars_in_buffer = irvtd_chars_in_buffer; 
-        irvtd_drv.flush_buffer = irvtd_flush_buffer;
-       irvtd_drv.ioctl = irvtd_ioctl; 
-       irvtd_drv.throttle = irvtd_throttle;
-       irvtd_drv.unthrottle = irvtd_unthrottle;
-       irvtd_drv.set_termios = irvtd_set_termios;
-       irvtd_drv.stop = NULL;          /*  irvtd_stop; */
-       irvtd_drv.start = NULL;         /* irvtd_start; */
-        irvtd_drv.hangup = irvtd_hangup;
-
-        irvtd_drv.send_xchar = irvtd_send_xchar;
-       irvtd_drv.break_ctl = irvtd_break;
-       irvtd_drv.read_proc = NULL;
-       irvtd_drv.wait_until_sent = NULL;
-
-        /*
-         * The callout device is just like normal device except for
-         * minor number and the subtype.
-         */
-
-       /* What is difference between callout device and normal device? */
-       /* My system dosen't have /dev/cua??, so we don't need it? :{| */
-       irvtd_callout_driver = irvtd_drv;
-       irvtd_callout_driver.name = "irninecua";
-       irvtd_callout_driver.minor_start = IRVTD_CALLOUT_MINOR; 
-       irvtd_callout_driver.subtype = IRVTD_TYPE_CALLOUT;
-
-
-       if (tty_register_driver(&irvtd_drv)){
-               DEBUG(0,"IrCOMM:Couldn't register tty driver\n");
-               return(1);
-       }
-       if (tty_register_driver(&irvtd_callout_driver))
-               DEBUG(0,"IrCOMM:Couldn't register callout tty driver\n");
-
-       DEBUG( 4, "irvtd_register_ttydriver: done.\n");
-       return(0);
-}
-
-
-/*
- * Function irvtd_unregister_device(void) 
- *   it will be called when you rmmod
- */
-
-void irvtd_unregister_ttydriver(void){
-
-       int err;        
-        DEBUG( 4, "--> irvtd_unregister_device\n");
-
-       /* unregister tty device   */
-
-       err = tty_unregister_driver(&irvtd_drv);
-        if (err)
-                printk("IrCOMM: failed to unregister vtd driver(%d)\n",err);
-       err = tty_unregister_driver(&irvtd_callout_driver);
-        if (err)
-                printk("IrCOMM: failed to unregister vtd_callout driver(%d)\n", err);
-
-        DEBUG( 4, "irvtd_unregister_device -->\n");
-       return;
-}
+static void irvtd_start_timer( struct irvtd_cb *driver);
+static void irvtd_timer_expired(unsigned long data);
 
+static int line_info(char *buf, struct irvtd_cb *driver);
+static int irvtd_read_proc(char *buf, char **start, off_t offset, int len,
+                          int *eof, void *unused);
 
 
 /*
  * ----------------------------------------------------------------------
- * Routines for Virtual tty driver
+ * 
  *
- *   most of infomation is descrived in linux/tty_driver.h, but
- *   a function ircomm_receive() derives from receive_chars() which is
- *   in 2.0.30 kernel (driver/char/serial.c).
- *   if you want to understand them, please see related kernel source 
- *   (and my comments :).
+
  * ----------------------------------------------------------------------
  */
 
 /*
- * ----------------------------------------------------------------------
- * ircomm_receive_data()
+ **********************************************************************
+ *
+ * ircomm_receive_data() and friends
  *
  * like interrupt handler in the serial.c,we receive data when 
  * ircomm_data_indication comes
- * ----------------------------------------------------------------------
+ *
+ **********************************************************************
  */
 
 
@@ -231,25 +116,22 @@ void irvtd_unregister_ttydriver(void){
  * send incoming/queued data to tty
  */
 
-static void irvtd_write_to_tty( void *instance ){
-       
+static void irvtd_write_to_tty( struct irvtd_cb *driver)
+{      
        int status, c, flag;
-       
        struct sk_buff *skb;
-       struct irvtd_cb *driver = (struct irvtd_cb *)instance;
        struct tty_struct *tty = driver->tty;
        
-       /* does instance still exist ? should be checked */
-       ASSERT(driver->magic == IRVTD_MAGIC, return;);
-       
-       if(driver->rx_disable ){
-               DEBUG(0,__FUNCTION__"rx_disable is true:do_nothing..\n");
-               return;
-       }
-       
        skb = skb_dequeue(&driver->rxbuff);
-       ASSERT(skb != NULL, return;); /* there's nothing */
-       IS_SKB(skb, return;);
+       if(skb == NULL)
+               return; /* there's nothing */
+
+
+       /* 
+        * we should parse controlchannel field here. 
+        * (see process_data() in ircomm.c)
+        */
+       ircomm_parse_tuples(driver->comm, skb, CONTROL_CHANNEL);
        
 #ifdef IRVTD_DEBUG_RX
        printk("received data:");
@@ -263,12 +145,6 @@ static void irvtd_write_to_tty( void *instance ){
        
        status = driver->comm->peer_line_status & driver->read_status_mask;
        
-       /* 
-        * FIXME: we must do ircomm_parse_ctrl() here, instead of 
-        * ircomm_common.c!! 
-        */
-       
-
        /* 
         * if there are too many errors which make a character ignored,
         * drop characters
@@ -289,7 +165,7 @@ static void irvtd_write_to_tty( void *instance ){
                DEBUG(0,"handling break....\n");
                
                flag = TTY_BREAK;
-               if (driver->flags & IRVTD_ASYNC_SAK)
+               if (driver->flags & ASYNC_SAK)
                        /*
                         * do_SAK() seems to be an implementation of the 
                         * idea called "Secure Attention Key",
@@ -311,7 +187,8 @@ static void irvtd_write_to_tty( void *instance ){
                flag = TTY_NORMAL;
        
        if(c){
-               DEBUG(0,"writing %d chars to tty\n",c);
+               DEBUG(4,"writing %d chars to tty\n",c);
+               driver->icount.rx += c;
                memset(tty->flip.flag_buf_ptr, flag, c);
                memcpy(tty->flip.char_buf_ptr, skb->data, c);
                tty->flip.flag_buf_ptr += c;
@@ -325,205 +202,207 @@ static void irvtd_write_to_tty( void *instance ){
        else
        {
                /* queue rest of data again */
-               DEBUG(0,__FUNCTION__":retrying frame!\n");
+               DEBUG(4,__FUNCTION__":retrying frame!\n");
+
+               /* build a dummy control channel */
+               skb_push(skb,1);
+               *skb->data = 0;  /* clen is 0 */
                skb_queue_head( &driver->rxbuff, skb );
        }
        
-       /*
-        * in order to optimize this routine, these two tasks should be
-        * queued in following order
-        * ( see run_task_queue() and queue_task() in tqueue.h
-        */
-       if(skb_queue_len(&driver->rxbuff))
-               /* let me try again! */
-               queue_task(&driver->rx_tqueue, &tq_timer);
        if(c)
-               /* read your buffer! */
-               queue_task(&tty->flip.tqueue, &tq_timer);
+       /* let the process read its buffer! */
+               tty_flip_buffer_push(tty);
        
-
-       if(skb_queue_len(&driver->rxbuff)< IRVTD_RX_QUEUE_LOW
-          &&  driver->ttp_stoprx){
+       if(skb_queue_len(&driver->rxbuff)< IRVTD_RX_QUEUE_LOW &&
+          driver->ttp_stoprx){
                irttp_flow_request(driver->comm->tsap, FLOW_START);
                driver->ttp_stoprx = 0;
        }
+
+       if(skb_queue_empty(&driver->rxbuff) && driver->disconnect_pend){
+               /* disconnect */
+               driver->disconnect_pend = 0;
+               driver->rx_disable = 1;
+               tty_hangup(driver->tty);
+       }
 }
 
-void irvtd_receive_data(void *instance, void *sap, struct sk_buff *skb){
-       
+static int irvtd_receive_data(void *instance, void *sap, struct sk_buff *skb)
+{      
        struct irvtd_cb *driver = (struct irvtd_cb *)instance;
 
-       ASSERT(driver != NULL, return;);
-       ASSERT(driver->magic == IRVTD_MAGIC, return;);
+       ASSERT(driver != NULL, return -1;);
+       ASSERT(driver->magic == IRVTD_MAGIC, return -1;);
+       DEBUG(4, __FUNCTION__"(): queue frame\n");
 
        /* queue incoming data and make bottom half handler ready */
 
        skb_queue_tail( &driver->rxbuff, skb );
-       if(skb_queue_len(&driver->rxbuff) == 1)
-               irvtd_write_to_tty(driver);
+
        if(skb_queue_len(&driver->rxbuff) > IRVTD_RX_QUEUE_HIGH){
                irttp_flow_request(driver->comm->tsap, FLOW_STOP);
                driver->ttp_stoprx = 1;
        }
-       return;
+       return 0;
 }
 
-#if 0
-void irvtd_receive_data(void *instance, void *sap, struct sk_buff *skb){
+/*
+ ***********************************************************************
+ *
+ * irvtd_send_data() and friends
+ *
+ * like interrupt handler in the serial.c,we send data when 
+ * a timer is expired
+ *
+ ***********************************************************************
+ */
+
+
+static void irvtd_start_timer( struct irvtd_cb *driver)
+{
+       ASSERT( driver != NULL, return;);
+       ASSERT( driver->magic == IRVTD_MAGIC, return;);
+
+       del_timer( &driver->timer);
        
-       int flag,status;
-       __u8 c;
-       struct tty_struct *tty;
-       struct irvtd_cb *driver = (struct irvtd_cb *)instance;
+       driver->timer.data     = (unsigned long) driver;
+       driver->timer.function = &irvtd_timer_expired;
+       driver->timer.expires  = jiffies + (HZ / 20);  /* 50msec */
+       
+       add_timer( &driver->timer);
+}
 
-       ASSERT(driver != NULL, return;);
-       ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
-       if(driver->rx_disable ){
-               DEBUG(0,__FUNCTION__"rx_disable is true:do nothing\n");
-               return;
+static void irvtd_timer_expired(unsigned long data)
+{
+       struct irvtd_cb *driver = (struct irvtd_cb *)data;
+
+       ASSERT(driver != NULL,return;);
+       ASSERT(driver->magic == IRVTD_MAGIC,return;);
+       DEBUG(4, __FUNCTION__"()\n");
+
+       if(!(driver->tty->hw_stopped) && !(driver->tx_disable))
+               irvtd_send_data_request(driver);
+
+       if(!(driver->rx_disable)){
+               irvtd_write_to_tty(driver);
        }
+       
+       /* start our timer again and again */
+       irvtd_start_timer(driver);
+}
 
-       tty = driver->tty;
-       status = driver->comm->peer_line_status & driver->read_status_mask;
 
-       c = MIN(skb->len, (TTY_FLIPBUF_SIZE - tty->flip.count));
-       DEBUG(0, __FUNCTION__"skb_len=%d, tty->flip.count=%d \n"
-             ,(int)skb->len, tty->flip.count);
+static void irvtd_send_data_request(struct irvtd_cb *driver)
+{
+       int err;
+       struct sk_buff *skb = driver->txbuff;
 
-#ifdef IRVTD_DEBUG_RX
-       printk("received data:");
+       ASSERT(skb != NULL,return;);
+       DEBUG(4, __FUNCTION__"()\n");
+
+       if(!skb->len)
+               return;   /* no data to send */
+
+#ifdef IRVTD_DEBUG_TX
+       DEBUG(4, "flush_txbuff:count(%d)\n",(int)skb->len);
        {
                int i;
                for ( i=0;i<skb->len;i++)
-                       printk("%02x ", skb->data[i]);
+                       printk("%02x", skb->data[i]);
                printk("\n");
        }
 #endif
 
-       /* 
-        * if there are too many errors which make a character ignored,
-        * drop characters
-        */
-
-       if(status & driver->ignore_status_mask){
-               DEBUG(0,__FUNCTION__"I/O error:ignore characters.\n");
-               dev_kfree_skb(skb, FREE_READ);
-               return;
-       } 
-       
-       if (driver->comm->peer_break_signal ) {
-               driver->comm->peer_break_signal = 0;
-               DEBUG(0,"handling break....\n");
-               
-               flag = TTY_BREAK;
-               if (driver->flags & IRVTD_ASYNC_SAK)
-                       /*
-                        * do_SAK() seems to be an implementation of the 
-                        * idea called "Secure Attention Key",
-                        * which seems to be discribed in "Orange book".
-                        * (which is published by U.S.military!!?? )
-                        * see source of do_SAK() but what is "Orange book"!?
-                        */
-                       do_SAK(tty);
-       }else if (status & LSR_PE)
-               flag = TTY_PARITY;
-       else if (status & LSR_FE)
-               flag = TTY_FRAME;
-       else if (status & LSR_OE)
-               flag = TTY_OVERRUN;
-       else 
-               flag = TTY_NORMAL;
+       DEBUG(4, __FUNCTION__"():sending %d bytes\n",(int)skb->len );
+       driver->icount.tx += skb->len;
+       err = ircomm_data_request(driver->comm, driver->txbuff);
+       if (err){
+               ASSERT(err == 0,;);
+               DEBUG(0,"%d chars are lost\n",(int)skb->len);
+               skb_trim(skb, 0);
+       }
 
-       if(c){
-               DEBUG(0,"writing %d chars to tty\n",c);
-               memset(tty->flip.flag_buf_ptr, flag, c);
-               memcpy(tty->flip.char_buf_ptr, skb->data, c);
-               tty->flip.flag_buf_ptr += c;
-               tty->flip.char_buf_ptr += c;
-               tty->flip.count += c;
-               skb_pull(skb,c);
-               queue_task_irq_off(&tty->flip.tqueue, &tq_timer);
+       /* allocate a new frame */
+       skb = driver->txbuff = dev_alloc_skb(driver->comm->max_txbuff_size);
+       if (skb == NULL){
+               printk(__FUNCTION__"():flush_txbuff():alloc_skb failed!\n");
+       } else {
+               skb_reserve(skb, COMM_HEADER_SIZE);
        }
-       if(skb->len >0)
-               DEBUG(0,__FUNCTION__":dropping frame!\n");
-       dev_kfree_skb(skb, FREE_READ);
-       DEBUG(4,__FUNCTION__":done\n");
+
+       wake_up_interruptible(&driver->tty->write_wait);
 }
-#endif
+
 
 /*
- * ----------------------------------------------------------------------
+ ***********************************************************************
+ *
  * indication/confirmation handlers:
- * they will be registerd in irvtd_startup() to know that we
- * discovered (or we are discovered by) remote device.
- * ----------------------------------------------------------------------
+ *
+ * these routines are handlers for IrCOMM protocol stack
+ *
+ ***********************************************************************
  */
 
-/* this function is called whed ircomm_attach_cable succeed */
-
-void irvtd_attached(struct ircomm_cb *comm){
-
-       ASSERT(comm != NULL, return;);
-       ASSERT(comm->magic == IRCOMM_MAGIC, return;);
-
-       DEBUG(0,"irvtd_attached:sending connect_request"
-             " for servicetype(%d)..\n",comm->servicetype);
-       ircomm_connect_request(comm, SAR_DISABLE );
-}
-
 
 /*
- * irvtd_connect_confirm()
- *  ircomm_connect_request which we have send have succeed!
+ * Function irvtd_connect_confirm (instance, sap, qos, max_sdu_size, skb)
+ *
+ *    ircomm_connect_request which we have send have succeed!
+ *
  */
-
 void irvtd_connect_confirm(void *instance, void *sap, struct qos_info *qos,
-                          int max_sdu_size, struct sk_buff *skb){
-
+                          __u32 max_sdu_size, struct sk_buff *skb)
+{
        struct irvtd_cb *driver = (struct irvtd_cb *)instance;
        ASSERT(driver != NULL, return;);
        ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
+       /*
+        * set default value
+        */
+       
+       driver->msr |= (MSR_DCD|MSR_RI|MSR_DSR|MSR_CTS);
+
        /*
         * sending initial control parameters here
-        *
-        * TODO: it must be done in ircomm_connect_request()
         */
 #if 1
        if(driver->comm->servicetype == THREE_WIRE_RAW)
                return;                /* do nothing */
 
-       ircomm_append_ctrl(driver->comm, SERVICETYPE);
-       /* ircomm_append_ctrl(self, DATA_RATE); */
-       ircomm_append_ctrl(driver->comm, DATA_FORMAT);
-       ircomm_append_ctrl(driver->comm, FLOW_CONTROL);
-       ircomm_append_ctrl(driver->comm, XON_XOFF_CHAR);
-       /* ircomm_append_ctrl(driver->comm, ENQ_ACK_CHAR); */
+       ircomm_control_request(driver->comm, SERVICETYPE);
+       ircomm_control_request(driver->comm, DATA_RATE);
+       ircomm_control_request(driver->comm, DATA_FORMAT);
+       ircomm_control_request(driver->comm, FLOW_CONTROL);
+       ircomm_control_request(driver->comm, XON_XOFF_CHAR);
+       /* ircomm_control_request(driver->comm, ENQ_ACK_CHAR); */
 
        switch(driver->comm->servicetype){
        case CENTRONICS:
                break;
 
        case NINE_WIRE:
-               ircomm_append_ctrl(driver->comm, DTELINE_STATE);
+               ircomm_control_request(driver->comm, DTELINE_STATE);
                break;
        default:
        }
-       ircomm_control_request(driver->comm);
 #endif
        
-
+       driver->tx_disable = 0;
        wake_up_interruptible(&driver->open_wait);
 }
 
 /*
- * irvtd_connect_indication()
- *  we are discovered and being requested to connect by remote device !
+ * Function irvtd_connect_indication (instance, sap, qos, max_sdu_size, skb)
+ *
+ *    we are discovered and being requested to connect by remote device !
+ *
  */
-
 void irvtd_connect_indication(void *instance, void *sap, struct qos_info *qos,
-                             int max_sdu_size, struct sk_buff *skb)
+                             __u32 max_sdu_size, struct sk_buff *skb)
 {
 
        struct irvtd_cb *driver = (struct irvtd_cb *)instance;
@@ -539,42 +418,81 @@ void irvtd_connect_indication(void *instance, void *sap, struct qos_info *qos,
 
        ircomm_connect_response(comm, NULL, SAR_DISABLE );
 
+       /*
+        * set default value
+        */
+       driver->msr |= (MSR_DCD|MSR_RI|MSR_DSR|MSR_CTS);
+       driver->tx_disable = 0;
        wake_up_interruptible(&driver->open_wait);
 }
 
-
-
+/*
+ * Function irvtd_disconnect_indication (instance, sap, reason, skb)
+ *
+ *    This is a handler for ircomm_disconnect_indication. since this
+ *    function is called in the context of interrupt handler,
+ *    interruptible_sleep_on() MUST not be used.
+ */
 void irvtd_disconnect_indication(void *instance, void *sap , LM_REASON reason,
-                                struct sk_buff *skb){
-
+                                struct sk_buff *skb)
+{
        struct irvtd_cb *driver = (struct irvtd_cb *)instance;
+
        ASSERT(driver != NULL, return;);
        ASSERT(driver->tty != NULL, return;);
        ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
        DEBUG(4,"irvtd_disconnect_indication:\n");
-       tty_hangup(driver->tty);
+
+       driver->tx_disable = 1;
+       driver->disconnect_pend = 1;
 }
 
 /*
- * irvtd_control_indication
+ * Function irvtd_control_indication (instance, sap, cmd)
+ *
+ *    
  *
  */
-
-
-void irvtd_control_indication(void *instance, void *sap, LOCAL_FLOW flow){
-
+void irvtd_control_indication(void *instance, void *sap, IRCOMM_CMD cmd)
+{
        struct irvtd_cb *driver = (struct irvtd_cb *)instance;
-       __u8 pi; /* instruction of control channel */
 
        ASSERT(driver != NULL, return;);
        ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
-       DEBUG(0,"irvtd_control_indication:\n");
+       DEBUG(4,__FUNCTION__"()\n");
+
+       if(cmd == TX_READY){
+               driver->ttp_stoptx = 0;
+               driver->tty->hw_stopped = driver->cts_stoptx;
+               irvtd_start_timer( driver);
+
+               if(driver->cts_stoptx)
+                       return;
+
+               /* 
+                * driver->tty->write_wait will keep asleep if
+                * our txbuff is full.
+                * now that we can send packets to IrTTP layer,
+                * we kick it here.
+                */
+               if ((driver->tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 
+                   driver->tty->ldisc.write_wakeup)
+                       (driver->tty->ldisc.write_wakeup)(driver->tty);
+               return;
+       }
+
+       if(cmd == TX_BUSY){
+               driver->ttp_stoptx = driver->tty->hw_stopped = 1;
+               del_timer( &driver->timer);
+               return;
+       }
 
-       pi = driver->comm->pi;
 
-       switch(pi){
+       ASSERT(cmd == CONTROL_CHANNEL,return;);
+
+       switch(driver->comm->pi){
 
        case DCELINE_STATE:
        driver->msr = driver->comm->peer_dce;
@@ -591,19 +509,23 @@ void irvtd_control_indication(void *instance, void *sap, LOCAL_FLOW flow){
                wake_up_interruptible(&driver->delta_msr_wait);
        }
 
-       if ((driver->flags & IRVTD_ASYNC_CHECK_CD) && (driver->msr & DELTA_DCD)) {
+       if ((driver->flags & ASYNC_CHECK_CD) && (driver->msr & DELTA_DCD)) {
 
                DEBUG(0,"CD now %s...\n",
                      (driver->msr & MSR_DCD) ? "on" : "off");
 
-               if (driver->msr & DELTA_DCD)
+               if (driver->msr & MSR_DCD)
+               {
+                       /* DCD raised! */
                        wake_up_interruptible(&driver->open_wait);
-               else if (!((driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-                          (driver->flags & IRVTD_ASYNC_CALLOUT_NOHUP))) {
-
-                        DEBUG(0,"irvtd_control_indication:hangup..\n");
+               }
+               else
+               {
+                       /* DCD falled */
+                        DEBUG(0,__FUNCTION__"():hangup..\n");
                        tty_hangup(driver->tty);
                }
+
        }
 
        if (driver->comm->flow_ctrl & USE_CTS) {
@@ -632,102 +554,44 @@ void irvtd_control_indication(void *instance, void *sap, LOCAL_FLOW flow){
 
                                driver->cts_stoptx = 1;
                                driver->tty->hw_stopped = 1;
-/*                             driver->IER &= ~UART_IER_THRI; */
-/*                             serial_out(info, UART_IER, info->IER); */
                         }
                 }
         }
-
-
        break;
 
-       case TX_READY:
-               driver->ttp_stoptx = 0;
-               driver->tty->hw_stopped = driver->cts_stoptx;
-
-               /* 
-                * driver->tty->write_wait will keep asleep if
-                * our txbuff is not empty.
-                * so if we can really send a packet now,
-                * send it and then wake it up.
-                */
-
-               if(driver->cts_stoptx)
-                       break;
-
-               flush_txbuff(driver);
-               if ((driver->tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 
-                    driver->tty->ldisc.write_wakeup)
-                       (driver->tty->ldisc.write_wakeup)(driver->tty);
-               break;
-
-       case TX_BUSY:
-               driver->ttp_stoptx = driver->tty->hw_stopped = 1;
-               break;
        default:
-               DEBUG(0,"irvtd:unknown control..\n");
-       
+               DEBUG(0,__FUNCTION__"():PI = 0x%02x is not implemented\n",
+                     (int)driver->comm->pi);
        }
 }
 
-
 /*
- * ----------------------------------------------------------------------
- * irvtd_open() and friends
+ ***********************************************************************
  *
- * 
- * ----------------------------------------------------------------------
+ * driver kernel interfaces
+ * these functions work as an interface between the kernel and this driver
+ *
+ ***********************************************************************
  */
 
 
-static int irvtd_block_til_ready(struct tty_struct *tty, struct file * filp,
-                                struct irvtd_cb *driver)
-{
 
-       struct wait_queue wait = { current, NULL };
-       int             retval;
-       int             do_clocal = 0;
-
-       /*
-        * If the device is in the middle of being closed, then block
-        * (sleep) until it's done, and (when being woke up)then try again.
-        */
-
-       if (tty_hung_up_p(filp) ||
-           (driver->flags & IRVTD_ASYNC_CLOSING)) {
-               if (driver->flags & IRVTD_ASYNC_CLOSING)
-                       interruptible_sleep_on(&driver->close_wait);
-#ifdef DO_RESTART
-               if (driver->flags & IRVTD_ASYNC_HUP_NOTIFY)
-                       return -EAGAIN;
-               else
-                       return -ERESTARTSYS;
-#else
-               return -EAGAIN;
-#endif
-       }
+/*
+ * ----------------------------------------------------------------------
+ * irvtd_open() and friends
+ *
+ * ----------------------------------------------------------------------
+ */
 
-       /*
-        * If this is a callout device, then just make sure the normal
-        * device isn't being used.
-        */
 
-       if (tty->driver.subtype == IRVTD_TYPE_CALLOUT) {
-               if (driver->flags & IRVTD_ASYNC_NORMAL_ACTIVE)
-                       return -EBUSY;
-               if ((driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-                   (driver->flags & IRVTD_ASYNC_SESSION_LOCKOUT) &&
-                   (driver->session != current->session))
-                       return -EBUSY;
-               if ((driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-                   (driver->flags & IRVTD_ASYNC_PGRP_LOCKOUT) &&
-                   (driver->pgrp != current->pgrp))
-                       return -EBUSY;
-
-               driver->flags |= IRVTD_ASYNC_CALLOUT_ACTIVE;
-               return 0;
-       }
-       
+static int irvtd_block_til_ready(struct tty_struct *tty, struct file * filp,
+                                struct irvtd_cb *driver)
+{
+
+       struct wait_queue wait = { current, NULL };
+       int             retval = 0;
+       int             do_clocal = 0;
+
        /*
         * If non-blocking mode is set, or the port is not enabled,
         * then make the check up front and then exit.
@@ -735,64 +599,48 @@ static int irvtd_block_til_ready(struct tty_struct *tty, struct file * filp,
 
        if ((filp->f_flags & O_NONBLOCK) ||
            (tty->flags & (1 << TTY_IO_ERROR))) {
-               if (driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE)
-                       return -EBUSY;
 
-               driver->flags |= IRVTD_ASYNC_NORMAL_ACTIVE;
                return 0;
        }
 
-       if (driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) {
-               if (driver->normal_termios.c_cflag & CLOCAL)
-                       do_clocal = 1;
-       } else {
-               if (tty->termios->c_cflag & CLOCAL)
-                       do_clocal = 1;
-       }
-       
+       if (tty->termios->c_cflag & CLOCAL)
+               do_clocal = 1;
+
+
        /*
         * We wait until ircomm_connect_request() succeed or
         *   ircomm_connect_indication comes
-        *
-        * This is what is written in serial.c:
-        * "Block waiting for the carrier detect and the line to become
-        * free (i.e., not in use by the callout).  While we are in
-        * this loop, driver->count is dropped by one, so that
-        * rs_close() knows when to free things.  We restore it upon
-        * exit, either normal or abnormal."
         */
 
-       retval = 0;
+
        add_wait_queue(&driver->open_wait, &wait);
 
-       DEBUG(0,"block_til_ready before block: line%d, count = %d\n",
-              driver->line, driver->count);
+       DEBUG(0,__FUNCTION__"():before block( line = %d, count = %d )\n",
+             driver->line, driver->count);
 
-       cli();
-       if (!tty_hung_up_p(filp)) 
-               driver->count--;
-       sti();
        driver->blocked_open++;
 
-
+       /* wait for a connection established */
        while (1) {
                current->state = TASK_INTERRUPTIBLE;
+               
+               if (driver->comm->state == COMM_CONN){
+                       /* 
+                        * signal DTR and RTS
+                        */
+                       driver->comm->dte = driver->mcr |= (MCR_DTR  |
+                                                           MCR_RTS  |
+                                                           DELTA_DTR|
+                                                           DELTA_RTS );
 
-       if (!(driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-           (driver->comm->state == COMM_CONN)){
-               /* 
-                * signal DTR and RTS
-                */
-               driver->comm->dte = driver->mcr |= (MCR_DTR | MCR_RTS |DELTA_DTR|DELTA_RTS);
+                       ircomm_control_request(driver->comm, DTELINE_STATE);
+               }
 
-               ircomm_append_ctrl(driver->comm, DTELINE_STATE);
-               ircomm_control_request(driver->comm);
-       }
 
                if (tty_hung_up_p(filp) ||
-                   !(driver->flags & IRVTD_ASYNC_INITIALIZED)) {
+                   !(driver->flags & ASYNC_INITIALIZED)) {
 #ifdef DO_RESTART
-                       if (driver->flags & IRVTD_ASYNC_HUP_NOTIFY)
+                       if (driver->flags & ASYNC_HUP_NOTIFY)
                                retval = -EAGAIN;
                        else
                                retval = -ERESTARTSYS;  
@@ -802,15 +650,9 @@ static int irvtd_block_til_ready(struct tty_struct *tty, struct file * filp,
                        break;
                }
 
-               /*
-                * if clocal == 0 or received DCD or state become CONN,then break
-                */
-
-               if (!(driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE) &&
-                   !(driver->flags & IRVTD_ASYNC_CLOSING) &&
+               if (!(driver->flags & ASYNC_CLOSING) &&
                    (driver->comm->state == COMM_CONN) && 
-                   ( do_clocal || (driver->msr & MSR_DCD) )
-                   )
+                   ( do_clocal || (driver->msr & MSR_DCD)))
                        break;
 
                if(signal_pending(current)){
@@ -818,63 +660,51 @@ static int irvtd_block_til_ready(struct tty_struct *tty, struct file * filp,
                        break;
                }
 
-#ifdef IRVTD_DEBUG_OPEN
-               printk(KERN_INFO"block_til_ready blocking:"
-                      " ttys%d, count = %d\n", driver->line, driver->count);
-#endif
+
+               DEBUG(4,__FUNCTION__"():blocking( %s%d, count = %d )\n",
+                     tty->driver.name, driver->line, driver->count);
+
                schedule();
        }
 
        current->state = TASK_RUNNING;
        remove_wait_queue(&driver->open_wait, &wait);
 
-       if (!tty_hung_up_p(filp))
-               driver->count++;
        driver->blocked_open--;
-#ifdef IRVTD_DEBUG_OPEN
-       printk("block_til_ready after blocking: ttys%d, count = %d\n",
-              driver->line, driver->count);
-#endif
+
+       DEBUG(0, __FUNCTION__"():after blocking\n");
+
        if (retval)
                return retval;
-       driver->flags |= IRVTD_ASYNC_NORMAL_ACTIVE;
        return 0;
 }      
 
-static void change_speed(struct irvtd_cb *driver){
-
+static void change_speed(struct irvtd_cb *driver)
+{
        unsigned cflag,cval;
 
        if (!driver->tty || !driver->tty->termios || !driver->comm)
                return;
        cflag = driver->tty->termios->c_cflag;
 
-
-
-       /*
-        * change baud rate here. but not implemented now
-        */
-
-
-
-
        /* 
         * byte size and parity
         */
-       switch (cflag & CSIZE) {
-             case CS5: cval = 0x00; break;
-             case CS6: cval = 0x01; break;
-             case CS7: cval = 0x02; break;
-             case CS8: cval = 0x03; break;
-             default:  cval = 0x00; break;     /* too keep GCC shut... */
+       switch (cflag & CSIZE) 
+       {
+       case CS5: cval = IRCOMM_WLEN5; break;
+       case CS6: cval = IRCOMM_WLEN6; break;
+       case CS7: cval = IRCOMM_WLEN7; break;
+       case CS8: cval = IRCOMM_WLEN8; break;
+       default:  cval = IRCOMM_WLEN5; break;   /* too keep GCC shut... */
        }
        if (cflag & CSTOPB) {      /* use 2 stop bit mode */
-               cval |= 0x04;
+               cval |= IRCOMM_STOP2;
        }
        if (cflag & PARENB)
-               cval |= 0x08;
+               cval |= IRCOMM_PARENB;    /* enable parity check */
        if (!(cflag & PARODD))
-               cval |= 0x10;
+               cval |= IRCOMM_PAREVEN;         /* even parity */
        
        /* CTS flow control flag and modem status interrupts */
 
@@ -884,74 +714,69 @@ static void change_speed(struct irvtd_cb *driver){
                driver->comm->flow_ctrl |= ~USE_CTS;
        
        if (cflag & CLOCAL)
-               driver->flags &= ~IRVTD_ASYNC_CHECK_CD;
+               driver->flags &= ~ASYNC_CHECK_CD;
        else
-               driver->flags |= IRVTD_ASYNC_CHECK_CD;
+               driver->flags |= ASYNC_CHECK_CD;
        
        /*
         * Set up parity check flag
         */
 
-       driver->read_status_mask = LSR_OE ;
+       driver->read_status_mask = LSR_OE;
        if (I_INPCK(driver->tty))
                driver->read_status_mask |= LSR_FE | LSR_PE;
        if (I_BRKINT(driver->tty) || I_PARMRK(driver->tty))
                driver->read_status_mask |= LSR_BI;
        
+       /*
+        * Characters to ignore
+        */
        driver->ignore_status_mask = 0;
+       if (I_IGNPAR(driver->tty))
+               driver->ignore_status_mask |= LSR_PE | LSR_FE;
 
        if (I_IGNBRK(driver->tty)) {
                driver->ignore_status_mask |= LSR_BI;
-               driver->read_status_mask |= LSR_BI;
                /*
                 * If we're ignore parity and break indicators, ignore 
                 * overruns too.  (For real raw support).
                 */
-               if (I_IGNPAR(driver->tty)) {
-                       driver->ignore_status_mask |= LSR_OE | \
-                               LSR_PE | LSR_FE;
-                       driver->read_status_mask |= LSR_OE | \
-                               LSR_PE | LSR_FE;
-               }
+               if (I_IGNPAR(driver->tty)) 
+                       driver->ignore_status_mask |= LSR_OE;
        }
-       driver->comm->data_format = cval;
-       ircomm_append_ctrl(driver->comm, DATA_FORMAT);
-       ircomm_append_ctrl(driver->comm, FLOW_CONTROL);
-       ircomm_control_request(driver->comm);
 
-       /* output to IrCOMM here*/
+       driver->comm->data_format = cval;
+       ircomm_control_request(driver->comm, DATA_FORMAT);
+       ircomm_control_request(driver->comm, FLOW_CONTROL);
 }
 
 
 
 
-static int irvtd_startup(struct irvtd_cb *driver){
-
+static int irvtd_startup(struct irvtd_cb *driver)
+{
+       int retval = 0;
+       struct ias_object* obj;
        struct notify_t irvtd_notify;
 
+       /* FIXME: it should not be hard coded */
+       __u8 oct_seq[6] = { 0,1,4,1,1,1 }; 
 
-       DEBUG(4,"irvtd_startup:\n" );
+       DEBUG(4,__FUNCTION__"()\n" );
+       if(driver->flags & ASYNC_INITIALIZED)
+               return 0;
 
        /*
         * initialize our tx/rx buffer
         */
 
-       if(driver->flags & IRVTD_ASYNC_INITIALIZED)
-               return(0);
-
        skb_queue_head_init(&driver->rxbuff);
-       driver->rx_tqueue.data = driver;
-       driver->rx_tqueue.routine = irvtd_write_to_tty;
-
-       if(!driver->txbuff){
-               driver->txbuff = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE); 
-               if (!driver->txbuff){
-                       DEBUG(0,"irvtd_open():alloc_skb failed!\n");
-                       return -ENOMEM;
-               }
-
-               skb_reserve(driver->txbuff, COMM_HEADER_SIZE);
+       driver->txbuff = dev_alloc_skb(COMM_DEFAULT_DATA_SIZE); 
+       if (!driver->txbuff){
+               DEBUG(0,__FUNCTION__"():alloc_skb failed!\n");
+               return -ENOMEM;
        }
+       skb_reserve(driver->txbuff, COMM_HEADER_SIZE);
 
        irda_notify_init(&irvtd_notify);
        irvtd_notify.data_indication = irvtd_receive_data;
@@ -959,19 +784,38 @@ static int irvtd_startup(struct irvtd_cb *driver){
        irvtd_notify.connect_indication = irvtd_connect_indication;
        irvtd_notify.disconnect_indication = irvtd_disconnect_indication;
        irvtd_notify.flow_indication = irvtd_control_indication;
+       strncpy( irvtd_notify.name, "ircomm_tty", NOTIFY_MAX_NAME);
        irvtd_notify.instance = driver;
-       strncpy( irvtd_notify.name, "irvtd", NOTIFY_MAX_NAME);
 
+       driver->comm = ircomm_open_instance(irvtd_notify);
+       if(!driver->comm){
+               return -ENODEV;
+       }
+
+
+       /* 
+         *  Register with LM-IAS as a server
+         */
+
+       obj = irias_new_object( "IrDA:IrCOMM", IAS_IRCOMM_ID);
+       irias_add_integer_attrib( obj, "IrDA:TinyTP:LsapSel", 
+                                 driver->comm->tsap->stsap_sel );
+
+       irias_add_octseq_attrib( obj, "Parameters", &oct_seq[0], 6);
+       irias_insert_object( obj);
+
+       driver->flags |= ASYNC_INITIALIZED;
        /*
-        * register ourself as a service user of IrCOMM
-        *         TODO: other servicetype(i.e. 3wire,3wireraw) 
+        * discover a peer device
+        *         TODO: other servicetype(i.e. 3wire,3wireraw) support
         */
+       retval = ircomm_query_ias_and_connect(driver->comm, NINE_WIRE);
+       if(retval){
+               DEBUG(0, __FUNCTION__"(): ircomm_query_ias returns %d\n",
+                     retval);
+               return retval;
+       }
 
-       driver->comm = ircomm_attach_cable(NINE_WIRE, irvtd_notify,
-                                          irvtd_attached);
-       if(driver->comm == NULL)
-               return -ENODEV;
-       
        /*
         * TODO:we have to initialize control-channel here!
         *   i.e.set something into RTS,CTS and so on....
@@ -981,63 +825,83 @@ static int irvtd_startup(struct irvtd_cb *driver){
                clear_bit(TTY_IO_ERROR, &driver->tty->flags);
 
        change_speed(driver);
+       irvtd_start_timer( driver);
 
-       driver->flags |= IRVTD_ASYNC_INITIALIZED;
+       driver->rx_disable = 0;
+       driver->tx_disable = 1;
+       driver->disconnect_pend = 0;
        return 0;
 }
 
 
-int irvtd_open(struct tty_struct * tty, struct file * filp){
-       
+int irvtd_open(struct tty_struct * tty, struct file * filp)
+{
        struct irvtd_cb *driver;
        int retval;
        int line;
 
-       DEBUG(4, "irvtd_open():\n");
+       DEBUG(4, __FUNCTION__"():\n");
+       MOD_INC_USE_COUNT;
 
        line = MINOR(tty->device) - tty->driver.minor_start;
-       if ((line <0) || (line >= COMM_MAX_TTY))
+       if ((line <0) || (line >= COMM_MAX_TTY)){
+               MOD_DEC_USE_COUNT;
                return -ENODEV;
+       }
+
        driver = irvtd[line];
-       driver->line = line;
+       ASSERT(driver != NULL, MOD_DEC_USE_COUNT;return -ENOMEM;);
+       ASSERT(driver->magic == IRVTD_MAGIC, MOD_DEC_USE_COUNT;return -EINVAL;);
+
        driver->count++;
 
-       DEBUG(0, "irvtd_open : %s%d count %d\n", tty->driver.name, line, 
+       DEBUG(0, __FUNCTION__"():%s%d count %d\n", tty->driver.name, line, 
              driver->count);
        
        tty->driver_data = driver;
        driver->tty = tty;
 
-       
+       driver->tty->low_latency = (driver->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+
+       /*
+        * If the device is in the middle of being closed, then block
+        * (sleep) until it's done, then exit.
+        */
+
+       if (tty_hung_up_p(filp) ||
+           (driver->flags & ASYNC_CLOSING)) {
+               if (driver->flags & ASYNC_CLOSING)
+                       interruptible_sleep_on(&driver->close_wait);
+#ifdef DO_RESTART
+               if (driver->flags & ASYNC_HUP_NOTIFY)
+                       return -EAGAIN;
+               else
+                       return -ERESTARTSYS;
+#else
+               return -EAGAIN;
+#endif
+       }
+
        /* 
         * start up discovering process and ircomm_layer 
         */
        
        retval = irvtd_startup(driver);
-       if (retval)
+       if (retval){
+               DEBUG(0, __FUNCTION__"():irvtd_startup returns %d\n",retval);
                return retval;
-       MOD_INC_USE_COUNT;
+       }
 
        retval = irvtd_block_til_ready(tty, filp, driver);
        if (retval){
-               DEBUG(0,"irvtd_open returning after block_til_ready with %d\n",
-                     retval);
+               DEBUG(0,__FUNCTION__
+                     "():returning after block_til_ready (errno = %d)\n", retval);
                 return retval;
        }
 
-       if ((driver->count == 1) && driver->flags & IRVTD_ASYNC_SPLIT_TERMIOS){
-               if(tty->driver.subtype == IRVTD_TYPE_NORMAL)
-                       *tty->termios = driver->normal_termios;
-               else
-                       *tty->termios = driver->callout_termios;
-
-               change_speed(driver);
-       }
-       
        driver->session = current->session;
        driver->pgrp = current->pgrp;
-       driver->rx_disable = 0;
-       return (0);
+       return 0;
 }
 
 
@@ -1052,15 +916,55 @@ int irvtd_open(struct tty_struct * tty, struct file * filp){
  * ----------------------------------------------------------------------
  */
 
+/*
+ * Function irvtd_wait_until_sent (tty, timeout)
+ *
+ *    wait until Tx queue of IrTTP is empty 
+ *
+ */
+static void irvtd_wait_until_sent(struct tty_struct *tty, int timeout)
+{
+       struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
+       unsigned long orig_jiffies;
+
+       ASSERT(driver != NULL, return;);
+       ASSERT(driver->magic == IRVTD_MAGIC, return;);
+       ASSERT(driver->comm != NULL, return;);
+
+       DEBUG(0, __FUNCTION__"():\n");  
+       if(!tty->closing)
+               return;   /* nothing to do */
+       
+       /* 
+        * at disconnection, we should wait until Tx queue of IrTTP is
+        * flushed
+        */
+
+       ircomm_disconnect_request(driver->comm, NULL, P_NORMAL);
+       orig_jiffies = jiffies;
+
+       while (driver->comm->tsap->disconnect_pend) {
+               DEBUG(0, __FUNCTION__"():wait..\n");
+               current->state = TASK_INTERRUPTIBLE;
+               current->counter = 0;   /* make us low-priority */
+               schedule_timeout(HZ);    /* 1sec */
+               if (signal_pending(current))
+                       break;
+               if (timeout && time_after(jiffies, orig_jiffies + timeout))
+                       break;
+       }
+       current->state = TASK_RUNNING;
+}
+
 
 static void irvtd_shutdown(struct irvtd_cb * driver)
 {
        unsigned long   flags;
 
-       if (!(driver->flags & IRVTD_ASYNC_INITIALIZED))
+       if (!(driver->flags & ASYNC_INITIALIZED))
                return;
 
-       DEBUG(4,"irvtd_shutdown:\n");
+       DEBUG(0,__FUNCTION__"()\n");
 
        /*
         * This comment is written in serial.c:
@@ -1075,8 +979,8 @@ static void irvtd_shutdown(struct irvtd_cb * driver)
                driver->mcr &= ~(MCR_DTR|MCR_RTS);
 
        driver->comm->dte = driver->mcr;
-       ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-       ircomm_control_request(driver->comm);
+       ircomm_control_request(driver->comm, DTELINE_STATE );
+
 
 
        save_flags(flags); cli(); /* Disable interrupts */
@@ -1084,42 +988,49 @@ static void irvtd_shutdown(struct irvtd_cb * driver)
        if (driver->tty)
                set_bit(TTY_IO_ERROR, &driver->tty->flags);
        
-       ircomm_detach_cable(driver->comm);
+       del_timer( &driver->timer);
+
+       irias_delete_object("IrDA:IrCOMM");
 
        /*
         * Free the transmit buffer here 
         */
+
+       while(skb_queue_len(&driver->rxbuff)){
+               struct sk_buff *skb;
+               skb = skb_dequeue( &driver->rxbuff);
+               dev_kfree_skb(skb);
+       }
        if(driver->txbuff){
-               dev_kfree_skb(driver->txbuff);     /* is it OK?*/
+               dev_kfree_skb(driver->txbuff);
                driver->txbuff = NULL;
        }
-
-       driver->flags &= ~IRVTD_ASYNC_INITIALIZED;
+       ircomm_close_instance(driver->comm);
+       driver->comm = NULL;
+       driver->flags &= ~ASYNC_INITIALIZED;
        restore_flags(flags);
 }
 
-
-
-void irvtd_close(struct tty_struct * tty, struct file * filp){
-
+void irvtd_close(struct tty_struct * tty, struct file * filp)
+{
        struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
        int line;
        unsigned long flags;
 
-       DEBUG(0, "irvtd_close:refc(%d)\n",ircomm_vsd_refcount);
+       DEBUG(0, __FUNCTION__"():refcount= %d\n",irvtd_refcount);
 
        ASSERT(driver != NULL, return;);
        ASSERT(driver->magic == IRVTD_MAGIC, return;);
 
        save_flags(flags);cli();
 
-       /* 
-        * tty_hung_up_p() is defined as 
-        *   " return(filp->f_op == &hung_up_tty_fops); "
-        *       see driver/char/tty_io.c
-        */
 
        if(tty_hung_up_p(filp)){
+               /*
+                * upper tty layer caught a HUP signal and called irvtd_hangup()
+                * before. so we do nothing here.
+                */
+               DEBUG(0, __FUNCTION__"():tty_hung_up_p.\n");
                MOD_DEC_USE_COUNT;
                restore_flags(flags);
                return;
@@ -1127,7 +1038,7 @@ void irvtd_close(struct tty_struct * tty, struct file * filp){
        
 
        line = MINOR(tty->device) - tty->driver.minor_start;
-       DEBUG(0, "irvtd_close : %s%d count %d\n", tty->driver.name, line, 
+       DEBUG(0, __FUNCTION__"():%s%d count %d\n", tty->driver.name, line, 
              driver->count);
 
        if ((tty->count == 1) && (driver->count != 1)) {
@@ -1143,313 +1054,207 @@ void irvtd_close(struct tty_struct * tty, struct file * filp){
                driver->count = 1;
        }
        if (--driver->count < 0) {
-               printk("irvtd_close: bad count for line%d: %d\n",
+               printk(KERN_ERR"irvtd_close: bad count for line%d: %d\n",
                       line, driver->count);
                driver->count = 0;
        }
 
        if (driver->count) {    /* do nothing */
+               DEBUG(0, __FUNCTION__"():driver->count is not 0\n");
                MOD_DEC_USE_COUNT;
                restore_flags(flags);
                return; 
        }
 
-       driver->flags |= IRVTD_ASYNC_CLOSING;
-       
-       /*
-        * Save the termios structure, since this port may have
-        * separate termios for callout and dialin.
-        */
-
-       if (driver->flags & IRVTD_ASYNC_NORMAL_ACTIVE)
-               driver->normal_termios = *tty->termios;
-       if (driver->flags & IRVTD_ASYNC_CALLOUT_ACTIVE)
-               driver->callout_termios = *tty->termios;
+       driver->flags |= ASYNC_CLOSING;
        
        /*
         * Now we wait for the transmit buffer to clear; and we notify 
         * the line discipline to only process XON/XOFF characters.
         */
        tty->closing = 1;
-       if (driver->closing_wait != IRVTD_ASYNC_CLOSING_WAIT_NONE)
+       if (driver->closing_wait != ASYNC_CLOSING_WAIT_NONE){
+               DEBUG(4, __FUNCTION__"():calling tty_wait_until_sent()\n");
                tty_wait_until_sent(tty, driver->closing_wait);
+       }
+       /* 
+        * we can send disconnect_request with P_HIGH since
+        * tty_wait_until_sent() and irvtd_wait_until_sent() should
+        * have disconnected the link
+        */
+       ircomm_disconnect_request(driver->comm, NULL, P_HIGH);
        
        /* 
         * Now we stop accepting input.
         */
 
        driver->rx_disable = TRUE;
-
-       /* 
-        * Now we flush our buffer.., and shutdown ircomm service layer
-        */
-
-       /* drop our tx/rx buffer */
-       if (tty->driver.flush_buffer) 
-               tty->driver.flush_buffer(tty);  
-
-       while(skb_queue_len(&driver->rxbuff)){
-               struct sk_buff *skb;
-               skb = skb_dequeue( &driver->rxbuff);
-               dev_kfree_skb(skb);
-       }
-
-       /* drop users buffer? */
+       /* drop ldisc's buffer */
        if (tty->ldisc.flush_buffer)
                tty->ldisc.flush_buffer(tty);
 
-
+       if (tty->driver.flush_buffer) 
+               tty->driver.flush_buffer(driver->tty);  
 
        tty->closing = 0;
        driver->tty = NULL;
 
-       /*
-        * ad-hoc coding:
-        * we wait 2 sec before ircomm_detach_cable so that 
-        * irttp will send all contents of its queue
-        */
-
-#if 0
-       if (driver->blocked_open) {
+       if (driver->blocked_open)
+       {
                if (driver->close_delay) {
-#endif
-
                        /* kill time */
                        current->state = TASK_INTERRUPTIBLE;
-                       schedule_timeout(driver->close_delay + 2*HZ);
-#if 0
+                       schedule_timeout(driver->close_delay);
                }
                wake_up_interruptible(&driver->open_wait);
        }
-#endif
-       
-       driver->flags &= ~(IRVTD_ASYNC_NORMAL_ACTIVE|
-                          IRVTD_ASYNC_CALLOUT_ACTIVE|
-                          IRVTD_ASYNC_CLOSING);
+       irvtd_shutdown(driver);
+       driver->flags &= ~ASYNC_CLOSING;
         wake_up_interruptible(&driver->close_wait); 
 
-       irvtd_shutdown(driver);
        MOD_DEC_USE_COUNT;
         restore_flags(flags);
-       DEBUG(4,"irvtd_close:done:refc(%d)\n",ircomm_vsd_refcount);
+       DEBUG(4, __FUNCTION__"():done\n");
 }
 
-
-
 /*
  * ----------------------------------------------------------------------
  * irvtd_write() and friends
  * This routine will be called when something data are passed from
  * kernel or user.
- *
- * NOTE:I have stolen copy_from_user() from 2.0.30 kernel(linux/isdnif.h)
- * to access user space of memory carefully. Thanks a lot!:)
  * ----------------------------------------------------------------------
  */
 
 int irvtd_write(struct tty_struct * tty, int from_user,
-                       const unsigned char *buf, int count){
-
-       struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
+               const unsigned char *buf, int count)
+{
+       struct irvtd_cb *driver;
        int c = 0;
        int wrote = 0;
-       struct sk_buff *skb = NULL;
+       unsigned long flags;
+       struct sk_buff *skb;
        __u8 *frame;
 
-       DEBUG(4, "irvtd_write():\n");
+       ASSERT(tty != NULL, return -EFAULT;);
+       driver = (struct irvtd_cb *)tty->driver_data;
+       ASSERT(driver != NULL, return -EFAULT;);
+       ASSERT(driver->magic == IRVTD_MAGIC, return -EFAULT;);
 
-       if (!tty || !driver->txbuff)
-                return 0;
+       DEBUG(4, __FUNCTION__"()\n");
 
 
-       
+       save_flags(flags);
        while(1){
+               cli();
                skb = driver->txbuff;
-               
-               c = MIN(count, (skb_tailroom(skb) - COMM_HEADER_SIZE));
-               if (c <= 0) 
+               ASSERT(skb != NULL, break;);
+               c = MIN(count, (skb_tailroom(skb)));
+               if (c <= 0)
                        break;
 
                /* write to the frame */
 
-
                frame = skb_put(skb,c);
                if(from_user){
                        copy_from_user(frame,buf,c);
                } else
                        memcpy(frame, buf, c);
 
-               /* flush the frame */
-               irvtd_flush_chars(tty);
+               restore_flags(flags);
                wrote += c;
                count -= c;
+               buf += c;
        }
+       restore_flags(flags);
        return (wrote);
 }
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_put_char()
- * This routine is called by the kernel to pass a single character.
- * If we exausted our buffer,we can ignore the character!
- * ----------------------------------------------------------------------
+ * Function irvtd_put_char (tty, ch)
+ *
+ *    This routine is called by the kernel to pass a single character.
+ *    If we exausted our buffer,we can ignore the character!
+ *
  */
-void irvtd_put_char(struct tty_struct *tty, unsigned char ch){
-
+void irvtd_put_char(struct tty_struct *tty, unsigned char ch)
+{
        __u8 *frame ;
-       struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
-       struct sk_buff *skb = driver->txbuff;
-
-       ASSERT(tty->driver_data != NULL, return;);
-
-       DEBUG(4, "irvtd_put_char:\n");
-       if(!driver->txbuff)
-               return;
-
-       DEBUG(4, "irvtd_put_char(0x%02x) skb_len(%d) MAX(%d):\n",
-             (int)ch ,(int)skb->len,
-             driver->comm->maxsdusize - COMM_HEADER_SIZE);
-
-       /* append a character  */
-
-       frame = skb_put(skb,1);
-       frame[0] = ch;
-       return;
-}
-
-/*
- * ----------------------------------------------------------------------
- * irvtd_flush_chars() and friend
- * This routine will be called after a series of characters was written using 
- * irvtd_put_char().We have to send them down to IrCOMM.
- * ----------------------------------------------------------------------
- */
-
-static void flush_txbuff(struct irvtd_cb *driver){
-       
-       struct sk_buff *skb = driver->txbuff;
-       struct tty_struct *tty = driver->tty;
-       ASSERT(tty != NULL, return;);
-
-#ifdef IRVTD_DEBUG_TX
-       printk("flush_txbuff:");
-       {
-               int i;
-               for ( i=0;i<skb->len;i++)
-                       printk("%02x", skb->data[i]);
-               printk("\n");
-       }
-#else
-       DEBUG(4, "flush_txbuff:count(%d)\n",(int)skb->len);
-#endif
-
-       /* add "clen" field */
-       skb_push(skb,1);
-       skb->data[0]=0;          /* without control channel */
-
-       ircomm_data_request(driver->comm, driver->txbuff);
-
-       /* allocate new frame */
-       skb = driver->txbuff = dev_alloc_skb(driver->comm->max_txbuff_size);
-       if (skb == NULL){
-               printk(KERN_ERR"flush_txbuff():alloc_skb failed!\n");
-       } else {
-               skb_reserve(skb, COMM_HEADER_SIZE);
-       }
-       wake_up_interruptible(&driver->tty->write_wait);
-}
-
-void irvtd_flush_chars(struct tty_struct *tty){
-
-       struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
-       if(!driver || driver->magic != IRVTD_MAGIC || !driver->txbuff){
-               DEBUG(0,"irvtd_flush_chars:null structure:ignore\n");
-               return;
-       }
-       DEBUG(4, "irvtd_flush_chars():\n");
+       struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
+       struct sk_buff *skb;
+       unsigned long flags;
 
-       while(tty->hw_stopped){
-               DEBUG(4,"irvtd_flush_chars:hw_stopped:sleep..\n");
-               tty_wait_until_sent(tty,0);
-               DEBUG(4,"irvtd_flush_chars:waken up!\n");
-               if(!driver->txbuff->len)
-                       return;
-       }
+       ASSERT(driver != NULL, return;);
+       DEBUG(4, __FUNCTION__"()\n");
 
-       flush_txbuff(driver);
-}
 
+       save_flags(flags);cli();
+       skb = driver->txbuff;
+       ASSERT(skb != NULL,return;);
+       ASSERT(skb_tailroom(skb) > 0, return;);
+       DEBUG(4, "irvtd_put_char(0x%02x) skb_len(%d) MAX(%d):\n",
+             (int)ch ,(int)skb->len,
+             driver->comm->max_txbuff_size - COMM_HEADER_SIZE);
 
+       /* append a character  */
+       frame = skb_put(skb,1);
+       frame[0] = ch;
 
+       restore_flags(flags);
+       return;
+}
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_write_room()
- * This routine returns the room that our buffer has now.
+ * Function irvtd_write_room (tty)
+ *
+ *    This routine returns the room that our buffer has now.
  *
- * NOTE: 
- * driver/char/n_tty.c drops a character(s) when this routine returns 0,
- * and then linux will be frozen after a few minutes :(    why? bug?
- * ( I found this on linux-2.0.33 )
- * So this routine flushes a buffer if there is few room,     TH
- * ----------------------------------------------------------------------
  */
-
 int irvtd_write_room(struct tty_struct *tty){
 
        int ret;
-       struct sk_buff *skb = (struct sk_buff *)((struct irvtd_cb *) tty->driver_data)->txbuff;
+       struct sk_buff *skb = ((struct irvtd_cb *) tty->driver_data)->txbuff;
 
-       if(!skb){
-               DEBUG(0,"irvtd_write_room:NULL skb\n");
-               return(0);
-       }
-
-       ret = skb_tailroom(skb) - COMM_HEADER_SIZE;
-
-       if(ret < 0){
-               DEBUG(0,"irvtd_write_room:error:room is %d!",ret);
-               ret = 0;
-       }
-       DEBUG(4, "irvtd_write_room:\n");
-       DEBUG(4, "retval(%d)\n",ret);
+       ASSERT(skb !=NULL, return 0;);
 
+       ret = skb_tailroom(skb);
 
-       /* flush buffer automatically to avoid kernel freeze :< */
-       if(ret < 8)    /* why 8? there's no reason :) */
-               irvtd_flush_chars(tty);
+       DEBUG(4, __FUNCTION__"(): room is %d bytes\n",ret);
 
        return(ret);
 }
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_chars_in_buffer()
- * This function returns how many characters which have not been sent yet 
- * are still in buffer.
- * ----------------------------------------------------------------------
+ * Function irvtd_chars_in_buffer (tty)
+ *
+ *    This function returns how many characters which have not been sent yet 
+ *    are still in buffer.
+ *
  */
-
 int irvtd_chars_in_buffer(struct tty_struct *tty){
 
-       struct sk_buff *skb = 
-               (struct sk_buff *) ((struct irvtd_cb *)tty->driver_data) ->txbuff;
-       DEBUG(4, "irvtd_chars_in_buffer()\n");
+       struct sk_buff *skb;
+       unsigned long flags;
 
-       if(!skb){
-               printk(KERN_ERR"irvtd_chars_in_buffer:NULL skb\n");
-               return(0);
-       }
+       DEBUG(4, __FUNCTION__"()\n");
+
+       save_flags(flags);cli();
+       skb = ((struct irvtd_cb *) tty->driver_data)->txbuff;
+       if(skb == NULL) goto err;
+
+       restore_flags(flags);
        return (skb->len );
+err:   
+       ASSERT(skb != NULL, ;);
+       restore_flags(flags);
+       return 0;   /* why not -EFAULT or such? see driver/char/serial.c */
 }
 
 /*
- * ----------------------------------------------------------------------
- * irvtd_break()
- * routine which turns the break handling on or off
- * ----------------------------------------------------------------------
+ * Function irvtd_break (tty, break_state)
+ *
+ *    Routine which turns the break handling on or off
+ *
  */
-
 static void irvtd_break(struct tty_struct *tty, int break_state){
        
        struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
@@ -1463,14 +1268,14 @@ static void irvtd_break(struct tty_struct *tty, int break_state){
        if (break_state == -1)
        {
                driver->comm->break_signal = 0x01;
-               ircomm_append_ctrl(driver->comm, BREAK_SIGNAL);
-               ircomm_control_request(driver->comm);
+               ircomm_control_request(driver->comm, BREAK_SIGNAL);
+
        }
        else
        {
                driver->comm->break_signal = 0x00;
-               ircomm_append_ctrl(driver->comm, BREAK_SIGNAL);
-               ircomm_control_request(driver->comm);
+               ircomm_control_request(driver->comm, BREAK_SIGNAL);
+
        }
 
        restore_flags(flags);
@@ -1497,8 +1302,7 @@ static int get_modem_info(struct irvtd_cb * driver, unsigned int *value)
                | ((driver->msr & DELTA_RI) ? TIOCM_RNG : 0)
                | ((driver->msr & DELTA_DSR) ? TIOCM_DSR : 0)
                | ((driver->msr & DELTA_CTS) ? TIOCM_CTS : 0);
-       put_user(result,value);
-       return 0;
+       return put_user(result,value);
 }
 
 static int set_modem_info(struct irvtd_cb * driver, unsigned int cmd,
@@ -1537,19 +1341,111 @@ static int set_modem_info(struct irvtd_cb * driver, unsigned int cmd,
        }
        
        driver->comm->dte = driver->mcr;
-       ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-       ircomm_control_request(driver->comm);
+       ircomm_control_request(driver->comm, DTELINE_STATE );
+
        return 0;
 }
 
-int irvtd_ioctl(struct tty_struct *tty, struct file * file,
-               unsigned int cmd, unsigned long arg){
+static int get_serial_info(struct irvtd_cb * driver,
+                          struct serial_struct * retinfo)
+{
+       struct serial_struct tmp;
+   
+       if (!retinfo)
+               return -EFAULT;
+       memset(&tmp, 0, sizeof(tmp));
+       tmp.line = driver->line;
+       tmp.flags = driver->flags;
+       tmp.baud_base = driver->comm->data_rate;
+       tmp.close_delay = driver->close_delay;
+       tmp.closing_wait = driver->closing_wait;
+
+       /* for compatibility  */
+
+       tmp.type = PORT_16550A;
+       tmp.port = 0;
+       tmp.irq = 0;
+       tmp.xmit_fifo_size = 0;
+       tmp.hub6 = 0;   
+       tmp.custom_divisor = driver->custom_divisor;
+
+       if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
+               return -EFAULT;
+       return 0;
+}
+
+static int set_serial_info(struct irvtd_cb * driver,
+                          struct serial_struct * new_info)
+{
+       struct serial_struct new_serial;
+       struct irvtd_cb old_driver;
+
+       if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
+               return -EFAULT;
+
+       old_driver = *driver;
+  
+       if (!capable(CAP_SYS_ADMIN)) {
+               if ((new_serial.baud_base != driver->comm->data_rate) ||
+                   (new_serial.close_delay != driver->close_delay) ||
+                   ((new_serial.flags & ~ASYNC_USR_MASK) !=
+                    (driver->flags & ~ASYNC_USR_MASK)))
+                       return -EPERM;
+               driver->flags = ((driver->flags & ~ASYNC_USR_MASK) |
+                                (new_serial.flags & ASYNC_USR_MASK));
+               driver->custom_divisor = new_serial.custom_divisor;
+               goto check_and_exit;
+       }
+
+       /*
+        * OK, past this point, all the error checking has been done.
+        * At this point, we start making changes.....
+        */
+
+       if(driver->comm->data_rate != new_serial.baud_base){
+               driver->comm->data_rate = new_serial.baud_base;
+               if(driver->comm->state == COMM_CONN)
+                       ircomm_control_request(driver->comm,DATA_RATE);
+       }
+       driver->close_delay = new_serial.close_delay * HZ/100;
+       driver->closing_wait = new_serial.closing_wait * HZ/100;
+       driver->custom_divisor = new_serial.custom_divisor;
+
+       driver->flags = ((driver->flags & ~ASYNC_FLAGS) |
+                        (new_serial.flags & ASYNC_FLAGS));
+       driver->tty->low_latency = (driver->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+
+ check_and_exit:
+       if (driver->flags & ASYNC_INITIALIZED) {
+               if (((old_driver.flags & ASYNC_SPD_MASK) !=
+                    (driver->flags & ASYNC_SPD_MASK)) ||
+                   (old_driver.custom_divisor != driver->custom_divisor)) {
+                       if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
+                               driver->tty->alt_speed = 57600;
+                       if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
+                               driver->tty->alt_speed = 115200;
+                       if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
+                               driver->tty->alt_speed = 230400;
+                       if ((driver->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
+                               driver->tty->alt_speed = 460800;
+                       change_speed(driver);
+               }
+       }
+       return 0;
+}
+
+
 
+
+int irvtd_ioctl(struct tty_struct *tty, struct file * file,
+               unsigned int cmd, unsigned long arg)
+{
        int error;
+       unsigned long flags;
        struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
 
-       struct icounter_struct cnow;
-       struct icounter_struct *p_cuser;        /* user space */
+       struct serial_icounter_struct cnow,cprev;
+       struct serial_icounter_struct *p_cuser; /* user space */
 
 
        DEBUG(4,"irvtd_ioctl:requested ioctl(0x%08x)\n",cmd);
@@ -1557,7 +1453,6 @@ int irvtd_ioctl(struct tty_struct *tty, struct file * file,
 #ifdef IRVTD_DEBUG_IOCTL
        {
                /* kill time so that debug messages will come slowly  */
-               unsigned long flags;
                save_flags(flags);cli();
                current->state = TASK_INTERRUPTIBLE;
                current->timeout = jiffies + HZ/4; /*0.25sec*/
@@ -1572,7 +1467,6 @@ int irvtd_ioctl(struct tty_struct *tty, struct file * file,
            (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) &&
            (cmd != TIOCMIWAIT) && (cmd != TIOCGICOUNT)) {
                if (tty->flags & (1 << TTY_IO_ERROR)){
-                       DEBUG(0,"irvtd_ioctl:I/O error...\n");
                        return -EIO;
                }
        }
@@ -1580,143 +1474,89 @@ int irvtd_ioctl(struct tty_struct *tty, struct file * file,
        switch (cmd) {
 
        case TIOCMGET:
-               error = verify_area(VERIFY_WRITE, (void *) arg,
-                                   sizeof(unsigned int));
-               if (error)
-                       return error;
                return get_modem_info(driver, (unsigned int *) arg);
 
        case TIOCMBIS:
        case TIOCMBIC:
        case TIOCMSET:
                return set_modem_info(driver, cmd, (unsigned int *) arg);
-#if 0
-       /*
-        * we wouldn't implement them since we don't use serial_struct
-        */
        case TIOCGSERIAL:
-               error = verify_area(VERIFY_WRITE, (void *) arg,
-                                   sizeof(struct serial_struct));
-               if (error)
-                       return error;
-               return irvtd_get_serial_info(driver,
-                                      (struct serial_struct *) arg);
+               return get_serial_info(driver, (struct serial_struct *) arg);
        case TIOCSSERIAL:
-               error = verify_area(VERIFY_READ, (void *) arg,
-                                   sizeof(struct serial_struct));
-               if (error)
-                       return error;
-               return irvtd_set_serial_info(driver,
-                                      (struct serial_struct *) arg);
-
-
-       case TIOCSERGETLSR: /* Get line status register */
-               error = verify_area(VERIFY_WRITE, (void *) arg,
-                                   sizeof(unsigned int));
-               if (error)
-                       return error;
-               else
-                       return get_lsr_info(driver, (unsigned int *) arg);
-#endif         
+               return set_serial_info(driver, (struct serial_struct *) arg);
 
-/*
- *  I think we don't need them
- */
-/*     case TIOCSERCONFIG: */
-               
-
-/*
- * They cannot be implemented because we don't use async_struct 
- * which is defined in serial.h
- */
-
-/*     case TIOCSERGSTRUCT: */
-/*             error = verify_area(VERIFY_WRITE, (void *) arg, */
-/*                                 sizeof(struct async_struct)); */
-/*             if (error) */
-/*                     return error; */
-/*             memcpy_tofs((struct async_struct *) arg, */
-/*                         driver, sizeof(struct async_struct)); */
-/*             return 0; */
-               
-/*     case TIOCSERGETMULTI: */
-/*             error = verify_area(VERIFY_WRITE, (void *) arg, */
-/*                                 sizeof(struct serial_multiport_struct)); */
-/*             if (error) */
-/*                     return error; */
-/*             return get_multiport_struct(driver, */
-/*                                         (struct serial_multiport_struct *) arg); */
-/*     case TIOCSERSETMULTI: */
-/*             error = verify_area(VERIFY_READ, (void *) arg, */
-/*                                 sizeof(struct serial_multiport_struct)); */
-/*             if (error) */
-/*                     return error; */
-/*             return set_multiport_struct(driver, */
-/*                                         (struct serial_multiport_struct *) arg); */
-               /*
-                * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS)
-                * to change
-                * - mask passed in arg for lines of interest
-                *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)
-                * Caller should use TIOCGICOUNT to see which one it was
-                */
 
        case TIOCMIWAIT:
+               save_flags(flags); cli();
+               /* note the counters on entry */
+               cprev = driver->icount;
+               restore_flags(flags);
                while (1) {
                        interruptible_sleep_on(&driver->delta_msr_wait);
-                       /* see if a signal did it */
-/*                     if (current->signal & ~current->blocked) */
-/*                             return -ERESTARTSYS; */
-
-                       if ( ((arg & TIOCM_RNG) && (driver->msr & DELTA_RI))  ||
-                            ((arg & TIOCM_DSR) && (driver->msr & DELTA_DSR)) ||
-                            ((arg & TIOCM_CD)  && (driver->msr & DELTA_DCD)) ||
-                            ((arg & TIOCM_CTS) && (driver->msr & DELTA_CTS))) {
+                               /* see if a signal did it */
+                       if (signal_pending(current))
+                               return -ERESTARTSYS;
+                       save_flags(flags); cli();
+                       cnow = driver->icount; /* atomic copy */
+                       restore_flags(flags);
+                       if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && 
+                           cnow.dcd == cprev.dcd && cnow.cts == cprev.cts)
+                               return -EIO; /* no change => error */
+                       if ( ((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) ||
+                            ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) ||
+                            ((arg & TIOCM_CD)  && (cnow.dcd != cprev.dcd)) ||
+                            ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) {
                                return 0;
                        }
+                       cprev = cnow;
                }
                /* NOTREACHED */
 
-
        case TIOCGICOUNT:
-               /* 
-                * Get counter of input serial line interrupts (DCD,RI,DSR,CTS)
-                * Return: write counters to the user passed counter struct
-                * NB: both 1->0 and 0->1 transitions are counted except for
-                *     RI where only 0->1 is counted.
-                */
-               error = verify_area(VERIFY_WRITE, (void *) arg,
-                                   sizeof(struct icounter_struct));
-               if (error)
-                       return error;
-               cli();
+               save_flags(flags); cli();
                cnow = driver->icount;
-               sti();
-               p_cuser = (struct icounter_struct *) arg;
-               put_user(cnow.cts, &p_cuser->cts);
-               put_user(cnow.dsr, &p_cuser->dsr);
-               put_user(cnow.rng, &p_cuser->rng);
-               put_user(cnow.dcd, &p_cuser->dcd);
+               restore_flags(flags);
+               p_cuser = (struct serial_icounter_struct *) arg;
+               error = put_user(cnow.cts, &p_cuser->cts);
+               if (error) return error;
+               error = put_user(cnow.dsr, &p_cuser->dsr);
+               if (error) return error;
+               error = put_user(cnow.rng, &p_cuser->rng);
+               if (error) return error;
+               error = put_user(cnow.dcd, &p_cuser->dcd);
+               if (error) return error;
+               error = put_user(cnow.rx, &p_cuser->rx);
+               if (error) return error;
+               error = put_user(cnow.tx, &p_cuser->tx);
+               if (error) return error;
+               error = put_user(cnow.frame, &p_cuser->frame);
+               if (error) return error;
+               error = put_user(cnow.overrun, &p_cuser->overrun);
+               if (error) return error;
+               error = put_user(cnow.parity, &p_cuser->parity);
+               if (error) return error;
+               error = put_user(cnow.brk, &p_cuser->brk);
+               if (error) return error;
+               error = put_user(cnow.buf_overrun, &p_cuser->buf_overrun);
+               if (error) return error;                        
                return 0;
+               
+               
+               /* ioctls which are imcompatible with serial.c */
 
-
-       case TIOCGSERIAL:
-       case TIOCSSERIAL:
+       case TIOCSERGSTRUCT:
+               DEBUG(0,__FUNCTION__"():sorry, TIOCSERGSTRUCT is not supported\n");
+               return -ENOIOCTLCMD;  
        case TIOCSERGETLSR:
+               DEBUG(0,__FUNCTION__"():sorry, TIOCSERGETLSR is not supported\n");
+               return -ENOIOCTLCMD;  
        case TIOCSERCONFIG:
-       case TIOCSERGWILD:
-       case TIOCSERSWILD:
-       case TIOCSERGSTRUCT:
-       case TIOCSERGETMULTI:
-       case TIOCSERSETMULTI:
-               DEBUG(0,"irvtd_ioctl:sorry, ioctl(0x%08x)is not implemented\n",cmd);
-               return -ENOIOCTLCMD;  /* ioctls which are imcompatible with serial.c */
-
-       case TCSETS:
-       case TCGETS:
-       case TCFLSH:
+               DEBUG(0,__FUNCTION__"():sorry, TIOCSERCONFIG is not supported\n");
+               return -ENOIOCTLCMD;  
+
+
        default:
-               return -ENOIOCTLCMD;  /* ioctls which we must not touch */
+               return -ENOIOCTLCMD;  /* ioctls which we must ignore */
        }
        return 0;
 }
@@ -1781,8 +1621,8 @@ void irvtd_throttle(struct tty_struct *tty){
        driver->mcr &= ~MCR_RTS; 
        driver->mcr |= DELTA_RTS; 
        driver->comm->dte = driver->mcr;
-       ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-       ircomm_control_request(driver->comm);
+       ircomm_control_request(driver->comm, DTELINE_STATE );
+
         irttp_flow_request(driver->comm->tsap, FLOW_STOP);
 }
 
@@ -1795,8 +1635,8 @@ void irvtd_unthrottle(struct tty_struct *tty){
 
        driver->mcr |= (MCR_RTS|DELTA_RTS);
        driver->comm->dte = driver->mcr;
-       ircomm_append_ctrl(driver->comm, DTELINE_STATE );
-       ircomm_control_request(driver->comm);
+       ircomm_control_request(driver->comm, DTELINE_STATE );
+
         irttp_flow_request(driver->comm->tsap, FLOW_START);
 }
 
@@ -1829,19 +1669,17 @@ irvtd_start(struct tty_struct *tty){
  * ------------------------------------------------------------
  * irvtd_hangup()
  * This routine notifies that tty layer have got HUP signal
- * Is this routine right ? :{|
  * ------------------------------------------------------------
  */
 
 void irvtd_hangup(struct tty_struct *tty){
 
        struct irvtd_cb *info = (struct irvtd_cb *)tty->driver_data;
-       DEBUG(0, "irvtd_hangup()\n");
+       DEBUG(0, __FUNCTION__"()\n");
 
        irvtd_flush_buffer(tty);
        irvtd_shutdown(info);
        info->count = 0;
-       info->flags &= ~(IRVTD_ASYNC_NORMAL_ACTIVE|IRVTD_ASYNC_CALLOUT_ACTIVE);
        info->tty = NULL;
        wake_up_interruptible(&info->open_wait);
 }
@@ -1851,15 +1689,18 @@ void irvtd_flush_buffer(struct tty_struct *tty){
        struct irvtd_cb *driver = (struct irvtd_cb *)tty->driver_data;
        struct sk_buff *skb;
 
-       skb = (struct sk_buff *)driver->txbuff;
+       skb = driver->txbuff;
+       ASSERT(skb != NULL, return;); 
 
-       DEBUG(4, "irvtd_flush_buffer:%d chars are gone..\n",(int)skb->len);
-       skb_trim(skb,0); 
+       if(skb->len){
+               DEBUG(0, __FUNCTION__"():%d chars in txbuff are lost..\n",(int)skb->len);
+               skb_trim(skb,0); 
+       }
        
        /* write_wait is a wait queue of tty_wait_until_sent().
         * see tty_io.c of kernel 
         */
-       wake_up_interruptible(&tty->write_wait); 
+       wake_up_interruptible(&tty->write_wait); 
 
        if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
            tty->ldisc.write_wakeup)
@@ -1867,3 +1708,275 @@ void irvtd_flush_buffer(struct tty_struct *tty){
 }
 
 
+
+/*
+ * Function ircomm_register_device(void), init_module() and friends
+ *
+ *   we register "port emulation entity"(see IrCOMM specification) here
+ *   as a tty device.
+ */
+
+int irvtd_register_ttydriver(void){
+
+        DEBUG( 4, "-->irvtd_register_ttydriver\n");
+
+       /* setup virtual serial port device */
+
+        /* Initialize the tty_driver structure ,which is defined in 
+          tty_driver.h */
+        
+        memset(&irvtd_drv, 0, sizeof(struct tty_driver));
+       irvtd_drv.magic = IRVTD_MAGIC;
+       irvtd_drv.driver_name = "IrCOMM_tty";
+       irvtd_drv.name = "irnine";
+       irvtd_drv.major = IRCOMM_MAJOR;
+       irvtd_drv.minor_start = IRVTD_MINOR;
+       irvtd_drv.num = COMM_MAX_TTY;
+       irvtd_drv.type = TTY_DRIVER_TYPE_SERIAL;  /* see tty_driver.h */
+
+
+       /*
+        * see drivers/char/tty_io.c and termios(3)
+        */
+
+        irvtd_drv.init_termios = tty_std_termios;
+        irvtd_drv.init_termios.c_cflag =
+               B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+        irvtd_drv.flags = TTY_DRIVER_REAL_RAW;   /* see tty_driver.h */
+        irvtd_drv.refcount = &irvtd_refcount;
+
+       /* pointer to the tty data structures */
+
+        irvtd_drv.table = irvtd_table;  
+        irvtd_drv.termios = irvtd_termios;
+        irvtd_drv.termios_locked = irvtd_termios_locked;
+
+        /*
+         * Interface table from the kernel(tty driver) to the ircomm
+         * layer
+         */
+
+        irvtd_drv.open = irvtd_open;
+        irvtd_drv.close = irvtd_close;
+        irvtd_drv.write = irvtd_write;
+        irvtd_drv.put_char = irvtd_put_char;
+       irvtd_drv.flush_chars = NULL;
+        irvtd_drv.write_room = irvtd_write_room;
+       irvtd_drv.chars_in_buffer = irvtd_chars_in_buffer; 
+        irvtd_drv.flush_buffer = irvtd_flush_buffer;
+       irvtd_drv.ioctl = irvtd_ioctl; 
+       irvtd_drv.throttle = irvtd_throttle;
+       irvtd_drv.unthrottle = irvtd_unthrottle;
+       irvtd_drv.set_termios = irvtd_set_termios;
+       irvtd_drv.stop = NULL;          /*  irvtd_stop; */
+       irvtd_drv.start = NULL;         /* irvtd_start; */
+        irvtd_drv.hangup = irvtd_hangup;
+
+        irvtd_drv.send_xchar = irvtd_send_xchar;
+       irvtd_drv.break_ctl = irvtd_break;
+       irvtd_drv.read_proc = irvtd_read_proc;
+       irvtd_drv.wait_until_sent = irvtd_wait_until_sent;
+
+
+
+       if (tty_register_driver(&irvtd_drv)){
+               DEBUG(0,"IrCOMM:Couldn't register tty driver\n");
+               return(1);
+       }
+
+       DEBUG( 4, "irvtd_register_ttydriver: done.\n");
+       return(0);
+}
+
+
+/*
+ * Function irvtd_unregister_device(void) 
+ *   it will be called when you rmmod
+ */
+
+void irvtd_unregister_ttydriver(void){
+
+       int err;        
+        DEBUG( 4, "--> irvtd_unregister_device\n");
+
+       /* unregister tty device   */
+
+       err = tty_unregister_driver(&irvtd_drv);
+        if (err)
+                printk("IrCOMM: failed to unregister vtd driver(%d)\n",err);
+        DEBUG( 4, "irvtd_unregister_device -->\n");
+       return;
+}
+
+/*
+ **********************************************************************
+ *    proc stuff
+ *
+ **********************************************************************
+ */
+
+static int line_info(char *buf, struct irvtd_cb *driver)
+{
+       int     ret=0;
+
+       ASSERT(driver != NULL,goto exit;);
+       ASSERT(driver->magic == IRVTD_MAGIC,goto exit;);
+
+       ret += sprintf(buf, "tx: %d rx: %d"
+                     ,driver->icount.tx, driver->icount.rx);
+
+       if (driver->icount.frame)
+                ret += sprintf(buf+ret, " fe:%d", driver->icount.frame);
+        if (driver->icount.parity)
+                ret += sprintf(buf+ret, " pe:%d", driver->icount.parity);
+        if (driver->icount.brk)
+                ret += sprintf(buf+ret, " brk:%d", driver->icount.brk);  
+        if (driver->icount.overrun)
+                ret += sprintf(buf+ret, " oe:%d", driver->icount.overrun);
+
+       if (driver->mcr & MCR_RTS)
+                ret += sprintf(buf+ret, "|RTS");
+        if (driver->msr & MSR_CTS)
+                ret += sprintf(buf+ret, "|CTS");
+        if (driver->mcr & MCR_DTR)
+                ret += sprintf(buf+ret, "|DTR");
+        if (driver->msr & MSR_DSR)
+                ret += sprintf(buf+ret, "|DSR");
+        if (driver->msr & MSR_DCD)
+                ret += sprintf(buf+ret, "|CD");
+       if (driver->msr & MSR_RI) 
+               ret += sprintf(buf+ret, "|RI");
+
+ exit:
+       ret += sprintf(buf+ret, "\n");
+       return ret;
+}
+
+
+
+static int irvtd_read_proc(char *buf, char **start, off_t offset, int len,
+                int *eof, void *unused)
+{
+       int i, count = 0, l;
+       off_t   begin = 0;
+
+       count += sprintf(buf, "driver revision:%s\n", revision_date);
+       for (i = 0; i < COMM_MAX_TTY && count < 4000; i++) {
+               l = line_info(buf + count, irvtd[i]);
+               count += l;
+               if (count+begin > offset+len)
+                       goto done;
+               if (count+begin < offset) {
+                       begin += count;
+                       count = 0;
+               }
+       }
+       *eof = 1;
+done:
+       if (offset >= count+begin)
+               return 0;
+       *start = buf + (begin-offset);
+       return ((len < begin+count-offset) ? len : begin+count-offset);
+}
+
+
+
+
+/************************************************************
+ *    init & cleanup this module 
+ ************************************************************/
+
+__initfunc(int irvtd_init(void))
+{
+       int i;
+
+       DEBUG( 4, __FUNCTION__"()\n");
+       printk( KERN_INFO 
+               "ircomm_tty: virtual tty driver for IrCOMM ( revision:%s )\n",
+               revision_date);
+
+
+       /* allocate a master array */
+
+       irvtd = (struct irvtd_cb **) kmalloc( sizeof(void *) *
+                                               COMM_MAX_TTY,GFP_KERNEL);
+       if ( irvtd == NULL) {
+               printk( KERN_WARNING __FUNCTION__"(): kmalloc failed!\n");
+               return -ENOMEM;
+       }
+
+       memset( irvtd, 0, sizeof(void *) * COMM_MAX_TTY);
+
+       for (i=0; i < COMM_MAX_TTY; i++){
+               irvtd[i] = kmalloc( sizeof(struct irvtd_cb), GFP_KERNEL);       
+               if(irvtd[i] == NULL){
+                       printk(KERN_ERR __FUNCTION__"(): kmalloc failed!\n");
+                       return -ENOMEM;
+               }
+               memset( irvtd[i], 0, sizeof(struct irvtd_cb));
+               irvtd[i]->magic = IRVTD_MAGIC;
+               irvtd[i]->line = i;
+               irvtd[i]->closing_wait = 30*HZ ;
+               irvtd[i]->close_delay = 5*HZ/10 ; 
+       }
+
+       /* 
+        * initialize a "port emulation entity"
+        */
+
+       if(irvtd_register_ttydriver()){
+               printk( KERN_WARNING "IrCOMM: Error in ircomm_register_device\n");
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+void irvtd_cleanup(void)
+{
+       int i;
+       DEBUG( 4, __FUNCTION__"()\n");
+
+       /*
+        * free some resources
+        */
+       if (irvtd) {
+               for (i=0; i<COMM_MAX_TTY; i++) {
+                       if (irvtd[i]) {
+                               if(irvtd[i]->comm)
+                                       ircomm_close_instance(irvtd[i]->comm);
+                               if(irvtd[i]->txbuff)
+                                       dev_kfree_skb(irvtd[i]->txbuff);
+                               DEBUG( 4, "freeing structures\n");
+                               kfree(irvtd[i]);
+                               irvtd[i] = NULL;
+                       }
+               }
+               DEBUG( 4, "freeing master array\n");
+               kfree(irvtd);
+               irvtd = NULL;
+       }
+
+       irvtd_unregister_ttydriver();
+
+}
+
+#ifdef MODULE
+
+int init_module(void) 
+{
+       irvtd_init();
+       return 0;
+}
+
+/*
+ * Function ircomm_cleanup (void)
+ *   This is called when you rmmod.
+ */
+
+void cleanup_module(void)
+{
+       irvtd_cleanup();
+}
+
+#endif /* MODULE */
index 00698944d42e8bf70f053ba07825275a8ee14303..eaf9f2cd4bce612b5c1176faf607d728ffc1f247 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Wed Sep  2 20:22:08 1998
- * Modified at:   Tue Feb 16 17:36:04 1999
+ * Modified at:   Wed Apr  7 17:16:54 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -36,6 +36,7 @@
 #include <asm/segment.h>
 #include <asm/uaccess.h>
 #include <asm/dma.h>
+#include <asm/spinlock.h>
 
 #include <net/pkt_sched.h>
 
@@ -108,11 +109,11 @@ __initfunc(int irda_device_init( void))
 
 void irda_device_cleanup(void)
 {
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( irda_device != NULL, return;);
+       ASSERT(irda_device != NULL, return;);
 
-       hashbin_delete( irda_device, (FREE_FUNC) irda_device_close);
+       hashbin_delete(irda_device, (FREE_FUNC) irda_device_close);
 }
 
 /*
@@ -121,80 +122,83 @@ void irda_device_cleanup(void)
  *    Open a new IrDA port device
  *
  */
-int irda_device_open( struct irda_device *self, char *name, void *priv)
+int irda_device_open(struct irda_device *self, char *name, void *priv)
 {        
        int result;
        int i=0;
-       
-       /* Check that a minimum of allocation flags are specified */
-       ASSERT(( self->rx_buff.flags & (GFP_KERNEL|GFP_ATOMIC)) != 0, 
-              return -1;);
-       ASSERT(( self->tx_buff.flags & (GFP_KERNEL|GFP_ATOMIC)) != 0, 
-              return -1;);
-
-       ASSERT( self->tx_buff.truesize > 0, return -1;);
-       ASSERT( self->rx_buff.truesize > 0, return -1;);
-
-       self->rx_buff.data = ( __u8 *) kmalloc( self->rx_buff.truesize, 
-                                               self->rx_buff.flags);
-       self->tx_buff.data = ( __u8 *) kmalloc( self->tx_buff.truesize, 
-                                               self->tx_buff.flags);
-
-       if ( self->rx_buff.data == NULL || self->tx_buff.data == NULL)   {
-               DEBUG( 0, "IrDA Self: no space for buffers!\n");
-               irda_device_close( self);
-               return -ENOMEM;
+
+       /* Allocate memory if needed */
+       if (self->rx_buff.truesize > 0) {
+               self->rx_buff.data = ( __u8 *) kmalloc(self->rx_buff.truesize,
+                                                      self->rx_buff.flags);
+               if (self->rx_buff.data == NULL)
+                       return -ENOMEM;
+
+               memset(self->rx_buff.data, 0, self->rx_buff.truesize);
        }
+       if (self->tx_buff.truesize > 0) {
+               self->tx_buff.data = ( __u8 *) kmalloc(self->tx_buff.truesize, 
+                                                      self->tx_buff.flags);
+               if (self->tx_buff.data == NULL)
+                       return -ENOMEM;
 
-       memset( self->rx_buff.data, 0, self->rx_buff.truesize);
-       memset( self->tx_buff.data, 0, self->tx_buff.truesize);
+               memset(self->tx_buff.data, 0, self->tx_buff.truesize);
+       }
        
-       self->magic = IRDA_DEVICE_MAGIC;
+       self->magic = IRDA_DEVICE_MAGIC;
 
        self->rx_buff.in_frame = FALSE;
        self->rx_buff.state = OUTSIDE_FRAME;
 
        /* Initialize timers */
-       init_timer( &self->media_busy_timer);   
-
-       /* Open new IrLAP layer instance */
-       self->irlap = irlap_open( self);
+       init_timer(&self->media_busy_timer);    
 
        /* A pointer to the low level implementation */
        self->priv = priv;
 
        /* Initialize IrDA net device */
        do {
-               sprintf( self->name, "%s%d", "irda", i++);
-       } while ( dev_get( self->name) != NULL);
+               sprintf(self->name, "%s%d", "irda", i++);
+       } while (dev_get(self->name) != NULL);
        
        self->netdev.name = self->name;
        self->netdev.priv = (void *) self;
        self->netdev.next = NULL;
 
-       if (( result = register_netdev( &self->netdev)) != 0) {
-               DEBUG( 0, __FUNCTION__ "(), register_netdev() failed!\n");
+       if ((result = register_netdev(&self->netdev)) != 0) {
+               DEBUG(0, __FUNCTION__ "(), register_netdev() failed!\n");
                return -1;
        }
-
+       
        /* 
         * Make the description for the device. self->netdev.name will get
         * a name like "irda0" and the self->descriptin will get a name
         * like "irda0 <-> irtty0" 
         */
-       strncpy( self->description, self->name, 5);
-       strcat( self->description, " <-> ");
-       strncat( self->description, name, 23);
-
-       hashbin_insert( irda_device, (QUEUE *) self, (int) self, NULL);
-
+       strncpy(self->description, self->name, 5);
+       strcat(self->description, " <-> ");
+       strncat(self->description, name, 23);
+       
+       hashbin_insert(irda_device, (QUEUE *) self, (int) self, NULL);
+       
        /* Open network device */
-       dev_open( &self->netdev);
+       dev_open(&self->netdev);
 
-       printk( "IrDA device %s registered.\n", self->name);
+       printk("IrDA device %s registered.\n", self->name);
 
-       irda_device_set_media_busy( self, FALSE);
+       irda_device_set_media_busy(self, FALSE);
+
+       /* 
+        * Open new IrLAP layer instance, now that everything should be
+        * initialized properly 
+        */
+       self->irlap = irlap_open(self);
         
+       /* It's now safe to initilize the saddr */
+       memcpy(self->netdev.dev_addr, &self->irlap->saddr, 4);
+
+       DEBUG(4, __FUNCTION__ "()->\n");
+
        return 0;
 }
 
@@ -204,29 +208,29 @@ int irda_device_open( struct irda_device *self, char *name, void *priv)
  *    Close this instance of the irda_device, just deallocate buffers
  *
  */
-void __irda_device_close( struct irda_device *self)
+void __irda_device_close(struct irda_device *self)
 {
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       dev_close( &self->netdev);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-       /* Remove netdevice */
-       unregister_netdev( &self->netdev);
+       /* We do this test to know if the device has been registered at all */
+       if (self->netdev.type == ARPHRD_IRDA) {
+               dev_close(&self->netdev);
+               
+               /* Remove netdevice */
+               unregister_netdev(&self->netdev);
+       }
 
        /* Stop timers */
-       del_timer( &self->todo_timer);
-       del_timer( &self->media_busy_timer);
+       del_timer(&self->media_busy_timer);
 
-       if ( self->tx_buff.data) {
-               kfree( self->tx_buff.data);
-       }
+       if (self->tx_buff.data)
+               kfree(self->tx_buff.data);
 
-       if ( self->rx_buff.data) {
-               kfree( self->rx_buff.data);
-       }
+       if (self->rx_buff.data)
+               kfree(self->rx_buff.data);
 
        self->magic = 0;
 }
@@ -237,20 +241,21 @@ void __irda_device_close( struct irda_device *self)
  *    
  *
  */
-void irda_device_close( struct irda_device *self)
+void irda_device_close(struct irda_device *self)
 {
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-       /* Stop IrLAP */
-       irlap_close( self->irlap);
+       /* Stop and remove instance of IrLAP */
+       if (self->irlap)
+               irlap_close(self->irlap);
        self->irlap = NULL;
 
-       hashbin_remove( irda_device, (int) self, NULL);
+       hashbin_remove(irda_device, (int) self, NULL);
 
-       __irda_device_close( self);
+       __irda_device_close(self);
 }
 
 /*
@@ -259,20 +264,20 @@ void irda_device_close( struct irda_device *self)
  *    Called when we have detected that another station is transmiting
  *    in contention mode.
  */
-void irda_device_set_media_busy( struct irda_device *self, int status) 
+void irda_device_set_media_busy(struct irda_device *self, int status) 
 {
-       DEBUG( 4, __FUNCTION__ "(%s)\n", status ? "TRUE" : "FALSE");
+       DEBUG(4, __FUNCTION__ "(%s)\n", status ? "TRUE" : "FALSE");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-       if ( status) {
+       if (status) {
                self->media_busy = TRUE;
-               irda_device_start_mbusy_timer( self);
+               irda_device_start_mbusy_timer(self);
                DEBUG( 4, "Media busy!\n");
        } else {
                self->media_busy = FALSE;
-               del_timer( &self->media_busy_timer);
+               del_timer(&self->media_busy_timer);
        }
 }
 
@@ -282,30 +287,26 @@ void irda_device_set_media_busy( struct irda_device *self, int status)
  *    When this function is called, we will have a process context so its
  *    possible for us to sleep, wait or whatever :-)
  */
-static void __irda_device_change_speed( struct irda_device *self, int speed)
+static void __irda_device_change_speed(struct irda_device *self, int speed)
 {
-       DEBUG(4, __FUNCTION__ "(), <%ld>\n", jiffies);
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
        
        /*
         *  Is is possible to change speed yet? Wait until the last byte 
         *  has been transmitted.
         */
-       if ( self->wait_until_sent) {
-               self->wait_until_sent( self);
-               
-               if ( self->change_speed) {
-                       self->change_speed( self, speed);
-                       
+       if (self->wait_until_sent) {
+               self->wait_until_sent(self);
+               if (self->change_speed) {
+                       self->change_speed(self, speed);
+
                        /* Update the QoS value only */
                        self->qos.baud_rate.value = speed;
                }
        } else {
-               DEBUG(0, __FUNCTION__ "(), Warning, wait_until_sent() "
-                     "has not implemented by the device driver!\n");
-               
+               printk(KERN_WARNING "wait_until_sent() "
+                      "has not implemented by the IrDA device driver!\n");
        }
 }
 
@@ -315,15 +316,16 @@ static void __irda_device_change_speed( struct irda_device *self, int speed)
  *    Change the speed of the currently used irda_device
  *
  */
-inline void irda_device_change_speed( struct irda_device *self, int speed)
+inline void irda_device_change_speed(struct irda_device *self, int speed)
 {
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRDA_DEVICE_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IRDA_DEVICE_MAGIC, return;);
 
-       irda_execute_as_process(
-               self, (TODO_CALLBACK) __irda_device_change_speed, speed);
+       irda_execute_as_process(self, 
+                               (TODO_CALLBACK) __irda_device_change_speed, 
+                               speed);
 }
 
 inline int irda_device_is_media_busy( struct irda_device *self)
@@ -353,19 +355,6 @@ inline struct qos_info *irda_device_get_qos( struct irda_device *self)
        return &self->qos;
 }
 
-void irda_device_todo_expired( unsigned long data)
-{
-       struct irda_device *self = ( struct irda_device *) data;
-
-       DEBUG( 4, __FUNCTION__ "()\n");
-       
-       /* Check that we still exist */
-       if ( !self || self->magic != IRDA_DEVICE_MAGIC) {
-               return;
-       }
-       __irda_device_change_speed( self, self->new_speed);
-}
-
 static struct enet_statistics *irda_device_get_stats( struct device *dev)
 {
        struct irda_device *priv = (struct irda_device *) dev->priv;
@@ -379,18 +368,18 @@ static struct enet_statistics *irda_device_get_stats( struct device *dev)
  *    This function should be used by low level device drivers in a similar way
  *    as ether_setup() is used by normal network device drivers
  */
-int irda_device_setup( struct device *dev) 
+int irda_device_setup(struct device *dev) 
 {
        struct irda_device *self;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( dev != NULL, return -1;);
+       ASSERT(dev != NULL, return -1;);
 
        self = (struct irda_device *) dev->priv;
 
-       ASSERT( self != NULL, return -1;);
-       ASSERT( self->magic == IRDA_DEVICE_MAGIC, return -1;);  
+       ASSERT(self != NULL, return -1;);
+       ASSERT(self->magic == IRDA_DEVICE_MAGIC, return -1;);   
 
        dev->get_stats       = irda_device_get_stats;
        dev->rebuild_header  = irda_device_net_rebuild_header;
@@ -401,17 +390,16 @@ int irda_device_setup( struct device *dev)
         dev->addr_len        = 0;
 
         dev->type            = ARPHRD_IRDA;
-        dev->tx_queue_len    = 10;  /* Short queues in IrDA */
+        dev->tx_queue_len    = 8; /* Window size + 1 s-frame */
  
-       memcpy( dev->dev_addr, &self->irlap->saddr, 4);
-       memset( dev->broadcast, 0xff, 4);
+       memset(dev->broadcast, 0xff, 4);
 
        dev->mtu = 2048;
        dev->tbusy = 1;
        
-       dev_init_buffers( dev);
+       dev_init_buffers(dev);
 
-       dev->flags = 0;
+       dev->flags = IFF_NOARP;
        
        return 0;
 }
@@ -460,16 +448,15 @@ static int irda_device_net_change_mtu( struct device *dev, int new_mtu)
  * Function irda_device_transmit_finished (void)
  *
  *    Check if there is still some frames in the transmit queue for this
- *    device
+ *    device. Maybe we should use: q->q.qlen == 0.
  *
  */
 int irda_device_txqueue_empty( struct irda_device *self)
 {
-       ASSERT( self != NULL, return -1;);
-       ASSERT( self->magic == IRDA_DEVICE_MAGIC, return -1;);  
+       ASSERT(self != NULL, return -1;);
+       ASSERT(self->magic == IRDA_DEVICE_MAGIC, return -1;);   
 
-       /* FIXME: check if this is the right way of doing it? */
-       if ( skb_queue_len( &self->netdev.qdisc->q))
+       if (skb_queue_len(&self->netdev.qdisc->q))
                return FALSE;
 
        return TRUE;
@@ -478,12 +465,21 @@ int irda_device_txqueue_empty( struct irda_device *self)
 /*
  * Function irda_get_mtt (skb)
  *
- *    Utility function for getting the 
- *
+ *    Utility function for getting the minimum turnaround time out of 
+ *    the skb, where it has been hidden in the cb field.
  */
-__inline__ int irda_get_mtt( struct sk_buff *skb)
+inline unsigned short irda_get_mtt(struct sk_buff *skb)
 {
-        return ((struct irlap_skb_cb *)(skb->cb))->mtt;
+       unsigned short mtt;
+
+       if (((struct irlap_skb_cb *)(skb->cb))->magic != LAP_MAGIC)
+               mtt = 10000;
+       else
+               mtt = ((struct irlap_skb_cb *)(skb->cb))->mtt;
+
+       ASSERT(mtt <= 10000, return 10000;);
+       
+       return mtt;
 }
 
 /*
@@ -492,21 +488,20 @@ __inline__ int irda_get_mtt( struct sk_buff *skb)
  *    Setup the DMA channel
  *
  */
-void setup_dma( int channel, char *buffer, int count, int mode)
+void setup_dma(int channel, char *buffer, int count, int mode)
 {
        unsigned long flags;
-
-       save_flags(flags);
-       cli();
-
-       disable_dma( channel);
-       clear_dma_ff( channel);
-       set_dma_mode( channel, mode);
-       set_dma_addr( channel, virt_to_bus(buffer));
-       set_dma_count( channel, count);
-       enable_dma( channel);
-
-       restore_flags(flags);
+       
+       flags = claim_dma_lock();
+       
+       disable_dma(channel);
+       clear_dma_ff(channel);
+       set_dma_mode(channel, mode);
+       set_dma_addr(channel, virt_to_bus(buffer));
+       set_dma_count(channel, count);
+       enable_dma(channel);
+
+       release_dma_lock(flags);
 }
 
 #ifdef CONFIG_PROC_FS
@@ -532,6 +527,8 @@ int irda_device_print_flags(struct irda_device *idev, char *buf)
                len += sprintf( buf+len, "PIO ");
        if (idev->flags & IFF_DMA)
                len += sprintf( buf+len, "DMA ");
+       if (idev->flags & IFF_SHM)
+               len += sprintf( buf+len, "SHM ");
        if (idev->flags & IFF_DONGLE)
                len += sprintf( buf+len, "DONGLE ");
 
index 5f626abd27aa559beaf9a52eb79405474f1552a6..d0264377920ed7ee6a78d7b0773e5767a82438ef 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Aug 21 00:02:07 1997
- * Modified at:   Thu Feb 11 01:22:44 1999
+ * Modified at:   Tue Mar 23 19:38:46 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -28,6 +28,7 @@
 #include <linux/skbuff.h>
 #include <linux/string.h>
 #include <linux/init.h>
+#include <linux/irda.h>
 
 #include <asm/byteorder.h>
 
@@ -54,7 +55,8 @@ static const char *ias_charset_types[] = {
        "CS_UNICODE"
 };
 
-hashbin_t *iriap = NULL;
+static hashbin_t *iriap = NULL;
+static __u32 service_handle; 
 
 extern char *lmp_reasons[];
 
@@ -62,6 +64,11 @@ static struct iriap_cb *iriap_open( __u8 slsap, int mode);
 static void __iriap_close( struct iriap_cb *self);
 static void iriap_disconnect_indication(void *instance, void *sap, 
                                        LM_REASON reason, struct sk_buff *skb);
+static void iriap_connect_indication(void *instance, void *sap, 
+                                    struct qos_info *qos, __u32 max_sdu_size,
+                                    struct sk_buff *skb);
+static int iriap_data_indication(void *instance, void *sap, 
+                                struct sk_buff *skb);
 
 /*
  * Function iriap_init (void)
@@ -71,16 +78,15 @@ static void iriap_disconnect_indication(void *instance, void *sap,
  */
 __initfunc(int iriap_init(void))
 {
+       __u16 hints;
        struct ias_object *obj;
 
        DEBUG( 4, __FUNCTION__ "()\n");
        
        /* Allocate master array */
        iriap = hashbin_new( HB_LOCAL);
-       if ( iriap == NULL) {
-               printk( KERN_WARNING "IrIAP: Can't allocate iriap hashbin!\n");
+       if ( iriap == NULL)
                return -ENOMEM;
-       }
 
        objects = hashbin_new( HB_LOCAL);
        if ( objects == NULL) {
@@ -92,8 +98,9 @@ __initfunc(int iriap_init(void))
        /* 
         *  Register some default services for IrLMP 
         */
-       irlmp_register_layer( S_COMPUTER, SERVER | CLIENT, FALSE, NULL);
-       irlmp_register_layer( S_PNP, SERVER, FALSE, NULL);
+       hints  = irlmp_service_to_hint(S_COMPUTER);
+       hints |= irlmp_service_to_hint(S_PNP);
+       service_handle = irlmp_register_service(hints);
 
        /* 
         *  Register the Device object with LM-IAS
@@ -119,11 +126,10 @@ __initfunc(int iriap_init(void))
  */
 void iriap_cleanup(void) 
 {
-       irlmp_unregister_layer( S_COMPUTER, SERVER | CLIENT);
-       irlmp_unregister_layer( S_PNP, SERVER);
+       irlmp_unregister_service(service_handle);
        
-       hashbin_delete( iriap, (FREE_FUNC) __iriap_close);
-       hashbin_delete( objects, (FREE_FUNC) __irias_delete_object);    
+       hashbin_delete(iriap, (FREE_FUNC) __iriap_close);
+       hashbin_delete(objects, (FREE_FUNC) __irias_delete_object);     
 }
 
 /*
@@ -237,8 +243,9 @@ void iriap_close( struct iriap_cb *self)
  *    Got disconnect, so clean up everything assosiated with this connection
  *
  */
-void iriap_disconnect_indication( void *instance, void *sap, LM_REASON reason, 
-                                 struct sk_buff *userdata)
+static void iriap_disconnect_indication( void *instance, void *sap, 
+                                        LM_REASON reason, 
+                                        struct sk_buff *userdata)
 {
        struct iriap_cb *self;
 
@@ -385,7 +392,7 @@ void iriap_getvaluebyclass_request( char *name, char *attr,
        frame = skb->data;
 
        /* Build frame */
-       frame[0] = LST | GET_VALUE_BY_CLASS;
+       frame[0] = IAP_LST | GET_VALUE_BY_CLASS;
        frame[1] = name_len;                       /* Insert length of name */
        memcpy( frame+2, name, name_len);          /* Insert name */
        frame[2+name_len] = attr_len;              /* Insert length of attr */
@@ -404,39 +411,44 @@ void iriap_getvaluebyclass_request( char *name, char *attr,
 void iriap_getvaluebyclass_confirm(struct iriap_cb *self, struct sk_buff *skb) 
 {
        struct ias_value *value;
+       int n;
+       int charset;
+       __u32 value_len;
+       __u32 tmp_cpu32;
+       __u16 tmp_cpu16;
        __u16 obj_id;
-       int   len;
+       __u16 len;
        __u8  type;
-       int   value_len;
        __u8 *fp;
-       int n;
-       int charset;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IAS_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == IAS_MAGIC, return;);
+       ASSERT(skb != NULL, return;);
 
        /* Initialize variables */
        fp = skb->data;
        n = 2;
 
        /* Get length, MSB first */
-       len = ntohs( *(__u16 *)( fp+n)); n += 2;
+       memcpy(&len, fp+n, 2); n += 2;
+       be16_to_cpus(&len); 
 
-       DEBUG( 4, __FUNCTION__ "(), len=%d\n", len);
+       DEBUG(4, __FUNCTION__ "(), len=%d\n", len);
 
        /* Get object ID, MSB first */
-       obj_id = ntohs( *(__u16 *)( fp+n)); n += 2;
+       memcpy(&obj_id, fp+n, 2); n += 2;
+       be16_to_cpus(&obj_id);
 
        type = fp[n++];
        DEBUG( 4, __FUNCTION__ "(), Value type = %d\n", type);
 
        switch( type) {
        case IAS_INTEGER:
-               value = irias_new_integer_value( ntohl(*(__u32 *)(fp+n)));
-               /* 
-                *  Legal values restricted to 0x01-0x6f, page 15 irttp 
-                */
+               memcpy(&tmp_cpu32, fp+n, 4); n += 4;
+               be32_to_cpus(&tmp_cpu32);
+               value = irias_new_integer_value(tmp_cpu32);
+
+               /*  Legal values restricted to 0x01-0x6f, page 15 irttp */
                DEBUG( 4, __FUNCTION__ "(), lsap=%d\n", value->t.integer); 
                break;
        case IAS_STRING:
@@ -469,29 +481,29 @@ void iriap_getvaluebyclass_confirm(struct iriap_cb *self, struct sk_buff *skb)
                fp[n+value_len] = 0x00;
                
                DEBUG(4, "Got string %s\n", fp+n);
-               value = irias_new_string_value( fp+n);
+               value = irias_new_string_value(fp+n);
                break;
        case IAS_OCT_SEQ:
-               value_len = ntohs( *(__u16 *)( fp+n)); n += 2;
+               memcpy(&tmp_cpu16, fp+n, 2);  n += 2;
+               be16_to_cpus(&tmp_cpu16);
+               value_len = tmp_cpu16;
                
                /* FIXME:should be 1024, but.... */
                DEBUG(0, __FUNCTION__ "():octet sequence:len=%d\n", value_len);
                ASSERT(value_len <= 55, return;);      
                
-               value = irias_new_octseq_value( fp+n, value_len);
+               value = irias_new_octseq_value(fp+n, value_len);
                break;
        default:
                value = &missing;
                break;
        }
        
-       if ( self->confirm)
+       if (self->confirm)
                self->confirm(obj_id, value, self->priv);
        
-       /*
-        * Finished, close connection!
-        */
-       iriap_disconnect_request( self);
+       /* Finished, close connection! */
+       iriap_disconnect_request(self);
 }
 
 /*
@@ -504,8 +516,9 @@ void iriap_getvaluebyclass_response(struct iriap_cb *self, __u16 obj_id,
                                    __u8 ret_code, struct ias_value *value)
 {
        struct sk_buff *skb;
-       __u8 *fp;
        int n;
+       __u32 tmp_be32, tmp_be16;
+       __u8 *fp;
 
        DEBUG( 4, __FUNCTION__ "()\n");
 
@@ -533,35 +546,39 @@ void iriap_getvaluebyclass_response(struct iriap_cb *self, __u16 obj_id,
        fp = skb->data;
 
        /* Build frame */
-       fp[n++] = GET_VALUE_BY_CLASS | LST;
+       fp[n++] = GET_VALUE_BY_CLASS | IAP_LST;
        fp[n++] = ret_code;
 
        /* Insert list length (MSB first) */
-       *((__u16 *) (fp+n)) = __constant_htons( 0x0001); n += 2; 
+       tmp_be16 = __constant_htons( 0x0001);
+       memcpy(fp+n, &tmp_be16, 2);  n += 2; 
 
        /* Insert object identifier ( MSB first) */
-       *((__u16 *) (fp+n)) = htons( obj_id); n += 2;
+       tmp_be16 = cpu_to_be16(obj_id);
+       memcpy(fp+n, &tmp_be16, 2); n += 2;
 
-       switch( value->type) {
+       switch(value->type) {
        case IAS_STRING:
-               skb_put( skb, 3 + value->len);
+               skb_put(skb, 3 + value->len);
                fp[n++] = value->type;
                fp[n++] = 0; /* ASCII */
                fp[n++] = (__u8) value->len;
-               memcpy( fp+n, value->t.string, value->len); n+=value->len;
+               memcpy(fp+n, value->t.string, value->len); n+=value->len;
                break;
        case IAS_INTEGER:
-               skb_put( skb, 5);
+               skb_put(skb, 5);
                fp[n++] = value->type;
                
-               *((__u32 *)(fp+n)) = htonl(value->t.integer); n+=4;
+               tmp_be32 = cpu_to_be32(value->t.integer);
+               memcpy(fp+n, &tmp_be32, 4); n += 4;
                break;
        case IAS_OCT_SEQ:
-               skb_put( skb, 3 + value->len);
+               skb_put(skb, 3 + value->len);
                fp[n++] = value->type;
-               *((__u16 *)(fp+n)) = htons(value->len); n+=2;
+
+               tmp_be16 = cpu_to_be16(value->len);
+               memcpy(fp+n, &tmp_be16, 2); n += 2;
                memcpy(fp+n, value->t.oct_seq, value->len); n+=value->len;
-               
                break;
        case IAS_MISSING:
                DEBUG( 3, __FUNCTION__ ": sending IAS_MISSING\n");
@@ -573,7 +590,7 @@ void iriap_getvaluebyclass_response(struct iriap_cb *self, __u16 obj_id,
                DEBUG(0, __FUNCTION__ "(), type not implemented!\n");
                break;
        }
-       iriap_do_r_connect_event( self, IAP_CALL_RESPONSE, skb);
+       iriap_do_r_connect_event(self, IAP_CALL_RESPONSE, skb);
 }
 
 /*
@@ -672,7 +689,7 @@ void iriap_send_ack( struct iriap_cb *self)
        frame = skb->data;
 
        /* Build frame */
-       frame[0] = LST | self->operation;
+       frame[0] = IAP_LST | self->operation;
 }
 
 /*
@@ -681,8 +698,8 @@ void iriap_send_ack( struct iriap_cb *self)
  *    LSAP connection confirmed!
  *
  */
-void iriap_connect_confirm( void *instance, void *sap, struct qos_info *qos, 
-                           int max_sdu_size, struct sk_buff *userdata)
+void iriap_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
+                          __u32 max_sdu_size, struct sk_buff *userdata)
 {
        struct iriap_cb *self;
        
@@ -705,8 +722,9 @@ void iriap_connect_confirm( void *instance, void *sap, struct qos_info *qos,
  *    Remote LM-IAS is requesting connection
  *
  */
-void iriap_connect_indication(void *instance, void *sap, struct qos_info *qos,
-                             int max_sdu_size, struct sk_buff *userdata)
+static void iriap_connect_indication(void *instance, void *sap, 
+                                    struct qos_info *qos, __u32 max_sdu_size,
+                                    struct sk_buff *userdata)
 {
        struct iriap_cb *self;
 
@@ -727,7 +745,8 @@ void iriap_connect_indication(void *instance, void *sap, struct qos_info *qos,
  *    Receives data from connection identified by handle from IrLMP
  *
  */
-void iriap_data_indication( void *instance, void *sap, struct sk_buff *skb) 
+static int iriap_data_indication(void *instance, void *sap, 
+                                struct sk_buff *skb) 
 {
        struct iriap_cb *self;
        __u8  *frame;
@@ -735,50 +754,53 @@ void iriap_data_indication( void *instance, void *sap, struct sk_buff *skb)
        
        DEBUG( 4, __FUNCTION__ "()\n"); 
        
-       self = ( struct iriap_cb *) instance;
+       self = (struct iriap_cb *) instance;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IAS_MAGIC, return;);
+       ASSERT(self != NULL, return 0;);
+       ASSERT(self->magic == IAS_MAGIC, return 0;);
 
-       ASSERT( skb != NULL, return;);
+       ASSERT(skb != NULL, return 0;);
 
        frame = skb->data;
        
-       if ( self->mode == IAS_SERVER) {
+       if (self->mode == IAS_SERVER) {
                /* Call server */
-               DEBUG( 4, __FUNCTION__ "(), Calling server!\n");
+               DEBUG(4, __FUNCTION__ "(), Calling server!\n");
                iriap_do_r_connect_event( self, IAP_RECV_F_LST, skb);
 
-               return;
+               return 0;
        }
        opcode = frame[0];
        if ( ~opcode & 0x80) {
                printk( KERN_ERR "IrIAS multiframe commands or results is "
                        "not implemented yet!\n");
-               return;
+               return 0;
        }
 
-       if ( ~opcode &0x40) {
-               DEBUG( 4, "Got ack frame!\n");
+       if (~opcode & IAP_ACK) {
+               DEBUG(0, __FUNCTION__ "() Got ack frame!\n");
        /*      return; */
        }
 
-       opcode &= 0x7f; /* Mask away LST bit */
+       opcode &= ~IAP_LST; /* Mask away LST bit */
        
-       switch( opcode) {
+       switch(opcode) {
        case GET_INFO_BASE:
                DEBUG( 0, "IrLMP GetInfoBaseDetails not implemented!\n");
                break;
        case GET_VALUE_BY_CLASS:
                DEBUG( 4,"IrLMP GetValueByClass\n");
                
-               if ( frame[1] == 0x01) {
-                       printk( KERN_WARNING "IrIAP No such class!\n");
-               } else if ( frame[1] == 0x02) {
-                       printk( KERN_WARNING 
-                               "IrIAP No such attribute!\n");
-               } else {
-                       iriap_getvaluebyclass_confirm( self, skb);
+               switch(frame[1]) {
+               case IAS_SUCCESS:
+                       iriap_getvaluebyclass_confirm(self, skb);
+                       break;
+               case IAS_CLASS_UNKNOWN:
+                       printk(KERN_WARNING "IrIAP No such class!\n");
+                       break;
+               case IAS_ATTRIB_UNKNOWN:
+                       printk(KERN_WARNING "IrIAP No such attribute!\n");
+                       break;
                }
                iriap_do_call_event( self, IAP_RECV_F_LST, skb);
 
@@ -792,6 +814,7 @@ void iriap_data_indication( void *instance, void *sap, struct sk_buff *skb)
                DEBUG(0, __FUNCTION__ "(), Unknown op-code: %02x\n", opcode);
                break;
        }
+       return 0;
 }
 
 /*
@@ -912,8 +935,8 @@ int irias_proc_read(char *buf, char **start, off_t offset, int len, int unused)
                        }
                        len += sprintf( buf+len, "\n");
                        
-                       attrib = ( struct ias_attrib *) 
-                               hashbin_get_next( obj->attribs);
+                       attrib = (struct ias_attrib *) 
+                               hashbin_get_next(obj->attribs);
                }
                obj = ( struct ias_object *) hashbin_get_next( objects);
        } 
index 8b5a29748273cf59488a719a28ca18d543e63ff4..b2e6a5cbac686f491c6bf945714b75a93a409461 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Oct  1 22:50:04 1998
- * Modified at:   Tue Dec 15 09:19:43 1998
+ * Modified at:   Mon Mar 22 13:22:35 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -23,6 +23,8 @@
  ********************************************************************/
 
 #include <linux/string.h>
+#include <linux/socket.h>
+#include <linux/irda.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
@@ -227,7 +229,6 @@ void irias_add_attrib( struct ias_object *obj, struct ias_attrib *attrib)
  *
  *    Change the value of an objects attribute.
  *
- *    TODO: not tested yet!
  */
 int irias_object_change_attribute( char *obj_name, char *attrib_name, 
                                   struct ias_value *new_value) 
index 78e33c46ca64e67adb06a843d593a2bb16942965..d679d86e35117d8930b6b02adcbb0dc11ca744fb 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb 17 23:29:34 1999
+ * Modified at:   Wed Apr  7 16:56:35 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane, <loz@holmes.demon.co.uk>
 static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap, 
                                                    LM_REASON reason, 
                                                    struct sk_buff *);
-
-static void irlan_client_ctrl_data_indication(void *instance, void *sap, 
-                                             struct sk_buff *skb);
-
+static int irlan_client_ctrl_data_indication(void *instance, void *sap, 
+                                            struct sk_buff *skb);
 static void irlan_client_ctrl_connect_confirm(void *instance, void *sap, 
                                              struct qos_info *qos, 
-                                             int max_sdu_size,
+                                             __u32 max_sdu_size,
                                              struct sk_buff *);
-
 static void irlan_check_response_param(struct irlan_cb *self, char *param, 
                                       char *value, int val_len);
 
@@ -99,6 +96,12 @@ void irlan_client_start_kick_timer(struct irlan_cb *self, int timeout)
                         irlan_client_kick_timer_expired);
 }
 
+/*
+ * Function irlan_client_wakeup (self, saddr, daddr)
+ *
+ *    Wake up client
+ *
+ */
 void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr)
 {
        struct irmanager_event mgr_event;
@@ -108,52 +111,44 @@ void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr)
        ASSERT(self != NULL, return;);
        ASSERT(self->magic == IRLAN_MAGIC, return;);
 
-       if (self->client.state == IRLAN_IDLE) {
-               /* saddr may have changed! */
-               self->saddr = saddr;
-               
-               /* Check if network device is up */
-               if (self->dev.start) {
-                       /* Open TSAPs */
-                       irlan_client_open_ctrl_tsap(self);
-                       irlan_provider_open_ctrl_tsap(self);
-                       irlan_open_data_tsap(self);
-                       
-                       irlan_do_client_event(self, IRLAN_DISCOVERY_INDICATION,
-                                             NULL);
-               } else if (self->notify_irmanager) {
-                       /* 
-                        * Tell irmanager that the device can now be 
-                        * configured but only if the device was not taken
-                        * down by the user
-                        */
-                       mgr_event.event = EVENT_IRLAN_START;
-                       sprintf(mgr_event.devname, "%s", self->ifname);
-                       irmanager_notify(&mgr_event);
-
-                       /* 
-                        * We set this so that we only notify once, since if 
-                        * configuration of the network device fails, the user
-                        * will have to sort it out first anyway. No need to 
-                        * try again.
-                        */
-                       self->notify_irmanager = FALSE;
-               }
-               /* Restart watchdog timer */
-               irlan_start_watchdog_timer(self, IRLAN_TIMEOUT);
+       /* Check if we are already awake */
+       if (self->client.state != IRLAN_IDLE)
+               return;
 
-               /* Start kick timer */
-               irlan_client_start_kick_timer(self, 200);
-       } else {
-               DEBUG(2, __FUNCTION__ "(), state=%s\n", 
-                     irlan_state[ self->client.state]);
-               /*  
-                *  If we get here, it's obvious that the last 
-                *  connection attempt has failed, so its best 
-                *  to go back to idle!
+       /* saddr may have changed! */
+       self->saddr = saddr;
+       
+       /* Check if network device is up */
+       if (self->dev.start) {
+               /* Open TSAPs */
+               irlan_client_open_ctrl_tsap(self);
+               irlan_provider_open_ctrl_tsap(self);
+               irlan_open_data_tsap(self);
+               
+               irlan_do_client_event(self, IRLAN_DISCOVERY_INDICATION, NULL);
+       } else if (self->notify_irmanager) {
+               /* 
+                * Tell irmanager that the device can now be 
+                * configured but only if the device was not taken
+                * down by the user
                 */
-               irlan_do_client_event(self, IRLAN_LMP_DISCONNECT, NULL);
+               mgr_event.event = EVENT_IRLAN_START;
+               sprintf(mgr_event.devname, "%s", self->ifname);
+               irmanager_notify(&mgr_event);
+               
+               /* 
+                * We set this so that we only notify once, since if 
+                * configuration of the network device fails, the user
+                * will have to sort it out first anyway. No need to 
+                * try again.
+                */
+               self->notify_irmanager = FALSE;
        }
+       /* Restart watchdog timer */
+       irlan_start_watchdog_timer(self, IRLAN_TIMEOUT);
+       
+       /* Start kick timer */
+       irlan_client_start_kick_timer(self, 2*HZ);
 }
 
 /*
@@ -162,7 +157,7 @@ void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr)
  *    Remote device with IrLAN server support discovered
  *
  */
-void irlan_client_discovery_indication(DISCOVERY *discovery) 
+void irlan_client_discovery_indication(discovery_t *discovery) 
 {
        struct irlan_cb *self, *entry;
        __u32 saddr, daddr;
@@ -200,7 +195,7 @@ void irlan_client_discovery_indication(DISCOVERY *discovery)
                 * Rehash instance, now we have a client (daddr) to serve.
                 */
                entry = hashbin_remove(irlan, self->daddr, NULL);
-               ASSERT( entry == self, return;);
+               ASSERT(entry == self, return;);
 
                self->daddr = daddr;
                self->saddr = saddr;
@@ -234,8 +229,8 @@ void irlan_client_discovery_indication(DISCOVERY *discovery)
  *    This function gets the data that is received on the control channel
  *
  */
-static void irlan_client_ctrl_data_indication(void *instance, void *sap, 
-                                             struct sk_buff *skb)
+static int irlan_client_ctrl_data_indication(void *instance, void *sap, 
+                                            struct sk_buff *skb)
 {
        struct irlan_cb *self;
        
@@ -243,11 +238,13 @@ static void irlan_client_ctrl_data_indication(void *instance, void *sap,
        
        self = (struct irlan_cb *) instance;
        
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == IRLAN_MAGIC, return;);
-       ASSERT(skb != NULL, return;);
+       ASSERT(self != NULL, return -1;);
+       ASSERT(self->magic == IRLAN_MAGIC, return -1;);
+       ASSERT(skb != NULL, return -1;);
        
        irlan_do_client_event(self, IRLAN_DATA_INDICATION, skb); 
+
+       return 0;
 }
 
 static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap, 
@@ -317,7 +314,7 @@ void irlan_client_open_ctrl_tsap(struct irlan_cb *self)
  */
 static void irlan_client_ctrl_connect_confirm(void *instance, void *sap, 
                                              struct qos_info *qos, 
-                                             int max_sdu_size,
+                                             __u32 max_sdu_size,
                                              struct sk_buff *skb) 
 {
        struct irlan_cb *self;
@@ -448,7 +445,10 @@ void irlan_client_extract_params(struct irlan_cb *self, struct sk_buff *skb)
 static void irlan_check_response_param(struct irlan_cb *self, char *param, 
                                       char *value, int val_len) 
 {
+#ifdef CONFIG_IRLAN_GRATUITOUS_ARP
        struct in_device *in_dev;
+#endif
+       __u16 tmp_cpu; /* Temporary value in host order */
        __u8 *bytes;
        int i;
 
@@ -515,12 +515,16 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param,
                return;
        }
        if (strcmp(param, "CON_ARB") == 0) {
-               self->client.recv_arb_val = le16_to_cpup(value);
+               memcpy(&tmp_cpu, value, 2); /* Align value */
+               le16_to_cpus(&tmp_cpu);     /* Convert to host order */
+               self->client.recv_arb_val = tmp_cpu;
                DEBUG(2, __FUNCTION__ "(), receive arb val=%d\n", 
                      self->client.recv_arb_val);
        }
        if (strcmp(param, "MAX_FRAME") == 0) {
-               self->client.max_frame = le16_to_cpup(value);
+               memcpy(&tmp_cpu, value, 2); /* Align value */
+               le16_to_cpus(&tmp_cpu);     /* Convert to host order */
+               self->client.max_frame = tmp_cpu;
                DEBUG(4, __FUNCTION__ "(), max frame=%d\n", 
                      self->client.max_frame);
        }
index 1ff3b5a5215be3c052360192b36699ffd9f00b4c..607c71c398799e787755454168403728c50a52d7 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Wed Feb 17 23:49:10 1999
+ * Modified at:   Wed Apr  7 17:03:21 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli <dagb@cs.uit.no>, All Rights Reserved.
@@ -55,6 +55,7 @@
  *  Master structure
  */
 hashbin_t *irlan = NULL;
+static __u32 ckey, skey;
 
 /* Module parameters */
 static int eth = 0; /* Use "eth" or "irlan" name for devices */
@@ -143,6 +144,12 @@ void irlan_start_watchdog_timer(struct irlan_cb *self, int timeout)
                         irlan_watchdog_timer_expired);
 }
 
+/*
+ * Function irlan_eth_open (dev)
+ *
+ *    Network device has been opened by user
+ *
+ */
 static int irlan_eth_open(struct device *dev)
 {
        struct irlan_cb *self;
@@ -162,6 +169,9 @@ static int irlan_eth_open(struct device *dev)
 
        self->notify_irmanager = TRUE;
 
+       /* We are now open, so time to do some work */
+       irlan_client_wakeup(self, self->saddr, self->daddr);
+
        MOD_INC_USE_COUNT;
        
        return 0;
@@ -196,7 +206,7 @@ static int irlan_eth_close(struct device *dev)
        
        irlan_start_watchdog_timer(self, IRLAN_TIMEOUT);
 
-       /* Device closed by user */
+       /* Device closed by user! */
        if (self->notify_irmanager)
                self->notify_irmanager = FALSE;
        else
@@ -233,7 +243,7 @@ int irlan_eth_init(struct device *dev)
        
        dev->tx_queue_len = TTP_MAX_QUEUE;
 
-#ifdef 0
+#if 0
        /*  
         *  OK, since we are emulating an IrLAN sever we will have to give
         *  ourself an ethernet address!
@@ -274,6 +284,7 @@ int irlan_eth_init(struct device *dev)
 __initfunc(int irlan_init(void))
 {
        struct irlan_cb *new;
+       __u16 hints;
 
        DEBUG(4, __FUNCTION__"()\n");
 
@@ -289,12 +300,14 @@ __initfunc(int irlan_init(void))
 
        DEBUG(4, __FUNCTION__ "()\n");
        
-       /* Register with IrLMP as a service user */
-       irlmp_register_layer(S_LAN, CLIENT, TRUE, 
-                            irlan_client_discovery_indication);
+       hints = irlmp_service_to_hint(S_LAN);
+
+       /* Register with IrLMP as a client */
+       ckey = irlmp_register_client(hints, irlan_client_discovery_indication,
+                                    NULL);
        
        /* Register with IrLMP as a service */
-       irlmp_register_layer(S_LAN, SERVER, FALSE, NULL);
+       skey = irlmp_register_service(hints);
 
        /* Start the first IrLAN instance */
        new = irlan_open(DEV_ADDR_ANY, DEV_ADDR_ANY, FALSE);
@@ -309,9 +322,9 @@ void irlan_cleanup(void)
 {
        DEBUG(4, __FUNCTION__ "()\n");
 
-       irlmp_unregister_layer(S_LAN, SERVER);
+       irlmp_unregister_client(ckey);
 
-       irlmp_unregister_layer(S_LAN, CLIENT);
+       irlmp_unregister_service(skey);
 
 #ifdef CONFIG_PROC_FS
        proc_unregister(&proc_irda, proc_irlan.low_ino);
@@ -344,8 +357,7 @@ int irlan_register_netdev(struct irlan_cb *self)
        self->dev.name = self->ifname;
        
        if (register_netdev(&self->dev) != 0) {
-               DEBUG(2, __FUNCTION__ 
-                     "(), register_netdev() failed!\n");
+               DEBUG(2, __FUNCTION__ "(), register_netdev() failed!\n");
                return -1;
        }
        self->netdev_registered = TRUE;
@@ -472,7 +484,7 @@ void irlan_close(struct irlan_cb *self)
 }
 
 void irlan_connect_indication(void *instance, void *sap, struct qos_info *qos,
-                             int max_sdu_size, struct sk_buff *skb)
+                             __u32 max_sdu_size, struct sk_buff *skb)
 {
        struct irlan_cb *self;
        struct tsap_cb *tsap;
@@ -505,7 +517,7 @@ void irlan_connect_indication(void *instance, void *sap, struct qos_info *qos,
 }
 
 void irlan_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
-                          int max_sdu_size, struct sk_buff *skb) 
+                          __u32 max_sdu_size, struct sk_buff *skb) 
 {
        struct irlan_cb *self;
 
@@ -1043,6 +1055,7 @@ static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
 {
        __u8 *frame;
        __u8 param_len;
+       __u16 tmp_le; /* Temporary value in little endian format */
        int n=0;
        
        if (skb == NULL) {
@@ -1085,7 +1098,8 @@ static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
        memcpy(frame+n, param, param_len); n += param_len;
        
        /* Insert value length (2 byte little endian format, LSB first) */
-       *((__u16 *) (frame+n)) = cpu_to_le16(value_len); n += 2;
+       tmp_le = cpu_to_le16(value_len);
+       memcpy(frame+n, &tmp_le, 2); n += 2; /* To avoid alignment problems */
 
        /* Insert value */
        switch (type) {
@@ -1093,7 +1107,8 @@ static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
                frame[n++] = value_byte;
                break;
        case IRLAN_SHORT:
-               *((__u16 *) (frame+n)) = cpu_to_le16(value_short); n += 2;
+               tmp_le = cpu_to_le16(value_short);
+               memcpy(frame+n, &tmp_le, 2); n += 2;
                break;
        case IRLAN_ARRAY:
                memcpy(frame+n, value_array, value_len); n+=value_len;
@@ -1137,7 +1152,8 @@ int irlan_get_param(__u8 *buf, char *name, char *value, __u16 *len)
         *  Get length of parameter value (2 bytes in little endian 
         *  format) 
         */
-       val_len = le16_to_cpup(buf+n); n+=2;
+       memcpy(&val_len, buf+n, 2); /* To avoid alignment problems */
+       le16_to_cpus(&val_len); n+=2;
        
        if (val_len > 1016) {
                DEBUG(2, __FUNCTION__ "(), parameter length to long\n");
@@ -1277,9 +1293,7 @@ MODULE_PARM(timeout, "i");
  */
 int init_module(void) 
 {
-       irlan_init();
-
-       return 0;
+       return irlan_init();
 }
 
 /*
index d09df36524f9f009022b953ac9108e3a8ec6af3c..19aea4d1051841d2efe7b10cb814a31f2f36cf36 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Oct 15 08:37:58 1998
- * Modified at:   Wed Feb  3 19:58:28 1999
+ * Modified at:   Mon Mar 22 17:41:59 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
@@ -31,6 +31,7 @@
 #include <net/arp.h>
 
 #include <net/irda/irda.h>
+#include <net/irda/irmod.h>
 #include <net/irda/irlan_common.h>
 #include <net/irda/irlan_eth.h>
 
@@ -123,20 +124,20 @@ int irlan_eth_xmit(struct sk_buff *skb, struct device *dev)
  *    This function gets the data that is received on the data channel
  *
  */
-void irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
+int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
 {
        struct irlan_cb *self;
 
        self = (struct irlan_cb *) instance;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == IRLAN_MAGIC, return;);
+       ASSERT(self != NULL, return 0;);
+       ASSERT(self->magic == IRLAN_MAGIC, return 0;);
 
        if (skb == NULL) {
                ++self->stats.rx_dropped; 
-               return;
+               return 0;
        }
-       ASSERT(skb->len > 1, return;);
+       ASSERT(skb->len > 1, return 0;);
                
        /* 
         * Adopt this frame! Important to set all these fields since they 
@@ -151,7 +152,7 @@ void irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
        self->stats.rx_packets++;
        self->stats.rx_bytes += skb->len; 
 
-/*     net_bh(); */
+       return 0;
 }
 
 /*
index 5419b321c31ab71b86419470acdf1033a1f07c87..c4c1079dde7b327e48863ad72159faec4c9d9bb6 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Fri Jan 29 11:16:38 1999
- * Modified at:   Sun Feb  7 23:48:07 1999
+ * Modified at:   Thu Feb 25 15:10:54 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
@@ -138,8 +138,8 @@ void handle_filter_request(struct irlan_cb *self, struct sk_buff *skb)
  *    Check parameters in request from peer device
  *
  */
-static void irlan_check_command_param(struct irlan_cb *self, char *param, 
-                                     char *value)
+void irlan_check_command_param(struct irlan_cb *self, char *param, 
+                              char *value)
 {
        __u8 *bytes;
 
index eb8f035c921d54bd71b612eac86d149173a0c78a..e60a70439b3a88d7938077767685275a25f75931 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:37 1997
- * Modified at:   Thu Feb  4 16:08:33 1999
+ * Modified at:   Tue Apr  6 19:08:20 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
@@ -56,8 +56,8 @@
  *    This function gets the data that is received on the control channel
  *
  */
-void irlan_provider_data_indication(void *instance, void *sap, 
-                                   struct sk_buff *skb) 
+int irlan_provider_data_indication(void *instance, void *sap, 
+                                  struct sk_buff *skb) 
 {
        struct irlan_cb *self;
        __u8 code;
@@ -66,10 +66,10 @@ void irlan_provider_data_indication(void *instance, void *sap,
        
        self = (struct irlan_cb *) instance;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == IRLAN_MAGIC, return;);
+       ASSERT(self != NULL, return -1;);
+       ASSERT(self->magic == IRLAN_MAGIC, return -1;);
 
-       ASSERT(skb != NULL, return;);
+       ASSERT(skb != NULL, return -1;);
 
        code = skb->data[0];
        switch(code) {
@@ -102,6 +102,7 @@ void irlan_provider_data_indication(void *instance, void *sap,
                DEBUG(2, __FUNCTION__ "(), Unknown command!\n");
                break;
        }
+       return 0;
 }
 
 /*
@@ -111,8 +112,8 @@ void irlan_provider_data_indication(void *instance, void *sap,
  *
  */
 void irlan_provider_connect_indication(void *instance, void *sap, 
-                                      struct qos_info *qos, int max_sdu_size,
-                                      struct sk_buff *skb)
+                                      struct qos_info *qos,
+                                      __u32 max_sdu_size, struct sk_buff *skb)
 {
        struct irlan_cb *self, *entry, *new;
        struct tsap_cb *tsap;
@@ -248,7 +249,6 @@ int irlan_provider_extract_params(struct irlan_cb *self, int cmd,
        __u8 *frame;
        __u8 *ptr;
        int count;
-       __u8 name_len;
        __u16 val_len;
        int i;
        char *name;
index c14191276cd9ebf598aa970aeec710426f33d542..ec0610b556350f995e8e721b754b47f4c93d5727 100644 (file)
@@ -3,10 +3,10 @@
  * Filename:      irlap.c
  * Version:       0.9
  * Description:   An IrDA LAP driver for Linux
- * Status:        Experimental.
+ * Status:        Stable.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Sat Feb 20 01:39:58 1999
+ * Modified at:   Tue Apr  6 21:07:08 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -30,6 +30,7 @@
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
+#include <linux/random.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irda_device.h>
@@ -127,11 +128,17 @@ struct irlap_cb *irlap_open( struct irda_device *irdev)
        skb_queue_head_init( &self->tx_list);
        skb_queue_head_init( &self->wx_list);
 
-       /* My unique IrLAP device address! :-) */
-       self->saddr = jiffies;
+       /* My unique IrLAP device address! */
+       get_random_bytes(&self->saddr, sizeof(self->saddr));
 
-       /*  Generate random connection address for this session */
-       self->caddr = jiffies & 0xfe;
+       /* 
+        * Generate random connection address for this session, which must
+        * be 7 bits wide and different from 0x00 and 0xfe 
+        */
+       while ((self->caddr == 0x00) || (self->caddr == 0xfe)) {
+               get_random_bytes(&self->caddr, sizeof(self->caddr));
+               self->caddr &= 0xfe;
+       }
 
        init_timer( &self->slot_timer);
        init_timer( &self->query_timer);
@@ -147,7 +154,7 @@ struct irlap_cb *irlap_open( struct irda_device *irdev)
 
        hashbin_insert( irlap, (QUEUE *) self, self->saddr, NULL);
 
-       irlmp_register_irlap( self, self->saddr, &self->notify);
+       irlmp_register_link( self, self->saddr, &self->notify);
        
        return self;
 }
@@ -181,9 +188,9 @@ static void __irlap_close( struct irlap_cb *self)
 }
 
 /*
- * Function irlap_close ()
+ * Function irlap_close (self)
  *
- *    
+ *    Remove IrLAP instance
  *
  */
 void irlap_close( struct irlap_cb *self) 
@@ -197,7 +204,7 @@ void irlap_close( struct irlap_cb *self)
 
        irlap_disconnect_indication( self, LAP_DISC_INDICATION);
 
-       irlmp_unregister_irlap( self->saddr);
+       irlmp_unregister_link(self->saddr);
        self->notify.instance = NULL;
 
        /* Be sure that we manage to remove ourself from the hash */
@@ -210,7 +217,7 @@ void irlap_close( struct irlap_cb *self)
 }
 
 /*
- * Function irlap_connect_indication ()
+ * Function irlap_connect_indication (self, skb)
  *
  *    Another device is attempting to make a connection
  *
@@ -229,31 +236,32 @@ void irlap_connect_indication(struct irlap_cb *self, struct sk_buff *skb)
 }
 
 /*
- * Function irlap_connect_response (void)
+ * Function irlap_connect_response (self, skb)
  *
  *    Service user has accepted incomming connection
  *
  */
-void irlap_connect_response( struct irlap_cb *self, struct sk_buff *skb) 
+void irlap_connect_response(struct irlap_cb *self, struct sk_buff *skb) 
 {
        DEBUG( 4, __FUNCTION__ "()\n");
        
-       irlap_do_event( self, CONNECT_RESPONSE, skb, NULL);
+       irlap_do_event(self, CONNECT_RESPONSE, skb, NULL);
 }
 
 /*
- * Function irlap_connect_request (daddr, qos, sniff)
+ * Function irlap_connect_request (self, daddr, qos_user, sniff)
  *
  *    Request connection with another device, sniffing is not implemented 
  *    yet.
+ *
  */
-void irlap_connect_request( struct irlap_cb *self, __u32 daddr, 
-                           struct qos_info *qos_user, int sniff) 
+void irlap_connect_request(struct irlap_cb *self, __u32 daddr, 
+                          struct qos_info *qos_user, int sniff) 
 {
-       DEBUG( 4, __FUNCTION__ "()\n"); 
+       DEBUG(3, __FUNCTION__ "(), daddr=0x%08x\n", daddr);
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LAP_MAGIC, return;);
 
        self->daddr = daddr;
        
@@ -261,32 +269,33 @@ void irlap_connect_request( struct irlap_cb *self, __u32 daddr,
         *  If the service user specifies QoS values for this connection, 
         *  then use them
         */
-       irlap_init_qos_capabilities( self, qos_user);
+       irlap_init_qos_capabilities(self, qos_user);
        
-       if ( self->state == LAP_NDM)
-               irlap_do_event( self, CONNECT_REQUEST, NULL, NULL);
+       if ((self->state == LAP_NDM) && 
+           !irda_device_is_media_busy(self->irdev))
+               irlap_do_event(self, CONNECT_REQUEST, NULL, NULL);
        else
                self->connect_pending = TRUE;
 }
 
 /*
- * Function irlap_connect_confirm (void)
+ * Function irlap_connect_confirm (self, skb)
  *
- *    Connection request is accepted
+ *    Connection request has been accepted
  *
  */
-void irlap_connect_confirm( struct irlap_cb *self, struct sk_buff *skb)
+void irlap_connect_confirm(struct irlap_cb *self, struct sk_buff *skb)
 {
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LAP_MAGIC, return;);
 
-       irlmp_link_connect_confirm( self->notify.instance, &self->qos_tx, skb);
+       irlmp_link_connect_confirm(self->notify.instance, &self->qos_tx, skb);
 }
 
 /*
- * Function irlap_data_indication (skb)
+ * Function irlap_data_indication (self, skb)
  *
  *    Received data frames from IR-port, so we just pass them up to 
  *    IrLMP for further processing
@@ -451,7 +460,6 @@ void irlap_disconnect_indication( struct irlap_cb *self, LAP_REASON reason)
 #ifdef CONFIG_IRDA_COMPRESSION
        irda_free_compression( self);
 #endif
-
        /* Flush queues */
        irlap_flush_all_queues( self);
        
@@ -479,7 +487,7 @@ void irlap_disconnect_indication( struct irlap_cb *self, LAP_REASON reason)
  *    Start one single discovery operation.
  *
  */
-void irlap_discovery_request( struct irlap_cb *self, DISCOVERY *discovery) 
+void irlap_discovery_request(struct irlap_cb *self, discovery_t *discovery) 
 {
        struct irlap_info info;
        
@@ -568,7 +576,7 @@ void irlap_discovery_confirm( struct irlap_cb *self, hashbin_t *discovery_log)
  *    Somebody is trying to discover us!
  *
  */
-void irlap_discovery_indication( struct irlap_cb *self, DISCOVERY *discovery) 
+void irlap_discovery_indication(struct irlap_cb *self, discovery_t *discovery) 
 {
        DEBUG( 4, __FUNCTION__ "()\n");
 
@@ -578,7 +586,7 @@ void irlap_discovery_indication( struct irlap_cb *self, DISCOVERY *discovery)
 
        ASSERT( self->notify.instance != NULL, return;);
        
-       irlmp_discovery_indication( self->notify.instance, discovery);
+       irlmp_link_discovery_indication(self->notify.instance, discovery);
 }
 
 /*
@@ -587,7 +595,7 @@ void irlap_discovery_indication( struct irlap_cb *self, DISCOVERY *discovery)
  *    
  *
  */
-void irlap_status_indication( int quality_of_link) 
+void irlap_status_indication(int quality_of_link) 
 {
        switch( quality_of_link) {
        case STATUS_NO_ACTIVITY:
@@ -599,7 +607,7 @@ void irlap_status_indication( int quality_of_link)
        default:
                break;
        }
-       irlmp_status_indication( quality_of_link, NO_CHANGE);
+       irlmp_status_indication(quality_of_link, LOCK_NO_CHANGE);
 }
 
 /*
@@ -629,7 +637,7 @@ void irlap_reset_indication( struct irlap_cb *self)
  */
 void irlap_reset_confirm(void)
 {
-       DEBUG( 1, __FUNCTION__ "()\n");
+       DEBUG( 1, __FUNCTION__ "()\n");
 }
 
 /*
@@ -795,7 +803,7 @@ void irlap_initiate_connection_state( struct irlap_cb *self)
  *    frame in order to delay for the specified amount of time. This is
  *    done to avoid using timers, and the forbidden udelay!
  */
-void irlap_wait_min_turn_around( struct irlap_cb *self, struct qos_info *qos) 
+void irlap_wait_min_turn_around(struct irlap_cb *self, struct qos_info *qos) 
 {
        int usecs;
        int speed;
index 6a13b590420661eb1710f9ef2ebc1c45850a3ce0..99dd1783062fa1ba084de27a6e150295e7f07916 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Aug 16 00:59:29 1997
- * Modified at:   Thu Feb 11 00:38:58 1999
+ * Modified at:   Fri Mar 26 14:24:09 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>,
@@ -84,6 +84,7 @@ static const char *irlap_event[] = {
        "RECV_DISCOVERY_XID_RSP",
        "RECV_SNRM_CMD",
        "RECV_TEST_CMD",
+       "RECV_TEST_RSP",
        "RECV_UA_RSP",
        "RECV_DM_RSP",
        "RECV_I_CMD",
@@ -206,13 +207,13 @@ void irlap_do_event( struct irlap_cb *self, IRLAP_EVENT event,
 {
        int ret;
        
-       if ( !self || self->magic != LAP_MAGIC)
+       if (!self || self->magic != LAP_MAGIC)
                return;
        
-       DEBUG( 4, __FUNCTION__ "(), event = %s, state = %s\n", 
-              irlap_event[ event], irlap_state[ self->state]); 
+       DEBUG(4, __FUNCTION__ "(), event = %s, state = %s\n", 
+             irlap_event[ event], irlap_state[ self->state]); 
        
-       ret = (*state[ self->state]) ( self, event, skb, info);
+       ret = (*state[ self->state]) (self, event, skb, info);
        
        /* 
         *  Check if there are any pending events that needs to be executed
@@ -243,7 +244,9 @@ void irlap_do_event( struct irlap_cb *self, IRLAP_EVENT event,
                break;
        case LAP_NDM:
                /* Check if we should try to connect */
-               if (self->connect_pending) {
+               if ((self->connect_pending) && 
+                   !irda_device_is_media_busy(self->irdev)) 
+               {
                        self->connect_pending = FALSE;
                        
                        ret = (*state[self->state])(self, CONNECT_REQUEST, 
@@ -292,7 +295,7 @@ void irlap_next_state( struct irlap_cb *self, IRLAP_STATE state)
 static int irlap_state_ndm( struct irlap_cb *self, IRLAP_EVENT event, 
                            struct sk_buff *skb,  struct irlap_info *info) 
 {
-       DISCOVERY *discovery_rsp;
+       discovery_t *discovery_rsp;
        int ret = 0;
        
        DEBUG( 4, __FUNCTION__ "()\n");
@@ -304,7 +307,7 @@ static int irlap_state_ndm( struct irlap_cb *self, IRLAP_EVENT event,
        case CONNECT_REQUEST:
                ASSERT( self->irdev != NULL, return -1;);
 
-               if ( irda_device_is_media_busy( self->irdev)) {
+               if (irda_device_is_media_busy(self->irdev)) {
                        DEBUG( 0, __FUNCTION__
                              "(), CONNECT_REQUEST: media busy!\n");
                        
@@ -354,7 +357,7 @@ static int irlap_state_ndm( struct irlap_cb *self, IRLAP_EVENT event,
                self->s++;
 
                irlap_start_slot_timer( self, self->slot_timeout);
-               irlap_next_state( self, LAP_QUERY);
+               irlap_next_state(self, LAP_QUERY);
                break;
 
        case RECV_DISCOVERY_XID_CMD:
@@ -362,20 +365,20 @@ static int irlap_state_ndm( struct irlap_cb *self, IRLAP_EVENT event,
 
                /* Assert that this is not the final slot */
                if ( info->s <= info->S) {
-                       self->daddr = info->daddr; 
-                       self->slot = irlap_generate_rand_time_slot( info->S,
-                                                                   info->s);
+                       /* self->daddr = info->daddr;  */
+                       self->slot = irlap_generate_rand_time_slot(info->S,
+                                                                  info->s);
                        DEBUG( 4, "XID_CMD: S=%d, s=%d, slot %d\n", info->S, 
                               info->s, self->slot);
 
                        if ( self->slot == info->s) {
                                discovery_rsp = irlmp_get_discovery_response();
-                               
-                               DEBUG( 4, "Sending XID rsp 1\n");
-                               irlap_send_discovery_xid_frame( self, info->S, 
-                                                               self->slot, 
-                                                               FALSE,
-                                                               discovery_rsp);
+                               discovery_rsp->daddr = info->daddr;
+
+                               irlap_send_discovery_xid_frame(self, info->S, 
+                                                              self->slot, 
+                                                              FALSE,
+                                                              discovery_rsp);
                                self->frame_sent = TRUE;
                        } else
                                self->frame_sent = FALSE;
@@ -384,11 +387,21 @@ static int irlap_state_ndm( struct irlap_cb *self, IRLAP_EVENT event,
                        irlap_next_state( self, LAP_REPLY);
                }
 
-               dev_kfree_skb( skb);
+               dev_kfree_skb(skb);
+               break;
+
+       case RECV_TEST_CMD:
+               skb_pull(skb, sizeof(struct test_frame));
+               irlap_send_test_frame(self, info->daddr, skb);
+               dev_kfree_skb(skb);
+               break;
+       case RECV_TEST_RSP:
+               DEBUG(0, __FUNCTION__ "() not implemented!\n");
+               dev_kfree_skb(skb);
                break;
-               
        default:
-               /*      DEBUG( 0, "irlap_state_ndm: Unknown event"); */
+               DEBUG(2, __FUNCTION__ "(), Unknown event %s", 
+                     irlap_event[event]);
                ret = -1;
                break;
        }       
@@ -414,14 +427,14 @@ static int irlap_state_query( struct irlap_cb *self, IRLAP_EVENT event,
                ASSERT( info != NULL, return -1;);
                ASSERT( info->discovery != NULL, return -1;);
 
-               DEBUG( 4, __FUNCTION__ "(), daddr=%08x\n", 
-                      info->discovery->daddr);
+               DEBUG(4, __FUNCTION__ "(), daddr=%08x\n", 
+                     info->discovery->daddr);
 
                hashbin_insert( self->discovery_log, 
                                (QUEUE *) info->discovery,
                                info->discovery->daddr, NULL);
 
-               dev_kfree_skb( skb);
+               dev_kfree_skb(skb);
 
                /* Keep state */
                irlap_next_state( self, LAP_QUERY); 
@@ -453,8 +466,8 @@ static int irlap_state_query( struct irlap_cb *self, IRLAP_EVENT event,
                }
                break;
        default:
-               DEBUG( 4, __FUNCTION__ "(), Unknown event %d, %s\n", event, 
-                      irlap_event[event]);
+               DEBUG(2, __FUNCTION__ "(), Unknown event %d, %s\n", event, 
+                     irlap_event[event]);
 
                if ( skb != NULL) {
                        dev_kfree_skb( skb);
@@ -475,7 +488,7 @@ static int irlap_state_query( struct irlap_cb *self, IRLAP_EVENT event,
 static int irlap_state_reply( struct irlap_cb *self, IRLAP_EVENT event, 
                              struct sk_buff *skb, struct irlap_info *info) 
 {
-       DISCOVERY *discovery_rsp;
+       discovery_t *discovery_rsp;
        int ret=0;
 
        DEBUG( 4, __FUNCTION__ "()\n");
@@ -503,19 +516,18 @@ static int irlap_state_reply( struct irlap_cb *self, IRLAP_EVENT event,
                        irlap_next_state( self, LAP_NDM);
 
                        irlap_discovery_indication( self, info->discovery); 
-               } else if (( info->s >= self->slot) && 
-                          ( !self->frame_sent)) {
-                       DEBUG( 4, "Sending XID rsp 2, s=%d\n", info->s); 
+               } else if ((info->s >= self->slot) && (!self->frame_sent)) {
                        discovery_rsp = irlmp_get_discovery_response();
+                       discovery_rsp->daddr = info->daddr;
 
-                       irlap_send_discovery_xid_frame( self, info->S, 
-                                                       self->slot, FALSE,
-                                                       discovery_rsp);
+                       irlap_send_discovery_xid_frame(self, info->S,
+                                                      self->slot, FALSE,
+                                                      discovery_rsp);
 
                        self->frame_sent = TRUE;
-                       irlap_next_state( self, LAP_REPLY);
+                       irlap_next_state(self, LAP_REPLY);
                }
-               dev_kfree_skb( skb);
+               dev_kfree_skb(skb);
                break;
        default:
                DEBUG(1, __FUNCTION__ "(), Unknown event %d, %s\n", event,
@@ -1823,7 +1835,11 @@ static int irlap_state_nrm_s( struct irlap_cb *self, IRLAP_EVENT event,
                irlap_next_state( self, LAP_NRM_S);
 #endif
                break;
-
+       case RECV_TEST_CMD:
+               skb_pull(skb, sizeof(struct test_frame));
+               irlap_send_test_frame(self, info->daddr, skb);
+               dev_kfree_skb(skb);
+               break;
        default:
                DEBUG(1, __FUNCTION__ "(), Unknown event %d, (%s)\n", 
                      event, irlap_event[event]);
index d77d765dc89afc05717a29568a3eb1dd6f40089c..a25dc9940ffd6d34ac0735b463fceacb00332902 100644 (file)
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlap_frame.c
- * Version:       0.8
+ * Version:       0.9
  * Description:   Build and transmit IrLAP frames
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 10:27:26 1997
- * Modified at:   Sat Feb 20 01:40:14 1999
+ * Modified at:   Tue Apr  6 16:35:21 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, All Rights Resrved.
 
 #include <linux/config.h>
 #include <linux/skbuff.h>
-#include <net/sock.h>
-
 #include <linux/if.h>
 #include <linux/if_ether.h>
 #include <linux/netdevice.h>
+#include <linux/irda.h>
 #include <net/pkt_sched.h>
+#include <net/sock.h>
+#include <asm/byteorder.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irda_device.h>
@@ -39,8 +42,6 @@
 #include <net/irda/irlap_frame.h>
 #include <net/irda/qos.h>
 
-extern __u8 *irlmp_hint_to_service( __u8 *hint);
-
 /*
  * Function irlap_insert_mtt (self, skb)
  *
@@ -57,6 +58,7 @@ void irlap_insert_mtt( struct irlap_cb *self, struct sk_buff *skb)
 
        cb = (struct irlap_skb_cb *) skb->cb;
        
+       cb->magic = LAP_MAGIC;
        cb->mtt = self->mtt_required;
        
        /* Reset */
@@ -105,16 +107,11 @@ void irlap_queue_xmit(struct irlap_cb *self, struct sk_buff *skb)
 void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos) 
 {
        struct sk_buff *skb;
-       __u8 *frame;
+       struct snrm_frame *frame;
        int len;
-       int n;
-
-       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
-
-       n = 0;
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LAP_MAGIC, return;);
 
        /* Allocate frame */
        skb = dev_alloc_skb(64);
@@ -122,29 +119,28 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
                return;
 
        skb_put(skb, 2); 
-       frame = skb->data;
+       frame = (struct snrm_frame *) skb->data;
 
-       /* Insert address field */
-       frame[n] = CMD_FRAME;
-       frame[n++] |= (qos) ? CBROADCAST : self->caddr;
+       /* Insert connection address field */
+       if (qos)
+               frame->caddr = CMD_FRAME | CBROADCAST;
+       else
+               frame->caddr = CMD_FRAME | self->caddr;
 
        /* Insert control field */
-       frame[n++] = SNRM_CMD | PF_BIT;
+       frame->control = SNRM_CMD | PF_BIT;
        
        /*
         *  If we are establishing a connection then insert QoS paramerters 
         */
        if (qos) {
                skb_put(skb, 9); /* 21 left */
-               *((__u32 *)(frame+n)) = cpu_to_le32(self->saddr); n += 4;
-               *((__u32 *)(frame+n)) = cpu_to_le32(self->daddr); n += 4;
-
-/*             memcpy(frame+n, &self->saddr, 4); n += 4; */
-/*             memcpy(frame+n, &self->daddr, 4); n += 4; */
+               frame->saddr = cpu_to_le32(self->saddr);
+               frame->daddr = cpu_to_le32(self->daddr);
 
-               frame[n++] = self->caddr;
+               frame->ncaddr = self->caddr;
                                
-               len = irda_insert_qos_negotiation_params(qos, frame+n);
+               len = irda_insert_qos_negotiation_params(qos, frame->params);
                /* Should not be dangerous to do this afterwards */
                skb_put(skb, len);
        }
@@ -157,26 +153,32 @@ void irlap_send_snrm_frame(struct irlap_cb *self, struct qos_info *qos)
  *    Received SNRM (Set Normal Response Mode) command frame
  *
  */
-static void irlap_recv_snrm_cmd( struct irlap_cb *self, struct sk_buff *skb, 
-                                struct irlap_info *info) 
+static void irlap_recv_snrm_cmd(struct irlap_cb *self, struct sk_buff *skb, 
+                               struct irlap_info *info) 
 {
        struct snrm_frame *frame;
 
-       DEBUG( 4, __FUNCTION__ "() <%ld>\n", jiffies);
+       DEBUG(3, __FUNCTION__ "()\n");
 
-       ASSERT( skb != NULL, return;);
-       ASSERT( info != NULL, return;);
+       ASSERT(skb != NULL, return;);
+       ASSERT(info != NULL, return;);
 
-       frame = ( struct snrm_frame *) skb->data;
+       frame = (struct snrm_frame *) skb->data;
 
        /* Copy peer device address */
-       /* memcpy( &info->daddr, &frame->saddr, 4); */
        info->daddr = le32_to_cpu(frame->saddr);
 
        /* Copy connection address */
        info->caddr = frame->ncaddr;
 
-       irlap_do_event( self, RECV_SNRM_CMD, skb, info);
+       /* Check if connection address has got a valid value */
+       if ((info->caddr == 0x00) || (info->caddr == 0xfe)) {
+               DEBUG(3, __FUNCTION__ "(), invalid connection address!\n");
+               dev_kfree_skb(skb);
+               return;
+       }
+
+       irlap_do_event(self, RECV_SNRM_CMD, skb, info);
 }
 
 /*
@@ -188,8 +190,7 @@ static void irlap_recv_snrm_cmd( struct irlap_cb *self, struct sk_buff *skb,
 void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos)
 {
        struct sk_buff *skb;
-       __u8 *frame;
-       int n;
+       struct ua_frame *frame;
        int len;
        
        DEBUG(2, __FUNCTION__ "() <%ld>\n", jiffies);
@@ -198,29 +199,25 @@ void irlap_send_ua_response_frame(struct irlap_cb *self, struct qos_info *qos)
        ASSERT(self->magic == LAP_MAGIC, return;);
 
        skb = NULL;
-       n = 0;
 
        /* Allocate frame */
-       skb =  dev_alloc_skb(64);
+       skb = dev_alloc_skb(64);
        if (!skb)
                return;
 
        skb_put( skb, 10);
-       frame = skb->data;
+       frame = (struct ua_frame *) skb->data;
        
        /* Build UA response */
-       frame[n++] = self->caddr;
-       frame[n++] = UA_RSP | PF_BIT;
+       frame->caddr = self->caddr;
+       frame->control = UA_RSP | PF_BIT;
 
-       *((__u32 *)(frame+n)) = cpu_to_le32(self->saddr); n += 4;
-       *((__u32 *)(frame+n)) = cpu_to_le32(self->daddr); n += 4;
+       frame->saddr = cpu_to_le32(self->saddr);
+       frame->daddr = cpu_to_le32(self->daddr);
 
-/*     memcpy( frame+n, &self->saddr, 4); n += 4; */
-/*     memcpy( frame+n, &self->daddr, 4); n += 4; */
-       
        /* Should we send QoS negotiation parameters? */
        if (qos) {
-               len = irda_insert_qos_negotiation_params(qos, frame+n);
+               len = irda_insert_qos_negotiation_params(qos, frame->params);
                skb_put(skb, len);
        }
 
@@ -239,8 +236,8 @@ void irlap_send_dm_frame( struct irlap_cb *self)
        struct sk_buff *skb = NULL;
        __u8 *frame;
        
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LAP_MAGIC, return;);
 
        skb = dev_alloc_skb(32);
        if (!skb)
@@ -249,7 +246,7 @@ void irlap_send_dm_frame( struct irlap_cb *self)
        skb_put( skb, 2);
        frame = skb->data;
        
-       if ( self->state == LAP_NDM)
+       if (self->state == LAP_NDM)
                frame[0] = CBROADCAST;
        else
                frame[0] = self->caddr;
@@ -294,8 +291,8 @@ void irlap_send_disc_frame(struct irlap_cb *self)
  *    Build and transmit a XID (eXchange station IDentifier) discovery
  *    frame. 
  */
-void irlap_send_discovery_xid_frame( struct irlap_cb *self, int S, __u8 s, 
-                                    __u8 command, DISCOVERY *discovery) 
+void irlap_send_discovery_xid_frame(struct irlap_cb *self, int S, __u8 s, 
+                                   __u8 command, discovery_t *discovery) 
 {
        struct sk_buff *skb = NULL;
        struct xid_frame *frame;
@@ -311,8 +308,8 @@ void irlap_send_discovery_xid_frame( struct irlap_cb *self, int S, __u8 s,
        if (!skb)
                return;
 
-       skb_put( skb, 14);
-       frame = ( struct xid_frame *) skb->data;
+       skb_put(skb, 14);
+       frame = (struct xid_frame *) skb->data;
 
        if ( command) {
                frame->caddr = CBROADCAST | CMD_FRAME;
@@ -324,16 +321,13 @@ void irlap_send_discovery_xid_frame( struct irlap_cb *self, int S, __u8 s,
        frame->ident = XID_FORMAT;
 
        frame->saddr = cpu_to_le32(self->saddr);
-/*     memcpy( &frame->saddr, &self->saddr, 4); */
 
-       if ( command)
-               /* memcpy( &frame->daddr, &bcast, 4); */
+       if (command)
                frame->daddr = cpu_to_le32(bcast);
        else
-               /* memcpy( &frame->daddr, &self->daddr, 4); */
-               frame->daddr = cpu_to_le32(self->daddr);
+               frame->daddr = cpu_to_le32(discovery->daddr);
        
-       switch( S) {
+       switch(S) {
        case 1:
                frame->flags = 0x00;
                break;
@@ -362,15 +356,15 @@ void irlap_send_discovery_xid_frame( struct irlap_cb *self, int S, __u8 s,
        if ( !command || ( frame->slotnr == 0xff)) {
                int i;
 
-               if (discovery->hint[0] & HINT_EXTENSION)
+               if (discovery->hints.byte[0] & HINT_EXTENSION)
                        skb_put( skb, 3+discovery->info_len);
                else
                        skb_put( skb, 2+discovery->info_len);
                
                i = 0;
-               frame->discovery_info[i++] = discovery->hint[0];
-               if( discovery->hint[0] & HINT_EXTENSION)
-                       frame->discovery_info[i++] = discovery->hint[1];
+               frame->discovery_info[i++] = discovery->hints.byte[0];
+               if(discovery->hints.byte[0] & HINT_EXTENSION)
+                       frame->discovery_info[i++] = discovery->hints.byte[1];
                
                frame->discovery_info[i++] = discovery->charset;
 
@@ -391,47 +385,48 @@ void irlap_send_discovery_xid_frame( struct irlap_cb *self, int S, __u8 s,
  *    Received a XID discovery response
  *
  */
-static void irlap_recv_discovery_xid_rsp( struct irlap_cb *self, 
-                                         struct sk_buff *skb, 
-                                         struct irlap_info *info) 
+static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self, 
+                                        struct sk_buff *skb, 
+                                        struct irlap_info *info) 
 {
        struct xid_frame *xid;
-       DISCOVERY *discovery = NULL;
+       discovery_t *discovery = NULL;
        char *text;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
-       ASSERT( info != NULL, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LAP_MAGIC, return;);
+       ASSERT(skb != NULL, return;);
+       ASSERT(info != NULL, return;);
 
-       if (( discovery = kmalloc( sizeof( DISCOVERY), GFP_ATOMIC)) == NULL) {
-               DEBUG( 0, __FUNCTION__ "(), kmalloc failed!\n");
+       if ((discovery = kmalloc(sizeof(discovery_t), GFP_ATOMIC)) == NULL) {
+               DEBUG(0, __FUNCTION__ "(), kmalloc failed!\n");
                return;
        }
-       memset( discovery, 0, sizeof( DISCOVERY));
+       memset(discovery, 0, sizeof(discovery_t));
 
        xid = (struct xid_frame *) skb->data;
 
        /* 
         *  Copy peer device address and set the source address
         */
-       memcpy( &info->daddr, &xid->saddr, 4);
+       info->daddr = le32_to_cpu(xid->saddr);
        discovery->daddr = info->daddr;
        discovery->saddr = self->saddr;
+       discovery->timestamp = jiffies;
 
-       DEBUG( 4, __FUNCTION__ "(), daddr=%08x\n", discovery->daddr);
+       DEBUG(4, __FUNCTION__ "(), daddr=%08x\n", discovery->daddr);
 
        /* Get info returned from peer */
-       discovery->hint[0] = xid->discovery_info[0];
-       if ( xid->discovery_info[0] & HINT_EXTENSION) {
-               DEBUG( 4, "EXTENSION\n");
-               discovery->hint[1] = xid->discovery_info[1];
+       discovery->hints.byte[0] = xid->discovery_info[0];
+       if (xid->discovery_info[0] & HINT_EXTENSION) {
+               DEBUG(4, "EXTENSION\n");
+               discovery->hints.byte[1] = xid->discovery_info[1];
                discovery->charset = xid->discovery_info[2];
                text = (char *) &xid->discovery_info[3];
        } else {
-               discovery->hint[1] = 0;
+               discovery->hints.byte[1] = 0;
                discovery->charset = xid->discovery_info[1];
                text = (char *) &xid->discovery_info[2];
        }
@@ -440,11 +435,11 @@ static void irlap_recv_discovery_xid_rsp( struct irlap_cb *self,
         *  FCS bytes resides.
         */
        skb->data[skb->len] = '\0'; 
-       strcpy( discovery->info, text);
+       strcpy(discovery->info, text);
 
        info->discovery = discovery;
 
-       irlap_do_event( self, RECV_DISCOVERY_XID_RSP, skb, info);
+       irlap_do_event(self, RECV_DISCOVERY_XID_RSP, skb, info);
 }
 
 /*
@@ -458,7 +453,7 @@ static void irlap_recv_discovery_xid_cmd( struct irlap_cb *self,
                                          struct irlap_info *info) 
 {
        struct xid_frame *xid;
-       DISCOVERY *discovery = NULL;
+       discovery_t *discovery = NULL;
        char *text;
 
        DEBUG( 4, __FUNCTION__ "()\n");
@@ -471,7 +466,6 @@ static void irlap_recv_discovery_xid_cmd( struct irlap_cb *self,
        xid = (struct xid_frame *) skb->data;
        
        /* Copy peer device address */
-       /* memcpy( &info->daddr, &xid->saddr, 4); */
        info->daddr = le32_to_cpu(xid->saddr);
 
        switch ( xid->flags & 0x03) {
@@ -500,25 +494,24 @@ static void irlap_recv_discovery_xid_cmd( struct irlap_cb *self,
                /*
                 *  We now have some discovery info to deliver!
                 */
-               discovery = kmalloc( sizeof( DISCOVERY), GFP_ATOMIC);
-               if ( !discovery) {
-                       DEBUG( 0, __FUNCTION__ "(), kmalloc failed!\n");
+               discovery = kmalloc( sizeof(discovery_t), GFP_ATOMIC);
+               if (!discovery)
                        return;
-               }
+             
                discovery->daddr = info->daddr;
                discovery->saddr = self->saddr;
+               discovery->timestamp = jiffies;
 
                DEBUG( 4, __FUNCTION__ "(), daddr=%08x\n", 
                       discovery->daddr);
 
-               discovery->hint[0] = xid->discovery_info[0];
+               discovery->hints.byte[0] = xid->discovery_info[0];
                if ( xid->discovery_info[0] & HINT_EXTENSION) {
-                       DEBUG( 4, "EXTENSION\n");
-                       discovery->hint[1] = xid->discovery_info[1];
+                       discovery->hints.byte[1] = xid->discovery_info[1];
                        discovery->charset = xid->discovery_info[2];
                        text = (char *) &xid->discovery_info[3];
                } else {
-                       discovery->hint[1] = 0;
+                       discovery->hints.byte[1] = 0;
                        discovery->charset = xid->discovery_info[1];
                        text = (char *) &xid->discovery_info[2];
                }
@@ -533,9 +526,6 @@ static void irlap_recv_discovery_xid_cmd( struct irlap_cb *self,
        } else
                info->discovery = NULL;
        
-       DEBUG( 4, __FUNCTION__"(), s=%d, S=%d <%ld>\n", 
-              info->s, info->S, jiffies); 
-
        irlap_do_event( self, RECV_DISCOVERY_XID_CMD, skb, info);
 }
 
@@ -553,23 +543,11 @@ void irlap_send_rr_frame( struct irlap_cb *self, int command)
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == LAP_MAGIC, return;);
 
-#ifdef CONFIG_IRDA_RECYCLE_RR
-       if ( self->recycle_rr_skb) {
-               DEBUG( 4, __FUNCTION__ "(), recycling skb!\n");
-               skb = self->recycle_rr_skb;
-               self->recycle_rr_skb = NULL;
-       }
-#endif      
-       if (!skb) {
-               skb = dev_alloc_skb( 32);
-               if (!skb)
-                       return;
-   
-               skb_put( skb, 2);
-       }
-       ASSERT( skb->len == 2, return;);
-
-       frame = skb->data;
+       skb = dev_alloc_skb(32);
+       if (!skb)
+               return;
+       
+       frame = skb_put(skb, 2);
        
        frame[0] = self->caddr;
        frame[0] |= (command) ? CMD_FRAME : 0;
@@ -584,18 +562,16 @@ void irlap_send_rr_frame( struct irlap_cb *self, int command)
 /*
  * Function irlap_recv_rr_frame (skb, info)
  *
- *    Received RR (Receive Ready) frame from peer station
- *
+ *    Received RR (Receive Ready) frame from peer station, no harm in
+ *    making it inline since its called only from one single place
+ *    (irlap_input).
  */
-static void irlap_recv_rr_frame( struct irlap_cb *self, struct sk_buff *skb, 
-                                struct irlap_info *info, int command)
+static inline void irlap_recv_rr_frame(struct irlap_cb *self, 
+                                      struct sk_buff *skb, 
+                                      struct irlap_info *info, int command)
 {
        __u8 *frame;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
-
        frame = skb->data;
        info->nr = frame[1] >> 5;
 
@@ -609,32 +585,18 @@ static void irlap_recv_rr_frame( struct irlap_cb *self, struct sk_buff *skb,
         *  until it is outside a frame.
         */
 #if 0
-       if (( self->state != LAP_NRM_P) && ( self->state != LAP_NRM_S)) {
-               DEBUG( 0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
-               dev_kfree_skb( skb);
+       if ((self->state != LAP_NRM_P) && (self->state != LAP_NRM_S)) {
+               DEBUG(0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
+               dev_kfree_skb(skb);
                return;
        }
 #endif
 
-#ifdef CONFIG_IRDA_RECYCLE_RR
-       /* Only recycle one RR frame */
-       if ( self->recycle_rr_skb == NULL) {
-
-               /* Keep this skb, so it can be reused */
-               self->recycle_rr_skb = skb;
-
-               /*  
-                *  Set skb to NULL, so that the state machine will not 
-                *  try to deallocate it.
-                */
-               skb = NULL;  
-       }
-#endif
        /* Check if this is a command or a response frame */
-       if ( command)
-               irlap_do_event( self, RECV_RR_CMD, skb, info);
+       if (command)
+               irlap_do_event(self, RECV_RR_CMD, skb, info);
        else
-               irlap_do_event( self, RECV_RR_RSP, skb, info);
+               irlap_do_event(self, RECV_RR_RSP, skb, info);
 }
 
 void irlap_send_frmr_frame( struct irlap_cb *self, int command)
@@ -847,8 +809,8 @@ void irlap_send_data_primary_poll( struct irlap_cb *self, struct sk_buff *skb)
  *    Send I(nformation) frame as secondary with final bit set
  *
  */
-void irlap_send_data_secondary_final( struct irlap_cb *self, 
-                                     struct sk_buff *skb) 
+void irlap_send_data_secondary_final(struct irlap_cb *self, 
+                                    struct sk_buff *skb) 
 {
        struct sk_buff *tx_skb = NULL;
 
@@ -965,8 +927,7 @@ void irlap_resend_rejected_frames( struct irlap_cb *self, int command)
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == LAP_MAGIC, return;);
 
-       DEBUG( 4, __FUNCTION__ "(), retry_count=%d\n",
-              self->retry_count);
+       DEBUG( 4, __FUNCTION__ "(), retry_count=%d\n", self->retry_count);
 
        /* Initialize variables */
        skb = tx_skb = NULL;
@@ -1054,8 +1015,8 @@ void irlap_resend_rejected_frames( struct irlap_cb *self, int command)
  *    Contruct and transmit an Unnumbered Information (UI) frame
  *
  */
-void irlap_send_ui_frame( struct irlap_cb *self, struct sk_buff *skb, 
-                         int command) 
+void irlap_send_ui_frame(struct irlap_cb *self, struct sk_buff *skb, 
+                        int command) 
 {
        __u8  *frame;
 
@@ -1079,8 +1040,8 @@ void irlap_send_ui_frame( struct irlap_cb *self, struct sk_buff *skb,
  *
  *    Contruct and transmit Information (I) frame
  */
-void irlap_send_i_frame( struct irlap_cb *self, struct sk_buff *skb, 
-                        int command) 
+void irlap_send_i_frame(struct irlap_cb *self, struct sk_buff *skb, 
+                       int command) 
 {
        __u8  *frame;
        
@@ -1096,37 +1057,22 @@ void irlap_send_i_frame( struct irlap_cb *self, struct sk_buff *skb,
        
        /* Insert next to receive (Vr) */
        frame[1] |= (self->vr << 5);  /* insert nr */
-#if 0
-       {
-               int vr, vs, pf;
-               
-               /* Chech contents of various fields */
-               vr = frame[1] >> 5;
-               vs = (frame[1] >> 1) & 0x07;
-               pf = (frame[1] >> 4) & 0x01;
-               
-               DEBUG(0, __FUNCTION__ "(), vs=%d, vr=%d, p=%d, %ld\n", 
-                     vs, vr, pf, jiffies);
-       }
-#endif 
+
        irlap_queue_xmit(self, skb);
 }
 
 /*
  * Function irlap_recv_i_frame (skb, frame)
  *
- *    Receive and parse an I (Information) frame
- * 
+ *    Receive and parse an I (Information) frame, no harm in making it inline
+ *    since it's called only from one single place (irlap_input).
  */
-static void irlap_recv_i_frame( struct irlap_cb *self, struct sk_buff *skb, 
-                               struct irlap_info *info, int command) 
+static inline void irlap_recv_i_frame(struct irlap_cb *self, 
+                                     struct sk_buff *skb, 
+                                     struct irlap_info *info, int command) 
 {
        __u8 *frame;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LAP_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
-
        frame = skb->data;
 
        info->nr = frame[1] >> 5;          /* Next to receive */
@@ -1143,17 +1089,17 @@ static void irlap_recv_i_frame( struct irlap_cb *self, struct sk_buff *skb,
         *  it is receiving frames until the frame is delivered instead of
         *  until it is outside a frame.
         */
-       if (( self->state != LAP_NRM_P) && ( self->state != LAP_NRM_S)) {
-               DEBUG( 0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
-               dev_kfree_skb( skb);
+       if ((self->state != LAP_NRM_P) && ( self->state != LAP_NRM_S)) {
+               DEBUG(0, __FUNCTION__ "(), Wrong state, dropping frame!\n");
+               dev_kfree_skb(skb);
                return;
        }
 
        /* Check if this is a command or a response frame */
-       if ( command)
-               irlap_do_event( self, RECV_I_CMD, skb, info);
+       if (command)
+               irlap_do_event(self, RECV_I_CMD, skb, info);
        else
-               irlap_do_event( self, RECV_I_RSP, skb, info);
+               irlap_do_event(self, RECV_I_RSP, skb, info);
 }
 
 /*
@@ -1227,22 +1173,94 @@ static void irlap_recv_frmr_frame( struct irlap_cb *self, struct sk_buff *skb,
 }
 
 /*
- * Function irlap_input (skb)
+ * Function irlap_send_test_frame (self, daddr)
+ *
+ *    Send a test frame response
+ *
+ */
+void irlap_send_test_frame(struct irlap_cb *self, __u32 daddr, 
+                          struct sk_buff *cmd)
+{
+       struct sk_buff *skb;
+       struct test_frame *frame;
+       
+       skb = dev_alloc_skb(32);
+       if (!skb)
+               return;
+
+       skb_put(skb, sizeof(struct test_frame));
+
+       frame = (struct test_frame *) skb->data;
+
+       /* Build header */
+       if (self->state == LAP_NDM)
+               frame->caddr = CBROADCAST; /* Send response */
+       else
+               frame->caddr = self->caddr;
+
+       frame->control = TEST_RSP;
+
+       /* Insert the swapped addresses */
+       frame->saddr = cpu_to_le32(self->saddr);
+       frame->daddr = cpu_to_le32(daddr);
+
+       /* Copy info */
+       skb_put(skb, cmd->len);
+       memcpy(frame->info, cmd->data, cmd->len);
+
+       /* Return to sender */
+       irlap_wait_min_turn_around(self, &self->qos_tx);
+       irlap_queue_xmit(self, skb);
+}
+
+/*
+ * Function irlap_recv_test_frame (self, skb)
+ *
+ *    Receive a test frame
  *
- *  Called when a frame is received. Dispatches the right receive function 
- *  for processing of the frame.
  */
-int irlap_input( struct sk_buff *skb, struct device *netdev, 
-                struct packet_type *ptype)
+void irlap_recv_test_frame(struct irlap_cb *self, struct sk_buff *skb, 
+                          struct irlap_info *info, int command)
+{
+       struct test_frame *frame;
+
+       DEBUG(0, __FUNCTION__ "()\n");
+       
+       if (skb->len < sizeof(struct test_frame)) {
+               DEBUG(0, __FUNCTION__ "() test frame to short!\n");
+               return;
+       }
+
+       frame = (struct test_frame *) skb->data;
+
+       /* Read and swap addresses */
+       info->daddr = le32_to_cpu(frame->saddr);
+       info->saddr = le32_to_cpu(frame->daddr);
+
+       if (command)
+               irlap_do_event(self, RECV_TEST_CMD, skb, info);
+       else
+               irlap_do_event(self, RECV_TEST_RSP, skb, info);
+}
+
+/*
+ * Function irlap_driver_rcv (skb, netdev, ptype)
+ *
+ *    Called when a frame is received. Dispatches the right receive function 
+ *    for processing of the frame.
+ *
+ */
+int irlap_driver_rcv(struct sk_buff *skb, struct device *dev, 
+                    struct packet_type *ptype)
 {
        struct irlap_info info;
        struct irlap_cb *self;
        struct irda_device *idev;
        __u8 *frame;
-       int i, command;
+       int command;
        __u8 control;
        
-       idev = ( struct irda_device *) netdev->priv;
+       idev = (struct irda_device *) dev->priv;
 
        ASSERT( idev != NULL, return -1;);
        self = idev->irlap;
@@ -1264,24 +1282,18 @@ int irlap_input( struct sk_buff *skb, struct device *netdev,
        /* 
         *  First check if this frame addressed to us 
         */
-       if (( info.caddr != self->caddr) && ( info.caddr != CBROADCAST)) {
-
-               DEBUG( 0, __FUNCTION__ "(), Received frame is not for us!\n");
-               for(i=0; i<(skb->len < 15?skb->len:15);i++) {
-                       printk( "%02x ", frame[i]);
-               }
-               printk("\n"); 
-               
-               dev_kfree_skb( skb);
+       if ((info.caddr != self->caddr) && (info.caddr != CBROADCAST)) {
+               DEBUG(2, __FUNCTION__ "(), Received frame is not for us!\n");
 
+               dev_kfree_skb(skb);
                return 0;
        }
        /*  
         *  Optimize for the common case and check if the frame is an
         *  I(nformation) frame. Only I-frames have bit 0 set to 0
         */
-       if( ~control & 0x01) {
-               irlap_recv_i_frame( self, skb, &info, command);
+       if(~control & 0x01) {
+               irlap_recv_i_frame(self, skb, &info, command);
                self->stats.rx_packets++;
                return 0;
        }
@@ -1289,19 +1301,17 @@ int irlap_input( struct sk_buff *skb, struct device *netdev,
         *  We now check is the frame is an S(upervisory) frame. Only 
         *  S-frames have bit 0 set to 1 and bit 1 set to 0
         */
-       if ( ~control & 0x02) {
+       if (~control & 0x02) {
                /* 
                 *  Received S(upervisory) frame, check which frame type it is
                 *  only the first nibble is of interest
                 */
-               switch( control & 0x0f) {
+               switch(control & 0x0f) {
                case RR:
                        irlap_recv_rr_frame( self, skb, &info, command);
                        self->stats.rx_packets++;
                        break;
                case RNR:
-                       DEBUG( 4, "*** RNR frame received! pf = %d ***\n", 
-                              info.pf >> 4);
                        irlap_recv_rnr_frame( self, skb, &info);
                        self->stats.rx_packets++;
                        break;
@@ -1321,37 +1331,32 @@ int irlap_input( struct sk_buff *skb, struct device *netdev,
        /* 
         *  This must be a C(ontrol) frame 
         */
-       switch( control) {
+       switch(control) {
        case XID_RSP:
-               DEBUG( 4, "XID rsp frame received!\n");
-               irlap_recv_discovery_xid_rsp( self, skb, &info);
+               irlap_recv_discovery_xid_rsp(self, skb, &info);
                break;
        case XID_CMD:
-               DEBUG( 4, "XID cmd frame received!\n");
-               irlap_recv_discovery_xid_cmd( self, skb, &info);
+               irlap_recv_discovery_xid_cmd(self, skb, &info);
                break;
        case SNRM_CMD:
-               DEBUG( 4, "SNRM frame received!\n"); 
-               irlap_recv_snrm_cmd( self, skb, &info);
+               irlap_recv_snrm_cmd(self, skb, &info);
                break;
        case DM_RSP:
                DEBUG( 0, "DM rsp frame received!\n");
-               irlap_next_state( self, LAP_NDM);
+               irlap_next_state(self, LAP_NDM);
                break;
        case DISC_CMD:
-               DEBUG( 2, "DISC cmd frame received!\n");
-               irlap_do_event( self, RECV_DISC_FRAME, skb, &info);
+               irlap_do_event(self, RECV_DISC_FRAME, skb, &info);
                break;
        case TEST_CMD:
-               DEBUG( 0, "Test frame received!\n");
-               dev_kfree_skb( skb);
+               DEBUG(0,__FUNCTION__ "(), TEST_FRAME\n");
+               irlap_recv_test_frame(self, skb, &info, command);
                break;
        case UA_RSP:
                DEBUG( 4, "UA rsp frame received!\n");
                irlap_recv_ua_frame( self, skb, &info);
                break;
        case FRMR_RSP:
-               DEBUG( 4, "FRMR_RSP recevied!\n");
                irlap_recv_frmr_frame( self, skb, &info);
                break;
        case UI_FRAME:
index e433fcba69557b8569a6ebff7e058efe40055a28..c2f57aea65b75fbaa5cdd7bee190d9ea571e743f 100644 (file)
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irlmp.c
- * Version:       0.8
+ * Version:       0.9
  * Description:   IrDA Link Management Protocol (LMP) layer                 
- * Status:        Experimental.
+ * Status:        Stable.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 17 20:54:32 1997
- * Modified at:   Sat Feb 20 01:28:39 1999
+ * Modified at:   Wed Apr  7 17:31:48 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -30,6 +30,9 @@
 #include <linux/types.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
+#include <linux/kmod.h>
+#include <linux/random.h>
+#include <linux/irda.h>
 
 #include <net/irda/irda.h>
 #include <net/irda/irmod.h>
 #include <net/irda/iriap.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/irlmp_frame.h>
-#include <linux/kmod.h>
 
 /* Master structure */
 struct irlmp_cb *irlmp = NULL;
 
 /* These can be altered by the sysctl interface */
-int sysctl_discovery = 0;
-int sysctl_discovery_slots = 6;
+int  sysctl_discovery = 0;
+int  sysctl_discovery_slots = 6;
 char sysctl_devname[65];
 
 char *lmp_reasons[] = {
@@ -61,8 +63,7 @@ char *lmp_reasons[] = {
 
 __u8 *irlmp_hint_to_service( __u8 *hint);
 #ifdef CONFIG_PROC_FS
-int irlmp_proc_read( char *buf, char **start, off_t offset, int len, 
-                    int unused);
+int irlmp_proc_read(char *buf, char **start, off_t offst, int len, int unused);
 #endif
 
 /*
@@ -83,19 +84,21 @@ __initfunc(int irlmp_init(void))
        
        irlmp->magic = LMP_MAGIC;
 
-       irlmp->registry = hashbin_new( HB_LOCAL);
-       irlmp->links = hashbin_new( HB_LOCAL);
-       irlmp->unconnected_lsaps = hashbin_new( HB_GLOBAL);
+       irlmp->clients = hashbin_new(HB_GLOBAL);
+       irlmp->services = hashbin_new(HB_GLOBAL);
+       irlmp->links = hashbin_new(HB_GLOBAL);
+       irlmp->unconnected_lsaps = hashbin_new(HB_GLOBAL);
+       irlmp->cachelog = hashbin_new(HB_GLOBAL);
        
        irlmp->free_lsap_sel = 0x10; /* Servers use 0x00-0x0f */
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
        irlmp->cache.valid = FALSE;
 #endif
-       strcpy( sysctl_devname, "Linux");
+       strcpy(sysctl_devname, "Linux");
        
        /* Do discovery every 3 seconds */
-       init_timer( &irlmp->discovery_timer);
-       irlmp_start_discovery_timer( irlmp, 600); 
+       init_timer(&irlmp->discovery_timer);
+       irlmp_start_discovery_timer(irlmp, 600); 
 
        return 0;
 }
@@ -109,18 +112,19 @@ __initfunc(int irlmp_init(void))
 void irlmp_cleanup(void) 
 {
        /* Check for main structure */
-       ASSERT( irlmp != NULL, return;);
-       ASSERT( irlmp->magic == LMP_MAGIC, return;);
+       ASSERT(irlmp != NULL, return;);
+       ASSERT(irlmp->magic == LMP_MAGIC, return;);
 
-       del_timer( &irlmp->discovery_timer);
+       del_timer(&irlmp->discovery_timer);
        
-       /* FIXME, we need a special function to deallocate LAPs */
-       hashbin_delete( irlmp->links, (FREE_FUNC) kfree);
-       hashbin_delete( irlmp->unconnected_lsaps, (FREE_FUNC) kfree);
-       hashbin_delete( irlmp->registry, (FREE_FUNC) kfree);
+       hashbin_delete(irlmp->links, (FREE_FUNC) kfree);
+       hashbin_delete(irlmp->unconnected_lsaps, (FREE_FUNC) kfree);
+       hashbin_delete(irlmp->clients, (FREE_FUNC) kfree);
+       hashbin_delete(irlmp->services, (FREE_FUNC) kfree);
+       hashbin_delete(irlmp->cachelog, (FREE_FUNC) kfree);
        
        /* De-allocate main structure */
-       kfree( irlmp);
+       kfree(irlmp);
        irlmp = NULL;
 }
 
@@ -130,20 +134,20 @@ void irlmp_cleanup(void)
  *   Register with IrLMP and create a local LSAP,
  *   returns handle to LSAP.
  */
-struct lsap_cb *irlmp_open_lsap( __u8 slsap_sel, struct notify_t *notify)
+struct lsap_cb *irlmp_open_lsap(__u8 slsap_sel, struct notify_t *notify)
 {
        struct lsap_cb *self;
 
-       ASSERT( notify != NULL, return NULL;);
-       ASSERT( irlmp != NULL, return NULL;);
-       ASSERT( irlmp->magic == LMP_MAGIC, return NULL;);
+       ASSERT(notify != NULL, return NULL;);
+       ASSERT(irlmp != NULL, return NULL;);
+       ASSERT(irlmp->magic == LMP_MAGIC, return NULL;);
 
-       DEBUG( 4, __FUNCTION__ "(), slsap_sel=%02x\n", slsap_sel);
+       DEBUG(4, __FUNCTION__ "(), slsap_sel=%02x\n", slsap_sel);
 
        /* 
         *  Does the client care which Source LSAP selector it gets? 
         */
-       if ( slsap_sel == LSAP_ANY) {
+       if (slsap_sel == LSAP_ANY) {
                /*
                 *  Find unused LSAP
                 */
@@ -155,41 +159,39 @@ struct lsap_cb *irlmp_open_lsap( __u8 slsap_sel, struct notify_t *notify)
                 *  Client wants specific LSAP, so check if it's already
                 *  in use
                 */
-               if ( irlmp_slsap_inuse( slsap_sel)) {
+               if (irlmp_slsap_inuse(slsap_sel)) {
                        return NULL;
                }
-               if ( slsap_sel > irlmp->free_lsap_sel)
-                       irlmp->free_lsap_sel = slsap_sel+1;
        }
 
        /*
         *  Allocate new instance of a LSAP connection
         */
-       self = kmalloc( sizeof(struct lsap_cb), GFP_ATOMIC);
-       if ( self == NULL) {
+       self = kmalloc(sizeof(struct lsap_cb), GFP_ATOMIC);
+       if (self == NULL) {
                printk( KERN_ERR "IrLMP: Can't allocate memory for "
                        "LSAP control block!\n");
                return NULL;
        }
-       memset( self, 0, sizeof(struct lsap_cb));
+       memset(self, 0, sizeof(struct lsap_cb));
        
        self->magic = LMP_LSAP_MAGIC;
        self->slsap_sel = slsap_sel;
        self->dlsap_sel = LSAP_ANY;
        self->connected = FALSE;
 
-       init_timer( &self->watchdog_timer);
+       init_timer(&self->watchdog_timer);
 
-       ASSERT( notify->instance != NULL, return NULL;);
+       ASSERT(notify->instance != NULL, return NULL;);
        self->notify = *notify;
 
-       irlmp_next_lsap_state( self, LSAP_DISCONNECTED);
+       irlmp_next_lsap_state(self, LSAP_DISCONNECTED);
        
        /*
         *  Insert into queue of unconnected LSAPs
         */
-       hashbin_insert( irlmp->unconnected_lsaps, (QUEUE *) self, 
-                       self->slsap_sel, NULL);
+       hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) self, (int) self, 
+                      NULL);
        
        return self;
 }
@@ -197,65 +199,62 @@ struct lsap_cb *irlmp_open_lsap( __u8 slsap_sel, struct notify_t *notify)
 /*
  * Function irlmp_close_lsap (self)
  *
- *    Remove an instance of LSAP
+ *    Remove an instance of LSAP
  */
-static void __irlmp_close_lsap( struct lsap_cb *self)
+static void __irlmp_close_lsap(struct lsap_cb *self)
 {
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
 
        /*
         *  Set some of the variables to preset values
         */
        self->magic = ~LMP_LSAP_MAGIC;
-       del_timer( &self->watchdog_timer); /* Important! */
+       del_timer(&self->watchdog_timer); /* Important! */
 
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-       ASSERT( irlmp != NULL, return;);
+       ASSERT(irlmp != NULL, return;);
        irlmp->cache.valid = FALSE;
 #endif
-       kfree( self);
+       kfree(self);
 }
 
 /*
  * Function irlmp_close_lsap (self)
  *
- *    
+ *    Close and remove LSAP
  *
  */
-void irlmp_close_lsap( struct lsap_cb *self)
+void irlmp_close_lsap(struct lsap_cb *self)
 {
        struct lap_cb *lap;
-       struct lsap_cb *lsap;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+       struct lsap_cb *lsap = NULL;
 
-       lap = self->lap;
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
 
        /*
         *  Find out if we should remove this LSAP from a link or from the
         *  list of unconnected lsaps (not associated with a link)
         */
-       if ( lap == NULL) {
-               lsap = hashbin_remove( irlmp->unconnected_lsaps, 
-                                      self->slsap_sel, NULL);
-       } else {
-               ASSERT( lap != NULL, return;);
-               ASSERT( lap->magic == LMP_LAP_MAGIC, return;);
-               
-               lsap = hashbin_remove( lap->lsaps, self->slsap_sel, NULL);
+       lap = self->lap;
+       if (lap) {
+               ASSERT(lap->magic == LMP_LAP_MAGIC, return;);
+               lsap = hashbin_remove(lap->lsaps, (int) self, NULL);
        }
-       if ( lsap == NULL) {
-               DEBUG( 1, __FUNCTION__ 
+       /* Check if we found the LSAP! If not then try the unconnected lsaps */
+       if (!lsap) {
+               lsap = hashbin_remove(irlmp->unconnected_lsaps, (int) self, 
+                                     NULL);
+       }
+       if (!lsap) {
+               DEBUG(0, __FUNCTION__ 
                       "(), Looks like somebody has removed me already!\n");
                return;
        }
-       ASSERT( lsap == self, return;);
-
-       __irlmp_close_lsap( self);
+       __irlmp_close_lsap(self);
 }
 
 /*
@@ -265,50 +264,47 @@ void irlmp_close_lsap( struct lsap_cb *self)
  *    instances of the IrLAP layer, each connected to different IrDA ports
  *
  */
-void irlmp_register_irlap( struct irlap_cb *irlap, __u32 saddr, 
-                          struct notify_t *notify)
+void irlmp_register_link(struct irlap_cb *irlap, __u32 saddr, 
+                        struct notify_t *notify)
 {
        struct lap_cb *lap;
 
-       DEBUG( 4, __FUNCTION__ "(), Registered IrLAP, saddr = %08x\n",
-              saddr);
+       DEBUG(4, __FUNCTION__ "(), Registered IrLAP, saddr = %08x\n", saddr);
        
-       ASSERT( irlmp != NULL, return;);
-       ASSERT( irlmp->magic == LMP_MAGIC, return;);
-       ASSERT( notify != NULL, return;);
+       ASSERT(irlmp != NULL, return;);
+       ASSERT(irlmp->magic == LMP_MAGIC, return;);
+       ASSERT(notify != NULL, return;);
 
        /*
         *  Allocate new instance of a LSAP connection
         */
-       lap = kmalloc( sizeof(struct lap_cb), GFP_KERNEL);
-       if ( lap == NULL) {
-               printk( KERN_ERR "IrLMP: Can't allocate memory for "
-                       "LAP control block!\n");
+       lap = kmalloc(sizeof(struct lap_cb), GFP_KERNEL);
+       if (lap == NULL) {
+               DEBUG(3, __FUNCTION__ "(), unable to kmalloc\n");
                return;
        }
-       memset( lap, 0, sizeof(struct lap_cb));
+       memset(lap, 0, sizeof(struct lap_cb));
        
        lap->irlap = irlap;
        lap->magic = LMP_LAP_MAGIC;
        lap->saddr = saddr;
        lap->daddr = DEV_ADDR_ANY;
-       lap->lsaps = hashbin_new( HB_GLOBAL);
-       lap->cachelog = hashbin_new( HB_LOCAL);
+       lap->lsaps = hashbin_new(HB_GLOBAL);
 
-       irlmp_next_lap_state( lap, LAP_STANDBY);
+       irlmp_next_lap_state(lap, LAP_STANDBY);
        
        init_timer(&lap->idle_timer);
 
        /*
         *  Insert into queue of unconnected LSAPs
         */
-       hashbin_insert( irlmp->links, (QUEUE *) lap, lap->saddr, NULL);
+       hashbin_insert(irlmp->links, (QUEUE *) lap, lap->saddr, NULL);
 
        /* 
         *  We set only this variable so IrLAP can tell us on which link the
         *  different events happened on 
         */
-       irda_notify_init( notify);
+       irda_notify_init(notify);
        notify->instance = lap;
 }
 
@@ -318,73 +314,26 @@ void irlmp_register_irlap( struct irlap_cb *irlap, __u32 saddr,
  *    IrLAP layer has been removed!
  *
  */
-void irlmp_unregister_irlap(__u32 saddr)
+void irlmp_unregister_link(__u32 saddr)
 {
-       struct lap_cb *self;
+       struct lap_cb *link;
 
        DEBUG(4, __FUNCTION__ "()\n");
 
-       self = hashbin_remove(irlmp->links, saddr, NULL);
-       if (self) {
-               ASSERT(self->magic == LMP_LAP_MAGIC, return;);
-
-               del_timer(&self->idle_timer);   
-
-               self->magic = 0;
-               kfree(self);
-       } else {
-               DEBUG(1, __FUNCTION__ "(), Didn't find LAP layer!\n");
-       }
-}
-
-void dump_discoveries( hashbin_t *log)
-{
-       DISCOVERY *d;
+       link = hashbin_remove(irlmp->links, saddr, NULL);
+       if (link) {
+               ASSERT(link->magic == LMP_LAP_MAGIC, return;);
 
-       ASSERT( log != NULL, return;);
+               /* Remove all discoveries discovered at this link */
+               irlmp_expire_discoveries(irlmp->cachelog, link->saddr, TRUE);
 
-       d = (DISCOVERY *) hashbin_get_first( log);
-       while( d != NULL) {
-               DEBUG( 1, "Discovery:\n");
-               DEBUG( 1, "  daddr=%08x\n", d->daddr);
-               DEBUG( 1, "  name=%s\n", d->info);
+               del_timer(&link->idle_timer);   
 
-               d = (DISCOVERY *) hashbin_get_next( log);
+               link->magic = 0;
+               kfree(link);
        }
 }
 
-static struct lap_cb *irlmp_find_link( __u32 daddr)
-{
-       struct lap_cb *lap;
-       unsigned long flags;
-
-       DEBUG( 1, __FUNCTION__ 
-              "(), client didn't supply saddr, so try to look it up!\n");
-
-       /* 
-        *  Find out which link to connect on, and make sure nothing strange
-        *  happens while we traverse the list
-        */
-       save_flags( flags);
-       cli();
-
-       lap = (struct lap_cb *) hashbin_get_first( irlmp->links);
-       while ( lap != NULL) {
-               ASSERT( lap->magic == LMP_LAP_MAGIC, return NULL;);
-               /* dump_discoveries( lap->cachelog); */
-
-               if ( hashbin_find( lap->cachelog, daddr, NULL)) {
-                       DEBUG( 4, __FUNCTION__
-                              "() found link to connect on!\n");
-                       return lap;
-               }
-               lap = (struct lap_cb *) hashbin_get_next( irlmp->links);
-       }
-       restore_flags(flags);
-
-       return NULL;
-}
-
 /*
  * Function irlmp_connect_request (handle, dlsap, userdata)
  *
@@ -398,36 +347,35 @@ int irlmp_connect_request(struct lsap_cb *self, __u8 dlsap_sel,
        struct sk_buff *skb = NULL;
        struct lap_cb *lap;
        struct lsap_cb *lsap;
+       discovery_t *discovery;
 
        ASSERT( self != NULL, return -1;);
        ASSERT( self->magic == LMP_LSAP_MAGIC, return -1;);
        
-       DEBUG( 4, __FUNCTION__ 
-              "(), slsap_sel=%02x, dlsap_sel=%02x, saddr=%08x, daddr=%08x\n", 
-              self->slsap_sel, dlsap_sel, saddr, daddr);
+       DEBUG(2, __FUNCTION__ 
+             "(), slsap_sel=%02x, dlsap_sel=%02x, saddr=%08x, daddr=%08x\n", 
+             self->slsap_sel, dlsap_sel, saddr, daddr);
        
-       if ( self->connected) {
-               DEBUG( 1, __FUNCTION__ "(), Error: already connected!!\n");
-               
+       if ( self->connected) 
                return -EISCONN;
-       }
+
+       /* Client must supply destination device address */
+       if (!daddr)
+               return -EINVAL;
 
        /* Any userdata? */
-       if ( userdata == NULL) {
-               skb = dev_alloc_skb( 64);
-               if (skb == NULL) {
-                       DEBUG( 1, __FUNCTION__ 
-                              "(), Could not allocate sk_buff of length %d\n",
-                              64);
-                       return -1;
-               }
-               skb_reserve( skb, LMP_CONTROL_HEADER+LAP_HEADER);
+       if (userdata == NULL) {
+               skb = dev_alloc_skb(64);
+               if (!skb)
+                       return -ENOMEM;
+
+               skb_reserve(skb, LMP_CONTROL_HEADER+LAP_HEADER);
        } else
                skb = userdata;
        
        /* Make room for MUX control header ( 3 bytes) */
-       ASSERT( skb_headroom( skb) >= LMP_CONTROL_HEADER, return -1;);
-       skb_push( skb, LMP_CONTROL_HEADER);
+       ASSERT(skb_headroom(skb) >= LMP_CONTROL_HEADER, return -1;);
+       skb_push(skb, LMP_CONTROL_HEADER);
 
        self->dlsap_sel = dlsap_sel;
        self->tmp_skb = skb;
@@ -440,44 +388,48 @@ int irlmp_connect_request(struct lsap_cb *self, __u8 dlsap_sel,
         * discovery log and check if any of the links has discovered a
         * device with the given daddr 
         */
-       if ( saddr)
-               lap = hashbin_find( irlmp->links, saddr, NULL);
-       else
-               lap = irlmp_find_link( daddr);
-       
-       if ( lap == NULL) {
-               DEBUG( 1, __FUNCTION__ "(), Unable to find a usable link!\n");
-               
+       if (!saddr) {
+               discovery = hashbin_find(irlmp->cachelog, daddr, NULL);
+               if (discovery)
+                       saddr = discovery->saddr;
+       }
+       lap = hashbin_find(irlmp->links, saddr, NULL);  
+       if (lap == NULL) {
+               DEBUG(1, __FUNCTION__ "(), Unable to find a usable link!\n");
                return -EHOSTUNREACH;
        }
+
+       if (lap->daddr == DEV_ADDR_ANY)
+               lap->daddr = daddr;
+       else if (lap->daddr != daddr) {
+               DEBUG(0, __FUNCTION__ "(), sorry, but link is busy!\n");
+               return -EBUSY;
+       }
+
        self->lap = lap;
 
        /* 
         *  Remove LSAP from list of unconnected LSAPs and insert it into the 
-        *  list of connected LSAPs for the particular link */
-       lsap = hashbin_remove( irlmp->unconnected_lsaps, self->slsap_sel, 
-                              NULL);
+        *  list of connected LSAPs for the particular link 
+        */
+       lsap = hashbin_remove(irlmp->unconnected_lsaps, (int) self, NULL);
 
-       ASSERT( lsap != NULL, return -1;);
-       ASSERT( lsap->magic == LMP_LSAP_MAGIC, return -1;);
-       ASSERT( lsap->lap != NULL, return -1;);
-       ASSERT( lsap->lap->magic == LMP_LAP_MAGIC, return -1;);
+       ASSERT(lsap != NULL, return -1;);
+       ASSERT(lsap->magic == LMP_LSAP_MAGIC, return -1;);
+       ASSERT(lsap->lap != NULL, return -1;);
+       ASSERT(lsap->lap->magic == LMP_LAP_MAGIC, return -1;);
 
-       hashbin_insert( self->lap->lsaps, (QUEUE *) self, self->slsap_sel, 
-                       NULL);
+       hashbin_insert(self->lap->lsaps, (QUEUE *) self, (int) self, NULL);
 
        self->connected = TRUE;
-
+       
        /*
         *  User supplied qos specifications?
         */
        if (qos)
                self->qos = *qos;
        
-       DEBUG( 4, "*** Connecting SLSAP=%02x, DLSAP= %02x\n",
-              self->slsap_sel, self->dlsap_sel);
-       
-       irlmp_do_lsap_event( self, LM_CONNECT_REQUEST, skb);
+       irlmp_do_lsap_event(self, LM_CONNECT_REQUEST, skb);
 
        return 0;
 }
@@ -488,26 +440,26 @@ int irlmp_connect_request(struct lsap_cb *self, __u8 dlsap_sel,
  *    Incomming connection
  *
  */
-void irlmp_connect_indication( struct lsap_cb *self, struct sk_buff *skb) 
+void irlmp_connect_indication(struct lsap_cb *self, struct sk_buff *skb) 
 {
        int max_seg_size;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(3, __FUNCTION__ "()\n");
        
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
-       ASSERT( self->lap != NULL, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
+       ASSERT(skb != NULL, return;);
+       ASSERT(self->lap != NULL, return;);
 
        self->qos = *self->lap->qos;
 
        max_seg_size = self->lap->qos->data_size.value;
-       DEBUG( 4, __FUNCTION__ "(), max_seg_size=%d\n", max_seg_size);
+       DEBUG(4, __FUNCTION__ "(), max_seg_size=%d\n", max_seg_size);
        
        /* Hide LMP_CONTROL_HEADER header from layer above */
-       skb_pull( skb, LMP_CONTROL_HEADER);
+       skb_pull(skb, LMP_CONTROL_HEADER);
 
-       if ( self->notify.connect_indication)
+       if (self->notify.connect_indication)
                self->notify.connect_indication(self->notify.instance, self, 
                                                &self->qos, max_seg_size, skb);
 }
@@ -520,7 +472,7 @@ void irlmp_connect_indication( struct lsap_cb *self, struct sk_buff *skb)
  */
 void irlmp_connect_response( struct lsap_cb *self, struct sk_buff *userdata) 
 {
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(3, __FUNCTION__ "()\n");
        
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
@@ -543,11 +495,11 @@ void irlmp_connect_response( struct lsap_cb *self, struct sk_buff *userdata)
  *
  *    LSAP connection confirmed peer device!
  */
-void irlmp_connect_confirm( struct lsap_cb *self, struct sk_buff *skb) 
+void irlmp_connect_confirm(struct lsap_cb *self, struct sk_buff *skb) 
 {
        int max_seg_size;
 
-       DEBUG( 4, __FUNCTION__ "()\n");
+       DEBUG(3, __FUNCTION__ "()\n");
        
        ASSERT( skb != NULL, return;);
        ASSERT( self != NULL, return;);
@@ -568,13 +520,53 @@ void irlmp_connect_confirm( struct lsap_cb *self, struct sk_buff *skb)
        }
 }
 
+/*
+ * Function irlmp_dup (orig, instance)
+ *
+ *    Duplicate LSAP, can be used by servers to confirm a connection on a
+ *    new LSAP so it can keep listening on the old one.
+ *
+ */
+struct lsap_cb *irlmp_dup(struct lsap_cb *orig, void *instance) 
+{
+       struct lsap_cb *new;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       /* Only allowed to duplicate unconnected LSAP's */
+       if (!hashbin_find(irlmp->unconnected_lsaps, (int) orig, NULL)) {
+               DEBUG(0, __FUNCTION__ "(), unable to find LSAP\n");
+               return NULL;
+       }
+       new = kmalloc(sizeof(struct lsap_cb), GFP_ATOMIC);
+       if (!new)  {
+               DEBUG(0, __FUNCTION__ "(), unable to kmalloc\n");
+               return NULL;
+       }
+       /* Dup */
+       memcpy(new, orig, sizeof(struct lsap_cb));
+       new->notify.instance = instance;
+       
+       init_timer(&new->watchdog_timer);
+       
+       hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) new, (int) new, 
+                      NULL);
+
+       /* Make sure that we invalidate the cache */
+#ifdef CONFIG_IRDA_CACHE_LAST_LSAP
+       irlmp->cache.valid = FALSE;
+#endif /* CONFIG_IRDA_CACHE_LAST_LSAP */
+
+       return new;
+}
+
 /*
  * Function irlmp_disconnect_request (handle, userdata)
  *
  *    The service user is requesting disconnection, this will not remove the 
  *    LSAP, but only mark it as disconnected
  */
-void irlmp_disconnect_request( struct lsap_cb *self, struct sk_buff *userdata) 
+void irlmp_disconnect_request(struct lsap_cb *self, struct sk_buff *userdata) 
 {
        struct lsap_cb *lsap;
 
@@ -608,14 +600,14 @@ void irlmp_disconnect_request( struct lsap_cb *self, struct sk_buff *userdata)
        ASSERT( self->lap->magic == LMP_LAP_MAGIC, return;);
        ASSERT( self->lap->lsaps != NULL, return;);
 
-       lsap = hashbin_remove( self->lap->lsaps, self->slsap_sel, NULL);
+       lsap = hashbin_remove(self->lap->lsaps, (int) self, NULL);
 
        ASSERT( lsap != NULL, return;);
        ASSERT( lsap->magic == LMP_LSAP_MAGIC, return;);
        ASSERT( lsap == self, return;);
 
-       hashbin_insert( irlmp->unconnected_lsaps, (QUEUE *) self, 
-                       self->slsap_sel, NULL);
+       hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) self, (int) self, 
+                      NULL);
        
        /* Reset some values */
        self->connected = FALSE;
@@ -651,12 +643,12 @@ void irlmp_disconnect_indication( struct lsap_cb *self, LM_REASON reason,
        ASSERT( self->lap != NULL, return;);
        ASSERT( self->lap->lsaps != NULL, return;);
 
-       lsap = hashbin_remove( self->lap->lsaps, self->slsap_sel, NULL);
+       lsap = hashbin_remove( self->lap->lsaps, (int) self, NULL);
 
        ASSERT( lsap != NULL, return;);
        ASSERT( lsap == self, return;);
-       hashbin_insert( irlmp->unconnected_lsaps, (QUEUE *) lsap, 
-                       lsap->slsap_sel, NULL);
+       hashbin_insert(irlmp->unconnected_lsaps, (QUEUE *) lsap, (int) lsap, 
+                      NULL);
 
        self->lap = NULL;
        
@@ -670,33 +662,24 @@ void irlmp_disconnect_indication( struct lsap_cb *self, LM_REASON reason,
 }
 
 /*
- * Function irlmp_discovery_request (nslots)
+ * Function irlmp_do_discovery (nslots)
  *
- *    Do a discovery of devices in front of the computer
+ *    Do some discovery on all links
  *
  */
-void irlmp_discovery_request( int nslots)
+void irlmp_do_discovery(int nslots)
 {
        struct lap_cb *lap;
 
-       DEBUG( 4, __FUNCTION__ "(), nslots=%d\n", nslots);
-
-       ASSERT( irlmp != NULL, return;);
-
-       if ( !sysctl_discovery)
-               return;
-
-       if ((nslots != 1)&&(nslots != 6)&&(nslots != 8)&&(nslots != 16)) {
-               DEBUG( 1, __FUNCTION__ "(), invalid number of slots value!\n");
+       /* Make sure value is sane */
+       if ((nslots != 1) && (nslots != 6) && (nslots != 8)&&(nslots != 16)) {
+               printk(KERN_WARNING __FUNCTION__ 
+                      "(), invalid value for number of slots!\n");
                nslots = sysctl_discovery_slots = 8;
        }
 
-       /*
-        *  Construct new discovery info to be used by IrLAP,
-        *  TODO: no need to do this every time!
-        */
-       irlmp->discovery_cmd.hint[0] = irlmp->hint[0];
-       irlmp->discovery_cmd.hint[1] = irlmp->hint[1];
+       /* Construct new discovery info to be used by IrLAP, */
+       irlmp->discovery_cmd.hints.word = irlmp->hints.word;
        
        /* 
         *  Set character set for device name (we use ASCII), and 
@@ -704,134 +687,161 @@ void irlmp_discovery_request( int nslots)
         *  end
         */
        irlmp->discovery_cmd.charset = CS_ASCII;
-       
-       strncpy( irlmp->discovery_cmd.info, sysctl_devname, 31);
-       irlmp->discovery_cmd.info_len = strlen( irlmp->discovery_cmd.info);
+       strncpy(irlmp->discovery_cmd.info, sysctl_devname, 31);
+       irlmp->discovery_cmd.info_len = strlen(irlmp->discovery_cmd.info);
        irlmp->discovery_cmd.nslots = nslots;
        
        /*
         * Try to send discovery packets on all links
         */
-       lap = ( struct lap_cb *) hashbin_get_first( irlmp->links);
-       while ( lap != NULL) {
-               ASSERT( lap->magic == LMP_LAP_MAGIC, return;);
-
-               DEBUG( 4, __FUNCTION__ "() sending request!\n");
-               irlmp_do_lap_event( lap, LM_LAP_DISCOVERY_REQUEST, NULL);
+       lap = (struct lap_cb *) hashbin_get_first(irlmp->links);
+       while (lap != NULL) {
+               ASSERT(lap->magic == LMP_LAP_MAGIC, return;);
                
-               lap = ( struct lap_cb *) hashbin_get_next( irlmp->links);
+               if (lap->lap_state == LAP_STANDBY) {
+                       /* Expire discoveries discovered on this link */
+                       irlmp_expire_discoveries(irlmp->cachelog, lap->saddr,
+                                                FALSE);
+
+                       /* Try to discover */
+                       irlmp_do_lap_event(lap, LM_LAP_DISCOVERY_REQUEST, 
+                                          NULL);
+               }
+               lap = (struct lap_cb *) hashbin_get_next(irlmp->links);
        }
 }
 
+/*
+ * Function irlmp_discovery_request (nslots)
+ *
+ *    Do a discovery of devices in front of the computer
+ *
+ */
+void irlmp_discovery_request(int nslots)
+{
+
+       DEBUG(4, __FUNCTION__ "(), nslots=%d\n", nslots);
+
+       /* 
+        * If discovery is already running, then just return the current 
+        * discovery log
+        */
+       if (sysctl_discovery) {
+               DEBUG(2, __FUNCTION__ "() discovery already running, so we"
+                     " just return the old discovery log!\n");
+               irlmp_discovery_confirm(irlmp->cachelog);
+       } else
+               irlmp_do_discovery(nslots);
+}
+
+#if 0
 /*
  * Function irlmp_check_services (discovery)
  *
  *    
  *
  */
-void irlmp_check_services( DISCOVERY *discovery) 
+void irlmp_check_services(discovery_t *discovery)
 {
-       struct irlmp_registration *entry;
+       struct irlmp_client *client;
        struct irmanager_event event;
-       __u8 *service;
+       __u8 *service_log;
+       __u8 service;
        int i = 0;
 
        DEBUG(1, "IrDA Discovered: %s\n", discovery->info);
        DEBUG(1, "    Services: ");
 
-       service = irlmp_hint_to_service( discovery->hint);
-       if (service != NULL) {
-               /*
-                *  Check all services on the device
-                */
-               while ( service[i] != S_END) {
-                       DEBUG( 4, "service=%02x\n", service[i]);
-                       entry = hashbin_find( irlmp->registry, 
-                                             service[i], NULL);
-                       if ( entry && entry->discovery_callback) {
-                               DEBUG( 4, "discovery_callback!\n");
-                               entry->discovery_callback( discovery);
-                       } else {
-                               /* 
-                                * Found no clients for dealing with this
-                                * service, so ask the user space irmanager
-                                * to try to load the right module for us
-                                */
-
-                               event.event = EVENT_DEVICE_DISCOVERED;
-                               event.service = service[i];
-                               event.daddr = discovery->daddr;
-                               sprintf( event.info, "%s", 
-                                        discovery->info);
-                               irmanager_notify( &event);
-                       }
-                       i++; /* Next service */
+       service_log = irlmp_hint_to_service(discovery->hints.byte);
+       if (!service_log)
+               return;
+
+       /*
+        *  Check all services on the device
+        */
+       while ((service = service_log[i++]) != S_END) {
+               DEBUG( 4, "service=%02x\n", service);
+               client = hashbin_find(irlmp->registry, service, NULL);
+               if (entry && entry->discovery_callback) {
+                       DEBUG( 4, "discovery_callback!\n");
+
+                       entry->discovery_callback(discovery);
+               } else {
+                       /* Don't notify about the ANY service */
+                       if (service == S_ANY)
+                               continue;
+                       /*  
+                        * Found no clients for dealing with this service,
+                        * so ask the user space irmanager to try to load
+                        * the right module for us 
+                        */
+                       event.event = EVENT_DEVICE_DISCOVERED;
+                       event.service = service;
+                       event.daddr = discovery->daddr;
+                       sprintf(event.info, "%s", discovery->info);
+                       irmanager_notify(&event);
                }
-               kfree( service);
        }
+       kfree(service_log);
 }
-
+#endif
 /*
- * Function irlmp_discovery_confirm ( self, log)
+ * Function irlmp_notify_client (log)
+ *
+ *    Notify all about discovered devices
  *
- *    Some device(s) answered to our discovery request! Check to see which
- *    device it is, and give indication to the client(s)
- * 
  */
-void irlmp_discovery_confirm( struct lap_cb *self, hashbin_t *log) 
+void irlmp_notify_client(irlmp_client_t *client, hashbin_t *log)
 {
-       DISCOVERY *discovery;
+       discovery_t *discovery;
+
+       DEBUG(3, __FUNCTION__ "()\n");
        
-       DEBUG( 4, __FUNCTION__ "()\n");
+       /* Check if client wants the whole log */
+       if (client->callback2)
+               client->callback2(log);
        
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LAP_MAGIC, return;);
-
-       /*
-        *  Now, check all discovered devices (if any)
+       /* 
+        * Now, check all discovered devices (if any), and notify client 
+        * only about the services that the client is interested in 
         */
-       discovery = ( DISCOVERY *) hashbin_get_first( log);
-       while ( discovery != NULL) {
-               self->daddr = discovery->daddr;
-
-               DEBUG( 4, "discovery->daddr = 0x%08x\n", discovery->daddr); 
+       discovery = (discovery_t *) hashbin_get_first(log);
+       while (discovery != NULL) {
+               DEBUG(3, "discovery->daddr = 0x%08x\n", discovery->daddr); 
                
-               irlmp_check_services( discovery);
-
-               discovery = ( DISCOVERY *) hashbin_get_next( log);
+               if (client->hint_mask & discovery->hints.word) {
+                       if (client->callback1)
+                               client->callback1(discovery);
+               }
+               discovery = (discovery_t *) hashbin_get_next(log);
        }
 }
 
 /*
- * Function irlmp_discovery_indication (discovery)
- *
- *    A remote device is discovering us!
+ * Function irlmp_discovery_confirm ( self, log)
  *
+ *    Some device(s) answered to our discovery request! Check to see which
+ *    device it is, and give indication to the client(s)
+ * 
  */
-void irlmp_discovery_indication( struct lap_cb *self, DISCOVERY *discovery)
+void irlmp_discovery_confirm(hashbin_t *log) 
 {
-       /* struct irda_event event; */
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LAP_MAGIC, return;);
-       ASSERT( discovery != NULL, return;);
-
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       DEBUG( 4, "discovery->daddr = 0x%08x\n", discovery->daddr); 
-       self->daddr = discovery->daddr;
-
-       ASSERT( self->cachelog != NULL, return;);
-
-       /*
-        *  Insert this discovery device into the discovery_log if its
-        *  not there already
-        */
-       if ( !hashbin_find( self->cachelog, discovery->daddr, NULL))
-               hashbin_insert( self->cachelog, (QUEUE *) discovery,
-                               discovery->daddr, NULL);
-
-       irlmp_check_services( discovery);
+       irlmp_client_t *client;
+       
+       DEBUG(3, __FUNCTION__ "()\n");
+       
+       ASSERT(log != NULL, return;);
+       
+       if (!hashbin_get_size(log))
+               return;
+       
+       client = (irlmp_client_t *) hashbin_get_first(irlmp->clients);
+       while (client != NULL) {
+               /* Check if we should notify client */
+               irlmp_notify_client(client, log);
+                       
+               client = (irlmp_client_t *) hashbin_get_next(irlmp->clients);
+       }
 }
 
 /*
@@ -840,14 +850,13 @@ void irlmp_discovery_indication( struct lap_cb *self, DISCOVERY *discovery)
  *    Used by IrLAP to get the disocvery info it needs when answering
  *    discovery requests by other devices.
  */
-DISCOVERY *irlmp_get_discovery_response()
+discovery_t *irlmp_get_discovery_response()
 {
-       DEBUG( 4, "irlmp_get_discovery_response()\n");
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( irlmp != NULL, return NULL;);
+       ASSERT(irlmp != NULL, return NULL;);
 
-       irlmp->discovery_rsp.hint[0] = irlmp->hint[0];
-       irlmp->discovery_rsp.hint[1] = irlmp->hint[1];
+       irlmp->discovery_rsp.hints.word = irlmp->hints.word;
 
        /* 
         *  Set character set for device name (we use ASCII), and 
@@ -856,8 +865,8 @@ DISCOVERY *irlmp_get_discovery_response()
         */
        irlmp->discovery_rsp.charset = CS_ASCII;
 
-       strncpy( irlmp->discovery_rsp.info, sysctl_devname, 31);
-       irlmp->discovery_rsp.info_len = strlen( irlmp->discovery_rsp.info) + 2;
+       strncpy(irlmp->discovery_rsp.info, sysctl_devname, 31);
+       irlmp->discovery_rsp.info_len = strlen(irlmp->discovery_rsp.info) + 2;
 
        return &irlmp->discovery_rsp;
 }
@@ -870,17 +879,17 @@ DISCOVERY *irlmp_get_discovery_response()
  */
 void irlmp_data_request( struct lsap_cb *self, struct sk_buff *skb) 
 {
-       DEBUG( 4, __FUNCTION__ "()\n"); 
+       DEBUG(4, __FUNCTION__ "()\n"); 
 
-       ASSERT( skb != NULL, return;);
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+       ASSERT(skb != NULL, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
        
        /* Make room for MUX header */
-       ASSERT( skb_headroom( skb) >= LMP_HEADER, return;);
-       skb_push( skb, LMP_HEADER);
+       ASSERT(skb_headroom( skb) >= LMP_HEADER, return;);
+       skb_push(skb, LMP_HEADER);
 
-       irlmp_do_lsap_event( self, LM_DATA_REQUEST, skb);
+       irlmp_do_lsap_event(self, LM_DATA_REQUEST, skb);
 }
 
 /*
@@ -889,18 +898,18 @@ void irlmp_data_request( struct lsap_cb *self, struct sk_buff *skb)
  *    Got data from LAP layer so pass it up to upper layer
  *
  */
-void irlmp_data_indication( struct lsap_cb *self, struct sk_buff *skb) 
+void irlmp_data_indication(struct lsap_cb *self, struct sk_buff *skb) 
 {
-       DEBUG( 4, __FUNCTION__ "()\n"); 
+       DEBUG(4, __FUNCTION__ "()\n"); 
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
+       ASSERT(skb != NULL, return;);
 
        /* Hide LMP header from layer above */
-       skb_pull( skb, LMP_HEADER);
+       skb_pull(skb, LMP_HEADER);
 
-       if ( self->notify.data_indication)
+       if (self->notify.data_indication)
                self->notify.data_indication(self->notify.instance, self, skb);
 }
 
@@ -940,9 +949,8 @@ void irlmp_udata_indication( struct lsap_cb *self, struct sk_buff *skb)
        /* Hide LMP header from layer above */
        skb_pull( skb, LMP_HEADER);
 
-       if ( self->notify.udata_indication)
-               self->notify.udata_indication( self->notify.instance, self, 
-                                             skb);
+       if (self->notify.udata_indication)
+               self->notify.udata_indication(self->notify.instance, self, skb);
 }
 
 /*
@@ -1043,145 +1051,228 @@ __u8 *irlmp_hint_to_service(__u8 *hint)
        }
        DEBUG(1, "\n");
 
+       /* So that client can be notified about any discovery */
+       service[i++] = S_ANY;
+
        service[i] = S_END;
        
        return service;
 }
 
 /*
- * Function irlmp_service_to_hint (service, hint)
+ * Function irlmp_service_to_hint (service)
  *
- *    
+ *    Converts a service type, to a hint bit
  *
+ *    Returns: a 16 bit hint value, with the service bit set
  */
-void irlmp_service_to_hint( int service, __u8 *hint)
+__u16 irlmp_service_to_hint(int service)
 {
+       __u16_host_order hint;
+
+       hint.word = 0;
+
        switch (service) {
        case S_PNP:
-               hint[0] |= HINT_PNP;
+               hint.byte[0] |= HINT_PNP;
                break;
        case S_PDA:
-               hint[0] |= HINT_PDA;
+               hint.byte[0] |= HINT_PDA;
                break;
        case S_COMPUTER:
-               hint[0] |= HINT_COMPUTER;
+               hint.byte[0] |= HINT_COMPUTER;
                break;
        case S_PRINTER:
-               hint[0] |= HINT_PRINTER;
+               hint.byte[0] |= HINT_PRINTER;
                break;
        case S_MODEM:
-               hint[0] |= HINT_PRINTER;
+               hint.byte[0] |= HINT_PRINTER;
                break;
        case S_LAN:
-               hint[0] |= HINT_LAN;
+               hint.byte[0] |= HINT_LAN;
                break;
        case S_COMM:
-               hint[0] |= HINT_EXTENSION;
-               hint[1] |= HINT_COMM;
+               hint.byte[0] |= HINT_EXTENSION;
+               hint.byte[1] |= HINT_COMM;
                break;
        case S_OBEX:
-               hint[0] |= HINT_EXTENSION;
-               hint[1] |= HINT_OBEX;
+               hint.byte[0] |= HINT_EXTENSION;
+               hint.byte[1] |= HINT_OBEX;
+               break;
+       case S_ANY:
+               hint.word = 0xffff;
                break;
        default:
                DEBUG( 1, __FUNCTION__ "(), Unknown service!\n");
                break;
        }
+       return hint.word;
 }
 
 /*
- * Function irlmp_register (service, type, callback)
+ * Function irlmp_register_service (service)
  *
- *    Register a local client or server with IrLMP
+ *    Register local service with IrLMP
  *
  */
-void irlmp_register_layer( int service, int type, int do_discovery, 
-                          DISCOVERY_CALLBACK callback)
+__u32 irlmp_register_service(__u16 hints)
 {
-       struct irlmp_registration *entry;
+       irlmp_service_t *service;
+       __u32 handle;
 
-       sysctl_discovery |= do_discovery;
+       DEBUG(4, __FUNCTION__ "(), hints = %04x\n", hints);
 
-       if ( type & SERVER)
-               irlmp_service_to_hint( service, irlmp->hint);
+       /* Get a unique handle for this service */
+       get_random_bytes(&handle, sizeof(handle));
+       while (hashbin_find(irlmp->services, handle, NULL) || !handle)
+               get_random_bytes(&handle, sizeof(handle));
 
-       /* Check if this service has been registred before */
-       entry = hashbin_find( irlmp->registry, service, NULL);
-       if ( entry != NULL) {
-               /* Update type in entry */
-               entry->type |= type;
+       irlmp->hints.word |= hints;
 
-               /*  Update callback only if client, since servers don't 
-                *  use callbacks, and we don't want to overwrite a 
-                *  previous registred client callback
-                */
-               if ( type & CLIENT)
-                       entry->discovery_callback = callback;
-               return;
+       /* Make a new registration */
+       service = kmalloc(sizeof(irlmp_service_t), GFP_ATOMIC);
+       if (!service) {
+               DEBUG(1, __FUNCTION__ "(), Unable to kmalloc!\n");
+               return 0;
        }
+       service->hints = hints;
+       hashbin_insert(irlmp->services, (QUEUE*) service, handle, NULL);
+
+       return handle;
+}
+
+/*
+ * Function irlmp_unregister_service (handle)
+ *
+ *    Unregister service with IrLMP. 
+ *
+ *    Returns: 0 on success, -1 on error
+ */
+int irlmp_unregister_service(__u32 handle)
+{
+       irlmp_service_t *service;
+               
+       DEBUG(4, __FUNCTION__ "()\n");
+
+       if (!handle)
+               return -1;
+       service = hashbin_find(irlmp->services, handle, NULL);
+       if (!service) {
+               DEBUG(1, __FUNCTION__ "(), Unknown service!\n");
+               return -1;
+       }
+
+       service = hashbin_remove(irlmp->services, handle, NULL);
+       if (service)
+               kfree(service);
+
+       /* Remove old hint bits */
+       irlmp->hints.word = 0;
+
+       /* Refresh current hint bits */
+        service = (irlmp_service_t *) hashbin_get_first(irlmp->services);
+        while (service) {
+               irlmp->hints.word |= service->hints;
+
+                service = (irlmp_service_t *)hashbin_get_next(irlmp->services);
+        }
+       return 0;
+}
+
+/*
+ * Function irlmp_register_client (hint_mask, callback1, callback2)
+ *
+ *    Register a local client with IrLMP
+ *
+ *    Returns: handle > 0 on success, 0 on error
+ */
+__u32 irlmp_register_client(__u16 hint_mask, DISCOVERY_CALLBACK1 callback1,
+                           DISCOVERY_CALLBACK2 callback2)
+{
+       irlmp_client_t *client;
+       __u32 handle;
+
+       /* Get a unique handle for this client */
+       get_random_bytes(&handle, sizeof(handle));
+       while (hashbin_find(irlmp->clients, handle, NULL) || !handle)
+               get_random_bytes(&handle, sizeof(handle));
 
        /* Make a new registration */
-       entry = kmalloc( sizeof( struct irlmp_registration), GFP_ATOMIC);
-       if ( !entry) {
+       client = kmalloc(sizeof(irlmp_client_t), GFP_ATOMIC);
+       if (!client) {
                DEBUG( 1, __FUNCTION__ "(), Unable to kmalloc!\n");
-               return;
+
+               return 0;
        }
 
-       entry->service = service;
-       entry->type = type;
-       entry->discovery_callback = callback;
+       /* Register the details */
+       client->hint_mask = hint_mask;
+       client->callback1 = callback1;
+       client->callback2 = callback2;
+
+       hashbin_insert(irlmp->clients, (QUEUE *) client, handle, NULL);
 
-       hashbin_insert( irlmp->registry, (QUEUE*) entry, entry->service, NULL);
+       return handle;
 }
 
 /*
- * Function irlmp_unregister (serivice)
+ * Function irlmp_update_client (handle, hint_mask, callback1, callback2)
  *
- *    
+ *    Updates specified client (handle) with possibly new hint_mask and
+ *    callback
  *
+ *    Returns: 0 on success, -1 on error
  */
-void irlmp_unregister_layer( int service, int type)
+int irlmp_update_client(__u32 handle, __u16 hint_mask, 
+                       DISCOVERY_CALLBACK1 callback1, 
+                       DISCOVERY_CALLBACK2 callback2)
 {
-       struct irlmp_registration *entry;
-       DEBUG( 4, __FUNCTION__ "()\n");
-       entry = hashbin_find( irlmp->registry, service, NULL);
-       if ( entry != NULL) {
-               DEBUG( 4, "Found entry to change or remove!\n");
-               /* Remove this type from the service registration */
-               entry->type &= ~type;
-       }
+       irlmp_client_t *client;
 
-       if ( !entry) {
-               DEBUG( 1, __FUNCTION__ "Unable to find entry to unregister!\n");
-               return;
-       }
+       if (!handle)
+               return -1;
 
-       /* 
-        *  Remove entry if there is no more client and server support 
-        *  left in entry
-        */
-       if ( !entry->type) {
-               DEBUG( 4, __FUNCTION__ "(), removing entry!\n");
-               entry = hashbin_remove( irlmp->registry, service, NULL);
-               if ( entry != NULL)
-                       kfree( entry);
+       client = hashbin_find(irlmp->clients, handle, NULL);
+       if (!client) {
+               DEBUG(1, __FUNCTION__ "(), Unknown client!\n");
+               return -1;
        }
 
-       /* Remove old hint bits */
-       irlmp->hint[0] = 0;
-       irlmp->hint[1] = 0;
+       client->hint_mask = hint_mask;
+       client->callback1 = callback1;
+       client->callback2 = callback2;
+       
+       return 0;
+}
 
-       /* Refresh current hint bits */
-        entry = (struct irlmp_registration *) hashbin_get_first( irlmp->registry);
-        while( entry != NULL) {
-               if ( entry->type & SERVER)
-                       irlmp_service_to_hint( entry->service, 
-                                              irlmp->hint);
-                entry = (struct irlmp_registration *) 
-                       hashbin_get_next( irlmp->registry);
-        }
+/*
+ * Function irlmp_unregister_client (handle)
+ *
+ *    Returns: 0 on success, -1 on error
+ *
+ */
+int irlmp_unregister_client(__u32 handle)
+{
+       struct irlmp_client *client;
+       DEBUG(4, __FUNCTION__ "()\n");
+
+       if (!handle)
+               return -1;
+       client = hashbin_find(irlmp->clients, handle, NULL);
+       if (!client) {
+               DEBUG(1, __FUNCTION__ "(), Unknown client!\n");
+               return -1;
+       }
+
+       DEBUG( 4, __FUNCTION__ "(), removing client!\n");
+       client = hashbin_remove( irlmp->clients, handle, NULL);
+       if (client)
+               kfree(client);
+       
+       return 0;
 }
 
 /*
@@ -1200,20 +1291,24 @@ int irlmp_slsap_inuse( __u8 slsap_sel)
 
        DEBUG( 4, __FUNCTION__ "()\n");
 
+       /* Valid values are between 0 and 127 */
+       if (slsap_sel > 127)
+               return TRUE;
+
        /*
         *  Check if slsap is already in use. To do this we have to loop over
         *  every IrLAP connection and check every LSAP assosiated with each
         *  the connection.
         */
-       lap = ( struct lap_cb *) hashbin_get_first( irlmp->links);
-       while ( lap != NULL) {
-               ASSERT( lap->magic == LMP_LAP_MAGIC, return TRUE;);
+       lap = (struct lap_cb *) hashbin_get_first(irlmp->links);
+       while (lap != NULL) {
+               ASSERT(lap->magic == LMP_LAP_MAGIC, return TRUE;);
 
-               self = (struct lsap_cb *) hashbin_get_first( lap->lsaps);
-               while ( self != NULL) {
-                       ASSERT( self->magic == LMP_LSAP_MAGIC, return TRUE;);
+               self = (struct lsap_cb *) hashbin_get_first(lap->lsaps);
+               while (self != NULL) {
+                       ASSERT(self->magic == LMP_LSAP_MAGIC, return TRUE;);
 
-                       if (( self->slsap_sel == slsap_sel))/*  &&  */
+                       if ((self->slsap_sel == slsap_sel))/*  &&  */
 /*                         ( self->dlsap_sel == LSAP_ANY)) */
                        {
                                DEBUG( 4, "Source LSAP selector=%02x in use\n",
@@ -1236,14 +1331,28 @@ int irlmp_slsap_inuse( __u8 slsap_sel)
 __u8 irlmp_find_free_slsap(void) 
 {
        __u8 lsap_sel;
+       int wrapped = 0;
 
-       ASSERT( irlmp != NULL, return -1;);
-       ASSERT( irlmp->magic == LMP_MAGIC, return -1;);
+       ASSERT(irlmp != NULL, return -1;);
+       ASSERT(irlmp->magic == LMP_MAGIC, return -1;);
       
        lsap_sel = irlmp->free_lsap_sel++;
+       
+       /* Check if the new free lsap is really free */
+       while (irlmp_slsap_inuse(irlmp->free_lsap_sel)) {
+               irlmp->free_lsap_sel++;
 
-       DEBUG( 4, __FUNCTION__ "(), next free lsap_sel=%02x\n", lsap_sel);
+               /* Check if we need to wraparound */
+               if (irlmp->free_lsap_sel > 127) {
+                       irlmp->free_lsap_sel = 10;
 
+                       /* Make sure we terminate the loop */
+                       if (wrapped++)
+                               return 0;
+               }
+       }
+       DEBUG(4, __FUNCTION__ "(), next free lsap_sel=%02x\n", lsap_sel);
+       
        return lsap_sel;
 }
 
@@ -1289,7 +1398,7 @@ LM_REASON irlmp_convert_lap_reason( LAP_REASON lap_reason)
 
 __u32 irlmp_get_saddr(struct lsap_cb *self)
 {
-       DEBUG(0, __FUNCTION__ "()\n");
+       DEBUG(3, __FUNCTION__ "()\n");
 
        ASSERT(self != NULL, return 0;);
        ASSERT(self->lap != NULL, return 0;);
@@ -1299,7 +1408,7 @@ __u32 irlmp_get_saddr(struct lsap_cb *self)
 
 __u32 irlmp_get_daddr(struct lsap_cb *self)
 {
-       DEBUG(0, __FUNCTION__ "()\n");
+       DEBUG(3, __FUNCTION__ "()\n");
 
        ASSERT(self != NULL, return 0;);
        ASSERT(self->lap != NULL, return 0;);
index 957176f94c580be29c48afbcd73ba7e304af8132..3f61d4db0418e53a1e25688bad9d041899138482 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Thu Feb 11 01:24:21 1999
+ * Modified at:   Thu Apr  8 16:26:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -149,36 +149,37 @@ void irlmp_discovery_timer_expired( unsigned long data)
 {
 /*     struct irlmp_cb *self = ( struct irlmp_cb *) data; */
        
-       DEBUG( 4, "IrLMP, discovery timer expired!\n");
+       DEBUG(4, "IrLMP, discovery timer expired!\n");
        
-       irlmp_discovery_request( sysctl_discovery_slots);
+       if (sysctl_discovery)
+               irlmp_do_discovery(sysctl_discovery_slots);
 
        /* Restart timer */
-       irlmp_start_discovery_timer( irlmp, 300);
+       irlmp_start_discovery_timer(irlmp, 300);
 }
 
 void irlmp_watchdog_timer_expired( unsigned long data)
 {
        struct lsap_cb *self = ( struct lsap_cb *) data;
        
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(2, __FUNCTION__ "()\n");
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LSAP_MAGIC, return;);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LSAP_MAGIC, return;);
 
-       irlmp_do_lsap_event( self, LM_WATCHDOG_TIMEOUT, NULL);
+       irlmp_do_lsap_event(self, LM_WATCHDOG_TIMEOUT, NULL);
 }
 
 void irlmp_idle_timer_expired(unsigned long data)
 {
        struct lap_cb *self = (struct lap_cb *) data;
        
-       DEBUG( 0, __FUNCTION__ "()\n");
+       DEBUG(2, __FUNCTION__ "()\n");
 
        ASSERT(self != NULL, return;);
        ASSERT(self->magic == LMP_LAP_MAGIC, return;);
 
-       irlmp_do_lap_event( self, LM_LAP_IDLE_TIMEOUT, NULL);
+       irlmp_do_lap_event(self, LM_LAP_IDLE_TIMEOUT, NULL);
 }
 
 /*********************************************************************
@@ -193,8 +194,8 @@ void irlmp_idle_timer_expired(unsigned long data)
  *    STANDBY, The IrLAP connection does not exist.
  *
  */
-static void irlmp_state_standby( struct lap_cb *self, IRLMP_EVENT event, 
-                                struct sk_buff *skb)
+static void irlmp_state_standby(struct lap_cb *self, IRLMP_EVENT event, 
+                               struct sk_buff *skb)
 {      
        DEBUG( 4, __FUNCTION__ "()\n"); 
        ASSERT( self->irlap != NULL, return;);
@@ -203,11 +204,11 @@ static void irlmp_state_standby( struct lap_cb *self, IRLMP_EVENT event,
        case LM_LAP_DISCOVERY_REQUEST:
                /* irlmp_next_station_state( LMP_DISCOVER); */
                
-               irlap_discovery_request( self->irlap, &irlmp->discovery_cmd);
+               irlap_discovery_request(self->irlap, &irlmp->discovery_cmd);
                break;
        case LM_LAP_DISCOVERY_CONFIRM:
                /* irlmp_next_station_state( LMP_READY); */
-               irlmp_discovery_confirm( self, self->cachelog);
+               irlmp_discovery_confirm(irlmp->cachelog);
                break;
        case LM_LAP_CONNECT_INDICATION:
                /*  It's important to switch state first, to avoid IrLMP to 
@@ -323,11 +324,22 @@ static void irlmp_state_active( struct lap_cb *self, IRLMP_EVENT event,
                 *  notify all LSAPs using this LAP, but that should be safe to
                 *  do anyway.
                 */
-               lsap = ( struct lsap_cb *) hashbin_get_first( self->lsaps);
-               while ( lsap != NULL) {
+               lsap = (struct lsap_cb *) hashbin_get_first(self->lsaps);
+               while (lsap != NULL) {
                        irlmp_do_lsap_event(lsap, LM_LAP_CONNECT_CONFIRM, skb);
                        lsap = (struct lsap_cb*) hashbin_get_next(self->lsaps);
                }
+               
+               /* Needed by connect indication */
+               lsap = (struct lsap_cb *) hashbin_get_first(irlmp->unconnected_lsaps);
+               while (lsap != NULL) {
+                       lsap_current = lsap;
+                       
+                       /* Be sure to stay one item ahead */
+                       lsap = (struct lsap_cb*) hashbin_get_next(irlmp->unconnected_lsaps);
+                       irlmp_do_lsap_event(lsap_current, 
+                                           LM_LAP_CONNECT_CONFIRM, skb);
+               }
                /* Keep state */
                break;
        case LM_LAP_DISCONNECT_REQUEST:
@@ -394,8 +406,6 @@ static void irlmp_state_active( struct lap_cb *self, IRLMP_EVENT event,
 static void irlmp_state_disconnected( struct lsap_cb *self, IRLMP_EVENT event,
                                      struct sk_buff *skb) 
 {
-       struct lsap_cb *lsap;
-
        DEBUG( 4, __FUNCTION__ "()\n");
 
        ASSERT( self != NULL, return;);
@@ -406,31 +416,15 @@ static void irlmp_state_disconnected( struct lsap_cb *self, IRLMP_EVENT event,
                DEBUG( 4, __FUNCTION__ "(), LM_CONNECT_REQUEST\n");
                irlmp_next_lsap_state( self, LSAP_SETUP_PEND);
 
-               irlmp_do_lap_event( self->lap, LM_LAP_CONNECT_REQUEST, NULL);
+               irlmp_do_lap_event(self->lap, LM_LAP_CONNECT_REQUEST, NULL);
 
                /* Start watchdog timer ( 5 secs for now) */
-               irlmp_start_watchdog_timer( self, 500);
+               irlmp_start_watchdog_timer(self, 500);
                break;
        case LM_CONNECT_INDICATION:
-               irlmp_next_lsap_state( self, LSAP_CONNECT_PEND);
-
-               /* 
-                *  Bind this LSAP to the IrLAP link where the connect was
-                *  received 
-                *  FIXME: this should be done in the LAP state machine
-                */
-               lsap = hashbin_remove( irlmp->unconnected_lsaps, 
-                                      self->slsap_sel, NULL);
+               irlmp_next_lsap_state(self, LSAP_CONNECT_PEND);
 
-               ASSERT( lsap == self, return;);
-               
-               ASSERT( self->lap != NULL, return;);
-               ASSERT( self->lap->lsaps != NULL, return;);
-               
-               hashbin_insert( self->lap->lsaps, (QUEUE *) self, 
-                               self->slsap_sel, NULL);
-
-               irlmp_do_lap_event( self->lap, LM_LAP_CONNECT_REQUEST, skb);
+               irlmp_do_lap_event(self->lap, LM_LAP_CONNECT_REQUEST, skb);
                break;
        default:
                DEBUG( 4, __FUNCTION__ "(), Unknown event %d\n", event);
@@ -447,6 +441,7 @@ static void irlmp_state_disconnected( struct lsap_cb *self, IRLMP_EVENT event,
 static void irlmp_state_connect( struct lsap_cb *self, IRLMP_EVENT event, 
                                 struct sk_buff *skb) 
 {
+       struct lsap_cb *lsap;
 
        DEBUG( 4, __FUNCTION__ "()\n");
        
@@ -457,12 +452,27 @@ static void irlmp_state_connect( struct lsap_cb *self, IRLMP_EVENT event,
        case LM_CONNECT_RESPONSE:
                ASSERT( skb != NULL, return;);
 
-               irlmp_send_lcf_pdu( self->lap, self->dlsap_sel, 
-                                   self->slsap_sel, CONNECT_CNF, skb);
+               /* 
+                *  Bind this LSAP to the IrLAP link where the connect was
+                *  received 
+                */
+               lsap = hashbin_remove(irlmp->unconnected_lsaps, (int) self, 
+                                     NULL);
 
-               del_timer( &self->watchdog_timer);
+               ASSERT(lsap == self, return;);
+               
+               ASSERT(self->lap != NULL, return;);
+               ASSERT(self->lap->lsaps != NULL, return;);
+               
+               hashbin_insert(self->lap->lsaps, (QUEUE *) self, (int) self, 
+                              NULL);
 
-               irlmp_next_lsap_state( self, LSAP_DATA_TRANSFER_READY);
+               irlmp_send_lcf_pdu(self->lap, self->dlsap_sel, 
+                                  self->slsap_sel, CONNECT_CNF, skb);
+
+               del_timer(&self->watchdog_timer);
+
+               irlmp_next_lsap_state(self, LSAP_DATA_TRANSFER_READY);
                break;
        default:
                DEBUG( 4, __FUNCTION__ "(), Unknown event\n");
@@ -476,8 +486,8 @@ static void irlmp_state_connect( struct lsap_cb *self, IRLMP_EVENT event,
  *    CONNECT_PEND
  *
  */
-static void irlmp_state_connect_pend( struct lsap_cb *self, IRLMP_EVENT event,
-                                     struct sk_buff *skb) 
+static void irlmp_state_connect_pend(struct lsap_cb *self, IRLMP_EVENT event,
+                                    struct sk_buff *skb) 
 {
        DEBUG( 4, __FUNCTION__ "()\n");
 
@@ -489,22 +499,20 @@ static void irlmp_state_connect_pend( struct lsap_cb *self, IRLMP_EVENT event,
                /* Keep state */
                break;
        case LM_CONNECT_RESPONSE:
-               printk( KERN_WARNING 
-                       "IrLMP CONNECT-PEND, No indication issued yet\n");
+               DEBUG(0, __FUNCTION__ "(), LM_CONNECT_RESPONSE, "
+                     "no indication issued yet\n");
                /* Keep state */
                break;
        case LM_DISCONNECT_REQUEST:
-               printk( KERN_WARNING
-                       "IrLMP CONNECT-PEND, "
-                       "Not yet bound to IrLAP connection\n");
+               DEBUG(0, __FUNCTION__ "(), LM_DISCONNECT_REQUEST, "
+                     "not yet bound to IrLAP connection\n");
                /* Keep state */
                break;
        case LM_LAP_CONNECT_CONFIRM:
-               DEBUG( 4, "irlmp_state_connect_pend: LS_CONNECT_CONFIRM\n");
-               irlmp_next_lsap_state( self, LSAP_CONNECT);
-               irlmp_connect_indication( self, skb);
+               DEBUG(4, __FUNCTION__ "(), LS_CONNECT_CONFIRM\n");
+               irlmp_next_lsap_state(self, LSAP_CONNECT);
+               irlmp_connect_indication(self, skb);
                break;
-               
        default:
                DEBUG( 4, __FUNCTION__ "Unknown event %d\n", event);
                break;  
@@ -530,13 +538,13 @@ static void irlmp_state_dtr( struct lsap_cb *self, IRLMP_EVENT event,
 
        switch( event) {
        case LM_CONNECT_REQUEST:
-               printk( KERN_WARNING 
-                       "IrLMP DTR:  Error, LSAP allready connected\n");
+               DEBUG(0, __FUNCTION__ "(), LM_CONNECT_REQUEST, "
+                     "error, LSAP already connected\n");
                /* Keep state */
                break;
        case LM_CONNECT_RESPONSE:
-               printk( KERN_WARNING 
-                       "IrLMP DTR:  Error, LSAP allready connected\n");
+               DEBUG(0, __FUNCTION__ "(), LM_CONNECT_RESPONSE, " 
+                     "error, LSAP allready connected\n");
                /* Keep state */
                break;
        case LM_DISCONNECT_REQUEST:
@@ -596,7 +604,6 @@ static void irlmp_state_dtr( struct lsap_cb *self, IRLMP_EVENT event,
                irlmp_do_lap_event(self->lap, LM_LAP_DISCONNECT_REQUEST, NULL);
 
                irlmp_disconnect_indication( self, reason, skb);
-
                break;
        default:
                DEBUG( 4, __FUNCTION__ "(), Unknown event %d\n", event);
@@ -632,18 +639,19 @@ static void irlmp_state_setup( struct lsap_cb *self, IRLMP_EVENT event,
                irlmp_connect_confirm( self, skb);
                break;
        case LM_DISCONNECT_INDICATION:
-               irlmp_next_lsap_state( self, LSAP_DISCONNECTED);
+               DEBUG(0, __FUNCTION__ "(), this should never happen!!\n");
+               break;
+       case LM_LAP_DISCONNECT_INDICATION:
+               irlmp_next_lsap_state(self, LSAP_DISCONNECTED);
 
-               del_timer( &self->watchdog_timer);
+               del_timer(&self->watchdog_timer);
 
-               ASSERT( self->lap != NULL, return;);
-               ASSERT( self->lap->magic == LMP_LAP_MAGIC, return;);
+               ASSERT(self->lap != NULL, return;);
+               ASSERT(self->lap->magic == LMP_LAP_MAGIC, return;);
                
-               ASSERT(skb != NULL, return;);
-               ASSERT(skb->len > 3, return;);
-               reason = skb->data[3];
+               reason = irlmp_convert_lap_reason(self->lap->reason);
 
-               irlmp_disconnect_indication( self, reason, skb);
+               irlmp_disconnect_indication(self, reason, skb);
                break;
        case LM_WATCHDOG_TIMEOUT:
                DEBUG( 0, __FUNCTION__ "() WATCHDOG_TIMEOUT!\n");
index bf993d4902c4833a33d4c33a624fa1451d0816e1..14a9141f05f963ba1d1d26d35c576a92ff0951da 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Aug 19 02:09:59 1997
- * Modified at:   Thu Feb 18 08:48:28 1999
+ * Modified at:   Tue Apr  6 18:31:11 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>
@@ -32,6 +32,7 @@
 #include <net/irda/timer.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/irlmp_frame.h>
+#include <net/irda/discovery.h>
 
 static struct lsap_cb *irlmp_find_lsap( struct lap_cb *self, __u8 dlsap, 
                                        __u8 slsap, int status, hashbin_t *);
@@ -123,32 +124,32 @@ void irlmp_link_data_indication( struct lap_cb *self, int reliable,
         *  Check if this is an incoming connection, since we must deal with
         *  it in a different way than other established connections.
         */
-       if (( fp[0] & CONTROL_BIT) && ( fp[2] == CONNECT_CMD)) {
-               DEBUG( 4,"Incoming connection, source LSAP=%d, dest LSAP=%d\n",
-                      slsap_sel, dlsap_sel);
+       if ((fp[0] & CONTROL_BIT) && ( fp[2] == CONNECT_CMD)) {
+               DEBUG(3,"Incoming connection, source LSAP=%d, dest LSAP=%d\n",
+                     slsap_sel, dlsap_sel);
                
                /* Try to find LSAP among the unconnected LSAPs */
-               lsap = irlmp_find_lsap( self, dlsap_sel, slsap_sel, 
-                                       CONNECT_CMD, irlmp->unconnected_lsaps);
+               lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, CONNECT_CMD,
+                                      irlmp->unconnected_lsaps);
                
                /* Maybe LSAP was already connected, so try one more time */
-               if ( !lsap)
-                    lsap = irlmp_find_lsap( self, dlsap_sel, slsap_sel, 0,
-                                            self->lsaps);
+               if (!lsap)
+                       lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, 0,
+                                              self->lsaps);
        } else
-               lsap = irlmp_find_lsap( self, dlsap_sel, slsap_sel, 0, 
-                                       self->lsaps);
+               lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, 0, 
+                                      self->lsaps);
        
-       if ( lsap == NULL) {
-               DEBUG( 0, "IrLMP, Sorry, no LSAP for received frame!\n");
-               DEBUG( 0, __FUNCTION__ 
-                      "(), slsap_sel = %02x, dlsap_sel = %02x\n", slsap_sel, 
-                      dlsap_sel);
-               if ( fp[0] & CONTROL_BIT) {
-                       DEBUG( 0, __FUNCTION__ 
-                              "(), received control frame %02x\n", fp[2]);
+       if (lsap == NULL) {
+               DEBUG(0, "IrLMP, Sorry, no LSAP for received frame!\n");
+               DEBUG(0, __FUNCTION__ 
+                     "(), slsap_sel = %02x, dlsap_sel = %02x\n", slsap_sel, 
+                     dlsap_sel);
+               if (fp[0] & CONTROL_BIT) {
+                       DEBUG(0, __FUNCTION__ 
+                             "(), received control frame %02x\n", fp[2]);
                } else {
-                       DEBUG( 0, __FUNCTION__ "(), received data frame\n");
+                       DEBUG(0, __FUNCTION__ "(), received data frame\n");
                }
                dev_kfree_skb( skb);
                return;
@@ -157,19 +158,19 @@ void irlmp_link_data_indication( struct lap_cb *self, int reliable,
        /* 
         *  Check if we received a control frame? 
         */
-       if ( fp[0] & CONTROL_BIT) {
-               switch( fp[2]) {
+       if (fp[0] & CONTROL_BIT) {
+               switch(fp[2]) {
                case CONNECT_CMD:
                        lsap->lap = self;
-                       irlmp_do_lsap_event( lsap, LM_CONNECT_INDICATION, skb);
+                       irlmp_do_lsap_event(lsap, LM_CONNECT_INDICATION, skb);
                        break;
                case CONNECT_CNF:
-                       irlmp_do_lsap_event( lsap, LM_CONNECT_CONFIRM, skb);
+                       irlmp_do_lsap_event(lsap, LM_CONNECT_CONFIRM, skb);
                        break;
                case DISCONNECT:
                        DEBUG( 4, __FUNCTION__ "(), Disconnect indication!\n");
-                       irlmp_do_lsap_event( lsap, LM_DISCONNECT_INDICATION, 
-                                            skb);
+                       irlmp_do_lsap_event(lsap, LM_DISCONNECT_INDICATION, 
+                                           skb);
                        break;
                case ACCESSMODE_CMD:
                        DEBUG( 0, "Access mode cmd not implemented!\n");
@@ -182,10 +183,10 @@ void irlmp_link_data_indication( struct lap_cb *self, int reliable,
                               "(), Unknown control frame %02x\n", fp[2]);
                        break;
                }
-       } else if ( reliable == LAP_RELIABLE) {
+       } else if (reliable == LAP_RELIABLE) {
                /* Must be pure data */
                irlmp_do_lsap_event( lsap, LM_DATA_INDICATION, skb);
-       } else if ( reliable == LAP_UNRELIABLE) {
+       } else if (reliable == LAP_UNRELIABLE) {
                irlmp_do_lsap_event( lsap, LM_UDATA_INDICATION, skb);
        }
 }
@@ -207,6 +208,7 @@ void irlmp_link_disconnect_indication(struct lap_cb *lap,
        ASSERT(lap->magic == LMP_LAP_MAGIC, return;);
 
        lap->reason = reason;
+       lap->daddr = DEV_ADDR_ANY;
 
         /* FIXME: must do something with the userdata if any */
 
@@ -259,6 +261,24 @@ void irlmp_link_connect_confirm( struct lap_cb *self, struct qos_info *qos,
        irlmp_do_lap_event( self, LM_LAP_CONNECT_CONFIRM, NULL);
 }
 
+/*
+ * Function irlmp_link_discovery_indication (self, log)
+ *
+ *    Device is discovering us
+ *
+ */
+void irlmp_link_discovery_indication(struct lap_cb *self, 
+                                    discovery_t *discovery)
+{
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LAP_MAGIC, return;);
+
+       irlmp_add_discovery(irlmp->cachelog, discovery);
+
+       /* Just handle it the same way as a discovery confirm */
+       irlmp_do_lap_event(self, LM_LAP_DISCOVERY_CONFIRM, NULL);
+}
+
 /*
  * Function irlmp_link_discovery_confirm (self, log)
  *
@@ -267,54 +287,22 @@ void irlmp_link_connect_confirm( struct lap_cb *self, struct qos_info *qos,
  *    was unable to carry out the discovery request
  *
  */
-void irlmp_link_discovery_confirm( struct lap_cb *self, hashbin_t *log)
+void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log)
 {
-/*     DISCOVERY *discovery; */
-       hashbin_t *old_log;
-
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == LMP_LAP_MAGIC, return;);
+       DEBUG(4, __FUNCTION__ "()\n");
 
-       ASSERT( self->cachelog != NULL, return;);
-
-       /*
-        *  If log is missing this means that IrLAP was unable to perform the
-        *  discovery, so restart discovery again with just the half timeout
-        *  of the normal one.
-        */
-       if ( !log) {
-               irlmp_start_discovery_timer( irlmp, 150);
-               return;
-       }
-
-#if 0
-       discovery = hashbin_remove_first( log);
-       while ( discovery) {
-               DEBUG( 0, __FUNCTION__ "(), found %s\n", discovery->info);
-
-               /* Remove any old discovery of this device */
-               hashbin_remove( self->cachelog, discovery->daddr, NULL);
-
-               /* Insert the new one */
-               hashbin_insert( self->cachelog, (QUEUE *) discovery, 
-                               discovery->daddr, NULL);
-
-               discovery = hashbin_remove_first( log);
-       }
-#endif
-       old_log = self->cachelog;
-       self->cachelog = log;
-       hashbin_delete( old_log, (FREE_FUNC) kfree);
+       ASSERT(self != NULL, return;);
+       ASSERT(self->magic == LMP_LAP_MAGIC, return;);
+       
+       irlmp_add_discovery_log(irlmp->cachelog, log);
       
-       irlmp_do_lap_event( self, LM_LAP_DISCOVERY_CONFIRM, NULL);
+       irlmp_do_lap_event(self, LM_LAP_DISCOVERY_CONFIRM, NULL);
 
        DEBUG( 4, __FUNCTION__ "() -->\n");
 }
 
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-__inline__ void irlmp_update_cache( struct lsap_cb *self)
+inline void irlmp_update_cache(struct lsap_cb *self)
 {
        /* Update cache entry */
        irlmp->cache.dlsap_sel = self->dlsap_sel;
@@ -330,9 +318,9 @@ __inline__ void irlmp_update_cache( struct lsap_cb *self)
  *    Find handle assosiated with destination and source LSAP
  *
  */
-static struct lsap_cb *irlmp_find_lsap( struct lap_cb *self, __u8 dlsap_sel,
-                                       __u8 slsap_sel, int status,
-                                       hashbin_t *queue) 
+static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
+                                      __u8 slsap_sel, int status,
+                                      hashbin_t *queue) 
 {
        struct lsap_cb *lsap;
        
@@ -345,17 +333,14 @@ static struct lsap_cb *irlmp_find_lsap( struct lap_cb *self, __u8 dlsap_sel,
         *  cache first to avoid the linear search
         */
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-       ASSERT( irlmp != NULL, return NULL;);
-
        if (( irlmp->cache.valid) && 
            ( irlmp->cache.slsap_sel == slsap_sel) && 
            ( irlmp->cache.dlsap_sel == dlsap_sel)) 
        {
-               DEBUG( 4, __FUNCTION__ "(), Using cached LSAP\n");
-               return ( irlmp->cache.lsap);
-       }       
+               return (irlmp->cache.lsap);
+       }
 #endif
-       lsap = ( struct lsap_cb *) hashbin_get_first( queue);
+       lsap = ( struct lsap_cb *) hashbin_get_first(queue);
        while ( lsap != NULL) {
                /* 
                 *  If this is an incomming connection, then the destination 
@@ -372,7 +357,7 @@ static struct lsap_cb *irlmp_find_lsap( struct lap_cb *self, __u8 dlsap_sel,
                        lsap->dlsap_sel = dlsap_sel;
                        
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-                       irlmp_update_cache( lsap);
+                       irlmp_update_cache(lsap);
 #endif
                        return lsap;
                }
index bb3081a9c21501691348843edecd048db097dd73..ba8150d06788fc601c6ce43d807c317993b9a66a 100644 (file)
 #include <linux/miscdevice.h>
 #include <linux/proc_fs.h>
 
-int  irlpt_client_init(void);
-static void irlpt_client_cleanup(void);
+int irlpt_client_init(void);
 static void irlpt_client_close(struct irlpt_cb *self);
 
-static void irlpt_client_discovery_indication( DISCOVERY *);
+static void irlpt_client_discovery_indication(discovery_t *);
 
-static void irlpt_client_connect_confirm( void *instance, 
-                                         void *sap, 
-                                         struct qos_info *qos, 
-                                         int max_seg_size, 
-                                         struct sk_buff *skb);
-static void irlpt_client_disconnect_indication( void *instance, 
-                                               void *sap, 
+static void irlpt_client_connect_confirm(void *instance, void *sap, 
+                                        struct qos_info *qos, 
+                                        __u32 max_seg_size, 
+                                        struct sk_buff *skb);
+static void irlpt_client_disconnect_indication( void *instance, void *sap, 
                                                LM_REASON reason,
                                                struct sk_buff *userdata);
 static void irlpt_client_expired(unsigned long data);
@@ -65,6 +62,8 @@ static char *rcsid = "$Id: irlpt_client.c,v 1.10 1998/11/10 22:50:57 dagb Exp $"
 #endif
 static char *version = "IrLPT client, v2 (Thomas Davis)";
 
+static __u32 ckey; /* IrLMP client handle */
+
 struct file_operations client_fops = {
        irlpt_seek,    /* seek */
        NULL,          /* read_irlpt (server) */
@@ -177,6 +176,8 @@ extern struct proc_dir_entry proc_irda;
  */
 __initfunc(int irlpt_client_init(void))
 {
+       __u16 hints;
+       
        DEBUG( irlpt_client_debug, "--> "__FUNCTION__ "\n");
 
        printk( KERN_INFO "%s\n", version);
@@ -187,9 +188,9 @@ __initfunc(int irlpt_client_init(void))
                        "IrLPT client: Can't allocate hashbin!\n");
                return -ENOMEM;
        }
-
-       irlmp_register_layer( S_PRINTER, CLIENT, TRUE, 
-                             irlpt_client_discovery_indication);
+       hints = irlmp_service_to_hint(S_PRINTER);
+       ckey = irlmp_register_client(hints, irlpt_client_discovery_indication,
+                                    NULL);
 
 #ifdef CONFIG_PROC_FS
        proc_register( &proc_irda, &proc_irlpt_client);
@@ -210,7 +211,7 @@ static void irlpt_client_cleanup(void)
 {
        DEBUG( irlpt_client_debug, "--> "__FUNCTION__ "\n");
 
-       irlmp_unregister_layer( S_PRINTER, CLIENT);
+       irlmp_unregister_client(ckey);
 
        /*
         *  Delete hashbin and close all irlpt client instances in it
@@ -232,6 +233,7 @@ static void irlpt_client_cleanup(void)
  */
 static struct irlpt_cb *irlpt_client_open( __u32 daddr)
 {
+       struct irmanager_event mgr_event;
        struct irlpt_cb *self;
 
        DEBUG( irlpt_client_debug, "--> "__FUNCTION__ "\n");
@@ -251,7 +253,6 @@ static struct irlpt_cb *irlpt_client_open( __u32 daddr)
                        hashbin_get_size(irlpt_clients));
 
                hashbin_insert( irlpt_clients, (QUEUE *) self, daddr, NULL);
-
        }
 
        self->ir_dev.minor = MISC_DYNAMIC_MINOR;
@@ -270,6 +271,11 @@ static struct irlpt_cb *irlpt_client_open( __u32 daddr)
 
        irlpt_client_next_state( self, IRLPT_CLIENT_IDLE);
 
+       /* Tell irmanager to create /dev/irlpt<X> */
+       mgr_event.event = EVENT_IRLPT_START;
+       sprintf(mgr_event.devname, "%s", self->ifname);
+       irmanager_notify(&mgr_event);
+
        MOD_INC_USE_COUNT;
 
        DEBUG( irlpt_client_debug, __FUNCTION__ " -->\n");
@@ -284,6 +290,7 @@ static struct irlpt_cb *irlpt_client_open( __u32 daddr)
  */
 static void irlpt_client_close( struct irlpt_cb *self)
 {
+       struct irmanager_event mgr_event;
        struct sk_buff *skb;
 
        DEBUG( irlpt_client_debug, "--> " __FUNCTION__ "\n");
@@ -291,6 +298,11 @@ static void irlpt_client_close( struct irlpt_cb *self)
        ASSERT( self != NULL, return;);
        ASSERT( self->magic == IRLPT_MAGIC, return;);
 
+       /* Tell irmanager to remove /dev/irlpt<X> */
+       mgr_event.event = EVENT_IRLPT_STOP;
+       sprintf(mgr_event.devname, "%s", self->ifname);
+       irmanager_notify(&mgr_event);
+
        while (( skb = skb_dequeue(&self->rx_queue)) != NULL) {
                DEBUG(irlpt_client_debug, 
                      __FUNCTION__ ": freeing SKB\n");
@@ -312,7 +324,7 @@ static void irlpt_client_close( struct irlpt_cb *self)
  *    device it is, and which services it has.
  *
  */
-static void irlpt_client_discovery_indication( DISCOVERY *discovery)
+static void irlpt_client_discovery_indication(discovery_t *discovery)
 {
        struct irlpt_info info;
        struct irlpt_cb *self;
@@ -409,10 +421,10 @@ static void irlpt_client_disconnect_indication( void *instance,
  *
  *    LSAP connection confirmed!
  */
-static void irlpt_client_connect_confirm( void *instance, void *sap, 
-                                         struct qos_info *qos, 
-                                         int max_sdu_size,
-                                         struct sk_buff *skb)
+static void irlpt_client_connect_confirm(void *instance, void *sap, 
+                                        struct qos_info *qos, 
+                                        __u32 max_sdu_size,
+                                        struct sk_buff *skb)
 {
        struct irlpt_info info;
        struct irlpt_cb *self;
@@ -455,20 +467,20 @@ static void irlpt_client_connect_confirm( void *instance, void *sap,
  *    This function gets the data that is received on the data channel
  *
  */
-static void irlpt_client_data_indication( void *instance, void *sap, 
-                                         struct sk_buff *skb) 
+static int irlpt_client_data_indication(void *instance, void *sap, 
+                                       struct sk_buff *skb) 
 {
        struct irlpt_cb *self;
 
        DEBUG( irlpt_client_debug, "--> " __FUNCTION__ "\n");
 
-       ASSERT( skb != NULL, return;);
+       ASSERT( skb != NULL, return -1;);
        DEBUG( irlpt_client_debug, __FUNCTION__ ": len=%d\n", (int) skb->len);
 
        self = ( struct irlpt_cb *) instance;
 
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRLPT_MAGIC, return;);
+       ASSERT( self != NULL, return -1;);
+       ASSERT( self->magic == IRLPT_MAGIC, return -1;);
 #if 1
        {
                int i;
@@ -496,6 +508,8 @@ static void irlpt_client_data_indication( void *instance, void *sap,
 /*     } */
 
        DEBUG( irlpt_client_debug, __FUNCTION__ " -->\n");
+
+       return 0;
 }
 
 /*
index a365ef5b43166bc5e5ae6673efb9e71ddae5f32a..ec7339e0e531b0c578670ace1623809f24aa5d5d 100644 (file)
@@ -48,27 +48,25 @@ static int irlpt_server_proc_read(char *buf, char **start, off_t offset,
 #endif /* CONFIG_PROC_FS */
 
 int irlpt_server_init(void);
-static void irlpt_server_cleanup(void);
-static void irlpt_server_disconnect_indication( void *instance, 
-                                               void *sap, 
+static void irlpt_server_disconnect_indication(void *instance, void *sap, 
                                                LM_REASON reason,
                                                struct sk_buff *skb);
-static void irlpt_server_connect_confirm( void *instance, 
-                                         void *sap, 
-                                         struct qos_info *qos,  
-                                         int max_seg_size,
-                                         struct sk_buff *skb);
-static void irlpt_server_connect_indication( void *instance, 
-                                            void *sap, 
-                                            struct qos_info *qos, 
-                                            int max_seg_size,
-                                            struct sk_buff *skb);
-static void irlpt_server_data_indication( void *instance, 
-                                         void *sap, 
-                                         struct sk_buff *skb);
+static void irlpt_server_connect_confirm(void *instance, void *sap, 
+                                        struct qos_info *qos,  
+                                        __u32 max_seg_size,
+                                        struct sk_buff *skb);
+static void irlpt_server_connect_indication(void *instance, 
+                                           void *sap, 
+                                           struct qos_info *qos, 
+                                           __u32 max_seg_size,
+                                           struct sk_buff *skb);
+static int irlpt_server_data_indication(void *instance, void *sap, 
+                                       struct sk_buff *skb);
 static void register_irlpt_server(void);
 static void deregister_irlpt_server(void);
 
+static __u32 skey; /* IrLMP service handle */
+
 int irlpt_server_lsap = LSAP_IRLPT;
 int irlpt_server_debug = 4;
 
@@ -183,6 +181,8 @@ struct proc_dir_entry proc_irlpt_server = {
 /*int irlpt_init( struct device *dev) {*/
 __initfunc(int irlpt_server_init(void))
 {
+       __u16 hints;
+
        DEBUG( irlpt_server_debug, "--> " __FUNCTION__ "\n");
 
        printk( KERN_INFO "%s\n", version);
@@ -195,7 +195,6 @@ __initfunc(int irlpt_server_init(void))
                        " irlpt_server control block!\n");
                return -ENOMEM;
        }
-
        memset( irlpt_server, 0, sizeof(struct irlpt_cb));
 
        sprintf(irlpt_server->ifname, "irlpt_server");
@@ -210,7 +209,8 @@ __initfunc(int irlpt_server_init(void))
 
        skb_queue_head_init(&irlpt_server->rx_queue);
 
-       irlmp_register_layer( S_PRINTER, SERVER, FALSE, NULL);
+       hints = irlmp_service_to_hint(S_PRINTER);
+       skey = irlmp_register_service(hints);
        
        register_irlpt_server();
 
@@ -235,12 +235,11 @@ static void irlpt_server_cleanup(void)
 
        DEBUG( irlpt_server_debug, "--> " __FUNCTION__ "\n");
 
+       irlmp_unregister_service(skey);
        deregister_irlpt_server();
 
        while (( skb = skb_dequeue(&irlpt_server->rx_queue)) != NULL) {
                DEBUG(irlpt_server_debug, __FUNCTION__ ": freeing SKB\n");
-                IS_SKB( skb, return;);
-                FREE_SKB_MAGIC( skb);
                 dev_kfree_skb( skb);
        }
 
@@ -307,11 +306,11 @@ static void irlpt_server_disconnect_indication( void *instance,
  *
  *    LSAP connection confirmed!
  */
-static void irlpt_server_connect_confirm( void *instance, 
-                                         void *sap, 
-                                         struct qos_info *qos,
-                                         int max_seg_size,
-                                         struct sk_buff *skb)
+static void irlpt_server_connect_confirm(void *instance, 
+                                        void *sap, 
+                                        struct qos_info *qos,
+                                        __u32 max_seg_size,
+                                        struct sk_buff *skb)
 {
        struct irlpt_cb *self;
 
@@ -332,11 +331,11 @@ static void irlpt_server_connect_confirm( void *instance,
  * Function irlpt_connect_indication (handle)
  *
  */
-static void irlpt_server_connect_indication( void *instance, 
-                                            void *sap, 
-                                            struct qos_info *qos, 
-                                            int max_seg_size,
-                                            struct sk_buff *skb)
+static void irlpt_server_connect_indication(void *instance, 
+                                           void *sap, 
+                                           struct qos_info *qos, 
+                                           __u32 max_seg_size,
+                                           struct sk_buff *skb)
 {
        struct irlpt_cb *self;
        struct irlpt_info info;
@@ -368,21 +367,19 @@ static void irlpt_server_connect_indication( void *instance,
  *    This function gets the data that is received on the data channel
  *
  */
-static void irlpt_server_data_indication( void *instance, 
-                                         void *sap, 
-                                         struct sk_buff *skb) 
+static int irlpt_server_data_indication(void *instance, void *sap, 
+                                       struct sk_buff *skb) 
 {
-
        struct irlpt_cb *self;
 
        DEBUG( irlpt_server_debug, "--> " __FUNCTION__ "\n");
 
        self = ( struct irlpt_cb *) instance;
             
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IRLPT_MAGIC, return;);
+       ASSERT( self != NULL, return -1;);
+       ASSERT( self->magic == IRLPT_MAGIC, return -1;);
 
-       ASSERT( skb != NULL, return;);
+       ASSERT( skb != NULL, return -1;);
 
        DEBUG( irlpt_server_debug, __FUNCTION__ ": len=%d\n", (int) skb->len);
 
@@ -394,6 +391,8 @@ static void irlpt_server_data_indication( void *instance,
         wake_up_interruptible(&self->read_wait);
 
        DEBUG( irlpt_server_debug, __FUNCTION__ " -->\n");
+       
+       return 0;
 }
 
 /*
@@ -484,14 +483,15 @@ MODULE_PARM(irlpt_server_fsm_debug, "1i");
  */
 int init_module(void)
 {
+       int ret;
 
         DEBUG( irlpt_server_debug, "--> IrLPT server: init_module\n");
 
-        irlpt_server_init();
+        ret = irlpt_server_init();
 
         DEBUG( irlpt_server_debug, "IrLPT server: init_module -->\n");
 
-        return 0;
+        return ret;
 }
 
 /*
index fede19a63385db97aa7937b17434dbee091ee52c..ba49eb3a5310ac3375abe5acc2c5aa7f63ccf232 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Dec 15 13:55:39 1997
- * Modified at:   Thu Feb 18 08:51:50 1999
+ * Modified at:   Mon Mar 29 09:06:52 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1997 Dag Brattli, All Rights Reserved.
@@ -62,7 +62,6 @@ extern void irda_proto_init(struct net_proto *pro);
 extern void irda_proto_cleanup(void);
 
 extern int irda_device_init(void);
-extern int irobex_init(void);
 extern int irlan_init(void);
 extern int irlan_client_init(void);
 extern int irlan_server_init(void);
@@ -71,6 +70,12 @@ extern int irvtd_init(void);
 extern int irlpt_client_init(void);
 extern int irlpt_server_init(void);
 
+#ifdef CONFIG_IRDA_COMPRESSION
+#ifdef CONFIG_IRDA_DEFLATE
+extern irda_deflate_init();
+#endif /* CONFIG_IRDA_DEFLATE */
+#endif /* CONFIG_IRDA_COMPRESSION */
+
 static int irda_open(struct inode * inode, struct file *file);
 static int irda_ioctl(struct inode *inode, struct file *filp, 
                      unsigned int cmd, unsigned long arg);
@@ -132,8 +137,12 @@ EXPORT_SYMBOL(irias_new_octseq_value);
 
 /* IrLMP */
 EXPORT_SYMBOL(irlmp_discovery_request);
-EXPORT_SYMBOL(irlmp_register_layer);
-EXPORT_SYMBOL(irlmp_unregister_layer);
+EXPORT_SYMBOL(irlmp_register_client);
+EXPORT_SYMBOL(irlmp_unregister_client);
+EXPORT_SYMBOL(irlmp_update_client);
+EXPORT_SYMBOL(irlmp_register_service);
+EXPORT_SYMBOL(irlmp_unregister_service);
+EXPORT_SYMBOL(irlmp_service_to_hint);
 EXPORT_SYMBOL(irlmp_data_request);
 EXPORT_SYMBOL(irlmp_open_lsap);
 EXPORT_SYMBOL(irlmp_close_lsap);
@@ -179,7 +188,7 @@ EXPORT_SYMBOL(irtty_unregister_dongle);
 
 __initfunc(int irda_init(void))
 {
-        printk(KERN_INFO "Linux-2.2 Support for the IrDA (tm) Protocols (Dag Brattli)\n");
+        printk(KERN_INFO "IrDA (tm) Protocols for Linux-2.2 (Dag Brattli)\n");
 
        irlmp_init();
        irlap_init();
@@ -209,9 +218,6 @@ __initfunc(int irda_init(void))
 #ifdef CONFIG_IRLAN
        irlan_init();
 #endif
-#ifdef CONFIG_IROBEX
-       irobex_init();
-#endif
 #ifdef CONFIG_IRCOMM
        ircomm_init();
        irvtd_init();
@@ -234,12 +240,7 @@ __initfunc(int irda_init(void))
        return 0;
 }
 
-/* 
- * FIXME:
- * This function should have been wrapped with #ifdef MODULE, but then
- * irda_proto_cleanup() must be moved from af_irda.c to this file since
- * that function must also be wrapped if this one is.
- */
+#ifdef MODULE
 void irda_cleanup(void)
 {
        misc_deregister( &irda.dev);
@@ -263,6 +264,7 @@ void irda_cleanup(void)
        /* Remove middle layer */
        irlmp_cleanup();
 }
+#endif /* MODULE */
 
 /*
  * Function irda_lock (lock)
@@ -505,6 +507,20 @@ static u_int irda_poll( struct file *file, poll_table *wait)
        return 0;
 }
 
+void irda_mod_inc_use_count(void)
+{
+#ifdef MODULE
+       MOD_INC_USE_COUNT;
+#endif
+}
+
+void irda_mod_dec_use_count(void)
+{
+#ifdef MODULE
+       MOD_DEC_USE_COUNT;
+#endif
+}
+
 #ifdef MODULE
 #ifdef CONFIG_PROC_FS
 void irda_proc_modcount(struct inode *inode, int fill)
@@ -543,5 +559,4 @@ void cleanup_module(void)
 {
        irda_proto_cleanup();
 }
-
-#endif
+#endif /* MODULE */
diff --git a/net/irda/irobex/Config.in b/net/irda/irobex/Config.in
deleted file mode 100644 (file)
index 7e6f71b..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-
-dep_tristate 'IrOBEX protocol' CONFIG_IROBEX $CONFIG_IRDA
-
diff --git a/net/irda/irobex/Makefile b/net/irda/irobex/Makefile
deleted file mode 100644 (file)
index 1b02893..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Makefile for the Linux IrDA IrOBEX protocol layer.
-#
-# Note! Dependencies are done automagically by 'make dep', which also
-# removes any old dependencies. DON'T put your own dependencies here
-# unless it's something special (ie not a .c file).
-#
-# Note 2! The CFLAGS definition is now in the main makefile...
-
-#O_TARGET :=
-O_OBJS  := irobex.o
-M_OBJS   := irobex.o
-
-OX_OBJS  += 
-
-include $(TOPDIR)/Rules.make
-
-tar:
-               tar -cvf /dev/f1 .
diff --git a/net/irda/irobex/irobex.c b/net/irda/irobex/irobex.c
deleted file mode 100644 (file)
index 6916be4..0000000
+++ /dev/null
@@ -1,1170 +0,0 @@
-/*********************************************************************
- *                
- * Filename:      irobex.c
- * Version:       0.4
- * Description:   Kernel side of the IrOBEX layer
- * Status:        Experimental.
- * Author:        Dag Brattli <dagb@cs.uit.no>
- * Created at:    Thu Jun 25 21:21:07 1998
- * Modified at:   Mon Feb  8 09:05:01 1999
- * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1998 Dag Brattli, All Rights Reserved.
- *      
- *     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.
- *  
- *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
- *     provided "AS-IS" and at no charge.
- *
- ********************************************************************/
-
-#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/miscdevice.h>
-#include <linux/fs.h>
-#include <linux/proc_fs.h>
-#include <linux/ioctl.h>
-#include <linux/init.h>
-
-#include <asm/byteorder.h>
-#include <asm/segment.h>
-#include <asm/uaccess.h>
-#include <linux/poll.h>
-
-#include <net/irda/irttp.h>
-#include <net/irda/irias_object.h>
-#include <net/irda/iriap.h>
-
-#include <net/irda/irobex.h>
-
-/*
- *  Master structure, only one instance for now!!
- */
-struct irobex_cb *irobex;
-
-extern char *lmp_reasons[];
-
-char *irobex_state[] = {
-       "OBEX_IDLE",
-       "OBEX_DISCOVER",
-       "OBEX_QUERY",
-       "OBEX_CONN",
-       "OBEX_DATA",
-};
-
-static void   irobex_cleanup(void);
-/* static struct irobex_cb *irobex_open(void); */
-/* static void   irobex_close( struct irobex_cb *self); */
-
-static void irobex_data_indication( void *instance, void *sap, 
-                                   struct sk_buff *skb);
-static void irobex_disconnect_indication( void *instance, void *sap, 
-                                         LM_REASON reason, 
-                                         struct sk_buff *skb);
-static void irobex_disconnect_request( struct irobex_cb *self);
-static int irobex_connect_request(struct irobex_cb *self);
-static void irobex_connect_confirm( void *instance, void *sap, 
-                                   struct qos_info *qos,
-                                   int max_sdu_size, struct sk_buff *skb);
-static void irobex_discovery_indication( DISCOVERY *discovery);
-static void irobex_flow_indication( void *instance, void *sap, 
-                                   LOCAL_FLOW flow);
-static void irobex_get_value_confirm(__u16 obj_id, struct ias_value *value, 
-                                    void *priv);
-static void irobex_register_server( struct irobex_cb *self);
-static int irobex_ioctl( struct inode *inode, struct file *filp, 
-                        unsigned int cmd, unsigned long arg);
-static int irobex_dev_open( struct inode * inode, struct file *file);
-static int irobex_dev_close( struct inode *inode, struct file *file);
-static ssize_t irobex_read( struct file *file, char *buffer, size_t count, 
-                           loff_t *noidea);
-static ssize_t irobex_write( struct file *file, const char *buffer,
-                            size_t count, loff_t *noidea);
-static loff_t irobex_seek( struct file *, loff_t, int);
-static u_int irobex_poll( struct file *file, poll_table *wait);
-static int irobex_fasync( int, struct file *, int);
-
-static struct file_operations irobex_fops = {
-       irobex_seek,    /* seek */
-       irobex_read,
-       irobex_write,
-       NULL,           /* readdir */
-       irobex_poll,    /* poll */
-       irobex_ioctl,   /* ioctl */
-       NULL,           /* mmap */
-       irobex_dev_open,
-       NULL,
-       irobex_dev_close,
-       NULL,
-       irobex_fasync,
-};
-
-#ifdef CONFIG_PROC_FS
-static int irobex_proc_read( char *buf, char **start, off_t offset, 
-                            int len, int unused);
-
-extern struct proc_dir_entry proc_irda;
-
-struct proc_dir_entry proc_irobex = {
-       0, 6, "irobex",
-       S_IFREG | S_IRUGO, 1, 0, 0,
-       0, NULL,
-       &irobex_proc_read,
-};
-#endif
-
-/*
- * Function irobex_init (dev)
- *
- *   Initializes the irobex control structure, and registers as a misc
- *   device
- *
- */
-__initfunc(int irobex_init(void))
-{
-       struct irmanager_event mgr_event;
-       struct irobex_cb *self;
-
-       self = kmalloc(sizeof(struct irobex_cb), GFP_ATOMIC);
-       if ( self == NULL)
-               return -ENOMEM;
-       
-       memset( self, 0, sizeof(struct irobex_cb));
-       sprintf( self->devname, "irobex%d", 0); /* Just one instance for now */
-       
-       self->magic = IROBEX_MAGIC;
-       self->rx_flow = self->tx_flow = FLOW_START;
-       
-       self->dev.minor = MISC_DYNAMIC_MINOR;
-       self->dev.name = "irobex";
-       self->dev.fops = &irobex_fops;
-       
-       skb_queue_head_init( &self->rx_queue);
-       init_timer( &self->watchdog_timer);
-
-       irobex = self;
-       
-       misc_register( &self->dev);
-
-#ifdef CONFIG_PROC_FS
-       proc_register( &proc_irda, &proc_irobex);
-#endif /* CONFIG_PROC_FS */
-               
-       irlmp_register_layer( S_OBEX, CLIENT | SERVER, TRUE, 
-                             irobex_discovery_indication);
-
-/*     mgr_event.event = EVENT_IROBEX_INIT; */
-/*     sprintf( mgr_event.devname, "%s", self->devname); */
-/*     irmanager_notify( &mgr_event); */
-       
-       return 0;
-}
-
-/*
- * Function irobex_cleanup (void)
- *
- *     Removes the IrOBEX layer
- *
- */
-#ifdef MODULE
-static void irobex_cleanup(void)
-{
-       struct sk_buff *skb;
-       struct irobex_cb *self;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       self = irobex;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);  
-
-       /*
-        *  Deregister client and server
-        */
-       irlmp_unregister_layer( S_OBEX, CLIENT | SERVER);
-
-       if ( self->tsap) {
-               irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
-               irttp_close_tsap( self->tsap);
-               self->tsap = NULL;
-       }
-
-       /* Stop timers */
-       del_timer( &self->watchdog_timer);
-
-       /*
-        *  Deallocate buffers
-        */
-       while (( skb = skb_dequeue( &self->rx_queue)) != NULL)
-               dev_kfree_skb( skb);
-
-#ifdef CONFIG_PROC_FS
-       proc_unregister( &proc_irda, proc_irobex.low_ino);
-#endif
-       
-       misc_deregister( &self->dev);
-       
-       kfree( self);   
-}
-#endif /* MODULE */
-
-/*
- * Function irobex_read (inode, file, buffer, count)
- *
- *    User process wants to read some data
- *
- */
-static ssize_t irobex_read( struct file *file, char *buffer, size_t count, 
-                           loff_t *noidea)
-{
-       int len=0;
-       struct irobex_cb *self;
-       struct sk_buff *skb = NULL;
-       int ret;
-       
-       self = irobex;
-
-       ASSERT( self != NULL, return -EIO;);
-       ASSERT( self->magic == IROBEX_MAGIC, return -EIO;);
-  
-       DEBUG( 4, __FUNCTION__ ": count=%d, skb_len=%d, state=%s, eof=%d\n", 
-              count, skb_queue_len( &self->rx_queue), 
-              irobex_state[self->state], self->eof);
-
-       if ( self->state != OBEX_DATA) {
-               DEBUG( 0, __FUNCTION__ "(), link not connected yet!\n");
-               return -EIO;
-       }
-
-       /*
-        *  If there is data to return, then we return it. If not, then we 
-        *  must check if we are still connected
-        */
-       if ( skb_queue_len( &self->rx_queue) == 0) {
-
-               /* Still connected?  */
-               if ( self->state != OBEX_DATA) {
-                       switch ( self->eof) {
-                       case LM_USER_REQUEST:
-                               self->eof = FALSE;
-                               DEBUG(3, "read_irobex: returning 0\n");
-                               ret = 0;
-                               break;
-                       case LM_LAP_DISCONNECT:
-                               self->eof = FALSE;
-                               ret = -EIO;
-                               break;
-                       case LM_LAP_RESET:
-                               self->eof = FALSE;
-                               ret = -ECONNRESET;
-                               break;
-                       default:
-                               self->eof = FALSE;
-                               ret = -EIO;
-                               break;
-                       }
-                       return ret;
-               }
-
-               /* Return if user does not want to block */
-               if ( file->f_flags & O_NONBLOCK)
-                       return -EAGAIN;
-
-               /* Go to sleep and wait for data!  */
-               interruptible_sleep_on( &self->read_wait);
-
-               /*
-                *  Ensure proper reaction to signals, and screen out 
-                *  blocked signals (page 112. linux device drivers)
-                */
-               if ( signal_pending( current))
-                       return -ERESTARTSYS;
-       }
-       
-       while ( count && skb_queue_len( &self->rx_queue)) {
-
-               skb = skb_dequeue( &self->rx_queue);
-               
-               /*
-                *  Check if we have previously stopped IrTTP and we know
-                *  have more free space in our rx_queue. If so tell IrTTP
-                *  to start delivering frames again before our rx_queue gets
-                *  empty
-                */
-               if ( self->rx_flow == FLOW_STOP) {
-                       if ( skb_queue_len( &self->rx_queue) < LOW_THRESHOLD) {
-                               DEBUG( 4, __FUNCTION__ "(), Starting IrTTP\n");
-                               self->rx_flow = FLOW_START;
-                               irttp_flow_request( self->tsap, FLOW_START);
-                       }
-               }
-
-               /*  
-                *  Is the request from the user less that the amount in the 
-                *  current packet?  
-                */
-               if ( count <  skb->len) {
-                       copy_to_user( buffer+len, skb->data, count);
-                       len += count;
-                       
-                       /*
-                        *  Remove copied data from skb and queue
-                        *  it for next read
-                        */
-                       skb_pull( skb, count);
-                       skb_queue_head( &self->rx_queue, skb);
-                       
-                       return len;
-               } else {
-                       copy_to_user( buffer+len, skb->data, skb->len);
-                       count -= skb->len;
-                       len += skb->len;
-                       
-                       dev_kfree_skb( skb);
-               }
-       }
-       return len;
-}
-
-/*
- * Function irobex_write (inode, file, buffer, count)
- *
- *    User process wants to write to device
- *
- */
-static ssize_t irobex_write( struct file *file, const char *buffer, 
-                            size_t count, loff_t *noidea)
-{
-       struct irobex_cb *self;
-       struct sk_buff *skb;
-       int data_len = 0;
-       int len = 0;
-       
-       self = irobex;
-       
-       ASSERT( self != NULL, return -EIO;);
-       ASSERT( self->magic == IROBEX_MAGIC, return -EIO;);
-
-       DEBUG( 4, __FUNCTION__ ": count = %d\n", count);
-       
-       /*
-        *  If we are not connected then we just give up!
-        */
-       if ( self->state != OBEX_DATA) {
-               DEBUG( 0, __FUNCTION__ "(): Not connected!\n");
-               
-               return -ENOLINK;
-       } 
-       
-       /* Check if IrTTP is wants us to slow down */
-       if ( self->tx_flow == FLOW_STOP) {
-               DEBUG( 4, __FUNCTION__ 
-                      "(), IrTTP wants us to slow down, going to sleep\n");
-               interruptible_sleep_on( &self->write_wait);
-       }
-       
-       /* Send data to TTP layer possibly as muliple packets */
-       while ( count) {
-               
-               /*
-                *  Check if request is larger than what fits inside a TTP
-                *  frame. In that case we must fragment the frame into 
-                *  multiple TTP frames. IrOBEX should not care about message
-                *  boundaries.
-                */
-               if ( count < (self->irlap_data_size - IROBEX_MAX_HEADER))
-                       data_len = count;
-               else 
-                       data_len = self->irlap_data_size - IROBEX_MAX_HEADER;
-               
-               DEBUG( 4, __FUNCTION__ "(), data_len=%d, header_len = %d\n", 
-                      data_len, IROBEX_MAX_HEADER);
-               
-               skb = dev_alloc_skb( data_len + IROBEX_MAX_HEADER);
-               if ( skb == NULL) {
-                       DEBUG( 0, "irobex - couldn't allocate skbuff!\n");
-                       return 0;
-               }
-               
-               skb_reserve( skb, IROBEX_MAX_HEADER);
-               skb_put( skb, data_len);
-               
-               copy_from_user( skb->data, buffer+len, data_len);
-               len += data_len;
-               count -= data_len;
-               
-               DEBUG( 4, __FUNCTION__ "(), skb->len=%d\n", (int) skb->len);
-               ASSERT( skb->len <= (self->irlap_data_size-IROBEX_MAX_HEADER),
-                       return len;);
-               
-               irttp_data_request( self->tsap, skb);
-       }
-       return (len);
-}
-
-/*
- * Function irobex_poll (file, wait)
- *
- *    
- *
- */
-static u_int irobex_poll(struct file *file, poll_table *wait)
-{
-       DEBUG( 0, __FUNCTION__ "(), Sorry not implemented yet!\n");
-
-       /* check out /usr/src/pcmcia/modules/ds.c for an example */
-       return 0;
-}
-
-/*
- * Function irobex_fasync (inode, filp, mode)
- *
- *    Implementation for SIGIO
- *
- */
-static int irobex_fasync( int fd, struct file *filp, int on)
-{
-       struct irobex_cb *self;
-
-       DEBUG( 4, __FUNCTION__ "()\n");
-       
-       self = irobex;
-
-       ASSERT( self != NULL, return -1;);
-       ASSERT( self->magic == IROBEX_MAGIC, return -1;);
-
-       return fasync_helper( fd, filp, on, &self->async);
-}
-
-/*
- * Function irobex_seek (inode, file, buffer, count)
- *
- *    Not implemented yet!
- *
- */
-static loff_t irobex_seek( struct file *file, loff_t off, int whence)
-{
-       DEBUG( 0, __FUNCTION__ "(), Not implemented yet!\n");
-
-       return -ESPIPE;
-}
-
-/*
- * Function irobex_ioctl (inode, filp, cmd, arg)
- *
- *    Drivers IOCTL handler, used for connecting and disconnecting
- *    irobex connections
- *
- */
-static int irobex_ioctl( struct inode *inode, struct file *filp, 
-                        unsigned int cmd, unsigned long arg)
-{
-       struct irobex_cb *self;
-       int err = 0;
-       int size = _IOC_SIZE(cmd);
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       self = irobex;
-       
-       ASSERT(self != NULL, return -ENOTTY;);
-       ASSERT(self->magic == IROBEX_MAGIC, return -ENOTTY;);
-       
-       if ( _IOC_TYPE(cmd) != IROBEX_IOC_MAGIC) 
-               return -EINVAL;
-       if ( _IOC_NR(cmd) > IROBEX_IOC_MAXNR)
-               return -EINVAL;
-
-       if ( _IOC_DIR(cmd) & _IOC_READ)
-               err = verify_area( VERIFY_WRITE, (void *) arg, size);
-       else if ( _IOC_DIR(cmd) & _IOC_WRITE)
-               err = verify_area( VERIFY_READ, (void *) arg, size);
-       if ( err)
-               return err;
-
-       switch ( cmd) {
-       case IROBEX_IOCSCONNECT:
-               DEBUG( 4, __FUNCTION__ "(): IROBEX_IOCSCONNECT!\n");
-               return irobex_connect_request( self);           
-               break;
-       case IROBEX_IOCSDISCONNECT:
-               DEBUG( 4, __FUNCTION__ "(): IROBEX_IOCSDISCONNECT!\n");
-               irobex_disconnect_request( self);
-               break;
-       default:
-               return -EINVAL;
-       }
-       return 0;
-}
-
-/*
- * Function irobex_dev_open (inode, file)
- *
- *    Device opened by user process
- *
- */
-static int irobex_dev_open( struct inode * inode, struct file *file)
-{
-       struct irobex_cb *self;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-       
-       self = irobex;
-
-       ASSERT( self != NULL, return -1;);
-       ASSERT( self->magic == IROBEX_MAGIC, return -1;);
-
-       if ( self->count++) {
-               DEBUG( 3, "open_irobex: count not zero; actual = %d\n",
-                      self->count);
-               self->count--;
-               return -EBUSY;
-       }
-
-       irobex_register_server( self);
-
-       /* Reset values for this instance */
-       self->state = OBEX_IDLE;
-       self->eof = FALSE;
-       self->daddr = 0;
-       self->dtsap_sel = 0;
-       self->rx_flow = FLOW_START;
-       self->tx_flow = FLOW_START;
-
-       MOD_INC_USE_COUNT;
-       
-       return 0;
-}
-
-static int irobex_dev_close( struct inode *inode, struct file *file)
-{
-       struct irobex_cb *self;
-       struct sk_buff *skb;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       self = irobex;
-
-       ASSERT( self != NULL, return -ENODEV;);
-       ASSERT( self->magic == IROBEX_MAGIC, return -EBADR;);
-
-       /* Deallocate buffers */
-       while (( skb = skb_dequeue( &self->rx_queue)) != NULL) {
-               DEBUG( 3, "irobex_close: freeing SKB\n");
-               dev_kfree_skb( skb);
-       }
-
-       /* Close TSAP is its still there */
-       if ( self->tsap) {
-               irttp_disconnect_request(self->tsap, NULL, P_NORMAL);
-               irttp_close_tsap( self->tsap);
-               self->tsap = NULL;
-       }
-       self->state = OBEX_IDLE;
-       self->eof = FALSE;
-       self->daddr = 0;
-       self->dtsap_sel = 0;
-       self->rx_flow = FLOW_START;
-       self->tx_flow = FLOW_START;
-
-       /* Remove this filp from the asynchronously notified filp's */
-       irobex_fasync( -1, file, 0);
-
-       self->count--;
-       
-       MOD_DEC_USE_COUNT;
-
-       return 0;
-}
-
-/*
- * Function irobex_discovery_inication (daddr)
- *
- *    Remote device discovered, try query the remote IAS to see which
- *    device it is, and which services it has.
- *
- */
-static void irobex_discovery_indication( DISCOVERY *discovery)
-{
-       struct irobex_cb *self;
-       
-       DEBUG( 0, __FUNCTION__ "()\n");
-       
-       self = irobex;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-       /* Remember address and time if was discovered */
-       self->daddr = discovery->daddr;
-       self->saddr = discovery->saddr;
-       self->time_discovered = jiffies;
-       
-       /* Wake up process if its waiting for device to be discovered */
-       if ( self->state == OBEX_DISCOVER)
-               wake_up_interruptible( &self->write_wait);
-}
-
-static void irobex_disconnect_request( struct irobex_cb *self)
-{
-       if ( self->state != OBEX_DATA)
-               return;
-       
-       irttp_disconnect_request( self->tsap, NULL, P_NORMAL);
-       
-       /* Reset values for this instance */
-       self->state = OBEX_IDLE;
-       self->eof = LM_USER_REQUEST;
-       self->daddr = 0;
-       self->dtsap_sel = 0;
-       self->rx_flow = FLOW_START;
-       self->tx_flow = FLOW_START;
-               
-       wake_up_interruptible( &self->read_wait);
-}
-
-/*
- * Function irobex_disconnect_indication (handle, reason, priv)
- *
- *    Link has been disconnected
- *
- */
-static void irobex_disconnect_indication( void *instance, void *sap, 
-                                         LM_REASON reason, 
-                                         struct sk_buff *userdata)
-{
-       struct irobex_cb *self;
-       
-       DEBUG( 0, __FUNCTION__ "(), reason=%s\n", lmp_reasons[reason]);
-       
-       self = ( struct irobex_cb *) instance;
-       
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-       
-       self->state = OBEX_IDLE;
-       self->eof = reason;
-       self->daddr = 0;
-       self->dtsap_sel = 0;
-       self->rx_flow = self->tx_flow = FLOW_START;
-
-       wake_up_interruptible( &self->read_wait);
-       wake_up_interruptible( &self->write_wait);
-       
-       DEBUG( 4, __FUNCTION__ "(), skb_queue_len=%d\n",
-              skb_queue_len( &irobex->rx_queue));
-       
-       if ( userdata)
-               dev_kfree_skb( userdata);
-}
-
-int irobex_connect_request(struct irobex_cb *self)
-{
-       int count = 0;
-
-       /* Already connected? */
-       if ( self->state == OBEX_DATA) {
-               DEBUG( 0, __FUNCTION__ "(), already connected!\n");
-               return 0;
-       }
-       
-       /* Timeout after 15 secs. */
-       irobex_start_watchdog_timer( self, 1000);
-       
-       /*
-        * If we have discovered a remote device we
-        * check if the discovery is still fresh. If not, we don't
-        * trust the address.
-        */
-       if ( self->daddr && ((jiffies - self->time_discovered) > 1000)) {
-               DEBUG( 0, __FUNCTION__ "(), daddr is old <%d>!\n",
-                      jiffies - self->time_discovered);
-               self->daddr = 0;
-       }
-       
-       /* 
-        * Try to discover remote remote device if it has not been 
-        * discovered yet. 
-        */
-       if ( !self->daddr) {
-               self->state = OBEX_DISCOVER;
-               
-               irlmp_discovery_request( 8);
-               
-               /* Wait for discovery to complete */
-               interruptible_sleep_on( &self->write_wait);
-               del_timer( &self->watchdog_timer);
-       }
-       
-       /* Give up if we are unable to discover any remote devices */
-       if ( !self->daddr) {
-               DEBUG( 0, __FUNCTION__ 
-                      "(), Unable to discover any devices!\n");
-               return -EHOSTUNREACH;
-       }
-       
-       /* Need to find remote destination TSAP selector? */
-       while ( !self->dtsap_sel) {
-               DEBUG( 0, __FUNCTION__ "() : Quering remote IAS!\n");
-               
-               self->state = OBEX_QUERY;
-               
-               /* Timeout after 5 secs. */
-               irobex_start_watchdog_timer( self, 500);
-               iriap_getvaluebyclass_request( 
-                       "OBEX", "IrDA:TinyTP:LsapSel",
-                       self->saddr, self->daddr,
-                       irobex_get_value_confirm,
-                       self);
-               
-               interruptible_sleep_on( &self->write_wait);
-               del_timer( &self->watchdog_timer);
-               
-               /* Give up after a few tries */
-               if (( count++ > 2) && !self->dtsap_sel) {
-                       DEBUG( 0, __FUNCTION__ 
-                              "(), Unable to query remote LM-IAS!\n");
-                       return -ETIMEDOUT;
-               }
-       }
-       self->state = OBEX_CONN;
-       
-       /* Timeout after 5 secs. */
-       irobex_start_watchdog_timer( self, 500);
-       
-       irttp_connect_request( self->tsap, self->dtsap_sel, 
-                              self->saddr, self->daddr, NULL, SAR_DISABLE, 
-                              NULL);
-       
-       /* Go to sleep and wait for connection!  */
-       interruptible_sleep_on( &self->write_wait);
-       del_timer( &self->watchdog_timer);
-       
-       if ( self->state != OBEX_DATA) {
-               DEBUG( 0, __FUNCTION__ 
-                      "(), Unable to connect to remote device!\n");
-               return -ETIMEDOUT;
-       }
-       return 0;
-}
-
-/*
- * Function irobex_connect_confirm (instance, sap, qos, userdata)
- *
- *    Connection to peer IrOBEX layer established
- *
- */
-static void irobex_connect_confirm( void *instance, void *sap, 
-                                   struct qos_info *qos,
-                                   int max_sdu_size, struct sk_buff *userdata)
-{
-       struct irobex_cb *self;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-       
-       self = ( struct irobex_cb *) instance;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-       ASSERT( qos != NULL, return;);
-
-       DEBUG( 4, __FUNCTION__ "(), IrLAP data size=%d\n", 
-              qos->data_size.value);
-
-       self->irlap_data_size = qos->data_size.value;
-
-       /*
-        *  Wake up any blocked process wanting to write. Finally this process
-        *  can start writing since the connection is now open :-)
-        */
-       if (self->state == OBEX_CONN) {
-               self->state = OBEX_DATA;
-               wake_up_interruptible( &self->write_wait);
-       }
-       
-       if ( userdata) {
-               dev_kfree_skb( userdata);
-
-       }
-}
-
-/*
- * Function irobex_connect_response (handle)
- *
- *    Accept incomming connection
- *
- */
-void irobex_connect_response( struct irobex_cb *self)
-{
-       struct sk_buff *skb;
-/*     __u8 *frame; */
-
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);  
-
-       self->state = OBEX_DATA;
-
-       skb = dev_alloc_skb( 64);
-       if (skb == NULL) {
-               DEBUG( 0, __FUNCTION__ "() Could not allocate sk_buff!\n");
-               return;
-       }
-
-       /* Reserve space for MUX_CONTROL and LAP header */
-       skb_reserve( skb, TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER);
-
-       irttp_connect_response( self->tsap, SAR_DISABLE, skb);
-}
-
-/*
- * Function irobex_connect_indication (handle, skb, priv)
- *
- *    Connection request from a remote device
- *
- */
-void irobex_connect_indication( void *instance, void *sap, 
-                               struct qos_info *qos, int max_sdu_size,
-                               struct sk_buff *userdata)
-{
-       struct irmanager_event mgr_event;
-       struct irobex_cb *self;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       self = ( struct irobex_cb *) instance;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);  
-       ASSERT( userdata != NULL, return;);
-
-       self->eof = FALSE;
-
-       DEBUG( 4, __FUNCTION__ "(), skb_len = %d\n", 
-              (int) userdata->len);
-
-       DEBUG( 4, __FUNCTION__ "(), IrLAP data size=%d\n", 
-              qos->data_size.value);
-
-       ASSERT( qos->data_size.value >= 64, return;);
-
-       self->irlap_data_size = qos->data_size.value;
-
-       /* We just accept the connection */
-       irobex_connect_response( self);
-#if 1
-       mgr_event.event = EVENT_IROBEX_START;
-       sprintf( mgr_event.devname, "%s", self->devname);
-       irmanager_notify( &mgr_event);
-#endif
-       wake_up_interruptible( &self->read_wait);
-
-       if ( userdata) {
-               dev_kfree_skb( userdata);
-       }
-}
-
-/*
- * Function irobex_data_indication (instance, sap, skb)
- *
- *    This function gets the data that is received on the data channel
- *
- */
-static void irobex_data_indication( void *instance, void *sap, 
-                                   struct sk_buff *skb) 
-{
-
-       struct irobex_cb *self;
-       
-       self = ( struct irobex_cb *) instance;
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-       ASSERT( skb != NULL, return;);
-       
-       DEBUG( 4, __FUNCTION__ "(), len=%d\n", (int) skb->len);
-       
-       skb_queue_tail( &self->rx_queue, skb);
-       
-       /*
-        *  Check if queues are beginning to get filled, and inform 
-        *  IrTTP to slow down if that is the case
-        */
-       if ( skb_queue_len( &self->rx_queue) > HIGH_THRESHOLD) {
-               DEBUG( 0, __FUNCTION__ 
-                      "(), rx_queue is full, telling IrTTP to slow down\n");
-               self->rx_flow = FLOW_STOP;
-               irttp_flow_request( self->tsap, FLOW_STOP);
-       }
-
-       /*
-        *  Wake up process blocked on read or select
-        */
-       wake_up_interruptible( &self->read_wait);
-
-       /* Send signal to asynchronous readers */
-       if ( self->async)
-               kill_fasync( self->async, SIGIO);
-}
-
-/*
- * Function irobex_flow_indication (instance, sap, cmd)
- *
- *    
- *
- */
-static void irobex_flow_indication( void *instance, void *sap, 
-                                   LOCAL_FLOW flow) 
-{
-       struct irobex_cb *self;
-
-       DEBUG( 4, __FUNCTION__ "()\n");
-       
-       self = ( struct irobex_cb *) instance;
-       
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-       
-       switch ( flow) {
-       case FLOW_STOP:
-               DEBUG( 0, __FUNCTION__ "(), IrTTP wants us to slow down\n");
-               self->tx_flow = flow;
-               break;
-       case FLOW_START:
-               self->tx_flow = flow;
-               DEBUG( 0, __FUNCTION__ "(), IrTTP wants us to start again\n");
-               wake_up_interruptible( &self->write_wait);
-               break;
-       default:
-               DEBUG( 0, __FUNCTION__ "(), Unknown flow command!\n");
-       }
-}
-
-/*
- * Function irobex_get_value_confirm (obj_id, value)
- *
- *    Got results from previous GetValueByClass request
- *
- */
-static void irobex_get_value_confirm( __u16 obj_id, struct ias_value *value, 
-                                     void *priv)
-{
-       struct irobex_cb *self;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       ASSERT( priv != NULL, return;);
-       self = ( struct irobex_cb *) priv;
-       
-       if ( !self || self->magic != IROBEX_MAGIC) {
-               DEBUG( 0, __FUNCTION__ "(), bad magic!\n");
-               return;
-       }
-
-       /* Check if request succeeded */
-       if ( !value) {
-               DEBUG( 0, __FUNCTION__ "(), got NULL value!\n");
-
-               return;
-       }
-
-       switch ( value->type) {
-       case IAS_INTEGER:
-               DEBUG( 4, __FUNCTION__ "() int=%d\n", value->t.integer);
-               
-               if ( value->t.integer != -1) {
-                       self->dtsap_sel = value->t.integer;
-
-                       /*
-                        *  Got the remote TSAP, so wake up any processes
-                        *  blocking on write. We don't do the connect 
-                        *  ourselves since we must make sure there is a 
-                        *  process that wants to make a connection, so we
-                        *  just let that process do the connect itself
-                        */
-                       if ( self->state == OBEX_QUERY)
-                               wake_up_interruptible( &self->write_wait);
-               } else 
-                       self->dtsap_sel = 0;
-               break;
-       case IAS_STRING:
-               DEBUG( 0, __FUNCTION__ "(), got string %s\n", value->t.string);
-               break;
-       case IAS_OCT_SEQ:
-               DEBUG( 0, __FUNCTION__ "(), OCT_SEQ not implemented\n");
-               break;
-       case IAS_MISSING:
-               DEBUG( 0, __FUNCTION__ "(), MISSING not implemented\n");
-               break;
-       default:
-               DEBUG( 0, __FUNCTION__ "(), unknown type!\n");
-               break;
-       }
-}
-
-/*
- * Function irobex_provider_confirm (dlsap)
- *
- *    IrOBEX provider is discovered. We can now establish connections
- *    TODO: This function is currently not used!
- */
-void irobex_provider_confirm( struct irobex_cb *self, __u8 dlsap) 
-{
-       /* struct irobex_cb *self = irobex; */
-       struct notify_t notify;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-       notify.data_indication = irobex_data_indication;
-       notify.connect_confirm = irobex_connect_confirm;
-       notify.connect_indication = irobex_connect_indication;
-       notify.flow_indication = irobex_flow_indication;
-       notify.disconnect_indication = irobex_disconnect_indication;
-       notify.instance = self;
-       
-       /* Create TSAP's */
-       self->tsap = irttp_open_tsap( LSAP_ANY, DEFAULT_INITIAL_CREDIT,
-                                     &notify);
-       
-/*     DEBUG( 0, "OBEX allocated TSAP%d for data\n", self->handle); */
-       
-       /* irlan_do_event( IAS_PROVIDER_AVAIL, NULL, &frame); */
-}
-
-/*
- * Function irobex_register_server(void)
- *
- *    Register server support so we can accept incomming connections. We
- *    must register both a TSAP for control and data
- * 
- */
-static void irobex_register_server( struct irobex_cb *self)
-{
-       struct notify_t notify;
-       struct ias_object *obj;
-
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-       irda_notify_init( &notify);
-
-       notify.connect_confirm       = irobex_connect_confirm;
-       notify.connect_indication    = irobex_connect_indication;
-       notify.disconnect_indication = irobex_disconnect_indication;
-       notify.data_indication       = irobex_data_indication;
-       notify.flow_indication       = irobex_flow_indication;
-       notify.instance = self;
-       strcpy( notify.name, "IrOBEX");
-
-       self->tsap = irttp_open_tsap( TSAP_IROBEX, DEFAULT_INITIAL_CREDIT,
-                                     &notify); 
-       if ( self->tsap == NULL) {
-               DEBUG( 0, __FUNCTION__ "(), Unable to allocate TSAP!\n");
-               return;
-       }
-
-       /* 
-        *  Register with LM-IAS
-        */
-       obj = irias_new_object( "OBEX", 0x42343);
-       irias_add_integer_attrib( obj, "IrDA:TinyTP:LsapSel", TSAP_IROBEX);
-       irias_insert_object( obj);
-}
-
-void irobex_watchdog_timer_expired( unsigned long data)
-{
-       struct irobex_cb *self = ( struct irobex_cb *) data;
-       
-       DEBUG( 4, __FUNCTION__ "()\n");
-
-       ASSERT( self != NULL, return;);
-       ASSERT( self->magic == IROBEX_MAGIC, return;);
-
-       switch (self->state) {
-       case OBEX_CONN:      /* FALLTROUGH */
-       case OBEX_DISCOVER:  /* FALLTROUGH */
-       case OBEX_QUERY:     /* FALLTROUGH */
-               wake_up_interruptible( &self->write_wait);
-               break;
-       default:
-               break;
-       }
-}
-
-#ifdef CONFIG_PROC_FS
-/*
- * Function irobex_proc_read (buf, start, offset, len, unused)
- *
- *    Give some info to the /proc file system
- */
-static int irobex_proc_read( char *buf, char **start, off_t offset, 
-                            int len, int unused)
-{
-       struct irobex_cb *self;
-
-       self = irobex;
-
-       ASSERT( self != NULL, return -1;);
-       ASSERT( self->magic == IROBEX_MAGIC, return -1;);
-
-       len = 0;
-       
-       len += sprintf( buf+len, "ifname: %s ",self->devname);
-       len += sprintf( buf+len, "state: %s ", irobex_state[ self->state]);
-       len += sprintf( buf+len, "EOF: %s\n", self->eof ? "TRUE": "FALSE");
-       
-       return len;
-}
-
-#endif /* CONFIG_PROC_FS */
-
-#ifdef MODULE
-
-MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
-MODULE_DESCRIPTION("The Linux IrOBEX module"); 
-
-/*
- * Function init_module (void)
- *
- *    Initialize the IrOBEX module, this function is called by the
- *    modprobe(1) program.
- */
-int init_module(void) 
-{
-       irobex_init();
-       
-       return 0;
-}
-
-/*
- * Function cleanup_module (void)
- *
- *    Remove the IrOBEX module, this function is called by the rmmod(1)
- *    program
- */
-void cleanup_module(void) 
-{
-       /* 
-        *  No need to check MOD_IN_USE, as sys_delete_module() checks. 
-        */
-       
-       /* Free some memory */
-       irobex_cleanup();       
-}
-
-#endif /* MODULE */
-
-
-
-
index 977dd36a37b8aafd2bdb14455624aebadf34005f..6d7537e1fbbd7f8bf9608249450d6162e30b10c4 100644 (file)
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irproc.c
- * Version:       
+ * Version:       1.0
  * Description:   Various entries in the /proc file system
  * Status:        Experimental.
  * Author:        Thomas Davis, <ratbert@radiks.net>
  * Created at:    Sat Feb 21 21:33:24 1998
- * Modified at:   Thu Feb 11 15:23:23 1999
+ * Modified at:   Tue Apr  6 19:07:06 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998, Thomas Davis, <ratbert@radiks.net>, 
@@ -27,6 +27,7 @@
 #include <linux/miscdevice.h>
 #include <linux/proc_fs.h>
 
+#include <net/irda/irda.h>
 #include <net/irda/irmod.h>
 #include <net/irda/irlap.h>
 #include <net/irda/irlmp.h>
@@ -46,6 +47,8 @@ extern int irttp_proc_read(char *buf, char **start, off_t offset, int len,
                           int unused);
 extern int irias_proc_read(char *buf, char **start, off_t offset, int len,
                           int unused);
+extern int discovery_proc_read(char *buf, char **start, off_t offset, int len, 
+                              int unused);
 
 static int proc_discovery_read(char *buf, char **start, off_t offset, int len,
                               int unused);
@@ -118,7 +121,7 @@ struct proc_dir_entry proc_discovery = {
        0, 9, "discovery",
        S_IFREG | S_IRUGO, 1, 0, 0,
        0, NULL /* ops -- default to array */,
-       &proc_discovery_read /* get_info */,
+       &discovery_proc_read /* get_info */,
 };
 
 struct proc_dir_entry proc_irda_device = {
@@ -184,7 +187,9 @@ static struct dentry_operations proc_dentry_operations =
  */
 void irda_proc_register(void) {
        proc_net_register(&proc_irda);
+#ifdef MODULE
        proc_irda.fill_inode = &irda_proc_modcount;
+#endif /* MODULE */
        proc_register(&proc_irda, &proc_lap);
        proc_register(&proc_irda, &proc_lmp);
        proc_register(&proc_irda, &proc_ttp);
@@ -311,73 +316,5 @@ static int proc_irda_readdir(struct file *filp, void *dirent,
        return 1;
 }
 
-/*
- * Function proc_discovery_read (buf, start, offset, len, unused)
- *
- *    Print discovery information in /proc file system
- *
- */
-int proc_discovery_read(char *buf, char **start, off_t offset, int len, 
-                       int unused)
-{
-       DISCOVERY *discovery;
-       struct lap_cb *lap;
-       unsigned long flags;
-
-       if ( !irlmp)
-               return len;
 
-       len = sprintf(buf, "IrLMP: Discovery log:\n\n");        
-
-       save_flags(flags);
-       cli();
-
-       lap = ( struct lap_cb *) hashbin_get_first( irlmp->links);
-       while( lap != NULL) {
-               ASSERT( lap->magic == LMP_LAP_MAGIC, return 0;);
-               
-               len += sprintf( buf+len, "Link saddr=0x%08x\n", lap->saddr);
-               discovery = ( DISCOVERY *) hashbin_get_first( lap->cachelog);
-               while ( discovery != NULL) {
-                       len += sprintf( buf+len, "  name: %s,", 
-                                       discovery->info);
-                       
-                       len += sprintf( buf+len, " hint: ");
-                       if ( discovery->hint[0] & HINT_PNP)
-                               len += sprintf( buf+len, "PnP Compatible ");
-                       if ( discovery->hint[0] & HINT_PDA)
-                               len += sprintf( buf+len, "PDA/Palmtop ");
-                       if ( discovery->hint[0] & HINT_COMPUTER)
-                               len += sprintf( buf+len, "Computer ");
-                       if ( discovery->hint[0] & HINT_PRINTER)
-                               len += sprintf( buf+len, "Printer ");
-                       if ( discovery->hint[0] & HINT_MODEM)
-                               len += sprintf( buf+len, "Modem ");
-                       if ( discovery->hint[0] & HINT_FAX)
-                               len += sprintf( buf+len, "Fax ");
-                       if ( discovery->hint[0] & HINT_LAN)
-                               len += sprintf( buf+len, "LAN Access");
-                       
-                       if ( discovery->hint[1] & HINT_TELEPHONY)
-                               len += sprintf( buf+len, "Telephony ");
-                       if ( discovery->hint[1] & HINT_FILE_SERVER)
-                               len += sprintf( buf+len, "File Server ");       
-                       if ( discovery->hint[1] & HINT_COMM)
-                               len += sprintf( buf+len, "IrCOMM ");
-                       if ( discovery->hint[1] & HINT_OBEX)
-                               len += sprintf( buf+len, "IrOBEX ");
-                       
-                       len += sprintf( buf+len, ", daddr: 0x%08x\n", 
-                                       discovery->daddr);
-                       
-                       len += sprintf( buf+len, "\n");
-                       
-                       discovery = ( DISCOVERY *) hashbin_get_next( lap->cachelog);
-               }
-               lap = ( struct lap_cb *) hashbin_get_next( irlmp->links);
-       }
-       restore_flags(flags);
-
-       return len;
-}
 
index 8137c49a247e8f64febf672c6f3d19fe08fbf96d..90029dfd86d1c54f416cfe20489c364626af4832 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Jun  9 13:29:31 1998
- * Modified at:   Mon Feb  8 09:05:51 1999
+ * Modified at:   Thu Mar 11 13:27:04 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (C) 1998, Aage Kvalnes <aage@cs.uit.no>
@@ -45,9 +45,10 @@ static __u32 hash( char* name);
  *    Create hashbin!
  *
  */
-hashbin_t *hashbin_new( int type)
+hashbin_t *hashbin_new(int type)
 {
        hashbin_t* hashbin;
+       int i;
        
        DEBUG( 4, __FUNCTION__ "()\n");
        
@@ -61,9 +62,13 @@ hashbin_t *hashbin_new( int type)
        /*
         * Initialize structure
         */
-       memset( hashbin, 0, sizeof(hashbin_t));
+       memset(hashbin, 0, sizeof(hashbin_t));
        hashbin->hb_type = type;
        hashbin->magic = HB_MAGIC;
+
+       /* Make sure all spinlock's are unlocked */
+       for (i=0;i<HASHBIN_SIZE;i++)
+               hashbin->hb_mutex[i] = SPIN_LOCK_UNLOCKED;
        
        return hashbin;
 }
@@ -161,10 +166,9 @@ void hashbin_lock( hashbin_t* hashbin, __u32 hashv, char* name,
        bin = GET_HASHBIN( hashv);
        
        /* Synchronize */
-       if ( hashbin->hb_type & HB_GLOBAL ) {
-
+       if ( hashbin->hb_type & HB_GLOBAL )
                spin_lock_irqsave( &hashbin->hb_mutex[ bin], flags);
-       else {
+       else {
                save_flags( flags);
                cli();
        }
@@ -176,27 +180,27 @@ void hashbin_lock( hashbin_t* hashbin, __u32 hashv, char* name,
  *    Unlock the hashbin
  *
  */
-void hashbin_unlock( hashbin_t* hashbin, __u32 hashv, char* name, 
-                    unsigned long flags)
+void hashbin_unlock(hashbin_t* hashbin, __u32 hashv, char* name, 
+                   unsigned long flags)
 {
        int bin;
 
-       DEBUG( 0, "hashbin_unlock()\n");
+       DEBUG(0, "hashbin_unlock()\n");
 
-       ASSERT( hashbin != NULL, return;);
-       ASSERT( hashbin->magic == HB_MAGIC, return;);
+       ASSERT(hashbin != NULL, return;);
+       ASSERT(hashbin->magic == HB_MAGIC, return;);
        
        /*
         * Locate hashbin
         */
-       if ( name )
-               hashv = hash( name );
-       bin = GET_HASHBIN( hashv );
+       if (name )
+               hashv = hash(name);
+       bin = GET_HASHBIN(hashv);
        
        /* Release lock */
-       if ( hashbin->hb_type & HB_GLOBAL) {
+       if ( hashbin->hb_type & HB_GLOBAL)
                spin_unlock_irq( &hashbin->hb_mutex[ bin]);
-       } else if ( hashbin->hb_type & HB_LOCAL) {
+       else if (hashbin->hb_type & HB_LOCAL) {
                restore_flags( flags);
        }
 }
index 100b6b9581dbd6de81d6704155745651726a12ca..77380ca0b78bca530b3249d2ea591f3e0ae51dc6 100644 (file)
@@ -1,12 +1,12 @@
 /*********************************************************************
  *                
  * Filename:      irttp.c
- * Version:       1.0
+ * Version:       1.2
  * Description:   Tiny Transport Protocol (TTP) implementation
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sun Aug 31 20:14:31 1997
- * Modified at:   Sat Feb 20 01:30:39 1999
+ * Modified at:   Thu Mar 25 10:27:08 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -30,6 +30,7 @@
 #include <asm/byteorder.h>
 
 #include <net/irda/irda.h>
+#include <net/irda/irmod.h>
 #include <net/irda/irlmp.h>
 #include <net/irda/irttp.h>
 
@@ -37,15 +38,15 @@ struct irttp_cb *irttp = NULL;
 
 static void __irttp_close_tsap(struct tsap_cb *self);
 
-static void irttp_data_indication(void *instance, void *sap, 
+static int irttp_data_indication(void *instance, void *sap, 
+                                struct sk_buff *skb);
+static int irttp_udata_indication(void *instance, void *sap, 
                                  struct sk_buff *skb);
-static void irttp_udata_indication(void *instance, void *sap, 
-                                  struct sk_buff *skb);
 static void irttp_disconnect_indication(void *instance, void *sap,  
                                        LM_REASON reason,
                                        struct sk_buff *);
 static void irttp_connect_indication(void *instance, void *sap, 
-                                    struct qos_info *qos, int max_sdu_size,
+                                    struct qos_info *qos, __u32 max_sdu_size,
                                     struct sk_buff *skb);
 
 static void irttp_run_tx_queue(struct tsap_cb *self);
@@ -127,8 +128,7 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit,
 
        self = kmalloc(sizeof(struct tsap_cb), GFP_ATOMIC);
        if (self == NULL) {
-               printk(KERN_ERR "IrTTP: Can't allocate memory for "
-                       "TSAP control block!\n");
+               DEBUG(0, __FUNCTION__ "(), unable to kmalloc!\n");
                return NULL;
        }
        memset(self, 0, sizeof(struct tsap_cb));
@@ -136,7 +136,6 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit,
        init_timer(&self->todo_timer);
 
        /* Initialize callbacks for IrLMP to use */
-
        irda_notify_init(&ttp_notify);
        ttp_notify.connect_confirm = irttp_connect_confirm;
        ttp_notify.connect_indication = irttp_connect_indication;
@@ -146,6 +145,12 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit,
        ttp_notify.instance = self;
        strncpy(ttp_notify.name, notify->name, NOTIFY_MAX_NAME);
 
+       self->magic = TTP_TSAP_MAGIC;
+       self->connected = FALSE;
+
+       skb_queue_head_init(&self->rx_queue);
+       skb_queue_head_init(&self->tx_queue);
+       skb_queue_head_init(&self->rx_fragments);
        /*
         *  Create LSAP at IrLMP layer
         */
@@ -165,24 +170,15 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit,
 
        self->notify = *notify;
        self->lsap = lsap;
-       self->magic = TTP_TSAP_MAGIC;
-       self->connected = FALSE;
-
-       skb_queue_head_init(&self->rx_queue);
-       skb_queue_head_init(&self->tx_queue);
-       skb_queue_head_init(&self->rx_fragments);
 
-       /*
-        *  Insert ourself into the hashbin
-        */
-       hashbin_insert(irttp->tsaps, (QUEUE *) self, self->stsap_sel, NULL);
+       hashbin_insert(irttp->tsaps, (QUEUE *) self, (int) self, NULL);
 
        if (credit > TTP_MAX_QUEUE)
                self->initial_credit = TTP_MAX_QUEUE;
        else
                self->initial_credit = credit;
-       
-       return self;
+
+       return self;    
 }
 
 /*
@@ -194,8 +190,6 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit,
  */
 static void __irttp_close_tsap(struct tsap_cb *self)
 {
-       DEBUG(4, __FUNCTION__ "()\n");
-
        /* First make sure we're connected. */
        ASSERT(self != NULL, return;);
        ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
@@ -239,7 +233,7 @@ int irttp_close_tsap(struct tsap_cb *self)
                return 0; /* Will be back! */
        }
        
-       tsap = hashbin_remove(irttp->tsaps, self->stsap_sel, NULL);
+       tsap = hashbin_remove(irttp->tsaps, (int) self, NULL);
 
        ASSERT(tsap == self, return -1;);
 
@@ -295,8 +289,6 @@ int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb)
 {
        __u8 *frame;
 
-       DEBUG(4, __FUNCTION__ "()\n");
-
        ASSERT(self != NULL, return -1;);
        ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
        ASSERT(skb != NULL, return -1;);
@@ -304,7 +296,7 @@ int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb)
        /* Check that nothing bad happens */
        if ((skb->len == 0) || (!self->connected)) {
                DEBUG(4, __FUNCTION__ "(), No data, or not connected\n");
-               return -1;
+               return -ENOTCONN;
        }
 
        /*  
@@ -314,7 +306,7 @@ int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb)
        if ((self->tx_max_sdu_size == 0) && (skb->len > self->max_seg_size)) {
                DEBUG(1, __FUNCTION__ 
                       "(), SAR disabled, and data is to large for IrLAP!\n");
-               return -1;
+               return -EMSGSIZE;
        }
 
        /* 
@@ -322,11 +314,12 @@ int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb)
         *  TxMaxSduSize 
         */
        if ((self->tx_max_sdu_size != 0) && 
+           (self->tx_max_sdu_size != SAR_UNBOUND) && 
            (skb->len > self->tx_max_sdu_size))
        {
                DEBUG(1, __FUNCTION__ "(), SAR enabled, "
                       "but data is larger than TxMaxSduSize!\n");
-               return -1;
+               return -EMSGSIZE;
        }
        /* 
         *  Check if transmit queue is full
@@ -337,7 +330,7 @@ int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb)
                 */
                irttp_run_tx_queue(self);
                
-               return -1;
+               return -ENOBUFS;
        }
        
        /* Queue frame, or queue frame segments */
@@ -378,7 +371,7 @@ int irttp_data_request(struct tsap_cb *self, struct sk_buff *skb)
 }
 
 /*
- * Function irttp_xmit (self)
+ * Function irttp_run_tx_queue (self)
  *
  *    If possible, transmit a frame queued for transmission.
  *
@@ -396,8 +389,7 @@ static void irttp_run_tx_queue(struct tsap_cb *self)
        if (irda_lock(&self->tx_queue_lock) == FALSE)
                return;
 
-       while ((self->send_credit > 0) && !skb_queue_empty(&self->tx_queue)){
-
+       while ((self->send_credit > 0) && !skb_queue_empty(&self->tx_queue)) {
                skb = skb_dequeue(&self->tx_queue);
                ASSERT(skb != NULL, return;);
                
@@ -409,13 +401,12 @@ static void irttp_run_tx_queue(struct tsap_cb *self)
                 *  the code below is a critical region and we must assure that
                 *  nobody messes with the credits while we update them.
                 */
-               save_flags(flags); 
-               cli();
+               spin_lock_irqsave(&self->lock, flags);
 
                n = self->avail_credit;
                self->avail_credit = 0;
                
-               /* Only space for 127 credits in frame */
+               /* Only room for 127 credits in frame */
                if (n > 127) {
                        self->avail_credit = n-127;
                        n = 127;
@@ -423,10 +414,8 @@ static void irttp_run_tx_queue(struct tsap_cb *self)
                self->remote_credit += n;
                self->send_credit--;
 
-               restore_flags(flags);
+               spin_unlock_irqrestore(&self->lock, flags);
 
-               DEBUG(4, "irttp_xmit: Giving away %d credits\n", n);
-               
                /* 
                 *  More bit must be set by the data_request() or fragment() 
                 *  functions
@@ -443,12 +432,14 @@ static void irttp_run_tx_queue(struct tsap_cb *self)
 
                /* Check if we can accept more frames from client */
                if ((self->tx_sdu_busy) && 
-                   (skb_queue_len(&self->tx_queue) < LOW_THRESHOLD)) { 
+                   (skb_queue_len(&self->tx_queue) < LOW_THRESHOLD)) 
+               { 
                        self->tx_sdu_busy = FALSE;
                        
                        if (self->notify.flow_indication)
                                self->notify.flow_indication(
-                                     self->notify.instance, self, FLOW_START);
+                                       self->notify.instance, self, 
+                                       FLOW_START);
                }
        }
        
@@ -487,8 +478,7 @@ void irttp_give_credit(struct tsap_cb *self)
         *  the code below is a critical region and we must assure that
         *  nobody messes with the credits while we update them.
         */
-       save_flags(flags);
-       cli();
+       spin_lock_irqsave(&self->lock, flags);
 
        n = self->avail_credit;
        self->avail_credit = 0;
@@ -500,7 +490,7 @@ void irttp_give_credit(struct tsap_cb *self)
        }
        self->remote_credit += n;
 
-       restore_flags(flags);
+       spin_unlock_irqrestore(&self->lock, flags);
 
        skb_put(tx_skb, 1);
        tx_skb->data[0] = (__u8) (n & 0x7f);
@@ -512,10 +502,11 @@ void irttp_give_credit(struct tsap_cb *self)
 /*
  * Function irttp_udata_indication (instance, sap, skb)
  *
- *    
+ *    Received some unit-data (unreliable)
  *
  */
-void irttp_udata_indication(void *instance, void *sap, struct sk_buff *skb) 
+static int irttp_udata_indication(void *instance, void *sap, 
+                                 struct sk_buff *skb) 
 {
        struct tsap_cb *self;
 
@@ -523,15 +514,17 @@ void irttp_udata_indication(void *instance, void *sap, struct sk_buff *skb)
 
        self = (struct tsap_cb *) instance;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
-       ASSERT(skb != NULL, return;);
+       ASSERT(self != NULL, return -1;);
+       ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
+       ASSERT(skb != NULL, return -1;);
 
        /* Just pass data to layer above */
        if (self->notify.udata_indication) {
                self->notify.udata_indication(self->notify.instance, self, skb);
        }
        self->stats.rx_packets++;
+
+       return 0;
 }
 
 /*
@@ -540,7 +533,8 @@ void irttp_udata_indication(void *instance, void *sap, struct sk_buff *skb)
  *    Receive segment from IrLMP. 
  *
  */
-void irttp_data_indication(void *instance, void *sap, struct sk_buff *skb)
+static int irttp_data_indication(void *instance, void *sap, 
+                                struct sk_buff *skb)
 {
        struct tsap_cb *self;
        int more;
@@ -549,17 +543,17 @@ void irttp_data_indication(void *instance, void *sap, struct sk_buff *skb)
        
        self = (struct tsap_cb *) instance;
 
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
-       ASSERT(skb != NULL, return;);
+       ASSERT(self != NULL, return -1;);
+       ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
+       ASSERT(skb != NULL, return -1;);
 
        frame = skb->data;
        
        n = frame[0] & 0x7f;     /* Extract the credits */
        more = frame[0] & 0x80;
 
-       DEBUG(4, __FUNCTION__"(), got %d credits, TSAP sel=%02x\n", 
-              n, self->stsap_sel);
+       DEBUG(3, __FUNCTION__"(), got %d credits, TSAP sel=%02x\n", 
+             n, self->stsap_sel);
 
        self->stats.rx_packets++;
 
@@ -600,6 +594,7 @@ void irttp_data_indication(void *instance, void *sap, struct sk_buff *skb)
         */
        if (self->send_credit == n)
                irttp_start_todo_timer(self, 0);
+       return 0;
 }
 
 /*
@@ -638,25 +633,26 @@ void irttp_flow_request(struct tsap_cb *self, LOCAL_FLOW flow)
  *    Try to connect to remote destination TSAP selector
  *
  */
-void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
-                          __u32 saddr, __u32 daddr,
-                          struct qos_info *qos, int max_sdu_size, 
-                          struct sk_buff *userdata) 
+int irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel, 
+                         __u32 saddr, __u32 daddr,
+                         struct qos_info *qos, __u32 max_sdu_size, 
+                         struct sk_buff *userdata) 
 {
        struct sk_buff *skb;
+       __u16 tmp_be;
        __u8 *frame;
        __u8 n;
        
        DEBUG(4, __FUNCTION__ "(), max_sdu_size=%d\n", max_sdu_size); 
        
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
+       ASSERT(self != NULL, return -1;);
+       ASSERT(self->magic == TTP_TSAP_MAGIC, return -1;);
 
        /* Any userdata supplied? */
        if (userdata == NULL) {
                skb = dev_alloc_skb(64);
                if (!skb) 
-                       return;
+                       return -ENOMEM;
                
                /* Reserve space for MUX_CONTROL and LAP header */
                skb_reserve(skb, (TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER));
@@ -667,7 +663,7 @@ void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel,
                 *  headers
                 */
                ASSERT(skb_headroom(userdata) >= 
-                       (TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER), return;);
+                      (TTP_HEADER+LMP_CONTROL_HEADER+LAP_HEADER), return -1;);
        }
 
        /* Initialize connection parameters */
@@ -697,7 +693,7 @@ void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel,
        if (max_sdu_size > 0) {
                ASSERT(skb_headroom(skb) >= 
                        (TTP_HEADER_WITH_SAR+LMP_CONTROL_HEADER+LAP_HEADER), 
-                       return;);
+                       return -1;);
 
                /* Insert SAR parameters */
                frame = skb_push(skb, TTP_HEADER_WITH_SAR);
@@ -706,7 +702,9 @@ void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel,
                frame[1] = 0x04; /* Length */
                frame[2] = 0x01; /* MaxSduSize */
                frame[3] = 0x02; /* Value length */
-               *((__u16 *) (frame+4))= htons(max_sdu_size); /* Big endian! */
+
+               tmp_be = cpu_to_be16((__u16) max_sdu_size);
+               memcpy(frame+4, &tmp_be, 2);
        } else {
                /* Insert plain TTP header */
                frame = skb_push(skb, TTP_HEADER);
@@ -716,7 +714,8 @@ void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel,
        }
 
        /* Connect with IrLMP. No QoS parameters for now */
-       irlmp_connect_request(self->lsap, dtsap_sel, saddr, daddr, qos, skb);
+       return irlmp_connect_request(self->lsap, dtsap_sel, saddr, daddr, qos, 
+                                    skb);
 }
 
 /*
@@ -726,12 +725,14 @@ void irttp_connect_request(struct tsap_cb *self, __u8 dtsap_sel,
  *
  */
 void irttp_connect_confirm(void *instance, void *sap, struct qos_info *qos,
-                          int max_seg_size, struct sk_buff *skb) 
+                          __u32 max_seg_size, struct sk_buff *skb) 
 {
        struct tsap_cb *self;
+       __u16 tmp_cpu;
        __u8 *frame;
        __u8 n;
        int parameters;
+       __u8 plen, pi, pl;
 
        DEBUG(4, __FUNCTION__ "()\n");
        
@@ -765,9 +766,16 @@ void irttp_connect_confirm(void *instance, void *sap, struct qos_info *qos,
 
        parameters = frame[0] & 0x80;   
        if (parameters) {
-               DEBUG(4, __FUNCTION__ "(), Contains parameters!\n");
-               
-               self->tx_max_sdu_size = ntohs(*(__u16 *)(frame+4));
+               plen = frame[1];
+               pi   = frame[2];
+               pl   = frame[3];
+
+               ASSERT(pl == 2, return;);
+
+               memcpy(&tmp_cpu, frame+4, 2); /* Align value */
+               be16_to_cpus(&tmp_cpu);       /* Convert to host order */
+               self->tx_max_sdu_size = tmp_cpu;
+
                DEBUG(4, __FUNCTION__ "(), RxMaxSduSize=%d\n", 
                       self->tx_max_sdu_size);
        }
@@ -791,14 +799,16 @@ void irttp_connect_confirm(void *instance, void *sap, struct qos_info *qos,
  *
  */
 void irttp_connect_indication(void *instance, void *sap, 
-                             struct qos_info *qos, int max_seg_size, 
+                             struct qos_info *qos, __u32 max_seg_size, 
                              struct sk_buff *skb) 
 {
        struct tsap_cb *self;
        struct lsap_cb *lsap;
+       __u16 tmp_cpu;
        __u8 *frame;
        int parameters;
        int n;
+       __u8 plen, pi, pl;
 
        self = (struct tsap_cb *) instance;
 
@@ -827,15 +837,23 @@ void irttp_connect_indication(void *instance, void *sap,
        parameters = frame[0] & 0x80;   
        if (parameters) {
                DEBUG(4, __FUNCTION__ "(), Contains parameters!\n");
-               
-               self->tx_max_sdu_size = ntohs(*(__u16 *)(frame+4));
+               plen = frame[1];
+               pi   = frame[2];
+               pl   = frame[3];
+
+               ASSERT(pl == 2, return;);
+
+               memcpy(&tmp_cpu, frame+4, 2); /* Align value */
+               be16_to_cpus(&tmp_cpu);       /* Convert to host order */
+
+               self->tx_max_sdu_size = tmp_cpu;
                DEBUG(4, __FUNCTION__ "(), MaxSduSize=%d\n", 
                      self->tx_max_sdu_size);
        }
 
        DEBUG(4, __FUNCTION__ "(), initial send_credit=%d\n", n);
 
-       skb_pull(skb, 1);
+       skb_pull(skb, 1); /* Remove TTP header */
 
        if (self->notify.connect_indication) {
                self->notify.connect_indication(self->notify.instance, self, 
@@ -851,10 +869,11 @@ void irttp_connect_indication(void *instance, void *sap,
  *    IrLMP!
  * 
  */
-void irttp_connect_response(struct tsap_cb *self, int max_sdu_size, 
+void irttp_connect_response(struct tsap_cb *self, __u32 max_sdu_size, 
                            struct sk_buff *userdata)
 {
        struct sk_buff *skb;
+       __u32 tmp_be;
        __u8 *frame;
        __u8 n;
 
@@ -912,7 +931,9 @@ void irttp_connect_response(struct tsap_cb *self, int max_sdu_size,
                frame[1] = 0x04; /* Length */
                frame[2] = 0x01; /* MaxSduSize */
                frame[3] = 0x02; /* Value length */
-               *((__u16 *) (frame+4))= htons(max_sdu_size);
+
+               tmp_be = cpu_to_be16((__u16)max_sdu_size);
+               memcpy(frame+4, &tmp_be, 2);
        } else {
                /* Insert TTP header */
                frame = skb_push(skb, TTP_HEADER);
@@ -923,6 +944,44 @@ void irttp_connect_response(struct tsap_cb *self, int max_sdu_size,
        irlmp_connect_response(self->lsap, skb);
 }
 
+/*
+ * Function irttp_dup (self, instance)
+ *
+ *    Duplicate TSAP, can be used by servers to confirm a connection on a
+ *    new TSAP so it can keep listening on the old one.
+ */
+struct tsap_cb *irttp_dup(struct tsap_cb *orig, void *instance) 
+{
+       struct tsap_cb *new;
+
+       DEBUG(1, __FUNCTION__ "()\n");
+
+       if (!hashbin_find(irttp->tsaps, (int) orig, NULL)) {
+               DEBUG(0, __FUNCTION__ "(), unable to find TSAP\n");
+               return NULL;
+       }
+       new = kmalloc(sizeof(struct tsap_cb), GFP_ATOMIC);
+       if (!new) {
+               DEBUG(0, __FUNCTION__ "(), unable to kmalloc\n");
+               return NULL;
+       }
+       /* Dup */
+       memcpy(new, orig, sizeof(struct tsap_cb));
+       new->notify.instance = instance;
+       new->lsap = irlmp_dup(orig->lsap, new);
+
+       /* Not everything should be copied */
+       init_timer(&new->todo_timer);
+
+       skb_queue_head_init(&new->rx_queue);
+       skb_queue_head_init(&new->tx_queue);
+       skb_queue_head_init(&new->rx_fragments);
+
+       hashbin_insert(irttp->tsaps, (QUEUE *) new, (int) new, NULL);
+
+       return new;
+}
+
 /*
  * Function irttp_disconnect_request (self)
  *
@@ -1028,12 +1087,44 @@ void irttp_disconnect_indication(void *instance, void *sap, LM_REASON reason,
        
        self->connected = FALSE;
        
-       /* 
-        *  Use callback to notify layer above 
+       if (!self->notify.disconnect_indication)
+               return;
+
+       self->notify.disconnect_indication(self->notify.instance, self, reason,
+                                          userdata);
+}
+
+/*
+ * Function irttp_do_data_indication (self, skb)
+ *
+ *    Try to deliver reassebled skb to layer above, and requeue it if that
+ *    for some reason should fail. We mark rx sdu as busy to apply back
+ *    pressure is necessary.
+ */
+void irttp_do_data_indication(struct tsap_cb *self, struct sk_buff *skb)
+{
+       int err;
+
+       err = self->notify.data_indication(self->notify.instance, self, skb);
+
+       /* Usually the layer above will notify that it's input queue is
+        * starting to get filled by using the flow request, but this may
+        * be difficult, so it can instead just refuse to eat it and just
+        * give an error back 
         */
-       if (self->notify.disconnect_indication)
-               self->notify.disconnect_indication(self->notify.instance, 
-                                                  self, reason, userdata);
+       if (err == -ENOMEM) {
+               DEBUG(0, __FUNCTION__ "() requeueing skb!\n");
+
+               /* Make sure we take a break */
+               self->rx_sdu_busy = TRUE;
+               
+               /* Need to push the header in again */
+               skb_push(skb, TTP_HEADER);
+               skb->data[0] = 0x00; /* Make sure MORE bit is cleared */
+               
+               /* Put skb back on queue */
+               skb_queue_head(&self->rx_queue, skb);
+       }
 }
 
 /*
@@ -1045,15 +1136,7 @@ void irttp_disconnect_indication(void *instance, void *sap, LM_REASON reason,
 void irttp_run_rx_queue(struct tsap_cb *self) 
 {
        struct sk_buff *skb;
-       __u8 *frame;
        int more = 0;
-       void *instance;
-
-       ASSERT(self != NULL, return;);
-       ASSERT(self->magic == TTP_TSAP_MAGIC, return;);
-
-       instance = self->notify.instance;
-       ASSERT(instance != NULL, return;);
 
        DEBUG(4, __FUNCTION__ "() send=%d,avail=%d,remote=%d\n", 
               self->send_credit, self->avail_credit, self->remote_credit);
@@ -1062,20 +1145,12 @@ void irttp_run_rx_queue(struct tsap_cb *self)
                return;
        
        /*
-        *  Process receive queue
+        *  Reassemble all frames in receive queue and deliver them
         */
-       while ((!skb_queue_empty(&self->rx_queue)) &&  !self->rx_sdu_busy) {
-
-               skb = skb_dequeue(&self->rx_queue);
-               if (!skb)
-                       break; /* Should not happend, but ...  */
-               
+       while (!self->rx_sdu_busy && (skb = skb_dequeue(&self->rx_queue))) {
                self->avail_credit++;
 
-               frame = skb->data;
-               more = frame[0] & 0x80;
-               DEBUG(4, __FUNCTION__ "(), More=%s\n", more ? "TRUE" : 
-                      "FALSE");
+               more = skb->data[0] & 0x80;
 
                /* Remove TTP header */
                skb_pull(skb, TTP_HEADER);
@@ -1089,10 +1164,10 @@ void irttp_run_rx_queue(struct tsap_cb *self)
                 * immediately. This can be requested by clients that
                 * implements byte streams without any message boundaries
                 */
-               if ((self->no_defrag) || (self->rx_max_sdu_size == 0)) {
-                       self->notify.data_indication(instance, self, skb);
+               if (self->rx_max_sdu_size == SAR_DISABLE) {
+                       irttp_do_data_indication(self, skb);
                        self->rx_sdu_size = 0;
-                       
+
                        continue;
                }
 
@@ -1103,43 +1178,47 @@ void irttp_run_rx_queue(struct tsap_cb *self)
                         *  limits of the maximum size of the rx_sdu
                         */
                        if (self->rx_sdu_size <= self->rx_max_sdu_size) {
-                               DEBUG(4, __FUNCTION__ 
-                                      "(), queueing fragment\n");
-
+                               DEBUG(4, __FUNCTION__ "(), queueing frag\n");
                                skb_queue_tail(&self->rx_fragments, skb);
                        } else {
-                               DEBUG(1, __FUNCTION__ "(), Error!\n");
+                               /* Free the part of the SDU that is too big */
+                               dev_kfree_skb(skb);
                        }
-               } else {
-                       /*
-                        *  This is the last fragment, so time to reassemble!
+                       continue;
+               }
+               /*
+                *  This is the last fragment, so time to reassemble!
+                */
+               if ((self->rx_sdu_size <= self->rx_max_sdu_size) ||
+                   (self->rx_max_sdu_size == SAR_UNBOUND)) 
+               {
+                       /* 
+                        * A little optimizing. Only queue the fragment if
+                        * there are other fragments. Since if this is the
+                        * last and only fragment, there is no need to
+                        * reassemble :-) 
                         */
-                       if (self->rx_sdu_size <= self->rx_max_sdu_size) {
-
-                               /* A little optimizing. Only queue the 
-                                * fragment if there is other fragments. Since
-                                * if this is the last and only fragment, 
-                                * there is no need to reassemble 
-                                */
-                               if (!skb_queue_empty(&self->rx_fragments)) {
-
-                                       DEBUG(4, __FUNCTION__ 
-                                              "(), queueing fragment\n");
-                                       skb_queue_tail(&self->rx_fragments, 
-                                                       skb);
-
-                                       skb = irttp_reassemble_skb(self);
-                               }
-                               self->notify.data_indication(instance, self, 
-                                                            skb);
-                       } else {
-                               DEBUG(1, __FUNCTION__ 
-                                      "(), Truncated frame\n");
-                               self->notify.data_indication(
-                                       self->notify.instance, self, skb);
+                       if (!skb_queue_empty(&self->rx_fragments)) {
+                               skb_queue_tail(&self->rx_fragments, 
+                                              skb);
+                               
+                               skb = irttp_reassemble_skb(self);
                        }
-                       self->rx_sdu_size = 0;
+                       
+                       /* Now we can deliver the reassembled skb */
+                       irttp_do_data_indication(self, skb);
+               } else {
+                       DEBUG(1, __FUNCTION__ "(), Truncated frame\n");
+                       
+                       /* Free the part of the SDU that is too big */
+                       dev_kfree_skb(skb);
+
+                       /* Deliver only the valid but truncated part of SDU */
+                       skb = irttp_reassemble_skb(self);
+                       
+                       irttp_do_data_indication(self, skb);
                }
+               self->rx_sdu_size = 0;
        }
        /* Reset lock */
        self->rx_queue_lock = 0;
@@ -1194,6 +1273,11 @@ static struct sk_buff *irttp_reassemble_skb(struct tsap_cb *self)
        if (!skb)
                return NULL;
 
+       /* 
+        * Need to reserve space for TTP header in case this skb needs to 
+        * be requeued in case delivery failes
+        */
+       skb_reserve(skb, TTP_HEADER);
        skb_put(skb, self->rx_sdu_size);
 
        /*
@@ -1310,6 +1394,9 @@ static void irttp_todo_expired(unsigned long data)
        if (self->disconnect_pend) {
                /* Check if it's possible to disconnect yet */
                if (skb_queue_empty(&self->tx_queue)) {
+                       
+                       /* Make sure disconnect is not pending anymore */
+                       self->disconnect_pend = FALSE;
                        if (self->disconnect_skb) {
                                irttp_disconnect_request(
                                        self, self->disconnect_skb, P_NORMAL);
index 680bced96e2b43624226209b1cbd46844cb7d3ce..03abf24ed8f098b762bb71cfcf9c5c35d11cd55c 100644 (file)
@@ -6,7 +6,7 @@
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Mon Aug  4 20:40:53 1997
- * Modified at:   Tue Feb 16 17:27:23 1999
+ * Modified at:   Fri Mar 26 21:52:53 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * 
  *     Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>, 
@@ -60,10 +60,9 @@ int async_wrap_skb( struct sk_buff *skb, __u8 *tx_buff, int buffsize)
        fcs.value = INIT_FCS;
        n = 0;
 
-       if ( skb->len > 2048) {
-               DEBUG( 0, __FUNCTION__ "Warning size=%d of sk_buff to big!\n", 
-                      (int) skb->len);
-
+       if (skb->len > 2048) {
+               DEBUG(0, __FUNCTION__ "Warning size=%d of sk_buff to big!\n", 
+                     (int) skb->len);
                return 0;
        }
        
@@ -71,8 +70,13 @@ int async_wrap_skb( struct sk_buff *skb, __u8 *tx_buff, int buffsize)
         *  Send  XBOF's for required min. turn time and for the negotiated
         *  additional XBOFS
         */
-       xbofs = ((struct irlap_skb_cb *)(skb->cb))->xbofs;
-       for ( i=0; i<xbofs; i++) {
+       if (((struct irlap_skb_cb *)(skb->cb))->magic != LAP_MAGIC) {
+               DEBUG(1, __FUNCTION__ "(), wrong magic in skb!\n");
+               xbofs = 11;
+       } else
+               xbofs = ((struct irlap_skb_cb *)(skb->cb))->xbofs;
+
+       for (i=0; i<xbofs; i++) {
                tx_buff[n++] = XBOF; 
        }
 
@@ -80,7 +84,7 @@ int async_wrap_skb( struct sk_buff *skb, __u8 *tx_buff, int buffsize)
        tx_buff[n++] = BOF;
 
        /* Insert frame and calc CRC */
-       fori=0; i < skb->len; i++) {
+       for (i=0; i < skb->len; i++) {
                byte = skb->data[i];
                
                /*
@@ -100,11 +104,11 @@ int async_wrap_skb( struct sk_buff *skb, __u8 *tx_buff, int buffsize)
        /* Insert CRC in little endian format (LSB first) */
        fcs.value = ~fcs.value;
 #ifdef __LITTLE_ENDIAN
-       n += stuff_byte( fcs.bytes[0], tx_buff+n);
-       n += stuff_byte( fcs.bytes[1], tx_buff+n);
+       n += stuff_byte(fcs.bytes[0], tx_buff+n);
+       n += stuff_byte(fcs.bytes[1], tx_buff+n);
 #else ifdef __BIG_ENDIAN
-       n += stuff_byte( fcs.bytes[1], tx_buff+n);
-       n += stuff_byte( fcs.bytes[0], tx_buff+n);
+       n += stuff_byte(fcs.bytes[1], tx_buff+n);
+       n += stuff_byte(fcs.bytes[0], tx_buff+n);
 #endif
        tx_buff[n++] = EOF;
        
@@ -127,7 +131,7 @@ static inline void async_bump( struct irda_device *idev, __u8 *buf, int len)
                return;
        }
 
-       /*  Align to 20 bytes */
+       /*  Align IP header to 20 bytes */
        skb_reserve( skb, 1);
        
        ASSERT( len-2 > 0, return;);
index abb0499adb73c4396d22844aff4aea1433f737e2..9247bf99cadbcbed0806231b5402a6252daf557f 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/un.h>
 #include <linux/fcntl.h>
 #include <linux/termios.h>
-#include <linux/socket.h>
 #include <linux/sockios.h>
 #include <linux/net.h>
 #include <linux/fs.h>